Arquivo da Categoria ‘Desenvolvimento’
FFmpeg: Batch para conversão de vídeos para iPhone [Windows]
Postado por: Rafael Biriba em Desenvolvimento, FFmpeg, Áudio e Vídeo em 19/03/2010
Já tem um tempo que estou tentando decidir o que fazer com um computador velho lá de casa. Resolvi instalar Windows nele, e fazer algumas experiências (:D)… de todo tipo, inclusive instalar servidor de games, VNC, Torrent, e tudo mais… Configurei meu roteador para deixar esse PC completamente exposto, assim posso brincar também com algumas regras de firewall e fazer o que quiser…
Como esse meu “PC cobaia” está ligado 24h lá em casa, resolvi não desperdiçar seu “poder de processamento” e fiz um script em Batch (.bat do windows) para converter vários filmes/vídeos que estou querendo colocar no meu iPhone.
Segue o “programa” de enconding para H264:
cd C:\Documents and Settings\Rafael\Desktop\ffmpeg-r16537-gpl-static-win32
for %%i in (”H:\videos\*.rmvb”) do
(
ffmpeg -i “%%i” -vcodec libx264 -acodec libfaac -deinterlace -sameq “C:\videos-iphone\%%~ni.mov”
)
Salve todo o código acima num arquivo .bat (Pelo bloco de notas mesmo !)
Você pode baixar o FFmpeg acessando: http://www.rafaelbiriba.com/ffmpeg-r16537-gpl-static-win32.zip
Leia também: http://www.rafaelbiriba.com/2009/02/13/windows-xp-vs-ffmpeg-e-mplayer.html
Bom, continuando…
O Script pega meus videos com extensão .rmvb de dentro da pasta H:\videos e salva os novos arquivos na pasta videos-iphone que fica na unidade C:\.
Note que o comando %%~ni faz com que o arquivo seja salvo com o mesmo nome do original, só que com a extensão .mov.
O profile de encoding para iphone (linha de comando do ffmpeg) que estou utilizando, deixa o video final com a qualidade quase que igual ao vídeo original, o que deixa a codificação bem lenta. Esse script que tem sido bastante útil pois tenho muitos arquivos de vídeo (muitos mesmo) e quero codifica-los um depois do outro automaticamente (enquanto a máquina não morrer de stress
).
Espero que essa informação seja útil para mais alguém… Provavelmente enquanto estou escrevendo este post, o script está rodando lá em casa
Abraços a todos
Cloud Crowd: A primeira action
Postado por: Rafael Biriba em Ruby em 08/02/2010
Cloud Crowd é um controlador de filas para processamento paralelo, desenvolvido em ruby. Pode ser utilizado em Encoding de video, migração de arquivos e bancos de dados, redimensionamento de imagens e etc…
Uma explicação rápida: Em uma máquina você levanta o server, onde é gerenciado a fila (criação, exclusão, status das tarefas e etc…). Em outras máquinas você levanta o node, onde as terefas serão recebidas e executadas. Ao terminar, o node informa ao server, liberando-se para receber outra tarefa.
Essa semana comecei a desvendar os benefícios do Cloud Crowd, principalmente para encoding paralelo de vídeo. Mas antes, tive que entender como ele funciona e o que tem para nos oferecer.
Então, acompanhando o “tutorial” em http://wiki.github.com/documentcloud/cloud-crowd/writing-an-action, escrevi uma pequena action:
class HelloWorld < CloudCrowd::Action def process Thin::Logging.log("HelloWorld :: -- criando arquivo #{input}!") `touch #{input}` 0 end end
Você passa um nome qualquer, e o script cria um arquivo em branco. Simples !?, Mas serviu bem para meus primeiros testes.
Também aproveitei e usei o log do Thin que é o servidor que o Cloud Crowd levanta, para registrar o evento de dentro da action… Isso significa que as mensagens de log da minha action foram registradas no arquivo de log do node que a executou… Se preferir você pode utilizar o Logger do Rails. Como foi apenas um experimento, utilizei o do Thin mesmo.
Cadastrando tarefas:
Para começar a utilizar sua action, você precisa postar um JSON com as informações necessárias no server, para cadastrar uma tarefa. (Não preciso lembrar que o server e algum node deve estar rodando, certo ?)
Para isso, crie um script ruby, ou rode pelo irb os comandos*:
require 'rubygems' require 'restclient' require 'json' RestClient.post('http://localhost:9173/jobs',{:job => { 'action' => 'hello_world' , 'inputs' => ['/home/rafael/arquivo_teste1', '/home/rafael/arquivo_teste2']}.to_json})
Considerando que o server está rodando na máquina que rodou o script. Caso contrário, altere o localhost pelo ip do Server. E os arquivos são criados (pelo comando “touch”) na máquina que roda o Node. Para fins de teste e desenvolvimento, é possível rodar o server e o node na mesma máquina, já que eles sobem em portas diferentes…
Então é isso… Você já pode paralelizar qualquer tarefa. Basta escrever suas próprias actions…
Feliz ano novo com javascript !
Postado por: Rafael Biriba em Desenvolvimento, Javascript, PHP em 24/12/2009
Primeiramente, gostaria de desejar a todos os leitores e amigos que acompanham meu blog:
Um feliz natal e um próspero ano novo !
Entrando nesse ritmo de natal e ano novo, desenvolvi um pequeno código em javascript para desejar feliz natal e ano novo para os leitores do meu blog.
O código está realmente simples, e pode ser alterado e utilizado aonde quiser… Só não esqueça de deixar sua opnião nos comentários abaixo!
O script funciona da seguinte maneira:
3 variáveis são definidas no inicio:
Data atual (var agora).
Data do ano novo (var anoNovo).
Data máxima de exibição (var anoNovoMax).
O alert com a mensagem será exibida enquanto a data atual estiver dentro do intervalo das outras 2 datas.
Abaixo segue o código:
<script language="JavaScript"> var agora = new Date(); var anoNovo = new Date(2010, 0, 1, 0, 0, 0, 0); var anoNovoMax = new Date(2010, 0, 1, 23, 59, 59, 0); if(agora >= anoNovo && agora<anoNovoMax) { alert("Feliz ano novo !"); } </script>
Para implementar no wordpress, é bem simples:
Adicione um Widget de texto em seu wordpress, e sem atribuir um titulo, insira o codigo javascript diretamente no campo de baixo “descrição”. Fazendo isso, o widget não ficará visível, mas o código vai funcionar…
Para implementar em seu site:
Basta inserir o javascript em sua página.
Dica:
Como o javascript pega a data da máquina do cliente, você corre o risco de pegar a data errada. Uma solução seria usar o PHP para definir a data, ou seja, seria a data atual seu servidor. Exemplo:
var agora = new Date(<?php echo date("Y, m, d, H, i, s"); ?>);
Então é isso… Façam bom proveito !
Aqui no blog, já está implementado as mensagens de Feliz Natal e Feliz Ano Novo… Serão exibidas durante todo o dia 25 e 01, respectivamente ! Visitem o Blog e confiram !
PHP: Arquivo de log personalizado
Postado por: Rafael Biriba em Desenvolvimento, PHP em 02/07/2009

PHP: http://www.php.net/
Semana passada, estive fazendo num pequeno site, uma área de login. Foi então que fiz uma funçãozinha no PHP que gera logs diários dos eventos ocorridos desde o login até o logoff, como por exemplo, ações tomadas pelos usuários na parte administrativa.
Abaixo, vocês poderão conferir o código que utilizei, logicamente adaptado para que fosse publicado aqui.
Os arquivos de log são gerados baseado no dia em que se encontra. Como os arquivos estão em formato .txt, utilizei um prefixo no arquivo, para que o acesso não seja tão óbvio por pessoas desautorizadas.
A função armazena no arquivo a hora da ocorrência, seguido pelo IP da máquina do cliente e a mensagem definida por você.
Vamos então seguir para o código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?php date_default_timezone_set('America/Sao_Paulo'); function Logger($msg){ $data = date("d-m-y"); $hora = date("H:i:s"); $ip = $_SERVER['REMOTE_ADDR']; //Nome do arquivo: $arquivo = "Logger_$data.txt"; //Texto a ser impresso no log: $texto = "[$hora][$ip]> $msg \n"; $manipular = fopen("$arquivo", "a+b"); fwrite($manipular, $texto); fclose($manipular); } ?> |
Salve o arquivo acima como logger.php
Na linha 3 estou declarando o timezone para São Paulo, mesmo estando no Rio de Janeiro, o horário é o mesmo. Isso serve para configurar a data para minha localidade, já que no meu caso, o servidor se encontra em outro fuso horário.
Nas linhas 7, 8 e 9 estou declarando as variáveis de data, hora e ip da máquina que gerou o log (cliente).
Na linha 12 está o nome do arquivo. Será algo do tipo Logger_19-06-2009.txt (dia-mês-ano). Caso deseje armazenar o log em uma pasta já existente, altere a linha para:
$arquivo = “minhapasta/Logger_$data.txt”;
Na linha 17 está a função de abertura do arquivo. Passando o “a+” como parâmetro, apenas nos dias que tiver alguma coisa para ser inserida no log, é que o arquivo será criado ou se já existir, escreverá o registro no fim do arquivo. O parâmetro “b” serve para questões de portabilidade ( inserção recomendado no manual do php )
As linhas 18 e 19 manipulam e fecham o arquivo definido na linha 12.
Agora vamos para o código onde vamos utilizar nossa função:
1 2 3 4 5 6 7 8 9 | <?php include "logger.php"; Logger("Testando a função logger !"); Logger("Como você pode ver, estou logando uma informação !"); Logger("Teste 1, Teste 2, Teste 3!"); ?> |
Salve o arquivo acima como teste.php na mesma página onde se encontra o logger.php.
Pronto. O Script acima gera 3 saídas consecutivas no seu arquivo de log.
Conferindo o resultado:
Nome do arquivo gerado:
Logger_19-06-09.txt
Conteúdo:
[21:57:36][201.7.xxx.xxx]> Testando a função logger !
[21:57:36][201.7.xxx.xxx]> Como você pode ver, estou logando uma informação !
[21:57:36][201.7.xxx.xxx]> Teste 1, Teste 2, Teste 3!
Bom, espero que o script sirva para mais alguém.
Ruby: Alternativas para require ‘rubygems’
Postado por: Rafael Biriba em Desenvolvimento, Ruby em 29/04/2009

Baseado no comentário de Guilherme Chapiewski encontrado em http://www.rafaelbiriba.com/2009/04/13/ruby-require-rubygems.html, resolvi postar alternativas para suprir essa necessidade do require ‘rubygems’ e porque é errado utilizá-lo !
Primeiramente, vamos para a pergunta que originou este post:
O que há de errado em utilizar require ‘rubygems’ no meu script ?
Bom, analisando o exemplo que eu dei no post do require rubygems, transcrito logo abaixo, onde se você quiser utilizar o pacote “hpricot”, instalado pelo comando gem install hpricot, o código não irá rodar, retornando um erro referente ao rubygems. Usando o require ‘rubygems’ o problema é resolvido, mas não está correto. O motivo é bem simples. Primeiro vamos ver o código em questão:
require 'hpricot' require 'open-uri' meuXml = Hpricot.XML(open("http://www.exemplo.com/exemplo.xml"))
Concordam comigo que o código acima, é uma simples aplicação em ruby ? O que eu quero dizer é que você pode instalar o hpricot de várias maneiras diferentes ! Por exemplo, acessando o link: http://wiki.github.com/why/hpricot/installing-hpricot, você pode observar que o Hpricot pode ser instalado sem o Rubygems. Sendo assim, ao usar o require “rubygems” em um máquina que não tem o rubygems instalado, vai dar problema na execução !
Então o que fazer se eu instalei o Hpricot pelo rubygems ? Simples…
Você pode facilmente rodar o seu script incluindo -rubygems na linha de comando, conforme o exemplo abaixo:
ruby -rubygems meu_script.rb
Isso fará rodar o pacote rubygems antes de executar sua aplicação meu_script.rb
Fonte: http://gist.github.com/54177
Ruby: require ‘rubygems’
Postado por: Rafael Biriba em Desenvolvimento, Ruby em 13/04/2009

Essa semana estive escrevendo alguns códigos usando Ruby on Rails, e encontrei um problema, que demorei um pouco para descobrir sua solução, mas no fim se tratava de algo muito simples e lógico.
Ao instalar o Rails e qualquer outro pacote pelo rubygems ( gem install hpricot, por exemplo), para importar esse pacote no código, é necessário importar a biblioteca do rubygems primeiro.
Manual do RubyGems ( http://docs.rubygems.org/read/book/1 ).
Na prática, eu estava utilizando o código abaixo:
require 'hpricot' require 'open-uri' meuXml = Hpricot.XML(open("http://www.exemplo.com/exemplo.xml"))
Este codigo abre uma URL, captura seu XML e armazena o conteúdo em uma variável ( string ).
Porém, isso só é possível se incluir a biblioteca do rubygems. Verifique o código abaixo, desta vez, funcionando:
require 'rubygems' require 'hpricot' require 'open-uri' meuXml = Hpricot.XML(open("http://www.exemplo.com/exemplo.xml"))
Bom, então é isso !
—————–
Baseado no comentário recebido depois da publicação deste Post, visite também:
http://www.rafaelbiriba.com/2009/04/29/ruby-require-rubygems-alternativas.html
Ruby: Aprenda a programar
Postado por: Rafael Biriba em Desenvolvimento, Ruby em 04/04/2009

Nas últimas semanas estive empenhado para aprender Ruby on Rails. Procurei aqui e ali na internet, juntei conteúdo de todas as partes e blogs, para aprender cada vez mais.
Para quem não sabe, Ruby on Rails é um framework para desenvolvimento Web, bem mais fácil de trabalhar comparando com outras linguagens Web.
Como diz no site do Rails, “Mostre, não fale: Ver é acreditar !”, visite o link abaixo e veja alguns exemplos de Rails na prática:
http://www.rubyonrails.pro.br/apresentacoes
Depois de vários dias, descobri um site ótimo para quem quer aprender a programar: ( Pena não ter encontrado ele antes )
http://aprendaaprogramar.rubyonrails.pro.br/
O site apresenta capitulos divididos em 11 links. A didática é ótima, e diz o autor que os exemplos encontrados no site são realmente “executados” , ou seja, o resultado do exemplo que você vê no site, realmente é executado. Isso é apenas um dos benefícios de usar o Ruby on Rails.
Eu recomendo tanto o site, quanto a linguagem para todos os programadores/desenvolvedores. Inclusive eu recomendo também para os futuros programadores. Quem tem pouco conhecimento na área, vai facilmente aprender a lógica de programação e a linguagem de maneira simplificada.
Em falar nisso, eu achei extremamente fácil de aprender e entender. Pra quem quer começar, visite o site abaixo para baixar a última distribuição do ruby:
http://www.ruby-lang.org/pt/downloads/
Ou então visite direto o site do Ruby on Rails, utilizem seus links para o download tanto do ruby quanto do rails*:
http://www.rubyonrails.pro.br/down
Neste mesmo link ainda exemplos de como criar sua primeira aplicação em Rails.
* Instalação do Rails e muitos outros pacotes, serão efetuadas pelo gerenciador RubyGems.
Bom, espero que se divirtam… =)
Chart API: Medidor em formato de velocímetro
Postado por: Rafael Biriba em Desenvolvimento, Google Chart API em 10/03/2009

Google Code: http://code.google.com/apis/chart/
Um gráfico em formato de velocímetro, pode ser usado para diversos fins, como indicar o uptime ou apresentar o espaço livre em disco e etc..
Abaixo segue a URL utilizada, e em seguida a explicação de cara parâmetro, para que você aprenda, configure e use conforme a sua necessidade !
No exemplo, utilizamos um gráfico de 0 a 200, onde o ponteiro vale 150 !
Lembrando que a URL deve ficar em uma só linha, abaixo ela está segmentada devido ao tamanho.
http://chart.apis.google.com/chart?
&chs=225×125
&cht=gom
&chd=t:150
&chds=0,200
&chl=Titulo 01
&chco=00ff00,ffff00,ff0000
&chxt=y
&chxl=0:|0|200
Recomendo que apenas os valores em negrito/colorido sejam editados para facilitar a exibição. Qualquer alteração nos outros parâmetros, recomendo ler a documentação em http://code.google.com/apis/chart/.
Clique aqui para acessar o link completo do gráfico.
&chs = Dimensões do gráfico, Comprimento X Altura. Deve ser alterado para ficar de acordo com o tamanho do gráfico a ser apresentado, senão alguns dados não serão corretamente exibidos na tela.
&cht = É o tipo de gráfico. Neste caso usamos o gom. Outras opções seriam: p3 = pizza, bvg = barras dentre outros…
&chd = Posição da seta. Em nosso exemplo deve estar diretamente associado ao valores do &chxl, no eixo Y. Observe que atribuimos o valor 150.
&chds = Valor mínimo e máximo para o eixo Y. Manteremos o valor inicial como zero e o maior valor sendo igual ou maior que o maior dado informado no &chd, para que o gráfico seja exibido corretamente.
&chl = É o título da seta. Também é possível deixar esse parâmetro em branco, para deixar a seta sem nenhum rótulo.
&chco = Cores do gráfico em hexadecimal, sendo o primeiro como cor inicial, o segundo como cor intermediária e o terceiro como cor final. Basta alterar conforme sua necessidade.
&chxt = Habilita o eixo y.
&chxl = Nome dos pontos nos eixos. 0:| corresponde aos titulos do eixo Y. Não há limite para que seja adicionado dados no eixo Y, porém o primeiro e o ultimo valor do eixo Y, deve ser o mesmo que o informado no parametro &chds, para que seja exibido corretamente no gráfico.
Acho que isso já é um grande inicio para construir um gráfico em formato de velocímetro.
=)
Chart API: Gráfico de visitantes do dia
Postado por: Rafael Biriba em Desenvolvimento, Google Chart API em 06/03/2009

Google Code: http://code.google.com/apis/chart/
O gráfico abaixo, pode ser utilizado, não somente para visitantes do dia, mas pode ser adaptado para uma utilidade de sua preferência !
Abaixo segue a URL, utilizada para exibir esse gráfico, e logo depois as explicações de como personaliza-lo ! Lembrando que a URL deve ficar em uma só linha, abaixo ela está segmentada devido ao tamanho.
http://chart.apis.google.com/chart?
&cht=lc
&chco=ff0000
&chs=300×200
&chd=t:55,20,50,50,60,45,47,175,200
&chds=0,200
&chtt=Visitantes+do+Dia - 03/04/08
&chm=o,000000,0,-1,5.0
&chxt=x,y
&chxl=0:|00:00|03:00|06:00|09:00|12:00|15:00|18:00|21:00|24:00|1:|0||50||100||150||200
Recomendo que apenas os valores em negrito/colorido sejam editados para facilitar a exibição. Qualquer alteração nos outros parâmetros, recomendo ler a documentação em http://code.google.com/apis/chart/.
Clique aqui para acessar o link completo do gráfico.
&cht = É o tipo de gráfico. Neste caso usamos o lc. Outras opções seriam: p3 = pizza, bvg = barras dentre outros…
&chco = Cor da linha. FF0000 é vermelho em hexadecimal. Basta alterar conforme sua necessidade.
&chs = Dimensões do gráfico, Comprimento X Altura. Deve ser alterado para ficar de acordo com o tamanho do gráfico a ser apresentado, senão alguns dados não serão corretamente exibidos na tela.
&chd = Dados do gráfico. Em nosso exemplo deve estar diretamente associado ao valores do &chxl, no eixo Y.
&chds = Valor mínimo e máximo para o eixo Y, que no exemplo correponde ao número de visitas. O correto, é manter o valor inicial como zero, já que não temos visitas negativas, e o maior valor sendo igual ou maior que o maior dado informado no &chd, para que o gráfico seja exibido corretamente.
&chtt = Titulo do gráfico. Pode ser uma frase separada por ‘+’, ou simplesmente por espaços.
&chm = Responsável por criar as bolas em cada ponto. o segundo valor ‘000000‘, corresponde ao preto em hexadecimal, e 5.0 é o tamanho da bola. Ambos podem ser alterados.
&chxt = Habilita o eixo x e y. No manual, é possível ver que podemos mais eixos, passando por este parametro.
&chxl = Nome dos pontos nos eixos. 0:| correponde aos titulos no eixo X. Para que o gráfico seja exibido corretamente, a quantidade de dados informados &chd deve ser igual a quantidade de títulos no eixo X. Reparem que ambos tem 9 entradas.
1:| corresponde aos titulos do eixo Y. Não há limite para que seja adicionado dados no eixo Y, porém o primeiro e o ultimo valor do eixo Y, deve ser o mesmo que o informado no parametro &chds.
Com isso, é possível construir esse e muitos outros gráficos, e trabalhando em um pequeno script, é possível que o gráfico seja exibido sempre atualizado. Cabe a você definir a sua necessidade.
=)




