Cobol para Padawans. Uma rapida olhadela...
- #Desperte o potencial
- #Informática Básica
- #Arquitetura de Sistemas
Aprenda Cobol
Primeiros passos na mãe de todas as linguagens de programação
Salve jovem padawan, este é nossa primeira imersão em COBOL, começamos nossa jornada lendária na mais velha linguagem de programação existente em nossos dias. Há 61 anos deixando analistas e programadores de cabelo em pé, embranquecidos e de menos no topo da cabeça, auxiliando na excentricidade e deixando-nos bem amalucados.
O texto abaixo não é de minha completa autoria, sendo um enxerto de inúmeros textos de outros sites, acrescido pelo meus pitacos e misturados a décadas de trabalho.
INTRODUÇÃO
O governo americano precisava de uma ferramenta, que controlasse o caos, que começava a surgir nos Centros de Processamento de Dados, espalhados pelo pais, cada fabricante de computador, queria vender a sua própria única e fabulosa solução em equipamento e linguagem de codificação, detalhe dessa maravilha e que era compatível apenas nos equipamentos próprios e somente Técnicos da equipe saberiam usar.
A solução acabava prendendo o contratante numa arquitetura única, softwares caixa preta são a evolução direta desta pratica, sendo os ERPs o ápice desta loucura, para fugir disso foi idealizado um COMITE para criar um padrão único, aberto, multiusuários, muiti-computadores e com alta portabilidade, você com certeza ouviu algo semelhante, porem foram 30 anos antes da ideia do software open source e livre.
O COBOL foi criado para cumprir dois objetivos principais: um relacionado à portabilidade (a capacidade de os programas serem executados com modificações mínimas em computadores de diferentes fabricantes) e o outro à legibilidade (a facilidade com que um programa pode ser lido como o inglês comum). A primeira reunião para definir esta linguagem foi em 1958, surgindo em 1960 a primeira versão
Para as meninas, saibam que Grace Hooper fez um trabalho fenomenal e graças ao seu engenho o Flowmatic, aca Bussiness Language 0, virou Cobol e nossa admiravel Grace entrou para os anais da informatica como a maior programadora de todos os tempos.,
O que você sabe sobre COBOL?
Vamos de fofoquices, na verdade o nome real é Common Business Oriented Language, carinhosamente chamada de COBOL, ela é uma das mais antigas linguagens de programação em uso atualmente, sendo utilizada de forma initerruptamente ao longo de mais de 6 décadas, sendo usada principalmente para ambientes administrativos, em vários setores de negócios, incluindo funções governamentais, finanças e sistemas militares.
Ela se concentra na solução de problemas complexos de negócios, mas implementada apenas para cálculos financeiros, sendo orientada a negócios, por isso mesmo olhada com desdém pela comunidade acadêmica, diferentemente do PL/I, que trabalha em cálculos mais científicos ou mesmo o C/Python com linda matemática complexa.
Pergunta de ouro. Vale a pena aprender Cobol?
Sim, com certeza absoluta, em nossos dias ainda vale muito a pena aprender COBOL, independentemente do fato de muitas empresas quererem migra-los ou portá-los para qualquer outra linguagem de programação. Os sistemas legados necessitam sempre de manutenção evolutiva ou corretiva.
Com o COBOL, isso pode ser feito facilmente. Apesar da linguagem ter mais de 60 anos, ela é fácil de aprender e entender seus comandos, muito software importante continua sendo executado nela, veja por exemplo o caso a seguir, nos EUA softwares Cobol, que eram estáveis e não sofriam atualizações, repentinamente foram recompilados e sofreram acerto evolutivos devido a pandemia, por isso dezenas de programadores aposentados têm voltado a ativa e usado o COBOL emergencialmente na manutenção evolutiva do software da Segurança Social do governo americano, justamente para lidar com o aumento de pedidos de seguro-desemprego, decorrentes do colapso da economia causada pelo Covid-19, bem em meio à pandemia, inclusive com fortes apelos de dirigentes para desentocar velhos jedis renegados e traze-los a ativa.
ZOWE antes tarde do que nunca
Demorou muito mas aconteceu, temos uma oportunidade de treinar mainframe no conforto de nosso lar, foi criado uma versão comunidade do ZOS, codinome Zowe é uma estrutura de software livre integrada e extensível para z/OS constituída por em conjunto de APIs e recursos do sistema operacional e uma serie aplicativos prontos para uso.
O Zowe oferece interfaces modernas para interagir com o z/OS baseado no conceito de comunidade, onde pode-se utilizar extensões criadas por empresas, fornecedores, clientes e aventureiros em programação.
O Zowe é composto por vários componentes, semelhante aos modernos aplicativos de nuvem, dando uma roupagem século XXI ao velho terminal 3270, vindo a cada dia mais evoluções, facilitando a curva de aprendizado, acessibilidade e possibilidade de desenvolvimento de mainframe.
Visual Code e o Plugin Cobol
Existem inúmeros plug-ins disponíveis no workspace do Visual Code da Microsoft, podendo serem baixados e instalados gratuitamente, ajudando aos padawans a iniciarem-se na trilha mainframe.
Sem mais delongas, conheça COBOL na sua intimidade
Quais são os diferentes tipos de dados da linguagem COBOL, descobrira que não mudou muito?
Existem três tipos de dados principais em COBOL:
Alfabético - Este tipo pode conter qualquer uma das variáveis alfabéticas que variam entre A-Z
Alfa Numérico - Este tipo de dados pode conter os dois valores juntos, seja alfabético ou numérico.
Numérico (X) - usado para representar valores numéricos entre 0-9 , dividididos
- COMP – Numero em binario.
- COMP-1 - Ponto flutuante de precisão simples. Usa 4 bytes.
- COMP-2 - Ponto flutuante de dupla precisão. Usa 8 bytes.
- COMP-3 - O sinal é armazenado com valor hexa no ultimo meio byte
Fórmula geral é INT((n/2) + 1))
Se não entendeu deixo uma tabela de/para
Tipo de dado SQL Variável para host COBOL
SMALLINT S9(004) COMP-4
S9(004) COMP-5
S9(004) COMP
S9(004) BINARY
INTEGER S9(009) COMP-4
S9(009) COMP-5
S9(009) COMP
S9(009) BINARY
DECIMAL(p,s)
NUMERIC(p,s) S9(p-s)V9(s) COMP-3
S9(p-s)V9(s)
Se DECIMAL com s=0 (sem valores após a virgula), usar: S9(p)V
Se NUMERIC com s=0 (sem valores após a virgula), usar: S9(p)
Para armazenar somente os números após a vírgula, usar: SV9(s)
Se o compilador não suportar 31 dígitos decimal, usar: USAGE COMP-2
Sendo "p" a precisão de números, e "s" a escala
REAL FLOAT(n) COMP-1 Sendo "n": 1<= n <= 21
DOUBLE FLOAT(n) COMP-2 Sendo "n": 22 <= n <= 53
BIGINT S9(018) COMP-4
S9(018) COMP-5
S9(018) COMP
S9(018) BINARY
CHAR(n) Sendo "n" a quantidade de caracteres (tamanho fixo).
01 variavel-nome PIC X(n).
VARCHAR(n) Sendo "n" a quantidade de caracteres (tamanho dinâmico).
01 variavel-nome.
49 nome-tamanho PIC S9(004) USAGE BINARY.
49 nome-variavel PIC X(n).
Onde, nome-tamanho é a variável que irá armazenar a quantidade de caracteres presentes em nome-variável.
DATE PIC X(n)
Sendo "n" determinado pela regra de negócio, caso contrário "n" deve ser no mínimo 10
TIME PIC X(n)
Sendo "n" determinado pela regra de negócio, caso contrário "n" deve ser no mínimo 6, ou 8 para incluir os segundos
TIMESTAMP PIC X(n)
Sendo "n" no mínimo 19, para incluir os microssegundos "n" deve ser 26
Qual é a diferença entre index e subscript?
Vamos falar de arrays, então embora Subscript seja conhecido como a ocorrência de uma matriz, um índice se refere ao deslocamento desde o início da matriz. Só é possível modificar um índice usando PERFORM, SEARCH & SET.
Qual é a diferença entre uma Seção (section) e um parágrafo (paragraph)?
Pense numa história, a divisão é o capitulo e em uma seção, haverá todos os parágrafos que fazem parte da seção ainda a ser executada, enquanto no caso de um parágrafo, haverá apenas um parágrafo a ser executado
Qual é a diferença entre NEXT SENTENCE e CONTINUE?
Esse `simples, semelhante as linguagens modernas: NEXT SENTENCE é usado para transferir o controle para a próxima frase. CONTINUE atua como uma instrução nula e continua a execução do programa.
Quais são as características do COBOL como linguagem de negócios?
Adoro essa parte, o COBOL é uma linguagem voltada para negócios, foi criada por um comitê que desejava uma LP em linguagem natural, autoexplicativa e de fácil leitura a não programadores.
Tem muitas características que ajudam as empresas a gerenciar e atualizar dados. Por ser uma linguagem de negócios, foi pensada em performance, por isso o COBOL pode lidar com grandes volumes de dados.
É multiplataforma, mas não tem total compatibilidade, necessitando ajustes mas roda em PC, Mainframe, AS 400 e AIX. Os programadores podem compilar, executar e distribuir o COBOL em várias máquinas. Também pode ser usado para depurar e testar programas enquanto alguém está codificando em ambiente de desenvolvimento. Diferentes versões do COBOL aprimoram sua variedade de recursos ANSI68, ANSI74, ANSI85, ISO2002 E ISO2014.
Que diretrizes devemos seguir ao escrever um programa estruturado baseado em COBOL?
Não é orientado a objetos, por isso ao escrever um programa COBOL, pense de forma logica e estruturada, vocacionado para mainframe, evite declarar muitas variável e codificar em spaghetti code, deve-se seguir um determinado tipo de formato que permite a implementação adequada do código através de parágrafos e chamadas por PERFORM.
Por exemplo, ao construir um CASE, pode-se usar instruções EQUIVALENT Statements a cada vez. Ao aninhar, use terminadores de escopo e quando quiser fazer algo, tente e use instruções IN-LINE PERFORM. Nos blocos é comum usar instruções TEST BEFORE e TEST AFTER enquanto codificam para instruções de laço DO WHILE e blocos PERFORM.
Quais são as divisões em um programa COBOL?
Existem quatro divisões em um programa COBOL, que são conhecidas como IDENTIFICATION DIVISION, ENVIRONMENT DIVISION, DATA DIVISION e PROCEDURE DIVISION.
A IDENTIFICATION DIVISION é a divisão mais importante, pois identifica o programa.
A ENVIRONMENT DIVISION é dividida em duas seções, configuração e tipos de entrada-saída. Ele define o ambiente do programa escrito
A DATA DIVISION é usada para identificar itens de dados, alocar memórias e definir nomes dentro do programa. Se tem um arquivo, armazenamento e seção de ligação.
A PROCEDURE DIVISION apoia a lógica por trás do programa, lugar onde a magia acontece. Deve haver pelo menos uma instrução para o uso de variáveis definidas pelo usuário.
- IDENTIFICATION DIVISION
- ENVIRONMENT DIVISION
- DATA DIVISION
- PROCEDURE DIVISION
Qual é o papel desempenhado pelo verbo ACCEPT?
O verbo ACCEPT é uma instrução básica de input usada em COBOL para recuperar dados da consola do sistema, tais como hora, data e dia, parâmetros via JCL e em microinformática parâmetros via consola. Por exemplo num aplicativo teste, o comando ACCEPT e DISPLAY são usados para receber informações durante a execução do programa e exibir na tela.
Qual é a aplicação da instrução EVALUATE?
Um comando existente em todas as LPs modernas, serve para avaliar uma variável é encadeada como uma instrução case. Pode ser usado como IFs aninhados. Porem há uma diferença entre EVALUATE CASE e IFs alinhados. Em EVALUATE, o ‘break’ não é usado, e o controle sai de EVALUATE assim que uma correspondência é encontrada.
Qual é o significado da opção REPLACING de uma declaração de COPYBOOK?
A opção REPLACING permite que o mesmo COPYBOOK, seja usada várias vezes, mas altera o valor de substituição no mesmo código, muito útil em balance lines e utilização de input e output do mesmo arquivo.
A codificação usada é
COPY <Nome> REPLACING BY
Qual é o papel desempenhado pela opção ON SIZE ERROR no erro de trapping?
A opção ON SIZE ERROR é usada nos seguintes casos:
• estouro de ponto fixo
• Zero elevado à potência zero
• Divisão por 0
• Zero elevado a um número negativo
• Um número negativo elevado a uma potência fracionária
Exemplo:
SUBTRACT 20 FROM WINDOWED-YEAR
ON SIZE ERROR imperative-statement
Quais são as diferenças entre a programação COBOL estruturada e a programação COBOL orientada a objetos?
A programação estruturada pode ser definida como uma forma lógica de programação, seguindo uma sequência procedural, onde as funcionalidades são divididas em módulos e ajudam o programador a escrever o código de forma lógica, seguindo um fluxo de cima para baixo.
O COBOL orientado a objetos é uma forma natural de programação. Nela, os programadores identificam os objetos e, em seguida, escrevem funções e procedimentos em torno desse objeto.
Como você pode definir a LOCAL-STORAGE SECTION?
Cada vez que o programa é chamado, LOCAL-STORAGE é alocado, e então é desalocado quando o programa termina por EXIT PROGRAM, GOBACK ou STOP RUN.Ele é definido na DATA DIVISION após a WORKING-STORAGE SECTION.
Como você pode definir o INPUT PROCEDURE e o OUTPUT PROCEDURE ?
Durante o INPUT PROCEDURE, o arquivo de entrada é aberto, o ponteiro é apontado para o primeiro registro, os registros são lidos e editados, processados de acordo com a lógica do programa, ao final esses registros são liberados para a operação de ordenação e, por fim, o arquivo é fechado.
Enquanto no OUTPUT PROCEDURE, o arquivo de saída é aberto, o ponteiro fica apontado para a primeira linha do arquivo, o registro ordenado é devolvido ao registro de Saída, e então o registro será finalmente escrito e, em seguida, o arquivo será fechado.
O que são links estáticos e dinâmicos?
São parâmetros de compilação de programa, na vinculação estática, os links de sub-rotina/subprogramas são chamados para o programa principal e inclui a versão existente na data de compilação. Na vinculação dinâmica, a sub-rotina/subprograma e o programa principal podem existir como módulos separados, sendo a versão utilizada é a versão existente no computador em tempo de execução.
A vinculação dinâmica e estática pode ser feita escolhendo as opções de edição de link DYNAM ou NODYNAM.
Qual é a aplicação de LINKAGE SECTION?
A seção de ligação é usada para passar dados de um programa para outro ou passar dados de um procedimento para um programa. É parte de um programa que mapeia itens de dados no armazenamento de trabalho do programa de chamada. Criada durante a compilação, mas usada apenas em tempo de execução, recebendo parâmetros via CALL ou JCL.
JCL
//GA01ETL JOB ´GA0100,4250,GA,PROGRA01´,CLASS=A,MSGCLASS=Z,MSGLEVEL=(1,1)
//STEP1 EXEC PGM=GAP1015C,
// PARM=´20020831´
Definir os modos de acesso da instrução START?
Os modos de acesso são definidos como SEQUENCIAIS ou DINÂMICOS para a instrução inicial. O acesso dinâmico é utilizado para arquivos indexados/ VSAM enquanto
Pode definir um PERFORM in-line?
Por meio de uma instrução IN-LINE PERFORM, a rotina está sendo executada para ser aninhada na instrução perform em vez de ser um parágrafo separado.
Enquanto as instruções PERFORM e END-PERFORM são usadas para bloquear as instruções COBOL entre elas, PERFORM em linha funciona desde que não haja GO TOs internos, nem mesmo para uma saída.
Perform 100-Initialize-Paragraph
* The following statement is an inline PERFORM:
Perform Until Transaction-EOF
Read Update-Transaction-File Into WS-Transaction-Record
At End
Set Transaction-EOF To True
Not At End
Perform 200-Edit-Update-Transaction
If No-Errors
Perform 300-Update-Commuter-Record
Else
Perform 400-Print-Transaction-Errors
* End-If is a required scope terminator
End-If
Perform 410-Re-Initialize-Fields
* End-Read is a required scope terminator
End-Read
End-Perform
Quantas e quais são as clássicas divisões do COBOL?
Um programa COBOL possui 4 divisões a saber:
• IDENTIFICATION DIVISION
• ENVIRONMENT DIVISION
• DATA DIVISION
• PROCEDURE DIVISION
Quais divisões de programa são obrigatórias para um programa COBOL?
Identification Division.
Program-ID.
Program-name.
Qual é o valor padrão para um INITIALIZE e qual palavra-chave permite uma substituição do padrão?
INITIALIZE move spaces para campos alfabéticos e alfanuméricos
INITIALIZE move zeroes para campos numéricos.
FILLER, OCCURS DEPENDING ON os itens são deixados intactos.
A opção REPLACING pode ser utilizado para substituir esses padrões.
Quantos números diferentes de níveis podem ser usados em COBOL para descrever um registro?
01-49.
Quais são as diferentes maneira de se usar a declaração PERFORM?
PERFORM
PERFORM THRU
PERFORM 'n' TIMES
PERFORM UNTIL
PERFORM VARYING com a opção UNTIL.
Quais são as vantagens da programação estruturada?
Os programas sem as declarações GO TO e é representado por uma estrutura Top-Down que é visível e de fácil compreensão, pois os programas tem uma estrutura (hierárquica) específicas, é fácil de depurar os programas.
Quais são as diferenças entre variáveis globais e externas?
As variáveis globais estão disponíveis apenas para o programa em lote, enquanto as variáveis externas podem ser acessadas a partir de qualquer programa em lote na mesma biblioteca do sistema.
Qual é o significado de uma variável Pic 9v99?
É uma variável numérica no formato PIC 9v99, se refere a um campo numérico de3 bytes com um ponto decimal implícito ou assumido após a primeira posição. Identificado pelo “V” indicando que possui duas casas decimais.
Quais são as diretrizes que devem ser seguidas ao escrever um programa COBOL estruturado?
É necessário seguir certas diretrizes ao obrigatórias ao programar em COBOL.
A seguir apresento as mais importantes:
Usando a declaração 'EVALUATE' para instruções CASE;
Usando terminadores de escopo para aninhamento END-IF etc;
Usando a instrução PERFORM in-line para escrever construções ‘DO’
UsandoTest Before e Test After na instrução PERFORM ao escrever instruções esilo "Do-While"
Como descobrir a data atual de um sistema com o século?
O COBOL a semelhança das linguagens moderna, possui funções intrínsecas que retornam valore para diversas informações sobre o Sistema. Para descobrir a data atual com o século, use uma função intrínseca chamada Função Data Atual.
Qual é a diferença entre SSRANGE e NOSSRANGE?
São parâmetros de compilação, SSRANGE e NOSSRANGE são opções para um compilador encontrar o subscritor da matriz fora do intervalo. NOSSRANGE é a opção padrão, não haverá nenhum erro em tempo de execução se o índice ou subscrito sair de um intervalo.
Qual é a diferença entre COMP-1? COMP-2?
COMP-1 é um ponto flutuante de precisão única e usa apenas 4 bytes, enquanto COMP2 é o número flutuante de precisão dupla e usa 8 bytes.
Qual é a utilidade do nível 77 na definição de variáveis?
Este é um item de nível Elementar, não pode ser subdividido em outros itens (não pode ser qualificado), nem eles podem ser subdivididos, usado para constantes e variáveis declaradas.
Qual é a utilidade do nível 88?
É usado para nomes de condições, variáveis com valores lógicos usados para definir flags e constantes em processamento.
Qual é a utilidade do nível 66?
Este nível é usado para a cláusula RENAMES.
Qual é o uso da cláusula IS NUMERIC?
IS NUMERIC é usado em itens alfanuméricos, itens numéricos com sinal e decimais compactados. Também é usado para itens numéricos sem sinal e decimais embalados. IS NUMERIC retorna TRUE se o item for apenas assinado, então ele pode conter 0-9, + e-.
A cláusula OCCURS pode ocorrer no nível 01?
Não. A cláusula OCCURS não pode ocorrer no nível 01.
O que você entende por índice e subscrito?
Subscrito significa a ocorrência do array, enquanto o índice é o deslocamento (em bytes) desde o início do array. Um índice só pode ser modificado usando PERFORM, SEARCH & SET.
Os programadores precisam ter um índice para acessar dados em uma tabela interna e poder usar SEARCH, SEARCH ALL.
Qual é a diferença entre executar uma SECTION e um parágrafo?
Realizando uma SECTION fará com que todos os pontos que fazem parte da seção sejam realizados.
Realizando uma PARÁGRAFO fará com que apenas esse seja executado.
Qual é a ordem de classificação para SEARCH ALL?
As ordens de pesquisa de SEARCH ALL podem ser ASCENDING ou DESCENDING. ASCENDING é o padrão. Se quiser que a pesquisa seja feita em uma matriz classificada em ordem decrescente, ao definir a matriz, você deve fornecer a cláusula DESCENDING KEY. (Você deve carregue a tabela na ordem especificada).
O que é uma pesquisa binária?
Uma pesquisa binária é uma pesquisa feita em uma matriz classificada. Pode-se comparar o item a ser pesquisado com o item no centro. Se ele corresponder ao item, então está bom, caso contrário, repita o processo com a metade esquerda ou com a metade a direita, dependendo de onde o item poderá estar.
Qual é a utilidade do Pointer na string?
O objetivo principal do Pointer é especificar a posição mais à esquerda dentro do campo de recebimento, onde o primeiro caractere transferido será armazenado.
Como você pode diferenciar entre uma pesquisa binária e uma pesquisa sequencial?
No caso de uma pesquisa binária, os valores-chave do elemento da tabela estarão em ordem crescente ou decrescente. A tabela é 'dividida pela metade' para pesquisar condições iguais, maiores ou menores do que até que o elemento seja encontrado.
No caso de uma busca sequencial, a tabela é pesquisada de cima para baixo, para isso os elementos não precisam estar em uma sequência específica.
A pesquisa binária é muito mais rápida para mais tabelas, enquanto a pesquisa sequencial funciona muito bem com tabelas menores. SEARCH ALL é usado para pesquisa binária, enquanto SEARCH é usado para pesquisa sequencial.
Quais são as várias regras para realizar uma SEARCH ?
A SEARCH pode ser aplicada a uma tabela com as seguintes condições:
Que tem cláusula OCCURS
INDEXED BY frase
O índice de SEARCH deve ter algum valor inicial
Defina o valor do índice para 1
Em que caso um terminador de escopo é obrigatório?
Os terminadores de escopo são obrigatórios para instruções PERFORMS e EVALUATE in-line. Torne o terminador de escopo explícito para bons padrões de codificação.
Por que o arquivo sempre precisa ser aberto no modo I-O para fins de REWRITE?
Antes mesmo da REWRITE ser realizada, o registro deve ser aberto e lido do arquivo .Para o mesmo propósito, o arquivo deve ser aberto no modo I-O para a funcionalidade REWRITE.
Qual dos verbos de pesquisa é equivalente a PERFORM ... VARYING?
O verbo SEARCH serial é equivalente à instrução Perform-Varying e nada mais é do que pesquisar sem ALL.
Quais são as várias seções da DATA DIVISION?
Há um total de seis seções DATA DIVISION:
- File Section
- Working Storage Section
- Local Storage Section
- Screen Section
- Report Section
- Linkage Section
Qual é a diferença entre o uso de COMP e COMP-3?
COMP é usado para fins binários, enquanto COMP-3 indica decimais compactados.
Destaque uma diferença entre CALL e um LINK?
O CALL num programa atual é um comando que chama um programa externo e trata seu returno, podemos dizer que LINK é igual a CALL, tendo uma única diferença é que ele não existe mais nas versões atuais COBOL.
Como usar um array em COBOL?
Em COBOL, os arrays podem ser definidos da seguinte maneira:
05 Array1 PIC X (9), que ocorre 10 vezes
05 Array2 PIC X (9), que ocorre 20 vezes
Conclusao
Este artigo nao é para leigos, seu objetivo foi apresentar o COBOL para DEVs experientes, que sintam curiosidade em saber detalhes sobre a mae de todas as linguagens, falar sobre o ZOWE, Z/OS, logica procedural, mainframe e puxar a brasa para a sardinha dos dinossauros da computaçao.
Piadas de tiozao a parte, a ideia é mostrara que o COBOL nao é um Tiamat, que devorara programadores incaltos para breve, iniciarei uma jornada rumo ao COBOL, com tutorial e exemplos.
Espero ter ajudado ate o próximo artigo.
Referência Bibliográfica
WIKIPEDIA - A Enciclopédia Livre, faça parte, ajude atualizando ou criando verbetes http://www.wikipedia.org
Google Books um repositório com milhões de livros digitalizados https://books.google.com/
Internet Archive, tudo aquilo que um dia foi publicado veio parar aqui. https://archive.org/
Biblioteca de ícones https://www.flaticon.com/
Mais momento jabá, um momento extremamente divertido e lendário Torresmo e Pururuca, imagine dois dos maiores e mais conhecidos palhaços brasileiros, numa animada comemoração de Natal no parque do Ibirapuera nos anos 60, fazendo uma esquete clássica, uma luta de boxe para la de louca, esse tesouro foi encontrado num telão do Museu do Circo em São Paulo, visite, conheça e prestigie, para distrair, visite meu vídeo e veja para onde fui desta vez: https://www.youtube.com/watch?v=hk9Nuiq8yBw
Bom curso a todos.
https://www.linkedin.com/in/vagnerbellacosa/
https://github.com/VagnerBellacosa/