SlideShare ist ein Scribd-Unternehmen logo
1 von 37
Downloaden Sie, um offline zu lesen
DataFlow


Como Fazer Fluxos de Dados
   Facilmente em Perl



 Alexei “Russo” Znamensky
     russoz@cpan.org
História
“Hack de Dados Públicos” como idéia de
tema para o Equinócio de Março/2011 da
São Paulo Perl Mongers


Projeto OpenData-BR



Idéias transformadas em código
OpenData: O Começo

Scripts para buscar, transformar e publicar
dados públicos


Portal da Transparência do Gov.BR


Módulos para facilitar a criação de scripts
OpenData: O Fim

Prover um framework que promova os
conceitos de “OpenData”


Permita às pessoas analisar e manipular
dados públicos
E o meio?

Várias APIs e frameworks para várias
tarefas diferentes


Novos projetos sempre levam a muito
(re-)trabalho de codificação
   –   Isso pode ser bom
   –   Isso pode ser ruim
E o meio?

Várias APIs e frameworks para várias
tarefas diferentes


Novos projetos sempre levam a muito
(re-)trabalho de codificação
   –   Isso pode ser bom (APROVEITAR!)
   –   Isso pode ser ruim (EVITAR!)
E o meio?
A seqüência de passos usual é muito
parecida na maior parte das vezes, mas ...
... não queremos “engessar” o modelo, é
preciso ter flexibilidade para mudarmos as
coisas, afinal ...
“there is more than one way to do it”
(TIMTOWTDI => Tim Toady!), mas
“but sometimes consistency is not a bad
thing either”
(BSCINABTE => Bicarbonate!)
O Meio Precisa
Prover um modelo de tratamento de
dados que seja:
   –   Simples
   –   (Facilmente) Customizável
   –   (Facilmente) Extensível
   –   (Facilmente) Utilizável
   –   (Facilmente) Re-utilizável
O que por no Meio?




   O que precisamos?
Algo Simples
Algo que:
Simplesmente funcione
Permita códigos sofisticados com pouco
tempo de aprendizado
Permita códigos poderosos com poucas
linhas de código
Possua várias funcionalidades já prontas
para serem usadas
Algo Customizável
Permita encaixar peças, como no Linux
( cat file | grep foo | sort | uniq )


Permita montar “scripts”, como no Linux


“Defaults” razoáveis, mas que possam ser
manipulados
Algo Extensível
Permita criar peças novas


Para caso único, específico, ou ...


... um componente novo (“black box”) que
possa ser usado pelos outros
Algo Utilizável
Não seja necessário “programar”, no
sentido test/loop/variáveis da palavra


Criação de fluxos definidos por arquivos
de configuração ...


... que poderiam ser criados por interfaces
gráficas/web, por leigos
Algo Re-Utilizável
Fluxos de dados que possam ser
utilizados em outros fluxos (sub-fluxos?)


Fluxos disponibilizados como:
    –   Programas (linha de comando)
    –   Sistemas acessados pela Web
    –   Web Services? <Buzzword> Services?
    –   Consumidores/Produtores de filas de
         mensagens?
Caixinhas Mutantes
Projeto OpenData-BR [Dez '10]
   –   pacotes OpenData::AZ::Box*
   –   pacotes OpenData::Flow::*


Projeto DataFlow
   –   pacotes DataFlow::Node::* [Fev '10]
   –   pacotes DataFlow::* [Mar '10]


Projeto EM ANDAMENTO!!!
Em Perl
Projeto nasceu na comunidade Perl
Perl sempre foi a melhor linguagem para a
manipulação de textos
Boas práticas de desenvolvimento
Cultura de testes muito forte
Comunidade
É divertido :-)
DataFlow
DataFlow
Em termos de Perl, precisamos
Show me The Code!!
Um Fluxo Simples
Um fluxo de dados

my $flow = DataFlow->new(
    procs => [
        sub {
            return uc(shift);
        },
        sub {
            return scalar reverse(shift);
        },
    ],
);
Um Fluxo Simples
Usando:
$flow->input('batatas', 'bananas');
print $flow->output();
print $flow->output();

# ou, de outra forma

print join “n”,
    $flow->process('batatas', 'bananas');


Resultado:
SATATAB
SANANAB
Mais Que Subs
Cada “sub” do fluxo torna-se um objeto do
tipo DataFlow::Proc, um “Processador”
my $flow = DataFlow->new(
    procs => [
        DataFlow::Proc->new(
            p => sub {
                return uc(shift);
            },
        ),
        DataFlow::Proc->new(
            p => sub {
                return scalar reverse(shift);
            },
        ),
    ],
);
Debaixo Dos Caracóis
DataFlow::Proc
   –   Recebe um scalar e devolve uma lista
        (com zero ou mais elementos)


DataFlow
   –   Array de Procs, com filas entre si, para
        “bufferizar” o consumo dos dados


Em Moose: um sistema de objetos pós-
moderno para Perl
Criando Processadores
Quando:
   –   Uma mesma “sub” é utilizada com muita
        freqüência
   –   Se quer fazer uma “sub” parametrizada e
        que possa ser reutilizada
   –   Existe uma necessidade semântica de dar
        um nome a um tipo de rotina
Criando Processadores
My/Proc/CSV.pm
package My::Proc::CSV;

use Moose; extends 'DataFlow::Proc';

has 'csv' => ( isa => 'Text::CSV' );

has '+p' => (
    'default' => sub {
        my $self = shift;
        return sub {
            return $self->csv->parse(shift);
        }
    },
);
E Fluxos
My/Flow/Weird.pm
package My::Flow::Weird;

use Moose; extends 'DataFlow';

has '+procs' => (
    'default' => sub {
        return [
            sub { return uc(shift) },
            sub { scalar reverse(shift) },
        ];
    },
);
Para Dentro!
DataFlow dentro de um Proc ou de outro
Flow, e vice-versas:

my $flow = DataFlow->new(
    procs => [
        My::Flow::Weird->new(),   # um flow
        My::Proc::CSV->new(),     # um proc
    ],
);
(Alguns dos) Procs Prontos
Alguns Procs disponíveis:
     CSV
           processar “de” e “para” conteúdo .csv
     URLRetriever
           busca páginas/arquivos da web
     HTMLFilter
           filtro para conteúdo HTML
     SimpleFileInput/SimpleFileOutput
           leitura/escrita de arquivos
     Encoding (em finalização)
           mudar codificações de caracteres
Extração de Dados (Scrape)
Exemplo no repositório do DataFlow, no
arquivo ceis.pl:
   –   http://bit.ly/kyJLXx
Próximas Melhorias
Meta-dados no fluxo


Mais Procs Prontas
   –   Split e Join de fluxos
   –   Acesso a banco de dados
   –   Execução de comando externo
   –   OCR (reconhecimento de caracteres)
   –   XML => RDF
   –   JSON
Próximas Melhorias
Construção de DataFlow a partir de uma
configuração em texto:
   –   YAML, JSON, XML, etc...


Paralelismo
   –   Processos, threads


Mecanismo de log de mensagens
Referências DataFlow
Repositório
     http://github.com/russoz/DataFlow


CPAN
     http://search.cpan.org/perldoc?DataFlow


Testers Matrix
     http://www.cpantesters.org/distro/D/DataFlow
Referências OpenData
OpenData-BR
       http://opendatabr.org/


Portal da Transparência do Gov.BR
   –   http://www.portaltransparencia.gov.br/
Ref. Desenvolvimento
git
          http://git-scm.com/
          http://github.com
Moose
          http://www.iinteractive.com/moose/
Dist::Zilla
          http://dzil.org/
git flow
      –   http://bit.ly/9bUvdC
Muito Obrigado!


   Thank You!


Большое Спасибо!
Customização & Extensão
●   Podemos montar “flows” arbitrariamente
    grandes e...
●   ... colocar coisas arbitrariamente
    complexas nos “procs”.
●   Podemos estender ou agregar um (ou
    mais) DataFlow a outro código.
Demo
●   ceis.pl

Weitere ähnliche Inhalte

Was ist angesagt?

ParallaDB - Framework de Persistência Android e Desktop
ParallaDB - Framework de Persistência Android e DesktopParallaDB - Framework de Persistência Android e Desktop
ParallaDB - Framework de Persistência Android e DesktopMichel Montenegro
 
De Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações MashupDe Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações MashupWagner Roberto dos Santos
 
Nova Infraestrutura JSON: System.JSON na prática
Nova Infraestrutura JSON: System.JSON na prática Nova Infraestrutura JSON: System.JSON na prática
Nova Infraestrutura JSON: System.JSON na prática Mario Guedes
 
Dsi 015 - poo e php - conexão com bancos de dados usando pdo
Dsi   015 - poo e php - conexão com bancos de dados usando pdoDsi   015 - poo e php - conexão com bancos de dados usando pdo
Dsi 015 - poo e php - conexão com bancos de dados usando pdoJorge Luís Gregório
 
Curso mongo db com php
Curso mongo db com phpCurso mongo db com php
Curso mongo db com phpSuissa
 
Exemplos de uso de apache spark usando aws elastic map reduce
Exemplos de uso de apache spark usando aws elastic map reduceExemplos de uso de apache spark usando aws elastic map reduce
Exemplos de uso de apache spark usando aws elastic map reduceFelipe
 
Linux - Instalação de Programas
Linux - Instalação de ProgramasLinux - Instalação de Programas
Linux - Instalação de ProgramasFrederico Madeira
 
Skytools, pgbouncer e plproxy
Skytools, pgbouncer e plproxySkytools, pgbouncer e plproxy
Skytools, pgbouncer e plproxyFernando Ike
 
Aumente a performance de seu site de maneira disciplinada
Aumente a performance de seu site de maneira disciplinadaAumente a performance de seu site de maneira disciplinada
Aumente a performance de seu site de maneira disciplinadaHenrique Lima
 
Aula03 PHP - Estruturas Condicionais
Aula03 PHP - Estruturas CondicionaisAula03 PHP - Estruturas Condicionais
Aula03 PHP - Estruturas CondicionaisDaniel Brandão
 
Consumindo dados via web service no android
Consumindo dados via web service no androidConsumindo dados via web service no android
Consumindo dados via web service no androidAlexandre Antunes
 
noSQL com CouchDb e PHP
noSQL com CouchDb e PHPnoSQL com CouchDb e PHP
noSQL com CouchDb e PHPTheoziran Lima
 
Aula PIT 3 - Ambientes
Aula PIT 3 - AmbientesAula PIT 3 - Ambientes
Aula PIT 3 - AmbientesDirceu Belém
 
Novidades do elasticsearch 2.0 e como usá-lo com PHP
Novidades do elasticsearch 2.0 e como usá-lo com PHPNovidades do elasticsearch 2.0 e como usá-lo com PHP
Novidades do elasticsearch 2.0 e como usá-lo com PHPLuiz Henrique Zambom Santana
 
Apache CouchDB
Apache CouchDBApache CouchDB
Apache CouchDBHugo Souza
 

Was ist angesagt? (20)

Mongo + php
Mongo + phpMongo + php
Mongo + php
 
ParallaDB - Framework de Persistência Android e Desktop
ParallaDB - Framework de Persistência Android e DesktopParallaDB - Framework de Persistência Android e Desktop
ParallaDB - Framework de Persistência Android e Desktop
 
De Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações MashupDe Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações Mashup
 
Nova Infraestrutura JSON: System.JSON na prática
Nova Infraestrutura JSON: System.JSON na prática Nova Infraestrutura JSON: System.JSON na prática
Nova Infraestrutura JSON: System.JSON na prática
 
Dsi 015 - poo e php - conexão com bancos de dados usando pdo
Dsi   015 - poo e php - conexão com bancos de dados usando pdoDsi   015 - poo e php - conexão com bancos de dados usando pdo
Dsi 015 - poo e php - conexão com bancos de dados usando pdo
 
Curso mongo db com php
Curso mongo db com phpCurso mongo db com php
Curso mongo db com php
 
MongoDB + PHP
MongoDB + PHPMongoDB + PHP
MongoDB + PHP
 
Exemplos de uso de apache spark usando aws elastic map reduce
Exemplos de uso de apache spark usando aws elastic map reduceExemplos de uso de apache spark usando aws elastic map reduce
Exemplos de uso de apache spark usando aws elastic map reduce
 
Linux - Instalação de Programas
Linux - Instalação de ProgramasLinux - Instalação de Programas
Linux - Instalação de Programas
 
Skytools, pgbouncer e plproxy
Skytools, pgbouncer e plproxySkytools, pgbouncer e plproxy
Skytools, pgbouncer e plproxy
 
Doctrine for Dummies
Doctrine for DummiesDoctrine for Dummies
Doctrine for Dummies
 
Aumente a performance de seu site de maneira disciplinada
Aumente a performance de seu site de maneira disciplinadaAumente a performance de seu site de maneira disciplinada
Aumente a performance de seu site de maneira disciplinada
 
Aula03 PHP - Estruturas Condicionais
Aula03 PHP - Estruturas CondicionaisAula03 PHP - Estruturas Condicionais
Aula03 PHP - Estruturas Condicionais
 
Consumindo dados via web service no android
Consumindo dados via web service no androidConsumindo dados via web service no android
Consumindo dados via web service no android
 
noSQL com CouchDb e PHP
noSQL com CouchDb e PHPnoSQL com CouchDb e PHP
noSQL com CouchDb e PHP
 
Vagrant + Puppet
Vagrant + PuppetVagrant + Puppet
Vagrant + Puppet
 
Aula PIT 3 - Ambientes
Aula PIT 3 - AmbientesAula PIT 3 - Ambientes
Aula PIT 3 - Ambientes
 
Novidades do elasticsearch 2.0 e como usá-lo com PHP
Novidades do elasticsearch 2.0 e como usá-lo com PHPNovidades do elasticsearch 2.0 e como usá-lo com PHP
Novidades do elasticsearch 2.0 e como usá-lo com PHP
 
Apache CouchDB
Apache CouchDBApache CouchDB
Apache CouchDB
 
Zope
ZopeZope
Zope
 

Ähnlich wie Palestra DataFlow - II São Paulo Perl Workshop

Semana Acadêmica ICET - Feevale - 12/04/2014
Semana Acadêmica ICET - Feevale - 12/04/2014Semana Acadêmica ICET - Feevale - 12/04/2014
Semana Acadêmica ICET - Feevale - 12/04/2014Getup Cloud
 
Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Fabrízio Mello
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPArlindo Santos
 
Tecnologias para mineração de dados nas nuvens
Tecnologias para mineração de dados nas nuvensTecnologias para mineração de dados nas nuvens
Tecnologias para mineração de dados nas nuvensAlessandro Binhara
 
Tendências do Mercado de Internet
Tendências do Mercado de InternetTendências do Mercado de Internet
Tendências do Mercado de InternetVanessa Oliveira
 
SAPO Broker
SAPO BrokerSAPO Broker
SAPO Brokercodebits
 
Big data para programadores convencionais
Big data para programadores convencionaisBig data para programadores convencionais
Big data para programadores convencionaisRoberto Oliveira
 
Comandos gerais do PHP
Comandos gerais do PHPComandos gerais do PHP
Comandos gerais do PHPPaulo Dayvson
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2PrinceGuru MS
 
Python Brasil 2020 - Desmitificando pipeline de dados com Python: o que apren...
Python Brasil 2020 - Desmitificando pipeline de dados com Python: o que apren...Python Brasil 2020 - Desmitificando pipeline de dados com Python: o que apren...
Python Brasil 2020 - Desmitificando pipeline de dados com Python: o que apren...Affinitas GmbH
 
PHPMyadmin - Introdução
PHPMyadmin - IntroduçãoPHPMyadmin - Introdução
PHPMyadmin - IntroduçãoMarco Pinheiro
 
Artigo data warehouse bd ii - 2015-1
Artigo data warehouse   bd ii - 2015-1Artigo data warehouse   bd ii - 2015-1
Artigo data warehouse bd ii - 2015-1Darlene Coelho
 
Artigo data warehouse bd ii - 2015-1 a
Artigo data warehouse   bd ii - 2015-1 aArtigo data warehouse   bd ii - 2015-1 a
Artigo data warehouse bd ii - 2015-1 aDarlene Coelho
 
3260 php truquesmagicos %281%29
3260 php truquesmagicos %281%293260 php truquesmagicos %281%29
3260 php truquesmagicos %281%29Juliana Nascimento
 

Ähnlich wie Palestra DataFlow - II São Paulo Perl Workshop (20)

De 1 a 1.000.00 de usuários
De 1 a 1.000.00 de usuáriosDe 1 a 1.000.00 de usuários
De 1 a 1.000.00 de usuários
 
Semana Acadêmica ICET - Feevale - 12/04/2014
Semana Acadêmica ICET - Feevale - 12/04/2014Semana Acadêmica ICET - Feevale - 12/04/2014
Semana Acadêmica ICET - Feevale - 12/04/2014
 
Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012Oficina PostgreSQL Básico Latinoware 2012
Oficina PostgreSQL Básico Latinoware 2012
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHP
 
Tecnologias para mineração de dados nas nuvens
Tecnologias para mineração de dados nas nuvensTecnologias para mineração de dados nas nuvens
Tecnologias para mineração de dados nas nuvens
 
Tendências do Mercado de Internet
Tendências do Mercado de InternetTendências do Mercado de Internet
Tendências do Mercado de Internet
 
Cakephp 2.0 - O que mudou
Cakephp 2.0 - O que mudouCakephp 2.0 - O que mudou
Cakephp 2.0 - O que mudou
 
Crud
CrudCrud
Crud
 
SAPO Broker
SAPO BrokerSAPO Broker
SAPO Broker
 
Big data para programadores convencionais
Big data para programadores convencionaisBig data para programadores convencionais
Big data para programadores convencionais
 
Comandos gerais do PHP
Comandos gerais do PHPComandos gerais do PHP
Comandos gerais do PHP
 
Introdução Ruby 1.8.7 + Rails 3
Introdução Ruby 1.8.7 + Rails 3Introdução Ruby 1.8.7 + Rails 3
Introdução Ruby 1.8.7 + Rails 3
 
Oficial
OficialOficial
Oficial
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
 
Python Brasil 2020 - Desmitificando pipeline de dados com Python: o que apren...
Python Brasil 2020 - Desmitificando pipeline de dados com Python: o que apren...Python Brasil 2020 - Desmitificando pipeline de dados com Python: o que apren...
Python Brasil 2020 - Desmitificando pipeline de dados com Python: o que apren...
 
PHPMyadmin - Introdução
PHPMyadmin - IntroduçãoPHPMyadmin - Introdução
PHPMyadmin - Introdução
 
Artigo data warehouse bd ii - 2015-1
Artigo data warehouse   bd ii - 2015-1Artigo data warehouse   bd ii - 2015-1
Artigo data warehouse bd ii - 2015-1
 
Artigo data warehouse bd ii - 2015-1 a
Artigo data warehouse   bd ii - 2015-1 aArtigo data warehouse   bd ii - 2015-1 a
Artigo data warehouse bd ii - 2015-1 a
 
3260 php truquesmagicos %281%29
3260 php truquesmagicos %281%293260 php truquesmagicos %281%29
3260 php truquesmagicos %281%29
 
3260 php truquesmagicos
3260 php truquesmagicos3260 php truquesmagicos
3260 php truquesmagicos
 

Kürzlich hochgeladen

ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx2m Assessoria
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsDanilo Pinotti
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploDanilo Pinotti
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx2m Assessoria
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx2m Assessoria
 

Kürzlich hochgeladen (6)

ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 

Palestra DataFlow - II São Paulo Perl Workshop

  • 1. DataFlow Como Fazer Fluxos de Dados Facilmente em Perl Alexei “Russo” Znamensky russoz@cpan.org
  • 2. História “Hack de Dados Públicos” como idéia de tema para o Equinócio de Março/2011 da São Paulo Perl Mongers Projeto OpenData-BR Idéias transformadas em código
  • 3. OpenData: O Começo Scripts para buscar, transformar e publicar dados públicos Portal da Transparência do Gov.BR Módulos para facilitar a criação de scripts
  • 4. OpenData: O Fim Prover um framework que promova os conceitos de “OpenData” Permita às pessoas analisar e manipular dados públicos
  • 5. E o meio? Várias APIs e frameworks para várias tarefas diferentes Novos projetos sempre levam a muito (re-)trabalho de codificação – Isso pode ser bom – Isso pode ser ruim
  • 6. E o meio? Várias APIs e frameworks para várias tarefas diferentes Novos projetos sempre levam a muito (re-)trabalho de codificação – Isso pode ser bom (APROVEITAR!) – Isso pode ser ruim (EVITAR!)
  • 7. E o meio? A seqüência de passos usual é muito parecida na maior parte das vezes, mas ... ... não queremos “engessar” o modelo, é preciso ter flexibilidade para mudarmos as coisas, afinal ... “there is more than one way to do it” (TIMTOWTDI => Tim Toady!), mas “but sometimes consistency is not a bad thing either” (BSCINABTE => Bicarbonate!)
  • 8. O Meio Precisa Prover um modelo de tratamento de dados que seja: – Simples – (Facilmente) Customizável – (Facilmente) Extensível – (Facilmente) Utilizável – (Facilmente) Re-utilizável
  • 9. O que por no Meio? O que precisamos?
  • 10. Algo Simples Algo que: Simplesmente funcione Permita códigos sofisticados com pouco tempo de aprendizado Permita códigos poderosos com poucas linhas de código Possua várias funcionalidades já prontas para serem usadas
  • 11. Algo Customizável Permita encaixar peças, como no Linux ( cat file | grep foo | sort | uniq ) Permita montar “scripts”, como no Linux “Defaults” razoáveis, mas que possam ser manipulados
  • 12. Algo Extensível Permita criar peças novas Para caso único, específico, ou ... ... um componente novo (“black box”) que possa ser usado pelos outros
  • 13. Algo Utilizável Não seja necessário “programar”, no sentido test/loop/variáveis da palavra Criação de fluxos definidos por arquivos de configuração ... ... que poderiam ser criados por interfaces gráficas/web, por leigos
  • 14. Algo Re-Utilizável Fluxos de dados que possam ser utilizados em outros fluxos (sub-fluxos?) Fluxos disponibilizados como: – Programas (linha de comando) – Sistemas acessados pela Web – Web Services? <Buzzword> Services? – Consumidores/Produtores de filas de mensagens?
  • 15. Caixinhas Mutantes Projeto OpenData-BR [Dez '10] – pacotes OpenData::AZ::Box* – pacotes OpenData::Flow::* Projeto DataFlow – pacotes DataFlow::Node::* [Fev '10] – pacotes DataFlow::* [Mar '10] Projeto EM ANDAMENTO!!!
  • 16. Em Perl Projeto nasceu na comunidade Perl Perl sempre foi a melhor linguagem para a manipulação de textos Boas práticas de desenvolvimento Cultura de testes muito forte Comunidade É divertido :-)
  • 18. DataFlow Em termos de Perl, precisamos
  • 19. Show me The Code!!
  • 20. Um Fluxo Simples Um fluxo de dados my $flow = DataFlow->new( procs => [ sub { return uc(shift); }, sub { return scalar reverse(shift); }, ], );
  • 21. Um Fluxo Simples Usando: $flow->input('batatas', 'bananas'); print $flow->output(); print $flow->output(); # ou, de outra forma print join “n”, $flow->process('batatas', 'bananas'); Resultado: SATATAB SANANAB
  • 22. Mais Que Subs Cada “sub” do fluxo torna-se um objeto do tipo DataFlow::Proc, um “Processador” my $flow = DataFlow->new( procs => [ DataFlow::Proc->new( p => sub { return uc(shift); }, ), DataFlow::Proc->new( p => sub { return scalar reverse(shift); }, ), ], );
  • 23. Debaixo Dos Caracóis DataFlow::Proc – Recebe um scalar e devolve uma lista (com zero ou mais elementos) DataFlow – Array de Procs, com filas entre si, para “bufferizar” o consumo dos dados Em Moose: um sistema de objetos pós- moderno para Perl
  • 24. Criando Processadores Quando: – Uma mesma “sub” é utilizada com muita freqüência – Se quer fazer uma “sub” parametrizada e que possa ser reutilizada – Existe uma necessidade semântica de dar um nome a um tipo de rotina
  • 25. Criando Processadores My/Proc/CSV.pm package My::Proc::CSV; use Moose; extends 'DataFlow::Proc'; has 'csv' => ( isa => 'Text::CSV' ); has '+p' => ( 'default' => sub { my $self = shift; return sub { return $self->csv->parse(shift); } }, );
  • 26. E Fluxos My/Flow/Weird.pm package My::Flow::Weird; use Moose; extends 'DataFlow'; has '+procs' => ( 'default' => sub { return [ sub { return uc(shift) }, sub { scalar reverse(shift) }, ]; }, );
  • 27. Para Dentro! DataFlow dentro de um Proc ou de outro Flow, e vice-versas: my $flow = DataFlow->new( procs => [ My::Flow::Weird->new(), # um flow My::Proc::CSV->new(), # um proc ], );
  • 28. (Alguns dos) Procs Prontos Alguns Procs disponíveis: CSV processar “de” e “para” conteúdo .csv URLRetriever busca páginas/arquivos da web HTMLFilter filtro para conteúdo HTML SimpleFileInput/SimpleFileOutput leitura/escrita de arquivos Encoding (em finalização) mudar codificações de caracteres
  • 29. Extração de Dados (Scrape) Exemplo no repositório do DataFlow, no arquivo ceis.pl: – http://bit.ly/kyJLXx
  • 30. Próximas Melhorias Meta-dados no fluxo Mais Procs Prontas – Split e Join de fluxos – Acesso a banco de dados – Execução de comando externo – OCR (reconhecimento de caracteres) – XML => RDF – JSON
  • 31. Próximas Melhorias Construção de DataFlow a partir de uma configuração em texto: – YAML, JSON, XML, etc... Paralelismo – Processos, threads Mecanismo de log de mensagens
  • 32. Referências DataFlow Repositório http://github.com/russoz/DataFlow CPAN http://search.cpan.org/perldoc?DataFlow Testers Matrix http://www.cpantesters.org/distro/D/DataFlow
  • 33. Referências OpenData OpenData-BR http://opendatabr.org/ Portal da Transparência do Gov.BR – http://www.portaltransparencia.gov.br/
  • 34. Ref. Desenvolvimento git http://git-scm.com/ http://github.com Moose http://www.iinteractive.com/moose/ Dist::Zilla http://dzil.org/ git flow – http://bit.ly/9bUvdC
  • 35. Muito Obrigado! Thank You! Большое Спасибо!
  • 36. Customização & Extensão ● Podemos montar “flows” arbitrariamente grandes e... ● ... colocar coisas arbitrariamente complexas nos “procs”. ● Podemos estender ou agregar um (ou mais) DataFlow a outro código.
  • 37. Demo ● ceis.pl