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 ano: 2007

29/11/2007

eruby.cgi não funciona na Dreamhost?

Eu fiz absolutamente tudo que a wiki sugeria, mas não obtive sucesso tentando rodar o eruby no tiagomadeira.com (futuro site, que espero que seja em Ruby - e não quero Rails - pra separar um pouco currículo/portifólio e blog)

O log diz que o Internal server error é simplesmente um:

Premature end of script headers: eruby.cgi

Encontrei esse erro na documentação do Apache como sendo porque o Eruby não mandou corretamente os headers. Será que há alguma forma de contornar isso? O suporte da Dreamhost não soube me informar, disse que quem escreveu na wiki foi outro usuário e sugeriu que eu testasse o ERB.

Eu queria o Eruby porque o "Why eruby.cgi?" do eruby.info me convenceu:

Of the choices the eruby CGI is the fast and most independant implementation of eRuby. Though erubis is slightly faster it does not use plain text files but sends the eRuby file to a .rb file for processing. ERB is three times slower than eruby.cgi. The eruby.cgi is by far the best alternative for those that want to get the power of Ruby but use it as simply as they would PHP or ASP scripting. By far the easiest method of running Ruby code on a web page.

Agora, resignado, a não ser que venha uma luz, vou ter que tentar o ERB mesmo...

Technorati Tags: , , , ,

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

Um comentário...

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: iPod, home theater, plasma, lcd, câmeras digitais, games, ps3

Um comentário...

Assine via RSS

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

Seja o 236º 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.