Escolar Documentos
Profissional Documentos
Cultura Documentos
dados abertos:
desenvolvedores
Comunidade LUA
Comunidade Perl
Comunidade PythonBrasil
Flavio Codeo Filho (fccoelho@gmail.com)
Jonh Edson Ribeiro de Carvalho (jonhedson@gmail.com)
Giuseppe Romagnoli (giuseppe.romagnoli@gmail.com)
da web, 2009
manual dos
dados abertos:
desenvolvedores
So Paulo
2011
sumrio
Introduo publicao de dados abertos, 9
Apresentao, 11
O que diz a Constituio, 13
Constituio da Repblica Federativa do Brasil,13
Portal da Transparncia, Governo Federal, mantido
pela Controladoria Geral da Unio (CGU),15
Conceitos importantes, 16
Princpios dos dados abertos,17
Ontologias,19
OWL (Web Ontology Language),19
Dados conectados (Linked data), 20
Metadados, 21
Vocabulrios, 21
Schema, 22
Repositrio visual, 22
Concluso, 27
Estruturando e expondo dados abertos, 29
Apresentao, 29
Como no fazer, 30
Web services um cenrio, 32
Estruturando dados PERL com JSON, YAML e XML, 33
Estruturando dados Ruby com JSON, YAML e XML, 33
A escolha do fregus, 39
Concluso, 47
Extraindo dados pblicos, 49
Apresentao, 49
Lendo CSV: entre PIPE e DBMS, 50
Mdulos de CPAN para tratar CSV, 53
Spreadsheet::ParseExcel, 63
Lendo arquivos com cabealhos variveis, 67
Encoding, 71
XLSX, 72
Seletores CSS, 97
Tratamento de informaes,112
Programa praticamente definitivo,113
Facilidade para aprender Baby-Perl,113
Comunidade vibrante e pronta para ajudar,114
Concluso,114
Relativamente fcil,124
Ferramentas auxiliares,139
Importando dados da web semntica para o Drupal,140
Concluso, 140
Referncias bibliogrficas, 141
introduo
publicao de
dados abertos
<leg>Fonte: Wikipedia.
Fonte: Wikipedia.
<2>1.1. Apresentao
A Internet uma reunio de pessoas e computadores em escala mundial, dotada
de tecnologias que provm facilidade e grande utilizao de documentos por meio
apresentao
Essas tecnologias podem propiciar ao governo uma maneira inovadora de expor os dados j pblicos, de forma que muitos consigam us-los de fato. Sabe-se que h fatores polticos, legais e de
cultura que limitam a exposio de dados, porm, existindo esforo para tal implementao, o retorno ser positivo. Jornalistas,
analistas polticos, desenvolvedores de software, organizaes,
empresrios, advogados, mdicos e o pblico em geral tero
recursos para acessar e entender todo o repositrio de dados
gerado pelo governo.
No entanto, apenas colocar documentos na web no significa
transparncia pblica. preciso que as informaes estejam
disponveis de modo que humanos e mquinas consigam interpret-las de forma gil. Este modo genericamente designado
como dados abertos. Assim, pode-se esperar colaborao e
participao para que exista inovao na criao de aplicativos,
como por exemplo para criar distintas visualizaes dos dados
ou mash-ups.
11
A principal proposta deste documento apontar, para desenvolvedores web, caminhos que facilitem a publicao dos dados
em formato aberto, assim como sua re-utilizao por e para a
sociedade.
Este manual uma construo colaborativa e que teve como base
uma srie de artigos publicados pela Comunidade So Paulo
Perl Mongers sob o ttulo Equincio de Maro (Hack de Dados
Pblicos)1. o segundo volume da srie Manual de Dados Abertos, publicada pelo W3C. O primeiro volume, Manual de Dados Abertos Governo, teve como pblico-alvo o gestor pblico,
oferecendo uma introduo aos dados abertos e os benefcios de
sua utilizao. O leitor que necessitar uma abordagem mais bsica sobre o tema deve ler este manual, disponvel em http://www.
w3c.br/divulgacao/pdf/manual_dados-abertos-governo.pdf.
O manual Manual de Dados Abertos Desenvolvedor tem
como pblico-alvo toda a comunidade de desenvolvedores web e
oferece uma viso mais tcnica sobre como publicar e reutilizar
dados abertos. Para o leitor que vai se debruar apenas sobre
este volume, h uma brevssima introduo sobre dados abertos,
seus princpios e conceitos. Nos demais captulos, apresenta-se
como expor os dados em formato aberto, como extrair dados
pblicos e como reutilizar esses dados.
12
1
constituio da repblica
federativa do brasil
Art. 37. A administrao pblica direta e indireta de qualquer
dos Poderes da Unio, dos Estados, do Distrito Federal e dos Municpios obedecer aos princpios de legalidade, impessoalidade, moralidade, publicidade e eficincia e, tambm, ao seguinte:
(Redao dada pela Emenda Constitucional n 19, de 1998) [...]
XXII as administraes tributrias da Unio, dos Estados, do
Distrito Federal e dos Municpios, atividades essenciais ao funcionamento do Estado, exercidas por servidores de carreiras especficas, tero recursos prioritrios para a realizao de suas
atividades e atuaro de forma integrada, inclusive com o compartilhamento de cadastros e de informaes fiscais, na forma da
lei ou convnio. (Includo pela Emenda Constitucional n 42, de
19.12.2003)
1 - A publicidade dos atos, programas, obras, servios e campanhas dos rgos pblicos dever ter carter educativo, informativo
o que diz a
constituio
13
ou de orientao social, dela no podendo constar nomes, smbolos ou imagens que caracterizem promoo pessoal de autoridades
ou servidores pblicos.
2 - A no observncia do disposto nos incisos II e III implicar
a nulidade do ato e a punio da autoridade responsvel, nos
termos da lei.
3 A lei disciplinar as formas de participao do usurio na
administrao pblica direta e indireta, regulando especialmente:
(Redao dada pela Emenda Constitucional n 19, de 1998)
I as reclamaes relativas prestao dos servios pblicos em
geral, asseguradas a manuteno de servios de atendimento ao
usurio e a avaliao peridica, externa e interna, da qualidade dos servios; (Includo pela Emenda Constitucional n 19, de
1998)
II o acesso dos usurios a registros administrativos e a informaes sobre atos de governo, observado o disposto no art. 5, X
e XXXIII; (Includo pela Emenda Constitucional n 19, de 1998)
14
8 A autonomia gerencial, oramentria e financeira dos rgos e entidades da administrao direta e indireta poder ser
ampliada mediante contrato, a ser firmado entre seus administradores e o poder pblico, que tenha por objeto a fixao de metas
de desempenho para o rgo ou entidade, cabendo lei dispor
sobre: (Includo pela Emenda Constitucional n 19, de 1998)
15
conceitos importantes
O conceito de dados abertos aplica-se a todo o conjunto de dados que podem ser publicados na web, e no apenas dados
governamentais (para mais detalhes, ver o volume 1, Manual de
Dados Abertos Governo).3 Porm os dados de governo, pelo
volume e relevncia para a sociedade, que tm sido o foco
principal das iniciativas nessa rea.
Apenas liberar os documentos no torna eficaz o processo de publicidade dos dados, pois manipular a enorme quantidade de documentos gerados pelo governo pode tornar bem difcil a tarefa.
O que se busca com dados abertos maior participao da sociedade na vida pblica:
por meio de documentos em formatos de fcil manipulao
por humanos.
por meio de documentos em formatos de manipulao inteligente por mquinas.
Disponvel em http://www.portaldatransparencia.gov.br/faleConosco/perguntas-temaparticipacao.asp.
3
Pgina web do W3C Brasil: http://www.w3c.br/divulgacao/pdf/manual_dados-abertosgoverno.pdf.
2
16
O conceito de dados abertos no novidade, sendo sempre utilizado em cenrios distintos, e requer que um determinado dado
esteja disponvel para todos, sem restries. Os princpios listados abaixo caracterizam os dados abertos e expem melhor o
seu significado.
acesso livre
Qualquer pessoa na rede dever ter acesso aos documentos, sem
discriminao de grupos ou pessoa. Algumas tecnologias podem
excluir, por exemplo a utilizao de um sistema de captcha baseado apenas em imagem, em que deficientes visuais seriam impedidos de buscar esses dados.
17
responsabilidade
Deve-se promover a responsabilidade dentro dos vrios departamentos do governo, para que estes possam publicar dados com
qualidade e da maneira mais rpida, de forma segura para o
governo e a sociedade.
rpida integrao
18
formatos de arquivos
Formatos de arquivos proprietrios podem criar dependncia tecnolgica para o uso das informaes, e isso gerar restries ao
acesso dos dados.
serializao de dados
No se deve disponibilizar apenas um nico formato aberto de
arquivos, pois isso tambm prejudicaria a utilizao por um grupo de pessoas (por falta de conhecimento), e em outros casos
faltaria estruturao para manipular os arquivos.
Na filosofia, ontologia o estudo da existncia ou do ser enquanto ser, ou seja, a maneira de compreender as identidades e
grupos de identidades. Na cincia da computao, um modelo
de dados que representa um conjunto de conceitos sob um domnio e seus relacionamentos, ou, mais formalmente, especifica uma
conceitualizao dele.
ontologias
19
20
metadados
Metadados so comumente definidos como dados sobre dados. So informaes que caracterizam os dados e informam
sobre sua natureza, propsito, formato, autoria, etc.
vocabulrios
Para representar dados em RDF, necessrio definir vocabulrios
(muitas vezes tambm chamados de metadados, ou at mesmo de
ontologias). Existem alguns tipos de vocabulrios j definidos, que
podem ser utilizados para expressar os dados em formato aberto.
GeoNames
um tipo de banco de dados que disponibiliza metadados geogrficos, e pode ser acessado por vrios tipos de web services. O
GeoNames contm um conjunto de vocabulrios para adicionar
foaf
21
DBpedia
uma interface orientada a dados que extrai informaes estruturadas criadas no Wikipedia, permitindo-se efetuar consultas
sofisticadas e associar documentos e outros conjuntos de dados
(datasets) para disponibiliz-los na web.
22
schema
No contexto de dados abertos, schema expressa vocabulrios
que so compartilhados e orienta como computadores devem lidar com eles.
repositrio visual
recomendada a criao de um repositrio visual que esteja
hospedado em um rgo de governo, oferecendo um mapa dos
recursos disponveis para sua explorao. O repositrio pode
utilizar a colaborao dos demais rgos do governo, aproveitando a plataforma para compartilhar e divulgar dados. Dessa
maneira, os dados abertos estariam todos em um mesmo local
perguntas
mais frequentes
Os dados devem vir de seus donos ou guardies, sejam eles
organizaes privadas ou pblicas. Se os dados so de governo,
a sua publicidade em muitos casos estabelecida por lei, como
no caso do Brasil com a obrigatoriedade de publicizao das
receitas e despesas para todos os rgos pblicos.
23
quais so os formatos?
Assim como os dados, os formatos devem ser abertos, para que
no exista dependncia tecnolgica no acesso aos dados. H
sempre uma alternativa a qualquer formato proprietrio. Um
exemplo muito comum de uso de formato proprietrio oferecer
dados em planilhas Microsoft Excel. Uma alternativa em formato
aberto seria o CSV.
csv
24
rdf
Trata-se de uma linguagem para representao de informaes
na Internet. So arquivos baseados em metadados, com o objetivo de criar um modelo de documento no formato XML com
semntica.
Com os dados estruturados, a utilizao de linguagens para consulta pode auxiliar muito quem quer pesquisar ou referenciar dados contidos em documentos que estejam na Internet. Uma dessas
linguagens a SPARQL.
25
Informaes pblicas devem ser oferecidas conforme a lei estabelece. No havendo regulamentao, a frequncia com que os
dados so atualizados oferece um bom parmetro de definio.
26
concluso
O governo j deu grandes passos, pois existem dispositivos legais regulando a publicidade da informaes pblicos, j havendo dados na web. Porm, atualmente, a sociedade enfrenta dificuldades em obter os dados em formatos adequados para serem
analisados. Com um trabalho mais elaborado e organizado para
disponibilizar dados, haver benefcios para todos: o governo
receber sugestes e haver uma participao mais eficiente da
sociedade, a qual saber mensurar melhor o trabalho das autoridades.
A melhor frase para expressar a motivao existente no movimento pelos dados abertos a afirmao de Eric Raymond, em um
dos ensaios do livro Bazar e catedral (A Lei de Linus): Havendo
olhos em quantidade suficiente, todos os erros so triviais.6
RAYMOND, Eric Steven. The Cathedral & the Bazaar, apud OReilly (1999).
27
estruturando
e expondo dados
abertos
apresentao
29
como no fazer
Infelizmente, boa parte das informaes disponibilizada em
bons formatos para impresso analgica, sendo de difcil anlise
e manuseio por software, alm de, por vezes, serem expostos em
padres proprietrios. Um relatrio em PDF pode ser elegante
quando impresso, mas isso fora um analista a aceitar a informao como est, ou perder muito tempo para realizar referncias
cruzadas, anlises comparativas e estatsticas, desperdiando e
invalidando os esforos de democratizao e cidadania.
30
Disponvel em http://www.isp.rj.gov.br/Conteudo.asp?ident=150.
tegrada de Segurana Pblica). Os autores foram cuidadosos, incluindo planilhas de resumo com o ndice estadual de ocorrncias
e dados condensados por RISP (Regio Integrada de Segurana
Pblica).
No entanto, se algum quiser saber, por exemplo, qual rea possui a maior incidncia de homicdios culposos, precisar analisar cada uma das 44 planilhas de AISP, procurando o ndice
em questo, e anotar o maior manualmente. A automatizao
possvel, mas depende da informao estar sempre disponvel
nas mesmas linhas/colunas em todos os documentos, ou com o
mesmo rtulo.
Pode ser simples fazer isso manualmente uma vez, mas, se a inteno for obter essa informao mensalmente, ou realizar uma
anlise estatstica de crescimento, ou conhecer a reduo da criminalidade no estado ou regio, a anlise manual pode levar mais
tempo do que o desejado para qualquer analista interessado.
31
web services,
um cenrio
32
estruturando dados
perl com json, yaml e xml
Em Mojolicious (um framework para desenvolvimento web em linguagem PERL),8, para criar esse tipo de rota, basta escrever:
use Mojolicious::Lite;
get /:ano/:mes/:aisp/:tipo => sub {
...
};
app->start;
=> 72,
Extorsao
=> 6,
Estelionato
=> 62,
};
33
json
O formato JSON leve e simples. Sua estrutura de fcil entendimento e utiliza convenes comuns em muitas linguagens de
programao.
Passar a estrutura de dados acima para JSON simples:
use JSON;
my $json = to_json( $crimes_violentos );
{Extorsao:6,Estelionato:62,Furto de veiculos:72,Roubo de
34
aparelho celular:30}
yaml
O YAML outro formato simples de serializao de dados, semelhante em estrutura ao JSON inclusive com a vantagem de
um gerador de JSON poder ser facilmente adaptado para emitir
YAML, e vice-versa , que oferece um padro de dados simples
de ser interpretado tanto por humanos quanto por softwares.
Passa-se a estrutura de dados anterior para YAML fazendo:
use YAML::XS;
my $yaml = Dump( $crimes_violentos );
xml
35
H pouca vantagem em usar XML sem validao, mas isso tambm pode ser obtido com relativa facilidade. No se pode esquecer de definir o Content-Type da pgina gerada para text/xml.
estruturando dados
ruby com json, yaml e xml
Para criar este tipo de aplicao utilizando-se o Sinatra,9 micro-framework para desenvolvimento de aplicaes web na linguagem Ruby, comece da seguinte forma:
require sinatra
get /:ano/:mes/:aisp/:tipo do
...
end
36
=> 72,
Extorsao
=> 6,
Estelionato
=> 62,
json
Passar a estrutura de dados acima para JSON simples. No
ecossistema Ruby, existem diversas opes de parsers e geradores de JSON, sendo que a mais comum a biblioteca conhecida
simplesmente como json:
require json
@json = @crimes_violentos.to_json
require sinatra
get /:ano/:mes/:aisp/:tipo do
...
content_type :json
@crimes_violentos.to_json
end
E o resultado ser:
{Extorsao:6,Estelionato:62,Furto de veiculos:72,Roubo de
aparelho celular:30}
Agora possvel renderizar a varivel @json, mas no se esquea de definir o Content-Type da pgina para application/
json. Complementando o exemplo acima, em Sinatra haveria
algo parecido com seguinte:
37
yaml
Pode-se passar a estrutura de dados anterior para YAML, fazendo:
require yaml
@yaml = @crimes_violentos.to_yaml
38
xml
Se o arquivo contendo o schema do XML estiver em dados.xsd,
pode-se gerar um XML da seguinte forma:
require libxml
require xmlsimple
require rest_client
@xml
XmlSimple.xml_out(@crimes_violentos,
CrimesViolentos)
document = LibXML::XML::Parser.string(@xml)
schema = LibXML::XML::Schema.new(dados.xsd)
RootName
=>
RestClient.post(http://isp.rj.gov.br/api,@xml) if document.validate_
schema(schema)
A transformao de estruturas de dados nestes formatos to simples, que muitos frameworks de desenvolvimento de aplicaes
para web, como Catalyst, Mojolicious e Dancer para linguagem
Perl, ou como Ruby on Rails, Sinatra e Merb, permitem especificar seu formato por meio de um parmetro de extenso na URI,
como se fosse a extenso de um arquivo forma no recomendada, uma vez que a rotina chamada content negociation em
web semntica e implementaes de servio REST deve ser via
cabealho Content-Type, e no via extenso. Pode-se oferecer o
mesmo servio em diferentes formatos, conforme a preferncia do
sistema do usurio.
Ignorando-se o Content-Type, ainda assim possvel oferecer a alternativa das extenses. Seguindo o exemplo anterior, ter-se-ia a
URI http://isp.rj.gov.br/api/2009/05/AISP7/crimes-violentos.
json, que poderia renderizar sua sada em formato JSON. J a
URI http://isp.rj.gov.br/api/2009/05/AISP7/crimes-violentos.
yaml poderia renderizar essa mesma informao em YAML, e
assim por diante.
a escolha do fregus
39
40
10
Mais detalhes sobre o framework RDF podem ser encontrados na documentao oficial do
W3C (World Wide Web Consortium), Resource Description Framework (RDF): Concepts
and Abstract Syntax, de 10.2.2004, encontrado na pgina web http://www.w3.org/
TR/2004/REC-rdf-concepts-20040210/.
criando um documento
em rdf com perl
Existem vrios mdulos disponveis em http://search.cpan.org,
mas abaixo apresentado um exemplo simples.
Uma prova do conceito de RDF criar um documento para demonstrar a facilidade oferecida pela linguagem PERL. Ser utilizado o FOAF, um tipo de conjunto de dados j comentado anteriormente. FOAF o acrnimo para Friend of Friend [Amigo
do amigo]. Trata-se de uma ontologia para descrever dados de
pessoas, suas atividades, o relacionamento com outras pessoas
e objetos etc.
Existem alguns mdulos para se tratar este tipo de dataset no
CPAN, XML::FOAF11, Gedcom::FOAF12 e XML::FOAF::Person.13
http://search.cpan.org/perldoc?XML%3A%3AFOAF
http://search.cpan.org/perldoc?Gedcom%3A%3AFOAF
13
http://search.cpan.org/perldoc?XML%3A%3AFOAF%3A%3APerson
FOAF
11
12
41
my $ser = RDF::Simple::Serialiser->new;
# Qual o vocabulrio que ser usado? Veja o RDF::Simple::NS
# para mais detalhes.
$ser->addns( foaf => http://xmlns.com/foaf/0.1/ );
my @triples = (
42
# Serializando em RDF.
print $ser->serialise(@triples);
14
http://search.cpan.org/perldoc?RDF%3A%3ASimple%3A%3ASerialiser
criando um documento
em rdf com ruby
Existem vrios mdulos disponveis em http://search.cpan.org,
mas abaixo apresentado um exemplo simples.
foaf
Uma prova do conceito de RDF criar um documento para demonstrar a facilidade oferecida pela linguagem Ruby. Ser utilizado o FOAF, um tipo de conjunto de dados j utilizados no
exemplo com PERL.
</rdf:RDF>
43
include Spira::Resource
44
Se for interessante, possvel serializar o objeto de modelo acima na forma de uma string XML/RDF, da seguinte forma:
require rdf/rdfxml
output = RDF::Writer.for(:rdfxml).buffer do |writer|
jhacker.each_statement do |statement|
writer << statement
end
end
xmlns:rdf=http://www.w3.org/1999/02/22-rdf-syntax-
ns#
<rdf:Description rdf:about=http://datagraph.org/
jhacker/#self>
<ns0:name>Some Other Hacker</ns0:name>
<ns0:nick>jhacker</ns0:nick>
</rdf:Description>
</rdf:RDF>
buscando informaes
Com os dados disponveis em RDF, necessrio um padro para
busc-los de forma inteligente, e uma das solues a linguagem de consulta SPARQL (um SQL para a web, uma linguagem
de procura e pesquisa por dados estruturados). Em resumo, se
xmlns:ns0=http://xmlns.com/foaf/0.1/>
45
result
46
@client.query(@query,
SPARQL::Client::RESULT_JSON).first
E o resultado ser:
puts result[:name]
=>
:content_type
=>
concluso
47
extraindo
apresentao
Depois de expostos os dados, o desafio extra-los das pginas
web ou de repositrios de dados de forma que possam ser reutilizados de acordo com o interesse e convenincia do usurio.
Se os dados esto em formato aberto, a tarefa bem mais simples; mas nem sempre os dados esto expostos em formato compreensvel por mquina, e isso torna a tarefa do interessado bem
mais complexa.
Neste captulo so apresentados exemplos prticos de como extrair dados de formatos mais comuns na web como CSV, XLS ou
at mesmo fazer scrapping do contedo da pgina.
dados pblicos
49
lendo csv:
entre pipe e dbms
O formato CSV (comma-separated values) o verdadeiro idioma
ingls para transferncia de dados: quase todo aplicativo de
planilha ou DBMS (database management system) oferece CSV
como formato de importao ou exportao.
50
a opo mais flexvel, pois grava e l tanto arquivos como strings, e serve como base para muitos outros mdulos (inclusive os
outros dois que sero explicados adiante).
Quando so definidas os column_names (por meio de um ArrayRef), pode-se usar getline_hr, que retorna uma HashRef para
cada linha processada. J getline retorna diretamente ArrayRef.
Quando estiver trabalhando, interessante saber que a primeira
linha do CSV frequentemente traz os nomes das colunas. Assim,
leia estes com getline e passe-os para column_names. O resto do
arquivo pode ser lido com getline_hr.
15
16
Disponvel em http://tools.ietf.org/html/rfc4180.
CPAN (Comprehensive Perl Archive Network) um repositrio virtual de mdulos
programados na linguagem PERL, disponvel em http://www.cpan.org/.
text::csv
51
Para gerar CSV, pode ser usado print, que grava diretamente em
um FileHandle, ou uma combinao de combine e string para
gerar um buffer.
Vejamos um exemplo prtico. Tem-se o seguinte CSV, e preciso
filtr-lo, deixando apenas cdigo identificador, nome da cidade
e UF:
estado,cidade,longitude,latitude,link
MG, Santa Maria do Salto, -40.14935, -16.24953,
http://www.sidra.ibge.gov.br/bda/territorio/infomun.asp?codmun
=3158102
ES, Marilndia, -40.54236, -19.41355,
http://www.sidra.ibge.gov.br/bda/territorio/infomun.asp?codmun
=3203353
52
http://www.sidra.ibge.gov.br/bda/territorio/infomun.asp?codmun
=5207501
...
53
E o output ser:
...
$VAR1 = {
link => http://www.sidra.ibge.gov.br/bda/territorio/infomun.
asp?codmun=4109609,
cidade => Guaratuba,
longitude => -48.57544,
latitude => -25.88355,
codigo => 4109609,
estado => PA
};
4109609,Guaratuba,PA
$VAR1 = {
54
asp?codmun=3541109,
cidade => Presidente Alves,
longitude => -49.43844,
latitude => -22.10054,
codigo => 3541109,
estado => SP
};
3541109,Presidente Alves,SP
...
Vale a pena estudar tambm os bind_columns, que associa diretamente os campos do CSV s variveis e aos atributos do mtodo
new. A configurao padro :
=> ,
escape_char
=> ,
sep_char
eol
=> ,,
=> $\,
always_quote
=> 0,
quote_space
=> 1,
quote_null
=> 1,
binary
=> 0,
keep_meta_info
=> 0,
allow_loose_quotes => 0,
allow_loose_escapes => 0,
=> 0,
blank_is_undef
=> 0,
empty_is_undef
=> 0,
verbatim
auto_diag
=> 0,
=> 0,
});
=> undef,
=> undef,
=> \t,
=> \n,
allow_whitespace
55
quote_space
=> 0,
quote_null
=> 0,
});
tie::handle::csv
a verso do Text::CSV que acessa mais facilmente dados em
CSV, pois combina muito melhor com um cdigo orientado a objetos, fazendo bom uso de overloading e normalizando os headers para caixa alta/baixa.
No to suscetvel a tuning quanto o mdulo que encapsula,
mas em 99% dos casos exatamente isso que se quer. Segue um
exemplo com funcionalidade similar ao anterior:
#!/usr/bin/perl
use strict;
56
use utf8;
use warnings all;
=> 7marco2011.csv,
header
=> 1,
key_case
=> lower,
open_mode
=> <:utf8,
);
close $csv;
17
A SQLite uma biblioteca que implementa linguagem de pesquisas em banco de dados relacional.
dbd::csv
57
nome do estado (por meio de um JOIN), e sero mostrados somente os municpios que fazem parte da Grande So Paulo:
#!/usr/bin/perl
use strict;
use utf8;
use warnings all;
use open :locale;
use DBI;
csv_tables => {
58
llcb
my $sth = $dbh->prepare(<<SQL_QUERY);
SELECT cidade, estados.estado AS cidade_uf
FROM llcb
JOIN estados
ON llcb.estado = estados.uf
WHERE
llcb.estado = SP
AND (latitude
> -23.80)
AND (latitude
< -23.20)
$dbh->disconnect;
Alm de SELECT (com JOIN e ORDER!), INSERT, DELETE e UPDATE tambm so implementados. A documentao completa est
em SQL::Statement::Syntax.
23.6
Text::CSV_XS
2.27
-941%
-90%
--
$sth->finish;
59
$c->res->header(Content-Disposition =>
attachment;filename= . $filename);
60
Previsivelmente, tem-se um caveat relativo codificao: o Excel espera que o CSV esteja em ISO-8859-1 (ou, possivelmente, Windows-1252), sendo ento necessrio um downgrade
para latin1.
Fusion Tables um servio para gerenciar grandes colees de dados tabulares na nuvem. Pode-se enviar
tabelas de at 100 MB e compartilh-las com colaboradores, ou torn-las pblicas. possvel aplicar filtros
e agregao aos dados, visualiz-los em mapas e em
outros grficos, mesclar os dados de diversas tabelas e
export-los para a web ou para arquivos CSV. Pode-se
tambm conduzir discusses sobre os dados em diversos nveis de granularidade, como linhas, colunas e
clulas individuais.
Nada mais do que um Excel sob o efeito de esterides,
pois, alm dos filtros, possvel fazer joins e criar views. Para
uma demonstrao, o arquivo usado como exemplo no decorrer desta cartilha, o dump do banco de dados do projeto Latitudes e longitudes das cidades brasileiras, de Thiago Rondon,
encontra-se em http://j.mp/hyoYqi.
61
mysqldump/mysqlimport
O MySQL oferece importao/exportao otimizada para
arquivos CSV localizados no mesmo host em que o servidor
(mysqld) est rodando. Ou seja, tendo-se certos privilgios,
possvel passar por cima do sistema de queries:
mysqldump \
--fields-terminated-by=, \
--fields-optionally-enclosed-by=\ \
--lines-terminated-by=\n \
62
Este comando grava todas as tabelas de $DATABASE em arquivos CSV individuais no diretrio /caminho/para/diretorio. necessrio que este diretrio tenha permisso para gravao aberta para o usurio que executa o daemon, pois os arquivos CSV
so gerados diretamente pelo mesmo, e no pelo mysqldump.
A importao feita da seguinte maneira:
mysqlimport \
--fields-terminated-by=, \
--fields-optionally-enclosed-by=\ \
--lines-terminated-by=\n \
-u $USERNAME -p $DATABASE table.csv
O nome da tabela onde ser feita a importao deduzido do
nome do arquivo CSV (table, no caso).
Para mais detalhes, ver:
* mysqldump A Database Backup Program
* mysqlimport A Data Import Program
* LOAD DATA INFILE Syntax
um mdulo que permite leitura de XLS. Na sua forma mais bsica, possvel ler os arquivos XLS e acess-los dizendo qual a
planilha, linha e coluna:
workbook:
o documento inteiro, e nele existem vrias worksheets.
worksheet:
a planilha que ser de fato utilizada; equivale a cada folha
(ou aba) exibida no Excel.
Cada worksheet disponibiliza os mtodos row_range() e col_range(), e ambos retornam arrays, com o mnimo e mximo de seus
respectivos nomes (linhas/colunas).
spreadsheet::parseexcel
63
my $parser
64
= Spreadsheet::ParseExcel->new();
my $workbook = $parser->parse(nome_do_arquivo.xls);
if ( !defined $workbook ) {
die $parser->error(), .\n;
}
for my $worksheet ( $workbook->worksheets() ) {
my ( $row_min, $row_max ) = $worksheet->row_range();
my ( $col_min, $col_max ) = $worksheet->col_range();
for my $row ( $row_min .. $row_max ) {
for my $col ( $col_min .. $col_max ) {
= ($row, $col)\n;
= , $cell->value(),
\n;
Um grande problema em XLS a quantidade de memria utilizada. Por isso, se desejado apenas extrair as informaes bsicas
do XLS (como o valor da clula), no necessrio montar tudo
na memria. O manual informa que um arquivo de 10 Mb um
arquivo grande para uma mquina com 256 MB de RAM, portanto uma planilha de 60 Mb um arquivo bem grande para uma
mquina com 1 GB de RAM.
A soluo usada pelo modulo chamar uma funo para cada
clula lida, passando como parmetro a workbook, o index da
planilha, a linha, a coluna e o objeto da clula.
Exemplo:
#!/usr/bin/perl -w
use strict;
use Spreadsheet::ParseExcel;
65
my $parser = Spreadsheet::ParseExcel->new(
CellHandler => \&cell_handler,
NotSetCell => 1
);
my $workbook = $parser->parse(file.xls);
sub cell_handler {
my $workbook
= $_[0];
my $sheet_index = $_[1];
my $row
66
= $_[2];
my $col
= $_[3];
my $cell
= $_[4];
IDADE
Renato
19
Eden
@renato_cron
@edenc
33
Porm, dependendo da vontade do desenvolvedor, as informaes podem estar em qualquer posio (por exemplo, o Twitter
pode estar antes da idade).
#!/usr/bin/perl -w
use strict;
use Spreadsheet::ParseExcel;
my $parser
= Spreadsheet::ParseExcel->new();
my $workbook = $parser->parse(teste.xls);
if ( !defined $workbook ) {
die $parser->error(), .\n;
Glupo
67
my %expected_header = (
twitter => qr /\btwitter\b/io,
idade
=> qr /\bidade\b/io,
nome
=> qr /\bnome\b/io
);
= 0;
68
my $header_map
= {};
my $header_found
= 0;
if (!$header_found){
for my $col ( $col_min .. $col_max ) {
my $cell = $worksheet->get_cell( $row, $col );
next unless $cell;
foreach my $header_name (keys %expected_header){
if ($cell->value() =~ $expected_header{$header_name}){
$header_found++;
# mais informaes poderia ser salvas, como por exemplo
# qual o valor que est escrito e bateu com a regexpr
$header_map->{$header_name} = $col;
}
}
}
}else{
my $registro = {};
my $value = $cell->value();
69
$registro->{$header_name} = $value;
}
70
-----------------row 7, registro 3
nome = Glupo
twitter =
idade = 33
------------------
encoding
Abra a planilha e troque o cabealho nome por nome para
validao. Se for executado o programa, tudo continua funcionado; assim, deve-se trocar a regexpr:
qr /\bnome para validao\b/io
Notem que foi adicionado um next unless $value, pois geralmente vem muita linha completamente em branco. So linhas criadas
(quase) automaticamente pelo Excel.
use strict;
use Spreadsheet::ParseExcel;
71
use utf8;
...
Assim, no importa se for escrito nome para validar, nome validaao, nome validacao, pois todos sero aceitos.
xlsx
72
use strict;
use utf8;
use Spreadsheet::XLSX;
use Text::Iconv;
my $converter = Text::Iconv -> new (utf-8, latin1);
my %expected_header = (
twitter => qr /\btwitter\b/io,
idade
=> qr /\bidade\b/io,
nome
=> qr /\bnome\s+(para\s*)?valida(r|[c][a]o)\b/io
);
my $reg_num
= 0;
my $header_map
= {};
my $header_found
= 0;
if (!$header_found){
73
($cell->value()
=~
$expected_header{$header_
name}){
$header_found++;
$header_map->{$header_name} = $col;
}
}
}
}else{
74
necessrios
# neste caso, achar apenas um cabealho j suficiente
my $registro = {};
my $value = $cell->value();
$registro->{$header_name} = $value;
}
if (keys %$registro){
$reg_num++;
print row $row, registro $reg_num\n;
print $_ = $registro->{$_}\n for keys %$registro;
print ------------------\n;
}
}
75
extrao de dados,
exportando em odf
76
77
tro do <html>
78
Fonte: http://sao-paulo.pm.org/equinocio/2011/mar/3
<leg>Fonte: http://sao-paulo.pm.org/equinocio/2011/mar/3.
<3>3.4.2. Analisando texto com regex
analisando
texto
regex
Depois de obter os dados,
eles serocom
parseados
e ser feita uma reformatao
de alguns. O objetivo adapt-los aos formatos necessrios para o
Depois
de obter os dados, eles sero parseados e ser feita
desenvolvedor. Para isto, sero utilizadas expresses regulares de forma a
uma
reformatao
deobtido
alguns.
O objetivo
adapt-los
aos
analisar
todo o contedo
e transform-lo
de acordo
com o que
se formaprecisa
tos
necessrios
para
o
desenvolvedor.
Para
isto,
sero
utilizadas
(isso pode ser feito j na hora da leitura dos dados). Dois exemplos de como
expresses
regulares
aplicar regex em
um texto:. de forma a analisar todo o contedo obtido
e transform-lo de acordo com o que se precisa (isso pode ser
use strict;
feito j na hora da leitura dos dados). Dois exemplos de como
use warnings;
aplicar
em um dotexto:
my regex
$string = 'Ministerio
esporte, valor R$ 4000,00 no dia 01/02/1999 em espcie.';
$string =~ m/(.+), valor R\$ (.+) no dia (.+) em (.+)./ ;
use strict;
print $1,"\n";
use warnings;
print $2,"\n";
print $3,"\n";
my $string
= Ministerio do esporte, valor R$ 4000,00 no dia
01/02/1999 em espcie.;
Fonte: http://sao-paulo.pm.org/equinocio/2011/mar/3.
79
print "-------","\n";
print $1,\n;
print $2,\n;
print $1,"\n";
print print
$3,$2,"\n";
/, $4, /, $5,\n;
print $3, '/', $4, '/', $5,"\n";
print $6,\n;
print $6,"\n";
"-------","\n";
print print
-------,\n;
80
Veja na imagem:
Veja na imagem:
<leg>Fonte: http://sao-paulo.pm.org/equinocio/2011/mar/3.
Fonte: http://sao-paulo.pm.org/equinocio/2011/mar/3.
[A-Za-z0-9]
[A-Za-z0-9_]
Alfanumricos e _
\w
Alfanumricos e _
[0-9]
Apenas dgitos
\d
Apenas dgitos
\D
No dgitos
\s
Espao
\S
No espao
String comeando em
String terminando em
[^a-zA-Z0-9_]
Negao/No alfanumricos
\n
Nova linha
\r
Carriage return
{min,max}
Quantidade de ocorrncias
()
Separa alternativas
Algum caracter
(.+)
(.*)
Tabela 1. Tabela dos caracteres mais comuns para compor expresses regulares.
81
82
= $document->appendTable(TABELA DADOS,
1000,50);
my $line = 0;
my $all_fields = get_fields();
my $col = 0;
foreach my $field ( qw/data fase documento especie orgao_su-
}
$document->save;
}
use strict;
use warnings;
83
use WWW::Mechanize;
use HTML::TreeBuilder::XPath;
use HTML::LinkExtor;
use OpenOffice::OODoc;
my $mech = WWW::Mechanize->new();
$mech->agent_alias( Windows IE 6 );
my $url = http://www.portaltransparencia.gov.br/despesasdiarias/
resultado.
?consulta=rapida&periodoInicio=01%2F01%2F2011&periodoFi
m=31%2F01%2F2011.
&fase=EMP&codigoOS=51000&codigoFavorecido=;
my @items = ();
my $url_visited = {};
84
scan_page( $url );
use Data::Dumper;
print Resultados,\n, Dumper @items, \n;
print Para ver o arquivo em formato openoffice, abra o arquivo
criado: \n;
print portal_transparencia.ods e veja a tabela de nome TABELA
DADOS\n;
sub scan_page {
my ( $link ) = @_;
$mech->get( $link );
my @links_paginacao = search_links_paginacao(
$mech->res->content, //p[@id=paginacao]
);
foreach my $url ( @links_paginacao ) {
if ( ! $url_visited->{ $url } ) {
print Acessando url: , $url, \n;
$mech->get( $url );
my $pagina_html = $mech->res->content;
parse_data( $pagina_html );
$url_visited->{ $url } = visited;
} else {
#
}
}
}
sub search_links_paginacao {
my ( $html, $pagination_xpath ) = @_;
my $tree= HTML::TreeBuilder::XPath->new;
$tree->parse( $html );
my $pagination_div = $tree->findnodes( $pagination_xpath );
$pagination_div = $pagination_div->[0]->as_HTML;
scan_page( $url );
85
my $url_list = HTML::LinkExtor->new();
$url_list->parse( $pagination_div );
my @links= ();
foreach my $item ( @{ [ $url_list->links ] } ) {
push(
@links,
http://www.portaltransparencia.gov.br
@$item[2]);
}
$tree->delete;
return @links;
sub parse_data {
my ( $html ) = @_;
86
my $tree= HTML::TreeBuilder::XPath->new;
$tree->parse( $html );
my $tabela_com_dados_html = $tabela->[0]->as_HTML; #
my $tree_tr = HTML::TreeBuilder::XPath->new;
$tree_tr->parse( $row->as_HTML );
my $row_data = {
data
fase
documento
especie
orgao_superior
elemento_despesa
favorecido
valor
$tree->delete;
}
sub reformata_dados_com_regex {
my ( $items ) = @_;
for ( my $i = 0; $i < scalar( @$items ) ; $i++ ) {
@$items[$i]->{ data } = join ( /, $1, $2, $3 )
};
87
sub exportar_e_salvar_odf {
my ( $items ) = @_;
my $document = odfDocument(
file => portal_transparencia.ods,
88
my $table
= $document->appendTable(TABELA DADOS,
1000,50);
my $line = 0;
my $all_fields = get_fields();
my $col = 0;
foreach my $field ( qw/data fase documento especie orgao_superior entidade_vinculada unidade_gestora elemento_despesa
favorecido valor/ ) {
$document->updateCell( $table, $line, $col++, $all_fields->{
$field }->{ label } );
}
$col = 0;
foreach my $field ( qw/data fase documento especie orgao_superior entidade_vinculada unidade_gestora elemento_
despesa favorecido valor/ ) {
$document->updateCell( $table, $line, $col++, $item->{
$field } );
}
}
$document->save;
}
sub get_fields {
my ( $self ) = @_;
return {
data => {
89
elemento_despesa => {
field => elemento_despesa,
label => Elemento Despesa,
},
favorecido => {
field => favorecido,
label => Favorecido,
},
valor => {
field => valor,
label => Valor,
},
90
};
}
scrapping
feeds atom
fcil e criao de
91
o cenrio
Quer-se obter uma lista de todos os artigos publicados no site da
So Paulo Perl Mongers18. A primeira coisa a fazer entender a
estrutura do documento HTML em que as informaes esto. Para
isso, abre-se a pgina que lista os artigos e olha-se o cdigo fonte. Abaixo, um trecho do que foi encontrado:
<div class=top>
<h2>Artigos</h2>
<div class=whois>
<h3>2010</h3>
<ul>
<li>
<a
href=/artigo/2010/comoescreverperlescalavelparaoseu
92
href=/artigo/2010/orliteumaabordagemsimplesparau
class=autor>
span>
</li>
18
Disponvel em http://sao-paulo.pm.org/artigos
[Daniel
Vinciguerra]</
...
</ul>
<h3>2009</h3>
<ul>
...
obtendo a pgina
muito simples fazer um programa que acessa a pgina desejada:
use strict;
use Mojo::UserAgent;
O Mojo::UserAgent um cliente HTTP 1.1 e WebSocket completo, com E/S assncrona e suporte transparente a TLS, epoll e
kqueue. Sua API bastante simples e direta, como se pde observar, e a partir desse ponto do cdigo o objeto $client j carregou
o site e possvel acessar seu contedo.
use warnings;
93
<div class=top>
94
<h2>Artigos</h2>
<div class=whois>
<h3>2010</h3>
<ul>
<li>
<a href=/artigo/2010/comoescreverperlescalavelparaoseu
clustermysql>Como Escrever Perl Escalvel para o seu Cluster
MySQL</a><span class=autor> [Luis Motta Campos]</
span>
</li>
<li>
<a href=/artigo/2010/orliteumaabordagemsimplespara
utilizarsqlite>ORLite - Uma abordagem simples para utilizar
acessando o dom
Sabendo a nomenclatura, pode-se solicitar o DOM da resposta
obtida pelo cliente web e acessar cada um desses elementos facilmente por meio de buscas por seletores CSS.
my $dom = $client->res->dom;
...
95
96
seletores css
Seletores como o acima so utilizados em CSS para associar um
estilo de formatao a uma determinada tag ou conjunto de
tags HTML. uma notao simples e ao mesmo tempo muito
verstil, que h alguns anos vem sendo usada com sucesso por
bibliotecas javascript como o jQuery, especialmente porque pode-se combinar seletores da forma que se achar mais adequada
para acessar o(s) elemento(s) desejado(s).
Esta, naturalmente, no a nica forma de se chegar aos elementos em questo, mas a mais utilizada aqui. Sinta-se vontade
para experimentar outros seletores simples.
= $artigo->at(a)->attrs->{href};
my $autor = $artigo->at(span)->text;
extraindo as informaes
97
Por fim, como o autor est envolvido em uma tag <span>, utiliza-se ->text, tal qual foi feito para o ttulo.
98
my $url = $artigo->at(a)->attrs->{href};
my $autor = $artigo->at(span)->text;
# vamos retirar os [ e ] dos nomes dos autores,
# e aproveitar para eliminar espaos desnecessrios.
$autor =~ s/\s*[\[\]]//g;
O leitor deve ter reparado que foram feitas algumas chamadas encadeadas, como ->new->get e ->res->dom. De fato,
Mojo::UserAgent e Mojo::DOM retornam sempre o prprio objeto, de modo que se pode encadear todas as chamadas. Mais
ainda, o mtodo find() possui seus prprios iteradores para que
no se precise fazer o foreach manualmente. Assim, o mesmo
cdigo acima poderia ser escrito desta forma:
use strict;
use warnings;
use Mojo::UserAgent;
Mojo::UserAgent->new->get( http://sao-paulo.pm.org/artigos )
->res->dom->find( div[class=whois] > ul > li )
->each( sub {
pulando etapas
99
my $artigo = shift;
my $titulo = $artigo->at(a)->text;
my $url = $artigo->at(a)->attrs->{href};
my $autor = $artigo->at(span)->text;
100
+ use Data::UUID;
id
str(sao-paulo.pm.org, artigos),
+ );
Mojo::UserAgent->new->get(
)->res
http://sao-paulo.pm.org/artigos
+ use XML::Atom::SimpleFeed;
101
102
link
=> $url,
+);
});
resumo
Foi criado um webcrawler que extrai artigos de um site e gera um
feed Atom completo, com direito a UUID tudo isso em apenas
36 linhas, incluindo linhas em branco, comentrios e formatao.
Imagine agora o que voc tambm pode fazer!
seletores css
seletores simples
Qualquer elemento
*
103
input[name^=obrig]
104
E[foo$=bar]
Elemento E cujos atributos casam com o que for especificado seguindo as mesmas regras de busca por atributo definidas acima.
a[foo^=obrig][foo$=ado]
EF
Elementos do tipo E, F e G.
h1, h2, h3
E+F
105
seletores avanados
E:root
E:empty
# terceiro
# impares
div:nth-child(even) # pares
div:nth-child(-n+3) # 3 primeiros
106
E:nth-last-child(n)
# terceiro
div:nth-last-child(odd)
# impares
div:nth-last-child(even) # pares
div:nth-last-child(-n+3) # 3 ltimos
E:nth-of-type(n)
# terceiro
div:nth-of-type(odd)
# impares
div:nth-of-type(even) # pares
div:nth-of-type(-n+3) # 3 primeiros
# terceiro
# mpares
div:nth-last-of-type(even) # pares
div:nth-last-of-type(-n+3) # 3 ltimos
E:first-child
E:nth-last-of-type(n)
107
E:only-child
108
apresentao
Depois de extrair os dados, o passo seguinte poder reutiliz-los
de acordo com o interesse e a convenincia do usurio.
Existem diversas linguagens de programao no mercado bastante eficientes para desenvolver aplicaes web de excelente
qualidade. No existe a melhor linguagem, embora haja fs ardorosos (e algumas vezes combativos) de cada uma delas e
todas elas com comunidades ativas que ajudam na evoluo da
linguagem.
Cada usurio deve buscar aquela linguagem que lhe parea mais
fcil e a mais adequada ao projeto que deseja desenvolver. No
ser incomum misturar tecnologias. Para ajudar, neste captulo
so apresentadas as trs linguagens mais comumente utilizadas
(Perl, Ruby e Phyton) e uma linguagem bem brasileira, LUA.
introduo
reutilizao
de dados pblicos
109
constante renovao
110
19
O Perl possui uma comunidade ativa de mais de 8 mil colaboradores em todo o mundo, sendo mais de 200 responsveis diretamente no ncleo da linguagem. Novas verses do Perl so
lanadas regularmente, uma por ano, com pelo menos duas atualizaes de manuteno nesse intervalo, sem contar os lanamentos mensais da verso em desenvolvimento, permitindo testar
seu cdigo e identificar problemas antes de as verses terem sido
lanadas oficialmente.
A estabilidade e a robustez do Perl so resultado de anos de
maturidade e uma sute de mais de 92 mil testes para a linguagem, sem contar os milhares de testes em seus diversos mdulos
auxiliares. O cdigo interno do Perl foi certificado por ter baixa
densidade de defeitos, e passou na validao de segurana do
Department of Homeland Security dos Estados Unidos. O Perl
possui ainda o modo taint, que analisa e discrimina entradas
O Perl um software livre, e no depende de uma nica empresa. Qualquer pessoa pode verificar seu cdigo-fonte, enviar relatrios de erro, escrever correes ou compilar sua prpria verso.
111
tratamento de informaes
112
Outro desafio para o OpenData-BR a comunicao entre sistemas e interfaces. Para isso, alm da sua natural habilidade de
converso, processamento distribudo e interconectividade, o Perl
oferece uma interface de integrao de bancos de dados compatvel com MySQL, Oracle, Sybase, PostgreSQL, SQLite e outros.
possvel converter SQL entre diferentes sintaxes especficas de
determinados bancos.
Com mais de 22 mil distribuies e 90 mil mdulos, e uma mdia acima de 200 uploads por ms, encontram-se no repositrio
CPAN todos os componentes necessrios para reduzir o ciclo de
desenvolvimento de software, permitindo que o desenvolvedor se
concentre apenas na lgica do programa. Isso torna o desenvolvimento do OpenData-BR e seus subprojetos uma atividade rpida, gratificante e prazerosa para desenvolvedores de software.
113
comunidade vibrante
e pronta para ajudar
Os Perl Mongers20 possuem comunidades de desenvolvedores
de software e entusiastas espalhados em diversos pases, crescendo diariamente, com listas de discusso onde iniciantes podem
solucionar suas dvidas, comentar novos projetos, marcar encontros, participao em redes sociais, fruns de tecnologia, eventos
de software livre e mais.
Esse apoio comunitrio fundamental para a longevidade de projetos como o OpenData-BR, movidos pela prpria comunidade.
concluso
114
20
115
Seu aprendizado fcil, devido sintaxe simples, clara e elegante. Possui um modo interativo que permite ao desenvolvedor
realizar testes e validaes diretamente com a mquina virtual
Python por meio de linha de comando esta capacidade possibilita ao iniciante explorar facilmente a linguagem e tornar-se
produtivo em muito pouco tempo. Atualmente, muitas universidades tm utilizado Python em sala de aula como forma de diminuir
a distncia entre um problema proposto e sua soluo, evitando
assim que a prpria linguagem seja um dos fatores de erro no
estudo. Isso tem criado solues mais elaboradas nos projetos de
final de curso, melhorando sua qualidade.
116
23
24
117
RDF. Sendo completamente open source, a comunidade de catlogos locais CKAN est crescendo rapidamente, j tendo inclusive
membros no Brasil (http://ckan.emap.fgv.br).
118
119
ruby on rails
120
Centenas de ferramentas foram construdas, desde pequenas bibliotecas utilitrias at ambientes completos de desenvolvimento
e infraestruturas inteiras de automatizao de data centers. Mais
do que isso, novas ondas de quebra de paradigma surgiram em
paralelo, como a utilizao crescente de bancos de dados no
relacionais (conhecidos como NoSQL). Rapidamente, este ecossistema se estabeleceu como exemplo de desenvolvimento produtivo, ateno qualidade e primor por boas prticas de engenharia de software, tudo isso aliado utilizao de tecnologias
inovadoras (que eram experimentadas na prtica por centenas
de empresas startup do Vale do Silcio e ao redor do mundo).
O repositrio de bibliotecas do mundo Ruby chama-se RubyGems.org e, recentemente, ultrapassou a marca das 30 mil bibliotecas publicadas nmero que compete at mesmo com a antiga e
robusta CPAN do mundo Perl.
121
122
25
Disponvel em http://blogs.gartner.com/mark_driver/2008/10/10/merb-10-for-rubyemerges-real-competition-for-rails/
123
relativamente fcil
124
A comunidade Ruby conseguiu evoluir unindo velocidade e qualidade, fatores considerados incompatveis para a maioria dos
desenvolvedores de software tradicional. E so justamente as
duas caractersticas que projetos abertos deveriam almejar para
conquistar crescimento sustentado de longo prazo, criando um
ambiente adaptativo.
comunidade vibrante
e empreendedora
125
126
histria
A Lua foi criada em 1993 por Roberto Ierusalimschy, Luiz Henrique de Figueiredo e Waldemar Celes, membros da Computer
Graphics Technology Group, da PUC-RJ. Verses anteriores 5.0
foram liberadas sob uma licena similar BSD. A partir da verso 5.0, LUA recebeu a licena MIT.
Alguns de seus parentes mais prximos so o Icon, por sua concepo, e a Python, por sua facilidade de utilizao por no-programadores. Em artigo publicado no Dr. Dobbs Journal, os
criadores da linguagem afirmaram que Lisp e Scheme tambm
foram uma grande influncia na deciso de desenvolver o quadro
como a principal estrutura de dados de LUA.
lua activerdf
(http://activerdf.luaforge.net/)
Trata-se de uma biblioteca para acessar dados de arquivos RDF a
partir de LUA, De fato, Lua ActiveRDF uma verso de LUA para
o ActiveRDF, construdo para Ruby, que permite a criao rpida
de semnticas para aplicaes web.
Exemplo retirado do site http://activerdf.luaforge.net/ para criar
e editar entradas de pessoas:
127
-- carrega-se activerdf
rdf = require activerdf
-- adiciona-se um banco de dados SPARQL existente como uma base
de dados
url = http://tecweb08.tecweb.inf.puc-rio.br:8890/sparql
rdf.ConnectionPool.add_data_source { type = sparql, engine = virtuoso, url = url }
-- registra-se uma notao short-hand para o nome de campo usado
nesses dados de teste
rdf.Namespace.register ( test, http://activerdf.luaforge.net/test/ )
-- agora pode-se acessar todas as propriedades RDF de uma pessoa
128
json4lua e jsonrpc4lua
(http://json.luaforge.net/)
Essas bibliotecas implementam a codificao e decodificao do
JSON (JavaScript Object Notation) e um cliente JSON-RPC-over-http para LUA.
JSON uma simples codificao de objetos Javascript-like, que
ideal para uma transmisso leve de dados fracamente tipados. Um
subpacote do JSON4Lua o JSONRPC4Lua, um simples cliente e
servidor JSON-RPC-over-http (em um ambiente CGILua ) para LUA.
Exemplo de decodificao de uma estrutura codificada JSON,
retornando um objeto em Lua com os dados apropriados:
json = require(json)
o = json.decode(testString)
table.foreach(o,print)
print (Primes are:)
table.foreach(o.primes,print)
Resultado:
one
two
primes
table: 0032B928
Primes are:
1
129
callbacks
130
O primeiro argumento recebe o prprio parser. O segundo, elementName, recebe o nome do elemento (no exemplo, xhtml:div).
Na tabela de callbacks, as chaves devem possuir nomes especficos para indicar em que caso cada callback ser usado. Os
valores so funes: os callbacks.
H uma variedade de callbacks (no momento em que este artigo
foi escrito, havia quinze). Mas neste documento apenas os trs
principais sero vistos: StartElement, EndElement e CharacterData.
parser
O parser criado pela funo lxp.new(), que recebe a tabela de
callbacks como parmetro.
O parser possui diversos mtodos, sendo os principais parse()
(que processa uma string como parte do documento XML) e close() (mtodo de chamada obrigatria que fecha o parser).
O mtodo parse() deve ser chamado sem parmetros para indicar o fim do documento.
131
require lxp
132
end,
}
fd = io.input(argv[1])
for l in fd:lines() do
p:parse(l .. \n)
end
fd:close()
st, erro = p:parse()
p:close()
if not st then
print(Ocorreu o seguinte erro:, erro)
end
133
Drupal 7
e a web semntica
introduo
134
135
se a vontade for que o contedo seja visualizado de todas as formas possveis, preciso estar atento a padres de interoperabilidade e semntica. Felizmente, o sistema de gesto de contedo
Drupal j expe, no padro RDF, a informao nele armazenada.
136
O Drupal, projeto iniciado em 2000 por Dries Buytaert modestamente como um sistema de avisos para seus colegas da Universidade da Anturpia, na Blgica, evoluiu rapidamente para um
sistema completo de gesto de contedo, que conta, atualmente,
com cerca de 10 mil desenvolvedores que fazem mais de 2 mil
contribuies semanais nas diversas partes do ncleo do sistema
e mdulos adicionais. Alm disso, o Drupal sempre possibilitou a
exposio do contedo nele gerado por meio de padres, desde
a simples exportao e importao de informaes pelo uso de
feeds RSS ou Atom at a adoo do padro RDF de forma pioneira entre todos os sistemas abertos de gesto de contedo para
a web.
A resposta pergunta Por que Drupal? est intimamente conectada resposta de Por que PHP?. Por ter sido desenvolvido
em PHP, o Drupal beneficia-se de tudo o que j foi desenvolvido
nessa linguagem no que diz respeito a web semntica, como a
interface programvel RAP (Rdf Api for PHP) e outras que facilitam a criao de mdulos para o Drupal por se beneficiarem da
web semntica.
A instalao padro do Drupal, a partir de sua verso 7, j ativa
o mdulo do ncleo do sistema que especfico para tratar a
informao em um portal, expondo-a no formato RDF. Ou seja,
sequer preciso conhecer o RDF para beneficiar-se dele. Para
Note que, misturados ao cdigo HTML, h uma srie de descritores para a informao contida na pgina.
</span>
137
FOAF
FOAF so descritores de pessoas (por exemplo: name, homepage, mbox, account, based_near). No exemplo, v-se o criador do
contedo:
138
DC so os descritores de publicao (por exemplo: abstract, created, dateCopyrighted, publisher). Reparem no exemplo:
26
No momento em que este texto foi escrito, a ferramenta estava em estgio de testes, e,
mesmo sendo til para mostrar que o Drupal 7 expe as informaes no formato RDF,
alguns erros eram exibidos.
ferramentas auxiliares
139
140
concluso
Mesmo que no se queira aprofundar-se muito em todos os aspectos tcnicos que fazem parte da web semntica, ao instalar
o Drupal 7 o usurio j passa a se beneficiar dela ao expor seus
dados para pesquisa por mecanismos de buscas e outros sistemas
que podem buscar as informaes disponibilizadas.
referncias bibliogrficas
BERNERS-LEE, Tim; HENDLER, James; LASSILA, Ora. The Semantic Web.
Scientific American, maio de 2001. Disponvel em http://kill.devc.
at/system/files/scientific-american_0.pdf.
The Semantic Web and Drupal, parte 1. Disponvel em http://www.
youtube.com/watch?v=xcPf4PeF57Y.
The Semantic Web and Drupal, parte 2. Disponvel em http://www.
youtube.com/watch?v=VvEVoY0sl6o.
Semana Drupal 7 no Dicas-L. Disponvel em http://miud.in/QWk.
The Semantic Web, Linked Data and Drupal, Part 1: Expose your data
using RDF. Disponvel em http://www.ibm.com/developerworks/
The Semantic Web, Linked Data and Drupal, Part 2: Combine linked
datasets with Drupal 7 and SPARQL Views. Disponvel em http://
www.ibm.com/developerworks/library/wa-datasets/.
Potential RDF use cases for Drupal. Disponvel em http://groups.drupal.org/node/9010.
library/wa-rdf/.
141
Referncias
bibliogrficas
Fontes de material para referncias utilizadas no texto e nos artigos da comunidade PERL:
143
AGILE. Synergy Map, How to Map Out Your Current Strategy. Disponvel
em http://www.agileweboperations.com/synergy-map-how-to-mapout-your-current-strategy-part-1-of-2.
BARBUT, Marc et al. Smiologie Graphique: Les diagrammes, les rseaux,
les cartes. Paris: Gauthier-Villars.
BERNERS-LEE, Tim. Design Issues: Linked Data. Disponvel em http://
www.w3.org/DesignIssues/LinkedData.html.
FARRIS, Paul W.; BENDLE, Neil T.; PFEIFER, Phillip E. Mtricas de
marketing. So Paulo: Bookman, 2007.
PANOFSKY, Erwin. Estudos de iconologia. Lisboa: Estampa, 1995.
w3.org/2009/sparql/wiki/Main_Page.
144
Apndice
Projeto OpenData-BR
145
Na Internet:
Comunidade So Paulo Perl Mongers:
http://sao-paulo.pm.org
Projeto OpenData-BR:
http://opendatabr.org
Projetos:
Para onde foi o meu dinheiro:
http://opendatabr.org/index.php?title=Projetos:pofomd
Latitude e longitude de cidades brasileiras:
http://opendatabr.org/index.php?title=Projetos:llcb
Dataflow:
http://opendatabr.org/index.php?title=Projetos:Dataflow
146