Archive

Archive for the ‘Ruby’ Category

Renomeando arquivos em ruby

January 10th, 2012 4 comments

Primeiro post do ano ressuscitando a categoria dica rápida.
Há uma ou duas semanas o PotHix me passou umas músicas, mas na hora de copiar, todos os arquivos vieram sem extensão. Depois de perder um tempo tentando resolver com bash, eu desisti e resolvi o problema em 10 min usando ruby. Se alguém puder postar nos comentários a solução em bash eu agradeço!

Para a minha solução usei apenas os seguintes métodos:

#Retorna um array de strings com todos os arquivos do diretório.
Dir.entries("dir")
#Retorna se o arquivo é um diretório ou não.
File.directory?("arquivo")
#Renomeia o arquivo.
File.rename("nome_antigo", "nome_novo")

Minha solução final ficou assim:

def rename_in_dir(dir)
  files = Dir.entries(dir)
  files.each do |f|
    # Usei esse if para ignorar os arquivos que já tinham
    # extensão e as referências '.' e '..'
    next if f == "." or f == ".." or f =~ /.*\..{2,4}$/
    # é importante sempre usar o diretório junto, se não ele vai
    # procurar sempre no diretório onde o script está sendo executado
    if File.directory?("#{dir}/#{f}")
      # Se for um diretório faz a chamada recursiva
      puts "DIR: #{dir}/#{f}"
      rename_in_dir("#{dir}/#{f}")
    else
      puts "renaming: #{dir}/#{f}"
      # Adiciona a extensão .mp3 no arquivo
      File.rename("#{dir}/#{f}", "#{dir}/#{f}.mp3")
    end
  end
end
# Começa a partir do diretório onde o arquivo está
rename_in_dir(".")
Categories: dica rapida, Ruby Tags: , ,

Alguns projetos Open Source

May 30th, 2011 3 comments

Antes de mais nada, me desculpem pelos meses que o blog anda sem atualizações, um dos motivos é justamente o que vou comentar neste post. Desde o começo do ano passei a contribuir um pouco mais com projetos Open Source e neste post vou falar um pouco sobre 3 colaborações que gostei muito de ter participado e que o resultado final me agradou muito também.

VRaptor Flex Plugin

Em ordem cronológica o primeiro “grande” feito ao Open Source neste ano foi ter criado, com a ajuda do Lucas Cavalcanti e do Erich Egert um plugin para o VRaptor que possibilita as chamadas remotas usando o protocolo AMF. Na verdade não fizemos todo o trabalho de (de)serialização, mas assim como o suporte para Spring, EJB, etc.  O que fizemos foi criar uma factory que você deve registrar no framework que realmente sabe fazer a serialização para AMF. Por enquanto estamos suportanto o BlazeDS e o GraniteDS.

Para saber um pouco mais sobre o plugin e como configurar e usar veja o página no próprio github para issues podem usar a mesma página de issues do VRaptor.

Stella 2.0

Alguns de vocês já deve ter ouvido falar no Stella. Um projeto com um monte de utilidades para desenvolvedores brasileiros, como validadores de CPF e CNPJ, gerador de boleto, conversor de números por extenso e um pouco mais. Embora muito útil, o projeto andava meio parado e recentemente eu, o Mario Amaral e o Paulo Silveira, além de outras contribuições da comunidade, atualizamos o projeto para suportar as “novas” especificações do JEE6 como o JSF2 e Bean Validation, além de muita refatoração e algumas melhorias na API.

Acabamos de liberar um release beta e em breve devemos ter uma versão 2.0 final disponível.

Static Server

O último projeto que trabalhei recentemente surgiu no momento de subir o site do Stella. Na Caelum estamos numa tendência de cada vez mais tirar a responsabilidade de infra das nossas mãos, então mesmo com um site estático a gente queria subir no Heroku ou Google App Engine. Pensamos em criar uma aplicação rails e deixar todos os arquivos no public, mas não fazia o menor sentido, então comecei a fazer usando apenas Rack, mas ficamos com o problema da home, aí comecei uma dsl pra configurar forward e redirect, fui refatorando até que surgiu o StaticServer que já está no rubygems como static_server.

Em breve vou colocar uma documentação melhor, mas por enquanto vocês podem ver os exemplos nos testes de integração.

Ajude você também

Esses e tantos outros projetos, brasileiros ou não, sempre precisam de ajuda, seja com código, documentação, exemplos e até mesmo encontrando e registrando bugs. Toda ajuda é bem vinda, sempre!

Em breve devo colocar mais exemplos e possivelmente escrever posts com mais detalhes da utilização de cada um deles.

Eventos do segundo semestre

November 3rd, 2010 No comments

QCon SP

Em setembro aconteceu um dos eventos mais importantes de TI que já passou no nosso país. Pela primeira vez no Brasil ocorreu uma QCon e tive a felicidade de estar presente. Dessa vez não fui oficialmente um palestrante, mas fui convidado para ser o host de uma das tracks das lightning talks que vou comentar no final do post.

O evento não foi importante apenas pelo nome QCon, mas sem dúvidas tivemos um evento verdadeiramente de alto nível, tanto os palestrantes brasileiros quanto os internacionais fizeram ótimas apresentações. Na MINHA opinião, entre as palestras que assisti, os destaque vão para o Nick Kallen, Charles Nutter e a palestra em dupla do Alexandre Porcelli e Gleicon Moraes.

Resumindo o evento em poucas palavras me parece que a preocupação geral dos arquitetos hoje é escalabilidade. Linguagens funcionais, filas, denormalização, nosql, cloud e outros meios/técnicas para melhorar a responsividade de nossas aplicações foram assuntos muito comentados por todas as tracks que passei.

Voltando as lightning talks, tivemos ótimas apresentações! Como já falei fui o host de uma das tracks e além da minha própria talk contei com as apresentações de: Alberto Leal, Lucas Pérez, Rafael Viveiros, Cecilia Fernandes, André Luiz R. Silva, Hugo Baraúna e um pequeno oi do pessoal do GURU-SP no final. Muito obrigado e parabéns para todos vocês.

Rails Rumble

No meio de outubro aconteceu a 3ª edição do Rails Rumble, esse ano não deixei passar e, pela primeira vez, participei da competição. Meu time acabou não chegando na final, numa breve retrospectiva levantamos alguns pontos bobos onde falhamos, como não ter pensado num lugar pra tomar banho… (Sim, eu fiquei mais de 48h sem banho). Quem sabe ano que vem não aparecemos na final?! Pelo menos nossa app nos fez conhecer novos frameworks e nos trouxe algumas ideias de negócio que jamais imaginaríamos.

RubyConf Brasil 2010

O antigo Rails Summit Latin America agora está sob a franquia Ruby Conf, pela primeira vez com o nome novo, conseguiram trazer palestrantes ainda mais impressionantes do que os do ano passado, com destaque para os commiters do Rails Jose Valim, Aaron Patterson e Yehuda Katz, além do Ola Bini e novamente o Charles Nutter. Mais um evento de altíssima qualidade levando o Brasil, cada vez mais, para um patamar de igualdade com outros países considerados polos tecnológicos.

Resumindo o evento em poucas palavras, acredito que as boas práticas são chave para o momento que a comunidade está passando, foram apresentadas várias melhorias no Rails e outros frameworks auxiliares e especialmente no ruby 1.9. Acredito que o interesse de todos agora é que toda a força de vontade que a comunidade tem, relembrada pelo Fabio Akita na abertura do evento, seja catalisada para gerar valor real.

Encontro Ágil 2010

Pra finalizar os eventos do post, um evento que ainda não aconteceu. No próximo sábado, dia 06/11 vai acontecer o Encontro Ágil 2010, num formato completamente inovador, com muitos jogos, dojos e nada de palestras tradicionais, como eles anunciaram, um evento da comunidade para a comunidade, onde terei o prazer de falar sobre dívida técnica e como evita-la numa lightning talk que em breve estará disponível no meu Slideshare

Finalmente aqui estão slides da minha lightning talk na QCon:

Ruby + Rails no Mundo Real 2010 – Eu fui

June 4th, 2010 No comments

Assim como no post do Rails Summit 2009 eu ia começar o post com uma resenha do evento, mas acho que os posts do Marcelo Castellani e do Rodrigo Ribeiro já atacaram todos os pontos e não tenho mais nada a acrescentar a não ser os meus parabéns e meus agradecimentos a todos os envolvidos.
Fotos do evento podem ser vistas no album do GURU-SP

Sobre a minha palestra com o Leonardo Bessa, infelizmente demos uma atrasadinha na primeira metade da palestra e não conseguimos falar de tudo o que queríamos, mas pelo feedback que tivemos acredito que os presentes gostaram e aprenderam. O que não deu tempo de falar no dia com certeza vai virar post aqui no futuro. Para os que não puderam ir, felizmente o pessoal da organização gravou o evento e o vídeo da nossa apresentação pode ser visto aqui:

Para aqueles que foram ou apenas viram o vídeo, aqui estão os slides da palestra:

E aqui o código gerado durante a apresentação:

class Picapau
  def voa
    "voando..."
  end
  def anda
    "andando..."
  end
end
woody = Picapau.new
amigo = Picapau.new
#
# woody.voa
# amigo.voa
# woody.anda
# amigo.anda
#
# def woody.hehehe
#   p "hehehe-hehehe-hehehehehe"
#
# end
#
# woody.hehehe
#
# # amigo.hehehe
#
#
# p woody.class
# p amigo.class
# p woody.class == amigo.class
class Object
    def singleton_class
      # p self
      class << self
        # p self
      self
      end
    end
end
# p woody.singleton_class
# p amigo.singleton_class
# p amigo.singleton_class == woody.singleton_class
#
# class Picapau
#   alias :metodo_voa :voa
#   def voa(param='')
#     result = metodo_voa(param)
#     p "Chamando metodo voa com #{param.inspect} retornou #{result.inspect}"
#     result
#   end
# end
#
# class Picapau
#   def self.log(metodo)
#     metodo_velho = self.instance_method(metodo)
#     define_method(metodo) do |*arg|
#       result =  metodo_velho.bind(self).call(arg)
#       p "Chamando metodo voa com #{arg.inspect} retornou #{result.inspect}"
#     end
#   end
#   log :voa
# end
#
# class Picapau
#   def self.log(*metodos)
#     metodos.each do |metodo|
#       metodo_velho = self.instance_method(metodo)
#       define_method(metodo) do |*arg|
#         result =  metodo_velho.bind(self).call(arg)
#         p "Chamando metodo voa com #{arg.inspect} retornou #{result.inspect}"
#       end
#     end
#   end
#   log :voa, :anda
# end
module Logger
  def log(*nome_do_metodos)
     nome_do_metodos.each do |nome_do_metodo|
       metodo_velho = self.instance_method(nome_do_metodo)
       define_method(nome_do_metodo) do
         result = metodo_velho.bind(self).call
         p "Chamando metodo #{nome_do_metodo} e retornou #{result}"
         result
       end
     end
   end
end
module Andador
  def anda2
    p "novo metodo que anda"
  end
end
class Picapau
  extend Logger
  include Andador
  log :voa, :anda
end
woody.voa
woody.anda
woody2 = Picapau.new
woody2.anda2
Categories: Palestras / Apresentações, Rails, Ruby Tags: