Ruby
Apostila de Ruby on Rails da Caelum liberada para download
15/12/09
No último dia 12/12/2009, a Caelum liberou gratuitamente a apostila utilizada por eles nos cursos de Ruby on Rails. Para quem está começando, vale muito a pena fazer o download para estudo.
Para fazer o download, clique aqui.
Link direto para o PDF aqui.
A apostila é muito completa. É abordado desde os conceitos básico da programação em Ruby até o uso de gems, plugins e AJAX no Rails. É um bom pontapé de início essa apostila.
Abaixo segue o índice da apostila para você ter uma noção do que irá encontrar.
1 Agilidade na Web 1
1.1 A agilidade
1.2 A comunidade Rails
1.3 Bibliografia
1.4 Tirando dúvidas
1.5 Para onde ir depois?
2 A linguagem Ruby 4
2.1 A história do Ruby
2.2 Características
2.3 Instalação do interpretador
2.4 Outras implementações
2.5 MagLev
2.6 Ruby Enterprise Edition
2.7 Interactive Ruby
2.8 Tipos Básicos
2.9 Para Saber Mais – Desafios
2.10 Para Saber Mais – Desafio
3 Ruby Avançado 12
3.1 Mundo orientado a objetos
3.2 Métodos comuns
3.3 Meta-programação
3.4 Definição de métodos
3.5 Discussão: Enviando mensagens aos objetos
3.6 Classes
3.7 Desafio: Classes abertas
3.8 self
3.9 Desafio: self e o método puts
3.10 Atributos e propriedades: acessores e modificadores
3.11 Syntax Sugar
3.12 Métodos de Classe
3.13 Para saber mais: Singleton Classes
3.14 Metaprogramação
3.15 Convenções
3.16 Coleções
3.17 Blocos e Programação Funcional
3.18 Desafio: Usando blocos
3.19 Mais OO
3.20 Modulos
3.21 Manipulando erros e exceptions
3.22 Exercício: Manipulando exceptions
3.23 Arquivos Ruby
4 Ruby on Rails 29
4.1 Ruby On Rails – Apresentação
4.2 Aprender Ruby?
4.3 RadRails 30
4.4 Primeira Aplicação
4.5 Exercícios: Iniciando o Projeto
4.6 Estrutura dos diretórios
4.7 O Banco de Dados
4.8 Exercícios: Criando o banco de dados
4.9 A base da construção: scaffold (andaime)
4.10 Exercícios: Scaffold
4.11 Gerar as tabelas
4.12 Versão do Banco de Dados
4.13 Exercícios: Migrar tabela
4.14 Server
4.15 Documentação do Rails
4.16 Exercício Opcional: Utilizando a documentação
5 Active Record
5.1 Motivação
5.2 Exercícios: Controle de Restaurantes
5.3 Modelo – O “M” do MVC
5.4 ActiveRecord
5.5 Rake
5.6 Criando Modelos
5.7 Migrations
5.8 Exercícios: Criando os modelos
5.9 Manipulando nossos modelos pelo console
5.10 Exercícios: Manipulando registros
5.11 Exercícios Opcionais
5.12 Finders
5.13 Exercícios: Buscas dinâmicas
5.14 Validações
5.15 Exercícios: Validações
5.16 Exercícios – Completando nosso modelo
5.17 O Modelo Qualificação
5.18 Exercícios – Criando o Modelo de Qualificação
5.19 Relacionamentos
5.20 Para Saber Mais: Cache
5.21 Exercícios – Relacionamentos
5.22 Para Saber Mais – Eager Loading
5.23 Para Saber Mais – Named Scopes
5.24 Para Saber Mais – Modules
6 Controllers e Views
6.1 O “V” e o “C” do MVC
6.2 Hello World
6.3 Exercícios: Criando o controlador
6.4 Redirecionamento de Action e Action padrão
6.5 Trabalhando com a View: O ERB
6.6 Entendendo melhor o CRUD
6.7 Exercícios: Controlador do Restaurante
6.8 Helper
6.9 Exercícios: Utilizando helpers para criar as views
6.10 Partial
6.11 Exercícios: Customizando o cabeçalho
6.12 Layout
6.13 Exercícios: Criando o header
6.14 Outras formas de gerar a View
6.15 Filtros
7 Rotas
7.1 routes.rb
7.2 Pretty URLs
7.3 Named Routes
7.4 REST – map.resource
7.5 Actions extras em Resources
7.6 Diversas Representações
7.7 Para Saber Mais – Nested Resources
8 Completando o Sistema
8.1 Exercícios
8.2 Selecionando Clientes e Restaurante no form de Qualificações
8.3 Exercícios
8.4 Exercícios Opcionais
9 Calculations
9.1 Método
9.2 Média
9.3 Exercícios
10 Associações Polimórficas
10.1 Nosso problema
10.2 Alterando o banco de dados
10.3 Exercícios
11 Ajax fácil com RJS
11.1 Adicionando comentários nas views
11.2 Métodos de RJS Templates
11.3 Exercícios
11.4 Adicionando comentários
11.5 Exercícios
11.6 Exercícios – Enviando os dados com Ajax
12 Alguns Plugins e Gems Importantes
12.1 Paginação
12.2 Exercícios – Título
12.3 Hpricot
12.4 Exercícios – Testando o Hpricot
12.5 File Uploads: Paperclip
12.6 Exercícios
13 Apêndice A – Testes 127
13.1 O Porquê dos testes?
13.2 Test::Unit
13.3 RSpec
13.4 Cucumber, o novo Story Runner
14 Apêndice B – Integrando Java e Ruby
14.1 O Projeto
14.2 Testando o JRuby
14.3 Exercícios
14.4 Testando o JRuby com Swing
15 Apêndice C – Deployment
15.1 Webrick
15.2 CGI
15.3 FCGI – FastCGI
15.4 Lighttpd e Litespeed
15.5 Mongrel
15.6 Proxies Reversos
15.7 Phusion Passenger (mod_rails)
15.8 Ruby Enterprise Edition
15.9 Exercícios: Deploy com Apache e Passenger
16 Apêndice D – Instalação
16.1 Ruby – Ubuntu
16.2 Ruby – Windows
16.3 Rails
16.4 JDK
16.5 Aptana
16.6 Mongrel
16.7 MySQL
16.8 SVN
Problema do Rails 2.2.2 com o MySQL em Windows
10/03/09
Desde que a versão 2.2.2 do Rails foi lançada, alguns problemas relacionados ao driver do MySQL, que conectava a aplicação Rails ao banco, começaram a surgir e incharam lista de discussões com relatos de problemas. Um desses problemas era que quando vamos executar o rake db:migrate ocorre um erro que apresentava a seguinte mensagem:
!!! The bundled mysql.rb driver has been removed from Rails 2.2. Please install the mysql gem and try again: gem install mysql. rake aborted! 126: The specified module could not be found. - c:/ruby/lib/ruby/gems/1.8/gems/mysql-2.7.3-x86-mswin32/ext/mysql.so (See full trace by running task with --trace)
Acredito que se você tem esse problema você já deva ter instalado o gem do MySQL e mesmo assim continuou tendo esse problema. Caso você não tenha instalado o gem, por favor faça:
gem install mysql --no-rdoc --no-ri
Feita a instalação, veja se na lista de gems instaladas, se encontra o MySQL. Para ver suas gems instaladas:
gem list --local
O gem do MySQL deverá estar instalado.
Bem, se você tentar rodar o migrate denovo, provavelmente terá o mesmo problema. Pesquisando pelas partes mais distantes da internet encontrei uma solução que dizia para copiar e colar o arquivo <MYSQL_HOME>/bin/libmysql.dll para pasta <RUBY_HOME>/bin. Mas isso tem um porém. Se sua versão do MySQL instalado for a 5.1 o problema continuará.
Você terá que copiar o libmysql.dll do MySQL 5.0. No link abaixo você poderá fazer o download da versão correta do libmysql.dll pra usar:
http://instantrails.rubyforge.org/svn/trunk/InstantRails-win/InstantRails/mysql/bin/libmySQL.dll
Copie o libmysql.dll do link acima para a pasta <RUBY_HOME>/bin. Feito isso, tente novamente executar o migrate e verás que agora funciona!
Usando o Gmail para enviar e-mail com o ActionMailer no Rails
15/02/09
Existe uma maneira muito fácil de se enviar e-mails no Rails e usando o Gmail. Nesse pequeno tutorial tentarei explicar como fazer isso funcionar.
Primeiramente é preciso saber que o Gmail utiliza para autenticação de protocolo SMTP (envio de e-mails) o ssl/tls. Essa forma de autenticação não é suportada nativamente pelo ActionMailer. Isso quer dizer que precisaremos de uma ajudinha para podermos enviar e-mails utilizando o Rails e o Gmail.
Essa ajudinha é uma biblioteca que está voando pela Internet (eu não sei quem é o autor e muito menos da onde ela saiu) e nos ajudará com a autenticação. Eu tenho uma cópia dessa biblioteca em meu GitHub, você pode pegá-la aqui.
Com a biblioteca em mãos copie ela para a pasta lib do seu projeto Rails. Provavelmente ficará assim o caminho:
/lib/smtp_tls.rb
Agora abra o arquivo config/environment.rb e lá no fim, bem lá no fim mesmo, adicione o seguinte trecho de código:
ActionMailer::Base.default_content_type = "text/html" ActionMailer::Base.smtp_settings = { :address => "smtp.gmail.com", :port => 587, :authentication => :plain, :user_name => "seuemail@gmail.com", #Você pode usar o Google Apps! :password => 'suasenha' }
Bacana. Está tudo configurado. Agora vamos ver como se fazer no ActionMailer para se enviar um e-mail. Vamos gerar um novo Mailer. Em seu console digite:
ruby script/generate mailer Notificador
Seu novo mailer será gerado. Após a geração, abra ele (app/models/notificador.rb)
Adicione o seguinte método:
def notificar recipients "destinatario@email.com" from "meumail@meuemail.com" subject "Titulo do Email" end
Agora você precisa adicionar uma view com o mesmo nome desse método, assim como se faz com os Controllers. Nese caso, a vew ficaria views/teste/notificar.erb
Nesse arquivo ficará tudo o que você quer enviar ao destinatório. É o corpo do e-mail mesmo. Você pode utilizar variáveis de instância caso queira passar alguma informação para a view, da mesma forma que é feito nos controllers.
Criada a view, basta chamar o mailer nos controllerspara enviar o email da seguinte forma:
Notificador.deliver_notificarRepare que é colocado um deliver_ ali antes do nome do método que setamos. Isso é normal.
Se tudo ocorrer bem seu e-mail será enviado. Porém enviando um e-mail dessa forma irá ter um tempo de request mais demorado.
Obtendo Hash MD5 e SHA com Rails
14/02/09
Para se obter hashs tanto MD5 como SHA com Rails é muito fácil. Abaixo segue o que eu faço para calcular os Hashs:
def md5(str) return Digest::MD5.hexdigest(str) end def sha1(str) return Digest::SHA1.hexdigest(str) end def sha256(str) return Digest::SHA256.hexdigest(str) end
Você pode ver no exemplo acima que coloquei três funções. Uma para MD5, outra para SHA1 e outra para SHA256. Mas existem outros ainda. Veja:
- Digest::SHA1.hexdigest() – Produz 40 caracteres de dígitos hexadecimais.
- Digest::SHA256.hexdigest() – Produz 64 caracteres de dígitos hexadecimais.
- Digest::SHA384.hexdigest() – Produz 96caracteres de dígitos hexadecimais.
- Digest::SHA512.hexdigest() – Produz 128 caracteres de dígitos hexadecimais.
Se quiser, você pode testar essas funções no console do Rils. Basta abrir o console:
ruby script/consoleDigite o comando:
strHash = Digest::SHA1.hexdigest("string")
A saída deverá ser:
=> "ecb252044b5ea0f679ee78ec1a12904739e2904d"
Fácil e simples.
Experimente o Ruby Online
20/11/08
Se você escuta falar sempre de Ruby (mas nunca testou) e gostaria de experimentar sem ter que instalar o interpretador no seu computador, o site Try Ruby! pode te ajudar. O Try Ruby! é uma interface Web para você testar a linguagem e parte dos seus recursos. É muito parecido com o IRB que o Ruby oferece quando o interpretador é instalado.
No Try Ruby! basta digitar os comandos no console do site e a saída vai sendo gerada. Realmente muito bom para quem quer conhecer.
Além de oferecer a possibilidade de você testar o Ruby em tempo real, você pode digitar help no Try Ruby! que o próprio site irá guiar você por um tutorial bem básico sobre Ruby utilizando o próprio console que o TR fornece.
Vamos começar a testar Try Ruby. Iremos começar com uma soma simples. Acesse o site e no console digite:
>> 4 + 3 => 7
Beleza! Estamos indo, agora digite:
6 * 7 => 42
Legal, agora vamos a um dos conceitos do Ruby que nos diz que tudo em Ruby é um objeto, inclusive os números que usamos. Já que um número é um objeto (fixnum), vamos chamar um método do nosso objeto:
10.next => 11
O Ruby contém diversos métodos para os objetos fixnum. Para ver a documentação completa do fixnum, clique aqui. Abaixo segue mais um exemplo de um método que podemos usar com o objeto fixnum. Esse método irá nos retornar a quantidade de bytes utilizadas pelo nosso objeto.
5.size => 4
Experimente esse número:
100000000000000000.size => 8
Ok. Estamos indo bem com números. Agora, vamos testar um pouco as Strings em Ruby. Vamos começar atribuindo instanciando uma nova String:
meu_nome = "Ricardo" => Ricardo
Vamos testar o que o Ruby nos oferece com relação a Strings:
meu_nome.upcase => RICARDO meu_nome.reverse => odraciR
Há diversos métodos para manipulação de Strings no Ruby. Você pode testar muito mais acessando a documentação oficial do Ruby para Strings aqui.
Você também pode experimentar os Arrays em Ruby. Vamos começar declarando 2 Arrays:
array1 = [1, 2, 3, 4] => [1, 2, 3, 4] array2 = [1, 2, 3] => [1, 2, 3]
Agora vamos somar (ou unir) esses dois array declarados:
array1 + array2 => [1, 2, 3, 4, 1, 2, 3]
Também podemos fazer a subtração deles:
array1 - array2 => [4]
Se você quiser a intersecção dos dois arrays, você pode conseguir isso facilmente assim:
array1 & array2 => [1, 2, 3]
Eu vou ficando por aqui, mas você pode continuar. Faça o guia que o site Try Ruby preparou. Como eu disse no começo do post, basta digitar help no console e o próprio Try Ruby irá guia-lo. Após terminar tudo você pode pegar a documentação do Ruby e ir praticando e vendo o que a linguagem oferece. A documentação oficial e completa de toda a linguagem Ruby você encontra aqui.
Se ainda não estiver satisfeito, você pode acessar o rubylearning.com. Existem diversos tutoriais e exemplos de código nesse site. Porém alguns você não conseguirá fazer no Try Ruby. Nesse caso eu aconselho a instalar o interpretador na sua máquina. Você pode baixar o interpretador no site oficial do Ruby: http://www.ruby-lang.org
Aos que estão chegando ao mundo Ruby, sejam bem vindos e espero que gostem da linguagem. Vejo vocês no próximo post e bons estudos.
Fatorial recursivo em Java e Ruby
18/11/08
Muita gente que está começando com programação procura sobre recursividade e exemplos de recursividade. Acredito que o exemplo mais clássico da demonstração da recursividade seja o cálculo do fatorial de um número inteiro N.
Primeiramente o que é recursividade?
A recursividade, em programação, é capacidade de uma função (ou método) poder chamar ela mesma.
Vendo o exemplo de cálculo fatorial talvez clarifique as idéias. Abaixo está dois exemplos de cálculo de fatorial utilizando a recursividade. Os dois exemplos fazem exatamente a mesma coisa, calcula o fatorial de um número. A única diferença entre os dois é que um está escrito em Ruby e o outro em Java.
Java:
package com.meupost.exemplo; public class Fatorial { public static long fatorial(long number) { if (number == 0) { return 1; } return number * fatorial(number - 1); } public static void main(String[] args) { System.out.println(Fatorial.fatorial(5)); } }
Ruby:
def fatorial(number) if (number == 0) return 1 else return number * fatorial(number - 1) end end puts fatorial(5)
Em ambos os casos a saída será 120 pois 5! = 120.
Sobre como se calcula um fatorial veja aqui.
Para mais informações sobre recursividade veja aqui.
Rails Summit – Algumas apresentações e Fotos
20/10/08
Até agora somente disponibilizaram duas apresentações feitas no Rails Summit Laton America 2008. Estou sempr vendo se os caras vão disponibilizar ou não as apresentações. Assim que eles disponibilizarem (se disponibilizarem), colocarei o link aqui no Blog.
Por enquanto somente essas duas apresentações sairam:
- Luis Lavena – Como ser produtivo com Ruby mesmo em Windows
- Eleomar França (Desconferência) – Aprendendo em Grupos
E você pode achar muitas fotos do evento fazendo essa busca no Flickr.
É isso. Assim que tivermos mais novidades, estarei postando!
Rails Summit Latin America 2008 – Excelente
17/10/08

Evento totalmente excelente.
Para quem esteve no evento sabe o que eu estou falando. Foi um evento muito, mas muito bom mesmo. As palestras de ltíssimo nível, bem organizado, local be acessível para que vem de fora e ainda com as “locawebzetes”. Fábio Akita e o pessoal da organização realmente estão de parabéns.
Dia 1
Fábio Akita abriu o evento e passou a palavra para Gilberto Mautner que é co-fundador da Locaweb. Esse é o cara que trouxe o Ruby on Rails para a Locaweb. Na abertura, tivemos um vídeo onde os dois loucos do RailsEnvy mandaram uma mensagem para o Rails Summit Latin America 2008. Vocês podem ver o vídeo aqui: http://vimeo.com/1974744
Sobre as palestras, no primeiro dia tivemos excelentes palestras com Chad Fowler falando sobre como ser reconhecido e como ser “remarkable” (be remarkable) com o que você faz. Esse assunto tanto cabe em desenvolvimento como em qualquer outra área profissional.
David Heinemeir Hanson (D.H.H) respondeu dúvidas e questões do pessoal a respeito (logicamente) do Ruby on Rails. Foram abordadas questões sobre Thread Safety, Internacionalização, Release do Rails 2.2 (a qual ele não revelou) entre outras.
Sobre Rest tivemos uma palestra muito legal com George Malamidis e Danilo Sato, ambos da ThoughtWorks.
Assisti também a palestra de Carlos Brando e a experiência dele e da equipe brasileira trabalhando para a SurgeWorks. Foi abordado assuntos bem interessantes como a aplicação de métodos ágeis com equipes remotas.
Tivemos um keynote de Chris Wanstrath criador do repositório GitHub um dos mais acessados pela comunidade Rails. Ele contou sobre a trajetória de sua vida profissional até chegar no GitHub.
E para finalizar o primeiro dia tivemos uma “desconferência” (Birds of a Feather) onde quem quisesse subir no palanque para falar o que queria sobre Ruby/Rails ou relacionado podia. Uma momento muito bom de descontração mesmo.
Nesse primeiro dia não tive a oportunidade de assistir algumas palestras pois eram paralelas com outras. Assim não poderei falar muito sobre as palestras do Fábio Akita e Dr.Nic.
Dia 2
Já logo pela manhã começamos com a palestra dos carinhas (Ninh Bui e Hongli Lai) da Phusion. Essa palestra foi excelente. A apresentação dos caras é sensacional. Falaram sobre passenger, escalabilidade, distribuição de carga…
Depois por áudio conferência, tivemos uma apresentação de Charles Nutter e Thomas Enebo que são criadores mantenedores do JRuby. Fizerem demonstração incríveis e como é fácil rodar aplicações Swing com JRuby e também alguns benchmarks com JRuby.
Fiquei curioso sobre a palestra de George Guimarães que falou sobre deployments e configuração de ambiente de produção para aplicações Rails. Ele também abordou algumas dificuldades que tiveram na construção da StartUp Pagestacker.
Para mim, as melhores palestras vieram nesse momento. As palestras de David Chelimsky sobre RSpec e sobre o Cucumber foram excelentes. Explicou os conceitos do BDD (Behavior Driven Development) e do TDD (Test Drive Development) além de mostrar exemplos reais da utilização do RSpec e do Cucumber. Fiquei honrado de poder assitir a palestra do David e espero poder assistir muitas outras.
Danilo Sato voltou no dia 2 (mas agora sem falar inglês e sem o George Malamidis) e também fez uma ótima apresentação sobre testes automatizados. Mostrou exemplos e problemas enfrentados no dia a dia do desenvolvedor na hora de elaborar testes.
Fabio Kung também palestrou no evento falando sobre o uso de JRuby porém mais focado na VM Java do que no código Ruby propriamente dito. Apresentou vantagens sobre o uso do JRuby ao invés do interpretador do Matz e exemplificou isso no uso de memória, e threads.
E para finalizar o ciclo de palestras no segundo dia tivemos o keynote de Obie Fernandez que falou com é dia a dia no desenvolvimento dos projetos de sua empresa Hashrocket onde eles usam métodos ágeis e Rails. Mostrou o que deve ser feito e quais as atitude a serem tomadas para se ter sucesso no desenvolvimento com Rails. Essa também foi uma das melhores palestras do dia.
Assim como no primeiro dia não consegui assistir a todas as palestras do dia devido as sessões paralelas então acabei perdendo as palestras de Jay Fields, Manoel Lemos, Vinícius Teles, Phillippe Hanrigou e Luis Lavena.
Depois tivemos alguns sorteios dos patrocinadores (Intel, Sun, Accept, Info Exame, Linux Magazine…) e da Locaweb. Saí do evento por volta das 20:45 e fiquei totalmente satisfeito com o que vi e aprendi. Valeu muito a pena o investimento. Se eu fosse você já começava a me preparar para o Rails Summit Latin America 2009. Eu já estou me preparando.
Fotos
Aqui segue alguns materiais “coletados” pela Net. Como eu sou uma anta e esqueci de levar máquina fotográfica, pegarei emprestado os Flickrs de algumas pessoas que foram ao evento:
- Flickr de Cássio Marques
- Flickr de Raul Souza Lima
- Projeto Morena Open Source
- Flickr do Obie Fernandez
Assim que eu conseguir mais materiais legais do evento eu com certeza postarei. Muitos palestrantes irão disponibilizar suas apresentações na Web, assim que eu descobrir onde elas ficarão eu também postarei.
Veja também o LiveStream do BlogBlogs.
Ruby para tudo!
06/09/08
Fala pessoal!
Hoje eu vou postar um exemplo clássico de como o Ruby pode facilitar nossas vidas de desenvolvedor no dia a dia (por mais idiota que seja a utilização da linguagem).
Podemos utilizar Ruby tanto para fazer aplicações complexas como para fazer um simples script que gere arquivos de playlist. Isso mesmo caro leitor, um script que gera um arquivo de playlist (M3U).
Quando temos várias pastas de músicas (ou vídeos) espalhadas em vários computadores na rede e precisamos criar uma lista de todas essas músicas, por exemplo, podemos adicionar elas no Winamp e salvar a playlist, certo? Depende! Se você quiser esperar o Winamp ler todas as tags ID3 dos arquivos para depois salvar, você pode. Como também pode desenvolver um script Ruby que leia os arquivos para você e monte uma saída para arquivo M3U. Solução bem mais rápida.
Primeiramente o que é um arquivo M3U? O arquivo que possui a extensão “m3u” é um arquivo texto que contém em cada linha o caminho pra um arquivo de mídia. A extensão foi desenvolvida para ser o arquivo de playlist padrão do Winamp, isso lá nos primórdios desse player. Hoje a extensão se tornou um padrão de playlists e é suportada por quase todos os players de mídia.
O M3U pode conter tanto os caminhos relativos dos arquivos de mídia como os caminhos absolutos dos tais arquivos. Eu pessoalmente prefiro sempre usar o caminho absoluto.
Bom, supondo que temos vários computadores em rede e que nesses computadores há pastas compartilhadas (e com acesso claro) com arquivos de mídia. Então queremos gerar um arquivo de playlist com todos os arquivos de mídia que estão nessas pastas compartilhadas. Faremos um script para resolver esse problema.
Primeiramente vamos definir o caminho onde será salvo o arquivo de playlist e também o arquivo de LOG, caso houver erros. Assim iniciamos nosso script da seguinte maneira:
@saida_m3u = 'C:\Documents and Settings\usuario\Desktop\lista.m3u' @log_file = 'C:\Documents and Settings\usuario\Desktop\lista.log'
Também precisamos definir os caminhos que iremos procurar as músicas (pastas) e as extensões que entrarão em nossa playlist. Usaremos um Array para guardar o caminho das pastas que iremos procurar e outro Array para as extensões. Depois de instanciar os Arrays, preenchemos os array com os valores que queremos, nesse caso as Strings de caminho das pastas e também as Strings de extensão.
@saida_m3u = 'C:\Documents and Settings\usuario\Desktop\lista.m3u' @log_file = 'C:\Documents and Settings\usuario\Desktop\lista.log' @midia_ext = Array.new @music_paths = Array.new #--------------------------------------------------------------------- # CAMINHOS PARA O SCAN # Os caminhos abaixo serão percorridos recursivamente pelo script # para procurar arquivos de mídia. Cada caminho absoluto é uma # posição diferente no Array. #--------------------------------------------------------------------- @music_paths << 'D:\MP3\Músicas' @music_paths << '\\computador1\mp3' @music_paths << '\\computador2\musics' #--------------------------------------------------------------------- # EXTENSÕES DE MÍDIA # As extensões listadas abaixo serão usadas pelo script para fazer # a verificação com as extensões dos arquivos que serão adicionados. # Isso serve para que o script não adicione arquivos que não sejam de # mídia como .doc, .exe, .txt # Você pode adicionar outros tipos de extensões se quiser para que o # script ache. #--------------------------------------------------------------------- @midia_ext << '.mp3' @midia_ext << '.ogg' @midia_ext << '.wma' @midia_ext << '.wav' @midia_ext << '.flac' @midia_ext << '.aac'
Daqui para frente vem a lógica da aplicação. O que fizemos até agora foi um cabeçalho onde fica a configuração do script. É onde você pode alterar para que atenda suas necessidades.
Como nós estamos fazendo um script bacana, nós vamos dar algumas estatísticas no final sobre a quantidade de músicas adicionadas, o tempo que durou a busca das mídias etc. Então vamos inicializar algumas variáveis que nós ajudarão nas estatísticas e também declarar a utilização do find que é uma biblioteca de busca de arquivos do Ruby. O find já está no core do Ruby. Se quiser saber mais sobre o Find acesse a documentação do Ruby.
require 'find' @total_musicas = 0 @total_adicionado = 0 @erros_adicao = 0 @usar_log = true
Essas variáveis são alto explicativas e você verá a utilização delas durante o script. Por enquanto nosso script está ficando da seguinte maneira:
@saida_m3u = 'C:\Documents and Settings\Ricardo\Desktop\lista.m3u' @log_file = 'C:\Documents and Settings\Ricardo\Desktop\lista.log' @midia_ext = Array.new @music_paths = Array.new @music_paths << 'D:\MP3\Músicas' @music_paths << '\\computador1\mp3' @music_paths << '\\computador2\musics' @midia_ext << '.mp3' @midia_ext << '.ogg' @midia_ext << '.wma' @midia_ext << '.wav' @midia_ext << '.flac' @midia_ext << '.aac' @total_musicas = 0 @total_adicionado = 0 @erros_adicao = 0 @usar_log = true
Agora, para uma maior legibilidade de código, e manutenção, vamos quebrar toda lógica do script em pequenas funções que fazem pequenos trabalhos, porém de importância extrema para o funcionamento do script.
A primeira função que iremos criar é uma função que checa se uma extensão passada por parâmetro da função está contida no Array de funções que criamos no início do script. Essa função de checagem serve para nós não adicionarmos em nosso arquivo de playlist qualquer arquivo que encontrar. A função ficaria da seguinte maneira:
def check_extension(file_extension) @midia_ext.each do |mid_ext| if (file_extension.downcase.eql?(mid_ext)) return true else return false end end end
Bem simples não acham? Apenas percorremos o Array e vemos se existe a extensão lá dentro. Se existir, retornamos true. Senão retornamos false.
Precisamos também de uma função que sirva para escrever o arquivo de playlist com o caminho da mídia encontrado. Essa função irá escrever o arquivo que nós também definimos no início do script com o objeto @saida_m3u. A função ficaria assim:
def save_to_m3u(path) begin f = File.new(@saida_m3u, "a") f < < path.gsub("/", "\") + "n" @total_adicionado = @total_adicionado + 1 puts "Musica adicionada: #{path.gsub("/", "\")}" rescue puts "Erro ao adicionar: #{path.gsub("/", "\")} ignorando" @erros_adicao = @erros_adicao + 1 if (@usar_log) puts "Adicionando no Log" save_to_log("warn", "Musica NAO adicionada: #{path}") end end end
O que a função faz? Ela cria um novo arquivo (se ele já não tiver sido criado) e escreve nele o caminho recebido através do parâmetro path. Se acontecer qualquer problema que impossibilite a gravação do caminho no arquivo de playlist, será lançada uma exceção e a função irá capturar (por isso do begin..rescue..end). Quando capturado o problema, então chamamos uma função chamada save_to_log e passamos o problema para que seja registrado no LOG. Mas ainda não criamos uma função que salve informações em um log. Vamos criar!
def save_to_log(type, message) begin data_hora = Time.new.strftime("%d/%m/%Y %H:%M") f = File.new(@log_file, "a") f < < "#{data_hora} #{type.upcase} #{message}" rescue puts "Houve um erro na escrita ao LOG." puts "Nao sera mais usado o log na criacao de playlist" @usar_log = false end end
Outra função simples, onde salvamos as informações que vem por parâmetro juntamente com o data e hora atual. Se houver problema na gravação do LOG, então capturamos a exceção e desabilitamos o uso do LOG, já que ele está com problemas. Ta fincando legal!
Bem pessoal, agora vem o “corpo” do script. Agora vem a parte principal. Agora vem o que faz o script funcionar. Agora vem finalmente a parte que percorre as pastas, chama as funções e exibe os resultados.
Agora sim nós usaremos o Find declarado mais acima. Com o find iremos percorrer recursivamente as pastas setadas no Array de caminhos de pastas. Quando percorremos recursivamente, estamos percorrendo todas as subpastas também. Como ficaria esse percorrimento recursivo? Assim:
@music_paths.each do |music_path| begin Find.find(music_path) do |path| if (File.file?(path)) if (check_extension(File.extname(path))) @total_musicas = @total_musicas + 1 save_to_m3u(path) end end end rescue puts "Erro na leitura do caminho: #{path}" save_to_log("ERROR", "Erro na leitura do caminho: #{path}") end end
O que trecho de código faz? Primeiro, é um loop no Array de caminhos de pastas, depois é outro loop com o Find onde o objeto path aponta para um caminho. É feita uma verificação se esse objeto path é um arquivo ou diretório. Se for arquivo então verificamos se a extensão dele usando nossa função check_extension, se a extensão tiver sido verificada com sucesso então incrementamos nossa variável de estatística e salvamos o caminho na nossa playlist. Simples! Muito simples!
Agora para ficar um script mais legal do que já está, vamos fazer uma saída para o usuário via console mesmo com as estatísticas e demais informações. Essa parte é opcional para o funcionamento do script, mas é legal.
puts "n" puts "===================================================" puts " GERACAO DA LISTA FINALIZADA" puts "===================================================" puts "Lista M3U em #{@saida_m3u}" if (@erros_adicao > 0) puts "Houve alguns erros ao adicionar algumas musicas" puts "Verifique o LOG para mais detalhes em #{@log_file}" puts "n" puts "=============================" puts " RESUMO" puts "=============================" puts "Total de musicas: #{@total_musicas}" puts "Total adicionadas: #{@total_adicionado}" puts "Total de erros: #{@erros_adicao}" puts "n" puts "Clique em fechar para sair" else puts "Todas as musicas foram adicionadas com sucesso" puts "============================" puts " RESUMO" puts "============================" puts "Total de musicas: #{@total_musicas}" puts "Total adicionadas: #{@total_adicionado}" puts "Total de erros: #{@erros_adicao}" puts "n" puts "Clique em fechar para sair" end sleep(100000)
Fizemos duas saídas distintas acima. Uma se houve alguma erro durante a execução do script e outra se não houve nenhum erro. Essas saídas não tem segredo, somente alguns “puts“.
Final galera. O script está pronto e já pode ser executado. Juntando todas as partes montamos um script que ficará desse jeito:
@saida_m3u = 'C:\Documents and Settings\Ricardo\Desktop\lista.m3u' @log_file = 'C:\Documents and Settings\Ricardo\Desktop\lista.log' @midia_ext = Array.new @music_paths = Array.new @music_paths << 'D:\MP3\Músicas' @music_paths << '\\computador1\mp3' @music_paths << '\\computador2\musics' @midia_ext << '.mp3' @midia_ext << '.ogg' @midia_ext << '.wma' @midia_ext << '.wav' @midia_ext << '.flac' @midia_ext << '.aac' @total_musicas = 0 @total_adicionado = 0 @erros_adicao = 0 @usar_log = true def check_extension(file_extension) @midia_ext.each do |mid_ext| if (file_extension.downcase.eql?(mid_ext)) return true else return false end end end def save_to_m3u(path) begin f = File.new(@saida_m3u, "a") f << path.gsub("/", "\") + "n" @total_adicionado = @total_adicionado + 1 puts "Musica adicionada: #{path.gsub("/", "\")}" rescue puts "Erro ao adicionar: #{path.gsub("/", "\")} ignorando" @erros_adicao = @erros_adicao + 1 if (@usar_log) puts "Adicionando no Log" save_to_log("warn", "Musica NAO adicionada: #{path}") end end end def save_to_log(type, message) begin data_hora = Time.new.strftime("%d/%m/%Y %H:%M") f = File.new(@log_file, "a") f << "#{data_hora} #{type.upcase} #{message}" rescue puts "Houve um erro na escrita ao LOG." puts "Nao sera mais usado o log na criacao de playlist" @usar_log = false end end @music_paths.each do |music_path| begin Find.find(music_path) do |path| if (File.file?(path)) if (check_extension(File.extname(path))) @total_musicas = @total_musicas + 1 save_to_m3u(path) end end end rescue puts "Erro na leitura do caminho: #{path}" save_to_log("ERROR", "Erro na leitura do caminho: #{path}") end end puts "n" puts "===================================================" puts " GERACAO DA LISTA FINALIZADA" puts "===================================================" puts "Lista M3U em #{@saida_m3u}" if (@erros_adicao > 0) puts "Houve alguns erros ao adicionar algumas musicas" puts "Verifique o LOG para mais detalhes em #{@log_file}" puts "n" puts "=============================" puts " RESUMO" puts "=============================" puts "Total de musicas: #{@total_musicas}" puts "Total adicionadas: #{@total_adicionado}" puts "Total de erros: #{@erros_adicao}" puts "n" puts "Clique em fechar para sair" else puts "Todas as musicas foram adicionadas com sucesso" puts "============================" puts " RESUMO" puts "============================" puts "Total de musicas: #{@total_musicas}" puts "Total adicionadas: #{@total_adicionado}" puts "Total de erros: #{@erros_adicao}" puts "n" puts "Clique em fechar para sair" end sleep(100000)
Rails Summit Latin America
10/08/08
Fala galera! Já faz um tempinho que não posto pois o trabalho está corrido. Vamos ver se daqui para frente volto apostar com mais frequência, tá difícil, mas vou tentar!
Bom, volto com esse post para divulgar o maior evento sobre Ruby on rails da América Latina que vai acontecer aqui no Brsil. Em São Paulo. É o Rails Summit Latin America. O evento promete e os palestrantes são de altíssimo nível. Mas muito alto mesmo, o próprio DHH, criador do framework, irá palestrar.
No blog do Akita há muitas informações sobre o evento, veja mais detalhes aqui:
A Locaweb está partocinando o evento e você pode fazer sua inscrição aqui:
No mesmo site da inscrição contém os valores, os palestrantes, o local… Tudo sobre o evento.
Eu já fiz a minha incrição e estarei lá com certeza. Você já fez a sua?





Comentários