Meu ambiente de desenvolvimento

December 28, 2010 1 comentário »

Esta rolando uma série de posts, onde devemos contar mais sobre o nosso ambiente de desenvolvimento e eu fui convidado pelo @cassiomarques (post) e @lucascaton (post) para falar um pouco do meu.

Então, vamos lá :D

Sistema operacional

  • Mac OS X. Faz 8 meses que comprei um MacBook de 13″ e venho usando ele em 100% do tempo que estou desenvolvendo. Continuo usando o Ubuntu, mas somente em servidores onde configuramos os projetos.

Editor

  • MacVim. Nunca sequer instalei o Textmate. Já usava o vim no linux e sempre me atendeu muito bem. Para servidor então, é perfeito. Agradeço ao @cassiomarques pela influência em usar este editor =)

Alguns softwares

  • Git – Todos os projetos são versionados, inclusive o deploy é feito puxando as alterações do repositório git.
  • Terminal – Não abre automaticamente como li em alguns posts hehehe, mas é um dos primeiros a abrir quando o sistema operacional carrega.
  • Adium – Ele atende bem o que preciso, Gtalk e MSN. Estou me acostumando a usar mais o skype, mas ainda bem pouco.
Git – Todos os projetos são versionados, inclusive o deploy é feito puxando as alterações do repositório git.
Terminal – Não abre automaticamente como li em alguns posts hehehe, mas é um dos primeiros a abrir quando o sistema operacional carrega.
Adium – Ele atende bem o que preciso, Gtalk e MSN. Estou me acostumando a usar mais o skype, mas ainda bem pouco.

Browser

  • Google Chrome – Sempre usei o Firefox, mas ele consome muita memória e por isso procurei outras alternativas. O @edercosta fez alguns testes e por indicação dele, adotei o Chrome como padrão.

Ambiente/Música

  • MacBook 13″ ligado a um monitor 21″ junto com o teclado e mouse bluetooth.
  • iPad para dar uma “escapada” e relaxar um pouco lendo ou jogando.
  • iTunes sempre ligado, dispensa comentários. Comecei a usar o last.fm para fazer scrobbling das músicas e gostei muito, pois ajuda a conhecer novas bandas e pessoas.

Fontes/Estudos

Estudar sempre! Eu não vejo melhor maneira que lendo e pesquisando o quê e como estão fazendo, então:

  • Github – Se aprende muito lendo código, o github é perfeito para isso. Além de poder contribuir, criar novos projetos e participar da fantástica comunidade open source.
  • APIdock – Melhor local para pesquisar documentação sobre Ruby e Ruby on Rails
  • RubyDoc.info – Documentação sobre plugins e gems.
  • Google/Google Reader:P

Água e café

  • Sempre na minha mesa

É isso, agora passo a bola para @willian, @vinibaggio e @PotHix

Acesse a API do Yahoo! Meme com Ruby

May 1, 2010 6 comentários »

A API do Meme pode user acessada utilizando o YQL (Yahoo Query Language) que
permite usar uma sintaxe similar ao SQL para recuperar os dados do Meme, um exemplo seria:

SELECT * FROM meme.info WHERE name='jtadeulopes';

Clique aqui e veja o resultado dentro do console.

Diante disso, durante o Yahoo! Open Hack Day Brasil 2010 resolvi escrever uma gem para acessar a API do Meme utilizando Ruby.

O desenvolvimento ainda esta no início, mas já é possível realizar as seguintes ações:

  • Buscar um usuário
  • Followers e Following
  • Buscar posts
  • Busca os posts mais populares do momento

Instalando

A instalação é bem simples, basta executar o comando

sudo gem install meme

Usando

Localizando um usuário

É possível localizar um usuário e suas informações desta maneira

user = Meme::Info.find('jtadeulopes')

user.name
=> "jtadeulopes"

user.description
=> "software developer"

# outros métodos disponíveis:

user.avatar_url  # URL do avatar.
user.title       # Breve descrição do meme do usuário.
user.guid        # O GUID do usuário.
user.language    # Idioma selecionado pelo usuario no Meme.
user.url         # URL do Meme do usuário.
user.followers   # Seguidores do usuário.
user.following   # Quem o usuário segue.

Buscando posts

posts = Meme::Post.find('brhackday')

post = posts.first

post.content
=> "RT @codepo8: And I am off - plane leaves BR for London. Thanks to everybody I met at #brhackday..."

# Cada post possui os métodos:

post.category       # Categoria do post.
post.timestamp      # Data de publicação.
post.guid           # GUID do usuário.
post.pubid          # ID de publicação do post.
post.url	    # URL do post.
post.repost_count   # Número de vezes que este post foi anunciado.
post.caption        # Legenda do post.
post.type	    # Tipo de mídia. Valores válidos são "text", "photo", "video" ou "audio".
post.content        # Conteúdo publicado.
 

Você pode especificar o tipo de mídia que deseja localizar, as opções são: photo, video, audio ou text.

Por padrão, o tipo text é assumido caso nenhum seja especificado.

posts = Meme::Post.find('meme rocks', :type => :photo)

Populares

Retorna os 10 posts mais populares. Você pode definir o local que deseja pesquisar. Os valores suportados são “en” para Inglês, “es” para o espanhol, “pt” para Português e “id” para Bahasa Indonésia.

Por padrão, o valor pt é assumido caso nenhum seja especificado

popular = Meme::Post.popular

popular.first.caption
=> "Haha duvido que não vai repostar esse sorriso mais lindo ...."

popular = Meme::Post.popular('id')

popular.first.caption
=> "Kemarin dia menawarkan cinta, hmm sayang harganya terlalu mahal jadi aku putuskan untuk tak memilikinya..."
 

Quer contribuir?

O projeto é open source e seu código fonte este no Github. Existe um TODO list para um controle do que foi feito e o que ainda precisa ser implementado.

Qualquer dúvida, deixe um comentário!

Utilizando Formtastic e Inputs

December 4, 2009 2 comentários »

Alguns meses atrás escrevi um plugin chamado Inputs. Como pode ser lido neste post, o objetivo é facilitar a criação de máscaras em campos de formulário.

Após ter descoberto o Formtastic, passei a utilizar o mesmo em todos os projetos aqui na Zigotto. Gosto muito da maneira que ele me permite trabalhar e escrever o código mais limpo e organizado.

E com tudo isso, comecei a me perguntar:

  • O Inputs pode ser utlizado junto com o Formtastic?
  • Como unir os dois de uma maneira bem simples e continuar usando o Formtastic para trabalhar com os formulários?

Imaginei algo como:

<% semantic_form_for @product do |form| %>
  <%= form.input :price, :mask => :decimal %>
  <%= form.commit_button %>
<% end %>

Gostei! É exatamente isso que eu quero! :)

Inputs foi atualizado e agora é possível através da opção :mask informar qual o tipo de máscara que você quer inserir no campo do formulário!

Como usar?

  1. Instale e configure o Formtastic em seu projeto. Veja como fazer isso aqui.
  2. Instale e configure o plugin Inputs. Veja como fazer isso aqui.

Após tudo configurado, é possível se fazer isso:

<% semantic_form_for @customer do |form| %>
  <%= form.input :name %>
  <%= form.input :phone, :mask => :phone %>
  <%= form.input :cpf, :mask => :cpf %>
  <%= form.commit_button %>
<% end %>

Você pode utlizar outras máscaras já definidas:

  • phone
  • phone-us
  • cpf
  • cnpj
  • date
  • date-us
  • cep
  • time
  • cc
  • integer
  • decimal
  • decimal-us
  • signed-decimal-us

ou criar a sua própria máscara:

<% semantic_form_for @product do |form| %>
  <%= form.input :year, :mask => '9999' %>
  <%= form.input :phone, :mask => '99-9999-9999' %>
  <%= form.commit_button %>
<% end %>

Inputs utiliza o plugin meioMask para criar as máscaras, demais opções e configurações podem ser vista na própria página do meioMask.

Sugestões, criticas são bem vindas. O código esta no Github, fiquem a vontade para utilizar, modificar e compartilhar :)

Formulários com Formtastic

September 7, 2009 10 comentários »

Procurando uma alternativa para trabalhar com formulários no Rails, encontrei a gem Formtastic.

O projeto é mantido por Justin French e José Valim, além de outras pessoas que ajudaram no projeto. Todo o código fonte esta no Github.

Sem mais, vamos trabalhar =)

Preparando o ambiente

Para gerar os scaffolds e um layout básico vou usar a gem Nifty Generators do Ryan Bates.

Instalando a gem nifty-generators:

sudo gem install nifty-generators

Criado a aplicação:

Pensando em acelerar um pouco o processo, criei um template básico e vamos criar a aplicação usando ele!

rails formtastic -m http://gist.github.com/181560.txt
cd formtastic

Instalando a gem formtastic:

sudo gem install justinfrench-formtastic

Adicione no environment.rb:

# config/environment.rb
config.gem "justinfrench-formtastic", :version => "0.2.2", :lib => 'formtastic', :source  => 'http://gems.github.com'

Gerando um layout basicão:

script/generate nifty_layout

Pronto :)

Usando

Como minha criatividade não permite algo diferente, vamos trabalhar com Produtos e Categorias.

Gerando o scaffold para Categorias:

script/generate nifty_scaffold Category name:string status:boolean ! show

Rode as migrações:

rake db:migrate

Se olharmos o código do formulário criado, teremos algo como:

# app/views/categories/_form.html.erb
 
<% form_for @category do |f| %>
  <%= f.error_messages %>
  <p>
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </p>
  <p>
    <%= f.label :status %><br />
    <%= f.check_box :status %>
  </p>
  <p><%= f.submit "Submit" %></p>
<% end %>

Visualizando o formulário:

tela02

Ok Jésus! Você falou, falou, mas cade o Formtastic?

Até agora não fizemos nada com ele. Experimente trocar o código gerado pelo scaffold pelo código abaixo:

# app/views/categories/_form.html.erb
 
<% semantic_form_for @category do |form| %>
  <%= form.inputs %>
  <%= form.buttons %>
<% end %>

Somente isso? Vamos ver o formulário:

tela03

Mas tudo esta muito estranho. Quero modificar e adicionar algumas informações como:

  • Separar em fieldsets diferentes os campos e botões
  • Colocar uma mensagem informativa abaixo do campo Name
  • Alterar o campo Status de checkbox para radio button.
# app/views/categories/_form.html.erb
 
<% semantic_form_for @category do |form| %>
 
  <% form.inputs do %>
    <%= form.input :name, :hint => "Example: food, books, electronics." %>
    <%= form.input :status, :as => :radio %>
  <% end %>
 
  <% form.inputs do %>
    <%= form.commit_button %>
  <% end %>
 
<% end %>

Podemos ter o controle de tudo! Veja como ficou:

tela04

Vamos para o cadastro de Produtos, gerando o scaffold para o mesmo:

script/generate nifty_scaffold Product category_id:integer name:string description:text price:decimal status:boolean
rake db:migrate

Criando o relacionamento entre Produtos e Categorias:

# app/models/category.rb
class Category < ActiveRecord::Base
 
  has_many :products
 
  validates_presence_of :name
  validates_inclusion_of :status, :in => [true, false]
 
end
 
# app/models/product.rb
class Product < ActiveRecord::Base
 
  belongs_to :category
 
  validates_presence_of :category, :name, :price
  validates_inclusion_of :status, :in => [true, false]
 
end

Nosso formulário está assim:

tela05

Não esta legal, vamos melhorar para:

  • Adicionar um select para escolher uma categoria.
  • Deixar o (*) somente nos campos obrigatórios.
  • Diminuir o tamanho do campo Price.
  • Alterar o campo Status de checkbox para select.
# app/views/products/_form.html.erb
 
<% semantic_form_for @product do |form| %>
 
  <% form.inputs do %>
    <%= form.input :category %>
    <%= form.input :name %>
    <%= form.input :description, :required => false, :input_html => {:rows => 3} %>
    <%= form.input :price, :input_html => {:size => 10} %>
    <%= form.input :status, :as => :select %>
  <% end -%>
 
  <% form.inputs do %>
    <%= form.commit_button %>
  <% end -%>
 
<% end -%>

Olha ai como ele ficou:

tela06

Input Types

Formtastic mapeia diretamente a maioria dos inputs, mas se por algum motivo você precisar alterar o seu tipo (por exemplo, como fizemos com o Status) você pode usar:

  • :select (select para associações)
  • :check_boxes (conjunto de check_box) – uma alternativa ao :select para associações has_many e has_and_belongs_to_many
  • :radio (conjunto de radio) – alternativa ao :select para associações belongs_to
  • :time_zone (select com fusos horários)
  • :password (campo tipo password) – padrão para colunas do tipo :string com ‘password’ no nome do método
  • :text (textarea) – padrão para colunas do tipo :text
  • :date (select para datas) – padrão para colunas do tipo :date
  • :datetime (select para data e hora) – padrão para colunas do tipo :datetime e :timestamp
  • :time (select para hora) – padrão para colunas do tipo :time
  • :boolean (checkbox) – padrão para colunas do tipo :boolean (você também pode usar :select e :radio)
  • :string (campo de texto) – padrão para colunas do tipo :string
  • :numeric (campo de texto, como string) – padrão para colunas do tipo :integer, :float e :decimal
  • :country (menu select com nomes de países) – requer plugin country_select instalado
  • :hidden (campo oculto) – cria um campo oculto

Stylesheets

Mas Jésus, e esse visual feio ai? Tem como melhorar não??

Claro que tem! Tente isso:

script/generate formtastic_stylesheets

Ele vai copiar dois arquivos (formtastic.css e formtastic_changes.css) dentro da pasta public/stylesheets para que você possa personalizar todo o visual do formulário :)

Basta adicionar ambos na view e trabalhar em suas propriedades:

<%= stylesheet_link_tag "formtastic" %>
<%= stylesheet_link_tag "formtastic_changes" %>

Claro que muito mais pode ser feito, como suporte a I18n, upload de imagens, mas isso ficará para um outro post =/

Vale a pena dar uma olhada em sua ótima documentação e nos seus arquivos no Github.

A idéia aqui, foi dar uma introdução e mostrar como ele pode facilitar e ajudar na hora de trabalhar com formulário no Rails.

É isso ai, vou finalizando por aqui :)

Plugin Inputs – Crie mascaras para campos de formulários

August 23, 2009 6 comentários »

Finalmente consegui escrever sobre meu primeiro plugin, chamado Inputs.

O objetivo é simples! Adicionar mascaras em campos de formulários. Penso em ampliar este plugin, e adicionar outras funcionalidade. Falo mais sobre isso no final do post.

Baseado no plugin JSMask do Oźeas Sant’ana, para prototype, o Inputs foi criado para quem trabalha com jQuery.

Vamos usar:

É necessário que esteja usando jQuery em seu projeto, recomendo o plugin jRails, caso ainda não o tenha instalado:

script/plugin install git://github.com/aaronchi/jrails.git

Agora é só instalar o Inputs:

script/plugin install git://github.com/jtadeulopes/inputs.git

Chamar os arquivos necessários na view:

<%= javascript_include_tag :defaults %>
<%= javascript_include_inputs %>

Agora, no formulário você pode fazer algo como:

<%= masked_text_field(:user, :tel, :size => 13, :mask => '(99)9999-9999') %>

Outros exemplos:

# Data:
<%= masked_text_field(:user, :birth, :mask => '99/99/9999') %>
 
# CPF:
<%= masked_text_field(:user, :cpf, :mask => '999.999.999-99') %>
 
# Campo de preço (dolar)
<%= price_us_text_field(:product, :price, :size => 10) %>

A idéia é ir adicionando outras opções, como calendário para seleção de datas, criar métodos que são mais utilizados para que não seja necessário ficar setando a máscara na criação do campo, etc.

Idéias são bem vindas, todo o código esta no Github, fiquem a vontade para utilizar, modificar e compartilhar!

É isso ai, valeu! :D

Paperclip: Atualizando imagens já cadastradas

June 18, 2009 2 comentários »

Seu projeto esta no ar, vários usuários utilizando e fazendo upload de imagens! Ótimo!!

Mas foi decidido que as imagens devem ter outros tamanhos, o que fazer com as imagens que já foram cadastradas? :(

Se você utiliza o plugin Paperclip, ele dispobilibiza algumas rake tasks para facilitar esse trabalho!

São elas:

# Atualiza as informações do banco de dados e os arquivos no 
# servidor de acordo com os styles definidos no model
rake paperclip:refresh CLASS=SeuModel
 
# Atualiza somente as informações do banco de dados
rake paperclip:refresh:metadata CLASS=SeuModel
 
# Atualiza somente os arquivos no servidor, seguindo os styles 
# definidos no model
rake paperclip:refresh:thumbnails CLASS=SeuModel

Simples e sem dor de cabeça :)

Populando banco de dados usando a gem Populator

June 13, 2009 1 comentário »

É preciso demonstrar uma funcionalidade da aplicação para o cliente, mas para isso é necessário realizar diversos cadastros e gerar informações na base de dados. Dependendo da quantidade de registros, fazer isso manualmente acaba ficando muito chato além de consumir um longo tempo.

Procurando uma maneira de automatizar esse processo, encontrei a gem Populator que facilita e muito esse trabalho.

Como Usar:

Primeiro instale a gem

sudo gem install populator

Após instalar, no console já podemos fazer algo como:

>> require 'populator'
=> []
>> Category.count
=> 0
>> Category.populate(10) { |category| category.name = Populator.words(1..3).titleize }
=> {}
>> Category.count
=> 10
>> Category.first
=> #<Category id: 1, name: "Fuga Debitis Temporibus", created_at: "2009-06-13 14:17:24", updated_at: "2009-06-13 14:17:24">
>>

Existem alguns metodos que podemos usar para gerar alguns dados como:

Populator.words(5) # gera 5 palavras aleatoriamente e insere um espaço entre elas
Populator.words(1..3) # gera entre uma e três palavras aleatoriamente
Populator.sentences(3) # gera 3 frases
Populator.paragraphs(2) # gera 2 paragrafos

Mas dependendo to tamanho de nosso model, ficar digitando tudo isso pelo console acaba dando muito trabalho também. Vamos melhorar isso!

Crie um novo arquivo em lib/tasks/populate.rake e crie a seguinte tarefa:

namespace :db do
  desc "Popula base de dados"
  task :populate => :environment do
 
    require 'populator'
 
    Category.populate 30 do |category|
      category.name = Populator.words(1..3).titleize
    end
 
  end
end

Agora dentro do diretório da aplicação, basta rodar a tarefa:

 rake db:populate 

Bem melhor :)

Podemos melhorar ainda mais este processo e deixar ele mais completo utilizando a gem Faker que gera dados como nome, telefone, endereço, e-mail e pode ser usada junto com a Populator.

Vale a pena assistir a este Railscast onde é demonstrado como utilizar as duas gems.

É isso ai! :D

AnnotateModels

June 12, 2009 7 comentários »

Precisa saber de forma rápida quais atributos um determinado model tem?

A gem AnnotateModels facilita este trabalho, adicionando em forma de comentários dentro do model, todos os seus atributos.

Como usar:

Primeiro instale a gem. No terminal digite:

sudo gem install annotate

Em seguida, acesse o diretório da aplicação e execute:

annotate

Veja como ficou nosso model:

# == Schema Information
#
# Table name: categories
#
# id :integer(4) not null, primary key
# name :string(255)
# description :text
# created_at :datetime
# updated_at :datetime
#
 
class Category < ActiveRecord::Base
  validates_presence_of :name
  validates_presence_of :description
end

Simples e bastante útil.