segunda-feira, 1 de dezembro de 2014

Recuperando fotos do celular

Inadvertidamente apaguei todas as fotos do celular. A qualidade das fotos não é das melhores, mas eu tinha fotos dos meus filhos que não gostaria de perder.

Encontrei um programa muito bom para recuperar fotos: PhotoRec. Ele sugou milhares de fotos da imagem que criei da memória do meu celular (um modesto Galaxy Pocket). Eram tantas imagens, que tive que recorrer a um pouco de código para ajudar na seleção.

Em primeiro lugar, gerei uma imagem da memória. Conectei o celular ao computador e copiei toda a memória:

dd if=/dev/sdb of=pocket


O celular apareceu como /dev/sdb e o comando copiou toda a memória para o arquivo pocket. Essa imagem tem exatamente o tamanho da memória, porque é uma cópia bit a bit.

Depois, rodei o PhotoRec, que tem uma interface textual, mas simples.

Então, identifiquei todas as fotos obviamente minhas (as outras podem ser de aplicativos que baixem imagens, como o navegador ou o WhatsApp). Olhando os metadados das imagens JPG,  descobri que as imagens interessantes são as que têm um valor que começa com S5300 - identificador do aparelho - no campo "Software"). Para isso, usei o módulo Image::MetaData::JPEG do Perl.

use Image::MetaData::JPEG;
use File::Find;
use File::Copy;

find(\&wanted, $ARGV[0]);

sub wanted {
  if(/jpg$/) {
    my $image=new Image::MetaData::JPEG($File::Find::name);
    if($image) {
      my $image_data = $image->get_Exif_data('IMAGE_DATA', 'TEXTUAL');
      my $software=$image_data->{'Software'}->[0];
      if($software=~/^S5300/) {
        print "$software $File::Find::name\n";
        move($File::Find::name, $ARGV[1]);
      }
    }
  }
}

Esse script recebe como parâmetros o nome da pasta onde vai procurar imagens e o nome da pasta para onde vai copiar os selecionados. Depois, eliminei todas as imagens pequenas (com menos de 500 pontos na vertical ou na horizontal). Os aplicativos de notícias que eu uso guardam milhares dessas fotinhos. Para isso, usei o módulo Image::Info.

use Image::Info qw(image_info dim);
use File::Find;
use File::Copy;

find(\&wanted, $ARGV[0]);

sub wanted {
  if(/jpg$/) {
    my $image_info=image_info($_);
    my $width=$image_info->{width};
    my $height=$image_info->{height};
    if($width<500 || $height<500) {
      print "$software $File::Find::name\n = $width $height\n";
      move($File::Find::name, $ARGV[1]);
    }
  }
}

Esse programa recebe como parâmetros o nome da pasta onde vai procurar imagens e o nome da pasta para onde vai copiar as imagens pequenas (não joguei nada fora).

Restaram muitas imagens duplicadas. Algumas tinham pequenas diferenças, mas outras eram idênticas. Então, usei mais um programa para eliminar as repetições.

use Digest::MD5 ;
use File::Copy;

%seen = ();
while( <*> ){
    -d and next;
    $filename="$_"; 
    #print "doing .. $filename\n";
    $md5 = getmd5($filename) ."\n";    
    if ( ! defined( $seen{$md5} ) ){
        $seen{$md5}="$filename";
    }else{
        print "Duplicate: $filename and $seen{$md5}\n";
        move($filename, '../duplicates/');
    }
}
sub getmd5 {
    my $file = "$_";            
    open(FH,"<",$file) or die "Cannot open file: $!\n";
    binmode(FH);
    my $md5 = Digest::MD5->new;
    $md5->addfile(FH);
    close(FH);
    return $md5->hexdigest;
}

Ou melhor, o programa coloca as cópias na pasta "duplicates", para não correr o risco de perder nada.

Ainda foi preciso fazer uma inspeção manual, mas os scripts facilitaram muito o trabalho.

sexta-feira, 24 de outubro de 2014

Lixo desnecessário

Fui à farmácia comprar paracetamol em gotas para meu filho. O líquido vermelho vem protegido dentro de um frasco de plástico e fechado com uma tampa bem forte. Isso está dentro de uma caixa de cartolina e, além disso, a farmácia entrega-me tudo dentro de um saco plástico pequeno.

O saco, por ser pequeno, não serve para muita coisa a não ser carregar o remédio até a minha casa. Quinze minutos depois, ele está no lixo (reciclável, pelo menos). É um desperdício completamente desnecessário.

Quando eu ainda frequentava uma locadora de filmes, sempre recusava as sacolinhas para os DVDs (que, de qualquer sorte, já estavam dentro de capas plásticas bem fortes). E eu devia ser o único cliente, porque as moças do balcão sempre estranhavam (acho que a memória delas não alcançava ao fim-de-semana anterior).

Voltando ainda mais no tempo, quando criança, eu às vezes ia com meus avós comprar pão. Tínhamos uma sacola especial com um exterior rústico (acho que era de corda) e um interior de algodão. Carregávamos o pão dentro da sacola e depois o guardávamos dentro de um porta-pão. Nada ia fora. Hoje em dia, tudo que vem da padaria vem dentro do seu saquinho particular. E essas sacolinhas são um problema quando o pão está ainda quente, porque o vapor condensa e o pão fica molhado; a sacola de algodão não tinha essa característica, porque respirava.

Acho que já não há muita polêmica sobre a necessidade de reduzir o lixo. Então, é melhor começar pelo mais fácil: eliminar essas sacolinhas inúteis. Não há sacrifício em evitá-las e penso que muita gente as usa por hábito apenas.

quinta-feira, 23 de outubro de 2014

Fatorial revisitado IV

Encontrei uma maneira ainda mais simples e rápida e de calcular um fatorial a partir dos primos que o compõem.

Para um fatorial n! é preciso
  1. Calcular, para cada primo p menor que n, a soma (s) das divisões de n pelas potências (q) de p menores que n;
  2. n! é a multiplicação de todos os ps.
Então, para 10!, teremos:
  • 2^(10/2 + 10/4 + 10/8) = 2^(5+2+1)=2^8
  • 3^(10/3 + 10/9) = 3^(3+1) = 3^4
  • 5^(10/5) = 5^2
  • 7^(10/7) = 7^1
Logo, n! = 2^8*3^4*5^2*7 = 3628800.

import java.math.BigInteger;

public class Factorial {

  public static BigInteger f(int n) {
    int m=n+1;
    int[] s=new int[m];
    for(int i=2; i<=m/2; i++) {
      if(s[i]!=-1) {
        //Marcar todos os múltiplos
        for(int p=i+i; p<m; p+=i) {
          s[p]=-1;
        }
        //Calcular soma de expoentes até a maior potência anterior a n
        for(int q=i; q<=n; q=q*i) {
          s[i]+=n/q;
        }
      }
    }
    BigInteger f=BigInteger.ONE;
    for(int k=2; k<m; k++) {
      int pk=s[k];
      if(pk>=0) {
        if(k>2) {
          System.out.print("*");
        }
        if(pk<2) {
          System.out.print(k);
          f=f.multiply(BigInteger.valueOf(k));
        } else {
          System.out.print(k+"^"+pk);
          f=f.multiply(BigInteger.valueOf(k).pow(pk));
        }
      }
    }
    return f;
  }
    
  public static void main(String... args) {
    for(int i=2; i<20; i++) {
      System.out.printf("%d! = ", i);
      BigInteger f1=f(i);
      System.out.printf(" = %d\n", f1);
    }
  }
 }
Se eu já tivesse uma lista de primos guardada, o código seria ainda mais simples.

quarta-feira, 15 de outubro de 2014

Temporada de caça na política

Há um desenho animado muito antigo no qual o Patolino e o Pernalonga discutem se a temporada de caça é a de coelho ou a de pato. Evidentemente, cada um está tentando salvar a sua pele.

Num dado momento, Pernalonga inverte a situação e declara que a temporada é a de caça de coelho. Patolino prontamente retruca que é de pato.

A mesma tática descobri que funciona com crianças pequenas. Quando estou cansado de correr atrás de um baixinho, viro e corro na outra direção. Invariavelmente, o piá começa a correr atrás de mim.

Nestas eleições, sinto que essa tática está sendo aplicada nos detratores do Bolsa Família. Discutiam-se os méritos do programa e agora luta-se pela paternidade. Quem queria votar em azul, porque o vermelho fazia uso eleitoral do programa, agora reclama para o azul a autoria.

O eleitor vai decidir em quem atirar.

sexta-feira, 10 de outubro de 2014

Bolsa Família em tempos de eleição

O Brasil já foi o país mais desigual do mundo e ainda hoje supera apenas países pobres da África e das Américas. Por isso, espanta-me a resistência feroz que há contra programas sociais. Em especial, contra o programa de renda mínima Bolsa Família.

Já analisei o custo e o retorno do programa num artigo quando havia muitas críticas a respeito dos gastos sociais da União.

Ultimamente, tenho lido e ouvido muitas críticas em relação ao fato de que não se espera trabalho em troca do benefício.

O programa é de complementação de renda. Então, exigir trabalho em troca já gera conflito com seus objetivos. Se o programa vai tirar tempo das atividades do beneficiado, não estará complementando, mas substituindo.

Os benefícios não são altos. O valor mínimo é de R$77,00 para uma família que tenha renda inferior a R$154,00 per capita. Não é o suficiente para sustentar ninguém e, evidentemente, as pessoas precisam buscar outros meios. O maior benefício pago em 2012 foi de R$1.332,00 para uma família de 19 pessoas (R$70 para cada uma).

As contrapartidas são sensatas: as crianças devem estar na escola; as mulheres dever ter acompanhamento médico; e crianças em risco ou retiradas de trabalho infantil devem participar de Serviços de Convivência e Fortalecimento de Vínculos.

Como o benefício corresponde a cerca de 10% do salário mínimo (atualmente em R$724,00), uma contrapartida em trabalho teria que ocupar dois ou três dias por mês. Para uma pessoa desocupada, não seria um sacrifício extraordinário, mas para alguém que já tenha um trabalho (e filhos), é provável que fosse impraticável.

Ademais, seria preciso criar uma burocracia nacional para gerenciar uma multidão de pessoas que compareceriam uns poucos dias por mês para trabalhar. Certamente, os custos não valeriam a pena e seria mais útil gastar o dinheiro em saúde e educação.

Penso que oferecer o programa para todas as famílias talvez ajude a vencer a resistência. Sim, há cidadãos de classe média (bem vestidos e bem alimentados) que julgam injusto o benefício dado a uma família com renda inferior a R$154,00 per capita. Quantos levariam o boletim dos filhos e os atestados médicos para receber R$77,00 mensais?

segunda-feira, 29 de setembro de 2014

Boteconomics

Eu estava procurando um investimento e estava achando difícil escolher um dentre vários fundos. As classificações variavam de risco baixo a risco alto, sem especificar exatamente o que isso significa. Se houvesse alguma probabilidade associada, eu podia usar o critério de Kelly, pelo menos.

A verdade é que, apesar das avaliações de risco variarem muito, as rentabilidades caíam todas numa estreita faixa entre 0,7% e 0,9%. Os riscos não parecem valer a pena.

Resolvi, então, fazer umas continhas para avaliar se seria mais sensato tentar economizar mais ou gastar mais fósforo procurando o equilíbrio perfeito entre risco, rendimento e taxa de administração.

Imaginei duas aplicações. Uma muito segura que rende 0,5% ao mês (parecida com a poupança) e outra arriscada, mas que rende 1% ao mês. 

A minha primeira pergunta foi, se eu depositasse R$100,00 na aplicação arriscada e R$110,00 na aplicação segura, em quantos meses a aplicação arriscada ultrapassaria a aplicação segura?

A resposta é 35 meses (3 anos, portanto). Em 35 meses, a aplicação arriscada teria R$4.207,69, enquanto a aplicação segura teria alcançado R$4.216,97. No mês seguinte, a aplicação segura estaria em R$4.348,61 e seria ultrapassada pelos R$4.350,76 da aplicação arriscada. No curto prazo, é mais sensato tentar economizar mais que buscar um rendimento maior.

Além disso, a aplicação arriscada estaria 50% maior que a aplicação segura apenas no mês 167. Quase 14 anos depois, portanto. Mas eu teria que confiar que a minha aplicação arriscada permanecesse segura por 14 anos e nesse caso talvez fosse melhor classificá-la como segura.

Se eu quisesse chegar ao fim de 10 anos com o mesmo valor que eu teria acumulado na aplicação arriscada (cerca de R$23 mil), teria que guardar R$41,00 extras todo mês. Aumentar o valor por 41% todos os meses é um pouco pesado, o que mostra como é difícil lutar contra o poder dos juros compostos por muito tempo. Com o prazo menor de 5 anos, seria preciso agregar apenas R$17,00 mensais para chegar aos mesmos R$8.200,00.

A minha conclusão é que no curto prazo vale mais a pena buscar guardar um pouco mais que procurar investimentos mais arriscados.

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.

quinta-feira, 29 de maio de 2014

Java e seus problemas

Os dois primeiros dos cinco objetivos iniciais da linguagem Java eram:
  1. Que a linguagem deve ser simples,orientada a objetos e familiar;
  2. Que seja robusta e segura.
A sintaxe inicial era, de fato, simples. Com o tempo foram adicionadas complicações, como os tipos genéricos. Por ser simples, robusta e segura, no entanto, a linguagem sempre foi prolixa.
Justamente pela quantidade de código necessária para executar as atividades mais simples, mesmo os mais ávidos programadores Java parecem não gostar de programar em Java. E então vemos uma grande quantidade de frameworks nos quais pode-se programar em XML e fazer muito pouco em Java. 
Então, jogam-se pela janela a robustez e a segurança para que se possa diminuir o número de linhas em Java. Aparentemente, o número de linhas em XML não tem relevância. Adoto a filosofia Lisp: não gosto de diferenciar configuração de programação. Se troco uma linha de código por dez de configuração, o sistema fica mais complexo.
As evoluções na sintaxe tratam de tornar a linguagem mais flexível, mas têm que conviver com o modelo antigo de execução. Java, entretanto, não foi criada para ser uma ferramenta de ponta. Ela foi criada para ser o novo COBOL. Por isso, ela deveria, creio eu, tentar manter a sintaxe simples, acessível, e legível. Surpreendentemente, coisas simples, como strings multilinhas e sintaxe para hashes, não foram adicionados à sintaxe ainda.
Parece-me que Java está tentando muito ser o que não é e está sofrendo por isso.

quarta-feira, 21 de maio de 2014

Monitorando a infraestrutura

Recentemente, passei por muitos problemas com a infraestrutura da Oracle (e a falta de interesse do suporte em resolvê-los). Para assegurar-me de que não havia um problema de rede, resolvi monitorar dois serviços básicos: o banco e o ldap.

Usando Perl e o netcat (comando nc no Linux), escrevi um pequeno script para monitorar as conexões do servidor de aplicações.

#!/usr/bin/perl

$|=1;
my $dump;
my %hosts=(srv1=>1521,srv2=>389);
my $out;
for my $host (keys %hosts) {
  my $port=$hosts{$host};
  $out=`nc -z $host $port`;
  if($out!~/succeeded/) {
    open($dump,'>>', '/tmp/monitor.txt');
    print $dump `date`;
    print $dump "$host $port Failed\n";
    close($dump);
  }
}

O hash %hosts associa cada servidor a uma porta e o comando "nc -z" realiza o trabalho de testar a conexão. Se o resultado não contiver a palavra "succeeded", imprime-se a data e a combinação de servidor e porta que falhou.

Ele registra apenas as tentativas mal-sucedidas para evitar que o arquivo monitor.txt cresça muito.

Adicionei uma linha à cron, para executar o script uma vez por minuto:

* * * * * /home/forinti/monitor.pl

E assim constatei que meus problemas nada tinham a ver com a rede.

quinta-feira, 8 de maio de 2014

Supercotas

As cotas nas universidades não cessam de gerar polêmica, mas é difícil encontrar alguma opinião sobre a necessidade de diversidade no âmbito acadêmico. Sim, porque o objetivo das cotas é, justamente, dar mais cor ao meio universitário.

Comumente, as universidades são vistas como um meio para uma carreira lucrativa, não como centros de produção de conhecimento. Quem vê o curso superior como preparação para o mercado de trabalho, pode muito bem ignorar a necessidade de variedade; quem o vê com objetivos mais amplos, não pode ignorar a importância da diversidade.

Atualmente, essa injeção de diversidade concentra-se justamente na dimensão racial/étnica. É um começo, mas o processo seletivo continua o mesmo; selecionam-se candidatos capazes de guardar um volume enciclopédico de conhecimento e que tenham o tempo necessário para a preparação. Nesse sentido, os cotistas não são muito diferentes dos demais.

Eu proponho que as cotas sejam transformadas em supercotas e creio que, no processo, criaríamos um vestibular mais democrático ainda.

A solução é simples: as vagas seriam sorteadas entre todos os aprovados com a nota mínima. Desta forma, seria atingida de maneira simples a diversidade máxima. Todas as dimensões de diversidade seriam contempladas num único sistema, sem que nenhum segmento fosse destacado: negros, índios, mulheres, pobres, ricos, criativos, concentrados, distraídos, etc.

Além disso, o vestibular atual cria a ilusão de que os que não são aprovados merecem seu destino e isso acaba por abafar a discussão sobre o número de vagas. Para a educação primária e secundária, ninguém discute a necessidade de haver vagas para todos, mas para o terceiro grau aceita-se que existam vagas para apenas 5% dos candidatos. Num sistema por sorteio, encontrando-se todos os candidatos nas mesmas condições, é de se esperar que cresça a pressão por mais vagas nas universidades públicas.

segunda-feira, 3 de fevereiro de 2014

Vantagens desperdiçadas

A greve dos ônibus e o calor terrível deste verão me levaram a pensar (novamente) sobre o quão estúpido é o modelo de transporte que temos nas cidades.

Vou começar pelas escadas rolantes, porque elas ilustram bem como as pessoas desperdiçam os meios quem têm e perdem uma excelente oportunidade de viver um pouco melhor. Elas nos permitem subir com maior velocidade, mas as pessoas ficam paradas, esperando o destino chegar (para isso, existem os elevadores). Além disso, poucas são as pessoas que admitem que alguém queira subir caminhando e, por isso, não deixam espaço para ninguém passar. Elas oferecem uma oportunidade excelente de ganhar um pouco de tempo; a oportunidade é desperdiçada e ainda negada a quem quiser tirar proveito dela.

Numa dimensão diferente, vemos o mesmo tipo de desperdício nos automóveis. As pessoas encontram-se com mais dinheiro e, quando poderiam usá-lo para viver melhor, compram carros cada vez maiores e consumidores de combustível. O primeiro Fiat 500 oferecia 18cv; os últimos modelos têm mais de 100cv. Não quebramos a barreira dos 20km/l nos carros ditos urbanos, quando já poderíamos estar nos 50km/l ou 60km/l. Com mais dinheiro no bolso dos motoristas e menos poluição, a vida poderia ser um pouco melhor para todos os habitantes das cidades.

Entretanto, as cidades estão entupidas com monstruosidades como a Tucson da Hyundai, que pesa 1,5 tonelada e mal consegue fazer melhor que 10km/l na estrada. Isto é, trata-se de um veículo que não deveria estar circulando num meio urbano civilizado, tanto porque oferece um risco maior à segurança como porque consome uma quantidade de recursos excessiva para o fim ao qual se propõe (transportar, no máximo, 5 pessoas).

Muitas cidades já limitam o trânsito de caminhões, justamente porque poluem, atrapalham o trânsito, e destroem o asfalto. Eu gostaria de ver os parâmetros para um veículo urbano serem reduzidos gradualmente, para que veículos menores e mais eficientes dominem as cidades. Teríamos um trânsito mais seguro, um ar mais limpo e mais dinheiro no bolso para gastar com coisas que realmente melhorem a qualidade de vida.

sexta-feira, 31 de janeiro de 2014

Login social

Um chamado aparentemente simples acabou como inspiração para uma ideia genial. Às vezes, não damos valor aos usuários que temos.

O cidadão estava reclamando que não conseguia entrar no sistema, o qual o informava algo sobre não ter permissão. Geralmente, isso indica que a pessoa de fato não tem permissão, mas costumo dar o benefício da dúvida a todos e revisei as permissões. Ele as tinha.

Conferi os logs e descobri que era outra pessoa que não estava conseguindo entrar. O cidadão que abriu o chamado tinha entrado várias vezes sem qualquer dificuldade. Seu amigo, no entanto, poderia continuar tentando, porque não estava habilitado.

Pode ser que um fosse muito amigo do outro a ponto de confundirem suas credenciais, mas acho mais provável que a informação sobre quem estava com dificuldade tenha sido julgada irrelevante.

De qualquer forma, ocorreu-me que daí poderia surgir o login social. Através da autenticação do Facebook, por exemplo, os amigos das pessoas autorizadas também poderiam ganhar privilégios no sistema. Claro, seria conveniente que o usuário indicasse corretamente quem é amigo próximo ou família. E, conforme o grau de proximidade, poderíamos conferir mais ou menos permissões.

Vou levantar a questão na próxima reunião.