Desenvolvimento
Rápido de Programas
 Linha de Comando

      Breno G. de Oliveira
        breno@rio.pm.org
Ferramentas Linha de Comando

 Tradicionais
        ● Exibição de ajuda (“help”)
        ● Parsing de argumentos




 Orie...
Dicotomia do Perl



          linguagem
               X
          ferramenta
Perl como ferramenta?

 “Easy things, easy.”

 Com Perl, quase tudo é fácil ;-)

 Sysadmins e pesquisadores sabem disso
 (...
Problemas com One-liners
(e pequenos programas)


     “escreva e descarte”
     (ou tenha pesadelos para manter)

     Re...
Modelo Tradicional



      Getopt::Long + Pod::Usage



        Eficiente para programas lineares,
               mas não...
Frameworks


     DRY (Don't Repeat Yourself)

     Flexibilidade

     Escalabilidade

     Documentação

     Testes
Command Line Frameworks


     App::CLI

     App::Cmd

     CLI::Dispatch

     CLI::Framework
App::Rad
App::Rad


     Simples (e fácil) de instalar e usar

     Leve!

     Facilmente extensível

     Integração com one-line...
Meu primeiro programa



     use App::Rad;
     App::Rad->run;
Meu primeiro programa

> ./meuprog.pl
Usage: ./meuprog.pl  command [arguments]

Available Commands:
   help    show syntax...
Adicionando versão



     use App::Rad;
     App::Rad->run;
Adicionando versão



     use App::Rad;
     App::Rad->run;

     our $VERSION = '0.1.1-pre-alfa';
Executando novamente

> ./meuprog.pl
meuprog.pl version 0.1.1­pre­alfa
Usage: ./meuprog.pl  command [arguments]

Available...
Criando Comandos

  use App::Rad;
  App::Rad­>run;

  sub hello {
     return “Hello, World!”;
  }
Criando Comandos

> ./meuprog.pl
Usage: ./meuprog.pl  command [arguments]

Available Commands:
   hello
   help    show sy...
Criando Comandos Mais Interessantes
 use App::Rad;
 App::Rad­>run;

 sub roll :Help(roll a dice in AdX format) {
    my $c...
Criando Comandos Mais Interessantes

> ./meuprog.pl
Usage: ./meuprog.pl  command [arguments]

Available Commands:
   help ...
Argumentos Simples


      @ARGV

      $c->options

      $c->argv

      $c->getopt
Argumentos Explícitos

 sub setup {
      my $c = shift;

      $c­>register_commands({
            cmd1  => { arg1 => { 
...
Fluxo do programa
Funções de Controle


       setup()

       pre_process()

       post_process()

       teardown()
Compartilhando dados (stash)
       sub command {
           my $c = shift;
           my $ret = do_something();

        ...
“include” && “exclude”


   Comandos embutidos

   Manipulação de one-liners!

   Ambos “opt-in”

   use App::Rad qw(inclu...
“include” && “exclude”

  > perl ­e 'print “FISL!n”'
  FISL!

  > ./meuprog.pl include ­e 'print “FISL!n”'

  > ./meuprog....
“include” && “exclude”

  > ./meuprog.pl cmd1
  FISL!


  (enquanto isso, em meuprog.pl...)

  sub cmd1 {
     my $c = shi...
Exemplos mais convincentes

Pegamos um one-liner “místico”...

> perl ­i ­paF, ­le 'splice @F,1,0,$.;
$_=join “,”,@F'  pla...
(algumas) funções auxiliares

   commands()

   is_command( NOME )

   register( NOME, CODEREF )

   unregister( NOME )

 ...
Modo “shell” (REPL)



     use App::Rad;
     App::Rad->run;
Modo “shell” (REPL)



     use App::Rad;
     App::Rad->shell;
Modo “shell” (REPL)

> ./meuprog.pl
meuprog> help
Available Commands:
   help   show syntax and available commands
   quit...
Plugins!

      Prontos:

           ● TT
           ● ConfigLoader




      Em andamento:

           ● Log4perl
       ...
Extensões!



         MooseX::App::Rad
             (em andamento)
Módulos interessantes de usar

     Sysadm::Install

     PUNC (Perl Unified Network Controller)

     Net::Server

     I...
Onde encontrar


  Código estável+documentação: CPAN

  Bleeding-edge: http://github.com/garu/App-Rad/

  Discussão: #app-...
Compartilhe sua idéia!




       Estaremos no stand de Perl
         durante todo o evento!
Obrigado!
Dúvidas?
  breno@rio.pm.org
Upcoming SlideShare
Loading in …5
×

Desenvolvimento Rápido de Programas Linha de Comando

1,437 views

Published on

Conheça App::Rad, um moderno framework para o desenvolvimento ágil de programas linha de comando. Não perca tempo com código repetitivo, use App::Rad e concentre-se apenas no que seu programa pode oferecer de melhor.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,437
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
14
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Desenvolvimento Rápido de Programas Linha de Comando

  1. 1. Desenvolvimento Rápido de Programas Linha de Comando Breno G. de Oliveira breno@rio.pm.org
  2. 2. Ferramentas Linha de Comando Tradicionais ● Exibição de ajuda (“help”) ● Parsing de argumentos Orientada a comandos ● Dispatcher ● Help específico ● Shell
  3. 3. Dicotomia do Perl linguagem X ferramenta
  4. 4. Perl como ferramenta? “Easy things, easy.” Com Perl, quase tudo é fácil ;-) Sysadmins e pesquisadores sabem disso (ou deveriam saber) ...e usam Perl diariamente como ferramenta para solucionar problemas de forma rápida e eficiente (ou deveriam usar)
  5. 5. Problemas com One-liners (e pequenos programas) “escreva e descarte” (ou tenha pesadelos para manter) Repetição constante Baixa escalabilidade e flexibilidade *cof*cof* documentação? *cof*cof*
  6. 6. Modelo Tradicional Getopt::Long + Pod::Usage Eficiente para programas lineares, mas não escala bem.
  7. 7. Frameworks DRY (Don't Repeat Yourself) Flexibilidade Escalabilidade Documentação Testes
  8. 8. Command Line Frameworks App::CLI App::Cmd CLI::Dispatch CLI::Framework
  9. 9. App::Rad
  10. 10. App::Rad Simples (e fácil) de instalar e usar Leve! Facilmente extensível Integração com one-liners
  11. 11. Meu primeiro programa use App::Rad; App::Rad->run;
  12. 12. Meu primeiro programa > ./meuprog.pl Usage: ./meuprog.pl  command [arguments] Available Commands:    help show syntax and available commands >
  13. 13. Adicionando versão use App::Rad; App::Rad->run;
  14. 14. Adicionando versão use App::Rad; App::Rad->run; our $VERSION = '0.1.1-pre-alfa';
  15. 15. Executando novamente > ./meuprog.pl meuprog.pl version 0.1.1­pre­alfa Usage: ./meuprog.pl  command [arguments] Available Commands:    help show syntax and available commands > ./meuprog.pl ­­version meuprog.pl version 0.1.1­pre­alfa >
  16. 16. Criando Comandos use App::Rad; App::Rad­>run; sub hello {    return “Hello, World!”; }
  17. 17. Criando Comandos > ./meuprog.pl Usage: ./meuprog.pl  command [arguments] Available Commands:    hello    help show syntax and available commands > ./meuprog.pl hello Hello, World! >
  18. 18. Criando Comandos Mais Interessantes use App::Rad; App::Rad­>run; sub roll :Help(roll a dice in AdX format) {    my $c = shift;    my $value = 0;    if ( $c­>argv­>[0] =~ m{(d+)d(d+)} ) {       for (1..$1) {          $value += int(rand($2) + 1);       }    }    return $value; }
  19. 19. Criando Comandos Mais Interessantes > ./meuprog.pl Usage: ./meuprog.pl  command [arguments] Available Commands:    help   show syntax and available commands    roll   roll a dice in AdX format > ./meuprog.pl  roll  3d4 7 >
  20. 20. Argumentos Simples @ARGV $c->options $c->argv $c->getopt
  21. 21. Argumentos Explícitos sub setup {      my $c = shift;      $c­>register_commands({            cmd1  => { arg1 => {                             type      => 'num',                            condition => sub { $_ < 3 },                            required  => 1,                       },                       arg2 => {                            type      => 'str'                       },                     }            }     } }
  22. 22. Fluxo do programa
  23. 23. Funções de Controle setup() pre_process() post_process() teardown()
  24. 24. Compartilhando dados (stash) sub command { my $c = shift; my $ret = do_something(); if ( $ret =~ /critical error/ ) { $c->stash->{mail} = 1; } return $ret; } sub post_process { my $c = shift; if ( $c->stash->{mail} ) { # send email alert... } else { print $c->output . "n"; } }
  25. 25. “include” && “exclude” Comandos embutidos Manipulação de one-liners! Ambos “opt-in” use App::Rad qw(include exclude);
  26. 26. “include” && “exclude” > perl ­e 'print “FISL!n”' FISL! > ./meuprog.pl include ­e 'print “FISL!n”' > ./meuprog.pl help Usage: ./meuprog.pl command [arguments] Available Commands:    cmd1    include    help    exclude
  27. 27. “include” && “exclude” > ./meuprog.pl cmd1 FISL! (enquanto isso, em meuprog.pl...) sub cmd1 {    my $c = shift;    print “FISL!n”; }
  28. 28. Exemplos mais convincentes Pegamos um one-liner “místico”... > perl ­i ­paF, ­le 'splice @F,1,0,$.; $_=join “,”,@F'  planilha.csv Fazemos uma substituição simples... > ./meuprog.pl include adiciona_coluna ­i ­paF, ­le 'splice @F,1,0,$.; $_=join “,”,@F' e voilá! > ./meuprog.pl  adiciona_coluna  planilha.csv
  29. 29. (algumas) funções auxiliares commands() is_command( NOME ) register( NOME, CODEREF ) unregister( NOME ) load_config( ARQUIVO)
  30. 30. Modo “shell” (REPL) use App::Rad; App::Rad->run;
  31. 31. Modo “shell” (REPL) use App::Rad; App::Rad->shell;
  32. 32. Modo “shell” (REPL) > ./meuprog.pl meuprog> help Available Commands:    help   show syntax and available commands    quit   exits the program    roll   roll a dice in AdX format meuprog> roll 2d10 9 meuprog> quit >
  33. 33. Plugins! Prontos: ● TT ● ConfigLoader Em andamento: ● Log4perl ● Daemon ● ...?
  34. 34. Extensões! MooseX::App::Rad (em andamento)
  35. 35. Módulos interessantes de usar Sysadm::Install PUNC (Perl Unified Network Controller) Net::Server IPC::Cmd IO::Prompt Term::Menu
  36. 36. Onde encontrar Código estável+documentação: CPAN Bleeding-edge: http://github.com/garu/App-Rad/ Discussão: #app-rad em irc.perl.org
  37. 37. Compartilhe sua idéia! Estaremos no stand de Perl durante todo o evento!
  38. 38. Obrigado! Dúvidas? breno@rio.pm.org

×