Tiago Madeira Inferências aleatórias de um cérebro em versão alpha

"Só se dedicará a um assunto com toda a seriedade alguém que esteja envolvido de modo imediato e que se ocupe dele com amor. É sempre de tais pessoas, e não dos assalariados, que vêm as grandes descobertas."
(Arthur Schopenhauer)

Arquivo do mês: November, 2007

29/11/2007

Recebendo entradas (STDIN) de forma eficiente no Ruby

Para praticar Ruby e conferir sua velocidade, resolvi resolver alguns problemas lógicos olímpicos usando suas funções maravilhosas. Deparei-me com gambiarra logo na entrada ao iniciar meu primeiro script: Batuíra, um problema simples de grafos.

A entrada é composta de vários conjuntos de teste. A primeira linha de um conjunto de teste contém um número inteiro N que indica a quantidade de pontos de repouso . Os pontos de repouso são numerados de 1 a N, sendo 1 o ponto de partida e N o ponto de chegada do vôo migratório. As linhas seguintes contêm, cada uma, três inteiros não negativos X e Y que indicam que a distância do ponto de repouso X ao ponto de repouso Y é Z. O final do conjunto de teste é indicado por X = 0,Y = 0 e Z = 0. O final da entrada é indicado por N = 0.

Em C, eu faria:

while (scanf("%d", &n)&&n!=0) {
	while (scanf("%d %d %d", &x, &y, &z)&&x!=0&&y!=0&&z!=0) {
	}
}

Em Ruby, comecei fazendo algo assim:

while n=gets.chomp.to_i && n!=0
        while x,y,z=gets.chomp && x!="0" && y!="0" && z!="0"
                x=x.to_i; y=y.to_i; z=z.to_i
        end
end

Para uma linguagem como Ruby, um código desse tamanho é considerado muito extenso e muito cheio de lixo. Há dois problemas que considero sérios aí:

  • A falta de um scanf (poxa, eles tem printf, o que custa ter scanf?)
  • Why the hell não existe to_i! (com ponto de exclamação no final)?

Só aprendi duas maneiras de pegar dados da entrada do usuário no tutorial do TaQ: readlines e gets. As duas são pouquíssimo práticas pra esse caso e não encontrei mais nada interessante no STDIN.methods. Por isso suponho que exista alguma coisa que desconheço, mesmo numa gem estranha, ou alguma maneira de criar um bloco de código pra arrumar a array, mas não encontrei nada. Alguém já passou por isso?

Technorati Tags: , , , , ,

Compare Preços de: iPod, home theater, plasma, lcd, câmeras digitais, games, ps3

Escreva um comentário!

28/11/2007

Baixando e convertendo vídeos do YouTube para AVI e MP3 no Linux usando Ruby, wget, ffmpeg e lame

#!/usr/bin/ruby
require "net/http"
 
def inputerror
        puts "Uso: rytc --<avi|mp3> ID_VIDEO_1 [ID_VIDEO_2 ...]"
        exit 1
end
 
arg=ARGV
if arg.length<2
        puts "Você não passou o mínimo que são dois argumentos."
        inputerror
end
tipo=arg.shift.gsub(/--/, '').downcase
if tipo!='avi' && tipo!='mp3'
        puts "Você escolheu um formato válido (MP3 ou AVI)."
        inputerror
end
 
ARGV.each do |v|
        host=Net::HTTP.new("www.youtube.com",80)
        resposta=host.get("/watch?v="+v)
        vars=resposta.body.scan(/video_id=.*&t=[^\"&]*/).uniq.to_s
        url="http://www.youtube.com/get_video?#{vars}"
        nome=resposta.body.scan(/<title>.*<\/title>/).uniq.to_s.gsub(/<\/?title>/, '').gsub(/YouTube - /, '').gsub(/'/, '\\\'')
        `wget -c -O '#{nome}.flv' '#{url}'`
        if tipo=="mp3"
                `ffmpeg -i '#{nome}.flv' -ar 44100 '#{nome}.wav'`
                `lame '#{nome}.wav' '#{nome}.mp3'`
        else
                `ffmpeg -i '#{nome}.flv' '#{nome}.avi'`
        end
        # Descomente a linha abaixo se você não gostar de lixo.
        # `rm '#{nome}.flv' '#{nome}.wav'`
end

Salve como "rytc" em /usr/bin ou alguma outra pasta do $PATH do seu sistema.

O código e o nome extenso do post dispensam explicações. Não se esqueça de baixar Ruby, ffmpeg e lame para o programa funcionar (no Ubuntu, sudo apt-get install ruby lame ffmpeg)

PS: Sou iniciante em Ruby, aceito qualquer contribuição de limpeza de código. Mas a não-orientação-a-objetos foi intencional, porque parecia que ficava muito código inútil sobrando.

PS2: Sim, eu sei que dá pra fazer a mesma coisa em Shell (aliás, não tem muita utilidade usar Ruby aí, porque no fim fico fazendo um monte de chamadas pra programas externos), mas o divertido de aprender uma linguagem nova é fazer essas coisas nela...

Technorati Tags: , , , , , , ,

Compare Preços de: notebooks, acer aspire, hp pavilion, computadores, pentium 4, nintendo wii, ps3, celulares, câmeras digitais

Um comentário...

28/11/2007

Organizando sua biblioteca de músicas no formato MP3 utilizando Ruby e taglib

Vamos fingir que você é um cara mau que ao invés de comprar CDs legalmente (como eu sempre faço e você também) baixa discografias completas na internet, como por exemplo a do Beatles. Ao terminar de baixar 3 GB com mais de 20 CDs você nota que os arquivos não estão corretamente taggeados e com isso você bagunçaria a organização perfeita do seu computador, do seu iPod ou de qualquer outro aparelho que você use pra ouvir música. O que fazer? Apelar para o Ruby com a Taglib, é claro! (Ubuntu: apt-get install libtagc0-ruby)

Vejam como é simples e adaptem para as suas necessidades:

require "taglib"
 
`ls BEATLES`.split("\n").each do |album|
        `ls "BEATLES/#{album}"`.split("\n").each do |filename|
                path="BEATLES/#{album}/#{filename}"
                if filename.match(/mp3$/) then
                        file=TagLib::File.new(path)
                        a=filename.split(" - ")
                        track=a[a.length-2].to_i
                        title=a[a.length-1].gsub(/\.mp3/, '')
                        file.track=track
                        file.genre="Pop/Rock"
                        file.artist="The Beatles"
                        file.album=album
                        file.title=title
                        file.save
                        file.close
                else
                        puts "Tem um lixo por aí... Delete '#{path}'!"
                end
        end
end

Technorati Tags: , , , , , , ,

Compare Preços de: notebooks, acer aspire, hp pavilion, computadores, pentium 4, nintendo wii, ps3, celulares, câmeras digitais

3 comentários

Assine via RSS

Assine gratuitamente o meu blog e receba todas as atualizações na hora, em seu agregador de feeds favorito.

Seja o 231º assinante

Busca no blog

Escreva palavras-chave para buscar e clique em Pesquisar.

Busca Google

Blogs de minha autoria

Publicidade

Dreamhost

Creative Commons - Some rights reserved tiagomadeira.net © Todo o conteúdo deste blog, exceto quando especificado o contrário, está licenciado sob uma Licença Creative Commons por Tiago Madeira. Os comentários são de responsabilidade de seus respectivos autores.