Prévia do material em texto
PROGRAMAÇÃO
III
PROF. ANDRÉ RODRIGUES
DE MEDEIROS
FACULDADE CATÓLICA PAULISTA
Prof. André Rodrigues de Medeiros
PROGRAMAÇÃO
III
Marília/SP
2022
“A Faculdade Católica Paulista tem por missão exercer uma
ação integrada de suas atividades educacionais, visando à
geração, sistematização e disseminação do conhecimento,
para formar profissionais empreendedores que promovam
a transformação e o desenvolvimento social, econômico e
cultural da comunidade em que está inserida.
Missão da Faculdade Católica Paulista
Av. Cristo Rei, 305 - Banzato, CEP 17515-200 Marília - São Paulo.
www.uca.edu.br
Nenhuma parte desta publicação poderá ser reproduzida por qualquer meio ou forma
sem autorização. Todos os gráficos, tabelas e elementos são creditados à autoria,
salvo quando indicada a referência, sendo de inteira responsabilidade da autoria a
emissão de conceitos.
Diretor Geral | Valdir Carrenho Junior
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 5
SUMÁRIO
CAPÍTULO 01
CAPÍTULO 02
CAPÍTULO 03
CAPÍTULO 04
CAPÍTULO 05
CAPÍTULO 06
CAPÍTULO 07
CAPÍTULO 08
CAPÍTULO 09
CAPÍTULO 10
CAPÍTULO 11
CAPÍTULO 12
CAPÍTULO 13
CAPÍTULO 14
CAPÍTULO 15
07
18
26
34
42
50
57
64
71
81
89
98
107
119
128
INTRODUÇÃO
CONCEITOS SOBRE OPEN SOURCE
CONCEITOS BÁSICOS DE INTELIGÊNCIA
ARTIFICIAL
TECNOLOGIAS E METODOLOGIAS
UTILIZADAS
MATERIAIS E MÉTODOS ESPECÍFICOS
PYTHON BÁSICO (PARTE 1)
PYTHON BÁSICO (PARTE 2)
PYTHON BÁSICO (PARTE 3)
PYTHON BÁSICO (PARTE 4)
O PROTÓTIPO (PARTE 1)
O PROTÓTIPO (PARTE 2)
O PROTÓTIPO (PARTE 3)
O PROTÓTIPO (PARTE 4)
O PROTÓTIPO (PARTE 5)
REVISÃO DO CÓDIGO NA ÍNTEGRA
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 6
INTRODUÇÃO
Nesta disciplina explora-se a intersecção entre o movimento maker e tecnologias
contemporâneas para inteligência artificial. Como notadamente essas novas tecnologias
e metodologias tornam-se mais acessíveis e protagonistas no dia a dia de pessoas
e empresas, são objetivos desta disciplina a busca pela análise de algumas dessas
tecnologias, encontrar possíveis contributos para a área, além de demonstrar passo-
a-passo a viabilidade técnica de se construir um protótipo de software computacional
de assistência pessoal, reprodutível e aplicável, utilizando-se dos conceitos maker,
juntamente com o uso destas tecnologias, dentro da linguagem de programação
Python se apropriando de todos os conhecimentos de programação já adquiridos ao
longo do curso.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 7
CAPÍTULO 1
INTRODUÇÃO
Nos últimos anos, o crescente interesse e aumento da procura por tecnologias
para ciência de dados, sistemas inteligentes e cognitivos (inteligência artificial), e
sobretudo a chamada cultura maker, tem marcado a formação de profissionais e o
posicionamento de diversas empresas por todo o mundo.
Esta disciplina pretende analisar essas tecnologias contemporâneas e o movimento
maker, abordando conceitos e ferramentas que podem ser aplicadas em soluções reais.
Uma vez que experiência-se uma nítida mudança nas formas contemporâneas
de produzir conhecimento, gerar negócios e compartilhar informação, a construção
de novas ferramentas através de diversos recursos open source se torna quase que
um imperativo nesse novo contexto de pessoas e empresas, exigindo não só novas
abordagens e tecnologias, mas novas competências e habilidades que precisarão ser
desenvolvidas de forma adequada e direcionada.
Cabe também, apenas a título de localização, apresentar brevemente o contexto
regional onde esta disciplina foi desenvolvida. O Centro-Oeste Paulista é uma grande
região do estado de São Paulo, no Brasil, que compreende o entorno das cidades de
Araçatuba, Assis, Bauru, Marília, Tupã e Presidente Prudente.
A região destacou-se ao longo do século XIX e até a primeira metade do século
XX, ao lado do Nordeste e Noroeste Paulista, como a principal região cafeeira do
estado, grão que impulsionou a economia e a colonização local durante o período.
Atualmente, a região ainda conta com forte presença do setor agropecuário em sua
economia, que está associado a um significativo crescimento do terceiro setor, desde
o final do século XX.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 8
Figura 1 – Macro Região Centro Oeste Paulista
Fonte: http://g1.globo.com/sp/presidente-prudente-regiao/especial-publicitario/unimed-centro-oeste-paulista/noticia/2016/07/interacao-com-comunidade-e-
suporte-unimeds-o-que-faz-unimed-centro-oeste-paulista.html
Ao longo das últimas duas décadas a região também vem se mostrando de grande
potencial para empresas de tecnologia, principalmente softwares para negócios e
serviços especializados em segmentos distintos de mercado, possuindo hoje grandes
players nacionais da área, além de diversas pesquisas acadêmicas da UNESP Bauru
direcionadas ao tema.
Com o advento da inteligência artificial e a onda de movimento maker chegando
com força à região, surgiram diversos projetos, novos empreendimentos, bem como
iniciativas que visam se apropriar dessas tecnologias e metodologias open source
para gerar inovação, campos de estudo e novos negócios.
1.2 Negócios em tecnologia na região
As pesquisas sobre o tema tendem a ser complexas uma vez que os processos
de desenvolvimento das ferramentas tecnológicas ainda não estão ‘acabados’, fruto
da constante evolução técnica e das interações sociais subjacentes. No entanto,
queremos entender nesse atual momento de desenvolvimento quais aspectos e
impactos estão sendo trazidos para a cena tecnológica, bem como compreender
o como se produzem novas soluções, protótipos ou até mesmo novas empresas
e modelos de negócios.
Além disso, como observa Belluzzo (2019), pode-se considerar que
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 9
“A partir de uma abordagem do mundo contemporâneo, dos novos
paradigmas, da consciência planetária, da globalização, chegar-se-á
à era digital, destacando-se os seus impactos sobre a valorização
da informação e do conhecimento como bens de valor. Ressalta-se
que a produção do conhecimento, na atualidade, é uma questão
fundamental, tratando-se de uma teoria voltada à sua própria
prática: ao mesmo tempo em que a fundamenta, subordina-se a ela,
implicando necessariamente em mudanças no modo de pensar/
atuar das pessoas. A educação também é parte desse cenário de
mudanças e existem razões para que seja um referencial diferenciado
na chamada “sociedade em rede”, sendo uma situação emergente
a mudança de postura no que diz respeito à migração da sua
identidade como transmissora de informação e de cultura para uma
condição de ensinar a aprender e a pensar, preparando pessoas para
que prolonguem os benefícios da escola além da escola mesma,
tornando funcionais os conhecimentos adquiridos e, sobretudo, para
que saibam empregar o poder da inteligência na vida profissional e
no seu cotidiano”.
Com isso em mente e olhando a região atual de trabalho, notamos o surgimento
não somente de “empresas de software”, mas start-ups (iniciativas que se tornam
negócios de alta rentabilidade, baseados no empenho individual ou coletivo), projetos
com diversas tecnologias contemporâneas, inclusive inteligência artificial, que servem
de incubação para novos negócios através de eventos chamados hackathons (da junção
das palavras inglesas hacker e marathon), maratonas de programação intensiva, de
forma que sejam obtidos produtos, resultados e/ou soluções concretas ao final de
cada encontro (MANOVICH, 2005).
É interessante entender como se comportam os profissionais e/ou pesquisadores da
área com relação a esse novo cenário, com tecnologias e conhecimentos disponíveis
abundantemente em diversos canais e meios? Seria necessária uma constante
formação do indivíduo? Uma curadoriade conteúdos relevantes para cada demanda?
Multidisciplinaridade no sentido de construir novas pontes?
Mas antes de aprofundar nossa reflexão, cabe definir alguns conceitos, tipos de
atividades e negócios, tanto pelo prisma de resultados já obtidos como de planejamentos
e possibilidades para novas metas e objetivos.
O vasto mercado de tecnologia impõe que profissionais, pesquisadores e empresas
determinem constantemente novas plataformas, novas metodologias e, em cima disso,
tragam resultados tangíveis e concretos para os ambientes em que estão inseridos.
No entanto, não há nenhuma ‘receita de bolo’ que funcione ‘tão bem como antes’, pois,
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 10
no contexto contemporâneo, se ontem o problema foi resolvido por um caminho, hoje
existem inúmeros meios de se fazer isso. Qual seria o mais vantajoso para todos os
interessados?
ISTO ACONTECE NA PRÁTICA
Para responder a tais questionamentos selecionamos algumas empresas para
exemplificar o cenário atual de negócios da região. Trata-se de empresas com
atuação estratégica no estado de São Paulo e em todo Brasil, que utilizaram
tecnologias contemporâneas para desenvolver seus projetos, além de possuírem
uma atitude notadamente maker entre seus pesquisadores e empreendedores,
alguns estudantes ou profissionais em início de carreira. Cita-se, a seguir, perfis de
negócios multifacetados, que nos dará uma percepção mais completa do panorama
do mercado regional. São elas:
Dataplace: Há mais de 30 anos temos colocado em prática nossa missão: prover
soluções tecnológicas adequadas, abrangentes, eficazes e inovadoras para integrar
pessoas à tecnologia da informação.
Finch: Disrupção tecnológica na área jurídica com inteligência artificial e data science;
Lecom: BPM (Business Proccess Management, gestão de processos de negócios)
e serviços especializados em tecnologia, para redução de retrabalho com ambientes
digitais;
NewWay: Softwares e serviços para marketing digital que incluem tecnologias
para aprimorar a comunicação entre empresas e indivíduos, usando também novas
tecnologias;
OnClick: Fundada em 1999, a ONCLICK é uma empresa de tecnologia focada no
desenvolvimento de soluções empresariais, com cerca de 130 colaboradores e mais
de 1.500 clientes.
Tray: Tray Plataforma de E-commerce, do início ao sucesso do seu e-commerce.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 11
TOTVS Bauru: Uma unidade da maior produtora de softwares e serviços segmentados
por indústria no Brasil. A TOTVS foi uma das primeiras startups do Brasil em meados
de 1983 e hoje está presente em todo o mundo, com tecnologias de ponta;
Yank!: Robotização e automatização especializada de processos, reduzindo
retrabalhos e erros humanos através de inteligência em processamento de dados e
processos.
A seguir traça-se um breve histórico e contextualização de cada um desses ramos
de negócios sediados em cidades dessa região.
1.2.1 Resumo de perfil empresarial
Abaixo um breve resumo dessas empresas, conforme suas próprias definições
disponíveis nos seus respectivos sites:
Dataplace: Há mais de 30 anos, a Dataplace Business Solution oferece soluções
integradas para uma gestão empresarial com foco no aumento da produtividade e
incremento da lucratividade de seu negócio aliada a máxima valorização de seus
colaboradores.
O Dataplace ERP é um software modular, flexível e customizável construído para
se adaptar à condição da sua empresa, automatizando e otimizando seus processos
gerenciais para que possa obter os melhores resultados através de dados confiáveis
e reais.
Finch: “A Finch Soluções nasceu em 2013 de nosso potencial disruptivo de revolucionar
atividades e processos relacionados ao controle do contencioso de massa (volume de
processos) do maior escritório de advocacia do Brasil, o JBM advogados, aumentando
sua produtividade e ganhos de eficiência. No início fomos destaque pela implementação
de robôs de captura de informação, automação e gestão de processos para negócios
no mundo jurídico, criando cases que abriram caminho para novos paradigmas de
evolução.” (Disponível em: http://www.finchsolucoes.com.br/quem-somos)
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 12
Lecom: “Há mais de 20 anos, temos nos especializado em transformar processos
analógicos em constantes experiências digitais.” (Disponível em: lecom.com.br)
New Way: “Somos um grupo de pessoas conectadas pelo propósito de transformar
o relacionamento digital das empresas com seus clientes e colaboradores, através de
tecnologia e humanização. Inovamos para aproximar!” (Disponível em: newway.com.br)
OnClick: Desde sua fundação, há mais de 20 anos, houve muitas mudanças. Nosso
sistema ERP (ONCLICK ERP) foi o que iniciou toda a nossa história e se mantém como
um dos nossos principais produtos. No entanto, a ONCLICK é hoje uma plataforma
completa de soluções empresariais, impulsionando clientes e parceiros, gerando valor
para as pessoas e competitividade para os negócios.
Tray: Desde 2003 a Tray vem acompanhando o crescimento do e-commerce junto
aos seus primeiros passos, sempre com o olhar atento para as necessidades que
surgem com as constantes mudanças e transformações. Através da observação das
tendências e com o compromisso de superar as expectativas dos usuários, a Tray
construiu um portfólio sólido de produtos e serviços para ajudar os entusiastas e
investidores do comércio eletrônico a obter sucesso em seus negócios.
Com uma evolução guiada pela inovação, a Tray está construindo uma história de
sucesso e comprometimento com o E-Commerce, ao mesmo tempo em que contribui
para a democratização do varejo on-line nacional, criando soluções que permitam a
um número cada vez maior de pessoas participarem desse universo.
Em 2015 assumiu o papel de vertical de e-commerce da Locaweb, pioneira em
serviços de internet no Brasil, formando o maior e mais completo mix de produtos
voltados ao comércio eletrônico do Brasil.
TOTVS: “Fundada em 1983 como Microsiga, uma das primeiras start-ups do Brasil,
a TOTVS expandiu, evoluiu e multiplicou seus negócios ao longo de sua trajetória.
Como uma empresa originalmente brasileira, a TOTVS acredita no ‘Brasil que faz’ e
apoia o crescimento de milhares de negócios e empreendedores, de norte a sul do
país, por meio da tecnologia. Atua através de unidades próprias e franquias em mais
de 40 países. A TOTVS Bauru é a única credenciada para esse portfólio na região.”
(Disponível em: totvs.com.br)
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 13
Yank!: “A solução definitiva para a robotização de seus processos. Há 8 anos
robotizando processos corporativos, a Yank conta com um time de especialistas em
RPA (robotic process automation), para automatizar os processos de forma ágil, em
diferentes verticais de mercado.” (Disponível em: yanksolutions.com.br)
Com essa breve introdução, pretendemos apresentar alguns conceitos que facilitam
a compreensão e o acompanhamento do cenário atual do mercado de solução em
softwares, que usam recursos tecnológicos contemporâneos de inteligência artificial
e que têm no movimento maker um inoculador da prática real de ideias e projetos.
1.3 O Movimento Maker
“Fazer com as próprias mãos” se tornou um novo mantra contemporâneo. Dentro
desse conceito surge uma noção de reunir amigos, clientes, parceiros, colaboradores,
de modo presencial ou remotamente, para cruzar as habilidades e multidisciplinaridade
de todos visando obter algo novo no final.
Os makers surgiram nos Estados Unidos há alguns anos e ganharam força
recentemente. Hoje, já existem várias publicações dedicadas aos interessados nesse
tipo de empreendedorismo e seus seguidores se encontram anualmente em eventos
para discutir as novidades do mercado. A Maker Faire, que acontece na Califórnia, é a
principal feira quepropaga a ideia do Do It Yourself (faça você mesmo).
Um novo produto, uma nova teoria, alguma plataforma, enfim, o objetivo é criar e
co-criar novas ideias usando todos e quaisquer recursos disponíveis, principalmente
tecnológicos e de relacionamentos humanos.
A versão atual do DIY teve seu início na primeira década do século XX. Norte
americanos defensores do movimento de Art and Crafts promoveram o interesse
pelo estilo simples da arquitetura doméstica, despertando o interesse do mercado
produzindo magazines a respeito de mecânica popular e ciência popular, além de
publicar artigos sobre como fazer coisas e encorajar os donos de casa a empreender
algumas de suas remodelações (ROSSI, et al, 2016).
Dentro desse modo de pensar o mundo surgiram milhares de iniciativas visando
construir novos conceitos e trazer à tona novas ideias, como se realmente nossa
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 14
geração buscasse “minerar” a mente humana, utilizando apoios diversos para obter
um verdadeiro diamante do espírito deste tempo: a inovação.
Anderson (2012, p. 29) resumiu a história tecnológica das duas últimas décadas
em duas sentenças: “nos últimos dez anos descobriu-se novos meios para as pessoas
criarem, inventarem e trabalharem juntas na internet. Nos próximos dez anos esses
conhecimentos serão aplicados no mundo real”.
Além disso, o autor lembra que mudanças profundas em determinados setores
da sociedade terminam por desencadear novas mudanças em todo o tecido
social:
“O que propiciou uma mudança cultural - um fascínio com novos
protótipos digitais e um desejo de estender o fenômeno online no
mundo real - está agora iniciando uma mudança econômica também.
O movimento maker está começando a mudar a cara da indústria,
na medida em que novos instintos empreendedores vão aparecendo
e atividades que eram de lazer se tornam pequenas companhias.”
(ANDERSON, 2012, p. 31)
Para entendermos essas considerações é necessário avaliarmos o espaço virtual
como um vetor de novas possibilidades que encontra em seu próprio meio alternativas
de reaproveitamento e atualização de ideias que geram produtos de inovação nunca
antes pensados. Segundo Lévy (1996), virtual não é o contrário de real, mas sim tudo
aquilo que tem potencialidade para se concretizar. As criptomoedas como a bitcoin
são produtos advindos desta hibridização que tem ação real e concreta em promover
cada vez mais o pensar global e o agir local[1].
1.4 O exemplo da Bitcoin e Blockchain
Em um pequeno, mas contundente artigo de apenas nove páginas, Nakamoto (2009),
criou um conceito e o comprovou matemática e computacionalmente.
No texto original ele define em poucas páginas como um encadeamento de códigos
com criptografia poderiam garantir a mesma confiabilidade que uma moeda real
possui ao ser intermediada por governos e bancos, que para todos os efeitos são os
garantidores de que uma moeda valha algo.
_____________________________
[1] Deve-se esta formulação ao sociólogo alemão Ulrich(1999), que se dispôs a refletir sobre o fenômeno da globalização.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 15
Figura 3 – Suposto criador da bitcoin
Fonte: https://foxbit.com.br/blog/qual-o-motivo-de-satoshi-nakamoto-nao-movimentar-seus-bitcoins%EF%BB%BF-noticias-da-semana/
Existe uma certa ‘lenda’ em torno do autor(a) do artigo original, pois Nakamoto
até o momento ‘não existe’. Isso porque ninguém se apresentou como autor desta
tecnologia, permanecendo em anonimato. Essa situação abre margem para diversas
especulações, como a de que a bitcoin pode ter sido concebida não por uma, mas por
diversas pessoas que escolheram o pseudônimo “Satoshi Nakamoto”. A algum tempo
surgiram imagens do homem acima que afirmavam ser a do criador do bitcoin, mas
ele negou veementemente.
Além disso, como criador ou criadores da bitcoin, hoje ele(s) possui(em) uma “cota”,
ou melhor, uma verdadeira fortuna em bitcoins, um número que gira em torno de
alguns bilhões de dólares. Dinheiro este que permanece intocado, rendendo lucros e
muitas especulações, embora o mercado atual já utilize o bitcoin em grande escala.
O fato é que a bitcoin não depende de intermediários, nem de um banco, por isso resulta
em tarifas quase zero. Por ser uma rede peer-to-peer (de ponto a ponto) compartilhável
e altamente criptografada, recebe o trabalho de programadores conhecidos como
“mineradores”. Usuários interessados se fazem responsáveis em quebrar a informação
da bitcoin para entregar a moeda como ela é possível de ser utilizada. Nota-se que
são diversos mineradores unidos que conseguem realizar esse trabalho em troca de
receberem uma parte do objeto que mais se valoriza nos últimos anos. Essa analogia
se assemelha aos ‘mineradores de ouro’, por isso o nome, e eles são recompensados
pelas suas atividades de “minerar” a moeda na rede[1].
O funcionamento da bitcoin é feito por meio da chamada blockchain. A definição
mais básica de blockchain é um ledger (registro) digitalizado e compartilhado que não
pode ser alterado uma vez que uma transação tenha sido registrada e verificada. Todas
_____________________________
[1] Confira em:http://comunicacaoadororo.wixsite.com/adoro-robotica/single-post/2018/08/03/Bitcoin-Moeda-livre-de-fronteiras
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 16
as partes da transação, bem como um número significativo de terceiros mantém uma
cópia do ledger do blockchain, o que significa que seria praticamente impossível alterar
todas as cópias do livro de registro globalmente para falsificar alguma transação
(LYRA E MEIRIÑO, 2019).
O sucesso da bitcoin desencadeou o estabelecimento de quase mil novas
criptomoedas, levando à ilusão de que a única aplicação da tecnologia blockchain é
para a criação de criptomoedas. No entanto, a tecnologia blockchain é capaz de muito
mais do que apenas criar criptomoedas e pode suportar transações como as que
exigem identificação pessoal, revisão por pares, eleições e outros tipos de decisões
democráticas e trilhas de auditoria.[2]
À parte das lendas urbanas, hoje existem dezenas, quiçá centenas de criptomoedas,
versões alternativas e ampliadas, todas nascidas de iniciativas notadamente makers,
sempre com muita pesquisa e muito “hands-on”, termo este que também vem sendo
amplamente utilizado e que corresponderia a colocar a “mão na massa”, unindo pessoas
com habilidades multidisciplinares e recursos tecnológicos para a construção de algo
novo.
Figura 4 – Modelos de rede
Fonte: Sênior Softwares
Como podemos visualizar na imagem acima, dentre os vários modelos, o bitcoin
envolve uma rede descentralizada. Cada integrante da rede é conhecido como um
“nó”. Ou seja, se você tem um computador preparado com um software para realizar
transações com bitcoins, essa máquina passa a ser um nó nessa rede, que só tende
a crescer.
Esse software para transações de bitcoins mantém e ajuda a distribuir cópias
atualizadas em tempo real da “cadeia de blocos”. Cada vez que transações são realizadas
(blocos são adicionados), todos os “nós” são comunicados para que possam atualizar
_____________________________
[2] Confira em: https://br.cointelegraph.com/tags/blockchain
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 17
os registros com as novas informações em toda a rede. A informação se propaga
para que todos se “auto-validem”.
ANOTE ISSO
O mecanismo de comunicação sempre é criptografado, com métodos de chaves
privadas e públicas, e isso impede que a rede seja invadida ou que “nós” sejam
adicionados de forma imprópria ou até ilegal.
Portanto, podemos considerar que os “nós” participam da validação das transações.
Além disso, uma série de algoritmos são aplicados para verificar se há consenso sobre
a realização de determinada transação.
Assim, se você está recebendo bitcoins de alguém como forma de pagamento,um processo de verificação junto aos “nós” confirmará a validade e consenso dessa
operação.
Essa transação será então registrada na “grande rede” da blockchain. Como esse
registro não pode ser apagado, em tese, ninguém consegue ‘subtrair’ esses bitcoins
de você fazendo alterações nos blocos, pois isso geraria uma divergência entre as
validações de todos os “nós”. Como consequência dessa lógica das criptomoedas,
não haveria mais necessidade de “entidades garantidoras”, como bancos e governos.
Diante disso, torna-se interessante destacar que esta disciplina é uma iniciativa
puramente maker e tecnológica de uma pessoa ou um grupo delas para, com ‘as
próprias mãos’, criar a sua própria criptomoeda digital, impactando o mundo real
com ideias trazidas à realização prática, reunindo o que há de disponível no presente
momento. Sendo assim, diante de tais conquistas, cabe refletir: quantos outros feitos
mais podem ser empreendidos nessa e em outras direções? Para isso será necessário
que todos possam participar e colaborar no desenvolvimento dos softwares. Portanto,
será necessário um código aberto.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 18
CAPÍTULO 2
CONCEITOS SOBRE
OPEN SOURCE
Um bom resumo do conceito de open source foi dado pelo site CanalTech (2020),
que o define da seguinte forma:
“Open source é um termo em inglês que significa código aberto. Isso
diz respeito ao código-fonte de um software, que pode ser adaptado
para diferentes fins. O termo foi criado pela OSI (Open Source Initiative)
que o utiliza sob um ponto de vista essencialmente técnico.”
O termo open source, bem como o seu ideal foram desenvolvidos por Eric Raymond e
outros fundadores da OSI com a finalidade de apresentar um “software livre a empresas
de uma maneira mais comercial”, evitando discursos éticos e de direitos.
A nomenclatura “Open Source” apareceu durante uma reunião ocorrida em fevereiro
de 1998, em um debate que envolveu personalidades que posteriormente se tornariam
referências no assunto: Todd Anderson, Chris Peterson, Larry Augustin, Jon “Maddog”,
Sam Ockman e Eric Raymond.
A sigla FLOSS, que em inglês significa “Free/Libre and Open Source Software”, é uma
forma agregadora de utilizar os conceitos de Software Livre e Código Aberto a favor
dos mesmos softwares, visto que ambos se diferenciam apenas na argumentação,
como já mencionado.
Os desenvolvedores e defensores do conceito Open Source afirmam não se tratar
de um movimento “anticapitalista”, mas sim de uma alternativa para o mercado de
indústria de software e tecnologias. Esse modelo colaborativo presente no open source
levou o direito do autor a ser olhado por um outro prisma, concatenando-se com
o movimento maker que, em essência, é baseado em recursos já disponíveis e em
colaboração.
A criação da Open Source Development Lab (OSDL) é um exemplo dos grandes
esforços realizados por várias empresas já consolidas, como IBM, Dell, Intel e HP,
para trabalhar com a criação de tecnologias de código aberto, mesmo tendo vínculos
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 19
societários e obrigações determinadas de obtenção de lucros e dividendos, o que
denota a importância do conceito.
A OSI (Open Source Initiative) propõe dez pontos importantes para que um software
possa ser considerado Open Source:
1 - Distribuição livre
A licença do programa não deve de nenhuma forma restringir o acesso gratuito por
meio de venda ou mesmo de permutas. Nesta dissertação utiliza-se a licença Creative
Commons que será abordada em respectivo tópico.
2 - Código fonte
De fundamental importância, o software deve conter um código fonte que deve
permitir a distribuição também na forma compilada. Caso o programa não seja
distribuído com seu código fonte, o desenvolvedor deve fornecer um meio para se
obter o mesmo. O código fonte deve ser legível e inteligível para qualquer programador.
Nesta dissertação possibilita-se todo e qualquer acesso.
3 - Trabalhos derivados
A licença do software deve fornecer permissão para que modificações sejam
realizadas, bem como trabalhos derivados. Também deve permitir que sejam distribuídos,
mesmo após modificação, sobre os mesmos termos da licença original.
4 - Integridade do autor do código fonte
A licença deve, de maneira clara e explícita, permitir a distribuição do programa
construído por meio do código fonte modificado. No entanto, a licença pode requerer
que programas derivados tenham um nome ou número de versão distintos do programa
original. Isso dependerá da preferência do desenvolvedor do código.
5 - Não discriminação contra pessoas ou grupos
A licença deve estar disponível para qualquer grupo de pessoas e qualquer indivíduo.
6 - Não discriminação contra áreas de atuação
A licença deve permitir que qualquer pessoa de qualquer ramo específico possa
fazer a utilização do programa. Ela não deve impedir, por exemplo, que uma empresa
faça uso de seu código.
7 - Distribuição da Licença
Os direitos associados ao software devem ser aplicáveis para todos aqueles cujo
programa é redistribuído, sem que exista a necessidade da execução de uma nova
licença, ou licença adicional para estas partes.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 20
8 - Licença não específica a um produto
O programa pode fazer parte de um outro software, sendo que para utilizá-lo é
obrigatório que seja distribuído todo o programa. Se o programa é extraído dessa
distribuição, é necessário assegurar que todas as partes sejam disponibilizadas e
redistribuídas para todos, visto que todos possuem os mesmos direitos que aqueles
que são garantidos em conjunção com a distribuição do programa original.
9 - Licença não restrinja outros programas
A licença não pode ser considerada open source se colocar restrições em outros
programas que são distribuídos juntos com o programa licenciado.
10 - Licença neutra em relação à tecnologia
A licença deve permitir que sejam adotados estilos e tecnologias sem restrições.
Isso quer dizer que nenhuma cláusula da licença pode estabelecer regras para que
estes quesitos mencionados sejam aplicados ao programa.
A noção de open source trouxe um modo bastante interessante de se pensar o
desenvolvimento da tecnologia digital e constitui, de certa maneira, a essência desta
disciplina. Um dos exemplos de maior sucesso de programação open source é a
linguagem Python, que utilizaremos em nossa disciplina.
2. 1 Linguagem de Programação Python
As linguagens de programação vêm evoluindo de forma bastante acelerada nas
últimas décadas, inclusive acompanhando a evolução do hardware e das pessoas
que se dedicam a esta atividade.
Cabe lembrar que, atualmente, profissionais de outras áreas, além de ciências exatas,
vêm se interessando pela programação e se envolvendo com tal conteúdo, de forma a
encontrar e viabilizar aplicações voltadas especificamente para seus ramos de estudo.
Nesse contexto, a linguagem de programação Python tem se mostrado de “fácil
acesso” para o público em geral, sendo vastamente já utilizada no meio acadêmico e
em pesquisas de empresas. Agora, acompanhamos um aumento vertiginoso da sua
utilização por profissionais das mais diversas áreas, especialmente nos últimos oito
anos, conforme pode-se notar no gráfico abaixo que apresenta um breve comparativo
de algumas linguagens de programação contemporâneas que se destacam no ambiente
de desenvolvimento de softwares:
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 21
Figura 5 – Comparativo crescimento no uso de Python
Fonte: Data Science Academy
A linguagem de programação Python foi originalmente desenvolvida por Guido Van
Rossum, na década de 80. A proposição de Python considerava o interesse explícito
dos programadores em diminuir os esforços demandados pela própria linguagem,
tais como àqueles relativos ao sistema de tipos e a marcaçãode final de comando
(com ponto e vírgula, por exemplo), tornando o tempo dedicado à programação mais
eficiente (ROSSUM E DRAKE, 2012).
Em meados dos anos 2000, essa linguagem de programação torna-se open source,
visando a participação ativa e voluntária de diversas pessoas com a finalidade de
contribuir para o ecossistema da linguagem, tornando-a constantemente evoluída.
Além disso, com a massiva quantidade de dados disponíveis nas mais variadas formas
e plataformas, além da proliferação de tecnologias voltadas para Internet, as micro,
pequenas e médias empresas (PMEs), apesar de suas restrições de tamanho, receita e
pequeno número de funcionários, podem também se beneficiar desta vasta informação
disponível e gerar valor para si próprias.
Importante também lembrar que Python conta com uma grande documentação
disponível em vários idiomas, além de inúmeros fóruns de discussão onde toda pessoa
ao redor do mundo pode colaborar com exemplos, dúvidas, dicas, melhorias e outras
demandas.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 22
A título de exemplo sobre a documentação referida, segue abaixo uma captura de
tela do site oficial em sua versão em inglês:
Figura 6 – Site Python Oficial
Fonte: https://www.python.org/doc/
Também na versão em português brasileiro encontraremos vasto material, sendo
a comunidade brasileira uma das mais movimentadas do mundo:
Figura 7 – Documentação Python online
Fonte: https://docs.python.org/pt-br/3/
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 23
Com todos esses atributos, a linguagem em Python demonstrou-se ser a mais
adequada para a realização desta disciplina, possibilitando colocar em prática ideias
sobre tecnologia, movimento maker e open source colaborativo, com o objetivo de
obter um impacto concreto no ecossistema em que está inserido.
2.2 Pacotes Python
Além da facilidade de instalação, aprendizado e utilização, Python oferece também
milhares de pacotes prontos (pacotes adicionais), com recursos já pesquisados por
grandes universidades, empresas e pesquisadores independentes, que contribuem
com a comunidade de desenvolvimento.
De maneira bastante simples é possível adicionar esses “pacotes” ao Python e
usufruir de novos recursos e comandos que simplificam a vida do profissional e/ou
pesquisador. Dessa forma, podemos, por exemplo, usar um pacote de inteligência
artificial, sem nem ao menos programar nenhum código ou algoritmo de machine
learning (aprendizado de máquina).
Isso é possível porque a linguagem consegue encapsular tais recursos em
camadas, permitindo chamadas mais simples de determinados comandos, facilitando
imensamente sua utilização e produtividade, sendo o desenvolvedor responsável por
consumir tais recursos gradativamente conforme suas demandas (SGANDERLA,
FERRARI, GEYER, 2003). É o caso, por exemplo, do pacote “ChatterBot”, que utilizamos
nesta disciplina e que será abaixo mais detalhadamente descrita, assim como os
demais pacotes selecionadas e utilizadas nesta pesquisa (TEIXEIRA ET. AL., 2005).
Para tanto, há alguns anos foi criada a ferramenta PyPi (Python Package Index, ou
em tradução livre “Índice de pacotes Python”), onde todos os interessados podem
incluir e fazer downloads de novos recursos. Pode-se usá-la para instalar pacotes,
programas ou simplesmente códigos, feitos pela comunidade e armazenados como
pacotes no PyPi:
O PyPI é, de fato, o maior repositório de código Python que temos
hoje em dia. Nele, temos desde códigos amplamente usados, como
o numpy, até códigos bem menores e menos conhecidos, como
o cidadaobr, um gerador de dados de um brasileiro que pode ser
ampliado e melhorado. (ALURA CURSOS, 2020)
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 24
Observe assinalado em vermelho na captura de tela abaixo, a quantidade de projetos,
atualizações, arquivos e usuários disponíveis:
Figura 8 – Pacotes disponíveis em Python
Fonte: https://pypi.org/
É possível realizar diversas buscas por temas e assuntos relevantes que
proporcionarão resultados com os pacotes mais adequados para o projeto, conforme
as suas demandas.
Nesta disciplina utilizamos alguns pacotes que encapsulam recursos básicos e
avançados, abaixo elencadas. Vale lembrar que os procedimentos necessários para a
reprodução dos resultados obtidos, por qualquer profissional ou pesquisador interessado
no assunto, estão disponíveis nos anexos 1 e 2.
2.3 Por que Python?
Selecionamos abaixo alguns motivos destacados pela Python Academy
(pythonacademy.com.br) para se estudar e utilizar Python. A saber:
Python tem diversas característica que fazem dela uma linguagem dita simples.
Primeiro, trata-se de uma linguagem de alto nível, ou seja, não é necessário (mas
aconselhável) conhecer detalhes de hardware, ou linguagens de baixo nível para
começar a aprender Python.
Requer menos código para concluir tarefas básicas (como loops, estruturas de
decisão, tratamento de exceção, declaração de classe, etc) quando comparado a outras
linguagens, como Java (código de 3 a 5 vezes menor) e C (de 5 a 10 vezes menor).
Código menor = menor chance de erro!
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 25
Por ser uma linguagem de programação simples, quem começa a programar em
Python rapidamente estará desenvolvendo programas complexos e robustos!
Aprendendo o básico de Python, você estará apto a desenvolver: sistemas web,
aplicações multiplataforma, jogos e interfaces gráficas.
Além disso, trata-se de uma linguagem Multiplataforma. Por ser uma linguagem
interpretada, e não compilada para linguagem de máquina, Python pode ser executado
em diferentes plataformas.
Uma linguagem interpretada é aquela na qual seu código-fonte é lido por um
interpretador e convertido em código executável, o qual será executado por uma
máquina virtual. Em Python, esse processo é dividido em 4 etapas:
Análise Léxica: Quebra do código-fonte em tokens (strings com sentido identificado).
Parsing: Processo de pegar esses tokens e gerar estruturas que mostram o
relacionamento entre cada token (no caso do Python, essa estrutura é uma Abstract
Syntax Tree - AST).
Compilação: Transformação de uma AST em um ou mais Code Objects (“pedaços”
de código executável).
Interpretação: De posse dos Code Objects, o Interpretador então executa os códigos
ali representados.
Existem muitos outros motivos para escolhermos Python, porém para o momento,
estes bastam para a nossa compreensão.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 26
CAPÍTULO 3
CONCEITOS BÁSICOS DE
INTELIGÊNCIA ARTIFICIAL
“I propose to consider the question, ‘Can machine
think?’ This should begin with definitions of the
meaning of the terms ‘machine’ and ‘think’.”
Alan Turing
O termo “cognição e sistemas inteligentes” talvez descrevesse melhor o campo de
estudos que estamos analisando, dentro do qual a chamada Inteligência Artificial (IA)
acabou por se tornar mais proeminente e mais popular. Esse campo consiste em uma
série de reflexões que buscam reproduzir características da mente humana usando
elementos computacionais (LAUREANO, 1999).
Segundo Teixeira (2019), a Inteligência Artificial pode ser definida como a ciência que
estuda a emulação do comportamento da inteligência humana por meio de máquinas,
tentando compreender de que forma se processa o pensamento humano para entender
de modo a poder representá-la por meio de um computador.
Nesse sentido, a mente humana funcionaria “como um computador, e por isso o
estudo de programas computacionais é a chave para se compreender alguma coisa
acerca de nossas atividades mentais” (TEXEIRA, 2019, p.10).
Com o conhecimento da simulação da mente humana em máquinas é possível, por
exemplo, desenvolver chatterbots (ROTHERMEL E DOMINGUES, 2007) para conversação
e interação humano–máquina que podem desempenhar funções específicase ‘ordens’,
ou ainda aplicar algoritmos que simulariam a mente humana tomando decisões nos
mais variados níveis, dependendo única e exclusivamente de volumes de dados e
cálculo de padrões matemáticos (NEVES E BARROS, 2005).
Se nos remetermos às origens da computação podemos reconhecer tais ideias e
conceitos:
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 27
(...) Como Ada Lovelace, Alan Turing era um programador, voltava seu
olhar para dentro e observava os passos seguidos pela lógica de sua
mente. Ele imaginava a si mesmo como um computador. Destilou seus
processos mentais nas mínimas partes que os constituíam, os átomos
do processamento da informação. Alan Turing e Claude Shannon tinham
códigos em comum. Turing codificava instruções sob a forma de números.
Ele codificou os números decimais em zeros e uns. Shannon criou códigos
para os genes e cromossomos e relés e interruptores. Ambos aplicaram
sua engenhosidade ao mapeamento de um conjunto de objetos em outro
conjunto: operações lógicas e circuitos elétricos; funções algébricas e
instruções para máquinas. O uso de símbolos e a ideia de mapear, no
sentido de encontrar uma correspondência rigorosa entre dois conjuntos,
possuíam um lugar de destaque no arsenal mental de ambos. Esse tipo de
codificação não tinha como objetivo obscurecer, e sim iluminar, descobrir
se maçãs e laranjas eram afinal todas equivalentes ou, se não equivalentes,
ao menos fungíveis. A guerra trouxe os dois ao terreno da criptografia em
suas formas mais indecifráveis.” (GLEICK, 2013, p.95)
Segundo Marar (2016), a ciência da computação é uma área de estudo recente,
mas não a inteligência artificial:
“Ela vem lá dos filósofos gregos, de Platão, de Aristóteles. É muito
interessante observar esses estudiosos do passado. Eles vão
remontando e construindo o que nós entendemos hoje como um
modelo científico (...) Não que já existissem sistemas que faziam
coisas por si próprios, mas a ideia de uma inteligência não humana
que pensasse por si própria já era idealizada”.
Ele diz ainda que Aristóteles, filósofo e professor de Alexandre, o Grande, rei da
Macedônia (na Grécia Antiga), pensava em como livrar os escravos dos seus afazeres,
automatizando diversas tarefas.
Figura 2 – Alexandre, o Grande, e Aristótele
Fonte: https://tecnoblog.net/195106/inteligencia-artificial-historia-dilemas/
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 28
De acordo com Medeiros (2015), em sua dissertação de mestrado sobre inferência de
emoções em textos, podemos constatar que existem quatro definições de Inteligência
Artificial:
(1) sistemas que pensam como humanos;
(2) sistemas que agem como humanos;
(3) sistemas que pensam logicamente;
(4) sistemas que agem logicamente.
Segundo Pereira (1988), as duas primeiras categorias, a e b, são essencialmente
empíricas e envolvem formulação de hipóteses e confirmação experimental. Já
as outras duas, c e d, são teóricas e envolvem matemática e engenharia. O autor
defende que o pensar, de acordo com a definição clássica de Turing, seria uma
“imitação” do comportamento humano. Essa seria uma visão essencialmente
antropocentrista, pois exige da máquina pensante um padrão de pensamento igual
ao dos seres humanos ao exigir que para a máquina “pensar como humano” ela
deveria imitá-lo.
O teste de Turing, segundo Whitby (1996), foi projetado para fornecer uma definição
operacional satisfatória de inteligência. O computador passa no teste se um interrogador
humano, depois de propor algumas perguntas por escrito, não conseguir descobrir se
as respostas escritas vêm de uma pessoa ou de um computador (RUSSEL; NORWING,
1995).
Existem algumas tecnologias que despontam dentro do campo da Inteligência
Artificial ou que contribuem para que ela evolua. Veja algumas das principais adiante:
Machine Learning
O Aprendizado de Máquina envolve um método de avaliação de dados que automatiza
o desenvolvimento de padrões analíticos. Tem como base a concepção de que sistemas
tecnológicos podem aprender usando dados, de modo a descobrir padrões, tomar
decisões e se aperfeiçoar com pouca interferência humana. Dessa forma, pode melhorar
a realização de uma atividade ao longo do tempo.
Plataformas de Machine Learning são capazes de fornecer capacidade computacional,
bem como dados, algoritmos, APIs, entre outras soluções para se projetar, treinar e
aplicar modelos da área em máquinas, aplicativos, processos etc.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 29
Deep Learning
O Deep Learning, ou aprendizagem profunda, é um tipo especial de aprendizado de
máquina. Envolve redes neurais artificiais com várias camadas de abstração, sendo
aplicado para reconhecimento de padrões e aplicativos de classificação amparados
por conjuntos de dados.
O processo de aprendizado ocorre entre suas camadas de neurônios matemáticos,
em que a informação é transmitida através de cada camada. Nesse esquema, a saída
da camada anterior é a entrada da posterior.
O Deep Learning “treina” máquinas para executarem atividades como se fossem
humanos. Por exemplo, identificação de imagens e reconhecimento de fala. Também
processa dados.
Processamento de Linguagem Natural (PLN)
O Processamento de Linguagem Natural visa ao estudo e à tentativa de se reproduzir
processos de desenvolvimento ligados ao funcionamento da linguagem humana. Para
isso, emprega softwares, programação e outras soluções.
Por meio do PLN, as máquinas podem compreender melhor os textos — o que envolve
reconhecimento de contexto, extração de informações, desenvolvimento de resumos
etc. Também é possível compor textos partindo de dados obtidos por computadores.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 30
O PLN pode ser usado em áreas como atendimento ao consumidor e na produção
de relatórios corporativos.
Melhora na tomada de decisão
A IA pode auxiliar na simplificação de processos de análise, especialmente uma
empresa que preza pela tomada de decisão baseada em dados (data-driven). Isso
porque ela é capaz de organizar e conferir maior clareza a dados “nebulosos” ou
“confusos”, os quais dificultam o estabelecimento de estratégias.
Um sistema de Inteligência Artificial pode desenvolver processos que envolvem
correlações, regressões, estruturação de análises dos dados gerados etc. que servem
de base para executivos tomarem decisões. Principalmente se estiver vinculada a
uma solução de Big Data, que é capaz de lidar com um gigantesco volume de dados
não-estruturados.
Comodidade e escalabilidade
Uma solução de IA virtual é capaz de empregar algoritmos para realizar
segmentações mais precisas, de modo a sugerir mercadorias sintonizadas com os
perfis de consumidores analisados. Isso aumenta as chances de se desenvolver boas
estratégias comerciais.
A IA também tem alto nível de replicabilidade de processos, já que os sistemas
que a compõem são capazes de realizar as mesmas análises diversas vezes. Isso
assegura que qualquer fluxo de trabalho se torne escalável.
A obtenção de informações relevantes de relatórios também pode se tornar mais
rápida. Isso porque já há algoritmos de text mining (mineração de textos) capazes de
analisar um documento e encontrar informações nele.
Esses fatores geram comodidade, já que são feitos de maneira mais rápida e
simplificada pela solução de Inteligência Artificial.
Aumento da automação
A IA contribui para automação de atividades lógicas, analíticas e cognitivas, gerando
maior velocidade no tratamento de informações. Isso serve como complemento à
automação das tarefas físicas, especialmente da produção, que costuma ser propiciada
por máquinas robóticas.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 31
Redução de erros, de riscos e de custos operacionais
Uma solução de Inteligência Artificial pode ser empregada nomonitoramento de
máquinas e sistemas computacionais da empresa. No caso dos equipamentos, ela pode
usar dados de sensores, de câmeras, de registros em softwares de monitoramento,
dentre outras fontes. Em relação aos sistemas, suas informações são provenientes
de bancos de dados, de relatórios, de históricos, etc.
Graças aos conteúdos obtidos, ela tem a capacidade de descobrir gargalos, falhas
e outros pontos fracos nos processos da empresa, diminuindo erros e aumentando a
eficiência operacional. Isso reduz custos e evita dificuldades para as equipes.
Aliás, dá até para realizar previsões sobre eventuais dificuldades, para que a
empresa tome providências a tempo. Tal fato se dá porque ela gera diagnósticos de
diversos setores e processos, contribuindo para o mapeamento de riscos (e também
de oportunidades). Para tanto, ela pode checar frequentemente indicadores-chave de
desempenho do negócio, com o propósito de relatar possíveis empecilhos às equipes.
Outro ponto interessante é que seus processos de análise costumam apresentar
baixo custo. Ela também contribui para que haja maior nível de acerto nas estratégias
definidas pelos gestores, que tiveram por base os dados coletados e processados
pela IA.
Por que a IA tem se tornado tão estratégica e quais são seus riscos?
Um dos principais fatos sobre a inteligência artificial é que ela não vem sem riscos e
exigências. Um deles é a necessidade de maior capital intelectual para lidar com suas
exigências. Sem isso, a empresa poderá sub utilizá-la, perdendo dinheiro no processo.
Além disso, é preciso planejar bem a requalificação e o remanejamento de capital
humano dentro da empresa, para que possam exercer atividades que demandam
criatividade e geram maior valor agregado, bem como para preservar talentos. Eles
precisarão de treinamento para lidar com os sistemas de IA, a fim de se maximizar
essa relação
Uma tendência é que muitas estruturas corporativas se tornem mais fluídas e
enxutas, com equipes menores e mais colaborativas. É preciso ficar preparado para
isso, para que o funcionamento e os fluxos de trabalho da empresa sejam adaptados
e não fiquem comprometidos.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 32
A IA é uma tecnologia capaz de reduzir custos, otimizar a produção e gerenciar
atividades. Isso gera vantagens competitivas aos negócios, tornando-a uma solução
estratégica. Muitos líderes já começam a ter essa percepção.
Onde a Inteligência Artificial está presente?
Além dos itens mencionados anteriormente, a Inteligência Artificial também é
aplicada em muitas outras situações:
• Pesquisas no espaço, visto que as máquinas possuem melhor adaptação a
ambientes adversos e menos chances de falharem em suas atividades;
• Assistentes de voz dos celulares como a Siri e o Google Now, que apresentam
ao usuário as notícias que ele deseja ler;
• Reconhecimento facial, quando a pessoa posta uma foto no Facebook e
automaticamente o rosto dos indivíduos presentes na imagem são identificados;
• Extração de minério, pois as máquinas suportam certas condições no ambiente,
diferentemente do ser humano;
• Processos médicos como, avaliações, simuladores de cirurgia e monitoramentos;
• Exploração do oceano, visto que o ser humano não consegue explorar todo o
oceano sem comprometer a sua saúde;
• Aprendizagem, através do uso de aplicativos, telas interativas e demais
dispositivos.
Resumindo, a definição pura da inteligência de Turing ainda se encontra como
a descrita pela literatura de psicologia, ao defender que pensar seria a capacidade
de processar informações ao ponto de resolver problemas. Russel e Norwig (1995)
defendiam a ideia de que haveria três formas de se determinar como os humanos
pensam, penetrando nos componentes reais da mente humana.
Isso se daria por meio da introspecção, procurando captar os nossos pensamentos
de forma particular, através de experimentos psicológicos e de sua observação através
de imagens cerebrais, observando o cérebro em funcionamento. Turing é mais incisivo
ainda, ao propor que não seria possível realizar uma imitação do sistema nervoso,
mas tão somente do comportamento do ser pensante.
Nessa época, já existiam várias teorias de complexidade, simulação de linguagem,
redes neurais e máquinas de aprendizagem. Turing imaginou utilizar o termo
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 33
“inteligência artificial” para esses “sistemas de imaginação humana que usam a ciência
da computação”.
Mercado de Trabalho e I.A.
Com a crescente procura por soluções mais elaboradas para resolver situações
complexas, o mercado de trabalho vem se mostrando bastante receptivo e desejoso
de profissionais que conheçam os conceitos e tecnologias envolvidas em I.A. Muitas
empresas inclusive capacitam os profissionais que demonstram afinidade com tais
recursos.
Importante também ressaltar que em 2019 o governo brasileiro estipulou premissas
para a “Estratégia Brasileira de Inteligência Artificial”.
Segundo o Ministério da Ciência e Tecnologia, a Estratégia Brasileira de Inteligência
Artificial (EBIA) irá nortear as ações do governo federal no desenvolvimento da
tecnologia, em todos os seus aspectos de forma a estimular a pesquisa, inovação e
desenvolvimento de soluções em Inteligência Artificial, bem como seu uso consciente,
ético e em prol de um futuro melhor. A EBIA apresenta inicialmente seis objetivos
estratégicos, que poderão ser desdobrados em ações específicas. O quarto objetivo
estratégico - Capacitar e formar profissionais para o ecossistema da IA - mostra
claramente uma preocupação com a revolução que a tecnologia irá trazer ao mercado
de trabalho.
Tendo todos esses aspectos em vista, talvez no presente momento, com o avanço da
computação e a redução constante no custo de processamento e armazenamento de
dados, seja possível vislumbrar essas “antigas” ideias se materializando em verdadeiras
soluções para o mundo real, como algumas empresas e universidades têm apresentado
ao longo das últimas décadas, conforme mencionado na introdução desta disciplina.
Soluções estas que impactam, de fato, o mundo concreto, gerando novos negócios,
novos profissionais e novas soluções sociais.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 34
CAPÍTULO 4
TECNOLOGIAS E
METODOLOGIAS UTILIZADAS
Ambientes de desenvolvimento se caracterizam por incorporarem ferramentas de
edição e produtividade que podem aumentar ainda mais a efetividade de utilização,
produção e análise de um software, proporcionando ao profissional e/ou pesquisador
ter sua própria “área de trabalho” direcionada e/ou personalizada para cada projeto
em que estiver envolvido. Não bastam apenas desenvolvimentos constantes, mas é
de suma importância manter as manutenções tanto do código fonte em si, como do
ambiente no qual o profissional está trabalhando.
Entre esses ambientes, o Anaconda é bastante conhecido no mercado e robusto
em sua estrutura, proporcionando uma versão gratuita para download em formato
Open Source. Abaixo, apresentamos o ambiente padrão do Anaconda, a versão visual
Navigator e a versão de linha de comando respectivamente:
Figura 9 – Ambiente Anaconda Navigator (visual)
Fonte: Captura de tela do próprio pesquisador
Podemos notar na Figura 10 que trabalhamos nesta disciplina com um ambiente
Anaconda para Python Versão 3.7.9 e MSC Versão 1916, sistema operacional Windows
64 bits
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 35
Figura 10 – Ambiente Anaconda Linha de Comando (prompt)
Fonte: Captura de tela do próprio pesquisador
É importante constar que o ambiente Anaconda também possui vasta documentação
e conteúdos diversos para facilitar o percurso de aprendizado e utilização dos
interessados[1].
4.1 Aplicativo Notepad++
Da mesma forma como existem ambientes de desenvolvimento mais elaborados
como o Anacondaexistem também “editores de texto” mais “simples”, que podem
ser utilizados por aqueles que preferem uma experiência de programação mais clean
(limpa, rápida, elegante) e/ou tradicional, focando apenas em codificação de texto e
facilitadores para visualmente organizar melhor o código escrito, conceito também
chamado de indentação (neologismo para termo inglês identention) de código fonte.
Neste cenário, destaca-se o caso do aplicativo Notepad++, já conhecido na
comunidade de desenvolvimento de software, que mantém suas características de
simplicidade, porém com muitos adeptos e recursos facilitadores para desenvolvedores
contumazes.
Abaixo observa-se o exemplo do código fonte que estamos disponibilizando como
resultado e protótipo desta pesquisa, em linguagem Python, reforçando que este código
fonte está disponível como Anexo 2, ao final deste trabalho, e também na íntegra e
online, sob licença Creative Commons, na plataforma GitHub, que serão adequadamente
abordados nos próximos tópicos.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 36
Figura 11 – Editor de texto e códigos Notepad++
Fonte: Captura de tela do próprio pesquisador
4.2 Métodos Ágeis e Scrum
O Manifesto Ágil para Desenvolvimento de Software[2] preconiza que “estamos
descobrindo maneiras melhores de desenvolver softwares, fazendo-os nós mesmos
e ajudando outros a fazerem o mesmo. Através deste trabalho, passamos a valorizar”:
Indivíduos e Interações ... mais que processos e ferramentas
Software em funcionamento ... mais que documentação abrangente
Colaboração com o cliente ... mais que negociações de contratos
Responder a mudanças ... mais que seguir um plano
Tabela 1 – Princípios Ágeis
Fonte: https://agilemanifesto.org/iso/ptbr/manifesto.html
E o manifesto finaliza da seguinte maneira: “ou seja, mesmo havendo valor nos
itens à direita, valorizamos mais os itens à esquerda.”.
O Manifesto Ágil foi criado em 2001 por 17 programadores que notaram
semelhanças em suas formas de trabalho e os bons resultados obtidos seguindo essas
premissas, conforme os cenários que se apresentavam. Ao assinarem o manifesto
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 37
se comprometeram a praticar e a disseminar essas propostas a todo o mundo. Os
signitários originais são: Kent Beck, Mike Beedle, Arie van Bennekum, Alistair Cockburn,
Ward Cunningham, Martin Fowler, James Grenning, Jim Highsmith, Andrew Hunt, Ron
Jeffries, Jon Kern, Brian Marick, Robert C. Martin, Steve Mellor, Ken Schwaber, Jeff
Sutherland, Dave Thomas.
Os 12 princípios que sustentam o Manifesto Ágil são:
1. Nossa maior prioridade é satisfazer o cliente, através da entrega adiantada e
contínua de software de valor.
2. Aceitar mudanças de requisitos, mesmo no fim do desenvolvimento. Processos
ágeis se adequam a mudanças, para que o cliente possa tirar vantagens
competitivas.
3. Entregar software funcionando com frequência, na escala de semanas até meses,
com preferência aos períodos mais curtos.
4. Pessoas relacionadas a negócios e desenvolvedores devem trabalhar em conjunto
e diariamente, durante todo o curso do projeto.
5. Construir projetos ao redor de indivíduos motivados. Dando a eles o ambiente
e suporte necessário, e confiar que farão seu trabalho.
6. O Método mais eficiente e eficaz de transmitir informações para, e por dentro
de um time de desenvolvimento, é através de uma conversa cara a cara.
7. Software funcional é a medida primária de progresso.
8. Processos ágeis promovem um ambiente sustentável. Os patrocinadores,
desenvolvedores e usuários, devem ser capazes de manter indefinidamente,
passos constantes.
9. Contínua atenção à excelência técnica e bom design, aumenta a agilidade.
10. Simplicidade: a arte de maximizar a quantidade de trabalho que não precisou
ser feito.
11. As melhores arquiteturas, requisitos e designs emergem de times auto-
organizáveis.
12. Em intervalos regulares, o time reflete em como ficar mais efetivo, então, se
ajustam e otimizam seu comportamento de acordo.
Diante desta perspectiva, neste trabalho optamos por uma metodologia ágil já
bastante difundida e adotada tanto em universidades como em empresas ao redor
do mundo: o Scrum.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 38
Scrum é uma metodologia utilizada para facilitar e agilizar o serviço necessário para
se atingirem os objetivos de cada projeto. Inicialmente foi criado para potencializar
o processo de desenvolvimento de projetos e softwares, mas hoje é utilizado em
diversas áreas do conhecimento. Trata-se de uma espécie de quadro que fica exposto
nos setores para todos acompanharem, de forma a obter um tipo de planejamento
completamente organizado. Nele estão contidas informações sobre o que a pessoa/
equipe precisa fazer, o que já se fez, quais as próximas tarefas a serem executadas
e projetos finalizados.
Além disso, são realizadas reuniões periodicamente para ver se o método está
funcionando. Para facilitar e otimizar ainda mais o trabalho, já existem aplicativos
online. Abaixo destaca-se um quadro com um modelo tradicional de Scrum:
Figura 12 – Macroprocesso Scrum
Fonte: https://www.appvizer.com.br/
4.3 Licença Creative Commons
Quando se aborda o tema da inventividade humana, nota-se que há uma ramificação
e complexidade de alto nível. Há muitos séculos o ser humano vem criando e
desenvolvendo ideias que suscitam questões como a propriedade intelectual, registros
de patentes, licenças de uso, entre outros tópicos correlatos.
É importante lembrar que todos devem ter direito a manter e usufruir aquilo que
desenvolveu e criou, mas conforme acompanhamos no decorrer deste trabalho, muitas
novas tecnologias e arranjos humanos tem acontecido, o que proporcionaram “novas
formas de licenciamento”. É o caso da organização e modalidade de licenciamento
conhecida como Creative Commons, que foi eleita para licenciar todo este trabalho.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 39
Figura 13 – Logotipo Creative Commons no Brasil
Fonte: Creative Commons Organization
Segundo a própria definição oferecida pela unidade brasileira da organização[3]:
“Creative Commons é uma organização sem fins lucrativos que
permite o compartilhamento e uso da criatividade e do conhecimento
através de instrumentos jurídicos gratuitos. O Creative Commons
ajuda você a compartilhar legalmente seu conhecimento e criatividade
para construir um mundo mais justo, acessível e inovador. Nós
desbloqueamos todo o potencial da internet para impulsionar uma
nova era de desenvolvimento, crescimento e produtividade.”
A organização oferece várias modalidades de licenciamento, permitindo que o
profissional e/ou pesquisador utilize o modelo mais adequado para sua intenção e
necessidade. Além do descritivo da licença, existem “selos” que são utilizados para
identificação, facilitando a compreensão daqueles que desejam utilizar os produtos e
soluções disponibilizados sob tais licenciamentos. Os principais selos são os seguintes,
conforme o site da organização:
Figura 14 – Selo 1 Creative Commons
Fonte: Creative Commons Organization
Cabe lembrar que este trabalho está totalmente licenciado sob esta modalidade
(CC BY) do Creative Commons. Permitindo livre acesso e comprovando o caráter de
compartilhamento preconizado durante o trabalho.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 40
Figura 15 – Selo 2 Creative Commons
Fonte: Creative Commons Organization
Figura 16 – Selo 3 Creative Commons
Fonte: Creative Commons Organization
Figura 17 – Selo 4 Creative Commons
Fonte: Creative Commons Organization
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 41
Figura 18 – Selo 5 Creative Commons
Fonte: Creative Commons Organization
Figura 19 – Selo 6 Creative Commons
Fonte: Creative Commons OrganizationTodas as licenças supracitadas estão disponíveis no site oficial da organização,
onde os interessados poderão aprofundar-se no entendimento e leitura detalhada dos
termos legais, conforme suas demandas de utilização.
__________________________
[1] Disponível em: https://docs.anaconda.com/anaconda/com. Acesso realizado em 30/12/2020
[2] Disponível em: https://agilemanifesto.org/iso/ptbr/manifesto.html. Acesso em 30/12/2020.
[3] Disponível em: https://br.creativecommons.org/sobre/. Acesso em 30/12/2020
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 42
CAPÍTULO 5
MATERIAIS E MÉTODOS
ESPECÍFICOS
5.1 Plataforma GitHub
Trata-se de um ambiente para publicação e troca de experiências em programação
com, praticamente, espaço para todas as linguagens atualmente utilizadas.
O código fonte do protótipo desenvolvido neste trabalho está disponibilizado nesta
plataforma para que todos possam acessá-lo, além de constar, textualmente, como
um dos capítulos deste trabalho.
Figura 20 – Site Plataforma Github
Fonte: Gibhub.com
O GitHub oferece uma plataforma de compartilhamento e colaboração inédito
na história recente de tecnologias para softwares, sendo hoje usado por milhões
de pessoas que atestam sua eficácia e continuam participando e colaborando para
evolução do ecossistema de desenvolvimento de software, com forte inclinação para
o open source e movimento maker.
O GitHub é uma plataforma para hospedagem e controle de versão de código
utilizando o sistema Git como base. Também serve como uma comunidade para
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 43
programadores do mundo todo colaborarem em projetos pessoais e de código-aberto,
além de contar com uma versão paga para empresas e profissionais. Conheça os
principais comandos e como usar o GitHub em seus trabalhos.
Como usar o GitHub
O GitHub é gratuito, exigindo apenas um cadastro para utilizar todos os seus recursos.
Os projetos são hospedados em “repositórios”, que podem ter acesso público ou
privado. Desde a compra pela Microsoft, todos os usuários têm acesso ilimitado a
repositórios particulares.
Todo o gerenciamento dos projetos, como criação de novos repositórios, é feito via
comandos do sistema Git. Você também pode gerenciá-los pelo site, mas normalmente
os processos são executados via linha de comando do seu computador ou servidor.
Saiba mais sobre o Git e seus conceitos básicos no site oficial.
Para sincronizar o projeto do seu computador com o GitHub, é necessário ter o Git
instalado na máquina. Para tal, acesse o site oficial https://git-scm.com/downloads
e efetue o download para sua versão de sistema operacional. Lembramos que nessa
disciplina utilizamos Windows:
Após baixar o arquivo de instalação e executá-lo, veremos as telas do passo-a-passo:
https://git-scm.com/downloads
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 44
Ao clicar em “next”, poderemos escolher em qual diretório instalar e mais algumas
opções:
Vamos manter as opções padrões e clicamos novamente em “next”:
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 45
Aqui definimos que nosso editor de código fonte será o NotePad++, já abordado
em aulas anteriores. Agora definimos que estamos em ambiente Windows, para que
tenhamos a possibilidade de chamar via prompt (linha de comando):
De agora em diante, procedemos clicando em “next” até finalizar a instalação e
veremos a seguinte tela:
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 46
Pronto! Agora já temos o GitHub instalado no dispositivo.
Você pode agora abrir o Prompt de Comando do Windows e verificar se o GitHub
está disponível ao digitar “git” e pressionar a tecla “enter”:
Ele exibirá uma série de comandos disponíveis. É sinal que está tudo certo com a
instalação.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 47
É importante lembrar que Git e GitHub não são a mesma coisa. Git é o sistema de
gerenciamento de versão gratuito e de código aberto criado por Linus Torvald, mesmo
criador do Linux, em 2005.
GitHub é a empresa que desenvolve soluções baseadas no Git, como a plataforma
GitHub.com, que une o gerenciamento e hospedagem de código-fonte a funções de
redes sociais, como feed, comunidades, fóruns, etc.
Como criar um repositório no GitHub
Depois de ter criado a conta na plataforma e instalado o Git na sua máquina, você
já pode hospedar o seu primeiro projeto no GitHub.com. Para isso:
1. Abra o terminal de comando do seu sistema operacional;
2. Dentro da pasta do projeto, digite: git init O comando acima irá criar toda
a estrutura básica do repositório;
3. Para adicionar todos os arquivos alterados à fila de atualizações do repositório,
execute o comando: git add .
4. Antes de sincronizar as alterações, configure seu usuário do GitHub com os
comandos: git config --global user.name “seu nome” git
config --global “email no GitHub”
5. Confirme as alterações com o comando: git commit -m “mensagem”
no qual “mensagem” geralmente é um resumo das alterações.
6. Adicione o remote, ou seja, o link para o servidor do seu projeto no GitHub:
git remote add origin usuário no GitHub>/<nome do
repositório>.git
7. Por fim, envie as alterações com o comando: git push remote origin
8. Se tudo deu certo, será exibido uma mensagem confirmando o envio. Você
também pode checar na página do repositório do projeto no GitHub.com.
Existem vários outros recursos importantes para conhecer e utilizar no GitHub,
como branchs, que são versões paralelas do seu código que facilitam a criação de
novas funcionalidades ou correções de bugs sem prejudicar o código-fonte original,
e pull requests, que são “chamados” à comunidade para correção ou implementação
de novos recursos em projetos.
A versatilidade da plataforma também permite que ela seja utilizada de outras
formas, como hospedagem de blogs e portfólios pessoais com o GitHub Pages, fóruns
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 48
de discussão, páginas de divulgação de vagas, publicação de wikis e até de livros
completos. Se você já é um profissional ou tem interesse pela área de tecnologia,
saiba mais sobre como usar o GitHub lendo a documentação oficial.
5.1 Tecnologias e recursos utilizados
Para o desenvolvimento deste projeto foram utilizadas as tecnologias e os processos
descritos no referencial teórico. Em resumo, utiliza-se a linguagem de programação
Python 3, como base para escrita do protótipo, ambiente Anaconda Open Source para
facilitar a integração da linguagem Python com pacotes e recursos de inteligência
artificial, Aplicativo Notepad++ para edição do código fonte original do protótipo, Método
Ágil Scrum para acelerar os resultados, Licença Creative Commons para disponibilizar
cópias e direitos de mudanças ao público em geral e Plataforma GitHub para publicação
online do código fonte na íntegra.
Todo o desenvolvimento foi realizado no notebook pessoal do pesquisador, com a
configuração de processador Intel Core i7, HD SSD 240 Gb, 8 Gb de memória RAM e
sistema operacional Windows 10, já adquirido em momento anterior ao ingresso na
pós-graduação.
5.2 Descrição do Protótipo
O presente trabalho apresenta como produto final um protótipo de software com
recursos de inteligência artificial, desenvolvido conforme as premissas do movimento
maker.
Esta aplicação visa explorar a praticidade dos conceitos maker e rotinas de inteligência
artificial para demonstrar a viabilidade técnica de se produzir um protótipo de software
para assistência pessoal, com recursos open source e baixíssimo custo, sendo possível
reproduzir tais resultados, conforme procedimentos descreveremos nos próximos
capítulos.
5.3 Aplicação de Software
Hoje existem diversas aplicações de assistência pessoal desenvolvidas por grandes
empresase que necessitam de muito poder de processamento, tecnologias fechadas
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 49
e alto custo de desenvolvimento e sustentação. Diante disso foi proposto desenvolver
um protótipo de baixíssimo custo, executado conforme as premissas do movimento
maker e utilizando-se de tecnologias contemporâneas de inteligência artificial, que
contemplasse minimamente recursos como responder a comandos por voz, gerar
respostas de conversação, executar ações específicas, ativar câmera e reconhecer
determinados objetos, sendo open source e tendo sua reprodutibilidade garantida através
dos procedimentos descritos neste trabalho.
5.4 Metodologia utilizada
Além de referencial teórico e técnico, experiência de mercado e pesquisas na pós-
graduação, optou-se pelas seguintes etapas necessárias para o desenvolvimento do
protótipo:
1. Pesquisa exploratória e bibliográfica sobre o tema da pesquisa;
2. Construção do referencial teórico e exploração sobre aplicações similares já
desenvolvidas;
3. Definição do objeto e problema de pesquisa;
4. Levantamento de requisitos a fim de determinar as funcionalidades inerentes
à aplicação de software;
5. Exploração sobre a arquitetura de software utilizadas no experimento, bem como
as ferramentas de apoio como frameworks e ambiente de trabalho;
6. Instalação e configuração do ambiente de desenvolvimento de software e de
hardware;
7. Elaboração do projeto de software;
8. Implementação/codificação da aplicação de software;
9. Testes da aplicação de software e do hardware utilizado.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 50
CAPÍTULO 6
PYTHON BÁSICO (PARTE 1)
6.1 Características básicas da linguagem
Python é uma linguagem de programação interpretada, de código-fonte aberto e
disponível para vários sistemas operacionais. Diz-se que uma linguagem é interpretada
se esta não precisar ser compilada (convertida para uma linguagem de máquina), mas
sim “lida” ou “interpretada” por um outro programa (chamado de interpretador) que
traduzirá para a máquina o que seu programa quer dizer.
O interpretador para Python é interativo, ou seja, é possível executá-lo sem fornecer
um script (programa) para ele. Ao invés disso, o interpretador disponibilizará uma
interface interativa onde é possível inserir os comandos desejados um por um e ver
o efeito de cada um deles.
Neste tutorial, se encontra a representação “>>>” antes da maioria dos comandos
apresentados, o que quer dizer que este comando esta sendo inserido no interpretador
interativo (e sempre abaixo, o resultado gerado).
6.2 Obtenção e instalação
Caso o usuário esteja utilizando um sistema Linux ou OS X (Apple), o interpretador
para Python já vem instalado por padrão, sendo apenas necessário escrever o comando
“python” no seu programa de terminal favorito. Para usuários do sistema operacional
Windows, o interpretador para Python deve ser baixado através do site http://www.
python.org e instalado. Neste último sistema o usuário encontra um utilitário para
fazer o papel de terminal (e editor de python) no Windows, denominado IDLE.
6.3 Variáveis
Variáveis são formas de se armazenar dados para uso posterior, elas podem ser
classificadas em 3 tipos básicos que são mostradas logo abaixo. Quando analisarmos
as listas veremos que existem outras variáveis mais complexas.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 51
• int - Um número inteiro
• float - Um ponto flutuante
• string - Uma sequência de caracteres
Ao contrário da maioria das outras linguagens, em Python, não é necessário declarar
as variáveis que serão usadas, tampouco definir seu tipo. A própria sintaxe do dado
a ser armazenado identifica o tipo da variável para armazená-lo. Por exemplo, caso
deseje-se atribuir o valor 4 à variável A, basta digitar A=4. Python saberá que A é um
inteiro (tipo “int”).
Por outro lado, se o valor a ser armazenado fosse 4,1 que é um dado do tipo “ponto
flutuante”, este deveria ser expresso como A=4.1. Observe que, para Python, A=4 e
B=4.0 são variáveis de tipos diferentes e isto deve ser levado em conta ao se realizar
certos tipos de manipulações de dados.
6.4 Strings
String é um tipo de objeto formado por uma sequência imutável de caracteres que
nos permite trabalhar com textos.
Exemplo:
>>> a = “Bom Dia”
>>> print (a)
Bom Dia
Percebemos que elas são delimitadas por aspas, podemos utilizar tanto aspas duplas
como as simples. Se utilizarmos aspas duplas, como o mostrado no exemplo acima,
podemos usar as simples para aplicações dentro do texto que estamos escrevendo,
o contrário também é verdadeiro.
Exemplo:
>>> b = ‘O lema do governo JK era:\n “Cinquenta anos em
cinco.”’
>>> print (b)
O lema do governo JK era:
“Cinquenta anos em cinco.”
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 52
No exemplo acima utilizamos um outro artifício para trabalharmos com strings, o
\n. Este por sua vez, tem a função de “pular uma linha” e escrever o texto, que está
após o \n, nessa nova linha. Tanto isso é verdade que no mesmo exemplo, quando
usamos o comando print é mostrada a parte do texto que diz: “Cinquenta anos em
cinco.”, impresso na linha seguinte.
6.4.1 Manipulando Strings
Pelo fato de uma string ser uma sequência imutável, isso nos dá a possibilidade
de manipularmos essa sequência. Consideremos o exemplo abaixo:
>>> a = ‘matemática’
>>> a[2]+a[-5]+a[-4:]
>>> ‘tática’
Isso nos mostra que uma string segue uma determinada indexação onde cada caractere
assume um endereço que, pode ser acessado colocando o nome da variável, que contém
a string, e após, entre os colchetes, o endereço da célula que contém o caractere desejado.
Existe também um recurso conhecido como operador %, que serve para formatar
as strings, basicamente são três os tipos de formatação que temos:
• %s - serve para substituir string;
• %d - serve para substituir números inteiros em uma frase destinada a um print;
• %f - serve para substituir floats (números em aritmética de ponto flutuante).
OBS.: As três formatações acima relacionadas são usadas normalmente para
aplicações em uma frase destinada a um print.
Exemplo:
• >>> quilos = 1,5
• >>> print (‘Maria comprou %f quilos de maçã’ %quilos)
• Maria comprou 1,5 quilos de maçã
OBS.: Como vimos acima o operador “%” pode ser utilizado para formatação de
números também. Com ele é possível também determinar a quantidade de números,
após a vírgula de um float.
Exemplo:
>>> num=213.47876749
>>> print (‘%.2f’ %num)
213.48
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 53
Percebemos que Python fez um “arredondamento” do número real, possibilitando
que o resultado de uma futura operação seja o mais preciso possível.
6.5 operações matemáticas
Além de ser uma poderosa linguagem de programação, Python sabe lidar bem com
matemática. Suas capacidades matemáticas se estendem desde operações básicas
até operações com números complexos.
Abaixo, vamos começar aprendendo as 4 operações matemáticas básicas. Lembre-
se que “>>>” significa a digitação de um comando no interpretador.
Soma:
>>>2+3
5
Subtração:
>>>2-3
-1
Multiplicação:
>>>2*3
6
Divisão:
>>>2/3
0.66666666666666663
A operação aritmética de potenciação também pode ser feita, assim como a sua
inversa, a radiciação.
Potenciação:
>>> 2**3
8
Não existe um comando específico para a radiciação em Python (exceto para a raiz
quadrada, que possui o comando sqrt(x)). Entretanto, para obter a raiz n-ésima de um
número basta elevá-lo por 1/n onde “n” é o índice da raiz. As regras para a obtenção
de números inteiros ou pontos flutuantes também se aplicam a este caso.
Radiciação:
>>>8**(1.0/3.0)
2.0
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 54
6.6 Entrada de Dados
Através do comando “input” podemos receber do usuário umastring. O número de
dígitos da string dada pode ser informado através do comando len().
>>> nome = input(‘Digite seu nome: ‘)
Digite seu nome: Andre
>>> nome
‘Andre’
>>> len(nome)
5
>>> sobrenome = input(‘Agora digite o sobrenome: ‘)
Agora digite o sobrenome: Medeiros
operações matemáticas não podem ser feitas com strings, apenas com floats e
inteiros, porém se somarmos strings, Python as juntaram, num processo chamado
concatenação e se multiplicarmos uma string ela será repetida.
>>> nome + sobrenome
‘AndreMedeiros’
>>>nome*4
‘AndreAndreAndreAndre’
Se a priori sabemos que o dado digitado pelo usuario nao sera uma string, podemos
utilizar como entrada de dados o comando input():
>>> idade = input(‘Digite sua idade: ‘)
Digite sua idade: 30
>>> altura = input(‘Qual a sua altura: ‘)
Qual a sua altura: 1.72
>>> type(idade)
<type ‘int’>
>>> type(altura)
<type ‘float’>
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 55
OBS.: O dado inserido pelo usuário é automaticamente interpretado como um dos
tipos de variáveis, strings, floats ou integers. Para saber como a variável atribuída foi
interpretada, basta digitar o comando type().
6.7 Listas
Listas são sequências de variáveis. Após definidas, podem ser modificadas de
várias maneiras, pois são mutáveis.
Para definir uma lista basta digitar:
lista = [9,8,7]
O endereçamento dos componentes começa no 0. Então, se você deseja usar
um determinado elemento da lista, basta chamá-lo: lista[x]. Com isso, você está se
referindo ao elemento de posição x na lista.
Alguns comandos referentes a, listas:
len(lista): informa o tamanho da lista
lista.append(x): adiciona o elemento x no final da sua lista
lista.extend([6,5,4]) : adiciona uma lista inteira no final da sua lista
lista[y]= x : insere o valor x na posição y da lista
Nós já vimos anteriormente que variáveis comuns armazenam um único valor.
Entretanto, existem outros tipos de variáveis capazes de armazenar mais de um valor.
Em Python, chamamos essas variáveis com capacidade de armazenamento de listas
ou vetores. Vamos explicar a sintaxe de uma lista através das linhas de código exibidas
abaixo:
>>> meses = [‘Janeiro’, ‘Fevereiro’, ‘Marco’, ‘Abril’,
‘Maio’, ‘Junho’, ‘Julho’,’Agosto’, ‘Setembro’, ‘Outubro’,
‘Novembro’,’Dezembro’]
>>> while 1:
... mes = input(“Escolha um mes (1-12)?”
... mes = int(mes)
... if mes >= 1 and mes <= 12:
... print (‘O mes é ‘, mes[mes - 1])
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 56
Ao rodar este programa obteremos a seguinte saıda como exemplo:
>>> Escolha um mes (1-12)? 5
O mes é Maio
>>> Escolha um mes (1-12)? 12
O mes é Dezembro
>>> Escolha um mes (1-12)?
Ainda sobre o programa anterior, primeiramente criamos a nossa lista. A definição
de uma lista é análoga à de uma variável qualquer, porém isolando o conteúdo com
colchetes. O uso das aspas (duplas ou simples) apenas é necessário caso estejamos
inserindo na lista uma string, se armazenarmos apenas um número, não seria necessário.
Exemplo:
teste = [‘vida’, 42, ‘universo’, 6, ‘e’, 7]
Depois inserimos o comando while 1: que faz com que o nosso programa entre em
loop. O programa vai rodar indefinidamente até ser dado o comando Ctrl+D, ou até
que o programa seja fechado. Uma vez nesse loop, é definida pelo usuário a variável
“mes”, e depois de um tratamento de erros, feito com a utilização de um comando if,
é nos devolvido o nome do mês selecionado.
Na última linha do código utilizamos uma propriedade da lista, que é buscar um dado
da lista, que se dá escrevendo o nome da lista e entre colchetes o número referente
ao local da lista, onde está o dado requerido (lista[número]).
Observe que na nossa linha de código, o comando print é dado pelo mês escolhido
menos um, ou seja, indexando as listas partindo do zero.
Além de selecionar um elemento de uma lista, temos algumas outras propriedades
que apresentaremos em seguida.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 57
CAPÍTULO 7
PYTHON BÁSICO (PARTE 2)
7.1 Inserindo um novo dado a uma lista
Para inserir um novo dado a uma lista qualquer, utilizamos um método chamado
.append:
>>>teste = []
>>>teste.append(‘zero’)
>>>teste.append(‘um’)
>>>teste
[‘zero’,’um’]
Infelizmente o comando .append só consegue adicionar um dado na lista por vez, mas
se quisermos adicionar mais dados podemos simplesmente somar listas, multiplicá-
las, ou utilizar o método .extend:
>>>teste.extend([‘dois’,’três’])
>>>soma = [‘quatro’,’cinco’]
>>>teste += soma
>>>teste + [‘seis’]
[‘zero’,’um’,’dois’,’três’,’quatro’,’cinco’,’seis’]
>>>teste*2
[zero’,’um’,’dois’,’três’,’quatro’,’cinco’,’seis’,zero’,’um’
,’dois’,’três’,’quatro’,’cinco’,’seis’]
OBS.: o código teste += soma é o idêntico ao que escrever teste = teste + soma.
7.2 Impressão dos conteúdos da lista
Ao chamarmos a lista teste sem referenciarmos nenhum elemento específico
estamos lidando com todos os elementos da lista. Podemos também imprimir
somente alguns valores de dentro da lista, necessitando para isso apenas indicar
o local:
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 58
>>>print (‘As variáveis da lista teste são: ‘,teste)
As variáveis da lista teste são
[‘zero’,’um’,’dois’,’três’,’quatro’,’cinco’,’seis’]
>>>print (‘As variáveis 0 e 3 da lista teste são ‘,teste[0],’
e ‘,teste[3])
As variáveis 0 e 3 da lista teste são zero e três
Podemos também utilizar o comando for.
>>>for valor in teste:
... print (valor)
...
zero
um
dois
três
quatro
7.3 Determinar em que ordem um elemento aparece na lista
O método .index mostra em qual posição o item fornecido se encontra na lista.
Porém, se o item especificado aparecer mais de uma vez na lista, o método .index
mostra a posição da primeira ocorrência do valor.
>>>print (teste.index(”quatro”))
4
OBS.: É importante notar que a lista inicia sua contagem a partir do 0 (zero) o que
explica o número 4 obtido anteriormente.
7.4 Remover um elemento de uma lista
Para remover um elemento de uma lista utilizamos o comando del, referenciando
o index, ou posição da lista, onde haverá a remoção.
>>>print (‘Antes a lista ”teste”era: ‘,teste)
Antes a lista ”teste”era: [‘zero’,’um’,’dois’,’três’,’quatro’]
>>>del teste[3]
>>>print (‘Agora a lista ”teste”é: ‘,teste)
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 59
Agora a lista ”teste”é: [‘zero’,’um’,’dois’,’quatro’]
Podemos obter o mesmo efeito utilizando o método .remove que procuraria a primeira
ocorrência na lista para um dado valor ou string:
>>>lista + [‘um’]
>>>print (‘Antes a lista ”teste”era: ‘,teste)
Antes a lista ”teste”era: [‘zero’,’um’,’dois’,’quatro’,’um’]
>>>teste.remove(“um”)
>>>print (‘Agora a lista “teste” é: ‘, teste)
Agora a lista ”teste” é: [‘zero’,’dois’,’quatro’,’um’]
7.5 Descobrir o tamanho de uma lista
Para descobrir o tamanho de uma lista, usamos o comando len(), como exemplificado
no código abaixo:
>>>print (‘O tamanho da lista teste é: ‘, len(teste))
4
Nos dizendo que a lista “teste” possui 4 variáveis.
7.6 Range
A função range gera um vetor contendo números inteiros sequenciais, obedecendo
a regra de escrita:
range(inıcio,fim)
É importante observar que o número finalizador descrito acima não é incluıdo no
vetor, por exemplo:
>>>vetor = range(1,11)
>>>print (vetor)
O código acima nos dará como saída o vetor: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]. Em outras
palavras, o último número é excluído do vetor, portanto o 11 não entra na composição
deste.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 60
A função range aceitará quaisquer números inteiros desde que o número inicial
seja maior que o número final, bem como quando apenas o número final é passado
para a função, portanto são válidas as construções:
>>> range(1, 10)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(-32, -20)[-32, -31, -30, -29, -28, -27, -26, -25, -24, -23, -22, -21]
>>> range(5,21)
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
>>> range(5)
[0, 1, 2, 3, 4]
>>> range(21, 5)
[ ]
No último exemplo foi retornado um vetor vazio, isso se deu porque o elemento
inicial era maior que o final.
Outra característica importante deste comando é a de se poder controlar o passo
da sequência adicionando uma terceira variável ao range. Isto é, a variação entre um
número e seu conseguinte.
>>>range(0,24,4)
[0, 4, 8, 12, 16, 20]
7.7 Estruturas de controle
Os comandos de Python são executados pelo computador, linha por linha e as
estruturas de controle permitem ao programador modificar a ordem em que cada
comando será executado, bem como se ele será ou não executado.
7.8 If
O comando if direciona o computador a tomar uma decisão, baseado nas condições
determinadas. Se a condição for atendida, um bloco de comandos será executado,
caso contrário, o computador executa outros comandos.
... #bloco de comandos 1
>>>if #condição1:
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 61
... #bloco de comandos 2
...(continuacao do programa)
... #bloco de comandos 3
OBS.: Se a condição1 dada no if for verdadeira o bloco de comandos 2 será executado,
caso contrário o programa passará direto do bloco de comandos 1 para o bloco de
comandos 3.
Nessa estrutura podemos utilizar quantas condições foram necessárias, basta
repetirmos o elif seguido das condições desejadas. Tendo isso em vista, vejamos um
programa de adivinhar um número:
>>>num = 23
>>>adv = 0
>>>while adv != num:
... adv = input(‘Insira um número: ‘)
... if adv < num:
... print (‘E maior!’)
... elif adv > num:
... print (‘E menor!’)
... else:
... print (‘Voce acertou!’)
...
>>>Insira um número:
Como vimos, em Python não é necessário que utilizemos “end” para terminarmos
uma estrutura. Isto é devido a indentação do programa. Em Python, uma estrutura é
terminada automaticamente quando a tag da próxima linha começa no início da linha.
7.9 While
Esta estrutura de controle tem como objetivo executar o bloco de comandos
identificado nela repetidamente, enquanto a condição dada, para sua validade, for
verdadeira. Para que o bloco de comandos desta condição seja executado de maneira
correta, devemos manter uma organização, tudo que pertencer ao bloco do while, deve
ter um espaçamento da margem a esquerda no texto, isto ajuda a deixar o código
legível e organizado.
>>> while #condição for verdadeira :
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 62
... #bloco de comandos pertencentes ao while
...
>>> #continuacao do programa
Vejamos, por exemplo, como calcular um número fatorial:
>>> resultado = 1
>>> num = input(‘Entre com um número inteiro: ‘)
>>> Entre com um número inteiro: 6
>>> num2 = num
>>> while num2 > 1:
... resultado = resultado * num2
... num2 = num2 - 1
...
>>> print (num, ‘! é igual a ‘,resultado)
>>> 6! é igual a 720
Se a condição estabelecida no while for sempre verdadeira, como 2 < 1, o seu loop
será infinito, pois a condição será sempre atendida. Caso esse seja seu desejo, pode-se
usar também o comando while 1 em vez de estabelecer uma condição qualquer (isso
porque segundo a lógica booleana, que será vista na nona sessão, o python interpreta
o valor 1 como verdadeiro).
7.10 For
O comando for, em Python, difere do que normalmente se vê em outras linguagens
de programação, onde esse comando tem a finalidade de realizar uma iteração baseada
numa progressão aritmética, percorrendo os números definidos pelo usuário, enquanto
em Python a iteração é feita percorrendo os itens de uma sequência, seja ela uma
lista ou até mesmo uma string. Observe o código abaixo:
>>> for contador in range(1, 11):
... print (contador)
A estrutura acima utiliza uma variável criada, no caso contador, para percorrer cada
elemento da lista criada com o comando range(1,11), com isso, cada repetição feita
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 63
pelo loop for fará com que a variável contador aponte para um diferente valor dentro
da lista formada pela função range e logo em seguida imprima esse valor.
A saıda que terıamos neste caso seria:
1
2
3
4
5
6
7
8
9
10
Ou seja, um “print” de todos os elementos da lista.
A função for também pode ser aplicada em strings, observemos o caso abaixo:
>>> lista = [‘teste’, 27, ‘galaxia’, 4, ‘somos’, 1, ‘complexo’]
>>> for item in lista:
... print(‘O item é:’,item)
E obteremos como saıda:
O item é: teste
O item é: 27
O item é: galaxia
O item é: 4
O item é: somos
O item é: 1
O item é: complexo
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 64
CAPÍTULO 8
PYTHON BÁSICO (PARTE 3)
8.1 Dicionários
Um dicionário é um conjunto de elementos que possuem índices, ou seja, dicionários
são formados por chaves e seus respectivos valores, onde as chaves são os índices.
Para se declarar um dicionário e os elementos a ele pertencentes, escrevemos:
>>>dicionario = { 1:’primeiro’ , 2:’segundo’ , 4:’terceiro’
, 8:’quinto’ }
>>>print (dicionario)
{ 1:’primeiro’ , 2:’segundo’ , 4:’terceiro’ , 8:’quinto’ }
>>>print (dicionario[8])
‘quinto’
Os valores referentes aos índices podem ser mudados:
>>>dicionario[8]=’teste’
>>>print (dicionario)
{ 1:’primeiro’ , 2:’segundo’ , 4:’terceiro’ , 8:’teste’ }
Abaixo, citaremos alguns métodos dos dicionários:
• keys() - Retorna uma lista com as chaves do dicionário.
• values() - Retorna uma lista com os valores do dicionário.
• items() - Retorna uma lista com as chaves e seus respectivos valores.
• has_key(x) - Verifica se o dicionário possui a chave x.
8.2 Funções
As linguagens de programação em geral tem o intuito de automatizar ações tornando-
as mais rápidas.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 65
Se houver alguma ação que seja grande e utilizada com frequência, temos a opção
de criar uma função que cumpra o seu objetivo, reduzindo o espaço ocupado pelo
nosso programa final, além de deixá-lo com uma aparência mais limpa, visto que o
tamanho do código irá diminuir.
Essas funções também são muito úteis na tarefa de debuggar o seu código, visto
que você não precisará vasculhar o código atrás do erro, basta entrar na função e
modificá-la. Um exemplo de como podemos diminuir um código está descrito abaixo.
Se em um determinado problema, precisarmos descobrir se dois valores absolutos
são iguais podemos utilizar o código 1 descrito abaixo todas as vezes que precisarmos
realizar essa descoberta, ou podemos simplesmente usar o código 2 criando uma
função que cumpra esse objetivo exigindo apenas que apresentemos os valores que
devemos analisar.
Dado que temos os valores:
a = 23 e b = -23
Função 1:
>>> if a < 0:
... a = -a
>>> if b < 0:
... b = -b
>>> if a == b:
... print (‘Os valores absolutos de ‘, a, ‘ e ‘, b, ‘ são
iguais’)
... else:
... print (‘Os valores absolutos de ‘, a, ‘ e ‘, b, ‘ nao são
iguais’)
Função 2:
>>>def compara absolutos(a,b):
... “Essa função retorna se os valores absolutos das variáveis
requeridas são iguais”
... if a < 0:
... a = -a
... if b < 0:
... b = -b
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 66
... if a == b:
... print (‘Os valores absolutos de ‘, a, ‘ e ‘, b, ‘ são
iguais’)
... else:
... print (‘Os valores absolutos de ‘, a, ‘ e ‘, b, ‘ na são
iguais’)
…
Abaixo apresentamos a sintaxe necessária para criação de funções utilizando a
linguagem Python.
>>>def funcao(variavel1,variavel2,...,variavelN):
... bloco de comandos
... return
E que ao chamar uma função, podemos passar a esta alguns parâmetros (valores
ou strings): funcao(1234,”teste”,”Teste235”).
Porém em algumas funções ao colocarmos nosso código na seção bloco de
comandos, a função automaticamente definirá os parâmetrosnecessários.
Por exemplo, se houver uma função que faça cálculos matemáticos, devolvendo
um resultado numérico, será necessário que todas as variáveis chamadas pela função
sejam inteiros ou floats.
8.2 Variáveis em funções
Em geral, quando estamos eliminando código repetitivo por meio de funções também
temos algumas variáveis repetidas neste código. Em Python, as variáveis podem ter
tratamentos diferentes em função de onde se encontram. Todas as variáveis que
vimos até agora são chamadas de variáveis globais, ou seja, em qualquer momento
ou em qualquer parte do código do seu programa, você poderá utilizá-las (seja para
ler seu conteúdo ou atribuir valores).
Funções tem um tipo especial de variáveis que são chamadas de variáveis locais.
Estas variáveis existem apenas dentro da função, de forma que caso o programador
determine uma função e armazene um certo dado em uma variável local, ao término
desta função a variável será destruída, não sendo possível recuperar seu valor.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 67
Mas como então, podemos recuperar um valor da variável utilizada em uma função?
Para isto usamos o comando return seguido de algum valor ou uma variável. Neste
caso, a variável local “escondera” a variável global, enquanto a função estiver rodando.
Um pouco confuso?
Então confira o exemplo abaixo:
>>>a = 4
>>>def print_func():
... a = 17
... print (‘in print_func a = ‘, a)
...
Agora chame a função print_func() e peça o valor “a” utilizando o comando print,
seu resultado deve ser este:
>>>print_func()
in print_func a = 17
>>>print (‘a = ‘, a)
a = 4
Com isto, podemos concluir que variáveis criadas dentro de uma função (variáveis
locais), não afetam as variáveis que estão fora dela (variáveis globais). As variáveis
locais existem apenas dentro do espaço limitado pela função, não podendo assim
nem ser usada, nem afetar nada fora deste espaço.
8.3 Recursividade
A recursividade é um tipo de iteração (repetição) na qual uma função chama a si
mesma repetidamente até que uma condição de saída seja satisfeita. Abaixo temos um
exemplo de uma função responsável por calcular o fatorial de números positivos inteiros
e demonstra como uma função pode chamar a ela mesma utilizando a propriedade
recursiva.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 68
>>>def fatorial(n):
... if n <= 1:
... return 1
... return n * fatorial(n - 1)
...
>>>print (‘2! = ‘,fatorial(2))
2! = 2
>>>print (‘3! = ‘,fatorial(3))
3! - 6
>>>print (‘4! = ‘,fatorial(4))
4! = 24::
>>>print (‘5! = ‘,fatorial(5))
5! = 120
Um passo-a-passo de como a função é executada, utilizando o comando fatorial(n),
para
n = 3:
1. Quando chamamos a função fatorial(3), fornecemos à função o valor 3 para o
parâmetro de entrada n.
2. O comando if testa se n é menor ou igual a 1, como este não é, a função contínua.
3. Nesta parte a função pretende retornar o valor n*fatorial(n-1), ou seja, 3*fatorial(2).
Entretanto, ela ainda não possui o valor de fatorial(2). Para isso, a função fatorial
é novamente chamada com n = 2, retornando o valor 2*fatorial(1).
4. Como ainda não temos fatorial(1), a função chama a si mesma mais uma vez
para calculá-lo.
5. Com isto, atingimos a condição de saída do if que está na função fatorial e
então o valor retornado é 1.
Vamos fazer uma retrospectiva do que aconteceu ao se executar esta função:
fatorial(3)
3 * fatorial(2)
3 * 2 * fatorial(1)
3 * 2 * 1 = 6
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 69
8.4 Módulos/Pacotes/Bibliotecas
Pensando na reutilização de código, a linguagem Python já possui um conjunto
de funções prontas para serem usadas ou agregadas em seus programas. Essas
funções estão agrupadas em estruturas denominadas módulos. Para a utilização
desses módulos é preciso utilizar o comando import nome do módulo.
Após ter importado o módulo, qualquer função pertencente a ele pode ser utilizada
através do comando nome do modulo.função(argumento).
É possível importar do módulo apenas a função desejada. Para isso, utilizamos
o comando from nome do módulo import função, e a função estará disponível para
utilização.
Você também pode definir o seu próprio módulo. Defini-se as funções desejadas e
ao final, você salva o seu módulo com a extensão .py . Exemplo:
Digite em um editor de texto simples:
#IMC.py
def índice(altura,peso):
imc = peso/(altura**2)
return imc
def estado(imc):
if imc < 24.9:
print (‘NORMAL’)
elif 24.9 < imc < 29.9:
print (‘PESO A MAIS’)
elif 29.9 < imc < 40:
print (‘LIGEIRA OBESIDADE’)
elif imc > 40:
print (‘OBESIDADE’)
else:
print (‘MAGRO DEMAIS’)
def pesoideal(peso,altura):
a = 20*(altura**2)
b = 24.9*(altura**2)
print (‘Seu peso ideal se encontra entre %f e %f’ %(a,b))
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 70
Agora, salve o seu arquivo como IMC.py . De agora em diante, o módulo já pode
ser utilizado por qualquer programa em Python.
Apresentaremos a seguir 3 módulos interessantes e de grande uso para a maioria
dos usuários de Python:
8.5 Módulo Math
O módulo math possui funções matemáticas para números não complexos. Existe
um módulo equivalente para números complexos: cmath. A distinção destes módulos
deve-se ao fato da maioria dos usuários não querer aprender a fundo a teoria dos
complexos.
Este módulo contém funções de representação numérica, logarítmicas, exponenciais,
hiperbólicas, trigonométricas e conversões angulares e os valores retornados por este
módulo são pontos flutuantes.
As constantes pi e e tem valores definidos neste módulo, podendo ser usadas
diretamente pelo nome, a partir do momento que o módulo é importado.
Abaixo, estão listadas algumas funções desse módulo:
• math.factorial(x) - Retorna o valor de x tutorial. Caso x seja negativo, retorna
um erro.
• math.modf(x) - Retorna o valor inteiro e o valor fracionário de x.
• math.exp(x) - Retorna e exponencial de x.
• math.log(x,base) - Retorna o log de x na base pedida.
• math.log1p(x) - Retorna o log natural de x.
• math.sqrt(x) - Retorna a raiz quadrada de x.
• math.degrees(x) - Converte o ângulo x de radianos para graus.
• math.radians(x) - Converte o ângulo x de graus para radianos.
As funções trigonométricas sin(x), cos(x), tan(x) e suas inversas também estão
contidas neste módulo, além das funções a seguir:
• math.hypot(x,y) - Retorna a norma euclidiana entre x e y, ou seja, a hipotenusa
do triângulo retângulo de catetos x e y.
• math.atan2(y,x) - Retorna o valor do arco tangente de y/x.
Os valores retornados das funções trigonométricas estão em radiano. Para uma
lista completa de funções neste módulo, basta pedir um help(math).
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 71
CAPÍTULO 9
PYTHON BÁSICO (PARTE 4)
9.1 Modulo I/O (input/output) - Manipulação de arquivos
Em algumas situações será necessário que se armazene dados ou então que se
colete dados de algum arquivo, para isso existe um módulo em python que se comunica
com o sistema operacional chamado “io” (input/output). Desse módulo o comando
principal é o comando “open”, a sintaxe do programa está demonstrado abaixo:
>>> open(‘endereco/nome do arquivo.extensão’,’modo de abertura’)
Se estiver utilizando um sistema UNIX e o arquivo estiver na mesma pasta em que
foi executado o interpretador não é necessário colocar o endereço do arquivo. E os
modos de abertura são mostrados abaixo:
r (read)- Abrir o arquivo somente para leitura;
a (append)- Abrir o arquivo somente para escrita, nesse modo o texto é somado
ao arquivo;
w (write)- Abrir o arquivo somente para escrita, nesse modo o texto é substituído
A função open possui vários métodos os mais importantes serão mostrados abaixo
e depois demonstrados:
close() - fecha o arquivo. Se o arquivo nao for fechado, ele continua como um objeto
e não poderá ser modificado fora do interpretador;closed - Responde com valores booleanos se a conexão foi fechada ou não.
Para criar um novo arquivo se usa o modo write (w). Vamos demonstrar agora como
criar um arquivo com extensão txt, como todos os métodos desse módulo utilizam a
sintaxe mostrada acima, declaramos uma variável que recebe a função open.
OBS.: Antes de escrever esse comando verifique se não existe um arquivo com o
mesmo nome, pois se houver esse comando substituirá o arquivo por um novo.
>>> abrir = open(“teste.txt”,“w”)
>>> abrir.close()
>>> editar = open(“teste.txt”,“a”)
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 72
Com isso criamos um arquivo, utilizando o modo w, chamado “teste.txt”, atribuímos a
ele a variável “abrir” e o fechamos com o método “.close”. Depois criamos outra variável
que possui a qualidade de editar o arquivo sem escrever por cima, ou seja, que utiliza
o modo a. Agora vamos explorar os métodos existentes quando utilizamos o modo
“append”. Primeiramente utilizaremos o método “.write”, que serve para adicionar uma
string ao nosso arquivo.
>>>editar.write(”Hello World!”)
>>>editar.close()
>>>editar.closed
OBS.: o comando “closed” confirma se a conexão entre o python e o arquivo foi
interrompida.
Com esses comandos foi adicionado a string “Hello World!” ao arquivo, podemos
confirmar isto abrindo o arquivo e lendo ou então podemos usar o modo de leitura “r”.
>>>ler.open(”teste.txt”,”r”)
>>>ler.readline()
>>>ler.close()
Novamente, criamos uma variável, no caso a variável “ler”, só que desta vez atribuímos
a ela o modo de leitura, depois utilizamos o método “.readline()” que lê o arquivo linha
a linha.
OBS.: Depois de alcançar o final do texto ele devolve uma string vazia, para voltar a
ler o arquivo depois disso é necessário que você abra outra conexão com o arquivo.
Agora que já sabemos criar, editar e ler um arquivo vamos criar uma lista de presença.
>>> #Comecaremos criando o arquivo
>>> criar = open(”presenca.txt”,”w”)
>>> criar.close()
>>> #Agora vamos escrever as funcoes responsaveis pela escrita
e leitura da nossa lista de presenca
>>> #Criamos uma função para adicionar o nome dos alunos a
lista
>>> def adicionar aluno():
>>> ”O nome do aluno presente deve estar entre parenteses ”
>>> #Criamos uma variavel para editar o arquivo
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 73
>>> aluno = input(”Qual o nome do aluno? \n”)
>>> escrever = open(”presenca.txt”,”a”)
>>> escrever.write(aluno+”\n”)
>>> escrever.close()
>>> #Depois criamos uma função para ler os nomes na lista
>>> def aluno presente():
>>> ”Deve ser declarado um inteiro correspondente a linha em
que o aluno esta ”
>>> #Criamos uma variavel de para ler o arquivo
>>> leitura = open(”presenca.txt”,”r”)
>>> #Nesse caso vamos usar o método readlines() e atribuı-la
a uma variavel, dessa forma a variavel sera uma lista, em
que, cada elemento desta lista é uma linha do arquivo
>>> ler = leitura.readlines()
>>> print (ler[1:5])
>>> aluno = input(”Deseja saber todos os presentes? s/n \n”)
>>> if aluno == ”s”:
>>> for nomes in ler:
>>> print (nomes)
>>> elif aluno == ”n”:
>>> qual aluno = input(”Qual o nA omero do aluno? \n”)
>>> print (ler[qual aluno-1])
>>> else:
>>> print (”ERRO, digite s ou n”)
9.2 Lista de Pacotes/bibliotecas bastante utilizados na comunidade
Existem outros pacotes que podem ser utilizados em seus desenvolvimentos. Abaixo
listamos, em ordem alfabética, as principais para o sistema operacional Microsoft
Windows.
Caso o aluno deseje saber quais funções cada pacote possui, basta digitar o comando
help(nome da biblioteca/pacote):
abc
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 74
array
ast
asynchat
asyncore
atexit
audioop
base64
BaseHTTPServer
Bastion
bdb
binascii
binhex
bisect
bsddb
bz2
calendar
Carbon
cgi
CGIHTTPServer
cgitb
chunk
cmath
cmd
code
codecs
codeop
collections
colorsys
compileall
compiler
CongParser
contextlib
Cookie
cookielib
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 75
copy
copy reg
cPickle
cProle
cStringIO
csv
ctypes
curses
datetime
dbhash
decimal
diib
dircache
dis
distutils
doctest
DocXMLRPCServer
dumbdbm
dummy thread
dummy threading
email
encodings
errno
exceptions
lecmp
leinput
fnmatch
formatter
fpformat
fractions
ftplib
functools
future builtins
gc
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 76
getopt
getpass
gettext
glob
gzip
hashlib
heapq
hmac
htmlentitydefs
htmllib
HTMLParser
httplib
imageop
imaplib
imgle
imghdr
imp
imputil
inspect
io
itertools
json
keyword
lib2to3
linecache
locale
mailbox
mailcap
marshal
math
md5
mhlib
mimetools
mimetypes
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 77
MimeWriter
mimify
mmap
modulender
msilib
msvcrt
multile
multiprocessing
mutex
netrc
new
nntplib
numbers
operator
optparse
os
parser
pdb
pickle
pickletools
pkgutil
platform
plistlib
popen2
poplib
pprint
pstats
py compile
pyclbr
pydoc
Queue
quopri
random
re
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 78
readline
repr
rexec
rfc822
rlcompleter
robotparser
runpy
sched
ScrolledText (Tk)
select
sets
sgmllib
sha
shelve
shlex
shutil
signal
SimpleHTTPServer
SimpleXMLRPCServer
site
smtpd
smtplib
sndhdr
socket
SocketServer
sqlite3
ssl
stat
statvfs
string
StringIO
stringprep
struct
subprocess
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 79
sunau
symbol
symtable
sys
tabnanny
tarle
telnetlib
temple
test
textwrap
thread
threading
time
timeit
Tix
Tkinter
token
tokenize
trace
traceback
turtle
types
unicodedata
unittest
urllib
urllib2
urlparse
user
UserDict
UserList
UserString
uu
uuid
warnings
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 80
wave
weakref
webbrowser
whichdb
winsound
wsgiref
xdrlib
xml
xmlrpclib
ziple
zipimport
zlib
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 81
CAPÍTULO 10
O PROTÓTIPO (PARTE 1)
O protótipo, apesar de ter uma estrutura basilar simples, traça os caminhos
necessários para a sua evolução, além de unir consistentemente diversos recursos
tecnológicos em uma única aplicação, utilizando-se de baixíssimo custo, demonstrando
a tese de que o movimento maker e a inteligência artificial podem juntos trazer novas
perspectivas de trabalho científico e corporativo.
Além disso, o protótipo desenvolvido foi apresentado em seminários internos da
UNESP Bauru, onde outros pesquisadores puderam realizar questionamentos e ver o
produto em funcionamento.
O projeto proporcionou uma experiência muito interessante em que foi possível
identificar as peculiaridades das tecnologias disponíveis e a necessidade de unir
diversos conhecimentos para obtenção do resultado esperado. Alguns problemas
foram identificados como, por exemplo, compatibilidades entre pacotes, que será
abordado a seguir.
Figura 21 – Captura de tela do protótipo
Fonte: Próprio pesquisador
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 82
Figura 22 – Diagrama básico de execução do protótipo
Fonte: Próprio pesquisador
É importante lembrar que como foram utilizadas tecnologias bastante recentes,
além de várias bibliotecas open source, pode existir certa dificuldade em encontrar
conteúdo atualizado em língua portuguesa. Enfrenta-se também pequenos problemas
de versionamento das bibliotecas/pacotes, devido ao uso conjunto das mesmas e
de vários recursos encapsulados que podem conflitar em determinados momentos
de desenvolvimento. A comunidade em torno dos pacotes evolui e apresenta novas
formas de resolver “o mesmo problema”. Por isso é importante manter atualizada a
documentação e o acompanhamento de novidades em cada uma delas.
Devido à característica de reprodutibilidade deste trabalho, tenta-se minimizar aomáximo a ocorrência de qualquer erro na execução, aplicação e testes, conforme
evidencia-se nos anexos deste trabalho, onde constam os procedimentos necessários
para a reprodução do ambiente e execução do protótipo em funcionamento.
Soma-se a isso, ainda, a lembrança de que se trata de temas contemporâneos em
constante evolução e transformação que exigem do profissional e/ou pesquisador uma
certa flexibilidade para acompanhar esse cenário, obtendo os resultados almejados
e, por que não, nunca antes imaginados.
O código fonte e demais procedimentos necessários para montagem do ambiente
serão detalhados nos próximos capítulos.
Etapas e procedimentos de execução
Passo-a-passo de instalação e execução do ambiente para que possam ser
reproduzidos os resultados descritos neste trabalho, seja a título de pesquisa ou como
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 83
de empreendimento pessoal. Após os itens enumerados, detalharemos cada passo
para maior entendimento:
1. Instalação Notepad++
2. Certifique-se que seu Windows já possua ferramentas de Build do Visual
Studio 2017, senão instale: Visual Studio Compiler Sugestão de link, acesso
em 30/12/2020: https://aka.ms/vs/16/release/vc_redist.x64.exe
3. Instalação Anaconda Versão Python 3.7
4. Após a instalação, entrar no Anaconda Navigator para criar o seu ambiente de
trabalho, aqui utilizamos o nome “isis”, ou seja, o ambiente terá o mesmo nome
do protótipo. Aguarde a criação do ambiente.
5. Acesso o Anaconda Prompt:
Na janela que abrir, digite, onde <enter> se refere a pressionar a tecla enter do
teclado:
cd\ <enter>
Crie uma pasta chamada “python”, digitando:
mkdir python <enter>
Observação: Nesta pasta será colocado o arquivo isis.py que é o código fonte
completo do protótipo.
Ainda no Anaconda Prompt, ative o ambiente “isis” digitando:
activate isis <enter>
Neste ponto, o ambiente está apto para receber a instalação de todas as bibliotecas/
pacotes necessários, conforme comando elencados abaixo.
6. Atualizar o instalador PIP
python -m pip install --upgrade pip <enter>
#apoio para casos de exceção
#pip install <pacote> --use-feature=2020-resolver
7. Bibliotecas necessárias, aguarde a instalação individual de cada uma e depois
instale a próxima.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 84
pip install numpy <enter>
pip install pywinauto <enter>
pip install pyttsx3 <enter>
pip install speechrecognition <enter>
#para o chatterbot
pip install spacy <enter>
pip install chatterbot <enter>
pip3 install chatterbot_corpus <enter>
pip install ez_setup <enter>
pip install pipwin <enter>
pip install pyauto <enter>
pip install pyaudio <enter>
## https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio baixar
a versão adequada ao seu pc
## PyAudio-0.2.11-cp37-cp37m-win_amd64.whl
pip install spyder <enter>
pip install msvc-runtime <enter>
pipwin install pocketsphinx <enter>
##cv2
pip install opencv-python <enter>
pip install nltk <enter>
Passo a passo detalhado:
1. Notepad ++ é um editor de texto e código-fonte para uso com o Microsoft
Windows . Suporta edição com guias , o que permite trabalhar com vários arquivos
abertos em uma única janela. Recomendamos seu uso pela simplicidade.
Pode ser baixado em seu site oficial: https://notepad-plus-plus.org/downloads/
2. Microsoft Visual Studio Compiler (MVSC) é um compilador desenvolvido pela
Microsoft para suportar compilações de código fonte de linguagem C em
ambientes Windows. É necessário neste trabalho, pois algumas bibliotecas de
Python utilizadas requerem tal recurso. Pode ser baixado em diversos links e sites
da Microsoft. Sugerimos o link: https://aka.ms/vs/16/release/vc_redist.x64.exe
https://aka.ms/vs/16/release/vc_redist.x64.exe
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 85
Salve o arquivo no diretório desejado:
3. Instalação Anaconda Versão Python 3.7. Pode ser baixado em seu site oficial:
https://www.anaconda.com/products/individual
4. Após a instalação, entrar no Anaconda Navigator para criar o seu ambiente de
trabalho, aqui utilizamos o nome “isis”, ou seja, o ambiente terá o mesmo nome
do protótipo.
Clique em Environments, assinalado em vermelho na imagem abaixo:
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 86
Na tela seguinte, clique em Create, em seguida preencha o nome do ambiente
que você deseja criar, conforme imagem abaixo e assinalado em vermelho:
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 87
Aguarde a criação do ambiente, pode levar alguns minutos.
Após a criação, você poderá ver seu ambiente na lista de ambientes disponíveis.
5. Com o ambiente já criado, abra o Anaconda Prompt e posicione no diretório
desejado para salvar seus códigos fontes e executar as ações necessárias. No
exemplo abaixo, direcionados para o diretório c:\python. Em seguida damos o
comando para ativar o ambiente desejado, no caso, “isis” ou “isis2” que usaremos
de exemplo nesta disciplina.
Observe assinalado em vermelho na imagem abaixo que após os comandos,
estamos “dentro do ambiente isis”, onde poderemos adicionar as bibliotecas/
pacotes necessários para nosso protótipo:
6. Por questões de boas práticas é interessante, porém opcional, atualizar o PIP,
que é o gerenciador de pacotes do Python. O comando necessário é:
python -m pip install --upgrade pip <enter>
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 88
Observe que após o comando, foi baixado e atualizado PIP.
7. Agora, na próxima aula, iniciaremos a instalação das diversas bibliotecas
utilizadas nesta disciplina. Mas antes dos comandos de instalação, vamos
conhecer um pouco mais delas na próxima aula, para entender seus objetivos
e documentações disponíveis.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 89
CAPÍTULO 11
O PROTÓTIPO (PARTE 2)
10.1 Bibliotecas Selecionadas Nesta Disciplina
Como o foco do trabalho é a intersecção entre movimento maker e recursos
tecnológicos relacionados à inteligência artificial contemporânea, pesquisou-se quais
pacotes (bibliotecas ou packages) estariam mais adequadamente prontos, a fim de
reduzir o esforço necessário para desenvolvimento, execução e testes da aplicação,
garantindo seu funcionamento e reprodutibilidade, além de demonstrar que o “mão
na massa” (maker) funcionaria em conjunto com tais tecnologias em nosso ambiente
regional.
As bibliotecas selecionadas estão abaixo relacionadas com uma breve descrição de
seus nomes, objetivos e funções disponíveis, visando com isso um maior entendimento
dos recursos que o protótipo irá apresentar em sua execução preliminar, além de
constarem os links diretos para acesso às suas documentações atuais, lembrando
que a comunidade Python é ‘viva’ e muito veloz, atualizando-se constantemente em
suas estruturas, pacotes, dados e documentação:
NumPy: Muito disseminada no meio acadêmico devido aos seus diversos recursos
relacionados a cálculos, expressões algébricas e matemática em geral. Toda
documentação atual está disponível em https://numpy.org/doc/ com acesso realizado
em 30/12/2020.
PyWinAuto: Trata-se de um conjunto de módulos Python para automatizar a
interação do usuário com o sistema operacional Microsoft Windows. Em sua forma
mais simples, ele permite que você envie ações do mouse e do teclado para os diálogos
e controles do Windows, diretamente de um programa Python em execução. Toda
documentação atual está disponível em https://pywinauto.readthedocs.io/en/latest/
com acesso realizado em 30/12/2020.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 90
Pyttssx3: Biblioteca que inclui drivers (formas e mecanismos de acesso a hardware)
para os sintetizadores de um “formato texto” para “formato voz”. Existem vários driversjá validados. Toda documentação atual está disponível em https://pyttsx3.readthedocs.
io/en/latest/ com acesso realizado em 30/12/2020.
SpeechRecognition: O “reconhecimento de fala” é o processo de conversão de
palavras faladas em texto. Essa biblioteca Python oferece suporte a muitos mecanismos
de reconhecimento de voz, incluindo Google Speech Engine, Google Cloud Speech API,
Microsoft Bing Voice Recognition e IBM Speech to Text. Toda documentação atual
está disponível em https://pythonprogramminglanguage.com/speech-recognition/
com acesso realizado em 30/12/2020.
ChatterBot: ChatterBot é uma biblioteca Python que facilita a geração de respostas
automatizadas para a entrada de um usuário. O ChatterBot usa uma seleção de
algoritmos de machine learning (aprendizado de máquina) para produzir diferentes
tipos de respostas, conforme as entradas recebidas. Isso torna mais fácil para os
desenvolvedores criar bots (robôs de conversação) e automatizar conversas com os
usuários. Toda documentação atual está disponível em https://chatterbot.readthedocs.
io/en/stable/ com acesso realizado em 30/12/2020.
SpaCy: Uma biblioteca Python para Processamento de Linguagem Natural (PLN),
que facilita a utilização de inteligência artificial para compreensão de diálogos em
linguagem humana. Permite a utilização de várias línguas e formatos de análise.
Toda documentação atual está disponível em https://spacy.io/api/doc com acesso
realizado em 30/12/2020.
PyAuto: O PyAutoGUI permite que seus scripts Python controlem o mouse e o
teclado para automatizar as interações com outros aplicativos. A biblioteca foi projetada
para ser bastante simples. O PyAutoGUI pode funcionar em sistemas operacionais
Windows, macOS e Linux. Toda documentação atual está disponível em https://
pyautogui.readthedocs.io/en/latest/ com acesso realizado em 30/12/2020.
PyAudio: PyAudio fornece vínculos Python para portas de áudio, portanto a biblioteca
trata de entradas e saídas de áudios em dispositivos. Com PyAudio, é possível usar
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 91
Python facilmente para reproduzir e gravar áudio em uma variedade de plataformas.
Toda documentação atual está disponível em https://people.csail.mit.edu/hubert/
pyaudio/docs/ com acesso realizado em 30/12/2020.
PocketSphinx: Um mecanismo de reconhecimento de voz que permite trabalhar
com modelos prontos e criar os próprios modelos conforme sua necessidade. Toda
documentação atual está disponível em https://cmusphinx.github.io/doc/pocketsphinx
com acesso realizado em 30/12/2020.
OpenCV-Python: OpenCV (Open Source Computer Vision Library: http://opencv.org)
é uma biblioteca de código aberto que inclui várias centenas de algoritmos de visão
por computador ou visão computacional. Proporcionando manipular dados obtidos
por câmera e realizar algoritmos de detecção de informações de maneira visual. É
opcional neste trabalho, mas foi mantida devido a sua relevância e utilidade. Toda
documentação atual está disponível em https://docs.opencv.org/master/d1/dfb/intro.
html com acesso realizado em 30/12/2020.
Spyder: Trata-se um robusto ambiente científico escrito em Python, para Python e
projetado por e para cientistas, engenheiros e analistas de dados. Ele apresenta uma
combinação única de edição avançada, análise, depuração e funcionalidade de criação
de perfil de uma ferramenta de desenvolvimento abrangente com a exploração de dados,
execução interativa, inspeção profunda e capacidades de visualização gráfica. Também
é opcional neste trabalho, mas consta devido sua importância e reconhecimento. Toda
documentação atual está disponível em https://docs.spyder-ide.org/current/index.html
com acesso realizado em 30/12/2020.
Até o momento de desenvolvimento deste trabalho foram utilizadas apenas as
bibliotecas supracitadas capazes de potencializar enormemente as capacidades de
desenvolvimento do profissional e/ou pesquisador. Também pode-se observar que
todas as bibliotecas apresentadas possuem um bom volume de documentação,
conforme links de suas descrições, além de fóruns online não oficiais, aqui não relatados,
mas facilmente pesquisáveis, que permitem ainda mais colaboração entre todos os
interessados ao redor do mundo.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 92
7.2 Comandos para instalação das bibliotecas
No Anaconda Prompt, já com o ambiente ativado, vamos executar os comandos
abaixo para instalação de cada biblioteca, uma a uma. Atente-se que existem bibliotecas
maiores e portanto demoram mais para instalação. Abaixo ilustramos os comandos
e as principais saídas, confirmando a instalação ou se houve algum erro.
pip install numpy <enter>
pip install pywinauto
pip install pyttsx3
pip install speechrecognition
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 93
pip install spacy==2.3.5
Para garantia de pacotes de linguagem, adicionalmente execute o comando:
python -m spacy download en
pip install chatterbot
pip3 install chatterbot_corpus
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 94
pip install ez_setup
pip install pipwin
pip install pyauto
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 95
Para o pacote PyAudio é necessário entrar no link: https://www.lfd.uci.
edu/~gohlke/pythonlibs/#pyaudio
Baixe a versão mais adequada para seu computador, no caso, usamos o arquivo
assinalado em vermelho na imagem:
Salve o arquivo no diretório de trabalho, no caso, c:\python e então execute o
comando:
pip install PyAudio-0.2.11-cp37-cp37m-win_amd64.whl
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 96
pip install spyder
pip install msvc-runtime
Para o pacote PocketSphinx é necessário entrar no link: https://www.lfd.uci.
edu/~gohlke/pythonlibs/
Baixe a versão mais adequada para seu computador, no caso, usamos o arquivo
assinalado em vermelho na imagem:
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 97
Salve o arquivo no diretório de trabalho, no caso, c:\python e então execute o
comando:
pip install pocketsphinx-0.1.15-cp37-cp37m-win_amd64.whl
pip install opencv-python
pip install nltk
Agora, com todas as bibliotecas/pacotes instalados, podemos iniciar o
desenvolvimento do nosso protótipo.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 98
CAPÍTULO 12
O PROTÓTIPO (PARTE 3)
Agora nosso ambiente contém todas as bibliotecas/pacotes necessários para o
início da codificação do nosso protótipo.
Abra o NotePad++ e inicie um novo arquivo, no caso, usamos “isis.py”.
Vamos iniciar nosso código importando as bibliotecas/pacotes que acabamos de
instalar no ambiente.
Inicialmente, vamos importar os pacotes: sys, os, numpy, winsound, datetime, pywinauto
e string. Recursos tradicionais e muito comuns para códigos.
A seguir, utilizamos o “beep” e também o “print” para sinalizar as operações que
estão ocorrendo por trás do protótipo, além de contar o tempo de carga de cada
pacote, a fim de saber se está muito lento ou de acordo com o esperado.
Continuamos a carregar mais pacotes, observe que em verde, junto ao código
introduzimos comentários para facilitar a compreensão:
Neste ponto já podemos notar que as bibliotecas encapsulam recursos de machine
learning, conforme falamos em capítulos anteriores sobre o tema inteligência artificial.
Pois nos mais variados softwares hoje em dia, será comum ter esse tipo de recurso.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 99
É o mesmo caso do pacote Chatterbot, importante para nosso software, pois ajudará
na interação com o usuário:
Notem como podemos “agregar” inúmeros recursos, desde básico ao mais avançado,
com poucos procedimentos e “organização” das funções, podendo chamá-las em
momentoscruciais para o funcionamento do nosso protótipo.
Abaixo, importamos recursos de visão computacional, tópico também relevante no
cenário atual, onde podemos interagir com a câmera disponível no dispositivo:
Sobre a função de visão computacional teremos um capítulo à parte, pois o protótipo
roda sem ela, porém foi incluída a título didático, a fim de introduzir o tema aos
estudantes e abrir possibilidade de expansão futuro do protótipo por parte de quem
desejar.
Nesse ponto do código, podemos considerar que executamos a “primeira fase”, onde
incluímos recursos variados para que estejam disponíveis utilizando procedimentos
simples de orientação a objetos.
Poderemos abstrair mentalmente esses objetos e consumir seus recursos, traduzidos
em propriedades e parâmetros, desempenhando o papel que desejamos dentro do
protótipo.
Vejam que interessante no próximo passo, onde instanciamos o objeto “sr” dentro da
variável “rec”, para que ele reconheça (recognize) recursos de voz que serão “traduzidos”
em texto e possamos utilizar em tomadas de decisões. Em outras palavras, tudo que
o microfone captar, será lido e convertido em fala por aproximação matemática e
usando recursos do pacote.
Neste ponto, é como se preparassemos o ambiente para consumir/executar funções
do microfone a qualquer momento. Além de podermos modificar determinados
parâmetros que podem ser úteis para nossa aplicação:
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 100
Em seguida, muito importante, iniciamos o espaço onde “a robô”, ou seja, o Chatterbot
fica disponível para interação, dentro do ambiente. Para isso instanciamos o ChatBot
dentro da variável “bot”:
Observem nos comentários, em verde, que podemos ter uma inicialização de única
linha ou podemos decidir parametrizar características que o Chatterbot irá apresentar
quando utilizado.
No caso, detalhamos a criação de um banco de dados para armazenar os diálogos
e também adotamos um recurso básico de resposta a questões matemáticas simples.
Deixamos alguns comentários com outras possibilidades para que o estudante teste
em seu ambiente.
Observem também, que ao longo de início de código, mantemos a indentação e
comentários como boas práticas de desenvolvimento.
No passo seguinte é importante compreender que se teremos um Chatbot que
interage com os seres humanos, o mesmo precisa de um “vocabulário” inicial, por isso,
criamos uma variável básica do tipo vetor que contém palavras e frases que podem
ser úteis para nosso objetivo. Claramente, o estudante poderá modificar conforme
seu desejo, coadunando com a premissa do open source e maker.
A seguir, utilizamos propriedade e funções dos objetos previamente instanciados:
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 101
Onde o ChatBot, “bot”, irá ser “treinado” com o vocabulário “chats” que foi criado.
Incentivamos o estudante a modificar e ampliar o vocabulário o máximo possível para
testar diferentes possibilidades. No nosso protótipo utilizamos apenas algumas frases
comuns e chamadas de atividades que serão tratadas como “ações” executadas pela
robô.
A partir desse momento, iremos instanciar objetos que consomem as “vozes”
disponíveis no dispositivo, onde configuramos algumas propriedades conforme nosso
desejo de criar uma experiência diferente, como velocidade e volume.
Neste ponto do código temos todos os recursos necessários já carregados,
parametrizados e disponíveis para uso.
Podemos partir para o desenvolvimento da estrutura “robótica” a partir da função
principal “main”.
Caso você deseje, já pode executar o código e verá algumas saídas na tela,
confirmando os recursos disponíveis. Vamos lá?
Aqui salvamos o arquivo com o nome de “isis-teste.py”, pois como se trata do código
incompleto, é apenas ilustrativo que já podiamos rodar o código.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 102
Notem que com apenas alguns comandos e aproximadamente 100 linhas de código
fonte, já temos diversos recursos avançados disponíveis para uma utilização plena
sem desperdício de tempo, com baixo custo e como veremos nos próximos passos,
extremamente funcional.
Pedimos atenção no modelo de “log” que se apresenta o protótipo, onde o mesmo
registra tudo o que está acontecendo, com data, horário, constando precisão de
milissegundos, uma vez que, quanto melhor a performance do dispositivo, o protótipo
evidenciará os recursos empregados.
Esperamos que tenha obtido sucesso até aqui e continue conosco evoluindo esse
código fonte!
Em Python, como boas práticas, chamamos a função “main” que será a primeira
a ser executada:
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 103
Em seguida, passamos para a escrita da função em si:
Observem as variáveis criadas, pois serão importantes ao longo da estrutura
“robótica” que entrará em “loop” nas linhas seguintes.
Com o objeto de SpeechRecognition “sr”, instanciamos o microfone na variável “s”,
que trata-se de todo o áudio que o mesmo capturará e poderemos tratar conforme
nossa necessidade, como no caso, usamos um recurso que limpa ruídos ambientes:
A seguir, o loop mencionado anteriormente que fará a dinâmica de captura e resposta
pretendida:
Observe que se “n” está igual a zero, iniciamos com a mensagem de boas vindas.
Pois durante cada interação do “loop”, esta variável será alterada para indicar em que
momento estamos da execução.
Como estamos evoluindo no código, continuem prestando atenção na indentação
do mesmo, de suma importância para o Python e também para legibilidade do código.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 104
Utilizamos agora a estrutura “try”, pois permite que qualquer erro/exceção seja
tratado devidamente. Registramos também um log informando ao usuário que o robô
passará a “ouvir” o que for dito:
Iniciando a “escuta” vida microfone:
Lembram dos objetos instanciados anteriormente no código? Agora, ajustamos
novamente os ruídos e usamos o método “listen” para capturar o áudio que vier do
microfone.
Na variável “audio” será armazenado tudo o que capturado pelo microfone.
Observe que novamente registramos o log e o tempo de processamento acompanhado
de um “beep”:
Agora processaremos o áudio captado para que seja convertido em texto:
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 105
A título de exemplo, processo a variável “audio” para obter um retorno com texto
que possamos manipular:
Com esse trecho de código já podemos trabalhar com dispositivos (microfone) e
processar diversos objetos consumindo muitos recursos avançados de forma bastante
simples.
Na sequência devemos tratar as possíveis exceções, pois lembre-se, estamos dentro
de um bloco “try”:
Observe que, caso se apresente um erro desconhecido, a robô diga que não houve
compreensão, soma-se a variável “n” e manda o programa tentar novamente uma
nova escuta.
Continuando tratando exceções, observe que agora observamos a falta de conexão
com a internet:
O robô torna a verbalizar que houve um problema e também inicia novamente a
captura.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 106
Agora caso uma interrupção proposital do humano, como por exemplo, “esc” ou
“ctrl+q”, o robô abortará desligando o processamento e se despedindo do usuário:
Por último, nesta sessão, apresentamos no log o que foi dito pelo humano no
microfone:
Junto a isso ele converterá todo o texto capturado em letras maiúsculas, para
que possamos tratar esse conteúdo de maneira mais simples e verificar se será
necessária a execução de ações ou apenas deixar o Chatterbot responder o que foi
dito pelo humano.
Na próxima aula, trataremos o conteúdo convertido em texto de maneira bastante
simples usando testes de conteúdo, baseado em ações pré-desenhadas pelo
desenvolvedor.
Utilizamosaqui, apenas alguns exemplos de ações cotidianos que podem ser
desejadas, mas incentivamos que o desenvolvedor pense e inclua as mais variadas
situações, para testar a funcionalidade, mas também como desafio maker, onde você
pode fazer o robô responder àquilo que sua mente lhe proporciona de ideias.
É interessante notar também que até esse pontos, usamos recursos de orientação a
objetos de maneira bastante simples, prezando pela facilidade de leitura do código, bem
como compreensão para diversos públicos, além da tecnologia, uma vez que, conforme
já mencionamos em capítulos anteriores, a cultura maker transpassa barreiras de
áreas e especialidades, sendo acessível a todos que se interessem.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 107
CAPÍTULO 13
O PROTÓTIPO (PARTE 4)
Dando andamento que foi tratado na aula anterior, observe que a variável “audio_capt”
contém agora o texto do que foi dito em letras maiúsculas e, em cima disso, faremos
testes para verificar o que está sendo dito e decidir como o robô irá reagir.
Por exemplo, caso o texto do áudio contenha a palavra “DESLIGAR”, o robô executa
tal ação, se despedindo do humano, registrando o log e encerrando o software:
Que tal após esse teste, se o humano quiser buscar um vídeo no Youtube? Observem
como é simples desempenhar essa busca:
Aqui devemos nos deter por um momento e observar como executamos a busca
no Youtube. Primeiro verificamos se o áudio capturado continha a palavra “Youtube”,
como por exemplo numa frase “Por favor, procure no Youtube John Coltrane”, o código
pegará tudo o que estiver após a palavra “Youtube” e passará na URL do link de busca
do próprio site Youtube.
Junto a isso, o objeto “os” executará a URL como um todo, fazendo com que o
Windows abra o navegador/browser padrão do sistema, carregando a busca desejada.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 108
Obviamente, podem existir diversas formas de realizar a mesma pergunta/busca, e
convidamos o desenvolvedor a construir novas estruturas de teste, prevendo diversas
situações e aprimorando o protótipo.
Notem também que incrementamos a variável “action”, sinalizando dentro da
estrutura do robô que uma ação foi executada.
Outro teste de exemplo que trazemos, é o de abertura do Outlook do Windows
instalado:
Sem maiores complexidades, notamos que o objeto “os”, executa mais um arquivo,
no caso o “Outlook.exe”, que será carregado desde que o Windows do desenvolvedor
possua o mesmo.
Observe que interessante seria abrir diversos outros arquivos que você deseje.
Exerça sua criatividade!
Ainda a título de exemplo, podemos abrir também o Gmail:
Não esqueça de notar que a cada teste, ele altera o valor de “action” para “1”, de
forma que isso possa ser tratado no “loop”.
Vamos executar mais uma ação que pode ser interessante. Suponha que o humano
deseje realizar uma busca no Google, então podemos considerar que a frase contenha
algo assim “Por favor, pesquise/pesquisar sobre elefantes”. O código então, considerará
para busca, todas as palavras após o termo “PESQUIS”:
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 109
Dando seguimento aos testes de conteúdo, imagine que o humano questione algo
relacionado ao clima/tempo:
Neste exemplo, abrimos o site do IPMet da UNESP, onde o navegador exibirá
as condições de clima. Reforçamos novamente que trata-se de um exemplo, e o
programador pode e deve refinar, como por exemplo, fazer o robô “ler” as informações
do tempo e não somente exibi-las. Fica a dica!
A partir de agora, finalizamos o bloco de testes e na sequência testamos o código
fonte em funcionamento dentro do nosso ambiente.
Observe que interessante, se não passou em nenhum dos testes de ação anterior, a
variável “action” estará com valor zero, o que fará o objeto “bot” processar uma resposta
com recursos de I.A para responder o que foi dito pelo ser humano, considerando o
vocabulário que foi inserido no início do código na variável “chats”.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 110
Observe que após a execução do bloco de testes (if), incrementamos o contador “n”
e “zeramos” a variável “action”, fazendo com que o loop reinicie, dando continuidade
na “simulação” do robô.
Abaixo, exibimos o código desenvolvido até o momento, em sua íntegra, para que
o aluno possa conferir antes de realizarmos testes de execução:
### todas as libs necessarias em ordem,
### os prints dos imports podem ser removidos, servem apenas
para verificar o tempo de carga
### os beeps servem de alerta e também são opcionais
### o código preza pela simplicidade para ser acessível a
todos os públicos
import sys #recursos sistema
import os #recursos sistema operacional
import numpy as np #cientifica matematica
import winsound ##recursos windows de som, para avisar os
processos em andamento (carga, escuta, resposta)
from datetime import datetime #recursos de data
#automacao de telas/processos windows (trabalha na camada de
mensagens do sistema operacional)
from pywinauto.application import Application
import string #texto
winsound.Beep(2200, 30)
print(“\n> Importando recursos de fala.........: “ +
str(datetime.now()))
import pyttsx3 as fala #conversao de texto pra audio
winsound.Beep(2200, 30)
print(“> Importando recursos de recognição...: “ + str(datetime.
now()))
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 111
import speech_recognition as sr #reconhecimento de fala com
i.a
winsound.Beep(2200, 30)
print(“> Importando recursos de conversação..: “ + str(datetime.
now()))
from chatterbot import ChatBot #recursos de chatbot com i.a
from chatterbot.trainers import ListTrainer
from chatterbot.trainers import ChatterBotCorpusTrainer
winsound.Beep(2200, 30)
print(“> Importando recursos de visão comput.: “ + str(datetime.
now()))
import cv2 #visao computacional
winsound.Beep(2200, 30)
####
rec = sr.Recognizer() #tratamento do reconhecimento de fala
###
###tratamento da robo
##bot = ChatBot(‘ISIS’) #inicia o Bot no ambiente
bot = ChatBot(‘ISIS’,
storage_adapter=’chatterbot.storage.SQLStorageAdapter’,
logic_adapters=[
‘chatterbot.logic.MathematicalEvaluation’,
#’chatterbot.logic.TimeLogicAdapter’,
‘chatterbot.logic.BestMatch’,
],
#filters=[filters.get_recent_repeated_responses]
database_uri=’sqlite:///database.db’
)
###
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 112
winsound.Beep(2200, 30)
#carga inicial de vocabulario, aqui deve-se incluir aquele
que for mais apropriado para necessidade
#pode ser arquivos com frases ou direcionado pra ações
especificas
chats = [‘Como vai?’, ‘Tudo legal’,’Voce pode me ajudar?’,
‘Claro que posso! Diga?’, ‘Voce Conhece ÍSIS?’, ‘Ouvi dizer
que esse software eh muito bom!’, ‘Radio’, ‘Noticias sao
importantes’, ‘Qual seu nome?’, ‘Me chamo ÍSIS muito prazer
em conhecer voce’]
chats += [‘Oi!’, ‘Olah Pessoa Humana!’, ‘O dia esta bom’,’Dias
assim sao bons’, ‘Voce sabe sobre muita coisa?’, ‘Posso aprender
se voce me ensinar’, ‘Como voce se chama?’, ‘Me chamam de
ÍSIS.’, ‘Quantos anos voce tem?’, ‘Eu nao tenho idade...’]
chats += [‘Voce gosta?’,’Gosto nao se discute’, ‘Ja ouviu
falar?’, ‘Depende, posso pesquisar...’]
chats += [‘Desligar’, ‘Ja vai? Ateh logo!’, ‘Voce sabe se vai
chover amanha?’, ‘Vamos ver o clima...’]
chats += [‘Entender’, ‘Sempre refletindo’, ‘Bom dia’, ‘Olah
ser humano! Tenha um bom dia.’]
chats += [‘Orientador UNESP?’, ‘Professor Dorival’]
#manda a robo treinar com o vocabulario inicial
print(“> Iniciando vocabulário neural........: “ + str(datetime.
now()))
# treinamento do bot
trainer = ListTrainer(bot)
trainer.train(chats)
###exemplos de treinos alternativos
#trainer = ChatterBotCorpusTrainer(ChatBot)
#trainer.train(chats)#trainer.train(“chatterbot.corpus.english”) portuguese
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 113
#bot.set_trainer(ListTrainer)
#bot.train(chats) #executa o treino com o vocabulario fornecido
##
#tratamento de voz
voz = fala.init(‘sapi5’)
ids = voz.getProperty(‘voices’) #vozes disponiveis
rate = voz.getProperty(‘rate’) #velocidade
print(“> Velocidade de fala..................: “ + str(rate))
voz.setProperty(‘rate’, rate + 75) #ajusta velocidade da voz,
buscando algo mais ‘natural’ +20
volume = voz.getProperty(‘volume’)
print(“> Volume de voz.......................: “ + str(volume))
voz.setProperty(‘volume’, 5.0) #ajusta o volume maximo
###
#Loop ‘robótico’
#inicia captura de audio
def main():
### vars iniciais
n = 0 #contador
dtnas = “2020-03-03 13:33:00.000000” # dt de ‘nascimento’
action = 0 #define ação
with sr.Microphone() as s:
#limpa ruido
rec.adjust_for_ambient_noise (s)
#loop de dialogo
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 114
while True:
rec.adjust_for_ambient_noise(s)
if (n == 0):
print(“\n\n||||| INICIANDO ÍSIS - PROTÓTIPO
COMPUTACIONAL MAKER ||||| ... [modo log] ...\n\n”)
voz.say(“Oi Eu sou a PROTÓTIPO ÍSIS, como
posso ajudar?”)
voz.runAndWait()
##estrutura de segurança do bloco de execução,
tratando exceções
try:
time = datetime.now()
print(‘ouvindo......: ‘ + str(time))
winsound.Beep(2200, 30)
#captura o audio
rec.adjust_for_ambient_noise(s)
audio = rec.listen(s)
time = time.now()
print(‘processando..: ‘ + str(time))
winsound.Beep(1000, 30)
#processa via google open
#call api para idioma pt-br/en
#existem outras formas e calls, pode-se alterar
caso necessário
#exemplo:
#lib sphinx para off-line, em pt-br ainda em
testes/desenvolvimento
#audio_capt = rec.recognize_sphinx (audio)
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 115
audio_capt = rec.recognize_google(audio,
language=’pt’)
time = datetime.now()
print(‘respondendo..: ‘ + str(time) + ‘\n’)
except sr.UnknownValueError:
voz.say(“Desculpe. Eu nao consegui compreender...”)
voz.runAndWait()
n += 1
continue
except sr.RequestError as e:
voz.say(“Desculpe. Mas estamos sem conexao no
momento...”)
voz.runAndWait()
n += 1
continue
except (KeyboardInterrupt, EOFError, SystemExit):
voz.say(“Desculpe. Identifiquei um desligamento
inesperado.”)
voz.runAndWait()
print(“\n\n||||| DESLIGANDO ÍSIS - PROTÓTIPO
COMPUTACIONAL MAKER ||||| \n||||| Andre Medeiros “)
exit()
#imprime o que foi dito
print (“Ser humano diz ... -> “ + audio_capt +
“\n”)
#upper pra facilitar os ifs
audio_capt = audio_capt.upper()
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 116
###
###tratamento de ações executadas pelo protótipo,
pode-se incluir quantas desejar
###
#verifica o que foi dito e executa ação em WINDOWS
(você pode definir palavras chaves pra suas próprias ações e
também outros sistemas operacionais)
if (audio_capt.find(‘DESLIGAR’) >= 0):
print(“\n\n||||| DESLIGANDO ÍSIS - PROTÓTIPO
COMPUTACIONAL MAKER ||||| \n||||| Andre Medeiros “) # + str(n)+
“\n”)
voz.say(“Desligando...”)
voz.runAndWait()
#fim dialogo
exit()
if (audio_capt.find(‘YOUTUBE’) >= 0):
busca = audio_capt[audio_capt.find(‘YOUTUBE’)+8:]
print (“\nAção executada: Procurando videos
com o tema... “ + busca + “\n”)
#abre o caminho/path
os.startfile(“https://www.youtube.com/
results?search_query=” + busca)
action = 1
if (audio_capt.find(‘OUTLOOK’) >= 0):
print (“\nAção executada: Abrindo e-mail...\n”)
os.startfile(“Outlook.exe”)
action = 1
if (audio_capt.find(‘GMAIL’) >= 0):
print (“\nAção executada: Abrindo Gmail...\n”)
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 117
os.startfile(“http://gmail.com”)
action = 1
if (audio_capt.find(‘CBN’) >= 0):
print (“\nAção executada: Abrindo radio on-
line...\n”)
os.startfile(“http://cbn.globoradio.globo.com/
servicos/estudio-ao-vivo/ESTUDIO-AO-VIVO.htm?praca=SP”)
action = 1
if (audio_capt.find(‘PESQUIS’) >= 0):
busca = audio_capt[audio_capt.find(‘PESQUIS’)
+ 9:]
print (“\nAção executada: Pesquisando no Google
sobre... “ + busca + “\n”)
#abre o caminho invocando o browser padrao
os.startfile(“https://www.google.com.br/
search?hl=pt-BR&q=” + busca)
action = 1
if (audio_capt.find(‘TEMPO’) >= 0) or (audio_capt.
find(‘CLIMA’) >= 0):
print (“\nAção executada: Verificando as
condições climáticas...\n” )
#abre o caminho invocando o browser padrao
os.startfile(“https://www.ipmetradar.com.
br/”)
action = 1
if action == 0: # se nao for uma ação ela processa
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 118
uma resposta
#a robo responde (processo array com palavras
já treinadas e ouvidas) - para reiniciar vocabulário, basta
apagar arquivo dbsqlite
resposta = bot.get_response(audio_capt)
print (“ISIS responde ... -> “ + str(resposta)
+ “\n”)
voz.say(resposta)
voz.runAndWait()
n += 1 #contador
action = 0 #verifica acoes executadas
if __name__ == “__main__”:
main()
Observe atentamente cada linha do código acima e repasse com o que foi visto
nas aulas anteriores a esta.
Confira com cuidado o seu código com o acima e, se necessário, faça correções,
pois na próxima aula iremos realizar alguns testes de execuções.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 119
CAPÍTULO 14
O PROTÓTIPO (PARTE 5)
Após conferência detalhada do código, vamos para o Anaconda Prompt e iniciar
o ambiente:
Com o ambiente ativado, podemos dar o comando no código:
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 120
Se tudo correr bem, poderá ser notado a carga de cada uma das bibliotecas/pacotes
que importamos no inicio do código, além disso, poderá se ouvir o protótipo dizendo
“Oi Eu sou a PROTÓTIPO ÍSIS, como posso ajudar?”
O desenvolvedorpoderá interagir através de fala, pedindo ações ao protótipo,
conforme àquelas que programamos nas aulas anteriores ou apenas conversando
livremente para verificar se o vocabulário treinado responde corretamente.
Abaixo alguns exemplos de interação com o protótipo. Lembrando que estamos
rodando o software parcial, por isso o nome “isis-teste.py” e o ambiente “isis2”, mas
o estudante tem liberdade para usar os nomes que lhe forem mais convenientes:
Observem com detalhes o tempo de carga de cada pacote, na sequência note o
tempo que o protótipo ficou “ouvindo” e depois o tempo para processar o que foi dito.
No exemplo acima, o humano pede que o protótipo efetue um cálculo básico de
soma, o qual é respondido e na sequência o humano pede para “desligar”, fazendo
com que o protótipo encerre a operação.
No intuito de testar as possibilidades que já programamos nas aulas anteriores,
vamos agora pedir para que o protótipo realize buscas:
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 121
Observe que o protótipo identificou que era uma “ação” solicitada e efetuou a
mesma, no caso uma busca no Google sobre o termo mencionado pelo ser humano,
na sequência ele abre o navegador padrão do dispositivo com a busca que foi realizada.
Notem que a cada interação com o humano, o protótipo já volta a ficar “ouvindo”,
aguardando mais instruções ou para responder o diálogo.
Outro ponto importante de se observar é se as palavras identificadas pelo protótipo
estão corretas ou se possuem algum erro, pois isso significa que devemos refinar o
vocabulário do mesmo ou ainda buscar novas formas de processamento.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 122
Ainda testando os recursos iniciais que codificamos no protótipo, perguntamos o
nome do robô e depois pedimos para ele verificar o clima, o qual abre o navegador
com o site de meteorologia:
Temos codificado também a pesquisa no Youtube. Observemos:
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 123
Nosso protótipo pode ficar indefinidamente ouvindo e processando ações ou
respostas. Basta pedir “desligar” que ele encerrará ou caso necessite encerrá-lo
forçadamente, apenas pressione Ctrl+C.
Dando andamento na codificação e incrementando os recursos, vamos agora inserir
a digitação de textos mediante o que for dito pelo ser humano. Dentro na estrutura de
“ifs”, adicione o código abaixo, onde usaremos o objeto “Application” que foi importado
logo no início do nosso código. Observe:
Note que instanciamos “app” com “Application” abrindo o “notepad.exe” (bloco de
notas), na sequência simulamos a digitação com “type_keys”, passando o texto que
foi dito pelo ser humano.
Ao executar teremos o seguinte resultado:
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 124
Nesse ponto temos o “esqueleto” do protótipo pronto. Lembramos que deve-se
usar a criatividade para adicionar recursos ao mesmo, criando novas funcionalidades,
incluindo outras tecnologias, interfaces, enfim: Use sua imaginação! Seja maker!
Nessa linha de criatividade e inovação, para te estimular, vamos exemplificar uma
função de visão computacional com os objetos da biblioteca OpenCV.
Conhecendo melhor a OpenCV
Oficialmente lançado em 1999, o projeto OpenCV foi uma ideia da Intel Research
de melhorar aplicações de uso intensivo de processamento, sendo parte de uma série
de projetos que incluíam Ray tracing e monitores 3D. Os principais contribuidores do
projeto eram da Intel Russia, assim como o time de desempenho de bibliotecas da
Intel. No início do projeto, os objetivos foram definidos como:
1) Avançar a pesquisa em visão computacional por prover não apenas código
aberto mas otimizado para tarefas básicas de visão, de modo que o código
pudesse ser prontamente lido e transferível.
2) Avançar aplicações baseadas em visão computacional por fazer código portátil e
otimizado disponível de graça, com uma licença que não requer que a aplicação
seja de código aberto.
Abaixo, alguns exemplos de áreas de aplicação:
• Humano-Computador Interface (HCI)
• Identificação de objetos
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 125
• Sistema de reconhecimento facial
• Reconhecimento de movimentos
• Gravação de vídeos
• Robôs móveis
• Reconstrução 3D
• Realidade virtual
• Realidade aumentada
• Realidade mista
Como podemos notar pelo descritivo da OpenCV, temos aqui recursos bastante
avançados, porém trazemos um exemplo interessante para incluir em nosso protótipo.
Teremos um grau de complexidade maior nesta parte devido a compreensão de
como se tratam informações relacionadas a imagens capturadas em tempo real.
Criaremos uma função chamada “cv” (computer vision):
Após instanciar o objeto “captura” com o conteúdo da captura real de video pela
câmera disponível no dispositivo, iniciamos um “loop” onde lemos a imagem e também
convertemos seu formato de RGB para HSV, o que permite que trabalhemos com as
informações que a imagem contém.
Definimos agora a cor que queremos, no caso verde, dentro da sua faixa:
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 126
Lembrando que você pode trocar a cor e até expandir esse recurso.
Continuando, passamos essas faixas de cores para “mask” e na sequência encontra
a área da imagem onde se encontra algo com a faixa de cores informada:
Agora, caso “area” tenha um conteúdo válido, pegamos as coordenadas localizadas
para desenhar um retângulo na tela que vai sinalizar a posição do objeto em tempo
real e também escrevemos qual posição é. Observe:
Dando continuidade, fora do “if” exibimos o objeto “imagem”:
Por último, deixamos opções para encerrar a interação com a câmera:
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 127
Nossa função está pronta! Agora iremos na estrutura de “ifs” e adicionaremos a
interpretação do comando de voz para acionar a função que acabamos de desenvolver.
Ao executar novamente nosso código, obteremos o seguinte resultado:
Observe que pode-se calibrar melhor a posição do texto para ficar mais próximo
do objeto detectado.
Na próxima aula, revisaremos o código em sua íntegra.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 128
CAPÍTULO 15
REVISÃO DO CÓDIGO
NA ÍNTEGRA
Nesta aula iremos revisar todo o código linha a linha.
Abaixo considere analisar em detalhes todas as linhas do código que temos, o código
também será disponibilizado em arquivo “.py.”. Observemos os blocos principais abaixo.
1 - Importação de bibliotecas/pacotes:
import sys #recursos sistema
import os #recursos sistema operacional
import numpy as np #cientifica matematica
import winsound ##recursos windows de som, para avisar os
processos em andamento (carga, escuta, resposta)
from datetime import datetime #recursos de data
#automacao de telas/processos windows (trabalha na camada de
mensagens do sistema operacional)
from pywinauto.application import Application
import string #texto
winsound.Beep(2200, 30)
print(“\n> Importando recursos de fala.........: “ +
str(datetime.now()))
import pyttsx3 as fala #conversao de texto pra audio
winsound.Beep(2200, 30)
print(“> Importando recursos de recognição...: “ + str(datetime.
now()))
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 129
import speech_recognition as sr #reconhecimento de fala com
i.a
winsound.Beep(2200, 30)
print(“> Importando recursos de conversação..: “ + str(datetime.
now()))
from chatterbot import ChatBot #recursos de chatbot com i.a
from chatterbot.trainers import ListTrainer
from chatterbot.trainers import ChatterBotCorpusTrainer
winsound.Beep(2200, 30)
print(“> Importando recursos de visão comput.: “ + str(datetime.
now()))
import cv2 #visao computacional
winsound.Beep(2200, 30)
####2 - Tratamento de Fala e Robô:
rec = sr.Recognizer() #tratamento do reconhecimento de fala
###
###tratamento da robo
##bot = ChatBot(‘ISIS’) #inicia o Bot no ambiente
bot = ChatBot(‘ISIS’,
storage_adapter=’chatterbot.storage.SQLStorageAdapter’,
logic_adapters=[
‘chatterbot.logic.MathematicalEvaluation’,
#’chatterbot.logic.TimeLogicAdapter’,
‘chatterbot.logic.BestMatch’,
],
#filters=[filters.get_recent_repeated_responses]
database_uri=’sqlite:///database.db’
)
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 130
###
winsound.Beep(2200, 30)
#carga inicial de vocabulario, aqui deve-se incluir aquele
que for mais apropriado para necessidade
#pode ser arquivos com frases ou direcionado pra ações
especificas
chats = [‘Como vai?’, ‘Tudo legal’,’Voce pode me ajudar?’,
‘Claro que posso! Diga?’, ‘Voce Conhece ÍSIS?’, ‘Ouvi dizer
que esse software eh muito bom!’, ‘Radio’, ‘Noticias sao
importantes’, ‘Qual seu nome?’, ‘Me chamo ÍSIS muito prazer
em conhecer voce’]
chats += [‘Oi!’, ‘Olah Pessoa Humana!’, ‘O dia esta bom’,’Dias
assim sao bons’, ‘Voce sabe sobre muita coisa?’, ‘Posso aprender
se voce me ensinar’, ‘Como voce se chama?’, ‘Me chamam de
ÍSIS.’, ‘Quantos anos voce tem?’, ‘Eu nao tenho idade...’]
chats += [‘Voce gosta?’,’Gosto nao se discute’, ‘Ja ouviu
falar?’, ‘Depende, posso pesquisar...’]
chats += [‘Desligar’, ‘Ja vai? Ateh logo!’, ‘Voce sabe se vai
chover amanha?’, ‘Vamos ver o clima...’]
chats += [‘Entender’, ‘Sempre refletindo’, ‘Bom dia’, ‘Olah
ser humano! Tenha um bom dia.’]
chats += [‘Orientador UNESP?’, ‘Professor Dorival’]
#manda a robo treinar com o vocabulario inicial
print(“> Iniciando vocabulário neural........: “ + str(datetime.
now()))
# treinamento do bot
trainer = ListTrainer(bot)
trainer.train(chats)
###exemplos de treinos alternativos
#trainer = ChatterBotCorpusTrainer(ChatBot)
#trainer.train(chats)
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 131
#trainer.train(“chatterbot.corpus.english”) portuguese
#bot.set_trainer(ListTrainer)
#bot.train(chats) #executa o treino com o vocabulario fornecido
##
#tratamento de voz
voz = fala.init(‘sapi5’)
ids = voz.getProperty(‘voices’) #vozes disponiveis
rate = voz.getProperty(‘rate’) #velocidade
print(“> Velocidade de fala..................: “ + str(rate))
voz.setProperty(‘rate’, rate + 75) #ajusta velocidade da voz,
buscando algo mais ‘natural’ +20
volume = voz.getProperty(‘volume’)
print(“> Volume de voz.......................: “ + str(volume))
voz.setProperty(‘volume’, 5.0) #ajusta o volume maximo
###
3 - Função de Visão Computacional:
###funcao de visao computacional simples para detecção de
objetos cor verde,
###também pode-se alterar para a necessidade em especifico
def cv():
#Iniciamos camera
captura = cv2.VideoCapture(0)
while(1):
#Captura img em RGB -> HSV
_, imagem = captura.read()
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 132
hsv = cv2.cvtColor(imagem, cv2.COLOR_BGR2HSV)
#Faixa de cores desejadas
verde_baixos = np.array([49, 50, 50], dtype=np.uint8)
#49 50 50
verde_altos = np.array([80, 255, 255], dtype=np.
uint8) # 80 255 255
#mascara com essa faixa de cores
mask = cv2.inRange(hsv, verde_baixos, verde_altos)
#encontrar a area onde o objeto esta
moments = cv2.moments(mask)
area = moments[‘m00’]
if(area > 200000):
#centro do objeto detectado
x = int(moments[‘m10’]/moments[‘m00’])
y = int(moments[‘m01’]/moments[‘m00’])
#Mostramos coordenadas
#print (“x = “, x)
#print (“y = “, y)
#retangulo de detecção
cv2.rectangle(imagem, (x-5, y-5), (x+5,
y+5),(0,0,255), 2)
cv2.putText(imagem, “pos x,y:”+ str(x)+”,”+str(y),
(x+10,y+10), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 1)
#cv2.FONT_HERSHEY_SIMPLEX
#mascara x original
##cv2.imshow(‘mask’, mask)
cv2.imshow(‘Câmera Atual do Dispositivo’, imagem)
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 133
#tecla = cv2.waitKey(5) & 0xFF = shutdown
if cv2.waitKey(1) & 0xFF == ord(‘q’):
captura.release()
break
#libera janela
cv2.destroyAllWindows()
###----
2 - Tratamento de Fala e Robô:
#Loop ‘robótico’
#inicia captura de audio
def main():
### vars iniciais
n = 0 #contador
dtnas = “2020-03-03 13:33:00.000000” # dt de ‘nascimento’
action = 0 #define ação
with sr.Microphone() as s:
#limpa ruido
rec.adjust_for_ambient_noise (s)
#loop de dialogo
while True:
rec.adjust_for_ambient_noise(s)
if (n == 0):
print(“\n\n||||| INICIANDO ÍSIS - PROTÓTIPO
COMPUTACIONAL MAKER ||||| ... [modo log] ...\n\n”)
voz.say(“Oi Eu sou a PROTÓTIPO ÍSIS, como
posso ajudar?”)
voz.runAndWait()
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 134
##estrutura de segurança do bloco de execução,
tratando exceções
try:
time = datetime.now()
print(‘ouvindo......: ‘ + str(time))
winsound.Beep(2200, 30)
#captura o audio
rec.adjust_for_ambient_noise(s)
audio = rec.listen(s)
time = time.now()
print(‘processando..: ‘ + str(time))
winsound.Beep(1000, 30)
#processa via google open
#call api para idioma pt-br/en
#existem outras formas e calls, pode-se alterar
caso necessário
#exemplo:
#lib sphinx para off-line, em pt-br ainda em
testes/desenvolvimento
#audio_capt = rec.recognize_sphinx (audio)
audio_capt = rec.recognize_google(audio,
language=’pt’)
time = datetime.now()
print(‘respondendo..: ‘ + str(time) + ‘\n’)
except sr.UnknownValueError:
voz.say(“Desculpe. Eu nao consegui compreender...”)
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 135
voz.runAndWait()
n += 1
continue
except sr.RequestError as e:
voz.say(“Desculpe. Mas estamos sem conexao no
momento...”)
voz.runAndWait()
n += 1
continue
except (KeyboardInterrupt, EOFError, SystemExit):
voz.say(“Desculpe. Identifiquei um desligamento
inesperado.”)
voz.runAndWait()
print(“\n\n||||| DESLIGANDO ÍSIS - PROTÓTIPO
COMPUTACIONAL MAKER ||||| \n||||| Andre Medeiros “)
exit()
#imprime o que foi dito
print (“Ser humano diz ... -> “ + audio_capt +
“\n”)
#upper pra facilitar os ifs
audio_capt = audio_capt.upper()
###
###tratamento de ações executadas pelo protótipo,
pode-se incluir quantas desejar
###
#verifica o que foi dito e executa ação em WINDOWS
(você pode definir palavras chaves pra suas próprias ações e
também outros sistemas operacionais)
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 136
if (audio_capt.find(‘DESLIGAR’) >= 0):
print(“\n\n||||| DESLIGANDO ÍSIS - PROTÓTIPO
COMPUTACIONAL MAKER ||||| \n||||| Andre Medeiros“) # + str(n)+
“\n”)
voz.say(“Desligando...”)
voz.runAndWait()
#fim dialogo
exit()
if (audio_capt.find(‘YOUTUBE’) >= 0):
busca = audio_capt[audio_capt.find(‘YOUTUBE’)+8:]
print (“\nAção executada: Procurando videos
com o tema... “ + busca + “\n”)
#abre o caminho/path
os.startfile(“https://www.youtube.com/
results?search_query=” + busca)
action = 1
if (audio_capt.find(‘OUTLOOK’) >= 0):
print (“\nAção executada: Abrindo e-mail...\n”)
os.startfile(“Outlook.exe”)
action = 1
if (audio_capt.find(‘GMAIL’) >= 0):
print (“\nAção executada: Abrindo Gmail...\n”)
os.startfile(“http://gmail.com”)
action = 1
if (audio_capt.find(‘CBN’) >= 0):
print (“\nAção executada: Abrindo radio on-
line...\n”)
os.startfile(“http://cbn.globoradio.globo.com/
servicos/estudio-ao-vivo/ESTUDIO-AO-VIVO.htm?praca=SP”)
action = 1
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 137
if (audio_capt.find(‘PESQUIS’) >= 0):
busca = audio_capt[audio_capt.find(‘PESQUIS’)
+ 9:]
print (“\nAção executada: Pesquisando no Google
sobre... “ + busca + “\n”)
#abre o caminho invocando o browser padrao
os.startfile(“https://www.google.com.br/
search?hl=pt-BR&q=” + busca)
action = 1
if (audio_capt.find(‘TEMPO’) >= 0) or (audio_capt.
find(‘CLIMA’) >= 0):
print (“\nAção executada: Verificando as
condições climáticas...\n” )
#abre o caminho invocando o browser padrao
os.startfile(“https://www.ipmetradar.com.
br/”)
action = 1
if (audio_capt.find(‘ATIVAR CAMERA’) >= 0) or (audio_
capt.find(‘ATIVAR CÂMERA’) >= 0) or (audio_capt.find(‘ATIVAR A
CÂMERA’) >= 0):
voz.say(“Ativando câmera para identificar
objetos”)
voz.runAndWait()
###inicia camera
cv()
action = 1
if (audio_capt.find(‘DIGITE’) >= 0):
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 138
repetir = audio_capt[audio_capt.find(‘DIGITE’)+6:]
print (“\nAção executada: Repetindo a frase
...” + repetir + “\n” )
### TESTE - automação com pywinauto - escrever
o que foi dito pelo humano num arquivo .txt
app = Application().start(“notepad.exe”)
# ‘digita’ o texto capturado pelo audio
app.UntitledNotepad.Edit.type_keys(repetir,
with_spaces = True)
###------
action = 1
if action == 0: # se nao for uma ação ela processa
uma resposta
#a robo responde (processo array com palavras
já treinadas e ouvidas) - para reiniciar vocabulário, basta
apagar arquivo dbsqlite
resposta = bot.get_response(audio_capt)
print (“ISIS responde ... -> “ + str(resposta)
+ “\n”)
voz.say(resposta)
voz.runAndWait()
n += 1 #contador
action = 0 #verifica acoes executadas
if __name__ == “__main__”:
main()
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 139
15.1 Considerações finais
Ao longo da disciplina conhecemos muitos conceitos, e até mesmo filosofia, que
pudemos colocar em prática utilizando as tecnologias mais recentes em programação.
Além disso, fica o forte incentivo que o aluno empreenda suas próprias modificações
e criações, que utilize em seu ambiente de trabalho, desenvolva soluções para sua casa,
abre seu próprio negócio, enfim, temos muitas oportunidades no momento presente
e com conhecimento e dedicação podemos alcançar nossos objetivos e melhorar o
mundo ao nosso redor.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 140
CONCLUSÃO
Conclui-se que é viável empreender esforços em reunir os recursos tecnológicos
contemporâneos de inteligência artificial e o movimento maker, colocando em prática
desde o desenho, a pesquisa necessária, desenvolvimento de códigos, execução, testes,
até a correção de erros, algumas vezes ainda não documentados.
Isso habilita o profissional e/ou pesquisador a ampliar seu instrumental de
conhecimento, além de incentivar que toda a comunidade, seja científica ou corporativa,
engaje-se nesse tipo de pensamento, nessas metodologias e tecnologias, trazendo
inúmeros outros benefícios para um conjunto maior da sociedade.
Notadamente os avanços nessa linha de pesquisa continuarão a passos largos,
cabendo ao profissional da área manter-se sempre atualizado e que seus produtos
possam possibilitar que outras pessoas o modifiquem, adaptem e até mesmo gerem
negócios a partir dessas tecnologias open source com o pensamento maker em paralelo,
construindo soluções cada vez mais elaboradas.
Pessoas, profissionais, pesquisadores e quem mais desejar poderá munir-se das
ferramentas, ambientes e colaboradores necessários e empreender o que mais desejar.
Soma-se a isso a perspectiva de que novas e mais aprofundadas pesquisas poderão
ser feitas a partir da ideia colocada em prática nesta disciplina, evoluindo gradativamente
o protótipo e que poderão ser desenvolvidas em continuidade na pós-graduação ou
em experimentos reais no dia-a-dia do profissional.
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 141
REFERÊNCIAS
ALBINO, J. P. Uma Abordagem para Criação de Valor em Dados Abertos para
Pequenas e Médias Empresas Utilizando o Ecossistema R. III Encontro Internacional
de Dados, Tecnologia e Informação. 2016.
ANDERSON, Chris. MAKERS. The New Industrial Revolution. USA: Crown Business.
2012.
BELLUZZO, Regina C. B. Competências na era digital: desafios tangíveis para
bibliotecários e educadores. ETD – Educação Temática Digital. Disponível em: <https://
periodicos.sbu.unicamp.br/ojs/index.php/etd/article/view/772>. Acesso em: 28 mai.
2019.
CANALTECH. O que é Open Source. Disponível em: <https://canaltech.com.br/
produtos/O-que-e-open-source/#:~:text=Open%20source%20%C3%A9%20um%20
termo,ponto%20de%20vista%20essencialmente%20t%C3%A9cnico>. Acesso em: 24
out. 2020.
GLEICK, James. A informação: uma história, uma teoria, uma enxurrada. Editora
Companhia das Letras, 2013.
LABAKI, Josue. Introdução ao Python - Modulo A, Grupo Python, UNESP-Ilha Solteira.
2011.
LAUREANO, E. A. G. C. ConsultBot - um chatterbot consultor para ambientes virtuais
de estudo na Internet. 1999.
LEVY, Pierre. O que é o Virtual? São Paulo: Editora 34,1996.
LEONHARDT, M. D. et al. Um Chatterbot para uso em ambiente educacional. II
Ciclo de Palestras sobre Novas Tecnologias na Educaçao, 2003.
LYRA, J. G. M., MEIRIÑO, M. BITCOIN E BLOCKCHAIN: Aplicações além da
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 142
moeda virtual. Fórum Inovação e propriedade intelectual. Disponível em: <https://
azepdf.com/bitcoin-e-blockchain-blockchainbrasilorg.html>. Acesso em: 1 mar. 2019.
MANOVICH, Lev. Novas mídias como tecnologia e ideia: dez definições. O chip e o
caleidoscópio: reflexões sobre as novas mídias. São Paulo: Editora SENAC, p. 24-50,
2005.
MEDEIROS, A.R. Bitcoin e Blockchain: minerando ideias e construindo conceitos.
In: ROSSI,Dorival; GONÇALVES, Juliana; MOON, Rodrigo (Org.). Movimento Maker e
Fab Labs: design, inovação e tecnologia em tempo real. Bauru: UNESP. FAAC, 2019.
MEDEIROS, A.R. Movimento Maker e Inteligência Artificial: desenvolvimento de
um protótipo reprodutível e aplicável. Disponível em: <https://repositorio.unesp.br/
handle/11449/204236>. Bauru: UNESP. FAAC, 2021. Acesso em: 20 abril 2021.
MEDEIROS, Richerland. Inferência de emoções em textos curtos. Disponível em:
< http://hdl.handle.net/11449/150974>. Acesso em: 5 mar. 2020.
Site Migalhas. IA e mercado de trabalho: Uma análise à luz da estratégia brasileira de
inteligência artificial. Disponível em: <https://www.migalhas.com.br/depeso/344266/
ia-e-mercado-de-trabalho-estrategia-de-inteligencia-artificial>. Acesso em: 5 fev. 2022
NAKAMOTO, Satoshi. Bitcoin: A peer-to-peer electronic cash system. Disponível
em: <https://bitcoin.org/bitcoin.pdf>. Acesso em: 28 out. 2020.
NEVES, André; BARROS, Flávia. iAIML: um mecanismo para o tratamento de intenção
em Chatterbots. 2005. Tese (Doutorado). Programa de Pós-Graduação em Ciência da
Computação, Universidade Federal de Pernambuco, Recife, 2005.
PEREIRA, Luís Moniz. Inteligência Artificial: mito e ciência. Revista Colóquio-Ciências,
v. 3, p. 1-13, 1988.
ROSSI, Dorival et.al. Sagui Lab: Um experimento educacional híbrido. In: Ensaios
em design, ações inovadoras. Bauru: Editora Canal 6, 2016.
ROTHERMEL, Alessandra; DOMINGUES, Maria José Carvalho. MARIA: Um chatterbot
desenvolvido para os estudantes da disciplina “Métodos e Técnicas de Pesquisa em
PROGRAMAÇÃO III
PROF. ANDRÉ RODRIGUES DE MEDEIROS
FACULDADE CATÓLICA PAULISTA | 143
Administração”. SEGET-SIMPÓSIO DE EXCELÊNCIA EM GESTÃO E TECNOLOGIA,
Resende, 2007.
RUSSELL, Stuart; NORVIG, Peter. Intelligent agents. Artificial intelligence: A modern
approach, v. 74, p. 46-47, 1995.
SGANDERLA, Rachele Bianchi; FERRARI, Débora Nice; GEYER, Cláudio FR. BonoBOT:
Um Chatterbot para Interação com Usuários em um Sistema Tutor Inteligente. In:
Brazilian Symposium on Computers in Education (Simpósio Brasileiro de Informática
na Educação-SBIE). 2003. p. 435-444.
TEIXEIRA, João. O que é inteligência artificial. E-Galáxia, 2019.
TEIXEIRA, Sérgio et al. Chatterbots em ambientes de aprendizagem – uma proposta
para a construção de bases de conhecimento. In: Anais do Workshop de Informática
na Escola. 2005.
TOTVS, site oficial. O que é Inteligência artificial? Como funciona,
exemplos e aplicações. Disponível em: <https://www.totvs.com/blog/
inovacoes/o-que-e- intel igencia-art if icial/>. Acesso em: 20 out. 2021.
ULRICH, Beck. O que é globalização. São Paulo: Editora Paz Terra, 1999.
Universidade Federal Fluminense. Tutorial de Introdução ao Python. Rio de Janeiro,
2011.
WHITBY, Blay. The turing test: AI’s biggest blind alley?’. Machines and thought: The
legacy of Alan Turing, v. 1, p. 53-62, 1996.
_heading=h.3znysh7
_heading=h.3znysh7
_heading=h.3znysh7
_heading=h.3znysh7
_heading=h.3znysh7
_heading=h.3znysh7
_heading=h.3znysh7
_heading=h.3znysh7
_heading=h.3znysh7
_heading=h.3znysh7
_heading=h.cgmjjkx0n5lj
_heading=h.3znysh7
_heading=h.fr7sbiridres
_heading=h.3znysh7
_heading=h.3znysh7
_heading=h.3znysh7
_heading=h.tyjcwt
_heading=h.458v2cei3zt1
_heading=h.3znysh7
_heading=h.zf04k8t8rx1i
_heading=h.3znysh7
_heading=h.3znysh7
_heading=h.3znysh7
_heading=h.p1gin8ehocu3
_heading=h.2et92p0
_heading=h.x2570jf9isjk
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.vebywgthn3u3
_heading=h.lgjkjp1peos
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.omjxfonk0dm0
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.fqx74agqcnwx
_heading=h.2et92p0
_heading=h.2et92p0
_heading=h.35nkun2
_heading=h.35nkun2
_heading=h.35nkun2
_heading=h.8q196allt5bv
_heading=h.9pvusuw3moo0
_heading=h.35nkun2
_heading=h.35nkun2
_heading=h.35nkun2
_heading=h.35nkun2
_heading=h.35nkun2
_heading=h.hcwdqno544ya
_heading=h.rcxzt57kr38l
_heading=h.69q1xs6ex509
_heading=h.jiio41fww16v
_heading=h.o4ujjezdzxhs
_heading=h.35o6qxyv4ice
_heading=h.z2nn1yxm8hbv
_heading=h.f7rsj8q9z3c5
_heading=h.6bmm5mz3ia5n
_heading=h.lwzbizkwxkdu
_heading=h.su1hq1sgejgm
_heading=h.35nkun2
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.4qe9he88bmhk
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.n73i13qhy9qu
_heading=h.fsbul5qhr0zx
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.95hajur0xfsq
_heading=h.pehxij501o4a
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.ylt10bx1m99g
_heading=h.j8hf7rjkc9mj
_heading=h.syur6wpxuh9t
_heading=h.yabphgb06q8s
_heading=h.llou8hi5psim
_heading=h.1h6v2we9yghb
_heading=h.mg38091lp7az
_heading=h.qg2xtbom1q4r
_heading=h.s3l6l9wst4zh
_heading=h.tesii59lbngw
_heading=h.78qtbulhz85c
_heading=h.czdbqjdi41u5
_heading=h.xe3rf84le9p
_heading=h.oh5ewrjr7eyy
_heading=h.mur9vmedsntu
_heading=h.lxg6x1lxy107
_heading=h.spqh7ao487pp
_heading=h.gr5003hm0w2j
_heading=h.77vjhm1pad7
_heading=h.96tr1qwurzhb
_heading=h.p6gy83cfcvzm
_heading=h.uvjz9sj4pxxl
_heading=h.lw1nkinye9mz
_heading=h.iiu86kyx4aht
_heading=h.ql58xyincgh7
_heading=h.pdz6xi8s569n
_heading=h.9zze1q4s6xys
_heading=h.72lon4vo9e6a
_heading=h.hpcmpdjoalsx
_heading=h.4ooolnium7z0
_heading=h.vu3nkrmvlooh
_heading=h.q3edglt4uzaq
_heading=h.d0a3qj4rpzkl
_heading=h.bgs6t1lha61f
_heading=h.unbcvdtl46lv
_heading=h.1bfeocn4dkkm
_heading=h.tjvpk2orl262
_heading=h.g7qgy3ddfyot
_heading=h.ek2810a12aws
_heading=h.d7j487rvmn1f
_heading=h.4ti1nxt02shy
_heading=h.6zpjfdzga3fl
_heading=h.g9yh9cw434wg
_heading=h.8qwkxhpu480s
_heading=h.slveoj849jg0
_heading=h.erymrc8z9ts
_heading=h.3kiasqfqjedy
_heading=h.3e8a3ssai942
_heading=h.lthrmevrk1wz
_heading=h.af2uzu7zru7
_heading=h.ly2yz0fh267l
_heading=h.do9sybi9plz6
_heading=h.6fy0ugf4x6k7
_heading=h.x1lkadm10v15
_heading=h.k2nk54feaw6d
_heading=h.4279a36oqk4
_heading=h.nshfg8f7ck7h
_heading=h.swphlauxz8th
_heading=h.dy0htfsos9de
_heading=h.vk6ccx59yigz
_heading=h.g2f1aagr7ty
_heading=h.5ajdbfw32dt
_heading=h.fc9ged6somjq
_heading=h.2ouln91k9fz6
_heading=h.5ly0rsg1txsr
_heading=h.nffwk9rmjmsg
_heading=h.5nj6sfshz3n3
_heading=h.ipn14xyx3b2c
_heading=h.5ujwnjp9u0kx
_heading=h.xnlsqslm794g
_heading=h.u1rld5eewwmr
_heading=h.d1qyije9ax82
_heading=h.l3ki60v5x0xw
_heading=h.6xomq9il145r
_heading=h.mnfmmnfg6hxu
_heading=h.fzdivxhxqpx0
_heading=h.6txggrk3p2rh_heading=h.1acfe8ewvai5
_heading=h.xtflo8od3iao
_heading=h.7i9q2i85hnze
_heading=h.qb3m5lcm53ay
_heading=h.vwkj8a26qa3b
_heading=h.j5kdo8eiizy
_heading=h.ifroprobelvj
_heading=h.4gp9hv9wtcrn
_heading=h.c8t8pzxx0cef
_heading=h.np440u8j2gcu
_heading=h.287y4a90psis
_heading=h.s8i7cyc7vug3
_heading=h.jf370gp6nal0
_heading=h.is9qld1cnoy7
_heading=h.mrq3qqumxav8
_heading=h.98hh0irm45m7
_heading=h.sjgtu85xoydy
_heading=h.j196467mvvsc
_heading=h.uus5j1m4w81
_heading=h.gysq36ayo6yu
_heading=h.tuup4q2fu4l3
_heading=h.nhu4vr7wakm
_heading=h.8j7rnx4q8r4u
_heading=h.dqyrz8s5g98q
_heading=h.fxrjmy9q0hx
_heading=h.6vh996qu2enq
_heading=h.45y4s6qorql4
_heading=h.gpadbyiybaew
_heading=h.k20shixr256j
_heading=h.adqrg12k6yu9
_heading=h.qrx1a9rjo7dr
_heading=h.a6fkeuvq9r1c
_heading=h.c458ki39vcvj
_heading=h.etfkhe6h1dlk
_heading=h.ez6nrzl0w9pj
_heading=h.mtgxz4ihyv3u
_heading=h.u6xvvkoj24kh
_heading=h.78o2dhng9krk
_heading=h.2la2tzb6hzfp
_heading=h.6t6yp7dqdz65
_heading=h.o8v0rpkgmd5d
_heading=h.q6ipv868jboe
_heading=h.8qb5dilf51w8
_heading=h.357df17lzwf4
_heading=h.cdk6chfmnbyn
_heading=h.e7mc5z8vhmrc
_heading=h.zd5se75rj73t
_heading=h.cekseupeuc9h
_heading=h.2610dnmttw2g
_heading=h.quwjeataak11
_heading=h.rsgtxe5kn6g7
_heading=h.mkaj2y1yuhn4
_heading=h.cutw6mx1kkd
_heading=h.wnfpbd60sgws
_heading=h.lqvwg4gtjmok
_heading=h.ladqg4n2cu1v
_heading=h.gvhxr2xz10st
_heading=h.t2dl3ghnv24g
_heading=h.t7h9us3j7avy
_heading=h.psg9e4zgpryv
_heading=h.r9phayscnfdn
_heading=h.q1z017d2phz9
_heading=h.xo9mj3jbjwi2
_heading=h.b06fse34d6t8
_heading=h.lxr8fpbpwn90
_heading=h.rt5j6ij9o48o
_heading=h.byscb0evallk
_heading=h.p0ljhtcldwde
_heading=h.lwte4irsjwii
_heading=h.eywa5iueqart
_heading=h.7b1cykm0k9a8
_heading=h.ptxemg2cnhhi
_heading=h.aqq4zjycxz2w
_heading=h.ocwwgdql6h78
_heading=h.h1288ind7swu
_heading=h.ig0idq1q60k3
_heading=h.dvjvlgo40fch
_heading=h.r5691ubijrk9
_heading=h.ynxlwx22o4b5
_heading=h.y89pw9sld0sj
_heading=h.3qrd6id376db
_heading=h.idl7rsnzbqww
_heading=h.y6vzwmqyz5ym
_heading=h.xieobhtd68if
_heading=h.zh5i852r4w93
_heading=h.yrue6m4x75pu
_heading=h.jz5ekukfapty
_heading=h.u6bul9lo2o4v
_heading=h.7n271mcxfez0
_heading=h.621q1lxu8fen
_heading=h.gwuqyhw16zo7
_heading=h.wo2xqg6geqqt
_heading=h.ucgwr3voaby
_heading=h.3xeqzzp455mh
_heading=h.mhjpsjn861fy
_heading=h.lihhhijbvt8o
_heading=h.auzu9yr7jq0u
_heading=h.4gngfmbtuy8e
_heading=h.j1k1icxwmq3s
_heading=h.vwts5fnzwu2m
_heading=h.27wkrhwrn64u
_heading=h.lfnx7iz4bbnb
_heading=h.2fsf8uuscy43
_heading=h.60dzuneyptlq
_heading=h.e9xxtuj0okt1
_heading=h.p746iqoy1zwr
_heading=h.oh9wxaic26ma
_heading=h.21ten6vmcqgc
_heading=h.xl8ru7irk6dp
_heading=h.97gcxbn4yv38
_heading=h.bguo2grqkavg
_heading=h.puyg6v8ymsad
_heading=h.1wjxkfv7wrok
_heading=h.p9d7nmyi2bdy
_heading=h.4dlzbdgjyexl
_heading=h.5lpgxco461z
_heading=h.zgwb99qpkx6
_heading=h.9ypihxbvk9ek
_heading=h.oglud61l8yn6
_heading=h.mmzhhc29yrec
_heading=h.ndufqbtizwjf
_heading=h.xehw44lmbtpt
_heading=h.mpx66oem24ta
_heading=h.vnfat2c1bwic
_heading=h.ponck37zi69y
_heading=h.tqc6xatn8ucq
_heading=h.nszvu85f1vpk
_heading=h.nz2gl4n4m4zg
_heading=h.3je3pnmmx0ge
_heading=h.ig1ahyb9x2as
_heading=h.vgeiy7yr1jh7
_heading=h.svrixcbhnizv
_heading=h.4naxvfdt1h1f
_heading=h.adakqa4748ao
_heading=h.hay5wwxqfb44
_heading=h.sjfeaihdk0r9
_heading=h.rlhwt3puxv8
_heading=h.i8iqpwbfryhp
_heading=h.ctf2dxdg65mh
_heading=h.ripuhuoi94e9
_heading=h.dfcrimeobrj5
_heading=h.8rxoxaonggvz
_heading=h.gdop0gqtuw0v
_heading=h.acikkl4fdfyl
_heading=h.3ug9p2avu76b
_heading=h.xh3vgc65tx55
_heading=h.xpkkotwfnag2
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.lnxbz9
_heading=h.35nkun2
_heading=h.35nkun2
_heading=h.35nkun2
_heading=h.35nkun2
_heading=h.35nkun2
_heading=h.35nkun2
_heading=h.35nkun2
_heading=h.35nkun2
_heading=h.35nkun2
_heading=h.35nkun2
_heading=h.35nkun2
_heading=h.35nkun2
_heading=h.35nkun2
_heading=h.35nkun2
_heading=h.35nkun2
_heading=h.35nkun2
_heading=h.35nkun2
_heading=h.35nkun2
_heading=h.35nkun2
_heading=h.35nkun2
_heading=h.35nkun2
_heading=h.zgpoctoile29
_heading=h.jmybtsy6a476
_heading=h.j8pgml9tbk2e
_heading=h.8o6kxy5ovbeg
_heading=h.rugmu2t8oc7n
_heading=h.8o6kxy5ovbeg
_heading=h.97rbivkbb67k
_heading=h.35nkun2
_heading=h.rieu5h3mxa41
_heading=h.by0f5zm7v2qa
_heading=h.jpq00i74nvn5
_heading=h.b9zg5cv97q87
_heading=h.yxh2qudxpg5j
_heading=h.nfc1d7zfvlny
_heading=h.b4bksy366wn
_heading=h.37t42xfx9pra
_heading=h.ipyugc9773ve
_heading=h.he23tm58tsvg
_heading=h.3cg7e9lguzth
_heading=h.uu2n4jpfap6f
_heading=h.cupf0u354kpm
_heading=h.9gjh1mw2yua8
_heading=h.1cwsoz4rl3zy
_heading=h.439u8l6g4wu3
_heading=h.cc2fej6zj7
_heading=h.pfa6d1ot893i
_heading=h.5kklcv2w9ify
_heading=h.ha2mu59dwf3k
_heading=h.mvg7j971qzyl
_heading=h.gzkelgoy8q84
_heading=h.ccacye16ssix
_heading=h.vfnky44ev4yw
_heading=h.9o1wja6eal89
_heading=h.u7idit12slj8
_heading=h.pzcje15mskf2
_heading=h.ezd555ud1tb5
_heading=h.l8hd91k9s2uw
_heading=h.i4efbjwwmdc0
_heading=h.cuf4yq2p4psg
_heading=h.q199bfn86y6w
_heading=h.d60djcjsxsyk
_heading=h.epq7g3hffo4r
_heading=h.oik64ppollg7
_heading=h.cqzowqwaq5v5
_heading=h.hf6l1espvyde
_heading=h.5lc83zr03j63
_heading=h.16ii71lm7o3m
_heading=h.p0fralh9ym38
_heading=h.p689epf183xd
_heading=h.hak4fmyy9izj
_heading=h.381zzyptljzm
_heading=h.4p82jw4p52kw
_heading=h.fxld3s5fu45t
_heading=h.ehp80hfvchyn
_heading=h.vhkmupq73r40
_heading=h.94oauvfqgtjj
_heading=h.xto49of89yxx
_heading=h.gzq5wk41w1t
_heading=h.s2rik393o67g
_heading=h.omx7gs5j5n02
_heading=h.vuabefo2v8sr
_heading=h.9v2jtjz9g1jc
_heading=h.ax4q8tdyerb1
_heading=h.vl4ujtsfvv0j
_heading=h.v4c686zezu91
_heading=h.lll5t7b3s9im
_heading=h.cwlh1shx9yb
_heading=h.50vxpvw5ghem
_heading=h.19z32e4h67qf
_heading=h.y2sknam0ab4j
_heading=h.7bdpchys80i9
_heading=h.5ta399v01tun
_heading=h.b8ixzmw98epl
_heading=h.1gnwc7350442
_heading=h.20ssuisfcyoe
_heading=h.wpyl6hfsbq6r
_heading=h.8nrf93tsyyx3
_heading=h.ml7n571g5g0g
_heading=h.ckdd44trdxj5
_heading=h.jmpf4wg97ase
_heading=h.3apaa4r9pyxq
_heading=h.36ckovs47s5o
_heading=h.6ift0wa1mhw
_heading=h.vpilaui9ddw2
_heading=h.mooo8h9ytvw
_heading=h.o40cmyz1t11z
_heading=h.zdo9gc2t7hvu
_heading=h.ostldfu2imes
_heading=h.nd3bocyget44
_heading=h.gbst23f2ci6m
_heading=h.obe5romxh4vp
_heading=h.z3vjhh5c2rki
_heading=h.20ekpu48pe9j
_heading=h.kt8yhuikd7qc
_heading=h.1lfooy2ba3f7
_heading=h.nfvrvreuu6jm
_heading=h.jj0w2norezrd
_heading=h.q0vv6hpzi6wc
_heading=h.iex6qbh4bnh3
_heading=h.vqhsrk4cbsb0
_heading=h.w1poq0xdcoil
_heading=h.punrr47b0mnt
_heading=h.dzocbw5lw7c6
_heading=h.p2q5rwoz2dlv
_heading=h.uvbzasit4w8
_heading=h.4ww7svzhqolu
_heading=h.tmj3vshn4trz
_heading=h.8zom2qh7qfw7
_heading=h.m2iv90x9ldrb
_heading=h.xbtkausym2se
_heading=h.kzo8q7s4y3qc
_heading=h.trtos9byzoid
_heading=h.nchhzxks937e
_heading=h.ehz5t7wdify4
_heading=h.sxy5e0dnc801
_heading=h.2czcts75yv4o
_heading=h.a1186ix05fl3
_heading=h.kri0vls3dcat
_heading=h.6ib09q411iz5
_heading=h.xvm044t7yimw
_heading=h.gb33d3ag8usu
_heading=h.1baav5ga1a32
_heading=h.y304imozq52n
_heading=h.l09hooj19klz
_heading=h.afp0btnmm5bw
_heading=h.fn04ucpkr9og
_heading=h.j6hc69v0yayn
_heading=h.slykrvfkx3yo
_heading=h.e560928qhhz9
_heading=h.wwg9u1pfu1qt
_heading=h.vmctifkbmbe3
_heading=h.ivz5mod0mde0
_heading=h.f4xmdixi31ps
_heading=h.ur87y1sextt2
_heading=h.qxr2b45d9uo6
_heading=h.x446zat0gzzf
_heading=h.jbju7deiy8w1
_heading=h.d0vl3ifke0q6
_heading=h.v5aail9cl7fc
_heading=h.dfvps8bmneex
_heading=h.qnvhtajy0jpf
_heading=h.tpxo50ul8lpc
_heading=h.ppaunmyhf8o5
_heading=h.gucujacixsyw
_heading=h.7s2mvcs76bfr
_heading=h.bce3nkczddk0
_heading=h.okc04furt55o
_heading=h.svqtkpsfpd4x
_heading=h.5n4v23aq94x0
_heading=h.s6vwoste1s1c
_heading=h.t03v7ykx3fqo
_heading=h.5tosl9x7sp8o
_heading=h.w6yvkqrtnept
_heading=h.3og9sltfa6sw
_heading=h.a7xk7ivrj6vm
_heading=h.x446zat0gzzf_heading=h.lv0hwlk4zci8
_heading=h.2hxtca8uf7o7
_heading=h.o684p7jda33t
_heading=h.an1514pzmh0z
_heading=h.4jlpm2jdenhu
_heading=h.ulctqiehjagl
_heading=h.sqnngsmifc92
_heading=h.1eq0kvhwfhni
_heading=h.kw574e7cibdf
_heading=h.rs3t64hej2tf
_heading=h.gseprjsbz0b2
_heading=h.kuqxe47170oj
_heading=h.zh1epy2pu426
_heading=h.ck6frlukktcl
_heading=h.ows6ricju4oc
_heading=h.7tf42i4c7sj7
_heading=h.qlwy5a6zuoo7
_heading=h.30twolc8rh0y
_heading=h.fagkpynr94jf
_heading=h.a2h1o9vrspm3
_heading=h.uqd05igqdvyw
_heading=h.900ept973hl9
_heading=h.42bgumc439ih
_heading=h.t9zfn2ic9gx2
_heading=h.kf2zrx61xzsi
_heading=h.b91mw1m1t459
_heading=h.jfp39pd2dc16
_heading=h.wucotq2qk0lx
_heading=h.6sy2kai06dck
_heading=h.uisxnp72lhtf
_heading=h.sdih1m1kiogx
_heading=h.3tgwfts2idst
_heading=h.ihjvevq2a4iz
_heading=h.1dfvpfg4wqv3
_heading=h.7x1fu0fepyjz
_heading=h.b8rvp1qlbme3
_heading=h.42v4oyz65h4v
_heading=h.c8kr2tyjnimd
_heading=h.6rc52jujsj41
_heading=h.6u5d9jm3o4td
_heading=h.hznwbo4ok710
_heading=h.qmg7lsu6oqqy
_heading=h.9v9lpzmwskud
_heading=h.9yv3c7801lus
_heading=h.j0b9jgslsh1j
_heading=h.35nkun2
_heading=h.oe2mq1hscofh
_heading=h.rkw64it3s40l
_heading=h.68bogyenzwxp
_heading=h.5vei7y473bof
_heading=h.uidd4jiui4uy
_heading=h.x52efqegv4rd
_heading=h.7iqlkjdsughb
_heading=h.sjizw8adaq0i
_heading=h.oc5b0cxnbjg8
_heading=h.vg1hpiq0qmj3
_heading=h.x7j7ws14io5n
_heading=h.94qhm4tc2nmy
_heading=h.44vy3mv1sfnb
_heading=h.v0n247m0znri
_heading=h.hlve2fj83s8a
_heading=h.le8mknor7u1d
_heading=h.1856nfmf1g3s
_heading=h.pxzra3tszf1e
_heading=h.c3xbjqpk7u7j
_heading=h.e67enbsj16pf
_heading=h.tows7onc3s8t
_heading=h.zefzc7ljdd03
_heading=h.svifr1i7ekzv
_heading=h.kkyl746usajm
_heading=h.qm46eug1nkjw
_heading=h.4cfag7hxr3bj
_heading=h.7k2u9wam4pdq
_heading=h.r5k7lq1ylim1
_heading=h.h4vqmcnypr0z
_heading=h.x2ea78pr9oq1
_heading=h.yvvzomhmsbtk
_heading=h.wzc8md490t7f
_heading=h.wz4lfkef84m8
_heading=h.qib6u6q2f53k
_heading=h.o3sokpc2asho
_heading=h.c2368oqy08fv
_heading=h.e7veedl7ree9
_heading=h.fdmolkt2701e
_heading=h.28j4j61eiits
_heading=h.wvu17psk7wnv
_heading=h.j4fx78dmc5ut
_heading=h.8cygp42zpu94
_heading=h.s6zthqeov3go
_heading=h.p6wgnerrjotd
_heading=h.inlgy7nf5udz
_heading=h.wz8iu2gtbyr
_heading=h.eqdt4nsofvlm
_heading=h.afa0vy8gv50d
_heading=h.ybb0e9b7c0ow
_heading=h.50dygs5zgpyz
_heading=h.p7c4rwhoc370
_heading=h.jrejzstj0txo
_heading=h.egraerp3hh3v
_heading=h.7d44jmp5nek1
_heading=h.x9kbrwpydqsu
_heading=h.z1z12z8ih8fb
_heading=h.6cmgghy9a7jt
_heading=h.21ss14s9q1jn
_heading=h.gpq3cwt5nnr5
_heading=h.qsh7bqf3gaou
_heading=h.d7nlqn4i1t2q
_heading=h.rjtbwkv21oij
_heading=h.p9np1uasv806
_heading=h.x5hvkxv41cs
_heading=h.c13t09hhh8lb
_heading=h.fer6nu21n3wb
_heading=h.2pn7tbd9k36u
_heading=h.aflzcq6x6j40
_heading=h.uy6qhku9pyz5
_heading=h.e2f42lg3blwq
_heading=h.jci5k09cwtst
_heading=h.cyfgrs705buz
_heading=h.5ozuyjxgxnyl
_heading=h.sdwtgp2neix2
_heading=h.1gq9ygvb41hs
_heading=h.apzuzfg0bz5i
_heading=h.fa40od63tizf
_heading=h.c8rr1ooy4jh
_heading=h.94toydc5nyyz
_heading=h.r923fzk8lg18
_heading=h.cmuofn8lp9jv
_heading=h.uz4bk7ayhznk
_heading=h.cb499wndzd1q
_heading=h.4tosfjvcyrrt
_heading=h.xmbaq7gh4wt3
_heading=h.646qolclevzl
_heading=h.n8yingi2hgy5
_heading=h.2yg2rxqueox
_heading=h.g2a2qmjdf91l
_heading=h.34dolvimv6un
_heading=h.w8zsjpuon5xi
_heading=h.vz0pguti6ie2
_heading=h.73o1mkhbiigd
_heading=h.8jvtqnp7iiyq
_heading=h.i24x13p5pxbp
_heading=h.npskgwtcy56c
_heading=h.6snfxw9dd5g9
_heading=h.mgol4fusbz9i
_heading=h.quoozkm858sm
_heading=h.dday4cbdjw88
_heading=h.1y4kch9e5c9w
_heading=h.u1ogq0kcfwqd
_heading=h.44m99mq7woy6
_heading=h.dnap6msye1dd
_heading=h.kozrbukq8cwg
_heading=h.bmney6kps72r
_heading=h.rv4fubk41c95
_heading=h.4ut5528bf2ml
_heading=h.yxozxaw7q17x
_heading=h.yntsyfvjdijq
_heading=h.k05br09jktdd
_heading=h.9e1acqg5lur8
_heading=h.iq34wcq36xmx
_heading=h.9o24huwxwy3g
_heading=h.4mlrjopfr3sj
_heading=h.meq1vus9qqtz
_heading=h.9x0aogk85qja
_heading=h.civ2k14niwyp
_heading=h.eqgbvwgsex8c
_heading=h.iahl0t3j4m7g
_heading=h.oc2hagwxc0r8
_heading=h.2swgobu7f3qt
_heading=h.uazsq2yfwi99
_heading=h.8vqkprh4l6qd
_heading=h.lyjtzsd3wppo
_heading=h.5k7mc5cru2lu
_heading=h.acurk3se7adf
_heading=h.i79hdkwobltq
_heading=h.kwozb7qgjiah
_heading=h.7pwieaw8kfzv
_heading=h.5ab2rotaotqe
_heading=h.np0i47la9oa
_heading=h.bhszfhvbe8ta
_heading=h.w9byp2e9dd6c
_heading=h.dm1eq9u0cx1c
_heading=h.tslftdfev18d
_heading=h.fa7rhmc4w5oq
_heading=h.i5mhs6huavgp
_heading=h.ecvza0po7k5e
_heading=h.z1g5r3ol20dl
_heading=h.m31x0zaeu3a
_heading=h.cb6hzz2bz2w2
_heading=h.pwmh17yogfm
_heading=h.hdiosctuarsi
_heading=h.1spti3ae2yoe
_heading=h.qg4uytkfg6wo
_heading=h.met229vqbayx
_heading=h.u1rfdsjhintc
_heading=h.qk1lnarn68us
_heading=h.spbogb9kakmk
_heading=h.54ra8j9kvb0k
_heading=h.y6ol9mv0nqh9
_heading=h.hvhgno7oc155
_heading=h.8gltiucvecxh
_heading=h.neg3jp43bxhn
_heading=h.o3xijpuzup59
_heading=h.27k85civ8kje
_heading=h.xw31ouifmzq3
_heading=h.wg6ftwejmzkx
_heading=h.fn8q18mrxwyg
_heading=h.i11i08g9u5md
_heading=h.r0ls0bu45xvv
_heading=h.4z8kqt6sf6nj
_heading=h.g0xjdp2kc7av
_heading=h.was0j8mdpeyl
_heading=h.m97bh0gz8c0s
_heading=h.dtisuclfwh0k
_heading=h.szk5ckpptzkk
_heading=h.fba4oq8w17p9
_heading=h.94xqaan2uu4s
_heading=h.7yoo9vbow9y8
_heading=h.108tw7zbvdvl
_heading=h.dumbafoktytf
_heading=h.xo3jfha3i7eo
_heading=h.ikma8la50pbo
_heading=h.idthmdtgkqzt
_heading=h.uyxcj6srv3w4
_heading=h.b6yu0tbx5caj
_heading=h.ooor61g5zg9t
_heading=h.2hja3tgea201
_heading=h.2g2pmzmq81h3
_heading=h.orha2lqxcdn4
_heading=h.2owrby6dldmi
_heading=h.tpi9qtaidc3c
_heading=h.ktcjsm7vzwvg
_heading=h.xwohuvujpxi1
_heading=h.ob052ydtufoa
_heading=h.30tgx09xyarf
_heading=h.9tuq092azh7f
_heading=h.jykb8kcck1l9
_heading=h.fqmjyymh5iyp
_heading=h.go2zrq1znz8f
_heading=h.ee5vsciqbgv9
_heading=h.x1meyb28c5v6
_heading=h.ldpv152avi3b
_heading=h.nl3x99vikqs4
_heading=h.evfcwvjkoqu
_heading=h.ljqm6m1vsdaz
_heading=h.84k0b5jns86s
_heading=h.4ea7bp4iat8d
_heading=h.wptucpv44bfo
_heading=h.mflw9jhfca98
_heading=h.d0x03g9qtfp2
_heading=h.6b7rbfbsot7z
_heading=h.kipj9yr6nv10
_heading=h.657d4xnwn4on
_heading=h.wirtbcjd4eu7
_heading=h.z7t2n5nrjgun
_heading=h.2e4m7uu2vvsh
_heading=h.5ng2qkajttgv
_heading=h.mswx6ldnaxjm
_heading=h.6t77be3wcq6v
_heading=h.1ibt3us6bnk6
_heading=h.6ot42441llj1
_heading=h.hro58wc20b9z
_heading=h.s7hwdcauyfwv
_heading=h.nvdyj8in0f5k
_heading=h.g8tp42eiwd3a
_heading=h.qcfs0t9f4j0p
_heading=h.6d2k8ehi6zf3
_heading=h.l6ylfa3dc4yp
_heading=h.rke3jvjp9okw
_heading=h.5ho6z6mohhbe
_heading=h.t2k6egke3qww
_heading=h.gmxhc9dy8j8j
_heading=h.iopbxkh0ikje
_heading=h.wy1qgcvyimxf
_heading=h.85znrgrny48o
_heading=h.megkf57adrjl
_heading=h.nbymm81q7ibh
_heading=h.g6ul0t5o2q4d
_heading=h.8uy8nyqze5h7
_heading=h.2kwjbm36z7e1
_heading=h.8jgkxxghxb5e
_heading=h.7hj8ebd043xt
_heading=h.nakx6a70u5nr
_heading=h.iknu399kcd8
_heading=h.n07qopz3hi54
_heading=h.qh1kihjka2bj
_heading=h.7n243dkmy47z
_heading=h.9uwmopap3re5
_heading=h.p2kk8z5mizad
_heading=h.8mjpgf4lovcy
_heading=h.jt13n0p2i9k3
_heading=h.tvmpjkusxuth
_heading=h.jdncu7ryki91
_heading=h.dbhue7h84oq4
_heading=h.4av2gu921l23
_heading=h.l4ixobeawk78
_heading=h.bal02b4i74ks
_heading=h.84yzxyjxrmgf
_heading=h.m6709j9bva9a
_heading=h.fykvwyjm3g3k
_heading=h.trpgr9hc5789
_heading=h.s0hroethwg4e
_heading=h.qk1n6n7gu5y9
_heading=h.gwr7wuvchrcd
_heading=h.oeu3gqp5q1a2
_heading=h.55188yq68yzy
_heading=h.l8zgvxohhbbq
_heading=h.ugk5vzfwbqjh
_heading=h.rs26hops4wlj
_heading=h.tpb3q2muh8em
_heading=h.zf6tkjiezoq
_heading=h.tendk5kbdcj
_heading=h.cxfwzbama78c
_heading=h.pyxy8nvhpn30
_heading=h.xpxswn1ecqvl
_heading=h.7oooojcmenvw
_heading=h.bmqsjnww8plo
_heading=h.2bmqgnetera3
_heading=h.xsm9x0i3atw
_heading=h.pwfdrrg7ft1e
_heading=h.w4n8d0gi0yqy
_heading=h.jiad5smxqgr4
_heading=h.6llq9nnjj2nn
_heading=h.7v1if74sptib_heading=h.2l8zlhlydx32
_heading=h.74md1edt53oe
_heading=h.kuyarfdokfwm
_heading=h.35uy1rial5uu
_heading=h.dfvow82jx49s
_heading=h.xkn1rx63fowq
_heading=h.cfqegt8wjn6r
_heading=h.pb64r6xkqj9y
_heading=h.m3oqxn506uol
_heading=h.u6h09kvb6anz
_heading=h.bp3r69fpk82g
_heading=h.elo9695zae5q
_heading=h.okauha35x1j
_heading=h.f2reg0ji1m2m
_heading=h.ilz3vf9n2qfl
_heading=h.tamk31cokbma
_heading=h.ff8fru260rvo
_heading=h.6imflfk941bj
_heading=h.eb7f1het2qil
_heading=h.ywa7rfiaafxv
_heading=h.op8kxjn8u4l0
_heading=h.dh2ki1c05xo2
_heading=h.20n7ycrtad9v
_heading=h.43g9gmpkc8j
_heading=h.m86idh3exvvd
_heading=h.ovvz67sqrzg1
_heading=h.vj5uix445e4h
_heading=h.u7cjy2nxwr54
_heading=h.oirmyqtsweva
_heading=h.95zwgcyk1upr
_heading=h.ysz3jtqmoi9i
_heading=h.17992y8fjp07
_heading=h.neff07i23t8k
_heading=h.zb3d7k6jt2u4
_heading=h.q8hhtei5kmoe
_heading=h.35nkun2
_heading=h.kwqq92vcupow
_heading=h.uzhodvfcx6fb
_heading=h.j3fui6f562sd
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.um815ooynf6d
_heading=h.iuzyu0vb1ial
_heading=h.gjdgxs
_heading=h.mqmiknuiytoc
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.gjdgxs
_heading=h.rt4j422kyegq
_heading=h.gjdgxs
_heading=h.k5mn9rc27oma
_heading=h.gjdgxs
Introdução
Conceitos sobre Open Source
Conceitos básicos de Inteligência Artificial
Tecnologias e metodologias utilizadas
Materiais e métodos específicos
Python básico (parte 1)
Python básico (parte 2)
Python básico (parte 3)
Python básico (parte 4)
O protótipo (parte 1)
O protótipo (parte 2)
O protótipo (parte 3)
O protótipo (parte 4)
O protótipo (parte 5)
Revisão do código na íntegra