Pesquisar este blog

quarta-feira, 13 de novembro de 2019

A delicada situação dos bancos (Itaú, BB, Bradesco, Caixa, Santander) frente a evolução tecnológica e o avanço dos bancos digitais.

A delicada situação dos bancos (Itaú, BB, Bradesco, Caixa, Santander) frente a evolução tecnológica e o avanço dos bancos digitais

O problema não é o mainframe, são os processos!

Tudo isso porque li uma matéria do Itaú...

https://economia.estadao.com.br/noticias/negocios,transformacao-com-fintechs-nos-angustia-toda-noite-diz-setubal,70002995258

Do nada me chega essa daqui abaixo (atualizado em 11.10.2019)

https://valor.globo.com/opiniao/coluna/o-principio-do-fim-para-os-grandes-bancos.ghtml

Segue meu texto original


De uma aula introdutória de economia lá nos idos de 1998 tomei conhecimento da ameaça de novos entrantes, nunca estudei a fundo, longe disso, mas as ideias do Michel Porter - esse das 5 forças e o famoso 4 P consegui pegar o principio, na minha Pós em Negocios Financeiros uns anos depois tive contato novamente e por vezes me deparei com o cenário! Eu mesmo já fui um novo entrante quando montamos a fábrica de rodinhas e shapes de skate. Bom, introdução feita, seguem os comentários...

Esses dias mesmo me peguei fazendo uma conta de padaria para estimar os valores desembolsados pelos bancos para a IBM, isso sempre foi uma barreira para a entrada de novos "players" no mercado... Você não poderia ter banco há alguns anos sem o processamento mega hiper blaster e sem igual de um mainframe! E isso amiguinho era muito caro, digo, é muito caro! Voltando a conta de padaria, não tenho os dados mas chuto que os top 4 (BB, ITAÚ, BRADESCO, CAIXA) devam ter algo perto de meio milhão de MIPS instalado cada um, isso em valores atuais deve ser algo em torno de uns 2.5 bilhões de reais - CAPEX como chamam os entendidos - e isso é só o valor pra comprar os computadores!!! Depois tem um valor mensal pelo uso (tanto dos softwares como do hardware), no mês eu chuto mais uns 30 milhões pra IBM desembolsados por cada um. Esse valor de largada inviabiliza qualquer tentativa de se abrir um banco! Ah, mas esses são os top 4, beleza pega o Santander que é o quinto - não lembro de cabeça e se sair para procurar perco a linha do raciocínio - mas ele gastou alguns bilhões pra montar o data Center aqui do lado de casa, o Itaú idem com Mogi. É um rio de dinheiro! Enfim, quero reafirmar que você não conseguia abrir um banco sem um mainframe.

Alguma coisa mudou, na década de 90 a "baixa plataforma" iria acabar com o mainframe, foram feitas algumas tentativas de migração de mainframe pra micro computador mas não era nem de longe alguém querendo abrir um banco eram os próprios bancos tentando reduzir a conta para com um grande sócio, a IBM. Resumo, não deu certo a capacidade de processamento estava muito aquém do necessário.

Alguma coisa mudou 2. Tudo evolui, o mainframe evoluiu, os micros também...

Sem falar em armazenamento!

Quando vi um mainframe pelo primeira vez me vi dentro de um microcomputador! Entende-se mainframe aqui como o andar inteiro onde ficava todo o aparato tecnológico necessário para o seu pleno funcionamento.

Bom, estou falando de armazenamento, pois bem, estava em desativação uma "colmeia", basicamente era um grande depósito de fitas magnéticas, um conjunto de módulos acoplados (acho que eram 12 no total) com um robô que se encarregava de pegar as fitas e carrega-las em disco quando alguém solicitava um arquivo que estava gravado em alguma das milhares de fitas que la estavam. Sabe a capacidade dessa colmeia ? 10 teras, o mesmo que a capacidade de 10 celulares top de linha da Samsung hoje!

A última vez que li as especificações de um mainframe lembro de algo que me chamou a atenção... Não é o objetivo, nunca foi, mas adaptou-se e o mainframe hoje (um único mainframe) consegue sozinho rodar algo em torno de 10.000 máquinas/servidores Linux, é algo assombroso pra uma máquina que tem o tamanho de uma geladeira de americano de duas portas, eu desconheço por completo como que a IBM comercializa isso, você ter um mainframe pra rodar Linux, mas existe e é muito legal para comparação.

Hoje é possível criar essa mesma quantidade de servidores/máquinas na Amazon/Google/ ou mesmo na própria IBM sem ter que desembolsar nada de investimento inicial, paga-se apenas o que usar!

O que aconteceu de mágico ? Nada!

Não foi algo disruptivo como afirmam, foi apenas uma evolução natural da tecnologia...

O que antes era uma vantagem competitiva e barreira a novos entrantes se tornou um dos maiores pesadelos dos grandes bancos, o mainframe!

É um baita dinheiro que se paga para a IBM, mas o processamento em PCs (bare metal, virtualizados, nuvem ou o que quer que seja) para os volumes que os grandes bancos possuem não fica muito mais barato a ponto de valer a pena monetariamente, mas mesmo assim eles estão caminhando para a transformação que pode significar sua derrocada em menos de uma década.

Para quem quer começar o custo do mainframe é proibitivo, porém do processamento em PCs é viável e atualmente já dão conta do processamento necessário.

O problema dos grandes bancos não é o mainframe, mas os processos internos que acabaram sendo incorporados ao longo das décadas.

Existem instalações que você sequer consegue ver a compilação de um programa pra tentar ajudar seu coleguinha! Código fonte de outro sistema ? Jamais! Consultar um dado de produção ? Ficou louco ?!?!

As disciplinas de computação que são ensinadas nas faculdades e que são vistas como verdade não possuem paralelo no mundo mainframe, mas mesmo assim tentam incorporar coisas que não fazem sentido, quer exemplo? Veja um teste unitário automatizado em Java, em mainframe sequer é possível fazer a analogia do que viria a ser o teste unitário! É outro conceito, não se aplica! Gasta-se um tempão fazendo atividades que não levam a lugar algum! Como um teste "mockado" que não chegou a ir no banco de dados, cara é mainframe, o banco vai estar lá...e funcionando!

A moda agora é o Ágil! Desculpe pessoal, mas deixa eu contar, o desenvolvimento de software no mainframe nasceu ágil!

Eu trabalhei em uma equipe que rodava ágil no mainframe antes mesmo de ser modinha ou mesmo de termos consciência que o que fazíamos tinha esse nome, os mais antigos sempre lembravam que antigamente todo mundo trabalhava igual a nossa equipe, mas eram outros tempos, fomos os últimos sobreviventes.

Nosso time era pequeno, multidisciplinar, autogerenciavel, todo mundo sabia exatamente o que o outro estava fazendo e se estava precisando de ajuda, éramos donos do negócio, tinhamos iniciativa, comprometimento, responsabilidade e autonomia ímpares! Fazíamos entregas rotineiras (2 a 3 vezes por mês) de novas funcionalidades e melhorias no sistema, realizavamos testes automatizados, controle de versão com retorno instantâneo em caso de deploy com problemas. Precisava de um dado de produção, tá aqui, na mão, agora! Eu mesmo acessava a tabela ou o arquivo para consultar o que quer que fosse necessário. Precisa corrigir um dado, processar algo urgente? Um job@ resolve seu problema e se for urgente, urgente mesmo da até pra rodar na janela do on-line! Por vezes esbarravamos em processos que iam além de nossos conhecimentos e poderes, mas devido a criticidade do sistema esses impedimentos eram resolvidos muito rapidamente, o ser um sistema crítico era o abre portas para que os processos rodassem rápido e que a ajuda chegasse a galope, uma pena pois deveria ser assim com todos os sistemas. Poderia falar horas a fio sobre isso, mas fica para outra oportunidade.

Os processos incorporados na rotina ao longo dos anos foi o que acabou fazendo com que projetos começassem a demorar cada vez mais.

No tempo de uma Sprint você sequer consegue enviar seu pacote para o ambiente de homologação!

Vai precisar adicionar uma coluna em uma tabela! Lá se foi sua Sprint e você nem viu sinal da nova coluna!

Ah, mas o problema é que não temos as ferramentas para DevOps no mainframe! Balela, tem tudo e nem precisa de nada novo, a própria IBM pra quem for preguiçoso tem o UrbanCode que faz um deploy automatico com interface gráfica e tudo! Não precisa nunca ter visto um Jcl na vida pra conseguir usar, mas isso é outro tópico e todos os grandes bancos têm suas ferramentas para deploy em produção de versões de aplicaçoes no mainframe de maneira automatica.

Sair do mainframe esperando que os tempos de projetos serão menores, que irão dar conta de lançar produtos na velocidade de uma startup é uma utopia!

Uma startup não tem um "by the book" a ser seguido, o cara precisa enviar pra produção uma alteração que não deu pra testar direito ele vai lá e manda se der problema ele volta e analisa.

Isso é inconcebível de acontecer hoje em dia num grande banco! Mesmo existindo ambiente de produção para baixa controlada se você fizer algo assim será demitido! Se bem que pensando aqui... a propria start up quando fica muito grande acaba incorporando os mesmos processos seguidos pelos grandes bancos e acaba perdendo seu grande diferencial e tem que contratar muito mais gente pra dar conta de um monte de coisa que não precisava e nao existia no começo! Mas isso é assunto pra outro dia.

Uma pena os bancos estarem gastando tempo com conversões de sistemas para "baixa plataforma" tentando ganhar velocidade na entrega de projetos ou mesmo iniciando projetos novos já em PCs sendo que o que precisam é somente voltar para suas raízes tecnológicas de 20, 30, 40 anos atrás.

Um banco digital a partir do zero, hoje em dia, sai em menos de 3 anos, já vi projetos de produtos/soluções bancárias que demoraram mais que isso!

Repito, o problema não é a tecnologia, mainframe ou PC, são os processos.

Entretanto, como não temos fintechs rodando mainframe só confirmarei isso daqui uns 10 anos quando os bancos tiverem concluído a migração quase que total do mainframe para PCs e os projetos continuarem demorando o mesmo tempo que outrora.


Encerrei como deu, to com sono, quando tiver tempo reescrevo.


quinta-feira, 20 de junho de 2019

Senha troca de logotipo Kouprey - MP5 - Central Multimídia Kouprey Com Espelhamento - Marca do Carro

Senha para Troca de Logotipo Kouprey - MP5 - Central Multimídia Kouprey com Espelhamento

Cara, que compra mais bem acertada, pena que o raio do painel ter que ser cortado e eu ter que comprar uma moldura de plástico que não tem nem 5 reais de material por mais de 150, quase a metade do preço do aparelho, mas enfim...

Senha para Troca do Logotipo de Inicialização

A senha para troca do logotipo de inicialização do MP5, central multimídia, seja lá o que mais, é:

6556

Detalhes do Modelo

O modelo é o KPY-6210QR.

Central Multimídia Instalada no Fiat Mobi

Central multimídia Kouprey instalada com moldura no Fiat Mobi
Figura 1 - Kouprey instalado

Central multimídia instalada com moldura top no Mobi.

Links de Compra

Comprei a moldura para o Fiat Mobi no Mercado Livre. Aqui está o link:

Moldura Frente Mobi 2016 2 Din para DVD Multimídia Preto

E a própria central multimídia Kouprey também foi comprada no Mercado Livre. Confira:

Central Multimídia GPS Espelhamento Kouprey

Manuais do Usuário e Instalação

Manual do Usuário: https://www.knok.com.br/download/Manual_do_Usuario.pdf

Manual de Instalação do Comando pelo Volante: https://www.knok.com.br/download/Comando_de_volante.pdf

quarta-feira, 22 de maio de 2019

Como Passei na Certificação Google - Google Cloud Certified - Professional Cloud Architect e voce também pode passar!

Como Passei na Certificação Google - Google Cloud Certified - Professional Cloud Architect e você também pode passar!

Manooooo, pensa num cara caindo de paraquedas no rolê! Essa frase me fez lembrar eu chegando em Brasilia lá nos idos de 2000 e qualquer coisa, que eu também tinha caido de paraquedas!

Quem me conhece sabe que minha praia é a tela preta com letra verde conectado com um mainframe via um terminal 3270 qualquer emulado e de preferencia com 43 linhas x 80 colunas.

Enfim, a firma que estou trabalhando (CI&T) estava precisando certificar alguns seletos funcionarios nas tecnologias do Google... na copa (do mundo de futebol) teve uma iniciativa que nao consegui participar por falta de tempo (digo, por nao priorizar esse item, assim que os coaches gostam que a gente fale atualmente) e que rolou treinamento pra galera que tivesse a fim de fazer, um concurso e a certificacao na faixa. Eu perdi esse bonde mas fiquei com aquilo atras da orelha, pô nada nada 200 verdinhas dos americanos pagas com cartao de credito beira quase os 1000 reais, e no esquema de eu banco pra voce pareceu um ótimo negócio...

Enfim 2, em novembro ou dezembro na ferramenta de comunicacao da firma, o carinhosamente chamado de "Esconde-Drop" (https://deskdrop.co/) porque basicamente voce nunca fica sabendo o que esta acontecendo atraves dele e quando voce precisa procurar algo que acabou de ler já era! É uma ferramenta boa, mas carece de melhorias! Agora voltando, o pessoal publicou que estariam ressarcindo os caboclos que se aventurarem a tirar certificacao do google em 100%, achei joia, sem falar que se nao passasse iam reembolsar metade, achei um grande negocio.

Tentei recuperar as noticias no esconde-drop à época da Copa, consegui achar alguma coisa, conversei com uma meia duzia de cinco ou seis, achei um outro lance que a firma tinha uns curso no Coursera (cursos de coisas do Google) de graça e tals, fui atras das informacoes e consegui descolar uma "trilha" inteira com um monte de cursos pra me preparar pra tal da certificação. Comprei aquelas provas simuladas no e-bay, fiz o simulado do proprio google, assisti os videos, fiz os laboratorios, estudei quase tudo que tinha numa planilha mapeada pelo Ivan com todos os topicos, eu sabia que nao estava 100%, mas como ninguem sabe quanto tem que tira, nem o gabarito da prova, fui lá ver qualé que era.

Me phodi, fiquei bem frustrado, tomei um FAIL na cara depois do submit final do exame, e ficou por isso, dancei! Pedi o reembolso e bola pra frente, nao trabalho com isso mesmo, aprendi um monte de conceito novo, vi coisas que nem imaginava que já existissem e fiz coisas que no mainframe sao impossiveis!... Curti, mas valeu a ideia, nao deu, até escrevi no Linkedin que ta tudo bem nao passar.

Aqui colocar o post do linkedin

https://www.linkedin.com/feed/update/urn:li:activity:6479051901970239489

sexta-feira, 19 de abril de 2019

Data Center - Itaú e Santander - Campinas Barão Geraldo, Mogi Mirim

Data Center - Itaú e Santander - Campinas Barão Geraldo, Mogi Mirim

Fazia tempo que estava procurando e achei o PDF da apresentação do Itaú sobre o Datacenter de Mogi, de quebra ainda achei um pouco de história do do Santander aqui do lado de casa.

Sala central do data center do banco Santander inaugurado em Barão Geraldo: integrado a quatro grandes centros instalados em outros países (César Rodrigues/AAN)

Command Center do banco Santander dentro do DataCenter inaugurado em Barão Geraldo:

Sinceramente não sei o que conseguiram vender à época sobre os empregos que seriam gerados, mas faltou conversar com alguém da área!

Apresentação do Itaú - Centro Tecnológico Mogi Mirim (PDF)

Vídeo 1 - Institucional do Santander

Vídeo 2 - Itaú Mogi Mirim

quinta-feira, 14 de fevereiro de 2019

REXX para localizar string em pacotes do Changeman

Atualizado em 2025 06 11 - Reescreve o post com ajuda do perplexity, nao testei o fonte e nem comparei pra ver se ele mudou alguma coisa, mas bonito devo dizer que ficou!


REXX para localizar string em pacotes do Changeman

Este script REXX realiza uma busca por uma string em todos os membros de um pacote do Changeman, gerando um relatório com os resultados encontrados. Útil para quem precisa localizar rapidamente trechos de código ou referências em ambientes mainframe integrados ao ChangeMan.

Exemplo de uso

Execute o script informando a sigla do sistema, o número do pacote e a string a ser pesquisada.

Código REXX

FINDCHG.REXX

/**  REXX  **/                                                        
arg sigla pacote texto                                                
call valida_parametros;                                                
call verifica_se_pacote_existe;                                        
/* aqui a magica acontece! */                                          
call outtrap "mbrs."                                                  
"LISTD" "'"pdsname"'" "MEMBERS"                                        
call outtrap "off"                                                    
                                                                       
do ndx=1 to mbrs.0                                                    
   if mbrs.ndx = "--MEMBERS--" then leave                              
end                                                                    
ndx=ndx+1                                                              
qtd_membros = mbrs.0 - ndx + 1                                        
say 'Procuraremos a string em ' qtd_membros ' membros.'                
/* "ALLOC FI(RELAT) DA('WALBUGA.OUTDD.SAIDA') MOD REUSE" */            
log = USERID()'.OUTDD.SAIDA'                                          
say log                                                                
/* "ALLOC FI(RELAT) DA(log) MOD REUSE"                                
   "ALLOC F(SYS010) DS('"particionado"("membro")') SHR REUSE"          
   "ALLOC FI(RELAT) DA('WALBUGA.OUTDD.SAIDA') MOD REUSE"  */          
 "ALLOC FI(RELAT) DA('"log"') MOD REUSE"                              
IF RC \= 0 THEN                                                        
   DO                                                                  
      say "----------------------------------------"                  
      say "Erro na alocacao do arquivo de relatorio"                  
      say "----------------------------------------"                  
     EXIT 0                                                            
   END                                                                
/* aqui a magica acontece 2! */                                        
call listdsi "'"pdsname"'"                                            
particionado=sysdsname                                                
/**-----------------------------------------------------------------**/
linha.1="------------------------------------------------"            
linha.2="Inicio do processamento ------------------------"            
linha.3="------------------------------------------------"              
linha.4="Procurando " pdsname " por <" texto ">"                        
linha.5="------------------------------------------------"              
linha.0=5                                                              
"EXECIO" linha.0 "DISKW RELAT (STEM linha."                            
do curmbr = ndx to mbrs.0                                              
   parse value mbrs.curmbr with membro                                  
   membro=strip(membro)                                                
   flag=1                                                              
/* say "member="particionado"("membro")" */                            
/* assim sai o membro */                                                
/* aqui =  'particionadome' ||(membro) */                              
/* aqui = "'"(membro)"'" */                                            
/* say aqui */                                                          
/* "ALLOC F(SYS010) DS('"particionado"("membro")') SHR REUSE" */        
   "ALLOC F(SYS010) DS('"particionado"("membro")') SHR REUSE"          
/* "ALLOC F(SYS010) DS("'"aqui"'") SHR REUSE" */                        
   "EXECIO * DISKR SYS010 (FINIS STEM in."                              
   "FREE F(SYS010)"                                                    
   fnd=0                                                                
   do recid=1 to in.0                                                  
      if pos(texto,in.recid) > 0 then                                  
        do                                                              
           if flag = 1 then                                            
             do                                                        
              linha.1="------------------------------------------------"
              linha.2="----> " membro " contem <" texto ">"            
              say linha.2                                              
              linha.3 = in.recid                                        
              linha.0=3                                                
              "EXECIO" linha.0 "DISKW RELAT (STEM linha."              
              flag=0                                                    
             end                                                        
           linha.1 = in.recid                                          
           linha.0=1                                                    
           "EXECIO" linha.0 "DISKW RELAT (STEM linha."                  
        end                                                            
   end                                                                  
end                                                                    
say '*** Pesquisa finalizada com sucesso ***'                          
linha.1="////////////////////////////////////////////////"            
linha.2="////////////////////////////////////////////////"            
linha.3="////////////////////////////////////////////    "            
linha.4="//////////////////////////////////////////// FIM"            
linha.5="////////////////////////////////////////////////"            
linha.0=5                                                              
"EXECIO" linha.0 "DISKW RELAT (STEM linha."                            
"EXECIO 0 DISKW RELAT (FINIS"                                          
"FREE F(RELAT)"                                                        
exit 0                                                                
                                                                       
/*----------------------- */                                          
valida_parametros:                                                    
/*----------------------- */                                          
if sigla = "" | pacote = "" | texto = "" then                          
 do                                                                    
   clear                                                              
   say ""                                                              
   say "Bem vindo "  USERID()                                          
   say ""                                                              
   say  "Informe: "                                                    
   say  " - sigla do sistema"                                          
   say  " - numero do pacote "                                        
   say  " - string a ser pesquisada"                                  
   say ""                                                              
   say  "Como não foi informado abrirei a opcao de informar abaixo."  
   say ""                                                              
   say  "Digite SAI para sair, tecle ENTER para continuar..."          
   pull ok                                                            
   say ""                                                              
   /* if parse upper (ok) = 'SAI' then         -- VER USO DO UPPER */  
   if ok = 'SAI' then                                                  
    do                                                                
      exit 0                                                          
    end                                                                
 end                                                                  
if sigla = "" then                                                    
   do                                                                  
      say "----------------------------------------------------"      
      say "Erro: Informe a sigla do sistema com duas posicoes"        
      say "----------------------------------------------------"      
      say ""                                                          
      say 'Digite a sigla:'                                            
      pull sigla                                                      
   end                                                                
if pacote = "" then                                                    
   do                                                                  
      say "--------------------------------"                          
      say "Erro: Não foi informado o pacote"                          
      say "--------------------------------"                          
      say ""                                                          
      say "Procuraremos em DESICBIB.CHGMAN.STG.NG0I.#pacote.SRC"      
      say ""                                                          
      say 'Digite o numero do pacote com 6 numeros :'                  
      pull pacote                                                      
   end                                                                
if texto = "" then                                                    
   do                                                                  
      say "-----------------------------------------------------------"
      say "Erro: Não foi informada a string a ser pesquisada no pacote"
      say "-----------------------------------------------------------"
      say ""                                                          
      say 'Digite a string:'                                          
      pull texto                                                      
   end                                                                
return                                                                
                                                                       
                                                                       
/*------------------------------------- */                            
verifica_se_pacote_existe:                                            
/*------------------------------------- */                            
                                                                       
/*         DESICBIB.CHGMAN.STG.NG0I.#000651.SRC */                    
pdsname = 'DESICBIB.CHGMAN.STG.'sigla'0I.#'pacote'.SRC'                
    say '---------------------------------------------------------------'
    say 'Procurando' texto ' em 'pdsname''                                
    say '---------------------------------------------------------------'
    x = SYSDSN("'"pdsname"'")      /* só pros feras!!! ODEIO ISSO */      
    say x ', vamos em frente que o pacote ta lá!'                        
    say '---------------------------------------------------------------'
    if x <> "OK" then                                                    
       do                                                                
          say "Erro: Não conseguimos localizar o pacote #" pacote        
          say "Erro: Não conseguimos localizar o pacote:" pdsname        
          say "Error: " pdsname " > " sysdsn(pdsname)                    
          say "Press Enter to continue"                                  
          pull uresp                                                      
          exit 8                                                          
       end                                                                
    return                                            

Como funciona

  • Valida os parâmetros de entrada (sigla, pacote, texto).
  • Verifica se o pacote existe no Changeman.
  • Lista todos os membros do pacote e busca a string informada em cada um.
  • Gera um relatório de saída com os membros e linhas onde a string foi encontrada.

Observações

  • O script pode ser adaptado para outros padrões de pacotes ou ambientes.
  • Certifique-se de ter as permissões necessárias para executar comandos de alocação e leitura de membros no ambiente mainframe.

quinta-feira, 24 de janeiro de 2019

REXX para bom dia! - Gera arquivos de configuração do Debug Tool - Submete Hrecall para todos os membros

Scripts REXX e JCL para Automação no z/OS

Scripts REXX e JCL para Automação no z/OS

Script REXX para Automação no z/OS

BOM#DIA.REXX

/* REXX */                                                    
trace off;                                                    
CLEAR                                                          
SAY 'Ola Buga!'                                                
SAY ' '                                                        
SAY 'Seja vem vindo...'                                        
SAY ' '                                                        
SAY ' '                                                        
parse PULL rola                                                
/******************************/                              
call verifica_primeira_vez_do_dia                              
say flag                                                      
if flag = 'S' then                                            
 do                                                            
    call grava_ja_rodamos;                                    
    call aloca_debug_tool_files;                              
    call hrecall_de_tudo;                                      
 end;                                                          
ISPF                                                          
exit 0                                                        
/******************************/                              
grava_ja_rodamos:                                              
/******************************/                              
dsname = 'walbuga.apagador'                                    
"ALLOC FI(Pdsout) DA('"dsname"') new                          
    tracks space(10 10) dir(01)                                
    Recfm(F B) LRECL(80)"                                      
"FREE  FI(Pdsout)"                                            
"allocate dataset('walbuga.apagador(#15)') fi(#15) shr reuse"  
"execio 0 diskw #15 (stem o. open)"                            
o.1 = 'CEBOLA '                                                
"execio * diskw #15 (stem o. finis)"                          
"free fi(#15)"                                                
return                                                        
/******************************/                              
/******************************/                              
dsname = 'walbuga.apagador'                                    
"ALLOC FI(Pdsout) DA('"dsname"') new                          
    tracks space(10 10) dir(01)                                
    Recfm(F B) LRECL(80)"                                      
"FREE  FI(Pdsout)"                                            
"allocate dataset('walbuga.apagador(#15)') fi(#15) shr reuse"  
"execio 0 diskw #15 (stem o. open)"                            
o.1 = 'CEBOLA '                                                
"execio * diskw #15 (stem o. finis)"                          
"free fi(#15)"                                                
return                                                        
/******************************/                              
verifica_primeira_vez_do_dia:                                  
/******************************/                              
"allocate dataset('walbuga.apagador(#15)') fi(#15) shr reuse"  
"execio * diskr #15 (stem oia. finis)"                        
   if pos('CEBOLA',oia.1) > '0' then                          
      do                                                      
         say 'TSO te derrubou, neh amigao ?'                  
         flag = 'N'                                            
      end                                                      
   else                                                        
      do                                                      
         say 'Divirta-se Buga'                                
         flag = 'S'                                            
      end                                                      
return                                                        
/******************************/                              
aloca_debug_tool_files:                                        
/******************************/                              
debug_tool = "'WALBUGA.G#NG.SEMANA09(DEBUG#01)'"              
SUBMIT debug_tool                                              
return                                                        
/******************************/                              
hrecall_de_tudo:                                              
recall = "'WALBUGA.G#R0.DATA(JCL#0004)'"                      
SUBMIT recall                                                  
return                                

JCL para Alocação de Arquivos de Debug (DEBUG#01)

WALBUGA.G#NG.SEMANA09(DEBUG#01)

DEBUG#01.JCL

//WALBUGA2 JOB NG,BUGA,CLASS=K      RESTART=STEP#002                  
/*NOTIFY WALBUGA                                                      
//*--------------------------------------------------------------------
//* Aloca arquivos utilizados pelo debug tool no z/OS                  
//*--------------------------------------------------------------------
//STEP#001  EXEC PGM=IEFBR14                                          
//SAVINGS      DD DSN=WALBUGA.DBGTOOL.SAVESETS,                        
//             DISP=(NEW,CATLG,DELETE),                                
//             UNIT=SYSDA,SPACE=(CYL,(20,10)),                        
//             DCB=(LRECL=3204,BLKSIZE=0,DSORG=PS,RECFM=VB)            
//SETTINGS      DD DSN=WALBUGA.DBGTOOL.SAVEBPS,                        
//             DISP=(NEW,CATLG,DELETE),                                
//             UNIT=SYSDA,SPACE=(CYL,(20,10)),                        
//             DCB=(LRECL=3204,BLKSIZE=0,DSORG=PO,RECFM=VB),          
//             DSNTYPE=LIBRARY                                        
//*--------------------------------------------------------------------
//* Carrega configuracoes que o Buga gosta!                            
//*--------------------------------------------------------------------
//STEP#002  EXEC PGM=IEBGENER                                          
//SYSIN    DD DUMMY                                                    
//SYSPRINT DD SYSOUT=X                                                
//SYSUT1   DD *                                                        
      COMMENT YES
      SET ASSEMBLER OFF;                                              
      SET ASSEMBLER STEPOVER EXTONLY;                                  
      SET AUTOMONITOR ON NOLOG CURRENT;                                
      SET CHANGE STATEMENT;                                            
      SET COLOR TURQUOISE NONE      HIGH TITLE HEADERS;                
      SET COLOR GREEN     NONE      LOW  TITLE FIELDS;                
      SET COLOR TURQUOISE REVERSE   LOW  MONITOR AREA;                
      SET COLOR TURQUOISE REVERSE   LOW  MONITOR LINES;                
      SET COLOR WHITE     REVERSE   LOW  SOURCE AREA;                  
      SET COLOR TURQUOISE REVERSE   LOW  SOURCE PREFIX;                
      SET COLOR YELLOW    REVERSE   LOW  SOURCE SUFFIX;                
      SET COLOR RED       REVERSE   HIGH SOURCE CURRENT;              
      SET COLOR GREEN     NONE      LOW  SOURCE BREAKPOINTS;          
      SET COLOR TURQUOISE NONE      HIGH PROGRAM OUTPUT;              
      SET COLOR YELLOW    NONE      LOW  TEST INPUT;                  
      SET COLOR GREEN     NONE      HIGH TEST OUTPUT;                  
      SET COLOR BLUE      REVERSE   HIGH LOG LINES;                    
      SET COLOR WHITE     NONE      HIGH COMMAND LINE;                
      SET COLOR GREEN     REVERSE   HIGH WINDOW HEADERS;              
      SET COLOR BLUE      REVERSE   HIGH TOFEOF MARKER;                
      SET COLOR RED       NONE      HIGH TARGET FIELD;                
      SET DEFAULT LISTINGS;                                            
      SET DEFAULT DBG;                                                
      SET DEFAULT MDBG;                                                
      SET DEFAULT SCROLL PAGE;                                        
      SET DEFAULT VIEW STANDARD;                                      
      SET DEFAULT WINDOW SOURCE;                                      
      SET DISASSEMBLY OFF;                                            
      SET DYNDEBUG ON;                                                
      SET ECHO ON;                                                    
      SET EXECUTE ON;                                                  
      SET EXPLICITDEBUG OFF;                                          
      SET FIND BOUNDS 1 *;                                            
      SET HISTORY ON 100;                                              
      SET IGNORELINK OFF;                                              
      SET LDD SINGLE;                                                  
      SET LIST TABULAR OFF;                                            
      SET LIST BY SUBSCRIPT OFF;                                      
      SET LOG OFF;                                                    
      SET LOG KEEP 1000;                                              
      SET LOG NUMBERS ON;                                              
      SET LONGCUNAME ON;                                              
      SET MONITOR DATATYPE OFF;                                        
      SET MONITOR LIMIT 1000;                                          
      SET MONITOR NUMBERS ON;                                          
      SET MONITOR WRAP ON;                                            
      SET MSGID OFF;                                                  
      SET PACE 2;                                                      
      SET PF1     "?" =    ?;                                          
      SET PF2     "STEP" = STEP;                                      
      SET PF3     "QUIT" = QUIT;                              
      SET PF4     "LIST" = LIST;                              
      SET PF5     "FIND" = IMMEDIATE FIND;                    
      SET PF6     "AT/CLEAR" =AT TOGGLE;                      
      SET PF7     "UP" =   IMMEDIATE UP;                      
      SET PF8     "DOWN" = IMMEDIATE DOWN;                    
      SET PF9     "GO" =   GO;                                
      SET PF10    "ZOOM" = IMMEDIATE ZOOM;                    
      SET PF11    "ZOOM LOG" =IMMEDIATE ZOOM LOG;              
      SET PF12    "RETRIEVE" =IMMEDIATE RETRIEVE;              
      SET PF13    "?" =    ?;                                  
      SET PF14    "STEP" = STEP;                              
      SET PF15    "QUIT" = QUIT;                              
      SET PF16    "LIST" = LIST;                              
      SET PF17    "FIND" = IMMEDIATE FIND;                    
      SET PF18    "AT/CLEAR" =AT TOGGLE;                      
      SET PF19    "UP" =   IMMEDIATE UP;                      
      SET PF20    "DOWN" = IMMEDIATE DOWN;                    
      SET PF21    "GO" =   GO;                                
      SET PF22    "ZOOM" = IMMEDIATE ZOOM;                    
      SET PF23    "ZOOM LOG" =IMMEDIATE ZOOM LOG;              
      SET PF24    "RETRIEVE" =IMMEDIATE RETRIEVE;              
      SET POPUP 15;                                            
      SET PROMPT LONG;                                        
      SET REFRESH OFF;                                        
      SET RESTORE SETTINGS AUTO;                              
      SET RESTORE BPS AUTO;                                    
      SET RESTORE MONITORS AUTO;                              
      SET REWRITE 50;                                          
      SET SAVE SETTINGS AUTO;                                  
      SET SAVE BPS AUTO FILE WALBUGA.DBGTOOL.SAVEBPS;          
      SET SAVE MONITORS AUTO;                                  
      SET SCROLL DISPLAY ON;                                  
      SET SUFFIX ON;                                          
      SET WARNING ON;                                          
      WINDOW SIZE 3 LOG;                                  
      WINDOW SIZE 28 SOURCE;                              
      WINDOW SIZE 8 MONITOR;                              
      SET SCREEN ON;                                                  
      SET SCREEN 1 MONITOR SOURCE LOG;                                
      SET KEYS ON 12;                                      
      SET MONITOR COLUMN ON;                                          
//SYSUT2   DD DSN=WALBUGA.DBGTOOL.SAVESETS,                            
//             DISP=(OLD,CATLG,DELETE),                                
//             UNIT=SYSDA,SPACE=(CYL,(20,10)),                        
//             DCB=(LRECL=3204,BLKSIZE=0,DSORG=PS,RECFM=VB)            
//                                                                    
//*                                                                    
                                                                       
SET SAVE SETTINGS AUTO ;                                              
SET SAVE BPS AUTO ;                                                    
SET SAVE MONITORS AUTO ;                                              
                                                                       
SET RESTORE SETTINGS AUTO ;                                            
SET RESTORE BPS AUTO ;                                                
SET RESTORE MONITORS AUTO ;                                            
                                                                       
SET AUTO ON;                                                          
WINDOW SIZE 30 SOURCE; window size 3 log;

JCL para Recall de Datasets do Usuário

'WALBUGA.G#R0.DATA(JCL#0004)'      

//WALBUGA1 JOB R8,'BUGA',MSGLEVEL=(1,1),CLASS=K,MSGCLASS=1,RD=NC        
//*---------------------------------------------------------------------
//*                                                                    
//*   PROCEDIMENTO PARA RECALL DE TODOS OS DATASETS DE UM USUARIO      
//*                                                                    
//*---------------------------------------------------------------------
/*NOTIFY WALBUGA         ** ME NOTIFIQUE                                
/*XEQ ECA                ** RODAR EM SECA                              
//*---------------------------------------------------------------------
//    EXPORT  SYMLIST=(USUARIO,ESTRELA)                                
//    SET     USUARIO=&SYSUID                                          
//    SET     ESTRELA='*'                                              
//*---------------------------------------------------------------------
//*          SCRATCH TODOS OS ARQUIVOS DE SAIDA                        
//*---------------------------------------------------------------------
//STEP#001 EXEC PGM=IDCAMS                                              
//SYSPRINT DD SYSOUT=*                                                  
//SYSIN    DD *,DLM=FIM,SYMBOLS=JCLONLY                                
  DELETE &USUARIO..LISTCAT.OUTPUT                                      
FIM                                                                    
//*---------------------------------------------------------------------
//*       SOLICITA RECALL DOS ARQUIVOS --- OPS NAO PODE                
//*---------------------------------------------------------------------
//STEP#002 EXEC PGM=IKJEFT01                                            
//SYSTSPRT DD SYSOUT=*                                                  
//SYSTSIN  DD *,SYMBOLS=JCLONLY                                        
 HRECALL &USUARIO..&ESTRELA NOWAIT                                      
//*---------------------------------------------------------------------
//* Entra em ação o plano 'B'                                          
//*       LISTA TODOS OS DATASETS DO USUARIO                            
//*---------------------------------------------------------------------
//STEP#003 EXEC PGM=IDCAMS                                              
//SYSPRINT DD   SYSOUT=*                                                
//SYSIN    DD  *,SYMBOLS=JCLONLY                                        
 LISTCAT LEVEL(&USUARIO) -                                              
   OUTFILE(OUTDD)                                                      
//OUTDD    DD DSN=&USUARIO..LISTCAT.OUTPUT,                            
//         DCB=(RECFM=VBA,LRECL=125,BLKSIZE=629),UNIT=DASD,            
//         SPACE=(CYL,(1,1)),                                          
//         DISP=(NEW,CATLG)                                            
//*---------------------------------------------------------------------
//*    COPIA PARA ARQUIVO TEMPORARIO                                    
//*---------------------------------------------------------------------
//STEP#004 EXEC PGM=IEBGENER                                            
//SYSPRINT DD   SYSOUT=*                                                
//SYSOUT   DD SYSOUT=*                                                  
//SYSIN    DD DUMMY                                                    
//SYSUT1   DD DSN=&USUARIO..LISTCAT.OUTPUT,DISP=SHR                    
//SYSUT2   DD DSN=&&TMP1,                                              
//         DCB=(RECFM=VBA,LRECL=125,BLKSIZE=629),UNIT=DASD,            
//         SPACE=(CYL,(1,1)),                                          
//         DISP=(MOD,PASS)                                              
//*---------------------------------------------------------------------
//*    EXTRAI DO RELATORIO DO IDCAMS QUE LISTOU OS ARQUIVOS O NOME DOS  
//* DATASETS QUE SERÃO RECUPERADOSLOGO NA SEQUENCIA                    
//*---------------------------------------------------------------------
//STEP#005 EXEC  PGM=SORT    ,COND=(0,NE)                              
//SORTIN   DD DSN=&&TMP1,DISP=(OLD,DELETE)                              
//SORTOUT  DD DSN=&&TMP2,                                              
//         RECFM=FB,LRECL=00060,                                        
//         SPACE=(CYL,(10,10),RLSE),                                    
//         DISP=(MOD,PASS)                                              
//SORTIN   DD SYSOUT=*                                                  
//SYSIN    DD *,SYMBOLS=JCLONLY                                        
 SORT FIELDS=COPY                                                      
 INCLUDE COND=(22,7,EQ,C'&USUARIO'),FORMAT=CH     *** 4 BYTES DO RDW    
 OUTFIL FNAMES=SORTOUT,VTOF,                                            
 OUTREC=(C' HRECALL ',22,44,C' NOWAIT')                                
//SYSOUT   DD  SYSOUT=*                                                
//SORTMSG  DD  SYSOUT=*                                                
//*---------------------------------------------------------------------
//*    REALIZA O HRECALL DOS MEMBROS DO USUARIO                        
//*---------------------------------------------------------------------
//STEP#006 EXEC PGM=IKJEFT01                                            
//SYSTSPRT DD SYSOUT=*                                                  
//SYSTSIN  DD *                                                        
 /* Vai que alguem resolveu customizar */                              
 PROFILE NOPREFIX                                                      
//         DD DSN=&&TMP2,DISP=(OLD,DELETE)                              
//*                                                                    
//*---------------------------------------------------------------------
//*    ENVIA MENSAGEM INFORMANDO O FINAL DO PROCESSAMENTO              
//*---------------------------------------------------------------------
//STEP#007 EXEC PGM=IKJEFT01                                            
//SYSPRINT DD SYSOUT=*                                                  
//SYSTSPRT DD SYSOUT=*                                                  
//SYSTSIN  DD *,SYMBOLS=JCLONLY                                        
 SEND 'Processo de Recall de arquivos finalizado!     ' USER(&USUARIO)  
/*