Revista PROGRAMAR Ed 55
Revista PROGRAMAR Ed 55
Revista PROGRAMAR Ed 55
EQUIPA PROGRAMAR
A revista PROGRAMAR um projecto voluntrio sem fins lucrativos. Todos os artigos so da responsabilidade dos autores, no
podendo a revista ou a comunidade ser responsvel por alguma impreciso ou erro.
Para qualquer dvida ou esclarecimento poder sempre contactar-nos.
2
NDICE
TEMA DE CAPA
6 Docker: overview - Nuno Cancelo
A PROGRAMAR
ELECTRNICA
53 O Problema da falta de GPIO Pins - Antnio Santos
COLUNAS
59 C# - Padro de Arquitetura SOLID - Antnio Santos
61 SQL Curtas - SQL Curtas #2: Dvidas Comuns - Andr Melancia
64 Kernel Panic - A arte, engenho, e muita diverso - Antnio Santos
ANLISES
67 C# 6 - PROGRAMAO COM PRODUTIVIDADE - Mnica Rodrigues
68 Introduo Programao com Python, Algoritmos e logica de programao para iniciantes - Antnio Santos
SEGURANA
70 Segredos de Numerao - Andr Melancia
NO CODE
76 ShiftAppens 2017 - Filipa Peres
EVENTOS
Para mais informaes/eventos: http://bit.ly/PAP_Eventos. Divulga os teus eventos para o email eventos@portugal-a-
programar.pt
3
NOTCIAS
Jovensde Coimbra na final do Goo- Visual Studio 2017 lanado a
gle Hash Code 2017 7 de Maro
Ter lugar em Paris, no prximo dia 1 de Abril, a final No passado dia 7 de Maro, a Microsoft lanou a ulti-
do Google Hash Code 2017, promovido pela Google. O Hash ma verso do seu ambiente de desenvolvimento Visual Stu-
Code um concurso que visa estudantes e profissionais da dio.
Europa, Mdio Oriente e frica, consistindo na resoluo de
Esta nova verso da j famosa IDE, desta feita reche-
problemas criados pela Google atravs de uma linguagem de
ada de novidades, alm de algumas melhorias em relao
programao. Os participantes podem formar equipas entre
verso anterior, bem como algumas novidades e continua a
dois e quatro elementos, dividindo-se a competio em duas
ser disponibilizado em diversas verses, sendo que se man-
fases: online e final com os 50 melhores classificados.
tem a existncia de uma verso community gratuita.
Trs estudantes naturais de Coimbra participaram na primeira
De todas as novidades desta nova verso do Visual
fase que decorreu em Fevereiro e contou com a participao
Studio destacamos as seguintes:
de 2815 equipas. Ricardo Gomes, da Universidade de Coim-
bra, Miguel Duarte, do Instituto Superior Tcnico da Universi- Ajuda Off-line, bastando instalar o Help Viewer
dade de Lisboa e Pedro Paredes, da Universidade do Porto,
vo disputar a grande final do Google Hash Code 2017. Cdigo colorido e autocomplete para as linguagens
Bat, Clojure, CoffeeScript, CSS, Docker, F#, Groovy,
Em entrevista Ricardo Gomes afirma Sinceramente, no con-
INI, Jade, Javadoc, JSON, LESS, LUA, Make,
tava que a fase de qualificao corresse assim to bem. Ns
Markdown ++, Objective-C, Perl, PowerShell, Python,
tnhamos uma estratgia inicial e, simplesmente, seguimos
Rust, ShaderLab, SQL, Visual Basic .NET, YAML.
essa estratgia. Esperamos superar em Paris o resultado
obtido nesta fase. Snippets de cdigo para as linguagens CMake, C++,
C#, Go, Groovy, HTML, Java, Javadoc, JavaScript,
Lua, Perl, PHP, R, Ruby, Shellscript, Swift, XML
4
TEMA DE CAPA
Docker: overview
TEMA DA CAPA
Docker: overview
6
TEMA DA CAPA
DOCKER: OVERVIEW
no entanto chamo a ateno que este produto no supor- Conhecer 20% dos comandos que servem para 80%
tado e as atualizaes j no so to frequentes. das vezes.
O wizard instala trs componentes principais: No necessrio ser um expert em comandos Linux,
mas ajuda j ter trabalhado com ambientes Unix, uma vez que
Docker Engine: o Docker em si. grande parte dos comandos tm uma filosofia semelhante,
mas em contexto diferente.
Docker Compose: permite compor imagens Docker
Por exemplo:
Docker Machine: permite configurar a Virtual Machine
onde o Docker instancia os Containers O comando:
OK, est instalado e agora? Esta uma pequena lista dos comandos que mais uso:
Bem, os primeiros passos passam por conhecer a attach: Attach to a running container
aplicao, mas recomendo que encontrem um objetivo (por
mais simples que seja) para que a aprendizagem seja a mais exec: Run a command in a running container
proveitosa possvel.
images: List images
Se seguiram o manual de instalao, j perceberam
que para se trabalhar com Docker necessrio trabalhar em info: Display system-wide information
linha de comando. Por incrvel que possa parecer no as-
inspect: Return low-level information on Docker objects
sim to intragvel como possa parecer J. O passo 2 (verso
mac) pede para verificar a verso de cada uma das compo- kill: Kill one or more running containers
nentes:
logs: Fetch the logs of a container
HostApple:~ nunocancelo$ docker --version
Docker version 1.13.0, build 49bf474 ps: List containers
HostApple:~ nunocancelo$ docker-machine --version pull: Pull an image or a repository from a registry
docker-machine version 0.9.0, build 15fd4c7
rm: Remove one or more containers
HostApple:~ nunocancelo$ docker-compose --version
docker-compose version 1.10.0, build 4bd6f1a rmi: Remove one or more images
A verso de cada componente relevante quando se run: Run a command in a new container
est a brincar, pois em cada verso nova o comportamento
poder ser diferente e alguns ajustes podero ter que ser search: Search the Docker Hub for images
feitos.
stats: Display a live stream of container(s) resource
O comando mais til, e que no inicio usado bastan- usage statistics
te, o de ajuda:
Todos restantes tambm so importantes, mas no os
uso com tanta frequncia.
HostApple:~ nunocancelo$ docker help
Antes de avanarmos necessrio esclarecer os pon-
(Por questes de legibilidade no apresentado o resultado)
tos bastantes importantes:
O resultado apresenta todos os comandos suportado
por esta verso do Docker, e para obter ajuda de um deter- Como j foi mencionado anteriormente, um Container
minado comando: uma Lightweight Virtual Machine, mas necessrio
mencionar que uma Image um stack aplicacional pre-
HostApple:~ nunocancelo$ docker COMMAND --help viamente definido. No so a mesma coisa.
Pessoalmente desconheo o comportamento de gran- Uma Image readonly, uma vez criada no pode ser
de parte dos comandos, porem sigo a regra dos 20-80: alterada. Se for necessrio alterar alguma configurao
7
TEMA DA CAPA
DOCKER: OVERVIEW
ou adicionar algo necessrio criar uma nova Image. sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f9
27b07d05f6d12a1ac8d7
Sendo que uma Image (que readonly) vive dentro Status: Downloaded newer image for hello-
world:latest
de um Container quando se sai (exit) desse container,
toda a nova informao que l foi criada perder-se Neste exemplo, a imagem Hello-World o que mostra
aquando a sada do Container. Porm h formas de so todos os passos que fez at concluir:
salvaguardar a informao J.
Hello from Docker!
Docker Hello World This message shows that your installation appears
Para no variar, vamos criar um Hello World para to be working correctly.
comearmos a interagir com o Docker e ver as suas potenci- To generate this message, Docker took the follo-
alidades. wing steps:
1. The Docker client contacted the Docker dae-
Vou replicar o exemplo do manual de instalao do mon.
passo 3 (verso mac) e instalar uma imagem Hello-World: 2. The Docker daemon pulled the "hello-world"
image from the Docker Hub.
3. The Docker daemon created a new container
HostApple:~ nunocancelo$ docker run hello- from that image which runs the
world executable that produces the output you are
Unable to find image 'hello-world:latest' lo- currently reading.
cally 4. The Docker daemon streamed that output to the
latest: Pulling from library/hello-world Docker client, which sent it
78445dd45222: Pull complete to your terminal.
Digest:
sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6
f927b07d05f6d12a1ac8d7 Para comeo est porreiro, mas todos concordamos
Status: Downloaded newer image for hello- que no til (como todos os Hello-World :P). Ento vamos
world:latest
tentar algo mais.
Hello from Docker!
This message shows that your installation ap- Continuando o manual vamos instalar um servidor
pears to be working correctly. NGINX, para quem no sabe um servidor HTTP de alta
performance, e aqui j temos algumas novas features porrei-
To generate this message, Docker took the fol- ras.
lowing steps:
1. The Docker client contacted the Docker HostApple:~ nunocancelo$ docker run -d -p 80:80 --
daemon. name webserver nginx
2. The Docker daemon pulled the "hello-world" Unable to find image 'nginx:latest' locally
image from the Docker Hub. latest: Pulling from library/nginx
3. The Docker daemon created a new container 5040bd298390: Pull complete
from that image which runs the 333547110842: Pull complete
executable that produces the output you 4df1e44d2a7a: Pull complete
are currently reading. Digest:
4. The Docker daemon streamed that output to sha256:f2d384a6ca8ada733df555be3edc427f2e5f285ebf46
the Docker client, which sent it 8aae940843de8cf74645
to your terminal. Status: Downloaded newer image for nginx:latest
6a9862f69870db29401404b40fe4247068c609791160cf60060
To try something more ambitious, you can run f0067bf3c2679
an Ubuntu container with:
$ docker run -it ubuntu bash
Como se pode ver, a mquina tinha a imagem local-
Share images, automate workflows, and more mente e foi o repositrio buscar e instalou trs componentes.
with a free Docker ID:
https://cloud.docker.com/ Analisando melhor o comando:
For more examples and ideas, visit: HostApple:~ nunocancelo$ docker run -d -p 80:80 --
https://docs.docker.com/engine/userguide/ name webserver nginx
8
TEMA DA CAPA
DOCKER: OVERVIEW
A imagem Figura 2 mostra o output: Next Step: Dockerfile
Isto muito til para usar em imagens j feitas, mas e
se no encontrar nenhuma imagem que satisfaa as minhas
necessidades? Ou ento, quero fazer um de raiz? Para aten-
der a esta necessidade foi criado o Dockerfile, que um fi-
cheiro de texto com um conjunto de diretivas que permite
criar imagens.
O manual de referncia do Dockerfile pode ser encon-
trado em http://bit.ly/Dockerfile-Reference.
Como exemplo, vamos supor que temos um site est-
tico que queremos disponibilizar. Para tal, o melhor come-
ar pelo inicio J.
Criamos uma pasta raiz e dentro desta pasta vamos
criar uma outra pasta onde vai estar o nosso site e um fichei-
ro chamado Dockerfile com o seguinte contedo muito sim-
ples.
Figura 2: nginx Dockerfile
Vamos correr o comando ps para vermos a informa-
FROM httpd:2.4
o exposta (por questo de legibilidade algumas colunas COPY ./public-html/ /usr/local/apache2/htdocs/
menos relevantes foram removidas):
9
TEMA DA CAPA
DOCKER: OVERVIEW
E quando formos ao browser obtemos a imagem Fig- Por vezes necessrio ver as configuraes de uma
ura 3. imagem para obter informaes de networking, mounting
points, etc. Para obter essa informao usamos o inspect:
10
TEMA DA CAPA
DOCKER: OVERVIEW
E navegando para a diretoria public-html temos Este comando particularmente til quando andamos
ento o nosso site Figura 5. a testar provas de conceito e novas Images e queremos
guardar as configuraes para depois as usarmos noutros
containers.
Data Containers
Assim como havia sido mencionado, existe outra for-
ma de ter os dados guardados os Data Containers. O para-
digma um pouco diferente dos Data Volumes uma vez que
so containers na mesma, mas no tm qualquer imagem
associada. Pensem em informao utilizada ou gerada pela
nossa aplicao que precisa de ser guardada e posterior-
mente disponibilizada. Estou a referir-me a logs da
aplicao, da infraestrutura, das bases de dados, etc.
um container em que a nica coisa que faz guar-
Figura 5: Site num Data Volume dar dados, posteriormente podemos aceder e no est asso-
ciado a nenhuma imagem ou container, significando que
Agora est na altura de modificarmos o nosso site
mesmo que os containers morram ou sejam removidos a
localmente e o mesmo ser refletido automaticamente no
sua informao continua viva no Data Container que lhe foi
nosso container.
associado.
Aps algumas alteraes, o nosso site de exemplo
Podemos ter N containers para M propsitos e para
ficou assim como na Figura 6:
cada image container que criemos podemos ter associados
os Data Containers que necessitarmos.
Para usarmos esta funcionalidade necessrio tomar
dois passos:
11
TEMA DA CAPA
DOCKER: OVERVIEW
Agora vamos ao segundo ponto, associar o Data No entanto em docker acaba por ser simples. A pgina de
Container ao nosso container e para tal executamos o se- referncia do docker (http://bit.ly/docker-network) explica
guinte comando: muito bem este tema, assim como a sua configurao.
HostApple:pap-httpd nunocancelo$ docker run -dit - Para listar as redes disponveis, executamos o
p 80:80 --name pap-httpd --volumes-from pap-httpd- seguinte comando:
logs -v [Local Path]:/usr/local/apache2/htdocs/
masterzdran/pap-httpd HostApple:pap-httpd nunocancelo$ docker network ls
12
TEMA DA CAPA
DOCKER: OVERVIEW
Docker Machine fora das diretorias partilhadas.
H pouco mencionei que podemos ter tantos os Dependendo do uso que se quer dar aos containers,
containers que quisermos como o que a mquina virtual recomendo que no se exagere no numero de CPUs e
permitir. Por omisso, quando instalamos o Docker memria RAM atribuda, pois isso vai se refletir diretamente
instalado uma Docker Machine com os recursos na performance do computador no dia a dia. Quando
recomendados (na minha instalao tem dois cores e dois estiverem a testar imagens, novas aplicaes, servidores,
gigabytes de memria RAM), porm por vezes no investiguem os requisitos de sistema e faam umas contas
suficiente para a infraestrutura que queremos montar. de merceeiro, pois existe um trade-off entre a performance
dos containers e a performance do computador.
Apesar de podermos alterar estes parmetros via
linha de comandos, eu pessoalmente acabo por usar a Concluso
interface grfica fornecida. Para aceder a ela, vamos s
Este breve overview sobre o ambiente docker permite
propriedades do icon do docker (uma baleia), que no OSX
sensibilizar sobre as potencialidades deste sistema e de que
est na barra superior, no Windows na barra de status e
forma nos pode facilitar, agilizar o nosso trabalho.
aparece a janela da :
uma excelente forma de ter os sistemas contidos e
por componentes tendo um potencial enorme, e porque tudo
reside em containers, em muito pouco tempo podemos
migrar para a Cloud (um servio de Containers) e ter os
nossos sistemas a funcionar.
Repositrio:
https://gitlab.com/masterzdran/docker-overview
Referencias
Para alm das j referidas no texto:
https://docs.docker.com
https://hub.docker.com
http://odewahn.github.io/docker-jumpstart/building-images-
with-dockerfiles.html
AUTOR
Escrito por Nuno Cancelo
Curioso por natureza e engenheiro informtico por formao. Desde muito cedo me despertou o interes-
se pelos computadores e informtica com o famoso Spectrum. Tenho um gosto peculiar por aprender
novas coisas frequentemente mesmo que no venha a trabalhar com elas e optimizar os sistemas au-
mentando a sua performance.
13
A PROGRAMAR
API Rest com Spring Boot (parte 2)
Um bot para Telegram com o Jogo da velha (Jogo do Galo).
Automao do Azure com Windows PowerShell Desired State Configuration
O Problema do casamento Estvel utilizando o Algoritmo Gale-Shapley
A PROGRAMAR
Nesta segunda parte, vamos ento adicionar ao nos- Assim sendo, o nosso primero passo ser remover o logback
so projecto um sistema que nos permita criar logs personali- do nosso projecto e para isso vamos recorrer possibilidade
zados sobre o acesso nossa API. que o Maven nos oferece de excluir determinadas depen-
dncias.
Sempre que desenvolvemos uma aplicao, devemos
logo de inicio tratar de providenciar um bom sistema de logs Vamos ento ao ficheiro POM.XML do projecto e localizamos
j que ele uma parte fundamental, seja durante o desen- as linhas referentes dependncia do Spring-boot-starter,
volvimento, seja durante a operao da aplicao. atravs pois atravs deste starter que o logback adicionado no
das mensagens de log (em ficheiro ou no ecr) que podemos nosso projecto.
determinar o que realmente est a acontecer na nossa apli-
cao e mais rapidamente determinar a origem de qualquer <dependency>
problema. <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
Para o programador, muitas vezes a anlise do log </dependency>
fornece respostas que de outra forma seriam muito difceis
de obter. Uma vez que pretendemos excluir uma biblioteca que
por defeito este starter adiciona ao projecto, vamos adicionar
No caso de aplicaes cujo acesso remoto permitido, torna
uma excluso ficando ento este grupo com a seguinte reda-
-se tambm importante poder determinar quais os recursos
o:
acedidos, quando e por quem.
No nosso pequenssimo projecto vamos utilizar o log4J2, <dependency>
uma biblioteca extremamente madura que est debaixo da <groupId>org.springframework.boot
</groupId>
alada da Apache Software Foundation. Existem outras bibli- <artifactId>spring-boot-starter
otecas para o efeito, mas o log4J2 extremamente flexvel e </artifactId>
apresenta uma performance elevada mesmo em sistemas de <exclusions>
<exclusion>
uso intensivo.
<groupId>org.springframework.boot
No faz parte do mbito deste artigo aprofundar as </groupId>
capacidades desta biblioteca, que so imensas, e a quem <artifactId>spring-boot-
estiver interessado em aprofundar os seus conhecimentos starter-logging</artifactId>
aconselha-se a leitura do manual que pode ser encontrado </exclusion>
</exclusions>
em https://logging.apache.org/log4j/2.x/. A literatura pode ser </dependency>
intimidante, e dificilmente uma nica leitura da documenta-
o ser suficiente. A utilizao e compreenso do log4J De seguida, e sempre dentro da zona das dependn-
exige algum esforo e dedicao, mas o aumento de produti- cias do ficheiro pom.xml adicionamos a dependncia do star-
vidade que iremos obter sempre que necessitarmos de fazer ter que o Spring Boot disponibiliza para adicionarmos o lo-
algum tipo de debug nas nossas aplicaes compensa o g4j2 ao nosso projecto. Para isso basta adicionar as seguin-
tempo dedicado ao estudo da biblioteca. tes linhas.
Neste artigo iremos apenas abordar como podemos incluir o <dependency>
log4J2 no nosso projecto, como criar os ficheiros de configu- <groupId>org.springframework.boot
</groupId>
rao necessrios ao seu funcionamento e como gerar um <artifactId>spring-boot-starter-log4j2
ficheiro de log muito simples sobre o acesso nossa API. </artifactId>
</dependency>
Uma vez que o nosso projecto baseado em Maven,
por a que vamos comear, a fim de adicionarmos ao pro-
Em resumo, o que fizemos foi informar que pretenda-
jecto todas as dependncias necessrias.
mos excluir a biblioteca standard de log que o Spring boot
O framework Spring, suporta, de raiz, vrias bibliote- disponibiliza e incluir uma outra.
cas para servios de logging e na verso actual est dispon-
Aps adicionarmos a nova configurao pretendida
vel tambm um starter para o log4J2 o que nos simplifica
ao ficheiro pom.xml devemos grava-lo.
bastante a vida (afinal a simplificao o grande objectivo
do springbot), no entanto por defeito adicionado o logback, Como somos adeptos das boas prticas, o passo
e no esta a biblioteca que pretendemos utilizar aqui. seguinte imediatamente ordenar ao Spring Tool Suite que
15
A PROGRAMAR
API REST COM SPRING BOOT (PARTE 2)
atualize as nossas dependncias. Este ficheiro, no nosso caso, seguir uma semntica
XML, ir conter a seguinte informao
Podemos aceder ao menu do Maven, ou simplesmente
premir ALT+F5.
<?xml version="1.0" encoding="UTF-8"?>
Aps alguns instantes a biblioteca pretendida ser adicionada <Configuration>
<Properties>
ao projecto. <Property name="log-path">logs</Property>
</Properties>
<Appenders>
<Console name="Console-Appender"
target="SYSTEM_OUT">
<PatternLayout>
<pattern>
[%-5level] %d{yyyy-MM-dd
HH:mm:ss.SSS} [%t] %c{1} - %msg%n
</pattern>>
</PatternLayout>
</Console>
<File name="Api-File-Appender"
fileName="${log-path}/api_log.log" >
<PatternLayout>
<pattern>
%-5level %d [%t] %c:%M(%L): %
m%n
</pattern>
</PatternLayout>
</File>
<File name="SpringBoot-File-Appender"
fileName="${log-path}/spring_system_log.log" >
<PatternLayout>
<pattern>
%-5level %d [%t] %c:%M(%L): %
m%n
</pattern>
</PatternLayout>
</File>
</Appenders>
<Loggers>
<Logger name="org.springframework.web"
(pode verificar expandindo o grupo maven dependencies do level="info" additivity="false">
projecto, onde dever agora encontrar as bibliotecas do lo- <AppenderRef ref="SpringBoot-File-
g4J2) Appender"/>
<AppenderRef ref="Console-Appender"/>
Uma vez este processo concludo podemos ento co- </Logger>
<Logger name="pt.api.controllers"
mear a criar a configurao necessria para que o log4J2 level="info" additivity="false">
funcione como pretendemos. <AppenderRef ref="Api-File-Appender"/
>
Existem pelo menos 3 formas de configurar o log4j no <AppenderRef ref="Console-Appender"/>
Spring Boot. Podemos criar as configuraes no ficheiro appli- </Logger>
<Root>
cation.properties, podemos criar um ficheiro de configurao <AppenderRef ref="Console-Appender"/>
especfico, sendo que este ltimo nos permite um grau de con- </Root>
figurao bastante superior que o primeiro mtodo, e ainda </Loggers>
podemos criar a configurao programaticamente atravs de </Configuration>
classes. Vamos agora analisar algumas particularidades deste
ficheiro de configurao. Podemos encontrar algumas sec-
No nosso caso iremos utilizar um ficheiro de configura- es que destacamos, as Properties, os Appenders e os
o. Um facto importante que este ficheiro de configurao Loggers.
tem de residir no local correto do projecto. Se usarmos as con-
figuraes padres do framework, esse local ser a pasta src/ Na seco properties podemos criar pares do tipo
main/resources. chave/valor que ficam disponveis para utilizao em outras
seces do ficheiro. Neste caso apenas utilizamos uma cha-
Vamos ento criar um novo ficheiro na localizao refe- ve a que demos o nome log-path e qual atribumos o valor
rida, e vamos dar a esse ficheiro o nome de log4j2.xml. (nas logs (queremos que os nossos logs sejam criados numa
configuraes padro este nome obrigatrio, e a utilizao de pasta com o nome logs). Isto ir permitir que em todas as
outro nome ir gerar um erro, em que o STS ir indicar que no outras seces do ficheiro podemos usar o nome log-path e
encontra o ficheiro de configurao). Em alternativa pode-se ele ir ser substitudo pelo valor logs.
esquematizar o ficheiro de configurao usando Json ou Yaml,
mas a ideia semelhante. A seco Appenders permite-nos definir as possveis
formas de sada para os loggers. Criamos appenders para a
consola (console) e para ficheiro (file). No caso do logger
16
A PROGRAMAR
17
A PROGRAMAR
API REST COM SPRING BOOT (PARTE 2)
HttpServletResponse response,@PathVariable }
(value = "id") String id) throws Exception {
// verificao do ID ClienteEntity cliente =
logger.info("Classe: " + this.getClass(). clienteRepository.pesquisaPorNIF(nif);
getName() + " ,Mtodo :" return cliente;
+ Thread.currentThread().getStackTrace() }
[1].getMethodName() + " ,URL :" + // EndPoint #4
request.getRequestURI()+ " ,parametros : " +
request.getQueryString() + ",IP Origem :" @RequestMapping(value = "/api/v1/cliente/
+ request.getRemoteAddr()); save", method = RequestMethod.POST, con-
int idCliente = 0; sumes = MediaType.APPLICATION_JSON_VALUE,
try { produces = Medi-
idCliente = Integer.parseInt(id); aType.APPLICATION_JSON_VALUE)
} catch (Exception ex) {
response.sendError public int saveCliente(HttpServletRequest
(HttpStatus.BAD_REQUEST.value()); request, HttpServletResponse response,
return null; @RequestBody ClienteEntity cliente) throws
} Exception {
// Fetch de um cliente por ID
ClienteEntity cliente = logger.info("Classe: " + this.getClass().
clienteRepository.findOne(idCliente); getName() + " ,Mtodo :"
if (cliente == null) { + Thread.currentThread().getStackTrace()
response.sendError [1].getMethodName() + " ,URL :" + re-
(HttpStatus.NOT_FOUND.value()); quest.getRequestURI() + " ,parametros : "
return null; + request.getQueryString() + ",IP Ori-
} else { gem :" + request.getRemoteAddr());
return cliente;
} if (cliente.getId() != null) {
} response.sendError
(HttpStatus.METHOD_NOT_ALLOWED.value());
// EndPoint #2 }
@RequestMapping(value = "/api/v1/cliente/
all", method = RequestMethod.GET, produces = try {
MediaType.APPLICATION_JSON_VALUE) clienteRepository.save(cliente);
} catch (Exception ex) {
public ResponseEnti- response.sendError
ty<Collection<ClienteEntity>> getAllClientes (HttpStatus.BAD_REQUEST.value());
(HttpServletRequest request, HttpS- }
ervletResponse response) {
logger.info("Classe: " + this.getClass(). return HttpStatus.CREATED.value();
getName() + " ,Mtodo :" }
+ Thread.currentThread().getStackTrace()
[1].getMethodName() + " ,URL :" + re- // EndPoint #5
quest.getRequestURI()
+ " ,parametros : " + request.getQueryString @RequestMapping(value = "/api/v1/cliente/
() + ",IP Origem :" + request.getRemoteAddr update", method = RequestMethod.PUT, con-
()); sumes = MediaType.APPLICATION_JSON_VALUE,
produces = Medi-
Collection<ClienteEntity> clientes = aType.APPLICATION_JSON_VALUE)
clienteRepository.findAll();
return new ResponseEntity<Collection public int updateCliente(HttpServletRequest
<ClienteEntity>>(clientes, HttpStatus.OK); request, HttpServletResponse response,
} @RequestBody ClienteEntity cliente) throws
Exception {
// EndPoint #3
@RequestMapping(value = "/api/v1/cliente", logger.info("Classe: " + this.getClass().
method = RequestMethod.GET, produces = Medi- getName() + " ,Mtodo :"
aType.APPLICATION_JSON_VALUE) + Thread.currentThread().getStackTrace()
[1].getMethodName() + " ,URL :" + re-
public ClienteEntity getByClienteNIF quest.getRequestURI()
(HttpServletRequest request, HttpServletResponse + " ,parametros : " + re-
response,@RequestParam(value = "nif") String nif) quest.getQueryString() + ",IP Origem :" +
throws Exception { request.getRemoteAddr());
logger.info("Classe: " + this.getClass(). // verificar se no nulo e se existe
getName() + " ,Mtodo :" if (cliente.getId() == null ||
+ Thread.currentThread().getStackTrace() clienteRepository.findOne(cliente.getId())
[1].getMethodName() + " ,URL :" + re- == null) {
quest.getRequestURI() + " ,parametros : " + response.sendError
request.getQueryString() + ",IP Origem :" + (HttpStatus.NOT_FOUND.value(), "Erro de ID");
request.getRemoteAddr()); return 0;
}
if (!nif.matches("[0-9]+") && nif.length()
!= 9) { try {
response.sendError clienteRepository.save(cliente);
(HttpStatus.BAD_REQUEST.value()); } catch (Exception ex) {
return null; response.sendError
18
A PROGRAMAR
19
A PROGRAMAR
API REST COM SPRING BOOT (PARTE 2)
No gestor de ficheiros, navegue at pasta onde est o Podemos executa-lo imediatamente atravs do co-
seu projecto. A pasta deve ter um contedo semelhante ao da mando java -jar apitutorial-1.0.0.jar. (certifique-se que o
imagem, e abra uma linha de comandos nesse local. servidor do Spring tool suite est parado).
Nesta pasta tudo o que tem a fazer digitar o comando Se tudo tiver corrido bem, dever visualizar o arran-
mvn clean package seguido de ENTER e aguardar que o Ma- que do Spring e passado alguns segundos a sua API est
ven trate de baixar todas as dependncias necessrias que em funcionamento e acessvel a partir de qualquer computa-
ainda no estejam no seu computador e de as empacotar. dor da sua rede, a pasta log ser criada e todos os logs se-
ro registados.
Quando o processo terminar dever visualizar uma
mensagem de BUILD SUCCESS. De seguida verifique a pasta No caso de estar a usar um servidor LINUX, o comando para
target e nela dever encontrar 2 ficheiros. Um dever ter a iniciar o mesmo, s dever ter em ateno as permisses
extenso .jar e outro a extenso .original. O ficheiro que quere- das pastas.
mos o que termina em jar. Se seguiu todos os passos como
descrevemos desde o incio, esse ficheiro dever ter o nome
apitutorial-1.0.0.jar, caso contrrio ter o nome que lhe tiver
atribuido.
AUTOR
Escrito por Jos Martins
Natural do Porto, autodidata. Iniciou-se no mundo das tecnologias com um Sinclair ZX-81 onde aprendeu a programar em
basic e assembler. Ao longo de 25 anos ligados s tecnologias, passou por quase todas as linguagens de programao, at
que decidiu assentar praa com JAVA. Atualmente trabalha na PJ Silva Lda, onde desenvolve projetos ligados monitoriza-
o do ensino prtico da conduo automvel. (josetabordamartins@gmail.com).
20
A PROGRAMAR
No artigo anterior dei uma breve introduo sobre como Defining the application layout
programar com JavaFX, conceitos simples que permite come-
Em mdia, cada controlo JavaFX (checkbox, label, etc) tem
ar a desenvolver aplicaes grficas. Neste artigo vou explo-
quatro linhas de cdigo:
rar outros temas interessantes do ponto de vista de desenvol-
vimento e de manuteno de projetos de software com interfa- Instanciar um novo objeto.
ces grficas de desktop.
Definir o seu id.
Ao longo da minha carreira j desenvolvi e participei em
projetos de software de raiz, mas grande parte dela foi a man- Definir o seu comprimento
ter e a melhorar aplicaes legacy, e deixem-me que diga que
existem programadores muito imaginativos J. Um dos temas Definir a sua altura
que mais urticria me causa o facto de o software desenvol-
E depois mais umas quantas linhas para afetar o
vido no poder ser mantido com facilidade, e ao ripple effects
layout (Pane), configurar a Scene e o Stage.
das alteraes simples que so realizadas.
No entanto em cada controlo pode-se personalizar
Como mencionei no artigo anterior, devido necessida-
ainda mais. No caso do controlo textField pode-se definir a
de de alterar uma aplicao em Java Swing, essa mesma alte-
fonte, o seu tamanho, as linhas de contorno da caixa, a cor,
rao no se mostrou nada fcil de realizar, levando-me a pro-
etc.
curar alternativas e migrar para JavaFX. No artigo anterior abri
a porta tecnologia e o que foi apresentado no difere muito Porm o procedimento aborrecido e se pretender
do Java Swing, pelo que pode ser confuso a razo para a alte- atribuir a mesma personalizao para um conjunto de textFi-
rao. elds (ex: 20 caixas de texto).
Quando andei a investigar, o que estava procura era No fim do dia possvel ter umas boas centenas de
um modelo de desenvolvimento que me permitisse definir a linhas com cdigo repetido, montono e que se comea a
interface grfica em separado da lgica da aplicao, ou seja, perspetivar difcil de manter quando se comear a trabalhar
um modelo Model-View-Controller semelhana do que existe com os event handlers. A soluo no coesa ou mesmo
para aplicaes web, ou mesmo para a plataforma Android. E desacoplada e muito menos fcil de manter.
JavaFX tem mesmo o que estava procura e sobre isso que
Styling the application
venho falar.
Com o JavaFX veio algo muito fixe, a separao entre
Antes de comear
a definio da interface grfica e a sua estilizao. E con-
Antes de comear recomendado instalar alguns com- seguida atravs de um ficheiro CSS, sim um simples ficheiro
ponentes. No porque obrigatrio ou necessrio (mesmo) de CSS, semelhana do que usado em pginas web.
mas sim porque auxilia (e muito o desenvolvimento).
necessrio o JDK para ter o JavaFX:
Tal como em HTML, aqui existem as classes e os ids.
JDK 7 update 6: com JavaFX 2.2 As classes identificam o estilo a aplicar a um controlo que
tenha aquela classe ou definir por omisso o estilo de um
JDK 8: com JavaFX 8 controlo. Para os ids o estilo atribudo ao controlo que te-
nha aquele id e nico.
Para quem usa um IDE baseado em Eclipse deve insta-
lar este plugin: Hello World CSS
e(fx)clipse: http://bit.ly/e-fx-clipse Neste breve exemplo, vai ser demonstrado como usar
o CSS na aplicao.
Este plugin incorpora um conjunto de funcionalidades ao IDE
que facilitam o desenvolvimento e publicao dos projetos @Override
JavaFX. public void start(Stage primaryStage)
throws Exception {
// Stage Title
primaryStage.setTitle("Hello World");
Existe outra ferramenta da Oracle que deve ser instalada:
// Begin Scene definition
Scene Builder: http://bit.ly/JavaFX_Scene_Builder Label helloLabel1 = new Label();
helloLabel1.setText("Hello World!");
A ferramenta permite desenhar as interfaces grficas helloLabel1.setId("helloLabel1");
com simples drag-and-drop, configurar eventos etc. Label helloLabel2 = new Label();
helloLabel2.setText("Hello World!");
helloLabel2.setId("helloLabel2");
21
A PROGRAMAR
JAVAFX: PASSOS SEGUINTES
.add(getClass()
Label helloLabel3 = new Label(); .getResource("HelloWorld.css")
helloLabel3.setText("Hello World!"); .toExternalForm());
helloLabel3.setId("helloLabel3"); A partir deste momento, todos os estilos definidos no
CSS esto disponveis na aplicao. O resultado pode ser
VBox vboxPane = new VBox();
vboxPane.getChildren().addAll( visto na Figura 2.
helloLabel1,
helloLabel2,
helloLabel3);
vboxPane.setAlignment(Pos.CENTER);
.label{
-fx-border-color: #3633FF;
-fx-border-width: 3px;
-fx-padding: 10px;
}
22
A PROGRAMAR
Porm comum que apenas um conjunto de controlos De uma forma muito simples foi possvel separar a
tenham um dado estilo, por isso criamos uma classe especifica definio dos estilos e a sua personalizao do cdigo java
para o efeito. em si. No entanto, esta separao no suficiente.
.label-mine{ Hello World - FXML
-fx-border-color: #FF3364;
-fx-border-width: 5px; JavaFX trs outra particularidade fantstica, a possi-
-fx-font-size: 9px; bilidade de descrever em XML toda a interface grfica. O
}
prximo exemplo descreve o mesmo exemplo mas em
FXML.
E no controlo definimos qual a classe que ele usa
Assumindo foi instalado o plugin do e(fx)clipse, criar
Label helloLabel1 = new Label(); um projeto to simples como File -> New -> JavaFX Project
helloLabel1.setText("Hello World!"); e preencher os formulrios. No formulrio da Figura 6, na
helloLabel1.setId("helloLabel1");
helloLabel1.getStyleClass() combo box language escolher FXML. E ser criada uma
.add("label-mine"); estrutura semelhante Figura 7.
E obtm-se o resultado da Figura 4:
#helloLabel3{
-fx-border-color: #7B241C;
-fx-border-width: 2px;
-fx-font-size: 28px;
-fx-background-color: #F5B7B1;
-fx-text-fill: #873600;
}
E o seu resultado na Figura 5:
23
A PROGRAMAR
JAVAFX: PASSOS SEGUINTES
Muito simples, carrega o xml com a definio da UI, o Figura 8: FXML Output
ficheiro de estilos e mostra a janela. Nada de muito relevante a
Controllers
dizer.
Como mencionei, o ficheiro de Controller acaba por
O ficheiro de estilos vou utilizado o mesmo contedo do
ser o ficheiro de gesto e tratamento de eventos.
exemplo anterior.
Uma vez que um ficheiro FXML s tem um nico Con-
J o ficheiro FXML requer mais ateno. O exemplo a
troller, os atributos podem ter visibilidade pblica. Porm, na
seguir representao em XML do que foi descrito em cdigo
minha opinio, a visibilidade deve ser mais restrita e coloca-
em exemplos anteriores:
se a anotao @FXML. Para mim, torna o cdigo mais leg-
<?xml version="1.0" encoding="UTF-8"?> vel.
24
A PROGRAMAR
Simples e eficaz J
@Override
public void initialize( Concluso
URL location,
ResourceBundle resources) A partir de agora uma questo de tornar as aplica-
{ es mais funcionais e a satisfazer as necessidades.
// TODO Auto-generated method stub
} JavaFX demonstrou-se ser uma agradvel surpresa,
com as suas componentes MVC que ajudam a simplificar e a
@FXML
public void clickButtonEvent() { manter as aplicaes. A separao da aplicao em trs
Date date = new Date(); camadas (estilos/css, FXML/UI, Controller/Event Handler)
helloLabel1.setText(date.toString()); tornou-se um thumbs-up para mim, tornando o cdigo da
}
} aplicao bastante legvel e simptica de se manter.
Depois de se dominar o FXML (e s depois mesmo),
recomendo a utilizao do SceneBuilder para acelerar o de-
senvolvimento da UI.
Referncias
http://www.oracle.com/technetwork/java/
javase/downloads/javafxscenebuilder-info-
2157684.html
https://dominiks.gitbooks.io/javafx/content/
i18n/fxmlbundles.html
http://www.javafxtutorials.com/tutorials/
switching-to-different-screens-in-javafx-and-
fxml/
https://docs.oracle.com/javase/8/javafx/user-
Figura 9: FXML with Controller interface-tutorial/
https://docs.oracle.com/javase/8/javafx/api/
https://docs.oracle.com/javase/8/javafx/get-
started-tutorial/
http://docs.oracle.com/javase/8/javafx/layout-
tutorial/index.html
http://code.makery.ch/library/javafx-8-tutorial/
AUTOR
Escrito por Nuno Cancelo
Curioso por natureza e engenheiro informtico por formao. Desde muito cedo me despertou o interes-
se pelos computadores e informtica com o famoso Spectrum. Tenho um gosto peculiar por aprender
novas coisas frequentemente mesmo que no venha a trabalhar com elas e optimizar os sistemas au-
mentando a sua performance.
25
A PROGRAMAR
Um bot para Telegram com o Jogo da velha (Jogo do Galo).
26
A PROGRAMAR
Uma vez com a tela de chat aberta com o BotFather, o novo link para aceder ao nosso bot pela web. No meu
digitamos o comando: caso, o bot chama-se velha_bot. O que procuramos a
chave para aceder API. Neste caso, a chave para novo bot
/newbot ser mostrada aps: Use this token to access the HTTP
API. Eu pintei minha chave de preto, mas dever aprecer
No nos podemos esquecer de digitar Enter no fim da
uma string com nmeros e letras. Copiamos esta linha e
linha.
guardamso num local seguro pois vamos precisar da chave
para poder usar a API. A chave parece-se com:
934802948:AODJcjoijcijaoAISDJoiajdoaijAzcWFIS
Pronto, acabamos de criar nosso bot. Agora
precisamos de um programa para traz-lo vida!
Criao do bot
Vamos comear por fazer o download do bot que
desenvolvi para este artigo. O cdigo fonte est disponvel
no GitHub. necessrio ter o git e o Python 3.6 instalados
na mquina para continuar.
27
A PROGRAMAR
UM BOT PARA TELEGRAM COM O JOGO DA VELHA (JOGO DO GALO).
e corremos o bot com: O bot responde e pergunta com qual nvel de dificul-
dade desejamos jogar. Fcil completamente aleatrio, o
python velha.py
computador vai simplesmente preencher uma posio vazia.
Pronto, o bot j deve estar a correr! Mdio e Difcil usam um algoritmo simples, mas muito inte-
ressante do qual vamos falar depois. Eu sugiro que escolha-
Vamos test-lo. Usamos a pesquisa do Telegram e pro-
mos Difcil.
curamos pelo nome do bot. No meu caso @velha_bot, mas
cada um pode substituir pelo nome do seu bot! O bot ento pergunta se queremos comear a jogar
(X) ou se queremos jogar depois do computador (O).
28
A PROGRAMAR
loop = asyncio.get_event_loop()
29
A PROGRAMAR
UM BOT PARA TELEGRAM COM O JOGO DA VELHA (JOGO DO GALO).
passando jogo.stats(loop). Aqui as coisas comeam a ficar O loop fica espera de eventos e executando as co-
diferentes de um programa tradicional. O mtodo jogo.stats rotinas que configurmos. No caso do bot, ele
uma co-rotina e no executado ao ser chamado. Na realida- periodicamente acede aos servidores do Telegram para
de, ele cria uma co-rotina que pode ser chamada pelo loop. O saber se h novas mensagens. Quando uma mensagem
cdigo um pouco diferente de um mtodo normal em Python. chega, ele chama jogo.chat_handler:
O mtodo stats est na linha 386:
async def chat_handler(self, msg):
async def stats(self, loop): """Processa o chat vindo do utilizador"""
"""Imprime estatsticas e limpa jogos content_type, chat_type, chat_id =
antigos""" telepot.glance(msg)
while True: logger.debug(f"Content_type:
jogadas = len(self.jogadas) {content_type} Chat type: {chat_type} Messge:
logger.info(f"Jogadas em memria: {msg}")
{jogadas}") jogo = self.pega_jogo(msg)
self.jogadas.limpa_antigas() await self.reply_markup(jogo, chat_id)
await asyncio.sleep(60, loop=loop)
Vejamos que o mtodo chat_handler foi definido com
Vejamos que ele definido com async def e no com async def, sendo uma co-rotina. Ele simplesmente recebe a
apenas def! esta mudana que faz com que este mtodo mensagem do telegram, que um grande dicionrio com
possa ser chamado pelo loop de forma assncrona. O resto do vrias informaes sobre a mensagem como: o texto da
cdigo praticamente normal, exceto a ltima linha: mensagem, quem a enviou, em que chat, quando foi
enviada, etc.
await asyncio.sleep(60, loop=loop)
O mdulo telepot tem algumas rotinas que ajudam a
Aqui aparece outra novidade, await. esta contruo trabalhar com este dicionrio, como a glance que extrai o
que torna o nosso bot assncrono especial. Quando usamos tipo do contedo, o tipo de chat e o chat_id que
await, pedimos ao loop para parar nossa co-rotina atual (criada necessitamos para responder uma mensagem.
com async def) para executar uma outra co-rotina, no caso
Quando bot chama chat_handler, ele no controla
asyncio.sleep que espera 60 segundos para retornar. impor-
nosso jogo em si, ou seja, no sabe que utilizador enviou a
tante notar que usamos o sleep de asyncio, pois time.sleep
mensagem, mas que o bot recebeu uma mensagem. O que
no uma co-rotina compatvel com o loop e se a utilizarmos,
fazer com a mensagem uma responsabilidade do nosso
todo o programa ir parar enquanto esta no retornar.
programa. Como podemos ter vrios jogos ao mesmo tempo,
Com await, pedimos a execuo de asyncio.sleep. O criamos um dicionrio com as jogadas. Cada mensagem tem
loop ento pra a execuo de stats, chama asyncio.sleep e um user_id de origem e este nmero identifica cada
volta para stats quando esta terminar. A vantagem que asyn- utilizador de Telegram de forma nica (mesmo que ele mude
cio.sleep no pra o loop, deixando-o livre para executar ou- de nome ou de handle). Desta forma, usando o user_id
tras co-rotinas. E nosso cdigo continua simples, como se esta como chave, podemos obter o jogo daquele utilizador. A
quebra de execuo no tivesse acontecido. biblioteca Telepot tem classes muito interessantes que
ajudam a manter o contexto por utilizador ou por chat, estas
A etapa seguinte a configurao do bot para chamar
classes no foram utilizadas neste exemplo, consulte a
mtodos do jogo ao receber uma mensagem ou uma resposta
documentao para mais informaes.
(click dos botes):
Chamamos ento a reply_markup, passando o jogo e
loop.create_task(bot.message_loop({'chat': o chat_id da mensgem para que o bot gere uma resposta:
jogo.chat_handler,
'callback_query': jogo.callback_query}))
async def reply_markup(self, jogo,
Da mesma forma que fizmos com o jogo.stats, vamos chat_id=None):
criar uma co-rotina que ser chamada mais tarde pelo loop. """Dependendo do estado atual do jogo,
Neste caso, passamos um dicionrio com os mtodos que que- retorna as opes disponveis"""
if jogo.tela == 0:
remos chamar quando uma mensagem de chat for recebida e markup = jogo.nivel_de_dificuldade()
para callback_query. Neste caso, a callback_query a respos- mensagem = 'Jogo da Velha - Escolha o
ta que o telegram envia quando clicamos nos botes do jogo. nvel de dificuldade'
elif jogo.tela == 1:
Depois disso, deixamos o loop controlar o nosso progra- markup = jogo.tipo_jogador()
ma: mensagem = 'X sempre joga primeiro.
Voc quer jogar como X ou O?'
elif jogo.tela == 2:
try: markup = jogo.constroi_grelha()
loop.run_forever() mensagem = jogo.mensagem or 'Jogo da
except KeyboardInterrupt: Velha'
pass if jogo.message is None and chat_id is
not None:
A execuo fica dentro de loop.run_forever(), at que a message = await self.bot.sendMessage
paremos com Control+C. (chat_id, mensagem, reply_markup=markup)
30
A PROGRAMAR
31
A PROGRAMAR
UM BOT PARA TELEGRAM COM O JOGO DA VELHA (JOGO DO GALO).
Quando estamos na tela 2 e recebemos um nmero, Utilizada para calcular a jogada do computador.
significa que o utilizador clicou na grelha. A grelha do jogo da
velha foi organizada em 9 posies, numeradas de 1 a 9. Co- O Estado contm a grelha como uma lista de
strings.
mo Python indexa a partir do zero, transformamos esta respos- Espao significa que a posio est livre.
ta num nmero inteiro e subtramos 1 para termos o ndice X ou O que o jogador j marcou esta posio.
respectivo ou a posio que ele jogou.
Grelha
Se observarmos o cdigo fonte, veremos que o estado ndices Posies
0 1 2 1 | 2 | 3
de cada jogo guardado numa lista de strings com nove ele- ---+---+---
mentos. Cada elemento representa uma posio da grelha. Um 3 4 5 4 | 5 | 6
espao em branco para posies vazias, X ou O se um dos ---+---+---
jogadores j marcou aquela posio anteriormente. 6 7 8 7 | 8 | 9
"""
Quando chamamos jogo.joga(posicao, jogo.jogador), GANHANTES = [set(x) for x in [(0, 1, 2), (3, 4,
5), (6, 7, 8),
pedimos que seja realizada uma nova marcao. Este mtodo (0, 4, 8), (6, 4,
retorna False se o utilizador j marcou esta posio e o cdigo 2),
gera uma mensagem de erro: (0, 3, 6), (1, 4,
7), (2, 5, 8)]]
await self.bot.answerCallbackQuery(query_id,
text='Escolha outra posio') def __init__(self, estado=None):
"""estado: estado inicial. Default:
branco"""
self.estado = estado or [" "] * 9
Vejamos que answerCallbackQuery mostra apenas um
overlay no Telegram e no altera a nossa mensagem em si. def jogadas_possiveis(self):
Experimentemos tentar jogar duas vezes na mesma posco """Onde podemos jogar?"""
return posicoes_de(self.estado, " ")
para ver o efeito. Vamos usar este mtodo para enviar
mensagens importantes ao utilizador, especialmente def posicoes_por_jogador(self):
mensagens de erro. """Retorna uma tupla com as posies do
jogador X e do jogador O"""
Em jogo.verifica_jogada, testamos se o jogo acabou e return (posicoes_de(self.estado, "X"),
posicoes_de(self.estado, "O"))
retornamos a nova grelha.
Este o mecanismo geral do jogo. Vejamos um pouco def ganhou(self, posicoes, jogador):
"""Verifica se um dos jogadores ganhou a
como que fizmos o computador jogar. jogada"""
s = set(posicoes)
E o computador Joga Velha for p in Velhus.GANHANTES:
if len(p - s) == 0:
O jogo da Velha muito simples e seria muito chato ter return True
que procurar outro jogador para uma jogada. Vejamos como return False
fazer o computador jogar. Usando uma tcnica chamada
def joga(self, posicao, jogador):
Minimax (https://pt.wikipedia.org/wiki/Minimax). Uma excelente """Joga pelo jogador em um posio
explicao deste algoritmo para resolver o jogo da velha pode especfica"""
ser encontrada em portugus aqui: http://www.maawko.com/ if self.estado[posicao] == " ":
blog/freecodecamp/jogo-da-velha-entendendo-o-algoritimo- self.estado[posicao] = jogador
else:
minimax/ raise ValueError(f"Posio({posicao})
invlida.")
O artigo original em Ingls pode ser lido aqui: (http://
neverstopbuilding.com/minimax). def resultado(self):
jX, jO = self.posicoes_por_jogador()
Infelizmente, o autor escreveu a soluo usando Ruby if self.ganhou(jX, "X"):
(brincadeira) e no em Python. return("X") # X Ganhou
elif self.ganhou(jO, "O"):
O mtodo consiste em gerar as jogadas possveis para return("O") # O Ganhou
elif not self.jogadas_possiveis():
cada jogador, a partir das posies ainda livres. Depois disso, return("*") # Empate sem resultado
verificamos o resultado caso jogssemos naquela posio, else:
ser que ganhamos? Perdemos? Ou empatamos? A ideia return("?") # Inconclusivo
geral atribuir um certo nmero de pontos quando ganhamos
@staticmethod
e o inverso deste nmero para o jogador oponente. def alterna(jogador):
"""Inverte o jogodor atual. X --> O e O -->
Este trabalho feito pela classe Velhus, definida na X"""
Linha 24: return "X" if jogador == "O" else "O"
32
A PROGRAMAR
33
A PROGRAMAR
UM BOT PARA TELEGRAM COM O JOGO DA VELHA (JOGO DO GALO).
melhores_jogadas = [] cresce todo dia. Base de dados, sites, rede, tupo j pode ser
melhor = self.melhor(result, jogador) acedido de forma assncrona.
for posicao, resultado in result.items():
if resultado == melhor: # Se esta
posio tem o melhor score
melhores_jogadas.append(posicao)
return melhores_jogadas
Aplicamos novamente o mtodo melhor para filtrar a A criao do bot
melhor jogada. A diferena que o mtodo melhor_jogada
suporta vrias posies com o mesmo resultado, ou seja, feita atravs de uma
vrias posies onde o resultado igual ao mximo. As
melhores jogadas so retornadas e o computador
simplesmente escolhe uma delas aleatoriamente.
conversa com o
BotFather.
Os bots so peque-
nos programas que po- Escrever bots divertido, podem ver um outro bot
que escrevi usando a biblioteca Telebot no GitHub: https://
AUTOR
Escrito por Nilo Menezes
34
A PROGRAMAR
35
A PROGRAMAR
AUTOMAO DO AZURE COM WINDOWS POWERSHELL
Vai ser utilizado o modelo ARM que introduz uma abor- ria para o sistema;
dagem para a gesto de recursos do Azure. As instncias de
servio so referidas como recursos, que podem ser armaze- Install-Module: Instala os itens da galeria;
nados em grupos de recursos, onde os servios podem ser
Publish-Module e Publish-Script: Faz o upload do
criados, geridos, acompanhados, ou podemos excluir todos os
item para galeria;
servios simultaneamente. Tudo isto permite uma gesto em
grupo em que podem monitorizar-se os servios em grupo e Register-PSRepository : Adiciona um repositrio
determinar a taxa de faturao ou recursos de servios indivi- customizado.
duais.
Para instalar os mdulos execute os seguintes
Antes de iniciar a criao do script necessrio instalar cmdlet, o sinal # representa um comentrio no script, um
primeiro os mdulos do Azure no PowerShell, que uma cole- conjunto de comentrios inicia com <# e termina com #>
o de dois mdulos Windows PowerShell que podem ser utili- todos os comentrios esto em escritos em ingls para nor-
zados para gerir servios do Azure. O mdulo mais comum malizao do script.
Service Management este permite gerir servios de instncias
no Azure. A seguinte imagem mostra alguns dos componentes # Install Azure Resource Manager module/cmdlet
contidos no Azure PowerShell Install-module AzureRM
# Install Azure Classic module/ cmdlet
Install-module Azure
<#
+----------------------------------------------+
| This is a security change to your system in |
Alguns dos componentes do Azure PowerShell | order to execute local scripts. |
+-----------------------------------------------+
Pode instalar-se os mdulos do Azure de duas formas: #>
# Administrator
Instalao Grfica em https://Azure.microsoft.com/pt-pt/ Set-ExecutionPolicy -Scope Process -
downloads/ na seco PowerShell selecione Instalao ExecutionPolicy Bypass
# Current User
para Windows. Set-ExecutionPolicy -ExecutionPolicy ByPass -
Scope CurrentUser
Instalao manual execute uma linha de comandos do <#+---------------------------------------------+
Microsoft Windows, Windows PowerShell ou Windows | To reset the permissions back to default run
the following. |
PowerShell ISE para todas estas opes recomenda- +-----------------------------------------------+
do executar com privilgios administrativos. Para insta- #>
lar um mdulo utiliza-se o cmdlet Install-Module. # Administrator
Set-ExecutionPolicy -Scope Process -
Um mdulo pode ser instalado de duas formas: ExecutionPolicy Default
# Current User
Se for instalado por uma conta de administrador o m- Set-ExecutionPolicy -ExecutionPolicy Default -
Scope CurrentUser
dulo fica disponvel para todos os utilizadores e fica
instalado em [Unidade de disco local]:\Program Fi-
les\WindowsPowerShell\Modules. Com a instalao concluda j pode fazer operaes
no Azure com PowerShell e partir daqui que inicia o script
Se um utilizador no tiver privilgios administrativos de automao.
pode instalar um mdulo no seu perfil da mquina local
Antes de iniciar qualquer operao no Azure neces-
Install-Module AureRM -Scope CurrentUser. A partir do
srio fazer autenticao no servio com o cmdlet Add-
Windows 7 os mdulos ficam guardados em [Unidade
AzureRmAccount. Vai aparecer uma janela do navegador de
de disco local]:\Users\[Nome do utilizador]
internet para introduzir as credenciais da sua conta.
\Documents\WindowsPowerShell\Modules.
<#
Alm de poder instalar mdulos tambm pode remover e pes- +-----------------------------------------------+
quisar outros cmdlest disponveis: | Login Azure Resource Management |
+-----------------------------------------------+
Find-Script: Procura itens na galeria do Microsoft Po- #>
werShell (https://www.powershellgallery.com/); # -- Login Azure RM --
Add-AzureRmAccount
Save-Module e Save-Script: Guardar os itens da gale-
36
A PROGRAMAR
<#
+-----------------------------------------------+
| Resource Group |
+-----------------------------------------------+
#>
# -- Set the Location --
$Location = "NorthEurope"
# -- Create Resource Group --
cmdlet Add-AzureRmAccount $ResourceGroup = "PSPTLAB"
New-AzureRmResourceGroup -Name $ResourceGroup -
Aps a autenticao se tiver mais que uma subscrio Location $Location -Verbose
na sua conta necessrio selecionar a subscrio em que
pretende trabalhar. Como qualquer linguagem de programao
possvel definir variveis em PowerShell e so definidas co-
mo $NomeDaVariavel = Valor da Varivel por exemplo a
identificao da sua subscrio do Azure HDJDNHDWN
ento devia alterar a varivel $SubscriptionId = Your Subs-
criptionId para $SubscriptionId = HDJDNHDWN antes de
selecionar a subscrio.
# -- Select the subscription Azure--
$SubscriptionId = Your SubscriptionId
Select-AzureRmSubscription -SubscriptionId
$SubscriptionId
cmdlet New-AzureRmResourceGroup
Com o resource group criado podem adicionar-se os
servios. O primeiro a ser criado storage account (conta de
armazenamento) que uma das peas fundamentais num
sistema em nuvem sem um sistema de armazenamento no
consegue armazenar os registos dos servios, disco rgido
virtual de uma mquina virtual, ficheiros, e muito
mais. Ateno que no existe armazenamento ilimitado
at na nuvem h limites. Em todos os servios obrigatrio
a sua identificao e para grande parte a localizao geogr-
fica tambm necessria. Para alm destes existem vrios
nveis de servios no Azure identificado por Specific Pricing
Tier or Stock Keeping Unit (SKU) necessrio selecionar o
tipo de armazenamento que se pretende pode consultar as
cmdlet Select-AzureRmSubscription -SubscriptionId diferenas em https://Azure.microsoft.com/pt-pt/pricing/
details/storage/blobs/ o mais econmico Locally Redundant
O primeiro servio que temos de criar no Azure grupo Storage (LRS), este que vou utilizar. Para criar a conta
de resource group (grupo de recursos). Um resource group utiliza-se o cmdlet New-AzureRmStorageAccount, mas an-
um contentor de servio numa subscrio que permite tes de o fazer deve verificar-se se a identificao est a ser
armazenar os vrios servios no Azure. A vantagem que utilizada por outra pessoa com o cmdlet Get-
pode ter vrios resource groups separados pelo tipo de servi- AzureRmStorageAccountNameAvailability. A verificao
os. Por exemplo pode ter um resource group apenas para importante porque a identificao a conta nica em todo o
rede virtual um para desenvolvimento e outro para produo. universo do Azure porque pode aceder a sua conta de arma-
Isto permite separao da manuteno dos servios. Tudo o zenamento por um endereo de internet.
que fizer no resource group de desenvolvimento no vai afetar
a produo e pode definir administradores para gerir a rede <#
virtual sem que tenha acesso a outros resource groups. +-----------------------------------------------+
| Storage Account |
+-----------------------------------------------+
37
A PROGRAMAR
AUTOMAO DO AZURE COM WINDOWS POWERSHELL
<# # -- Create a Instance-level public IP address
+--------------------------------------------+ (PIP) for Network interface controller (NIC) --
| Storage Account | $PublicIp = New-AzureRmPublicIpAddress -Name
+--------------------------------------------+ "PIP" -ResourceGroupName $ResourceGroup -Location
#> $location -AllocationMethod Dynamic
# -- Set the Storage Account Name and Sku --
$StorageAccountName = "psptlabstorageaccount"
$StorageSkuName = "Standard_LRS" #Specific Pricing
Tier or Stock Keeping Unit (SKU)
# -- Verify is the name is available --
# Get-AzureRmStorageAccountNameAvailability $Stora-
geAccountName
# -- Create Storage Account --
$StorageAccount = New-AzureRmStorageAccount
-ResourceGroupName $ResourceGroup -Name cmdlet New-AzureRmPublicIpAddress
$StorageAccountName -SkuName $StorageSkuName
-Location $Location -Verbose Agora pode criar a placa de rede com o cmdlet New-
AzureRmNetworkInterface necessrio definir a identifica-
o do endereo pblico.
cmdlet New-AzureRmStorageAccount
Com o armazenamento criado vai ser criado a rede vir-
tual e gama de endereos para comunicao com os servios,
a placa de rede para a mquina virtual que est na rede virtual cmdlet New-AzureRmNetworkInterface
criada e o endereo pblico para a mquina virtual que defi-
Com a rede virtual criada pode criar a mquina virtual,
nido na placa de rede.
a criao da mesma depende todos os servios anteriores
Para criar a rede virtual necessrio primeiro criar o sem os quais no funciona. O Azure disponibiliza vrias ima-
gama do endereamento da rede com o cmdlet New- gens de sistemas operativos no s da Microsoft mas tam-
AzureRmVirtualNetworkSubnetConfig, depois pode criar a bm de outras marcas como o Red Hat, por exemplo, o utili-
rede com o cmdlet New-AzureRmVirtualNetwork e definir a zador livre de escolher o que pretende, o valor que vai pa-
subnet criada. gar, mensalmente, j inclui todo o licenciamento. Tal como a
conta de armazenamento h tambm vrios tipos de mqui-
# nas virtuais e todas elas so diferentes, pode consultar em
+-------------------------------------------------+
| Virtual Network | https://azure.microsoft.com/pt-pt/pricing/details/virtual-
+-------------------------------------------------+ machines/. Vou utilizar uma mquina Standard da srie Dv2
#> destinada a computao para fins gerais de prxima gerao
# -- Create Subnet -- com o sistema operativo Microsoft Windows Server 2012 R2
$Subnet = New-AzureRmVirtualNetworkSubnetConfig
-Name "PSPTLAB" -AddressPrefix 10.0.0.0/24 Datacenter. Para qualquer sistema operativo preciso definir
# -- Create VNet with Subnet -- uma conta de administrador e as suas credenciais de acesso
$Vnet = New-AzureRmVirtualNetwork -Name em PowerShell, pode definir de duas formas.
"PSPTLABVNet" -ResourceGroupName $ResourceGroup
-Location $location -AddressPrefix 10.0.0.0/16
-Subnet $Subnet -verbose Solicitar os dados ao utilizador com o cmdlet Get-
Credential Message e o script fica em standby at
serem inseridas as credencias.
cmdlet New-AzureRmVirtualNetwork
Com a rede virtual criada pode criar o endereo pblico
no Azure que definido como Instance-level public IP address
(PIP) o cmdlet New-AzureRmPublicIpAddress deve definir se
pretende um endereo esttico ou dinmico.
cmdlet Get-Credential
38
A PROGRAMAR
<#
+-----------------------------------------------+
| Virtual Machine |
+-----------------------------------------------+
System.Management.Automation.PSCredential #>
# -- Virtual Machine Settings --
Como se pretende automao vai ser utilizada a segun- $VMName = "PSPTLABVM"
da opo mas se partilhar o script com algum lembre-se de $VMSize = "Standard_DS1_v2"
apagar a palavra passe, nome de utilizador e de administrao. $VMPublisherName = "MicrosoftWindowsServer"
O nome de utilizador que estou a utilizar itpro existem no- $VMPublisherOffer = "WindowsServer"
$VMSkus = "2012-R2-Datacenter"
mes que so reservados para o Azure como Admin e Root. $VMOSDiskName = "PSPTLABVMOsDisk"
Para alm das credenciais, na criao da mquina virtual vo # -- Create a PSCredential for Local
definir-se todos os servios criados anteriormente. O processo Administrator Account --
#$cred = Get-Credential -Message "Type the name
de criao mais complexo e vai ser utilizado vrios cmdlets. and password of the local administrator account."
O New-AzureRmVMConfig para criar uma configurao da # -- Create a PSCredential for Local
mquina virtual. O Set-AzureRmVMOperatingSystem para Administrator Account from a Clear Text
definir a identificao da mquina, credenciais de acesso, atua- Password --
$SecurePassword = ConvertTo-SecureString "{INSERT
lizaes automticas e outras definies. O Set- THE PASSWORD" -AsPlainText -Force
AzureRmVMSourceImage define-se a imagem que se preten- $Credential = New-Object
de utilizar; a Microsoft oferece imensas imagens. O seguinte System.Management.Automation.PSCredential
("itpro", $SecurePassword);
cmdlet permite pesquisar as imagens existentes atravs Po- # -- Create the Virtual Machine --
werShell Get-AzureRmVmImageOfferMenu pode experimen- $VM = New-AzureRmVMConfig -VMName $VMName -VMSize
tar com a opo 13, 367, 1. Nem todas as imagens esto dis- $VMSize
$VM = Set-AzureRmVMOperatingSystem -VM $VM -
ponveis em todas as regies. Windows -ComputerName $VMName -Credential
Por exemplo as mquinas virtuais da Symantec no $Credential -ProvisionVMAgent -WinRMHttp
-EnableAutoUpdate
esto disponveis no Norte da Europa. #$VM = Set-AzureRmVMOperatingSystem -VM $VM -
Windows -ComputerName $VMName -Credential
$cred -ProvisionVMAgent -EnableAutoUpdate
$VM = Set-AzureRmVMSourceImage -VM $VM -
PublisherName $VMPublisherName -Offer
$VMPublisherOffer -Skus $VMSkus -Version "latest"
$VM = Add-AzureRmVMNetworkInterface -VM $VM -Id
$NIC.Id
$VM = Set-AzureRmVMOSDisk -VM $VM -Name
$VMOSDiskName -VhdUri "https://
psptlabstorageaccount.blob.core.windows.net/vhds/
psptlabvmosdisk1.vhd" -CreateOption fromImage
New-AzureRmVM -ResourceGroupName $ResourceGroup
-Location $location -VM $VM Verbose
Imagens Symantec no norte da Europa
Ao selecionar Oeste dos EUA j tem mquinas virtuais
disponveis.
39
A PROGRAMAR
AUTOMAO DO AZURE COM WINDOWS POWERSHELL
Com a mquina configurada vai ser instado o Internet Estes so os mdulos disponveis no DSC, reco-
Information Services (IIS) por DSC. mendado que instale os que necessita para utilizar Intellisen-
se na criao dos scripts.
Para utilizar o DSC no Azure so necessrios vrios
passos. O script enviado para ser publicado no Azure, antes
de ser publicado verificado a sua configurao, apos vali-
dao o script fica publicado no Azure Automation DSC Li-
feCycle e pode ser utilizado em qualquer mquina virtual no
Azure.
O reposi-
Implemen-
trio im-
ta a confi-
O script porta e
gurao
enviado valida o
do script
para o scrip e faz
que se
reposit- a configu-
encontra
rio. rao da
no reposi-
informa-
trio
o
Configurao, que
Configuration Config- Se usar algum destes mdulos necessrio definir a
Name
contem a identificao
{
sua importao no script a ser utilizado na mquina de desti-
da configurao.
. no. Por exemplo para definies na Firewall Import-
Ambiente da configu- DSCResource -ModuleName xNetworking. O x nos mdu-
rao param(
Parmetros que so los com o xNetworking significa experimental estes recursos
[Parameter
usados na configura- so corrigidos e monitorizados pelos autores do mdulo.
(Mandatory=$true)]
o. Este grupo
[String[]]$Param7
opcional.
) O DSC no funciona apenas no Windows Server tam-
bm funciona em mquinas clientes como o Windows 10
Implantar a configura-
o nas mquinas Node localhost Pro.
definidas. Pode ter um {
ou mais blocos.
Configurao estrutu-
ral Recurso que pretende
WindowsFeature IIS {
configurar. Pode ter
Name = "Web-Server"
um ou mais blocos. O
Ensure = "Present"
recurso a proprieda-
}
de do cmdlet Get-
WindowsFeature
foreach -parallel
($featureName in
$Name)
{
$feature = Get-
WindowsFeature -
Name $featureName
Automao de idempotntes if(($Ensure -eq
(Propriedade de uma operao de poder ser "Present") -and (! comando winver e cmdlet Get-DscLocalConfigurationManager
aplicada mais do que uma vez sem que o resulta- $feature.Installed))
do se altere) { Um dos requisitos necessrios para trabalhar com
Install-
WindowsFeature -
DSC saber qual a verso do PowerShell que est a ser
Name $featureName utilizada e pode verificar-se com o cmdlet $PSVersionTa-
}
. ble.PSVersion. O DSC foi implementado na verso 4 no Win-
} dows 10 build 14393 utilizada a verso 5.
40
A PROGRAMAR
cmdlet PSVersionTable
O que significa que estamos a usar a
framewrok Windows Management Framework (WMF) 5 esta
framework contem o Windows Remote Management, Windows
PowerShell e Background Intelligent Transfer Service e intro-
duz o Windows PowerShell OneGet. Em 27 de janeiro de 2017
foi lanada a verso 5.1 que compatvel com o sistema oper-
ativo Windows 7, Windows 8.1, Windows Server 2008 R2, Win-
dows Server 2012, e Windows Server 2012 R2, Windows Serv-
er 2016 as novidades das nova verso so publicadas no blog
oficial da equipa https://blogs.msdn.microsoft.com/powershell e
no msdn em https://msdn.microsoft.com/en-us/powershell/.
Antes de utilizar o DSC no Windows 8 e Windows Ser-
ver 2012 R2 necessrio verificar se tem instalado a correo
KB2894179, KB2883200, e KB2894029 para instalar pode exe-
cutar o cmdlet Get-Hotfix para instalar o KB2883200 execute
Get-Hotfix Id KB2883200.
Este o contedo do ficheiro DSC para instalar o IIS.
cmdlet Get-Command
A equipa da Microsoft Windows PowerShell tem um
repositrio central no GitHuB de recursos do DSC em https://
Configurao com Configuration github.com/PowerShell/DscResources.
Ambiente da con-
identificao DSCIIS
figurao
DSCIIS. { Voltando ao script de automao a primeira tarefa a
validao e publicao, utiliza-se o cmdlet Publish-
AzureRmVMDscConfiguration . O script vai primeiro ser vali-
dado antes de ser enviado. Se o mesmo no passar a vali-
dado retorna o tipo do erro e a localizao do erro.
Implantar a confi-
gurao na pr- node "localhost"
pria mquina lo- {
cal.
41
A PROGRAMAR
AUTOMAO DO AZURE COM WINDOWS POWERSHELL
# -- Publish DSC -- Enquanto o DSC est a ser aplicado pode monitorizar
#Remove-AzureStorageBlob -Blob DSCIIS.ps1.zip - a sua aplicao com o cmdlet Get-
Container windows-powershell-dsc -Context
$StorageContext -Verbose AzureRmVMDscExtensionStatus em que tem que definir o
Publish-AzureRmVMDscConfiguration - nome da mquina e a que grupo de recursos pertence. No
ConfigurationPath ".\DSCIIS.ps1" -ResourceGroupName pode executar esta verificao na mesma janela de Po-
$ResourceGroup -StorageAccountName $StorageAccount- werShell tem que abrir uma nova janela de linha de coman-
Name -Verbose
# -- View Published Blob File -- dos, Windows PowerShell ou PowerShell ISE. Fazer uma
#Get-AzureStorageBlob -Blob DSCIIS.ps1.zip - nova autenticao no Azure RM e executar o cmdlet.
Container windows-powershell-dsc -Context $Stora-
geContext -ErrorAction Stop $VMName = "PSPTLABVM"
$ResourceGroup = "PSPTLAB"
Get-AzureRmVMDscExtensionStatus -VMName $VMName -
ResourceGroupName $ResourceGroup -Verbose
cmdlet Get-AzureRmVMDscExtensionStatus
cmdlet Publish-AzureRmVMDscConfiguration
Com o IIS instalado na mquina virtual necessrio
Com o DSC corretamente validado e publicado pode- abrir os portos de acesso ao IIS por defeito 80 para Hyper-
mos aplicar em qualquer mquina virtual para aplicar utiliza-se text Transfer Protoco (HHTP) e 443 para Hyper Text Transfer
o cmdlet Set-AzureRmVMDscExtension necessrio definir a Protocol Secure (HTTPS). preciso definir em dois lugares
conta de armazenamento, o container onde est o script, o no Firewall da mquina virtual e na segurana no Azure
nome do script e da mquina virtual. Um ponto importante Network Security Groups (NSG).
definir a verso da extenso do DSC. Aps aplicar na mquina
necessrio atualizar a mesma. Para configurar a firewall na mquina virtual vai ser
utilizado um outro script DSC.
# -- Configure DSC in the VM --
$DSCArchiveStorageAccountName = "windows-powershell Configurao com
-dsc" configuration DSCFirewallConfig
identificao DSCFi-
$DSCExtVersion = "2.8" #Version 1.0 to 2.3 was {
rewallConfig.
retired Ambi-
Set-AzureRmVMDscExtension -ResourceGroupName ente
$ResourceGroup -VMName $VMName Tem um parmetro param
da
-ConfigurationArchiveBlob DSCIIS.ps1.zip que define qual a m- (
confi-
-ArchiveStorageAccountName quina que vai ser afe- [string[]]$NodeName = 'localhost'
gura
$StorageAccount.StorageAccountName tada. )
o
-ArchiveResourceGroupName
$StorageAccount.ResourceGroupName Importao dos mdu- Import-DSCResource -
-ArchiveContainerName $DSCArchiveStorageAccountName los DSC necessrios. ModuleName xNetworking
-ConfigurationName DSCIIS -Version $DSCExtVersion
-AutoUpdate:$true -Force
Implantar a configura-
Get-AzureRmVM -Name $VMName -ResourceGroupName o na mquina defini-
Node $NodeName
$ResourceGroup | Update-AzureRmVM do pelo parmetro.
{
# -- Remove DSC From the VM --
#Remove-AzureRmVMDscExtension -ResourceGroupName
$ResourceGroup -VMName $VMName verbose xFirewall Firewall
{
Name = "IISFirewallRule"
DisplayName = "Firewall Rule for
IIS"
Confi- Ensure = "Present"
gura Action = "Allow"
o es- Profile = ("Domain", "Private",
trutural Configurao da Fi- "Public")
rewall na mquina Direction = "OutBound"
Virtual. RemotePort = (443, "80", "8080")
LocalPort = (443, "80", "8080")
Protocol = "TCP"
Description = "Firewall Rule for
IIS"
Service = "WinRM"
}
Set-AzureRmVMDscExtension }
}
42
A PROGRAMAR
#
+-------------------------------------------------+
| Desired State Configuration (DSC) |
| Firewall Open TCP Ports for IIS |
+-------------------------------------------------+
#>
# -- Install xNetworking module current user --
Install-Module -Name xNetworking -Scope CurrentUser
# -- Publish DSC --
#Remove-AzureStorageBlob -Blob DSCFirewallCon-
fig.ps1.zip -Container windows-powershell-dsc -
Context $StorageContext -Verbose
Publish-AzureRmVMDscConfiguration
-ConfigurationPath ".\DSCFirewallConfig.ps1" Mostra como as regras do NSG so processadas
-ResourceGroupName $ResourceGroup (docs.microsoft.com).
-StorageAccountName $StorageAccountName -Verbose
# -- View Published Blob File -- Antes de criar um NSG primeiro criam-se as regras
#Get-AzureStorageBlob -Blob DSCFirewallCon-
fig.ps1.zip -Container windows-powershell-dsc - de acesso s depois se cria o NSG e associado a um NIC.
Context $StorageContext -ErrorAction Stop Vo ser criadas duas regras para permitir trfego externo do
# -- Configure DSC in the VM -- protocolo HyperText Transfer rotocol (HTTP) que utiliza a
Set-AzureRmVMDscExtension -ResourceGroupName
$ResourceGroup -VMName $VMName porta 80 e Remote Desktop Protocol (RDP) para acesso re-
-ConfigurationArchiveBlob moto da mquina virtual que utiliza a porta 3389. Para criar
DSCFirewallConfig.ps1.zip as regras utiliza-se o cmdlet New-
-ArchiveStorageAccountName
$StorageAccount.StorageAccountName AzureRmNetworkSecurityRuleConfig que, como indica o
-ArchiveResourceGroupName nome a descrio da regra, os portos de origem e destino,
$StorageAccount.ResourceGroupName e a sua permisso se autoriza ou nega. Um dos pontos fun-
-ArchiveContainerName $DSCArchiveStorageAccountName damentais ao definir uma regra a sua prioridade que nu-
-ConfigurationName DSCFirewallConfig -Version
$DSCExtVersion -AutoUpdate:$true -Force merada entre 100 a 4096 a prioridade definida do menor
Get-AzureRmVM -Name $VMName -ResourceGroupName para o maior.
$ResourceGroup | Update-AzureRmVM
<#
+-----------------------------------------------+
| Azure Network Security Groups (NSG) |
+-----------------------------------------------+
#>
# -- Create NSG Rules --
$NSGRDPRule = New-
AzureRmNetworkSecurityRuleConfig -Name "rdp-rule"
-Description "Allow RDP" -Access "Allow"
-Protocol "Tcp" -Direction "Inbound" -Priority
100 -SourceAddressPrefix "Internet"
-SourcePortRange * -DestinationAddressPrefix *
-DestinationPortRange 3389
$NSGHTTPRule = New-
AzureRmNetworkSecurityRuleConfig -Name "web-rule"
-Description "Allow HTTP" -Access "Allow" -
Protocol "Tcp" -Direction "Inbound" -Priority 101
-SourceAddressPrefix "Internet" -SourcePortRange
* -DestinationAddressPrefix * -
DestinationPortRange 80
43
A PROGRAMAR
AUTOMAO DO AZURE COM WINDOWS POWERSHELL
# -- Create NSG -- Pode fazer um filtro das regras com o cmdlet Get-
$NSG = New-AzureRmNetworkSecurityGroup - AzureRmEffectiveNetworkSecurityGroup indicando a NIC e
ResourceGroupName $ResourceGroup -Location a que grupo de recursos pretende que os resultados sejam
$Location -Name "NSG-FrontEnd" -SecurityRules
$NSGRDPRule, $NSGHTTPRule mostrados como uma tabela numa janela utilizando Out-
# -- Associate NSG to NIC -- GridView
$NIC.NetworkSecurityGroup = $NSG
Set-AzureRmNetworkInterface -NetworkInterface $NIC # -- View filtering --
#$EffNSG = Get-
AzureRmEffectiveNetworkSecurityGroup -
NetworkInterfaceName $NIC.Name -ResourceGroupName
$ResourceGroup
#$EffNSG.EffectiveSecurityRules | Sort-Object
Direction, Access, Priority | Out-GridView
cmdlet Get-AzureRmEffectiveNetworkSecurityGroup
Com as regras criadas est finalizado o script de au-
tomao e pode ser utilizado quando quiser apenas tem de
mudar as variveis existentes para o ambiente pretendido.
No entanto o powershell permite fazer muito mais,
como abrir a pgina do IIS atravs do endereo pblico de
Internet da mquina virtual. Se quiser utilizar o endereo de
Internet necessrio configurar o Fully Qualified Domain
cmdlets New-AzureRmNetworkSecurityGroup e Set- Name (FQDN) no NIC associado a mquina virtual. Pode
AzureRmNetworkInterface abrir o navegador de Internet preferencial atravs do dot Net
com [System.Diagnostics.Process]::Start() o endereo IP
Pode sempre ver o estado das regras com o cmdlet Get obtido com o cmdelt Get-AzureRmPublicIpAddress.
-AzureRmNetworkSecurityGroup a que grupo de recursos pre-
tende que os resultados sejam mostrados como uma tabela <#
+----------------------------------------------+
numa janela utilizando Out-GridView | Open VM IIS WebSite |
# -- View NetWork Security Group -- +----------------------------------------------+
#Get-AzureRmNetworkSecurityGroup -Name $NSG.Name - #>
ResourceGroupName $ResourceGroup | Sort-Object # -- Open IIS WebSite in the Default Browser
Direction, Access, Priority | Out-GridView -- $VMIP = (Get-AzureRmPublicIpAddress -Name PIP -
ResourceGroupName $ResourceGroup).IpAddress
[System.Diagnostics.Process]::Start("http://" +
$VMIP)
44
A PROGRAMAR
<#
+--------------------------------------------------
--------------+
| Open Remote Desktop Session |
+-------------------------------------------------- remoo do grupo de recursos com sucesso
--------------+
#> O nvel de segurana da conta do Azure a mesma,
# -- Launh Microsoft Terminal Server Connection
#Start-Process mstsc -ArgumentList "/V:$VMIP / nunca mantido nenhum perfil na mquina a no ser que
w:1024 /h:768" grave o seu perfil com cmdlet Save-AzureRmProfile.
Em concluso o DSC timo para automao no
apenas para administradores de sistemas mas tambm para
DevOps, administradores de bases dados e muitos mais.
Pode fazer quase tudo incluindo implementar uma atualiza-
o de segurana em vrias mquinas com o xWindowsU-
pdate o seguinte exemplo vai instalar a atualizao
KB2908279 que est na prpria mquina.
Configuration UpdateWindowsWithPath
{
Import-DSCResource ModuleName
PSDesiredStatedConfiguration, xWindowsUpdate
Node NodeName
{
xHotfix HotfixInstall
{
Ensure = "Present"
Path = "c:/temp/Windows8.1-KB2908279-v2-x86.msu"
Id = "KB2908279"
execuo do Start-Process }
}
Se pretender destruir o grupo de recurso utilizado utilize }
o cmdlet Remove-AzureRmResourceGroup indicando o nome
do grupo de recursos. O DSC no funciona apenas no Azure tambm funci-
ona em mquinas locais. O processo quase idntico, en-
<# quanto no Azure o repositrio e a implementao na mqui-
+-------------------------------------------------- na so tratados automaticamente, enquanto localmente
+ necessrio gerir o repositrio/ficheiros para serem aplicados
| Destroy module 5 demo environment |
+-------------------------------------------------+ nas mquinas remotas e a sua implementao. A vantagem
#> do Azure que trata disso tudo por ns.
# -- Warning: Delete the Resource Group
#Remove-AzureRmResourceGroup -Name $ResourceGroup - Se pretende saber mais sobre Windows PowerShell
Verbose convido a consultar o blog oficial do PowerShell em https://
blogs.msdn.microsoft.com/powershell/ , a documentao da
Microsoft em https://technet.microsoft.com/en-us/library/
bb978526.aspx e o Microsoft Script Center em https://
technet.microsoft.com/pt-pt/scriptcenter/ .
Tambm est convidado a participar na comunidade
PowerShell Portugal (https://pt-pt.facebook.com/
PowerShellPortugal/) como participante e/ou orador.
AUTOR
Escrito por Ricardo Cabral
O Ricardo Cabral apaixonado e autodidata em tecnologia da informao com mais 13 anos de experi-
ncia em projetos, desenvolvimento e gesto de TI. Licenciou-se em Engenharia de Informtica pela
Universidade Autnoma de Lisboa. Participante ativo, voluntariado e/ou orador de reunies de comunida-
de portuguesas. Adora partilhar, conviver e aprender. O seu twitter @rramoscabral.
45
A PROGRAMAR
O Problema do casamento Estvel
Notemos que estas duas premissas se encontram ligadas por A complexidade de execuo deste algoritmo de O
um operador e (and), o que significa que ambas tm de ser (n2) onde n o numero de elementos homens ou mulheres.
observadas para que um par seja considerado estvel. Este algoritmo garante dois resultados essenciais:
Em suma um par considerado estvel quando no Todos os pares so estabelecidos (no final no pode
existe nenhum emparelhamento (A,B) em que ambos A e B ocorrer situao nenhuma em que um par esteja de-
estivessem individualmente melhor do que que esto com o semparelhado, de tal forma que todos os homens se
par com que se encontram emparelhados num dado momento. propuseram a uma determinada mulher, num dado
momento no tempo, dado que um homem ir eventu-
Nota Importante: Neste problema existem duas classes que almente propor-se a todas as mulheres se necess-
necessitam de ser emparelhadas, uma com a outra. Caso con- rio. Situao em que cada mulher teve garantidamen-
trrio poderia ser confundido com o problema dos colegas de te pelo menos uma proposta.
quarto (stable roommates problem)
Os pares so estveis. Considerando dois persona-
gens (Pedro e Ins), esto ambos emparelhados,
Existem diversos usos quotidianos do algoritmo Gale- mas no juntos, aps todas as iteraes do algoritmo.
Shapley e do problema do emparelhamento estvel, com uma Assim sendo no ser possvel que eles se prefiram
grande abrangncia de reas de conhecimento, desde a eco- mutuamente por oposio aos seus pares estabeleci-
nomia, passando pela distribuio de alunos por cursos, distri- dos, porque num dado momento se Pedro preferiu
buio de salas de aulas por turmas e horrios, gesto de Ins, ele ter-se- proposto, antes de se propor ao seu
transplantes de rgos vivos (em uso nos EUA), etc.. par actual. Assim, se Ins o tivesse aceite a sua pro-
posta, e ainda assim no tenha terminado emparelha-
A teoria do Algoritmo da com ele, no final do algoritmo, isto significa que ela
Em 1962, David Gale e Lloyd Shapley, dois matemti- o trocou por um outro elemento de quem ela gostou
46
A PROGRAMAR
47
A PROGRAMAR
O PROBLEMA DO CASAMENTO ESTVEL UTILIZANDO O ALGORITMO GALE-SHAPLEY
{ giselle, esmeralda, isabela, bela, preferem-se mutuamente"
cinderela, alice, daisy, hanna, jasmine, Fiona }, " sobre o par actual.\n",
{ alice, esmeralda, hanna, Fiona, isabela, nome[noivo1], nome[pairs
cinderela, jasmine, bela, giselle, daisy }, [noivo1]], nome[noiva2], nome[pairs[noiva2]]);
{ hanna, cinderela, daisy, giselle, bela, return 1;
alice, Fiona, isabela, jasmine, esmeralda }, }
{ alice, Fiona, jasmine, giselle, esmeralda, return 0;
bela, daisy, cinderela, isabela, hanna }, }
{ bart, farquad, jasper, george, iago, alvin, int mulher_do_vizinho(int noivo1, int noivo2)
donnald, eric, calvin, hercules }, {
{ bart, alvin, calvin, farquad, george, return desejar(noivo1, pairs[noivo2]) +
donnald, iago, eric, jasper, hercules }, desejar(noivo2, pairs[noivo1]);
{ farquad, bart, eric, george, hercules, }
calvin, iago, alvin, donnald, jasper },
{ farquad, jasper, calvin, alvin, iago, int instavel()
hercules, george, donnald, bart, eric }, {
{ jasper, hercules, farquad, donnald, alvin, int i, j, bad = 0;
george, calvin, eric, iago, bart }, for (i = alvin; i < jasper; i++) {
{ bart, alvin, eric, iago, jasper, donnald, for (j = i + 1; j <= jasper; j++)
farquad, george, calvin, hercules }, if (mulher_do_vizinho(i, j)) bad = 1;
{ jasper, george, hercules, farquad, bart, }
alvin, calvin, eric, donnald, iago }, return bad;
{ george, jasper, bart, alvin, iago, donnald, }
hercules, eric, calvin, farquad },
{ iago, calvin, hercules, george, farquad, int main()
bart, alvin, eric, jasper, donnald }, {
{ eric, hercules, george, alvin, bart, int i, unparearric;
jasper, calvin, iago, farquad, donnald },
}; for (i = alvin; i <= jasmine; i++)
int pairs[jasmine + 1], propoeric[jasmine + 1]; pairs[i] = propoeric[i] = burro;
void parear(int homem, int mulher) do {
{ unparearric = 0;
pairs[homem] = mulher; for (i = alvin; i <= jasper; i++) {
pairs[mulher] = homem; if (pairs[i] != burro) continue;
if (verbose) printf("%4s emparelhado com unparearric = 1;
%4s\n", nome[homem], nome[mulher]); propoe(i, pref[i][++propoeric[i]]);
} }
} while (unparearric);
void deixar(int mulher, int homem)
{ printf("Pareando:\n");
pairs[homem] = pairs[mulher] = burro; for (i = alvin; i <= jasper; i++)
if (verbose) printf("%4s deixa %4s\n", nome printf(" %4s - %s\n", nome[i],
[mulher], nome[homem]); pairs[i] == burro ? "burro" :
} nome[pairs[i]]);
int rank(int this, int that) printf(instavel()
{ ? "Casamento no estvel\n"
int i; : "Par estvel\n");
for (i = alvin; i <= jasper && pref[this]
[i] != that; i++); printf("\n Mas se Bart e Farquad
return i; trocassem:\n");
} i = pairs[bart];
parear(bart, pairs[farquad]);
void propoe(int homem, int mulher) parear(farquad, i);
{ printf(instavel() ? "Os pares no eram
int goce = pairs[mulher]; estaveis\n" : "Pareamento estvel\n");
if (verbose) printf("%4s prope-se a %4s\n",
nome[homem], nome[mulher]); return 0;
if (goce == burro) {
parear(homem, mulher); At aqui, em todos os exemplos apresentados, no
} else if (rank(mulher, homem) < rank(mulher, utilizamos preferncias com empates. Ou seja o mesmo ele-
goce)) {
deixar(mulher, goce); mento (homem ou mulher), definir um mesmo valor de prefe-
parear(homem, mulher); rncia (rank) a dois ou mais elementos do gnero oposto.
} Caso o tivesse-mos permitido existiriam trs noes de esta-
}
bilidade. A fraca estabilidade , a super estabilidade e a alta
int desejar(int noivo1, int noiva2) estabilidade.
{
if (rank(noivo1, noiva2) < rank(noivo1, pairs Um par chamado estvel-fraco, a menos que haja
[noivo1]) && rank(noiva2, noivo1) < rank(noiva2, um par em que cada um dos elementos prefira estritamente
pairs[noiva2])) { o outro para o seu par no emparelhamento.
printf( " %4s (c/ %4s) e %4s (c/ %4s)
48
A PROGRAMAR
49
A PROGRAMAR
O PROBLEMA DO CASAMENTO ESTVEL UTILIZANDO O ALGORITMO GALE-SHAPLEY
O problema dos companheiros de quarto estveis aula a conjuntos de alunos e professores para efeitos de
(stable roommates problema) similar ao problema dos casa- vigilncia de exames, etc
mentos estveis (SMP), mas difere no facto de todos os partici- Neste ultimo exemplo, apenas a titulo de curiosidade,
pantes pertencerem a um s conjunto dividido em nmeros consideremos o seguinte, cada sala, tem como propriedades
iguais. O problema dos internos/hospitais com casais, permite os lugares, a cada sala encontra-se atribudo um docente, a
que um conjunto de residentes, inclua casais, que devem ser este conjunto de pares (sala, doente) ter de ser emparelha-
emparelhados juntos, quer para o mesmo hospital, ou para o do uma turma. Utilizando este algoritmo, poderia ser automa-
mesmo par especifico de hospitais escolhidos pelo casal (por tizada a atribuio de salas para efeitos de exame a turmas
exemplo, um casal quer garantir que vo ficar juntos e no em de forma quase automtica, minimizando a quantidade de
internatos onde ficariam longe um do outro). A adio de ca- salas necessrias para o efeito.
sais ao problema dos residentes / hospitais, torna-o num pro-
blema NP-Completo (referente ao tempo polinomial). Concluso
Um caso mais portugus, possivelmente conhecido do O problema dos casamentos estveis e o algoritmo
leitor, trata-se da soluo proposta para a colocao de docen- de Gale-Shaply, podem ser aplicados a uma infinidade de
tes em Portugal para o ano letivo 2004/2005, desenvolvido reas do conhecimento e situaes quotidianas diversas. O
pela ATX para resolver o problema da colocao de professo- seu vasto uso no dia a dia, ainda que discreto, prova a im-
res nos concursos nacionais para a contratao e colucao portncia deste algoritmo desenvolvido em 1962.
de docentes nos estabelecimentos de ensino. Apesar das difi-
culdades no inicio do ano letivo o problema acabou resolvido.
Apenas por mera curiosidade de programador, de seguida
apresenta-se uma verso resumida, em pseudo-cdigo do al-
goritmo utilizado.
Este algoritmo, pode ser aplicado a diversas utilizaes, A I And Game Theory The Joy of Matching Paul
em que se tenham conjuntos que necessitem de ser empare- Harrenstein, David Manlove, Michael Wooldridge
lhados, de forma a obter-se uma melhor relao entre elemen-
tos dos conjuntos. Por exemplo a atribuio de rgos de da- Emparelhamentos, Casamentos Estveis e Algorit-
dores a pacientes que necessitem de transplante, salas de mos de Colocao de Professores
AUTOR
Escrito por Antnio C. Santos
Programar criar um novo mundo escrevendo cdigo, cumprindo os mais elementares desgnios da
vida, aprender, ensinar, criar, partilhar, melhorar e seguir. Formou-se no Instituto Politcnico de Viana
do Castelo. Membro da Comunidade Portugal-a-Programar desde Agosto de 2007, tambm membro da
Sahana Software Foundation, onde Programador Voluntrio desde 2012, actualmente exerce funes
de mentor voluntrio na plataforma MOOC Coursera . Twitter:@apocsantos
50
ELECTRNICA
O Problema da falta de GPIO Pins
Electrnica
O PROBLEMA DA FALTA DE GPIO PINS
Um multiplexador, funciona definindo o fluxo de corren- Qualquer converso podia ter sido exemplo a escolha
te, entre um determinado ponto e um outro determinado ponto, foi sobre o nmero 10 apenas por mero acaso! De qualquer
no caso entre pinos do circuito multiplexador que esteja a ser das formas a tabela ajuda imenso na hora de fazer esta con-
utilizado. Para tal so utilizados pinos para controlar o circuito, verso e independentemente do multiplexador escolhido as
e uma tabela de verdades que permite selecionar o canal por tabelas por regra, constam na folha de dados do circuito.
onde a eletricidade deve fluir. [TAB.1] Apenas para uma referncia de consulta rpida, va-
Para o efeito de seleo da porta do multiplexador a ser mos colocar os valores para cada uma das portas devida-
utilizada, podemos calcular o valor binrio da mesma recorren- mente convertidos abaixo, sendo que para o efeito vamos
do tabela de verdades do circuito. No circuito usado para considerar o valor do pino de controlo como zero para todos
os casos.
53
Electrnica
O PROBLEMA DA FALTA DE GPIO PINS
Valor Binrio Decimal correspondente Com estas ligaes feitas, bastar ligar ao multiplexa-
dor os circuitos, componentes ou sensores a que se preten-
00000 0
da aceder, nas portas do multiplexador de C0 a C15, respeti-
10000 1 vamente. Para no complicar demasiado o exemplo iremos
usar 16 potencimetros, cada um ligado a um dos pinos do
01000 2 multiplexador, e ler cada um de forma independente.
11000 3 Para tal vamos fazer as ligaes da seguinte forma:
00100 4 Ligamos cada um dos potencimetros ao pino de 5vdc do
arduino e o gnd de cada potencimetro de igual forma ao
10100 5 gnd do arduino. Com isto temos estabelecido um fluxo de
corrente entre o arduino e cada potencimetro. Agora falta
01100 6
ligar os pinos de sada de cada potencimetro ao multiplexa-
11100 7 dor. Para tal, ligamos cada um ao respetivo pino do multiple-
xador, entre o C0 para o primeiro dos potencimetros e o
00010 8 C15 para o ultimo. [DIAG.2]
10010 9
01010 10
11010 11
00110 12
10110 13
01110 14
11110 15
54
Electrnica
O PROBLEMA DA FALTA DE GPIO PINS
}
return val;
Numa esmagado-
No exemplo acima, o objetivo era ler 16 valores analgi-
cos, provenientes de 16 potencimetros. No entanto isto ape-
ra maioria dos circui-
nas uma utilizao para um multiplexador. Por exemplo, pode-
ria ser usado para controlar 16 rels diferentes, mas no s. tos usados em IoT ()
Pode ser utilizado para por exemplo com dispositivos que co-
muniquem por uart, etc. existem algumas limi-
Desmultiplexao
taes em termos de
Para no complicar e exemplificar o mesmo efeito, mas
desta feita com pinos digitais, pode ser feito com 16 leds. pinos analgicos, que
Em termos de ligaes o circuito ser em tudo idntico
com algumas diferenas chave. Os pinos de controlo, podero nos podem complicar
ser os mesmos, no entanto o pino de dados (SIG) ser ligado
no pino de 5vdc do arduino e os leds todos eles ligados ao gnd tarefas ()
55
Electrnica
O PROBLEMA DA FALTA DE GPIO PINS
Concluso Fontes
Ao longo do artigo, mais do que apresentar um circuito SparkFun https://www.sparkfun.com/products/9056
apresentaram-se duas formas de executar tarefas idnticas
ARM mbed Developer site https://developer.mbed.org/
com cdigo diferente, bem como a multiplexao e desmultiple-
xao de portas recorrendo a um multiplexador simples e de Dan Zilinskas Motion Capture for Runners
baixo custo. A vantagem de expandir substancialmente o n-
Texas Instruments CD74HC4067 DataSheet https://
mero de portas disponveis em cada situao ajuda particular-
www.sparkfun.com/datasheets/IC/CD74HC4067.pdf
mente em circuitos com poucas entradas e sadas, como o
caso dos ATMega328, mas tambm dos ATTiny 45 e dos AT- Frontiernerds http://www.frontiernerds.com/
Tiny 85 que s dispem de 3 portas analgicas e 2 portas digi-
tais, ultrapassando assim algumas das limitaes impostas
pelos controladores.
AUTOR
Escrito por Antnio C. Santos
Programar criar um novo mundo escrevendo cdigo, cumprindo os mais elementares desgnios da
vida, aprender, ensinar, criar, partilhar, melhorar e seguir. Formou-se no Instituto Politcnico de Viana
do Castelo. Membro da Comunidade Portugal-a-Programar desde Agosto de 2007, tambm membro da
Sahana Software Foundation, onde Programador Voluntrio desde 2012, actualmente exerce funes
de mentor voluntrio na plataforma MOOC Coursera . Twitter:@apocsantos
56
COLUNAS
C# - Padro de Arquitetura SOLID
SQL Curtas - SQL Curtas #2: Dvidas Comuns
Kernel Panic -
C#
Padro de Arquitetura SOLID
59
C#
PADRO DE ARQUITETURA SOLID
Cada classe ir usar um interface, o que requerido. Diferena Entre Segregao de Interface e Substituio
No existe necessidade de usar um interface que no esteja Liskov
requerido. Fan necessria nos trs mtodos por isso pode
Ambos os princpios parecem o mesmo mas existe
usar ambos os interfaces, ISwitch e ILight e Build precisa ape-
uma ligeira diferena, o ISP mais especfico que o LSP. No
nas de um dos dois mtodos para implementar On e Off assim
ISP, at existe mtodo e tambm a sua definio mas no
precisa de implementar apenas um interface chamado ISwitch.
relevante para uma classe em particular por isso, de acordo
com o ISP, precisamos de separar este mtodo num interfa-
Princpio de Segregao de Interface (ISP)
ce separado. Em LSP, o mtodo existe mas no a sua defini-
o por isso no faz sentido mant-lo no mesmo interface
Os interfaces especficos de cliente so melhores que
por isso de acordo com o LSP, precisamos de separa em
um interface de objetivo geral.
interfaces diferentes.
Suponhamos que temos um interface para clique: Princpio de Inverso de Dependncia (ISP)
public interface IClick Este declara dois pontos, o primeiro ponto que um
{ mdulo de nvel mais elevado no dever depender de um
void onClick(Object obj);
} mdulo de nvel baixo. Ambos devem depender da abstra-
o. E o segundo ponto , Abstrao no deve depender do
Com o passar do tempo, solicitam a adio de uma detalhe. O detalhe deve depender da abstrao. Por outras
nova funo onLongClick. Isto implica adicionar um novo mto- palavras, nenhum objeto deve ser criando dentro de uma
do ao interface: classe, eles devem ser passados ou injetados a partir de
fora. E onde ir receber, ser um interface em vez de uma
public interface IClick classe.
{
void onClick(Object obj); class PasseadorDeLivros
void onLongClick(Object obj); {
} ILogWriter writer = null;
Mais algum tempo passado e eis que chega um novo requeri- Public PasseadorDeLivros(ILogWriter writer)
{
mento para adicionar a funo toque e adicionamos o mtodo this.writer = writer;
no mesmo interface. }
class Main
public interface IClick {
{ Private void AddPasseadorDeLivros
void onClick(Object obj); {
void onLongClick(Object obj); ILogWriter writer = null;
}
write = new LogWrite();
public interface ITouch PasseadorDeLivros obj = new PasseadorDeLivros
{ (write);
void onClick(Object obj); write.Notify(""message");
void onTouch(Object obj); }
} }
60
C#
PADRO DE ARQUITETURA SOLID
AUTOR
Escrito por Antnio C. Santos
Programar criar um novo mundo escrevendo cdigo, cumprindo os mais elementares desgnios da
vida, aprender, ensinar, criar, partilhar, melhorar e seguir. Formou-se no Instituto Politcnico de Viana
do Castelo. Membro da Comunidade Portugal-a-Programar desde Agosto de 2007, tambm membro da
Sahana Software Foundation, onde Programador Voluntrio desde 2012, actualmente exerce funes
de mentor voluntrio na plataforma MOOC Coursera . Twitter:@apocsantos
61
SQL Curtas
SQL Curtas #2: Dvidas Comuns
Como mostrar registos por ordem aleatria? Compatibilidade? Consoante o SGBD, podero haver altera-
es nos comandos:
No existe uma forma "standard" de resolver este pro-
blema. Cada SGBD (Sistema de Gesto de Bases de Dados) "BEGIN" e/ou "START";
tem uma forma diferente:
"TRAN", "TRANS" e/ou "TRANSACTION";
CREATE TABLE ProgRand (A INT);
INSERT INTO ProgRand (A) VALUES (9), (8),
(7), (6), (5), (4), (3), (2), (1); "COMMIT" e "ROLLBACK" com/sem
-- Ordem natural (armazenada) "TRANSACTION" frente.
SELECT * FROM ProgRand;
-- Ordem pelo campo A ascendente O que um DEADLOCK?
SELECT * FROM ProgRand ORDER BY A ASC;
-- Ordem aleatria - SQL Server Um deadlock pode acontecer em bases de dados ou
SELECT * FROM ProgRand ORDER BY NewID(); qualquer recurso informtico. Para explicar o que um dead-
-- Ordem aleatria com apenas 3 registos - lock, fica um exemplo:
SQL Server
SELECT TOP (3) * FROM ProgRand ORDER BY NewID
(); O utilizador A comea uma transaco e escreve na
-- Ordem aleatria - Oracle tabela X. A tabela X fica bloqueada enquanto no
SELECT * FROM ProgRand ORDER BY houver COMMIT ou ROLLBACK;
DBMS_RANDOM.VALUE;
-- Ordem aleatria - MariaDB / MySQL O utilizador B comea uma transaco e escreve na
SELECT * FROM ProgRand ORDER BY RAND();
tabela Y. A tabela Y fica bloqueada enquanto no
houver COMMIT ou ROLLBACK;
O que uma TRANSACTION?
Uma transaco um bloco de comandos que suposta- O utilizador A tenta agora escrever (eventualmente
mente devem ser executados "ou todos ou nenhum". Exemplo: apenas ler) da tabela Y, mas esta est bloqueada
pelo utilizador B. Neste caso, fica a aguardar o
CREATE TABLE ProgTran (A INT); COMMIT ou ROLLBACK do utilizador B;
BEGIN TRANSACTION;
INSERT INTO ProgTran (A) VALUES (1), (2), O utilizador B tenta agora escrever (eventualmente
(3); apenas ler) da tabela X, mas esta est bloqueada
SELECT * FROM ProgTran; pelo utilizador A. Neste caso, fica a aguardar o
-- Executar outras alteraes aqui...
-- Executar aqui alguma verificao (nota: COMMIT ou ROLLBACK do utilizador A;
corre apenas ROLLBACK ou COMMIT)
-- Se erro: Ambos os utilizadores esto parados espera do
ROLLBACK; outro, e nenhum conseguir avanar.
-- Caso contrrio tudo ok!
COMMIT; Isto pode acontecer com mais do que dois utilizado-
SELECT * FROM ProgTran;
res encadeados (e.g. ABCA).
Os SGBD mais recentes tm proteces contra dead-
Aqui, se a validao efectuada (erros, questes de ne-
locks. Assim, um destes utilizadores aleatoriamente vai ser
gcio, etc.) der erro, podemos fazer ROLLBACK e os dados
considerado "deadlock victim" e a sua transaco vai ter um
inseridos "provisoriamente" so deitados fora. Apenas fazendo
ROLLBACK automtico (e o utilizador recebe um erro). O
COMMIT sero gravados.
outro ento, no tendo bloqueios alheios, pode completar a
Outro motivo para haver transaces isolar os pedidos sua tarefa.
de dois ou mais utilizadores. Se dois utilizadores executarem o
O comportamento (locks, limitaes, monitorizao,
cdigo em cima, os registos novos de "outros" utilizadores
escolha de vtima, etc.) depende sempre do SGBD.
(ainda no gravados/COMMITted), no aparecero num SE-
LECT tabela. ALTER TABLE ou DROP TABLE + CREATE TABLE?
Coloca-se no entanto uma questo: enquanto o ROLL- Antes de mais, esta pergunta no se aplica apenas a
BACK necessrio para cancelar alteraes, ser que o tabelas, mas tambm a views, stored procedures, bases de
COMMIT necessrio para garantir que o resultado efectiva- dados, logins/utilizadores e muitos outros objectos.
mente escrito? A resposta depende do SGBD (definies de
auto-commit, etc.). Em qualquer caso, sempre recomendado ALTER altera um objecto j existente;
incluir explicitamente um COMMIT no final.
DROP remove um objecto j existente (se for uma
tabela, inclui remover todos os repectivos dados);
62
SQL Curtas
SQL CURTAS #2: DVIDAS COMUNS
AUTOR
Escrito por Andr Melancia
Independent Developer/DBA/Consultant. Microsoft Certified Trainer (MCT) focusing on SQL Server, Azu-
re and IoT. 17+ years' fun developing information and multimedia systems, DBA, project and IT manage-
ment. PowerShell Portugal, IT Pro Portugal and IoT Portugal communities organiser. IPv6 Por-
tugal, DNSSec Portugal and Windows Development Portugal online communities moderator. Actively
volunteering, organising, speaking or just participating at community meetings and events like SQLSatur-
days, SQLBits, SQLRelay, Maker Faire Lisbon, Arduino/Genuino Day Lisbon, Global Azure Bootcamp
Lisbon, etc. Proud uncle and food devouring expert, with dangerous ussy cat as companion.
63
Kernel Panic
A arte, engenho, e muita diverso
A Arte O Engenho
Programar pode ser uma arte, apesar de ser uma aco Se tivermos em conta que programar, tal como mon-
e no necessariamente uma expresso no sentido mais con- tar legos, jogar jogos como o jogo do burro, tambm conhe-
servador. Nesse caso um programa seria uma forma de arte cido por Jenga, implica algum engenho, no sentido mais
e consequentemente os developers seriam artistas. alargado da definio, programar acaba aguando o enge-
nho! Para os mais nostlgicos para no usar outra palavra,
Ainda assim, isto nem sempre observado desta forma!
que se recordam do tempo dos computadores de 8 bits, co-
Numa atitude quase que patolgica ou desenquadrada pro-
mo o ZX Spectrum e o Timex TC2048 / TC2068 (estes lti-
gramar muitas vezes visto como um ofcio, uma tarefa, um
mos feitos em Portugal), certamente se lembrar do engenho
trabalho e no propriamente uma forma de arte! Por exemplo e
necessrio para carregar um jogo, ou interromper o carrega-
sem divagar muito, ensinam-se artes plsticas, expresso dra-
mento, para se fazer aquele poke fantstico que apesar de
mtica, msica, etc nas escolas, no entanto ainda no existe
pouco nobre j que o objetivo seria ter vidas infinitas no
de forma massificada a programao como matria de ensino
jogo, merecia a nobreza da ingenuidade de o executar. Os
e estudo! Ainda que parea precoce ver os mais novos a
que se lembram disto, nessa altura certamente eram crian-
aprender a programar, certo ser admitir que hoje em dia qua-
as, ou adolescentes. No lhes faltava engenho para inclusi-
se todos sabem usar um tablet, ou mesmo um computador!
ve escreverem os seus prprios jogos, em Basic, que era
interpretados pelo interpretador do computador e executa-
dos, para grande diverso!
Programar exige engenho, agua o engenho, uma
boa forma de despertar o engenho, latente em toda a gente,
para criar coisas novas!
A diverso
Ora aqui chegamos ao final! A diverso! Bem, progra-
mar, pode ser considerado tudo menos divertido! Depende
do ponto de vista de quem o diz! Na realidade, programar,
alm de ser uma arte, um engenho, tambm uma forma
de diverso! Primeiramente porque criar algo inato no ser
Logo porque no programar ? Fica a questo!
humano, que tende a criar coisas novas apenas porque se
Ainda que se diga que programar no uma arte, por diverte a faz-lo! Desde criar novos jogos, a criar novos ob-
este ou aquele motivo, vejamos, programar implica imaginar, jectos, etc Logo tudo o que feito com gosto, acaba sendo
criar, construir, transpor o pensamento abstracto para algo divertido! Quando se comea a programar algo, apenas por
real. Logo em teoria seria uma arte! desporto, ou por satisfao pessoal, ou pelo simples desa-
fio, comea um novo processo de criao e diverso, entre
Um aprendiz de guitarrista, seguindo a partitura, ou a a tentativa o erro, o estudo e a concluso! No preciso ser
tablatura com os acordes, consegue reproduzir a msica, da algo profissional, nem algo feito por profissionais nem to
mesma forma que um aprendiz de programador com um pou- pouco algo feito por adultos! Para uma criana, programar
co de pacincia consegue seguir o cdigo de outro programa- pode ser algo bastante divertido! Deixo o desafio ao leitor de
dor e reproduzir o mesmo resultado. Logo em teoria seria uma desenvolver um pseudo-jogo at mesmo em scratch e envi-
forma de arte! Ainda que esta afirmao possa ser contestada, ar um printscreen do mesmo, para vir a ser includo num
no deixa de ter lgica! Assim podemos passar para o enge- futuro kernel panic!
nho!
Aceita o desafio ?
AUTOR
Escrito por Antnio C. Santos
Programar criar um novo mundo escrevendo cdigo, cumprindo os mais elementares desgnios da
vida, aprender, ensinar, criar, partilhar, melhorar e seguir. Formou-se no Instituto Politcnico de Viana
do Castelo. Membro da Comunidade Portugal-a-Programar desde Agosto de 2007, tambm membro da
Sahana Software Foundation, onde Programador Voluntrio desde 2012, actualmente exerce funes
de mentor voluntrio na plataforma MOOC Coursera . Twitter:@apocsantos
64
Media Partners da Revista PROGRAMAR
Anlises
C# 6 - PROGRAMAO COM PRODUTIVIDADE
Introduo Programao com Python, Algoritmos e logica de progra-
mao para iniciantes
Review
C# 6 - PROGRAMAO COM PRODUTIVIDADE
AUTOR
Escrito por Mnica Rodrigues
Licenciada em Engenharia Informtica e de computadores pelo ISEL. Software engineer com vasta experincia em desenvol-
vimento web nas mais variadas tecnologias, desde HTML5, AngularJs, Asp.Net Web API, Asp.Net MVC, WCF, Entity Fra-
mework e tantas outras. Gosto igualmente de desenhar solues de arquitectura aplicando padres de desenho. Gosto de
participar, entre outros, nos eventos da Microsoft, das comunidades Netponto e outras de forma a estar atenda s tecnologias
emergentes. Linkedin: https://pt.linkedin.com/in/monicascrodrigues
67
Review
AUTOR
Escrito por Antnio C. Santos
Programar criar um novo mundo escrevendo cdigo, cumprindo os mais elementares desgnios da
vida, aprender, ensinar, criar, partilhar, melhorar e seguir. Formou-se no Instituto Politcnico de Viana
do Castelo. Membro da Comunidade Portugal-a-Programar desde Agosto de 2007, tambm membro da
Sahana Software Foundation, onde Programador Voluntrio desde 2012, actualmente exerce funes
de mentor voluntrio na plataforma MOOC Coursera . Twitter:@apocsantos
68
Segurana
Segredos de Numerao
Segurana
Segredos de Numerao
Neste mundo moderno, tudo um nmero (ou vrios). Adicionalmente, no Carto de Cidado, so adiciona-
Neste artigo veremos alguns exemplos de numeraes utiliza- dos 3 novos dgitos: os primeiros dois (letras) correspondem
das em aplicaes de negcio, o seu significado, como cons- emisso individual do carto ("ZZ" o primeiro carto des-
tru-los e como valid-los. Uma explicao mais detalhada da se cidado, "ZY" o segundo, etc.), e o ltimo corresponde a
matemtica dos dgitos de controlo deixa-se para o leitor. um novo dgito de controlo, j que o dgito de controlo ante-
rior no matemticamente fivel E.g. "12345678 9 ZY6",
Um dgito de controlo (check digit), que pode ser num-
correspondente ao 2 carto pedido pelo cidado 12345678,
rico ou alfanumrico, um valor que pode integrar ou ser sepa-
com os dgitos de controlo 9 (legacy) e 6 (novo).
rado do nmero original e que valida possveis erros de intro-
duo. O erro mais habitual a troca acidental da ordem de Como calcular/validar o primeiro nmero de controlo?
dois dgitos. E.g. "xxxx12xx" or "xxxx21xx". (Exemplo em JavaScript)
Ateno: As funes de validao foram criadas de
function CalculaControlo_NIC(nic) {
acordo com a especificao e testadas apenas com uma if (nic.length > 8) {
amostragem reduzida, pelo que podem conter erros. Verificar return ("ERRO: O NIC deve ter 8
antes de utilizar. dgitos.");
}
Nmero de Identificao Civil (NIC) else if (nic.length < 8) {
nic = ("00000000" + nic).substr(-8);
O nmero presente no Carto de Cidado (ou no antigo }
Bilhete de Identidade) um nmero sequencial (actualmente
Total = 9 * nic.charAt(0)
com 8 dgitos, por haverem cerca de 10500000 cidados em + 8 * nic.charAt(1)
Portugal), com um dgito de controlo em separado. + 7 * nic.charAt(2)
+ 6 * nic.charAt(3)
O primeiro Bilhete de Identidade (nmero "1") foi emitido + 5 * nic.charAt(4)
em 1914 ao ento Presidente da Repblica, Manuel de Arria- + 4 * nic.charAt(5)
+ 3 * nic.charAt(6)
ga. + 2 * nic.charAt(7);
Controlo = 11 - (Total % 11);
if (Controlo > 9) Controlo = 0;
return (Controlo);
}
document.write(CalculaControlo_NIC("12345678"));
70
Segurana
SEGREDOS DE NUMERAO
6X: Entidade pblica; return (Controlo == niss.charAt(10));
}
7X: Situaes especiais (heranas, fundos, etc.); document.write(Valida_NISS("11234567892"));
71
Segurana
SEGREDOS DE NUMERAO
lores bastante acima dos inteiros usuais nos computadores, n: Nmero individual do carto;
pelo que necessrio utilizar algumas artimanhas matemticas
para calcular. Do ponto de vista Portugus, basta-nos apenas C: dgito de controlo;
confirmar o prefixo "PT50" e validar o NIB conforme indicado
Como validar? Depende do emissor, do tamanho do
em cima. Por esse motivo no reproduzimos aqui o algoritmo
nmero e do algoritmo. Na maioria dos casos utilizado o
de validao do IBAN para o caso internacional.
algoritmo de Luhn.
IIII: Cdigo da instituio financeira (letras no caso por- Como validar? Devem ser usadas tabelas de base de
tugus); dados com os valores possveis. No pior caso, validar ape-
nas as gamas indicadas em cima.
CC: Cdigo ISO 3166-1 Alpha-2 do pas (e.g. "PT");
Cdigos DCF e NUTS
LL: Cdigo de localizao (cidade ou outra);
Os cdigos de Distrito, Concelho e Freguesia so utilizados
bbb: Cdigo do balco, referncia interna ou no utiliza- por entidades governamentais para diversos fins, desde as
do; Finanas Comisso Nacional de Eleies. um sistema de
diviso territorial hierarquico ("DDCCFF"), onde cada compo-
E.g. "CGDIPTPL" (Caixa Geral de Depsitos - geral) nente usa 2 dgitos numricos:
E.g. "CGDIPTPLOSF" (Caixa Geral de Depsitos -
DD: Cdigo de distrito, parcialmente baseado no ISO
offshore da Madeira)
3166-2:PT
Carto Bancrio
- 01-18 = Continente;
Os cartes bancrios so compostos por um nmero varivel
- 19-22 = Obsoletos, antigos distritos das Regies
de dgitos numricos (mximo 19, tpico 16). Os primeiros dgi-
Autnomas;
tos correspondem entidade emissora e o ltimo ao dgito de
controlo (e.g. "MIII IInn nnnn nnnC"): - 31-32 = Regio Autnoma da Madeira (diviso por
ilhas);
M: Major Industry Identifier (MII). Valores tpicos so:
- 41-49 = Regio Autnoma dos Aores (diviso por
- 3: American Express, Diners Club, etc. ilhas).
- 4: Visa, Visa Electron, etc.
CC: Cdigo de concelho dentro do distrito. Actual-
- 5: MasterCard, Maestro, etc. mente existem pouco mais de 200 concelhos;
- 6: Discover Card, Maestro, etc. FF: Cdigo de freguesia dentro do concelho. Actual-
mente existem pouco mais de 3000 freguesias, mas
MIII II: Issuer Identification Number (IIN), incluindo o MII
os cdigos das extintas freguesias (originalmente
em cima, correspondente ao banco emissor;
cerca de 4100) foram mantidos.
72
Segurana
SEGREDOS DE NUMERAO
A entidade que gere o Cdigo Postal Portugus fornece Cdigo do produto (dimenso varivel at preencher
tabelas com a correspondncia entre cdigo postal e DCF. 12 dgitos): Atribudo pelo fabricante;
Os cdigos NUTS (Nomenclaturas de Unidades Territo-
Dgito de controlo (1 dgito).
riais Estatsticas) so uma classificao de zonas administrati-
vas definidas ao nvel Europeu: Alguns prefixos tm significado especial:
NUTS-0: Cada um dos pases da Unio Europeia; Comeados por 0 so cdigos UPC-A usados nos
EUA (restantes 12 dgitos iguais);
NUTS-1: Primeira diviso dentro de cada pas. Em Por-
tugal h 3 (PT1=Continente, PT2=Aores, Comeados por 2 so de distribuio restrita e podem
PT3=Madeira); ser criados por qualquer retalhista para uso local (e.g.
fruta a peso no momento);
NUTS-2: Segunda diviso. Em Portugal apenas o Conti-
nente usa esta diviso (PT11=Norte, PT16=Centro, Comeados por 978 e 979 para o ISBN (restantes 10
PT17=Lisboa, PT18=Alentejo, PT15=Algarve), enquanto dgitos do ISBN);
as Regies Autnomas no tm diviso (PT20=Aores,
PT30=Madeira); Comeados por 977 para o ISSN.
Como validar? Depende do tipo de cdigo de barras.
NUTS-3: Terceira diviso (E.g. PT11A=Porto,
Normalmente a validao j feita nos leitores por hardware
PT170=Lisboa);
mas poder ser complementada por validao por software.
NUTS-4 / LAU-1: Diviso administrativa local, corres-
pondente a Concelhos (compatvel com DCF);
73
Segurana
SEGREDOS DE NUMERAO
Publicao (dimenso varivel); O International Standard Serial Number (ISSN), defi-
nido no ISO 3297, um nmero de 8 dgitos utilizado para
Dgito de controlo (1 dgito). identificar publicaes peridicas (revistas, jornais, etc.).
Poder ter o prefixo "ISSN":
AUTOR
Escrito por Andr Melancia
Independent Developer/DBA/Consultant. Microsoft Certified Trainer (MCT) focusing on SQL Server, Azu-
re and IoT. 17+ years' fun developing information and multimedia systems, DBA, project and IT manage-
ment. PowerShell Portugal, IT Pro Portugal and IoT Portugal communities organiser. IPv6 Portugal, DNS-
Sec Portugal and Windows Development Portugal online communities moderator. Actively volunteering,
organising, speaking or just participating at community meetings and events like SQLSaturdays, SQLBits,
SQLRelay, Maker Faire Lisbon, Arduino/Genuino Day Lisbon, Global Azure Bootcamp Lisbon, etc.
Proud uncle and food devouring expert, with dangerous ussy cat as companion.
74
No Code
ShiftAppens 2017
Raspberry Pi Zero W
INTERFACE HUMANO-COMPUTADOR, NANOTECNOLOGIA E A DEPENDNCIA TECNOLGICA.
No Code
SHIFTAPPENS 2017
A meio do passado ms de Fevereiro, nos dias 17, Coimbra, o Alma Shopping e tambm outros igualmente im-
18 e 19, deu lugar no pavilho Mrio Mesquita mais uma portantes.
edio do SHIFT APPens, mais propriamente a 4 edio do
Evento. Como atividade principal era pedido aos participan-
tes que durante os trs dias do evento pudessem desenvol-
ver uma aplicao sua escolha, formando tambm equipas
dinmicas onde vrias personalidades de programao e
design se poderiam misturar. No fim dos trs dias, e sendo
prometido muito cdigo e caf por parte da organizao do
Shift, os participantes poderiam apresentar os seus projetos
ao jri do evento (Carlos Mota Representante do Google
Developers Coimbra; Alcides Marques - Representante do
Laboratrio de Informtica do Instituto Pedro Nunes; Joana
Brites - Representante da Faculdade de Letras da Universi-
dade de Coimbra; Tiago Henriques - Representante da Wit
Software), e serem ento premiados pelo seu trabalho
E como no poderia deixar de ser referido, a marca
(existindo claro, o 1, 2 e 3 prmio). Em conversa com o
Licor Beiro preparou um espao Lounge onde os participan-
relaes pblicas do evento, Filipe Mendes, podemos perce-
tes poderiam recarregar baterias ao longo destes trs dias,
ber que este ano o Hackathon teve bastantes mais participa-
no esquecendo a Boundi, que auxiliou os participantes com
es que nos anos anteriores.
o seu caf e o Mr. Pizza e Rei dos Frangos com a habitual
comida de Hackathon! Alm das Talks (conversas por parte
das empresas patrocinantes), existiram tambm vrios quizes
de cultura geral neste evento, ajudando os participantes a
estender a sua mente. Falemos ento de nmeros: O Shift
APPens contou com a presena de 160 participantes (30%
dos participantes vieram de fora de Coimbra e estima-se que
10% dos participantes eram do sexo feminino), 20 indivduos
de STAFF e ainda 25 voluntrios Juntamente com o IPN
(Instituto Pedro Nunes em Coimbra), o STAFF e os volunt-
rios construram toda a infraestrutura de eletricidade e inter-
net do evento (sendo que os cabos foram cedidos por um dos
patrocinadores do evento). Uma grande novidade este ano foi
que, atravs de uma plataforma chamada Slack, o STAFF e
os participantes do evento puderam estar sempre em contac-
to vendo os participantes quais as prximas atividades a
desenvolver atravs da plataforma. No entanto, esta edio
teve um formato um tanto diferente das duas primeiras, no
existindo agora mentores, mas sim um jri.
76
No Code
SHIFTAPPENS 2017
Quando questionado sobre esta questo, Filipe
Mendes respondeu-nos que para os participantes era mais
fcil aceitar indivduos que tivessem mais experiencia na sua
prpria equipa, ou seja, todos os participantes preferiam ser
ajudados por algum que trabalhasse em conjunto com eles, e
da o evento ter ento comtemplado a inscrio de pessoas
que no fossem apenas estudantes, mas que tambm traba-
lhassem ou tivessem alguma experincia na rea. Contando
com vrios apoiantes de peso ao longo dos anos, no pode-
mos deixar de reparar que nomes como a Microsoft ou a
Deloitte deixaram de fazer parte deste evento, o que os parti-
cipantes e STAFF do Shift vm como uma perda significati-
va.
Podemos referir que mais um ano o SHIFT APPens
foi um sucesso, e que para as prximas edies se esperam
coisas ainda mais random e espetaculares!
AUTOR
Escrito por Filipa Antunes Peres.
Licenciada em Design de Moda e Txtil e Mestre em Marketing, conta ainda com uma especializao em Web Design. Desde
pequena que desenvolveu interesse em vrias reas que tenham a ver com investigao social.
77
No Code
RASPBERRY PI ZERO W
Os leitores mais atentos a estas andanas devem CPU: ARM11 funcionando em 1GHz
lembrar-se que numa edio anterior j falamos acerca do
Raspberry Pi Zero, lanado em Novembro de 2015. Ora esta RAM: 512MB
nova placa o mesmo Raspberry Pi Zero mas melhorado
em dois pontos que podem ser essenciais para alguns pro- Wireless: 2.4GHz 802.11n LAN sem fio
jectos. A verso com a letra W que se juntou ao nome da Bluetooth: Bluetooth Classic 4.1 e Bluetooth LE
primeira placa, vem principalmente acrescentar o Wireless e
o Bluetooth 4.0. Estas so de facto as vantagens integradas Alimentao: 5V, fornecido atravs de conector micro
nesta nova verso de uma das placas mais famosas no mun- USB
do da tecnologia.
Vdeo & udio: vdeo 1080p HD e udio via mini-HDMI
Ilustrao 2 Raspberry Pi Zero W visto de trs
78
No Code
RASPBERRY PI ZERO W
AUTOR
Escrito por Rita Peres
Natural de Castelo Branco, licenciou-se em Engenharia Informtica pela Universidade da Beira Interior.
Membro do P@P desde Janeiro de 2010. Embaixadora das Geek Girls Portugal Ncleo de Lisboa.
79
25 | 26 | 27 May 2017
O ISELTech17 , que decorrer entre os dias 25 e 27 de Maio no campus do Instituto Superior de Enge-
nharia de Lisboa (ISEL) , um evento aberto a estudantes, trabalhadores e entusiastas de tecnologia que
queiram adquirir novos conhecimentos e demonstrar as suas capacidades, num espao aberto discusso
entre participantes e speakers, abordando temas da atualidade tecnolgica, como: Mobile Development,
Cloud, Web, Gaming, AR/VR, BigData, Internet of Things, Network Engineering e Cibersegurana.
Durante os trs dias do evento sero realizados Workshops para ha rd e soft skills, concursos e sorteios
de licenas de software (estgios, licenas JetBrains e Sketch) bem como diversas talks. O habitual
espao de recrutamento e exposies tambm estar presente, e contar com a presena de entidades na-
cionais e internacionais. O ltimo dia fica guardado para o painel de debate sobre Cibersegurana, com o
tema Segurana na Internet: o que ve ndemos de ns?, procurando abordar temticas como a produtiza-
o do ser humano e a vulnerabilidade da sua privacidade, bem como a ausncia de informao e regula-
mentao, quais os desafios emergentes da segurana na internet e como educar as populaes para tal.
Se te interessas por tecnologia, ters certamente vrias sesses que te iro interessar.
#SocialMedia
Na divulgao nas redes sociais, recomendamos o uso da seguinte hashtag: #ISELTech
+Info
Site/Tickets: iseltech.isel.pt
Sponsors: iseltech.isel.pt#sponsors
Facebook: /iseltech
Slack (convite): https://goo.gl/yIFeri
E mail: iseltech@isel.pt
No Code
INTERFACE HUMANO-COMPUTADOR, NANOTECNOLOGIA E A DEPEN-
DNCIA TECNOLGICA.
Introduo Comenta Jordo (2009) que a nanotecnologia se
encontra empregada em mais de oitocentos produtos,
O presente release tem por finalidade abordar como a
destacando como maior uso a produo de
criao de interfaces avanadas propiciam novos avanos
microprocessadores, afirmando se encontrar
em diferentes reas do conhecimento. Neste contexto, o foco
microprocessadores com 45 nm de tamanho. Cita seu uso
discutido permeia questes sobre a criao e o
em outras reas ao afirmar que:
desenvolvimento da nanotecnologia que pode estar direta ou
indiretamente alterando a interao do homem com o esta tecnologia no foi criada somente para ajudar na
computador. informtica, mas para revolucionar de maneira geral
em qualquer rea onde fosse necessrio. Atualmente,
Um ponto evidente que o imaginrio proposto nas
pode-se relatar a aplicao da nanotecnologia na
produes cinematogrficas, principalmente no que tange a
Medicina, na Qumica, na Fsica quntica, nas
fico cientfica apresenta grandes possibilidades de
indstrias que criam prottipos aeroespaciais,
aplicao no uso de Interfaces Humano-Computador
refinarias e muitas tantas outras reas.
(doravante IHC), tanto no aspecto positivo e benevolente
como pode ser percebido na produo Viagem Apesar de o termo nanotecnologia ter sido cunhado
Fantstica (Fantastic Voyage) de 1966, como no aspecto em 1974 (Jordo, 2009), referencias a esta possibilidade
sombrio e devastador na produo Exterminador do foram apresentadas no cinema, principalmente no estilo de
Futuro (The Terminator) de 1984. Cabe como ilustrao um produo da fico cientfica. A primeira referncia a esta
breve comentrio sobre o filme Minority Report de 2002 que possibilidade ocorreu no ano de 1966 quando os estdios
apresenta um estilo de interface, introduzida tempo depois 20th Century Fox produziram o filme Fantastic Voyage
no console de videogame XBOX da empresa Microsoft com baseado no livro homnimo, escrito por Isaac Asinov que
o perifrico Kinect o qual proporciona uma mecnica de retrata um grupo de mdicos e cientistas que so
jogabilidade semelhante mostrada no filme. miniaturizados em um submarino a uma escala microscpica
e introduzidos em um paciente para destrurem um cogulo
O estudo do tema IHC no est somente presente no
sanguneo.
formato visual da tela de um computador ou no formato
ergonmico que determinado perifrico possa ter para a Passados os anos a miniaturizao de um submarino
interao com certo sistema. Este conceito vai a um nvel com tripulao ainda no possvel, mas possvel a
mais alm. construo de pequenos robs, como os chamados robs de
DNA - DeoxyriboNucleic Acid (ADN - cido
Desoxirribonucleico) feitos de material gentico, sendo estes
Nanotecnologia nano robs que podem carregar determinado anticorpo com
a finalidade de atacar clulas cancergenas, preservando as
Antes de conceituar o que vem a ser nanotecnologia,
clulas saudveis de acordo com exposto pelo professor
cabe conceituar o que vem a ser nanmetro. De acordo com
Stevens Rehen em entrevista ao programa Globo News
Jordo (2009) nanmetro uma forma de medida como so
Cincia e Tecnologia no Brasil (GLOBO, 2013).
o metro e o quilmetro, sendo 1 nm (um nanmetro)
equivalente a um milionsimo do milmetro (SETTI, 2012) ou Na rea mdica Jordo (2009) aponta que:
ainda a bilionsima parte de um metro, sendo esta medida
invisvel a olho nu e comumente utilizada para a medio de
ligaes qumicas (FUNDACENTRO, 2013). temos como exemplo aparelhos para diagnosticar
determinadas doenas, as quais no podem ser
Jordo (2009) adverte que o nanmetro no uma
detectadas apenas com base em sintomas e exames
partcula ou um componente da eletrnica, mas apenas
comuns. Alm disso, a nanotecnologia muito
uma mera forma de medida, acrescenta que o nome
utilizada para criar remdios, afinal, trabalhar com
nanotecnologia, escolhido em 1974 na Universidade
componentes qumicos de tamanho to pequeno,
Cientfica de Tquio decorre do pequeno tamanho de vrios
exige uma tecnologia minscula o suficiente.
itens utilizados para a construo de componentes de alta
tecnologia. Para a rea de estudo da IHC, segundo Gargin (2010,
p. 78) os objetos disponveis em um ambiente podero se
De acordo com o Guia do Estudante (2013)
tornar dispositivos de integrao entre os seres humanos
nanotecnologia a cincia que projeta e desenvolve
como parte de interfaces cada vez mais invisveis e
produtos e processos tecnolgicos a partir de partculas
integradas ao ambiente, graas aos avanos na
minsculas.
81
No Code
INTERFACE HUMANO-COMPUTADOR, NANOTECNOLOGIA E A DEPENDNCIA TECNOLGICA.
miniaturizao desses dispositivos, tornando-os mais computador em substituio a tripulao humana. O curioso
portteis e presentes no cotidiano das pessoas e acrescenta: no episdio so os questionamentos advindos da experincia
proposta, considerada inaceitvel pelo Capito Kirk em ser
substitudo por um computador. O curioso o vis mostrado
Os dispositivos reagiro ao que os seres humanos em relao a uma sociedade acostumada a usar elementos
desejam, antecipando suas necessidades de tecnolgicos avanados como a forma de comunicao
informao, numa interao que ser mais natural e verbal com o computador da nave, onde a IHC quase que
intuitiva. Eles reconhecero e contextualizaro a humana no lado do computador. Este episdio mostra bem o
pessoa ou pessoas sobre o ambiente em que estejam fato de se usar os recursos tecnolgicos como ferramentas
inseridas. A obteno de informaes ocorrer, a de apoio, mas no como substitutos. Assim sendo, este de
partir dos dados existentes nas mais diversas bases, fato o grande desafio na concepo de hardware, software e
de modo muito rpido e todos os campos das cincias na forma de interface destes componentes com o ser
sero afetados pela facilidade e velocidade trazidas humano de maneira que venham a ajudar a sociedade
ao modelo de colaborao. humana a viver melhor, mas no a sucumbir em si mesma.
A partir desta exposio, leva-se a crer que a FUNDACENTRO. Nanmetro. Brasil: Ministrio do Trabalho
nanotecnologia est influenciando a criao de IHC cada vez e Emprego, 2013. Disponvel em: <http://
mais simples, amigveis e adaptadas as necessidades www.fundacentro.gov.br/conteudo.
humanas. asp?D=Nano&C=1558&menuAberto=1556>. Acesso em: 3
de mai. 2013.
Na rea de sade, j esta proporcionando a mdicos
cirurgies maneiras de realizarem cirurgias menos evasivas GARGIN, S. M. Estudo das Evolues das Interfaces
com o uso de robs programados para determinada tarefa, Humano-Computador. So Paulo: Escola de Engenharia de
alm do desenvolvimento de medicamentos a partir dessa So Carlos da Universidade de So Paulo, 2010.
tecnologia. Esta uma maneira de uso de IHC, alm das
GLOBO. Globo News Cincia e Tecnologia. Direo:
janelas dos ambientes grficos encontrados nos
Eugenia Moreyra. Rio de Janeiro: Direo Geral de
computadores e dispositivos de comunicao.
Jornalismo e Esporte, 2013 [produo]. 21,38 min, colorido.
Na rea da informtica e Tecnologia da Informao as Disponvel em: <http://globotv.globo.com/globo-news/globo-
IHCs so mais percebidas, principalmente no formato de news-ciencia-e-tecnologia/t/todos-os-videos/v/cientista-fala-
comunicao que os programas efetuam com o usurio. No sobre-a-ciencia-mostrada-no-cinema-e-sua-possibilidade-real
entanto, h diversos exemplos de interfaces mal elaboradas -de-existir/2427589/>. Acesso em: 2 de mai. 2013.
que transforma o usurio em um jquei de mouse (jquei de
GUIA DO ESTUDANTE. Nanotecnolgia. Brasil: Editora Abril,
rato). Mas h as bem sucedidas como as existentes nos
2013. Disponvel em: <http://guiadoestudante.abril.com.br/
tablets e smartphones que proporcionam a sensao de
profissoes/ciencias-exatas-informatica/nanotecnologia-
folhear a tela.
687230.shtml>. Acesso em: 8 de set. 2016.
Apesar das evolues existentes e daquelas que
JORDO, F. O que nanotecnologia?. Brasil: TecMundo,
ainda viro necessrio tomar o cuidado para no ser
2009. Disponvel em: <http://www.tecmundo.com.br/
seduzido pelo canto da sereia, pois a humanidade est se
amd/2539-o-que-e-nanotecnologia-.htm>. Acesso em: 23 de
tornando cada vez mais dependente dessas tecnologias,
ago. 2016.
ficando cada vez mais sedentria e acostumada com essas
mordomias, corre-se o risco de se ter um mundo similar ao SETTI, R. 1 Milionsimo de Milmetro. Brasil: Revista Veja,
mostrado no filme Wall-e dos estdios Disney. 2012. Disponvel em: <http://veja.abril.com.br/blog/ricardo-
setti/tag/1-milionesimo-de-milimetro/>. Acesso em: 3 de mai.
Cabe, dentro do exposto, questionar um episdio da
2013.
srie Star Trek clssica chamada o Computador Supremo,
onde proposto instalar na nave USS Interprise um
AUTOR
Escrito por Augusto Manzano
Natural da Cidade de So Paulo, tem experincia em ensino e desenvolvimento de programao de software desde 1986.
professor da rede federal de ensino no Brasil, no Instituto Federal de Educao, Cincia e Tecnologia. tambm autor, possuin-
do na sua carreira vrias obras publicadas na rea da computao.
82
Veja tambm as edies anteriores da
e muito mais em
53 Edio - Agosto 2016 50 Edio - Setembro 2015
54 Edio - Janeiro 2017 51 Edio - Dezemb ro 2015