segunda-feira, 30 de junho de 2014

Raspberry Pi e OpenELEC

As crianças são, surpreendentemente, os maiores usuários do meu Raspberry Pi. Assistir filmes é muito mais simples e rápido do que usar DVDs. Além disso, o meu aparelho de DVD não produz um sinal de alta resolução.

Tenho usado o OpenELEC com um cartão SDHC de 32GB. Ele ocupa cerca de 130MB e deixa o resto do cartão livre. Cada filme ocupa, mesmo em resolução de DVD (720x480), algo entre 500MB e 1GB. Então, consegui colocar todos os DVDs infantis num só cartão.

Além disso, não preciso passar por todas as introduções e menus que os DVDs costumam ter. É um pouco irritante ter que passar por ameaças legais para ver um produto pelo qual paguei.
Posso controlar o OpenELEC pelo celular, usando a aplicação para Android XBMC Remote. O controle remoto utiliza um serviço oferecido pelo OpenELEC via HTTP. Entretanto, ainda é mais simples usar o teclado (mas guardo para impressionar as visitas).

Então, o Pi está se revelando uma ótima opção para computador de viagem. Além de levar filmes para as crianças, poderei fazer cópia de segurança de fotos e filmes. E tudo o que preciso (Pi, cabos, cartões, teclado, etc) cabe dentro de uma caixinha de sorvete de 1,5l e pesa muito menos que um laptop.

terça-feira, 17 de junho de 2014

Criptodicas de português

O assunto que eu mais sofria para estudar no colégio era português. Hoje, percebo que a culpa era da maneira como o assunto foi apresentado. Os professores, ruins ou bons, simplesmente não tinham noção sobre como apresentar os temas de maneira interessante.

Os acentos, por exemplo, só percebi como são simples muito tempo depois. O problema é que as regras são apresentadas sem estrutura. É um amontoado de regras sem hierarquia ou fio condutor. É como ensinar geometria sem apresentar os postulados. Acentuação é simples: há uma tonicidade comum e os acentos mostram quando as palavras desviam dessa tonicidade e as coisas que mudam a tonicidade são...

Resolvi transformar isso numa brincadeira e criei criptodicas de Português. São dicas intencionalmente obtusas, confusas e divertidas.
  • Peru tem acento, pero não no Brasil
  • Cu não tem acento, mas curte um assento
  • Por que não acertam os porquês? Porque não estudam? Por quê?
  • A aranha ateia ateia a teia lindeira
  • Fui a casa, mas não à casa da mãe Joana
Se é para confundir, que seja com estilo!

quinta-feira, 12 de junho de 2014

xargs composto

Os logs do Apache têm uma linha para cada requisição e eu precisava saber qual a última requisição de cada um dos clientes mais frequentes (para saber o horário em que ocorreram). Cada linha do log se parece com esta:

172.16.160.30 - - [12/Jun/2014:12:02:16 -0300] "GET /a.html HTTP/1.1" 200 4712

Eu já tinha uma fórmula simples para achar os IPs dos clientes mais trabalhadores (sort | uniq -c | sort -n):

grep -Po "^\S+" access_log | sort | uniq -c | sort -n | tail -5

Assim, eu consigo os 5 IPs mais ocupados em ordem crescente.

Para cada um desses IPs, é preciso executar um novo grep, buscando apenas a última linha. Para isso, usei o xargs em combinação com o bash:

xargs -I{} bash -c "grep {}  access_log | tail -1"

Restou apenas retirar o número de ocorrências (adicionado pelo uniq -c). O grep ajuda novamente:

grep -Po "\S+$"

O -P indica uma expressão regular ao estilo do Perl e o -o indica que o resto da linha deve ser excluída. A expressão regular procura o último conjunto de caracteres que não contém um espaço. O primeiro grep usava uma expressão semelhante para achar o IP (primeira coluna do arquivo).

O resultado é mais assustador que a soma das partes:

grep -Po "^\S+" access_log | sort | uniq -c | sort -n | tail -5 \
  | grep -Po "\S+$" \
  | xargs -I{} bash -c "grep {}  access_log | tail -1"

Estou pensando se não seria prático descartar a ferramenta cara de BI e trocá-la por arquivos texto e shell.

segunda-feira, 9 de junho de 2014

O micro da sogra

O micro da sogra sofria tanto quanto a casa com a bagunça da família. Frequentemente, era preciso desinstalar, reinstalar ou instalar alguma coisa. Por muitos anos, houve resistência dura contra a migração para o Linux, mesmo a máquina sendo usada predominantemente para jogar Paciência ou para navegar na Web.

Então, fiquei surpreso quando finalmente foi aceita minha sugestão de que fosse instalado o Ubuntu (eu não insisti muito, juro). Em realidade, eu não estava plenamente convencido de que seria uma boa ideia, dado o histórico de dependência do sistema de Redmond. Mesmo assim, achei que valia a pena tentar.

Instalei o Ubuntu 12.04 LTS e três jogos de cartas bem completos. Criei uma conta para cada habitante da casa (exceto para os de quatro patas) e configurei a rede.

Passados vários meses, confirmo que foi uma excelente troca. Não houve nenhuma ocorrência com software deixando de funcionar ou com softwares suspeitos surgindo do nada com avisos ameaçadores (Seu micro pode estar infectado!). Surpreendi-me até a encontrar o LibreOffice sendo usado e bem avaliado!

De quando em vez, rodo o Update Manager para manter a máquina atualizada e é só esse o trabalho que esse micro tem dado. Sucesso total para o Ubuntu.

terça-feira, 3 de junho de 2014

Raspberry Pi

No final dos anos 1980, o melhor computador disponível era o Archimedes da Acorn. Os primeiros modelos tinham de 512KB a 1MB de RAM e operavam a 4MIPs. O A3000, lançado em 1989, custava 650 libras. Seriam mais de R$5 mil reais hoje (1370 libras de 2012 segundo a calculadora do Banco da Inglaterra), sem contar com as taxas de importação. Em terras brasileiras, tínhamos MSX, PCs, e não muito mais que isso.

Então, com o lançamento do Raspberry Pi, aproveitei a oportunidade de ter alguma coisa semelhante a um Archimedes. O processador é da mesma família, pelo menos (não vamos levantar a questão óbvia de que todos os celulares tem um ARM dentro hoje em dia).

Encomendei da loja inglesa ModMyPi um Pi modelo B (512MB de RAM), uma caixa, e um cartão microSD categoria 10 de 32GB (contendo vários sistemas operacionais para o Pi, inclusive o RISC OS). Gastei 55 libras (uns R$200). Cabos, eu tinha vários sobrando em casa, então só precisei comprar um cabo HDMI para ligar o Pi à TV. Usei um carregador de celular como fonte de energia.

Ele não é muito rápido, mas pode decodificar vídeo. Então, uma de suas utilidades é exibir filmes. Basta gravar o vídeo num pendrive e usar o OpenELEC ou o RaspBMC (ambos os sistemas vêm gravados no cartão de memória).

Apesar de ser bastante modesto na sua capacidade de processamento, ele é rápido o suficiente para emular os computadores de 8 bits dos anos 1980. O primeiro sistema que testei foi o Fuse (emulador de Spectrum). Os jogos são primitivos, mas divertidos. World of Spectrum deve ter quase todos os jogos já escritos para o Spectrum.

Então, essa pequena e barata caixa tem o potencial para tornar-se, sem exigir conhecimento técnico avançado, um centro de diversão, substituindo (com a ajuda da TV) o DVD, o videogame (com jogos mais limitados, claro) e o aparelho de som. Tudo isso consumindo 700mA. Quando tivermos celulares com saída de vídeo e várias portas USB, não haverá motivo para possuir qualquer outro computador (Ubuntu Edge foi a primeira tentativa desse gênero).

segunda-feira, 2 de junho de 2014

Procurando um valor no Oracle

Uma aplicação de ERP estava gerando um erro e eu precisava encontrar o registro no banco de dados (Oracle). As tabelas têm nomes inescrutáveis, então decidi que eu tinha que pesquisar todas para encontrar o valor que enxergava no monitor.

A solução foi bastante simples; com a ajuda dos metadados, percorri todas as colunas de tipos interessantes a procura do valor.


declare
  s varchar2(4096);
begin
  for i in (select * 
            from all_tab_cols 
            where owner='XY' 
                  and data_type in ('NUMBER','VARCHAR2') 
            order by table_name) 
  loop
    begin
      execute immediate 'select '||i.column_name
                     ||' from xy.'||i.table_name
                     ||' where '||i.column_name||'=''145960''' 
              into s;
      dbms_output.put_line(i.table_name||'.'||i.column_name);
    exception when no_data_found then null;
    end;
  end loop;
end;
Isto é, determinei que no esquema XY apenas interessam as colunas NUMBER e VARCHAR2 e pesquisei coluna por coluna todas as tabelas. Por sorte, XY tem, ao todo, pouco mais que 1 milhão de registros. O valor que eu procurava era 145960, como se pode deduzir da consulta gerada para cada coluna. Se a consulta não retorna nada, o Oracle lança o erro no_data_found. Por isso, o dbms_output.put_line() só é executado quando o valor for encontrado.

Em poucos segundos, encontrei a tabela e a coluna. Devido ao sucesso fácil, não encontrei motivos para transformar a consulta numa procedure ou numa function.