sysd.org
2jun/120

Google Refine + Perl (English)

(Portuguese version here)

Google Refine is awesome. If you're unaware of what it is, access their official page and watch at least the first screencast. You'll see it can be helpful for several ETL-related tasks.

Currently, I use it a lot, specially for simple (but boring) tasks, like loading a CSV, trimming out some outliers and saving as JSON to be imported into MongoDB. Nothing a Perl one-liner couldn't do.

However, the opposite is not true: Perl one-liners are a lot more flexible than Google Refine. Now, what if we could merge both?

  1. Google Refine could be easily integrated with any RESTful API.
  2. Perl transforms one-liners into RESTful webservices.
  3. PROFIT!!!

As a practical example, I'll use some georeferenced data I was working at. Let's suppose I have to deduplicate registers, and one of "duplicate" rules is their proximity on the map. Google Refine is far from a full-featured GIS, and is unable to handle bidimensional coordinate system. Enter the GeoDNA: an algorithm to lower geospatial dimensions. As it's FAQ says,

GeoDNA is a way to represent a latitude/longitude coordinate pair as a string. That sounds simple enough, but it's a special string format: the longer it is, the more accurate it is. More importantly, each string uniquely defines a region of the earth's surface, so in general, GeoDNA codes with similar prefixes are located near each other. This can be used to perform proximity searching using only string comparisons (like the SQL "LIKE" operator).

Another interesting property of GeoDNA is that when ordening a set of records by their GeoDNA code, close locations are likely to appear in adjacent rows (sometimes, close locations will share very different prefixes, but similar prefixes always represent close locations).

To incorporate GeoDNA into Google Refine, we'll use the Add column by fetching URLs option, clicking on the header of any column (which column it will be doesn't matter as we'll use two of them, anyway):

As the expression, we'll paste the following code (here, pay attention to the correct latitude/longitude column names):

'http://127.0.0.1:3000/?lat='+
row.cells['latitude'].value
+'&lon='+
row.cells['longitude'].value

Throttle delay can be zeroed, as our webservice is local. The final configuration should look like this (don't push the OK button, yet):

Now, check if you have Mojolicious and Geo::DNA Perl modules (install them via CPAN, if not) and paste into your terminal:

perl -MGeo::DNA -Mojo -E 'a("/"=>sub{my$s=shift;$s->render(json=>{geocode=>Geo::DNA::encode_geo_dna($s->param("lat"),$s->param("lon"))})})->start' daemon

If you prefer a "human-readable" version, paste the following code into geocode-webservice.pl:

#!/usr/bin/env perl
use Geo::DNA qw(encode_geo_dna);
use Mojolicious::Lite;
 
any '/' => sub {
    my $self = shift;
    $self->render(json => {
        geocode => encode_geo_dna(
            $self->param('lat'),
            $self->param('lon'),
        ),
    });
};
 
app->start;

Once you started a webservice, it will report Server available at http://127.0.0.1:3000. Now, click OK on Google Refine dialog and wait. Even without delay, it could be a bit slow; however, even then this hack saved me a lot of time ;)

30dez/091

Uma breve história dos computadores (1940-1960)

Falei e falei e falei sobre as interfaces e a sua evolução, mas os computadores que é bom, nada. Pois aqui vai, um presente de Ano Novo. Texto originalmente postado no Royal Pingdom; a tradução foi por minha conta :)

Pensamos nos computadores como praticamente um sinônimo da modernidade, porém eles estão conosco há mais de 50 anos. Só que naquela época, eram de uso governamental e corporativo, e de difícil acesso. E certamente não eram pequenos. Enquanto alguns tinham nomes criativos como Whirlwind, Colossus ou Pegasus, outros possuíam denominações menos poéticas, tais como Z4, AN/FSQ-7 ou ENIAC.

Abaixo estão listados os 19 exemplos dos computadores ancestrais, que, apesar de serem considerados tecnologia de ponta na época, hoje em dia apresentam o aspecto de um saudoso "retro".

Estas máquinas não utilizavam os mesmos componentes que os computadores modernos usam. Nas décadas de 40 e 50, a tecnologia dominante eram as válvulas. Transistores apareceram mais tarde, e os circuitos integrados eram um sonho distante que somente se viabilizou na década de 60, ainda que em pequena escala. Quão tentador seria viajar no tempo para mostrar aos criadores dessas máquinas um PC dos dias atuais, apenas para ver a sua reação.

Abaixo listamos o ano em que cada computador foi completado, porém o seu desenvolvimento levou vários anos (eram projetos imensos). A ordem é cronológica, com os mais antigos primeiro. Observe que isto é apenas uma pequena amostra, sendo que muitos ficaram de fora (para que isso seja um artigo e não um livro :) ).

Z4

Ano: 1944

Projetado pelo lendário engenheiro alemão Konrad Zuse, o Z4 foi o desenvolvimento do seu antecessor, o pioneiro Z3, que ele construiu em 1941 (o primeiro computador programável controlado por uma fita). O Z4 consumia aproximadamente 4 kW de potência e rodava a 40 Hz. Ele possuía 64 registros de 32 bits, o equivalente a 512 bytes de memória RAM. Uma única operação de adição levava 0,4 segundos.

O computador Z4, no museu de Munique.

Colossus

Ano: 1944

Duas gerações do Colossus, Mark 1 e Mark 2, foram usados pelos cripto-analistas britânicos para decodificar as mensagens alemãs no final da Segunda Guerra Mundial. Este computador processava 5 mil caracteres por segundo (teoricamente, poderia processar mais, porém aí as fitas de dados, de papel, se romperiam). A existência do Colossus e de outras máquinas similares permaneceu em segredo até a década de 70, pelo medo de que o conhecimento da tal tecnologia pudesse incentivar a criação de algoritmos criptográficos mais eficientes.

Acima: O Colossus no seu auge. Observe a fita perfurada à direita. / Abaixo: Colossus reconstruído.

ENIAC

Ano: 1946

Quando o ENIAC foi anunciado em 1946, a imprensa imediatamente o batizou de "Cérebro Gigante". O ENIAC foi o primeiro computador eletrônico digital de uso geral, e, provavelmente, o mais famoso desse artigo. Ele pesava 27 toneladas. Foi empregado, entre outras coisas, nos cálculos para a criação da bomba de hidrogênio. O processo de programação podia levar semanas, já que, depois de esboçado o algoritmo no papel, vários cabos e interruptores tinham que ser manejados para aí sim prosseguir para a verificação e depuração.

Acima: o ENIAC em toda a sua exuberância. / Abaixo: programação à moda antiga?

Whirlwind

Ano: 1951

O Whirlwind foi o primeiro computador a empregar display de vídeo para a saída de dados. A primeira versão tinha 512 bytes de memória RAM e executava 20 mil instruções por segundo, porém a posterior mudança para um tipo diferente de memória duplicou a performance, fazendo do Whirlwind o computador mais veloz do seu tempo.

Acima, esq.: o Whirlwind. / Acima, dir.: close dos circuitos. / Abaixo: a sala de controle.

UNIVAC I

Ano: 1951

Sendo acrônimo para UNIVersal Automatic Computer (Computador Automático Universal), o UNIVAC I foi o primeiro computador comercial produzido nos Estados Unidos. Ele foi projetado pelos inventores do ENIAC. Um total de 46 sistemas foi montado e entregue. O UNIVAC I pesava 13 toneladas, rodava a 2,25 MHz e podia executar 1,905 instruções por segundo. O custo era de USD 1,5M pelo sistema.

O UNIVAC I, montado por Remington Rand (observe o seu logotipo acima e à esquerda).

WITCH

Ano: 1951

Abreviatura para Wolverhampton Instrument for Teaching Computing from Harwell, o WITCH também era conhecido por The Harwell Dekatron Computer. Era lento (uma multiplicação levava de 5 a 10 segundos), porém isso era justificado pela grande estabilidade: o computador podia funcionar sem supervisão por longos períodos de tempo (nota do tradutor: algo difícil ainda hoje ;) ). Portanto, ele podia ser deixado por conta própria com um grande volume de dados a processar. Uma vez, foi deixado ligado nos os feriados de Natal e Ano Novo e ainda estava funcionando quando a equipe retornou 10 dias depois.

O WITCH em operação. Somos só nós, ou eles também parecem um pouco confusos?

BESK

Ano: 1953

Sendo o Pingdom (nota do tradutor: a fonte original desse artigo) da Suécia, não podíamos deixar de fora um computador sueco de 1953. BESK significa Binär Elektronisk SekvensKalkylator, o que se traduz como Binary Electronic Sequence Calculator, ou Calculadora Eletrônica Binária de Sequência. A sua memória principal tinha 512 palavras de 40 bits, o equivalente a 2560 bytes. Uma adição podia ser feita em 56 microssegundos, e uma multiplicação, em 350. Por um curto período de tempo, este foi o computador mais rápido do mundo. A título de curiosidade, "besk" significa "amargo" em sueco, e também é o nome de uma bebida alcoólica do sul da Suécia. O nome é um trocadilho feito pelo criador, sendo que o nome anterior, COGNIAC, fora rejeitado pelos seus superiores.

O painel de controle do computador sueco BESK.

IBM 702

Ano: 1955

Apesar do IBM 702 ter sido anunciado ainda em 1953, a sua produção só teve início em 1955. Foi o primeiro computador comercial que podia ser alugado da IBM. O sistema podia ter a memória de até 11 mil caracteres de 7 bits, ou seja, em torno de 10 KB. Ele podia fazer 3.950 adições ou subtrações por segundo, porém as operações de multiplicação e divisão eram bem mais lentas.

A instalação do IBM 702

IBM NORC

Ano: 1954

IBM NORC, o Naval Ordnance Research Calculator (Calculadora de Pesquisa de Artilharia Naval), foi talvez o primeiro supercomputador e certamente o computador mais poderoso do seu tempo. Ele podia realizar 15 mil operações por segundo, e a sua primeira versão teve a memória principal de 2 mil palavras de 64 bits, ou seja, aproximadamente 16 KB.

Diversos ângulos do IBM NORC

IBM 305 RAMAC

Ano: 1956

Esse computador se destacou por ser o primeiro computador comercial vendido juntamente com um disco rígido. O seu HD podia armazenar quase 5 MB e consistia de 50 discos de 24 polegadas (61 cm) de diâmetro. O 305 RAMAC foi um dos maiores computadores que a IBM construiu. (se você gosta de HDs antigos, veja o artigo sobre a história do armazenamento de dados dos computadores.)

Sim, estas unidades imensas em primeiro plano são os HDs. Cada um armazenando os incríveis 5 MB.

Bendix G-15

Ano: 1956

O Bendix G-15 pesava 450 kg e custava em torno de USD 60 mil. Ele tinha uma memória com 2.160 palavras de 29 bits, o equivalente a 7,6 KB. O G-15 é frequentemente chamado de primeiro computador portátil, apesar de haver uma certa discórdia a respeito do assunto. Mais de 400 unidades foram produzidas.

O Bendix G-15. Parece uma grande torre de gabinete. De certa maneira.

Pegasus

Ano: 1956

O computador britânico Ferranti Pegasus foi projetado e construído para ser barato e confiável. Ele tinha uma memória de 5.120 palavras de 40 bits, o equivalente a 25 KB, além de 56 palavras (280 bytes) de memória rápida. Um Pegasus 2 de 1959 ainda está funcional no Museu de Ciências de Londres. É o computador digital mais antigo no mundo ainda em operação.

O Pegasus 2 no Museu de Ciências de Londres. O gabinete foi feito por Rolls Royce, daí as maçanetas das portas de carro. Observe também o relógio embutido.

AN/FSQ-7

Ano: 1958

Baseado no projeto do sucessor do Whirlwind, que jamais foi executado, o AN/FSQ-7 foi construído pela IBM em parceria com a Força Aérea dos Estados Unidos, para ser empregado no sistema de defesa aérea SAGE (Semi-Automatic Ground Environment). Às vezes é erroneamente chamado de Whirlwind II. Um computador chegava a ocupar 2.000 m² e pesava 275 toneladas. Foram os maiores computadores já construídos (52 foram feitos, no total). O AN/FSQ-7 executava 75 mil instruções por segundo.

Instalação do AN/FSQ-7. Cada gabinete possuía um telefone embutido, para poupar tempo nos reparos. Abaixo: terminal de controle do SAGE. Sinal de outros tempos: cada estação possuia acoplados um cinzeiro e um acendedor de cigarros.

IBM 7090

Ano: 1959

Um sistema IBM 7090 típico custava USD 2,9M e foi projetado para as aplicações científicas e tecnológicas de grande escala. Entre outras coisas, foi usado pela NASA para o controle de vôos espaciais. Um sistema 7090 aparece no filme Dr. Strangelove. Em 1961, a versão mais recente, 7094, se tornou o primeiro computador a cantar (a canção Daisy Bell), o que serviu de inspiração para uma cena em 2001: Uma Odisseia no Espaço.

O IBM 7090. Curiosidade: o segundo à esquerda é o Smith DeFrance, director do NASA Ames Research Center.

AKAT-1

Ano: 1959

O polonês AKAT-1 foi o primeiro computador dedicado a resolver equações diferenciais a empregar transistores. Porém, nunca foi produzido em massa, devido à situação política do país na época.

O polonês AKAT-1.

Datasaab D2

Ano: 1960

Jamais produzido em série, o Datasaab D2 foi um computador conceitual feito na Suécia. Pesava apenas 200 kg e poderia ser colocado em cima de uma mesa. Possuía o equivalente a 15 KB de memória RAM e executava 100 mil adições por segundo. Era um protótipo cujo objetivo foi demonstrar a viabilidade da navegação aérea auxiliada pelo computador. Datasaab era a divisão computacional da fabricante de aeronaves Saab, que produzia os caças suecos.

O Datasaab D2 e o seu painel de controle.

BRLESC I

Ano: 1962

O seu nome é um acrônimo para Ballistic Research Laboratories Electronic Scientific Computer (Computador Científico Eletrônico dos Laboratórios de Pesquisa Balística). Como a própria denominação sugere, foi projetado tendo em mente as aplicações de pesquisa e militares. BRLSEC I podia realizar 5 milhões de operações por segundo e possuía uma memória de 4096 palavras de 72 bits, o equivalente a 36 KB.

O impressionante painel de controle do BRLESC I.

Honeywell 200

Ano: 1963

O Honeywell 200 e os seus sucessores foram introduzidos no mercado para competir com os computadores acessíveis da IBM (em especial, o IBM 1401). A linguagem assembly nativa usada para programar o computador Honeywell era chamada de Easycoder. Sim, naquela época, linguagem assembly era considerada simples. :) Durante vários anos, Honeywell rodou uma campanha promocional chamada Liberator, aonde várias esculturas bastante criativas eram feitas empregando componentes de computadores (um exemplo).

O H200 em operação.

UNIVAC 1108

Ano: 1964

Baseado em transistores, o UNIVAC 1108 suportava até três CPUs e memória de até 262.144 palavras de 36 bits (mais do que 1 MB). A memória empregava circuitos integrados (bastante raros na época) no lugar da tecnologia de núcleos de filmes finos, usada no seu antecessor, o 1107.

Um modelo mais recente do 1108, de 1969.

Palavras finais, acrônimos e o MANIAC

Conforme pode ser visto nos exemplos acima, os acrônimos eram bastante populares para dar nomes aos computadores. Alguns cientistas estavam tão fartos com esta mania que começaram a parodiá-la. Por exemplo, teve um computador chamado MANIAC (I e II), o que significava Mathematical Analyzer, Numerical Integrator, and Computer (Analisador Matemático, Integrador Numérico, e Computador).

É fascinante olhar para trás e ver como eram as coisas nos primórdios da computação, além de ser revelador de quão longe progredimos. Hoje, temos mais poder de processamento em nossos bolsos do que outrora caberia em prédios inteiros. E os nossos mais humildes smartphones superam, e muito, a performance e a capacidade de armazenamento desses antigos gigantes.

http://en.wikipedia.org/wiki/Whirlwind_%28computer%29