Novo Blog

Novo endereço

https://blog.nilo.pro.br

Mostrando postagens com marcador linux. Mostrar todas as postagens
Mostrando postagens com marcador linux. Mostrar todas as postagens

sexta-feira, 3 de agosto de 2012

Python Computer e Raspberry Pi

Preparação

Segunda (30/07/12), recebi meu primeiro Raspberry Pi, comprado na Element 14. Depois de um mês de espera, recebo na caixa do correio, mas um tanto tarde na Bélgica… 21h. Na verdade, chegou perto do meio dia, mas como não estava em casa, o carteiro deixou como carta normal mesmo.
P1060883
A caixa é bem pequena, como um cartão de crédito. Na realidade, eu encontrei o computador no meio de outras cartas Open-mouthed smile!
O problema é que não tinha nenhuma loja aberta para comprar um cabo ou outro, caso precisasse. O jeito era improvisar.
Eu sabia que ia precisar de um Hub USB com alimentação, pois a USB do Pi não fornece muita energia. Sabendo que o computador estava para chegar, eu comprei um Hub USB de 4 portas, ainda no sábado, aproveitando a visita ao supermercado:
P1060882
E também cartas SD:
P1060878
Pois o Pi só dá boot pela carta SD. Comprei uma carta de 4GB e outra de 8GB, pois uma era classe 4 e a outra classe 10. Aparentemente o Pi tem problemas com cartas classe 10, mas a minha funcionou perfeitamente, mas sem ganho de performance notável.
Antes mesmo de conectar o computador, é preciso baixar o Linux e gravá-lo na carta SD. Instruções detalhadas em inglês são encontradas aqui. Se você usa Windows, precisa baixar o Win32DiskImage. Ele não tem setup, é só descompactar e executar direto. Você precisa ser administrador do computador para gravar a imagem. Eu utilizei o Raspbian, mas outras distribuições também estão disponíveis. A imagem do Raspbian tem uns 450MB e ao descompactá-la você terá o arquivo .img, necessário para o Win32DiskImage.
Gravar a imagem é bem fácil. Introduza o cartão SD no leitor do computador. Normalmente o Windows se oferece para abri-lo. Aproveite a chance para verificar se este está vazio, pois a gravação da imagem vai apagar todo o conteúdo do cartão. Com o Win32DiskImage aberto, selecione o arquivo .img com o Raspbian e ao lado verifique se o drive com a carta SD está correto. Se você tem mais de uma carta SD ou caso apareça mais de uma opção, verifique o que está fazendo, evitando assim perder seus dados. Clique no botão Write e espere a gravação ser finalizada.
Com a carta SD pronta, resta a conexão do Raspberry Pi.
P1060886
Como já estava tarde, montei uma mesa de trabalho no chão da sala, usando uma caixa de monitor e uma folha A4 para dar noção do tamanhão do Raspberry Pi. Sem medir muito, eu chuto que numa folha A4 caberiam 9 Raspberry Pis!
Esta placa contém um SoC (System on a Chip) fabricado pela Broadcom, no caso do modelo B, um BCM2835 com:
  • Processador ARM1176JZF-S (armv6k) rodando a 700 MHz
  • 256 MB de Ram
  • 2 portas USB 2.0
  • 1 porta Ethernet
  • GPU Broadcom VideoCore IV
  • Leitor de carta SD
  • Saída de vídeo HDMI
  • Saída de vídeo composto (conector RCA)
  • Saída de áudio padrão, 3.5 mm
  • Conector de entrada e saída genérico com GPIO/UART/I2C e SPI
  • Dimensões: 85.60 x 53.98 mm
  • Peso: 45g
Um verdadeiro micro sem ventilador e de baixo custo (35€ com frete).
Para conectá-lo à minha TV, emprestei o cabo do vídeo game Open-mouthed smile. Mouse e teclado eu peguei os que uso com meu notebook. Duro foi achar o cabo com o conector Micro B USB. Eu consegui um carregador de celular:
P1060884
Ficou assim:
P1060889
É preciso ter cuidado ao conectar e desconectar o Raspberry Pi. Como a placa não tem gabinete, todas as precauções contra eletricidade estática devem ser tomadas. Não se pode esquecer também de não forçar os conectores e principalmente que o Pi não tem On/Off: ligou a força ele já está ON e dando o boot!
P1060887
Até aqui tudo certo. Mas ao tentar usar o teclado, este não respondia e o Pi chegou a travar. Lembrei então que ele precisa de pelo menos 700mA para funcionar. Checando o carregador de celular que encontrei, vi que ele só fornecia 300 mA. Ele foi então substituído por um cabo USB normal ligado ao carregador de um iPhone. Depois, eu eliminei o carregador e liguei tudo no Hub alimentado. Com a fonte certa, tudo passou a funcionar corretamente.
Ao dar o boot, ou executando sudo raspi-config, você tem a tela do utilitário de configuração simplificada abaixo:
raspconfig
Como meu cartão era de 4 GB, a primeira coisa que fiz foi selecionar expand_rootfs. Esta opção aumenta o disco criado pela restauração da imagem para utilizar todo o cartão. Depois, eu configurei o teclado (configure_keyboard), troquei a senha do usuário pi (change_pass) e o fuso horário (change_timezone). Para sair é só selecionar Finish e dar boot.
O Pi não tem relógio permanente, ele usa um servidor de tempo para ajustar o relógio durante o boot. Configurar o fuso horário é importante por isso.
Esqueci de falar do acesso à Internet. Eu apenas liguei um cabo Ethernet que estava sobrando e o Pi pega um IP usando DHCP. O acesso fica muito fácil e no próximo boot ele já sincroniza o horário, pega um IP e você fica pronto para usar a Internet ou sua rede local. Eu não tenho um cartão WiFi USB, mas se for o caso, na wiki do Raspbery Pi tem a lista dos WiFi compatíveis.
Meu teste era plugar um leitor de DVD externo (USB) e assistir um vídeo antes de dormir. Instalei o VLC, usando o apt-get, mas não consegui ver vídeo algum. Tentei também com arquivos AVI, sem sucesso. Acho que nestes casos o melhor é tentar a OpenElec com o XBMC.
Entrei no X, digitando startx. Baixei o Invasores e funcionou de primeira, com som na TV!
P1060893
Fiquei surpreso ao constatar que o PyGame já vinha instalado. Mesmo um jogo simples como o Invasores teve algumas paradas. Tentei então os jogos pré-instalados e observei o mesmo problema. O X é pesado demais para o Pi.
O Browser é muito simples e não suporta HTML5, muito menos flash. Além disso… quando digo muito lento, não estou exagerando. Lembra os primeiros anos de Windows… mas roda. Instalei o Chromium, versão open source do Google Chrome, mas também é muito lento e pesado. Não podemos esquecer que um browser moderno consome muita memória e que rodar JavaScript exige um processador bom. Nem memória, nem processador sobram no Raspberry Pi para este tipo de coisa. Os drivers ainda estão sendo desenvolvidos e quase tudo roda sem otimização/aceleração da GPU. Novas versões devem melhorar esta situação.

Python Computer

Meu objetivo ao comprar o Raspberry Pi era de configurar um Linux para funcionar como estação de ensino de Python. Como o Pi de Raspberry Pi vem de Python… apareceu a oportunidade. Eu chamei meu projetinho de Python Computer. A ideia era configurar o Linux como um computador de 8 bits que ligava e caia no interpretador Basic. No caso, eu queria um Linux que ligasse e entrasse no interpretador Python. Eu já havia feito um teste usando SilverLight para executar o Python Computer em um browser. Porém, esta solução dependeria de acesso a Internet, versão do browser, plug ins, etc. Ter tudo num pequeno computador me parece mais interessante.
Para isso, o X não é realmente necessário. No Linux, a PyGame pode rodar no framebuffer. Esta configuração me pareceu mais realista que um ambiente gráfico completo no Raspberry Pi.
A primeira coisa que fiz foi mudar o tamanho da fonte de texto, pois a padrão é muito pequena para se ler na TV.
Isso pode ser feito editando o arquivo /etc/default/console-setup como root:

sudo vim /etc/default/console-setup

Na linha que contém FONTFACE escreva:

FONTFACE=”TERMINUS”

e na com FONTSIZE:

FONTSIZE=”16x32”

Salve o arquivo.

Para configurar o vim, crie o arquivo ~python/.vimrc com as seguintes linhas:


syntax on
set ts=4
set expandtab
set shiftwidth=4
set softtabstop=4
set smartindent
set number
set cindent
set nowrap
set go=+b

autocmd BufRead *.py set makeprg=python\ -c\ \"import\ py_compile,sys;\ sys.stderr=sys.stdout;\ py_compile.compile(r'%')\"
autocmd BufRead *.py set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%m
autocmd BufRead *.py nmap <F5> :!python %<CR>



Agora crie o usuário python:

sudo useradd –m –s /usr/bin/ipython python

E edite o inittab:

sudo vim /etc/inittab

Modifique a linha do terminal 6, no meu inittab a linha 59. De:

6:23:respawn:/sbin/getty 38400 tty6

para:

6:23:respawn:/sbin/getty 38400 tty6 –a python

Isto fará que com que o ipython seja aberto no terminal 6 durante o boot, sem precisar de login. Faça o boot e digite ALT+F6
ipythonboot
Se quiser apagar estas mensagens do login, edite o arquivo /etc/motd.
Para editar um arquivo sem sair do ipython, digite: edit nomedoarquivo.py
vim_inv
Se o arquivo não existir ele será criado. Ao voltar sair do editor, ele volta para o ipython e executa o arquivo.
O vim não é o editor mais boa pinta do pedaço, mas em modo texto não conheço outro melhor. Para quem estiver saudades dos programas da Borland, instale o joe:

sudo apt-get install joe

e no /etc/profile, adicione:

export EDITOR=/usr/bin/joe

O joe é mais amigável e usa os comandos do Wordstar/Sidekick… e ambientes Turbo da Borland.
Para rodar jogos escritos com a PyGame, modifique a linha que escolhe a quantidade (profundidade) de cores para que 16 bit colors seja escolhido.
No invasores, edite o arquivo video.py, modifique o método modo da classe Video:

self.tela = pygame.display.set_mode(dimensao, 0, 16)

Depois, é só rodar o Invasores no framebufer!
jogo2
jogo
Mesmo alterando a partição da RAM entre a CPU e a GPU para o máximo, ou seja, 128 MB/128 MB, não consegui rodar em resoluções maiores que 1024x768. Lembrando que no X o Invasores roda normalmente.
Se você gosta de usar o modo texto, não deixe de dar uma olhada no screen. Como a tela é larga, eu a dividi em duas partes. Fica muito legal usar metade para rodar algo e a outra para ler a documentação ou editar os fontes.
Uma dica para ligar e desligar o Pi é utilizar uma régua com interruptor:
P1070022
Quanto a Internet, como o Pi fica ao lado do meu notebook, configurei o compartilhamento de Internet do Windows 7 e funcionou direitinho. Desta forma, eu uso o WiFi do notebook para dar acesso ao Pi. Outra vantagem é que posso usar o WinSCP para copiar arquivos entre o notebook e o Pi e mesmo fazer sessões com SSH. Fica a foto da mesa de guerra:
P1070032

Custo

Item
Preço
Raspberry Pi
35€
Hub USB 4 portas
12€
Carta SD 4 GB
5€
Teclado
10€
Mouse
12€
Cabo HDMI
6€
Monitor
150€
Total
230€

Como eu já tinha o monitor, teclado e mouse, não saiu tão caro. Nesta lista ainda falta adicionar 12€ para uma caixinha e mais 6€ para uma fonte com cabo Micro B USB que ainda não chegaram. O hub é opcional se você ligar apenas o teclado e o mouse.

Conclusão

O Pi é muito legal, mas é um brinquedo para desenvolvedores que gostem muito de Linux. Com o tempo, os drivers ficarão mais maduros e a performance deve melhorar. Eu acredito que logo teremos um browser com suporte a HTML5 e um XBMC mais redondo. Por enquanto, usar Python no console já chamou a atenção das crianças aqui de casa, como um modo especial de programação e criação de jogos. O fato de ver um computador aberto com as luzes piscando também chamou a atenção. Outra vantagem do Pi é que não roda Facebook, Twitter ou YouTube. Para  o ensino, gostaria de medir a diferença entre usar um ambiente como o Pi em relação a interfaces ricas como o Windows.

sábado, 24 de outubro de 2009

Aventuras com FSCK

Back-ups sempre vão bem... essa semana acabei perdendo 2 HDs. Um no PC, consegui retirar todos os dados e transferir para um servidor remoto. O outro, meu Ubuntu, Tambaqui de guerra.

Cheguei de manhã ao trabalho e vi que computador estava desligado. Como o Tambaqui é um pequeno servidor também, eu já o deixo ligado. Liguei o peixe e o boot ocorreu normalmente (eu sempre digo que só dá problema o que antes estava funcionando perfeitamente :-), senão ninguém viria com aquela desculpa-esfarrapada-padrão-de-quem-não-tem-backup: ontem estava bonzinho!).Olhando os arquivos depois do boot, vi que haviam vários arquivos com nomes estranhos com ??? e !!!!... sinal de problemas no sistema de arquivos, mas o fsck jurava que estava tudo bem :-)

Rodei então o init 1 para inicializar em usuário único. E lá rodei o fsck no menu do Ubuntu... que detectou vários problemas. Terminada a análise, fiz o boot e para minha surpresa o disco estava vazio !

Como já havia perdido um HD no dia anterior, disse: de novo! :-( Vi que a raiz tinha ido pro saco. Eu precisava apenas de dois diretórios com meus dados, prática que sigo já há alguns anos. Bom, dei uma olhada rápida no disco e constatei que estava mesmo vazio. Eu só consegui dar o boot com o CD do Ubuntu, mas não tive problemas em montar a tal partição. Começei a me preparar para reinstalar o Ubuntu quando vi que a partição não estava vazia.

Eu nunca acreditei muito no lost+found. Toda vez que tive problemas no Linux, encontrei apenas pedaços dos meus arquivos dentro do lost+found. Mas desta vez a coisa estava diferente. Entre estes pedaços estavam diretórios com nomes como #xxxxxx, milhares deles. Logo descobri aonde meus arquivos haviam ido parar.

Iniciei então o seguinte procedimento para procurar meus arquivos:
ls -laR lost+found > bigls.txt

O fsck havia recortado meus diretórios e deixado tudo em um só nível! A opção de gerar o arquivo bigls.txt era de justamente poder procurar com calma tudo que eu poderia salvar. O arquivo final tinha mais de 40MB ! Mas isso não é nada para o less. Utilizando a / para pesquisar, pude navegar no pequeno ls monstro que havia criado e logo detectar o que precisava ser salvo.

Depois, ficou fácil de mover os diretórios mais importantes para um disco de rede. O nome do arquivo eu pegava no bigls.txt, aberto em outra janela com o less. Simples e prático. Ainda estou recuperando as instalações que havia feito na máquina, pois não consegui quase nada do meu /etc (tomcat com ldap é chato).

Nessa nova instalação vou deixar um rsync rodando para o disco de rede... pelo menos dos dados e do /etc :-)

Quanto ao outro disco, rodando Windows XP... no meu velho notebook (2HDs perdidos em 2 meses e contando !)... também consegui montar o disco que nem boot mais tinha usando também o CD do Ubuntu. Ficou tudo muito simples porque o Ubuntu já identifica o disco Windows e é ultra fácil montá-lo, bastando clicar no volume correspondente no menu. Eu gosto muito de usar a linha de comando, mas confesso que gostei desta vez de utilizar as ferramentas gráficas no Ubuntu. Abri dois navegadores, um com a partição Windows e outro com um disco remoto usando Samba. A cópia foi tranqüila, bastando arrastar e soltar! Quem diria um dia fazer isso no Linux :-)

Um programa que ajuda a ver os problemas de boot no Windows é o testdisk. Ele detecta as partições e ajuda a reconstruir o setor de boot entre outras coisas. Pena que ele não está disponível pelo apt-get do Ubuntu 9.04. Mas no link acima tem uma opção para download. Basta baixar e desempacotar a versão binária. Um executável pronto (linkado estaticamente) já está pronto para ser utilizado.

Outro programa para o cinto de utilidades é o SmartMonTools. Ele acessa as informações do S.M.A.R.T. do seu HD e ajuda a decidir o que aconteceu. Claro que é melhor usar essa ferramenta antes de ter problemas, mas meu Windows XP resolveu morrer sem último suspiro. Cheguei de manhã e ele já estava morto, mas sem perda de dados. Nunca se sabe se é um problema de vírus ou simplesmente um defeito no HD que você não havia percebido. Esses utilitários ajudam a executar os testes mesmo post mortem. Claro, dependendo do estado do seu HD, porque se ele nem liga ou nem mesmo é detectado... esqueça.

sexta-feira, 26 de dezembro de 2008

Mouse morto no Ubuntu

Esse é para registrar e poupar o Google :-)

Quando instalei o Linux na minha máquina de casa, o primeiro problema que tive foi o mouse parar de funcionar de tempos em tempos. Embora o resto do computador continuasse funcionando, o X morria. Depois de muito navegar e pesquisar, descobri ser um problema no chipset nvidia 4, que a minha placa mãe utiliza. Ainda que plausível, este problema não causa qualquer problema no Windows XP. Isso me levou a vergonhosa tarefa de explicar às crianças que o Linux travava. Minha filha do meio perguntou porque usávamos o Linux, já que Windows XP não travava !

Com o Ubuntu 8.10, renovei minhas esperanças, mas o bug continua lá. O problema congela o mouse e depois o teclado, se este estiver ligado a porta USB. Comprei um teclado PS/2 (argh!) e tentei comprar um mouse também PS/2, mas para o outro micro :-) Descobri que o adaptador não funcionava e acabei usando como USB mesmo. Restou então utilizar bruxaria:

Script: ressuscita-mouse.sh
#!/bin/sh
modprobe -r usbhci
modprobe usbhci

Usando o xbindkeys e o xbindkeys-conf (ambos podem ser instalados usando apt-get), configurei ALT+M para executar o script acima. Como precisa ter poderes de root para executar o modprobe, criei o atalho usando o gksudo ressussita-mouse.sh
Funciona bem se você ainda tiver teclado :-) Como liguei meu teclado a porta PS/2, ele não é mais afetado pelo problema. Se seu teclado for USB, a solução é fazer um ssh para máquina e executar o script na mão.

Claro que eu reportei esse bug há bastante tempo, mas acho que o pessoal não liga muito para ele, ou ele é realmente difícil de resolver: Link pro bug. De qualquer forma, fica o registro dessa solução quebra-galho aqui.

sábado, 27 de outubro de 2007

One Laptop per Child

Leia no novo blog

Eu me tornei professor por acidente. No colégio, como era bom em matemática, sempre ensinava alguém... depois a coisa foi ficando mais séria. Comecei a ensinar matemática particular ainda no primeiro grau... aos 18 anos eu já era instrutor de cursos de programação. Acho que no primeiro curso eu ensinei Clipper :-)

Em 1994, virei professor de lógica e técnica de programação e também de linguagens de programação I e II. Professor de algoritmos, Cobol e C. Desde então passei a me interessar seriamente por educação e a me impressionar com a velocidade que as pessoas aprendem. Confesso que ensinar a programar não é fácil, aprender também não. Com um pouco de prática se melhora, mas nunca fiquei contente... continuo procurando novas formas de ensinar programação. Nos últimos anos, eu ensinei Python. Uma linguagem que gosto muito e uso no meu dia a dia.

Esta semana também caí por acidente na página do projeto One Laptop per Child. Eu já escutei muito sobre este projeto e resolvi ler um pouco mais. A comunidade técnica sempre reclama que não se pode fazer quase nada com o tal notebook entre outras coisas. Eles procuram desenvolvedores para a plataforma, que é Linux, mas rodando em uma máquina muito enxuta para os padrões de hoje. Não resisti, baixei a imagem e fiquei testando. Lembrei dos dias negros do Linux ao tentar configurar o teclado belga no X. Fazia tempo que não tinha tanto trabalho para configurar uma coisa tão besta. Depois de ignorar o texto da Wiki do projeto e de rodar o Qemu corretamente, a imagem funcionou com rede, mas ainda sem som. Bem, o som ainda não está funcionando, mas eu não conseguia mais esperar para testar o Invasores no OLPC, ou na imagem dele. E não é que funcionou sem alterar uma só linha!

Mais um ponto para o Python. Também, o OLPC é baseado no Fedora, mas usa uma interface gráfica diferente, o Sugar. Ainda estou resolvendo alguns problemas com o tamanho da tela do jogo, mas mesmo não rodando em tela cheia, o jogo funciona sem problema algum. Eu vou fazer um release só para o OLPC em breve.

Voltando ao OLPC, eles precisam de kits de programação, incluindo a criação de jogos simples. Como os fontes do Invasores são em português, tomara que ajude alguém a entender como fazer um jogo extremamente simples.

Algumas pessoas tem criticado o OLPC, resumindo o projeto a tecnologia do notebook. Mas lendo a wiki deles, percebe-se que a tecnologia é o foco atual, mas o objetivo do projeto é proporcionar uma melhor educação a milhões de excluídos. Muitos estão preocupados com problemas mais sérios, como a falta de professores nas escolas, energia elétrica e água potável. Isso também é real e muito importante. Minha única crítica é a busca incessante por balas de prata. O OLPC não pretende e nem vai resolver todos os problemas do mundo. Este projeto é mais uma contribuição, outras ações devem ser realizadas para melhorar a vida de todos.

Eu me identifiquei com o projeto, porque uma vez, conversando com amigos, nos perguntamos quantos talentos se perdiam com a miséria. Imagine só: você um gênio da programação, mas o único equipamento a que você tem acesso é um carrinho de mão. Qual é chance de por acidente descobrir seu talento? Quantos matemáticos, químicos, físicos e biólogos não perdemos com estas faltas de oportunidade?

Um computador para cada criança dará uma chance para milhares de crianças conhecerem a Internet, textos, sons e gráficos. Isto por si só já justificaria o projeto para mim. Se apenas 0,1% das crianças que receberem o notebook mudarem de vida, significa que precisaríamos de 1000 notebooks para salvar uma criança. Calculando os custos disso, vejamos US$250,00 x 1000,00 = US$250.000,00. Um quarto de milhão para integrar ou reaproximar uma pessoa da sociedade moderna. Uma pessoa com acesso a educação e trabalho pode reverter o ciclo de pobreza de várias gerações, eu já vi isso ocorrer várias vezes no Brasil. Eu também acredito que consigamos um sucesso bem maior que 0,1%. Para mim, muito promissor. Ainda que muitos notebooks caiam no mercado negro, sejam roubados ou simplesmente danificados em curto espaço de tempo, acredito que será uma marca na vida dessas crianças.

Uma coisa que deixou preocupado é a falta de Internet no Brasil. Os últimos números que li, traziam algo como 14 ou 20 milhões de internautas no país. Embora este número venha crescendo, ainda demonstra nosso atraso e má distribuição de renda. Quantas escolas públicas temos com acesso à Internet? Na década de 90, o problema era ter telefone. Agora é conseguir Internet. Em Manaus, a situação é crítica. Ainda se vendem planos de 200 ou 300Kb/s como banda larga. Precisamos urgentemente de Internet nas escolas. O OLPC sem Internet vai ficar bem limitado, mas isso não invalidará os possíveis ganhos do projeto. Precisamos de mais educação e de mais acesso a Internet. Um grande país tem grandes problemas. Meu sonho megalomaníaco é de transformar o Amazonas em uma nova Índia :-)

Como disse, não resolverá todos os problemas do mundo, mas é um esforço positivo. É muito importante criticar, visões diferentes sempre são bem-vindas. Só não esqueça que o projeto é sobre crianças e educação. O laptop é só um detalhe.