desenvolvimento rápido de programas linha de comando
DESCRIPTION
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.TRANSCRIPT
![Page 2: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/2.jpg)
Ferramentas Linha de ComandoFerramentas Linha de Comando
● Exibição de ajuda (“help”)● Parsing de argumentos
Tradicionais
● Dispatcher● Help específico● Shell
Orientada a comandos
![Page 3: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/3.jpg)
linguagemX
ferramenta
Dicotomia do PerlDicotomia do Perl
![Page 4: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/4.jpg)
Perl como ferramenta?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 parasolucionar problemas de forma rápida e eficiente(ou deveriam usar)
![Page 5: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/5.jpg)
Problemas com Problemas com One-linersOne-liners(e pequenos programas)(e pequenos programas)
“escreva e descarte” (ou tenha pesadelos para manter)
Repetição constante
Baixa escalabilidade e flexibilidade
*cof*cof* documentação? *cof*cof*
![Page 6: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/6.jpg)
Modelo TradicionalModelo Tradicional
Getopt::Long + Pod::Usage
Eficiente para programas lineares, mas não escala bem.
![Page 7: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/7.jpg)
FrameworksFrameworks
DRY (Don't Repeat Yourself)
Flexibilidade
Escalabilidade
Documentação
Testes
![Page 8: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/8.jpg)
Command Line FrameworksCommand Line Frameworks
App::CLI
App::Cmd
CLI::Dispatch
CLI::Framework
![Page 9: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/9.jpg)
App::RadApp::Rad
![Page 10: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/10.jpg)
App::RadApp::Rad
Simples (e fácil) de instalar e usar
Leve!
Facilmente extensível
Integração com one-liners
![Page 11: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/11.jpg)
Meu primeiro programaMeu primeiro programa
use App::Rad;use App::Rad;
App::Rad->run;App::Rad->run;
![Page 12: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/12.jpg)
Meu primeiro programaMeu primeiro programa
> ./meuprog.plUsage: ./meuprog.pl command [arguments]
Available Commands: help show syntax and available commands
>
![Page 13: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/13.jpg)
Adicionando versãoAdicionando versão
use App::Rad;use App::Rad;
App::Rad->run;App::Rad->run;
![Page 14: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/14.jpg)
Adicionando versãoAdicionando versão
use App::Rad;use App::Rad;
App::Rad->run;App::Rad->run;
our $VERSION = '0.1.1-pre-alfa';our $VERSION = '0.1.1-pre-alfa';
![Page 15: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/15.jpg)
Executando novamenteExecutando novamente
> ./meuprog.plmeuprog.pl version 0.1.1prealfaUsage: ./meuprog.pl command [arguments]
Available Commands: help show syntax and available commands
> ./meuprog.pl versionmeuprog.pl version 0.1.1prealfa
>
![Page 16: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/16.jpg)
Criando ComandosCriando Comandos
use App::Rad;App::Rad>run;
sub hello { return “Hello, World!”;}
![Page 17: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/17.jpg)
Criando ComandosCriando Comandos
> ./meuprog.plUsage: ./meuprog.pl command [arguments]
Available Commands: hello help show syntax and available commands
> ./meuprog.pl helloHello, World!
>
![Page 18: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/18.jpg)
Criando Comandos Mais InteressantesCriando 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;}
![Page 19: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/19.jpg)
Criando Comandos Mais InteressantesCriando Comandos Mais Interessantes
> ./meuprog.plUsage: ./meuprog.pl command [arguments]
Available Commands: help show syntax and available commands roll roll a dice in AdX format
> ./meuprog.pl roll 3d47
>
![Page 20: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/20.jpg)
Argumentos SimplesArgumentos Simples
@ARGV
$c->options
$c->argv
$c->getopt
![Page 21: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/21.jpg)
Argumentos ExplícitosArgumentos Explícitos
sub setup { my $c = shift;
$c>register_commands({ cmd1 => { arg1 => { type => 'num', condition => sub { $_ < 3 }, required => 1, }, arg2 => { type => 'str' }, } } }}
![Page 22: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/22.jpg)
Fluxo do programaFluxo do programa
![Page 23: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/23.jpg)
Funções de ControleFunções de Controle
setup()
pre_process()
post_process()
teardown()
![Page 24: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/24.jpg)
Compartilhando dados (stash)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"; } }
![Page 25: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/25.jpg)
““include” && “exclude”include” && “exclude”
Comandos embutidos
Manipulação de one-liners!
Ambos “opt-in”
use App::Rad qw(include exclude);
![Page 26: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/26.jpg)
““include” && “exclude”include” && “exclude”
> perl e 'print “FISL!\n”'FISL!
> ./meuprog.pl include e 'print “FISL!\n”'
> ./meuprog.pl helpUsage: ./meuprog.pl command [arguments]
Available Commands: cmd1 include help exclude
![Page 27: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/27.jpg)
““include” && “exclude”include” && “exclude”
> ./meuprog.pl cmd1FISL!
(enquanto isso, em meuprog.pl...)
sub cmd1 { my $c = shift; print “FISL!\n”;}
![Page 28: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/28.jpg)
Exemplos mais convincentesExemplos 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_colunai paF, le 'splice @F,1,0,$.; $_=join “,”,@F'
e voilá!
> ./meuprog.pl adiciona_coluna planilha.csv
![Page 29: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/29.jpg)
(algumas) funções auxiliares(algumas) funções auxiliares
commands()
is_command( NOME )
register( NOME, CODEREF )
unregister( NOME )
load_config( ARQUIVO)
![Page 30: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/30.jpg)
Modo “shell” (REPL)Modo “shell” (REPL)
use App::Rad;use App::Rad;
App::Rad->run;App::Rad->run;
![Page 31: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/31.jpg)
Modo “shell” (REPL)Modo “shell” (REPL)
use App::Rad;use App::Rad;
App::Rad->shell;App::Rad->shell;
![Page 32: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/32.jpg)
Modo “shell” (REPL)Modo “shell” (REPL)
> ./meuprog.plmeuprog> helpAvailable Commands: help show syntax and available commands quit exits the program roll roll a dice in AdX formatmeuprog> roll 2d109meuprog> quit
>
![Page 33: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/33.jpg)
Plugins!Plugins!
Prontos:
● TT● ConfigLoader
Em andamento:
● Log4perl● Daemon● ...?
![Page 34: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/34.jpg)
Extensões!Extensões!
MooseX::App::RadMooseX::App::Rad
(em andamento)(em andamento)
![Page 35: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/35.jpg)
Módulos interessantes de usarMódulos interessantes de usar
Sysadm::Install
PUNC (Perl Unified Network Controller)
Net::Server
IPC::Cmd
IO::Prompt
Term::Menu
![Page 36: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/36.jpg)
Onde encontrarOnde encontrar
Código estável+documentação: CPAN
Bleeding-edge: http://github.com/garu/App-Rad/
Discussão: #app-rad em irc.perl.org
![Page 37: Desenvolvimento Rápido de Programas Linha de Comando](https://reader034.vdocuments.pub/reader034/viewer/2022050801/548f723fb47959f2248b506b/html5/thumbnails/37.jpg)
Compartilhe sua idéia!Compartilhe sua idéia!
Estaremos no stand de Perl durante todo o evento!