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