Crivo de Eratóstenes Simples em XBase (Clipper)

Atenção: código Clipper em Caixa Alta é Nostálgico! Esta é uma homenagem a uma linguagem que foi extremamente popular no Brasil durante a segunda metade dos anos 80 e a primeira metade dos anos 90. Alguns chamam-na de Clipper. Outros de XBase. Tudo começou com um sistema de banco de dados chamado dBase. Ele possuía uma sintaxe de operações mais simples que SQL. Vinha também com uma linguagem de programação embutida, que permitia criar interfaces modo texto de uma forma absurdamente simples e era extremamente satisfatório para as atividades em MS-DOS. A coisa toda era feita geralmente com um programa multiuso chamado Sidekick. Ele vinha com editor de texto, tabela ASCII, calculadora e outras firulas. Ele tinha uma característica peculiar, chamada de programa que termina e fica na memória. Através das teclas <Ctrl>+<Alt> ,o programa era chamado e utilizado seu editor. Com outro uso das teclas, ele voltava para a memória. Com isto não era necessário usar Wordstar. Vale lembrar que esse programa usava um truque divulgado por uns livros na época. Na era da multitarefa isto é dispensável. Ou mesmo no Unix, com seus comandos bg e fg. É por isto que me espanto em comparar MS-DOS dos anos 80/90 com o que Unix fornece. Para melhorar a performance dos programas feitos para dBase, dois amigos tiveram a ideia de escrever um compilador usando programação em C e Assembly. Resolveram chamar-lhe de Clipper. Uma coisa que chamou a atenção é que cada versão lançada vinha com o nome da estação do ano da época. Logo chamaram-nas de Clipper Winter '85, Clipper Autumn '86 e a popular Clipper Summer '87. Tenho até hoje um livro comprado à época, detalhando esta versão. Quem se lembra do Antonio Vidal? Continuando, após a versão de 1987, Clipper deu uma salto para ser independente da plataforma dBase, que se não me engano teve as versões 1, 2, 3 (a mais popular tida por muitos como a melhor, chamada dBase III Plus) e a 4. Clipper deslanchou com versões 5.0, 5.0.X, 5.1, 5.2, 5.3 ... Clipper funcionava, por exemplo, em um disquete onde vinha o próprio compilador, um linkeditor (que podia ser o Plink, o Tlink ou o Rtlink) e livrarias de código nomeadas como CLIPPER.LIB e EXTEND.LIB. Ainda havia uma coisa chamada overlay que era uma quebra de partes do programa compilado por causa da memória da máquina ser muito pequena. Overlays eram lidas de cada vez para não comprometer a memória. Falamos de algo da época dos 386 e 486. Pentium? Ainda não... Uma coisa cultural da época eram os sistemas de fluxo de caixa feitos em Clipper. O lugar mais icônico de sistemas Clipper eram as videolocadoras. E lugares bons de se encontrar sisteminhas Clipper à venda prontos eram em bancas de jornal. Houve algumas empresas negociando a marca Clipper na jogada, com interesses comerciais diversos, como a Oracle, por exemplo, de olho em migrar as bases de dados para seu carro-chefe. Clipper foi passado de mão em mão até seus compiladores perderem poder comercial. Nantucket, Borland, Computer Associates etc. Por volta de 1998, 1999 (?) houve um programador da Usenet que teve a ideia de criar um compilador do tipo do Clipper só que no modelo Open Source (quem conhece uma historinha parecida? Usenet... compartilhar códigos... etc.) e o projeto foi para frente. Chama-se Harbour. Harbour é um jogo de palavras com Clipper. Clipper é um veleiro rápido e Harbour é porto. Ainda surgiram alguns projetos, como o xHarbour, que me pareceu extremamente ambicioso e que tentou ser um fork do Harbour só que bem mais comercial. Da última vez que li algo, parece que tiveram muitos problemas entre eles. E o Harbour continuou firme e forte sem puxão de tapete. Também teve o Clip, projeto russo. Abandonado. O código aqui exposto mostra os rudimentos básicos da linguagem (como todo código de crivo bem o faz). Ainda existem funções e procedimentos inimaginados como @ ...TO ... e @ ... BOX ... que dadas as coordenadas, desenham molduras na tela. @ ... SAY e @ ... GET ... PICTURE ... que também com coordenadas, exibem texto e recebem dados em formato de formulário, navegando pela tela com as setas. As funções SAVESCREEN() e RESTSCREEN() ,que salvavam e restauravam respectivamente em/de variáveis partes da tela e que através de manipulação de dados das cores da tela nas variáveis faziam efeitos de sombra na tela, como o Dialog o faz. E funções incríveis como a DBEDIT() que permitia navegação completa pela base de dados. Links: - O básico * https://pt.wikipedia.org/wiki/Clipper_(linguagem_de_programa%C3%A7%C3%A3o) * https://en.wikipedia.org/wiki/Clipper_(programming_language) * https://es.wikipedia.org/wiki/Clipper_(lenguaje_de_programaci%C3%B3n) - Abandonwares * http://vetusware.com/download/dBASE%20III%20PLUS%203/?id=4877 * http://vetusware.com/download/Clipper%20Autumn%2086%20Autumn%2086/?id=7260 * http://vetusware.com/download/Clipper%20Summer87/?id=8144 * http://vetusware.com/download/CA-Clipper%205.3b%20Intl/?id=8460 Essas acima são boas para se testar no DOSBOX, DOSEMU ou no WINE como comando de DOS - Artigos do VOL * https://www.vivaolinux.com.br/artigo/Clip-no-Slackware-(compilador-Clipper) * https://www.vivaolinux.com.br/artigo/Compilador-Clipper-opensource-compile-sem-problemas-os-sistemas-.PRG-no-Linux/ - Site do Harbour * https://harbour.github.io/index.html - Site do xHarbour * http://www.xharbour.org/ - Páginas brasileiras * http://www.vagucs.com.br/ * http://www.pctoledo.com.br/ Agora quanto ao programa: A partir da versão 5.0 veio uma enxurrada de comandos e operadores que deixou o Clipper/XBase mais parecido com C. O sinal de igual simples nativo em Summer '87 ganhou os dois pontos, ficando semelhante à atribuição em Pascal. E o sinal de diferente é <>. Comentários podem ser feitos como em C, com duas barras // ou barra e asterisco abre e fecha /* ... */ Para declarar uma matriz (array) com alocação dinâmica usa-se a sintaxe PRIMES := {} de modo simples. O comando AADD(VAR,VALOR) cria uma nova posição ao final do array VAR e coloca VALOR como conteúdo desta posição. Laços while são escritos como DO WHILE e encerrados com ENDDO, tudo junto. A estrutura IF segue um modelo semelhante: IF ... ELSEIF ... ELSE ... ENDIF. No código ELSEIF não aparece. O comando SQRT() calcula a raiz quadrada de um dado número. O comando INT() trunca as casas decimais de um número não-inteiro e assim retorna um inteiro. Índices de matrizes usam colchetes. Há operador de incremento como em C, como por exemplo VAR++ ou VAR+=3. Os valores e operadores lógicos aparentemente vieram do Fortran. Para verdadeiro e falso usa-se .T. e .F., para negação, e e ou usa-se .NOT, .AND. e .OR., respectivamente. A operação de módulo, ou resto de divisão, é feita com a função MOD(A,B), onde A é o dividendo e B é o divisor, retornando o resto da divisão. Laço FOR é feito com uma contagem em uma variável e ao final do laço é escrito NEXT junto com o nome da variável. O comando ? imprime uma mensagem na tela com quebra de linha. É semelhante a um comando chamado PRINT, mas usa-se ? para abreviação. O comando ?? faz o mesmo sem quebra de linha. Uma sequência de ?? imprimirá mensagens na mesma linha. A função STR() converte um número em string alfanumérica. Isto é feito para se concatenar com aquele espaço em branco entre aspas que aparece no código. A função TRIM() serve para remover espaços em branco do lado esquerdo e direito de uma string. Por algum motivo não funciona neste exemplo. O operador + presente ao final do código serve como concatenador de strings.

Por: Perfil removido


Função Fatorial Recursiva em Ada 95

Este é um exemplo simples de uma função fatorial recursiva em Ada 95. Cheguei a ler um texto onde era citado que Ada é uma linguagem da família Pascal. Até parecem um pouco. Para a compilação pode ser usado o gnatmake. Ele vem junto com o pacote GNAT nas principais distribuições Linux. Uso: $ gnatmake fatorial-0001.adb Caso seja feita uma tentativa de compilação com o gnat, resultará no seguinte, conforme abaixo: $ gnat fatorial-0001.adb gcc-4.9 -c fatorial-0001.adb fatorial-0001.adb:4:11: warning: file name does not match unit name, should be "mostra.adb" Esta crítica sugere que o nome do arquivo deve ter o mesmo nome do programa declarado na primeira declaração Procedure. Mesmo sem fazer isto, tudo parece funcionar normalmente. Continuando: Este é um exemplo simples, sem aprofundamento. O objetivo é ilustrar uma pequena parte da sintaxe de um programa em ADA. No caso um programa com função recursiva. Posso dizer que até onde vi, Ada parece uma espécie de mistura de Pascal com Java. Coisas como System.out.println() são semelhantes a Ada.Text_IO.Get() ou Ada.Text_IO.Put(). As semelhanças com Pascal são maiores e aparecem mais em outras instruções de declaração de tipos e registros, que não constam no exemplo. Uma semelhança relevante é que não é case sensitive. A diferença é que colocando as bibliotecas com With e Use na primeira linha estes comandos podem ser abreviados para Get() e Put(). Get não foi usado nesta oportunidade. Uma coisa que chama a atenção é o fato de que todo programa deve estar declarado como "Procedure Nome_do_Programa" (semelhante ao "Program Nome_do_Programa" do Pascal) e ainda deve ser seguido da partícula is. Os comandos do programa são implementados entre um Begin e um End. Este último End do programa não termina com o ponto final igual ao Pascal, mas sim com "End Nome_do_Programa", seguido de um ponto-e-vírgula. A implementação da função Fatorial se dá antes do Begin de início do código. Ao invés de se igualar o retorno da função ao nome da mesma, retorna-se o resultado com o comando Return (semelhante ao C). A estrutura de decisão IF é semelhante ao Pascal, com IF, THEN, ELSE, mas neste caso completa-se com END IF. Neste exemplo não aparece o que seria semelhante à estrutura CASE, ficando para uma próxima. Ao invés de se usar um WriteLn para a mudança de linha, usa-se simplesmente o comando New_Line. O comando Put é usado semelhante ao comando Write, sem mudança de linha. A linguagem Ada é poderosa, tendo inúmeros usos estratégicos na indústria, como programação concorrente e orientada a objetos. Não é o objetivo de abordá-los neste micro-artigo.

Por: Perfil removido


Conectar rede WIFI pelo terminal

Faça de modo fácil conexões a redes Wifi WPA/PSK WPA2/PSK com DHCP e wpa_supplicant via terminal sem precisar ficar derrubando e levantando placas ou ficar digitando uma "grande" quantidades de linhas para fazer as coisas funcionarem bem. Com este script/programa você apenas precisa escolher a placa a qual quer se conectar, a rede e digitar a senha para se conectar. E caso queira ainda pode testar a conexão via ping. Para aqueles que curtem uma "tela preta", o script pode dar uma boa acelerada no trabalho de configuração de conexão a redes wifi. Basta dar permissões de execução e executar. Qualquer dúvida leia os comentários no código fonte. :)

Por: Perfil removido


Salvar link favorito

Script útil para quem (assim como eu) usa um gerenciador de janelas simples e que não consegue executar os favoritos que são salvos diretamente pelo navegador (depois de arrastar o atalho para alguma pasta). Este script cria um arquivo .htm que redireciona você para o link que desejar (substituindo, assim, o "atalho" favorito, que normalmente não funcionam nestes WMs) SINTAXE DE USO: $ ./fav add <link> <nome> Onde <link> é o link para "favoritar" e <nome> é o nome que será dado ao arquivo; exemplo: Para salvar um "atalho" para o Google, basta executar: ./fav add http://www.google.com Google O comando acima vai criar um arquivo chamado Google.htm na sua pasta pessoal (/home/$USER) que, ao ser executado, te levará a página do Google OBSERVAÇÕES: #1 - o link deve ser completo (incluindo o http://) e, caso exista algum espaço ou caractere especial nele, deixe ele entre aspas ("") assim: ("http://isso é um exemplo.com"); #2 - por mais que o link possa vir entre aspas (""), o <nome> não pode!! logo, se você precisar criar um arquivo que tenha espaços no nome, crie primeiro o arquivo sem os espaços e depois você adiciona-os, renomeando; DICA: Você pode alterar o destino do arquivo modificando o script, mas precisamente as linhas ' export file="/root/$nome.htm" ' e ' export file="/home/$USER/$nome.htm" ' -> Se você quiser que os links sejam salvos no seu Desktop, por exemplo, basta trocar a linha ' export file="/home/$USER/$nome.htm" ' por ' export file="/home/$USER/Desktop/$nome.htm" ' e a linha ' export file="/root/$nome.htm" ' por ' export file="/root/Desktop/$nome.htm" ' (sem os apóstrofos ['']) NOTA: Eu publiquei também um script para listar os favoritos criados por este script (favs), assim, você pode executá-los por meio de uma lista gerada em um terminal, sem precisar ficar arrastando mouse e clicando; quando o script em questão for publicado, eu posto o link nos comentários deste (favs) Enjoy!

Por: Perfil removido


Escrita de um número em octal na tela em Assembly Puro para Linux 64 bits (GNU Assembler)

Este pequeno programa em Assembly tem uma antiga versão em formato de 32 bits: http://www.vivaolinux.com.br/script/Escrita-de-um-numero-em-octal-na-tela-em-Assembly-Puro-para-Linux-x86-(GNU-Assembler)/ Esta versão está no formato 64 bits, para criação de objeto e linkedição em formato ELF64. De modo semelhante à primeira versão, o código usa a pilha para a reordenação dos dígitos após a sequência de divisões. Também foi escrito para usar variáveis globais, que não são tão adequadas ou elegantes como variáveis locais ou a pilha, visando facilitar a compreensão e dar uma visão mais intuitiva ao programa. Conforme os restos sucessivos são obtidos, são empilhados, sendo ainda acrescidos do endereço inicial da string "digit", de modo que o valor empilhado aponta exatamente - é um endereço de memória, um ponteiro mesmo - para o dígito que será impresso. Conforme vão sendo desempilhados, os dígitos são impressos. O último item desempilhado é um ponteiro para o caractere "new line" armazenado ao final do código. Este caractere identifica o fim da escrita dos dígitos, feita através de um cmp (comparação). As diferenças entre a versão de 32 bits e a de 64 bits são notadamente visíveis no uso das interrupções, modo de chamá-las e registradores. - Interrupção de escrita 32 bits: 4 - Interrupção de escrita 64 bits: 1 - Interrupção de encerramento 32 bits: 1 - Interrupção de encerramento 64 bits: 60 - Chamada de interrupção 32 bits: "int 0x80" - Chamada de interrupção 32 bits: "syscall" - Registradores usados no código com interrupções de 32 bits: eax. ebx, ecx, edx - Registradores usados no código com interrupções de 64 bits: rax. rdi, rsi, rdx No caso dos registradores, percebe-se que em 64 bits houve uma pequena mudança na analogia usual.

Por: Perfil removido