Posted: abril 10th, 2009 | Author: Carlan Calazans | Tags: aprendizado, dev, dica, rapidinha, ruby, ubuntu | No Comments »
A Páscoa é uma data comemorativa que serve de referência para datas comemorativas móveis como Carnaval, Quaresma, Corpus Christ e outras. Por isso é importante saber quando a Páscoa vai ser comemorada. Além de interessante, serve como uma brincadeira para os garotos(as) de programa de plantão que não tem nada para fazer no feriado.
Cálculo
No total são três formas de calcular a data da Páscoa. A primeira é recorrendo a uma tabela, a segunda é através ao algorítimo de Gauss para o intervalo de anos que se inicia em 1900 e termina em 2099 e a terceira com o algorítimo de Meeus / Jones / Butcher. Como exemplo, optei pela segunda forma por ter umas condições e por ela ser mais elaborada. Para quem se interessar, os algorítimos serão relacionados no final deste texto.
#!/usr/bin/env ruby
require 'date'
FIELDS = %w{Carnaval Pascoa Corpus\ Christ}
ano = 2009 #change me
x = 24
y = 5
a = ano % 19
b = ano % 4
c = ano % 7
d = (19 * a + x) % 30
e = (2 * b + 4 * c + 6 * d + y) % 7
if (d + e > 9)
#april
dia = d + e - 9
mes = 4
#exceptions
dia = 19 if (dia == 26)
dia = 18 if (dia == 25 && d == 28 && a > 10)
else
#march
dia = d + e + 22
mes = 3
end
dt = Date.new(ano, mes, dia)
result = []
result << dt - 47
result << dt
result << dt + 60
FIELDS.each do |d|
puts "#{d}: #{result.shift.strftime("%d-%m-%Y")}"
end
Este texto tem uma pegadinha. Na verdade, meu intuito com ele não é ensinar Ruby nem mostrar como se calcula o dia da Páscoa. Foi uma forma que encontrei de mostrar como a linguagem chega perto do idioma, como poucas linguagens o fazem. Qualquer pessoa é capaz de entender as fórmulas matemáticas e relacioná-las com o exemplo mostrado. Sim, existe um açúcar, mas é fácil de entendê-lo também.
A maior parte do tempo, parece que estamos conversando com um editor de textos.
Referências:
Posted: abril 1st, 2009 | Author: Carlan Calazans | Tags: aprendizado, dev, dica, rapidinha, ruby | No Comments »
A algumas horas atrás estava tentando criar um gif animado para o twitter. Esbarrei com uma solução usando Gimp, sugestão do oráculo. Fiz o gif animado. Alguns minutos depois, o lembrei de uma gem para Ruby chamada RMagick para processamento de imagens. Como nunca a tinha experimentado eis que veio a idéia de escrever uma classe para criar um gif animado.
A gem RMagick é baseada na biblioteca de imagens Image Magick comumente conhecida no mundo Linux pelo poder de seus utilitários em linha de comando. É, linha de comando, sem a necessidade de Gimp, FW, PS e similares. Quem nunca ouviu falar de import ou convert?
A classe em questão é a:
require 'rubygems'
require 'RMagick'
include Magick
class AnimatedGif
DELAY = 100
LOOP = 0
attr_accessor :source
def save(file)
load_files
@list.delay = DELAY
@list.iterations = LOOP
@list.write(file)
end
private
def load_files
@list = ImageList.new
Dir.new(source).entries.reject{|f| f =~ /^\./}.each do |f|
@list.read "#{source}/#{f}"
end
end
end
#Usage:
gif = AnimatedGif.new
gif.source = 'img_src'
gif.save '/tmp/animated.gif'
O delay entre as imagens está fixo no código. O loop é infinito, ou seja, seu gif ficará se repetindo a vida toda. Após criar um objeto da classe AnimatedGif é necessário informar um diretório com imagens estáticas para gerar o gif animado. E por último, é só chamar o método save passando o caminho do arquivo gif final.
Demorou uns dois minutos a mais depois do entendimento da solução em Gimp para gerar esta classe em Ruby. Foram uns 3 minutos para entender a técnica do Gimp e 5 minutos para criar a classe em Ruby. A linguagem não morde!
Posted: fevereiro 9th, 2009 | Author: Carlan Calazans | Tags: aprendizado, dev, ruby | 6 Comments »
A (PC)² consultoria lançou um serviço chamado Cep Livre a algumas semanas atrás. O serviço tem por objetivo fornecer informações sobre CEPs brasileiros. O funcionamento é similar aos serviços já existentes, você faz uma chamada em uma URL e recebe os dados em um formato que escolher (XML ou CSV). Acredito que não vai demorar para fornecerem o formato JSON já que ele é amplamente utilizado hoje em dia, inclusive em aplicações móveis (XML não pelo-amor-de-deus).
A diferença em relação aos serviços que conheço é a possibilidade de adicionar um CEP a base de dados preenchendo um formulário, ou seja, qualquer um pode fazer. Ah, o mais importante, o serviço é gratuito e a (PC)² consultoria afirma que não tem intenção de cobrar pelo serviço no website deles.
Agora a parte divertida. Fiz uma classe que busca as informações de CEP, faz o parser e apresenta em dois formatos: Array e Hash.
#!/usr/bin/env ruby
# 9/2/2009
# Carlan Calazans (carlancalazans at gmail.com)
require 'net/http'
require 'rexml/document'
class CepLivre
URL_CEP_LIVRE = 'http://ceplivre.pc2consultoria.com/index.php?module=cep&formato=xml&cep='
FIELDS = %w(tipo_logradouro logradouro bairro cidade estado_sigla)
def initialize(cep)
@cep = cep
get_data
end
def to_array
@result = []
process_a
end
def to_hash
@result = {}
process_h
end
private
def get_data
@data = Net::HTTP.get_response(URI.parse("#{URL_CEP_LIVRE}#{@cep}"))
raise "Connection error." unless @data.kind_of?(Net::HTTPSuccess)
@xml = REXML::Document.new(@data.body)
end
def process_a
FIELDS.each do |f|
field = REXML::XPath.match(@xml, "//#{f}").first
@result << field.text
end
@result
end
def process_h
FIELDS.each do |f|
field = REXML::XPath.match(@xml, "//#{f}").first
@result[f] = field.text
end
@result
end
end
# Array
puts CepLivre.new("29040-470").to_array
# Hash
puts CepLivre.new("29040-470").to_hash
[Update]
Faça o download da versão rexml e libxml-ruby.
Posted: novembro 17th, 2008 | Author: Carlan Calazans | Tags: aprendizado, curso, pesquisa, ruby, ruby learning | No Comments »
Ruby Learning é um website que oferece cursos baseados em Ruby online, em inglês. O curso em si é muito divertido e muito bem feito para ser um curso online e de graça, até os exercícios são bem bolados. Há a possibilidade dos alunos se interagirem uns com os outros através de fóruns e com os Assistentes de professor, que nada mais são do que alunos mais experientes. O conteúdo de um lição é liberado todo o Sábado, o aluno tem a semana inteira para estudar e fazer os exercícios, é bem tranquilo. Outro incentivo é que o curso é curto, ou seja, tem duração de somente 2 meses.
Aproveitando, o Satish criou uma pesquisa para a criação de novos cursos. O Ruby Learning já tem algumas sugestões e deseja saber o que a comunidade pensa sobre isto. Portanto, citando o Satish em seu blog:
We’re rapidly expanding our course offerings here at RubyLearning, trying to keep up with the enormous and ever-growing interest in Ruby. But we need your YOUR help because, as you know, Ruby is a big subject, and we’d like to be sure to focus in on the areas of most interest to you. (link para a pesquisa).