Olá, eu sou o Jônatas e este é meu site pessoal. Através dele você pode acompanhar meus pensamentos sobre desenvolvimento de software/humano. Sou desenvolvedor desde 2004 e os conteúdos aqui descritos contam a respeito da minha vida/experiências trabalhando como programador e freelancer. Em 2007 conheci o Ruby e o Rails e sou muito apaixonado pelo meu trabalho.

Atualmente sou sócio da invent.to e também desenvolvo para algumas empresas de tecnologia como freelancer.

ps: Sinta-se livre para conversar comigo por email ou gtalk: jonatasdp@gmail.com.

Coisas legais para fazer com o Raspberry PI

Viva o opensource! Estou fazendo uma série de testes e experimentos com o Raspberry PI e hoje resolvi compartilhar algumas delas aqui.

Diferente do Beaglebone, o Raspberry já tem um caminho mais longo e logo com muito mais projetos.

Timelapse

Para fazer um timelapse com a câmera oficial é simples, já mostrei em outro post.

Stream da câmera

Existem várias formas de fazer o stream da câmera. Eu usei mjpg-streamer e obtive sucesso. O único detalhe é que o stream só funcionou bem na velocidade e resolução default que ambas são de baixa qualidade.

Instalar o Berrycam ou outros clientes mobile

Esse aplicativo é muito elegante e simples e permite tirar fotos usando a raspicam através do iOS com todas as configurações e ajustes da câmera através de uma interface amigável. Parece ser uma solução interessante para ajustar os parâmetros da câmera. Testei e funcionou uma pena que não tem preview da câmera, apenas depois de tirar a foto.

Também tem o RaspiCam Remote para Android mas acabei não testando.

Central multimídia

Existem vários hardwares oferecendo central de mídia. Eu mesmo tenho um apple TV para isso.

Existe um sistema operacional específico para rodar o XBMC Media Center como central de mídia por padrão.

Gostei deste aplicativo pois oferece suporte para todos os sistemas operacionais manipular remotamente.

Um console de video-game

Existem vários projetos legais. Veja aqui alguns deles. O que mais gostei foi o Picade.



Bone Debian rodando no BeagleBone Black

Após alguns dias me adaptando ao Angstrom, aqui estou eu tentando instalar o Debian no meu Beaglebone.

Comprei a alguns dias e o Angstrom está com um problema relacionado ao Hot Plugging e não consigo acessar todas as vezes que ligo ele via usb.

Desta forma, tive que comprar um cabo TTL Serial para assistir o boot do sistema via porta serial. Via screen funcionou perfeito e então identifiquei algumas mensagens de erro no beaglebone. Agora minha expectativa de instalar o Bone Debian é poder voltar a usar normalmente apenas via USB sem ter o inconveniente de usar o cabo TTL ou ter que manter conectado no cabo de rede.

Conferindo o nome do disco sdcard

No mac utilizei o aplicativo diskutil para descobrir qual era o meu sdcard.

➜ diskutil list
/dev/disk0
#:                       TYPE NAME                    SIZE       IDENTIFIER
0:      GUID_partition_scheme                        *500.1 GB   disk0
1:                        EFI EFI                     209.7 MB   disk0s1
2:                  Apple_HFS Macintosh HD            499.2 GB   disk0s2
3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1
#:                       TYPE NAME                    SIZE       IDENTIFIER
0:     FDisk_partition_scheme                        *7.8 GB     disk1
1:                 DOS_FAT_32 BONE DEBIAN             7.8 GB     disk1s1

Formatar o sdcard

Utilizei o próprio aplicativo “Utilitário de disco” que vem instalado no Mac para formatar o disco. Utilizei a extensão MSDOS-FAT convencional.

Instalar imagem no cartão

Para instalar o nova imagem do sistema eu usei um sdcard de 8GB.

No meu macbook eu baixei a imagem com extensão .img.xz então tive que utilizar um programa chamado xz para descompactar a imagem:

brew install xz

Depois disso descompactei a imagem no disco:

xz -dkv bone-debian-7.4-2014-03-27-2gb.img.xz 

E após isso usei o aplicativo dd para escrever a imagem no sdcard.

➜ sudo dd bs=1m if=./bone-debian-7.4-2014-03-27-2gb.img of=/dev/disk1

Se você receber uma mensagem como esta:

dd: /dev/disk1: Resource busy

Então é melhor desmontar o disco antes de executar o comando dd.

sudo umountDisk /dev/disk1

Após terminar de escrever a imagem de 1,7 GB você deve ver uma mensagem assim:

1700+0 records in
1700+0 records out
1782579200 bytes transferred in 1476.053213 secs (1207666 bytes/sec)

Aqui demorou aproximadamente 24 minutos e depende da velocidade do sdcard e do tamanho da imagem para efetuar a gravação.

Neste momento você pode ejetar o sdcard e remover o sdcard com segurança para colocar no Beaglebone.

Ao reiniciar o beaglebone black e reconectar observei o boot via TTL:

Debian GNU/Linux 7 beaglebone ttyO0

default username:password is [debian:temppwd]

Support/FAQ: http://elinux.org/Beagleboard:BeagleBoneBlack_Debian

The IP Address for usb0 is: 192.168.7.2

Fazendo o login via ssh:

➜  ~  ssh debian@192.168.7.2 
The authenticity of host '192.168.7.2 (192.168.7.2)' can't be established.
RSA key fingerprint is 20:8e:11:cb:98:2b:b1:f1:56:ec:3c:1a:2a:d4:e8:e5.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.7.2' (RSA) to the list of known hosts.
Debian GNU/Linux 7

BeagleBoard.org BeagleBone Debian Image 2014-03-27

Support/FAQ: http://elinux.org/Beagleboard:BeagleBoneBlack_Debian
debian@192.168.7.2's password: 
debian@beaglebone:~$ ls
sudo bin
debian@beaglebone:~$ sudo su

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.

[sudo] password for debian:
root@beaglebone:/home/debian#

Gostei das lições do administrador :)



Como gerar um vídeo de fotos sequênciais

Estive gerando uma série de vídeos com fotos sequências estilo timelapse e existem muitas formas de fazer isso. Aqui estou usando o bom e velho ffmpeg.

Coloquei todas as fotos em um diretório e digitei:

ffmpeg -r 24 -i img%04d.jpg -c:v libx264 timelapse.mp4

Onde:

  • -r é o frame rate, neste caso 24 fotos por segundo

  • -i é o padrão de entrada (input) de imagens. Neste caso img001.jpg, img002.jpg e assim por diante.

  • libx264 refere-se ao padrão de encoding do vídeo. Parece ser o padrão do Facebook, Youtube, Vimeo e outros..

    Apesar do ffmpeg ser muito interessante, existe um fork dele que se chama avconv e é o projeto que está sendo continuado e é o novo manipulador de vídeos/imagens padrão para linux. Não estou usando neste caso mas se você estiver fazendo algo do gênero vale a pena dar uma olhada.

Renomeando imagens

O ffmpeg não consegue entender a ordem se as imagens não tiverem um número de casas fixo, por exemplo:

img1.jpg, img2.jpg,..., img10.jpg, img11.jpg

Neste caso, é necessário converter o nome das imagens para utilizar casa fixas como img001.jpg, img002.jpg.

Para renomear as imagens necessárias, eu fiz um script ruby para gerar os nomes corretamente e depois executei o comando com | sh pegando o puts diretamenten do $stdout.

ruby -e "Dir['*.jpg'].each{|f|f =~ /img_(\d+).jpg/; g = \"img_#{'%04d' % \$1.to_i}.jpg\"; puts \"mv #{f} #{g}\" if f != g}" | sh

Este é o tipo de comando rápido que as vezes não tenho tanta agilidade e prática com shell para fazer o rename. Mas com ruby flui rapidamente e consigo avançar.

Refactoring

Os nomes das variáveis não são os melhores então está um pouco estranho de entender. Abrindo o código acima temos:

 Dir['*.jpg'].each do |image|
   if image =~ /img\_(\d+).jpg/
     new_image_name = "img_#{'%04d' % \$1.to_i}.jpg"
     if new_image_name != image
       puts "mv #{image} #{new_image_name}" 
     end
   end
end

Executando ruby e fazendo o pipeline para o shell temos o mesmo resultado de uma forma mais bonita:

ruby converte.rb | sh

Imagens com nomes diferentes

Se as suas imagens não tiverem um padrão de nomes também é possível utilizando o parâmetro pattern_type glob, veja o exemplo:

ffmpeg -r 24 -pattern_type glob -i "*.jpg" out.mkv

Veja um exemplo de vídeo

O vídeo abaixo é um timelapse de 120 fotos, uma foto a cada 64 segundos. Girando 1 grau para a direita. O framerate utilizado foi 24 fotos por segundo.