Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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 Programao Gentica - Ricardo Cristvo Miranda
A PROGRAMAR
ELECTRNICA
47 Criptografia e segurana por hardware com Arduino/Genuino ou outros sistemas por I2C - Antnio Santos
COLUNAS
51 Interagindo com pginas web com C# - Bruno Sonnino
56 SQL Curtas - Intervalos de datas - Andr Melancia
57 Kernel Panic - WebSummit 2016 - Rita Peres
ANLISES
60 Desenvolvimento gil de Software Guia Prtico, 1 edio - Antnio Cruz
52 HTML 5 4a Edio Atualizada e Aumentada - Rita Peres
SEGURANA
65 Wifi Air Denial - Rita Peres
71 "30 30 37 - For Your Eyes Only" - Andr Melancia
72 NSA Secrets - Hacking SQL Server - Dynamic Data (UN)Masking - Andr Melancia
NO CODE
80 A primeira comunidade portuguesa de mulheres em tecnologia apresenta-se com novo nome e objetivos mais ambici-
osos - Vnia Gonalves
81 INSTALANDO UM SERVIDOR VPN NUM RASPBERRY PI - Antnio Santos
84 Segurana Familiar Microsoft no Windows 10: Um guia para Pais e Educadores - Nuno Silva
91 GameJAM - Antnio Santos
EVENTOS
PowerShell Portugal #4: 2017-01-12 (qui) a partir das 18:30.
IT Pro Portugal #11: 2017-01-31 (ter) a partir das 18:30.
11 de maro o SQL Saturday Lisboa
Para mais informaes/eventos: http://bit.ly/PAP_Eventos. Divulga os teus eventos para o email eventos@portugal-a-
programar.pt
3
NOTCIAS
Franceses ganham o direito
4
TEMA DE CAPA
Programao Gentica
TEMA DA CAPA
Programao Gentica
Iremos resolver o problema do caixeiro viajante, ilus- a funo objetivo atinge determinado valor;
trando-o com um programa em Haskell (https://
www.haskell.org/). ao fim de um nmero pr-determinado de geraes;
6
TEMA DA CAPA
PROGRAMAO GENTICA
gerada uma populao inicial aleatria de 20 indiv- Init.hs:
duos. O elemento mais apto da populao inicial gera o per- max_ :: Float
curso na imagem seguinte. max_ = 100.0
Como facilmente percetvel, este percurso est lon- A funo recursiva newMap cria uma lista com a locali-
ge de ser bom se o avaliarmos em termos da distncia total zao das cidades.
percorrida
No mdulo Init.hs tambm inicializada a populao de
Ao fim de 50 geraes gerado o seguinte percurso, solues:
em que visvel que se conseguiu uma soluo muito me-
lhor (sem uma procura exaustiva no se pode afirmar que createPopulation :: Int -> Int -> IO Population
createPopulation 0 _ = return []
a soluo tima). createPopulation size nbrCities = do
individual <- createIndividual nbrCities
rest <- createPopulation (size-1) nbrCities
return (individual : rest)
7
TEMA DA CAPA
PROGRAMAO GENTICA
o campo fitness definido como Maybe Float. Depois calcFitness :: Cities -> Population -> Population
de calculada a funo objetivo para um individuo o calcFitness _ [] = []
calcFitness cities (p:ps) =
valor da sua aptido guardada aqui. Enquanto no p { fitness = Just (calcTotalDistance (map
for calculada a funo objetivo o seu valor Nothing. (findCity cities . snd) (chromosome p))) }
Podemos pensar no Nothing como o que em Java ou : calcFitness cities ps
C++ o valor Null. Em Haskell um valor do tipo May-
be pode ser Nothing ou aquilo que foi definido, neste Finalmente a funo calcFitnessPopulation faz a mi-
caso um real (float). da das distncias percorridas em todos os elementos da
populao.
Continuemos a ver o mdulo Individual.hs. De segui-
da o tipo derivado Individual estendido com Eq e Ord. Es- calcFitnessPopulation :: Population -> Float
tas duas definies permitem ordenar os indivduos da popu- calcFitnessPopulation p =
(sum $ map fit p) / fromIntegral (length p)
lao de acordo com a sua aptido. Desta forma torna-se where
trivial detetar o elemento mais vlido da populao. fit x = fromMaybe (error "Clashes unknown,
module Population, function calcFitnessPopulation")
instance Eq Individual where (fitness x)
Individual { fitness = a } == Individual
{ fitness = b } = Just a == Just b
No mdulo Population.hs so ainda definidas outras
instance Ord Individual where importantes funes, como por exemplo a funo ordPopula-
compare Individual { fitness = a } Individual tion que reorganiza os indivduos de uma populao do mais
{ fitness = b } = compare (Just a) (Just b)
apto para o menos apto.
8
TEMA DA CAPA
PROGRAMAO GENTICA
crossover :: Float -> (Individual, Individual) -> Nesta funo um cromossoma percorrido e, de
IO Individual acordo com a probabilidade atribuda para a ocorrncia de
crossover c parents = do mutaes, duas cidades trocam de posio dentro do cro-
gen <- newStdGen
let r = head $ take 1 $ randoms gen :: Float mossoma.
if c < r
then return (fst parents) mutation :: Float -> Individual -> IO Individual
else do mutation mutationRate i = do
gen' <- newStdGen let swapGene i pos1 = case pos1 of
(-1) -> return i
Comeamos por escolher duas posies para decidir otehrwise -> do
gen <- newStdGen
quais as regies do cromossoma da cria que tem os genes let r = head $ drop (snd $ chromosome
do pai ou da me. Entre os pontos selecionados, rs, o cro- i !! pos1) $ randoms gen :: Float
mossoma uma cpia do cromossoma do primeiro progeni- if m < r
then swapGene i (pos1-1)
tor. else do
gen' <- newStdGen
let rs = take 2 $ randomRs (0, length let pos2 = head $ drop (snd $
(chromosome $ fst parents)) gen' :: [ Int ] chromosome i !! pos1)
let pos1 = minimum rs $ randomRs (0, length
let pos2 = maximum rs (chromosome i) - 1) gen' :: Int
let g1 = (pos1, snd $ chromosome
let ( _, chromosomeFstParent ) = unzip i !! pos2)
(chromosome $ fst parents) let g2 = (pos2, snd $ chromosome
let ( _, chromosomeSndParent ) = unzip i !! pos1)
(chromosome $ snd parents) let i' = modifyChromosome
(modifyChromosome i g2) g1 -- swaping genes
let fstParentContrib = drop pos1 $ take pos2 swapGene i' (pos1-1)
chromosomeFstParent swapGene i (length (chromosome i) - 1)
Visto que nenhuma cidade pode ser repetida, retira-
mos do cromossoma do segundo progenitor todos os genes A funo recursiva offspring cria n indivduos para a
que j esto no filho, isto feito em sndParentContrib. nova gerao a partir da gerao anterior. Comea por sele-
cionar dois pais, cruza os seus cromossomas e sofre muta-
let sndParentContrib = [ x | x <- chromoso- o.
meSndParent, notElem x fstParentContrib ]
offspring :: Int -> Int -> Float -> Float -> Popu-
ChildChromosome o cromossoma criado pelo cru- lation -> IO Population
zamento dos cromossomas dos pais. offspring 0 _ _ _ _ = return []
offspring n tSize m c p = do
let childChromosome = take pos1 sndParen- individual <- selectParents tSize p >>= crosso-
tContrib ver c >>= mutation m
++ fstParentContrib rest <- offspring (n-1) tSize m c p
++ drop pos1 sndParentContrib return (individual : rest)
A funo newGeneration chamada a cada iterao
let child = newIndividual (zip [ 0.. ]
childChromosome) do programa. Esta funo preserva de forma elitista os e
indivduos mais aptos da gerao anterior, garantindo que os
if length (chromosome $ fst parents) /= melhores cromossomas no so perdidos entre geraes.
length (chromosome child) Depois so criados novos indivduos de forma a manter o
then error "Length mismatch, module
Population, function crossover. \n" tamanho da populao estvel.
else return child
newGeneration :: Int -> Int -> Float -> Float
Outra funo fundamental a mutation. -> Cities -> Population -> IO Population
newGeneration e t m c cs ps = do
let pElite = take e $ ordPopulation ps
ps' <- offspring (length ps - e) t m c ps
E D A C B return (calcFitness cs $ pElite ++ ps')
Cidades
9
TEMA DA CAPA
PROGRAMAO GENTICA
tipo em texto, sendo desta forma fcil escrever para o ecr args <- getArgs
ou para um ficheiro. if head args == "--help" || null args
then helpMessage
data City = City { id :: Int else case length args of
, pos :: (Float, Float) } deri- 7 -> do
ving Show
newCity uma interface para abstrair o tipo e O primeiro argumento nmero de geraes que o
facilitar a definio de cidades.
newCity :: Int -> (Float, Float) -> City programa gerar.
newCity i (x, y) = City { City.id = i
, pos = (x, y) } let iter = read $ head args :: Int
A funo squareDistance calcula a distncia entre 2 O segundo argumento o nmero de cidades a percorrer.
cidades. A distncia dada pela equao:
let nbrCities = read (args !! 1) :: Int
mas, devido ao facto de o clculo da raiz quadrada ser uma let size = read (args !! 2) :: Int
operao computacionalmente muito pesada, utilizmos o
quadrado da distncia que, em termos de funo objetivo O quarto argumento a probabilidade de um cromos-
produz o mesmo resultado na seleo do indivduo mais soma sofrer mutao.
apto, ou seja: let mutationRate = read (args !! 3) ::
Float
O quinto argumento a probabilidade de um indiv-
duo no ser preservado entre geraes, sendo substitudo
squareDistance :: City -> City -> Float por uma cria.
squareDistance a b =
(fst (pos a) - fst (pos b)) ^ 2 + (snd (pos a) - let crossoverRate = read (args !! 4) :: Float
snd (pos b)) ^ 2
O sexto argumento define o nmero de indivduos, os
O mdulo Cities.hs define o tipo Cities, que uma
mais aptos da sua gerao, que so preservados entre gera-
lista de cidades e a funo findCity que encontra uma cidade
es, a elite.
numa lista de cidades a partir do seu nome (que no caso do
nosso programa um nmero inteiro. let elite = read (args !! 5) :: Int
type Cities = [ City ] O stimo e ltimo argumento define o tamanho dos
findCity :: Cities -> Int -> City torneios de seleo. A seleo dos progenitores por torneio
findCity cs id = head $ filter (\ c -> City.id c == exige que se escolha aleatoriamente este nmero de indiv-
id) cs duos da populao e de seguida se escolha o mais apto
entre eles.
O mdulo principal
let tournamentSize = read (args !! 6) :: Int
O mdulo principal, chamado Main.hs, serve apenas
para colar o programa. Tem uma inicializao em que as
Agora vamos criar aleatoriamente as cidades, gerar
opes passadas por argumento so interpretadas e gerada
uma populao inicial e calcular a sua aptido.
a populao inicial. O ciclo principal invoca cada nova gera-
o de programas at um nmero limite de geraes e, final- cities <- newMap nbrCities
mente, so produzidos os resultados sob a forma de um rela- p <- createPopulation size nbrCities
trio na consola e um grfico que mostra a evoluo da fun- let population = calcFitness cities p
o objetivo para a populao e para o melhor indivduo de Chagmos agora ao ciclo principal que ser invocado
cada gerao. recursivamente o nmero de vezes que se definiu como o
nmero de geraes. A funo loop ser apresentada de
Comecemos por ver a funo main, em que encontra-
seguida.
mos todo o controle do programa. Visto que esta funo
muito grande vamos fazendo a sua descrio ao longo da fitness <- loop 0 iter elite
mesma. getArgs permite capturar uma lista de argumentos tournamentSize mutationRate
crossoverRate cities population
quando se invoca um programa pela consola. De seguida
verifica-se se foram detetados 7 argumentos. Se o nmero Chegmos ao final do programa com a apresentao
de argumentos estiver errado o programa aborta e aparece dos resultados e a gerao de um grfico com a evoluo da
uma mensagem a explicar a forma correta de correr o pro- funo objetivo.
grama (funo helpMessage).
print $ head fitness
main :: IO () print $ last fitness
main = do printGraphic fitness
10
TEMA DA CAPA
PROGRAMAO GENTICA
print "End of program, aditional output in A localizao das cidades a seguinte:
graphic Fitness.png"
_ -> do "City 12, @ (65.06525,9.130234)"
putStrLn "Invalid input, invalid number of
arguments" "City 11, @ (1.7288387,21.4126)"
putStrLn "Type --help"
"City 10, @ (96.6185,40.78105)"
A funo loop apresentada abaixo. Em cada gera- "City 9, @ (70.04279,37.5175)"
o calculada a sua aptido total e identificado o individuo
"City 8, @ (0.20877123,19.957483)"
mais apto.
"City 7, @ (7.744688,78.13819)"
loop :: Int -> Int -> Int -> Int -> Float -> Float
-> Cities -> Population -> IO [ (Int, Float, "City 6, @ (0.89448094,54.392082)"
Float, Int) ]
loop _ 0 _ _ _ _ cs p = do "City 5, @ (69.91828,98.07392)"
printSolution (head $ ordPopulation p) cs
return [] "City 4, @ (56.88199,29.965574)"
loop n iter e tSize m c cs p = do
p' <- newGeneration e tSize m c cs p "City 3, @ (11.36232,58.524315)"
let f = fromMaybe (error "Fitness not available,
module Main, function loop") "City 2, @ (54.007877,59.29535)"
(fitness (head $ ordPopulation
p')) "City 1, @ (93.36562,77.753075)"
let result = (n, f, calcFitnessPopulation p', De seguida apresentada a aptido da soluo en-
length p') contrada. O elemento mais apto da primeira gerao tem
rest <- loop (n+1) (iter-1) e tSize m c cs p' uma aptido (soma do quadrado das distncias entre cida-
return (result : rest) des) de 22418,232, com o percurso seguinte.
Correr o programa
Para gerar o executvel escreva na consola:
cabal install -j
11
TEMA DA CAPA
PROGRAMAO GENTICA
Este percurso o seguinte: A PG apenas necessita de uma forma de gerar solu-
es iniciais e uma frmula de avaliao de solues (funo
"Visit: 0, city 7" objetivo). Tudo o resto feito de forma evolutiva sem que
"Visit: 1, city 2"
"Visit: 2, city 5" seja necessrio incorporar nenhum conhecimento do dom-
"Visit: 3, city 1" nio em que se est a trabalhar.
"Visit: 4, city 10"
"Visit: 5, city 9" Aconselho os leitor a correr o programa com variao
"Visit: 6, city 12" dos parmetros de entrada e poder observar que a PG
"Visit: 7, city 4"
"Visit: 8, city 3" muito robusta, sendo capaz de gerar boas solues para
"Visit: 9, city 6" uma vasta gama de parmetros (tamanho da populao,
"Visit: 10, city 11" mutao, cruzamento, etc.).
"Visit: 11, city 8"
Aplicaes correntes para a PG incluem:
tambm gerado um grfico com as evolues da
aptido mdia e da aptido do melhor elemento de cada
projeto de circuitos eltricos e eletrnicos;
gerao. A tendncia para a distncia mdia da populao programar robots ou drones;
de diminuio mas, como se pode observar, h oscilaes.
Em cada gerao as crias recebem parte do seu cromosso- desenvolvimento de programas em linguagens espe-
ma do pai e outra parte da me. Depois ainda poder sofrer cficas de domnio;
mutaes genticas. Os filhos podem ser menos aptos do
que os pais. Contudo, devido presso da seleo natural, gerao automtica de programas; e
apenas os mais aptos passam os seus genes e a tendncia
correo automtica de erros em programas.
de uma melhoria da aptido mdia com o tempo.
Pensamos que alguns aspetos da Inteligncia Artifici-
al sero cada vez mais incorporados em programas conven-
cionais. Por exemplo se se incorporar funes objetivo nos
programas ser possvel elaborar anlises estatsticas entre
os dados do programa, os parmetros selecionados e a fun-
o objetivo. Desta forma poder-se- conseguir escrever
programas cujos resultados so progressivamente melhores
medida que so executados mais vezes.
E ainda...
A PG um campo muito vasto e apenas aflormos o
assunto. Duas das reas que mais curiosas so:
AUTOR
Escrito por Ricardo Cristvo Miranda
12
A PROGRAMAR
API Rest com Spring Boot (parte 1)
Programao de aplicaes cliente/servidor assentes no protocolo de
transporte UDP
PHP 7
Lets Brainfuck in Pascal!
JavaFX : Uma Breve Introduo
A PROGRAMAR
API Rest com Spring Boot (parte 1)
14
A PROGRAMAR
O NOSSO PROJECTO
O projeto que aqui propomos bem simples. Vamos Utilizado o HEIDI, crie a nova base de dados e atribua
imaginar que a nossa empresa necessita de desenvolver uma -lhe o nome de empresa_x.
aplicao mvel que permita aos elementos do departamento
Clicando de seguida em OK. A nova BD ser criada
comercial consultar em tempo real dados de clientes, criar no-
no MySQL.
vos clientes, alter-los caso necessrio ou at mesmo elimina-
los. Queremos tambm criar um LOG das operaes efetuadas Agora necessitamos de criar a nossa tabela de clien-
e dos endereos IP de onde as chamadas nossa API parti- tes dentro da base de dados que acabamos de gerar. Utili-
ram. zando o boto direito do rato em cima da base de dados
criada chegamos ao menu de criao de tabela.
15
A PROGRAMAR
API REST COM SPRING BOOT (PARTE 1)
Continuamos a adio dos campos at que todos
estejam definidos. No final teremos uma tabela como a que
se mostra na imagem.
Eliminao de um cliente.
E iremos verificar como o Spring Boot nos permite
No nos podemos esquecer de marcar o campo id co- implementar uma API de uma forma rpida.
mo sendo uma primary key (boto direito do rato em cima do Vamos ento iniciar o STS (Spring Tool Suite) e me-
nome do campo). ter mos obra
16
A PROGRAMAR
17
A PROGRAMAR
API REST COM SPRING BOOT (PARTE 1)
pt.api.entities @Basic(optional = false)
pt.api.repositories @NotNull
@Size(min = 1, max = 9)
@Column(nullable = false, length = 9)
private String nif;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 40)
@Column(nullable = false, length = 40)
private String concelho;
public ClienteEntity() {
}
Pessoalmente, prefiro comear pelas entidades, o que public void setId(Integer id) {
neste caso bastante simples, pois temos apenas uma en- this.id = id;
}
tidade a qual poderemos facilmente definir utilizando as
anotaes do javax.persistence. public String getNomeCliente() {
return nomeCliente;
Assim, no package pt.api.entities, vamos criar a classe }
ClienteEntity, usando o cdigo que mostramos a seguir. Esta public void setNomeCliente(String
classe representa um objeto correspondente a uma entrada na nomeCliente) {
nossa base de dados de um cliente. this.nomeCliente = nomeCliente;
}
package pt.api.entities; public String getNif() {
return nif;
import java.io.Serializable; }
import javax.persistence.Basic; public void setNif(String nif) {
import javax.persistence.Column; this.nif = nif;
import javax.persistence.Entity; }
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType; public String getConcelho() {
import javax.persistence.Id; return concelho;
import javax.persistence.Table; }
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size; public void setConcelho(String concelho) {
this.concelho = concelho;
@Entity }
@Table(name = "cliente",catalog = "empresa_x", }
schema = "") public class ClienteEntity implements
Serializable { At aqui nada de novo para quem j trabalhou com
bases de dados e JAVA. Criamos uma entidade que define
private static final long serialVersionUID =
1L; um objeto que representa um cliente. Note a anotao
@Id @Entity que indica que estamos perante uma entidade que
@GeneratedValue(strategy = pertence a algum domnio de persistncia.
GenerationType.IDENTITY)
@Basic(optional = false) As vantagens que o Spring Boot nos proporciona
@Column(nullable = false)
private Integer id; comeam a notar-se daqui em diante, e entramos nele a
@Basic(optional = false) partir de diversas anotaes como @AutoWired,
@NotNull @Repository, @RestController que permitem que o fra-
@Size(min = 1, max = 50) mework detecte os diversos componentes e os injecte nos
@Column(name = "nome_cliente", nullable =
false, length = 50) locais apropriados sempre que necessrio, tudo isto sem
private String nomeCliente; necessidade de recorrermos s configuraes XML ou s
18
A PROGRAMAR
19
A PROGRAMAR
API REST COM SPRING BOOT (PARTE 1)
nossa aplicao para outros RDBMS). Aps gravarmos o application.properties podemos
lanar o nosso projecto, e se tudo tiver corrido bem, no
Quanto ao cdigo para tratamento da nossa pequena
teremos qualquer erro, a ligao base de dados ir ser
base de dados, estamos concludos, no entanto neste momen-
efetuada e o apache Tomcat iniciar-se-. O projecto dever
to ainda no informamos o Spring qual a base de dados que ser executado como uma aplicao JAVA ou com uma
estamos a utilizar e como aceder a ela. Spring Boot Application.
#Mostrar o log de cada query sql Caso algum erro ocorra, reveja atentamente os pas-
spring.jpa.show-sql = true sos descritos, certificando-se especialmente que no houve
esquecimento de alguma das anotaes que so fundamen-
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update tais ao Spring.
20
A PROGRAMAR
package pt.api.controllers;
Nos casos em que no se aplique nenhuma ao ou
identificador, passaremos direto do recurso query String. import
org.springframework.beans.factory.annotation.
Baseado nestes princpios (que representam apenas Autowired;
uma opinio pessoal), podemos ento definir a semntica de import org.springframework.web.bind.annotation.
RestController;
construo dos nossos URL para darem origem aos seguintes
pontos de entrada: import pt.api.repositories.ClienteRepository;
1. http://localhost:8080/api/v1/cliente/{id} @RestController
public class ClienteController {
2. http://localhost:8080/api/v1/cliente/all
3. http://localhost:8080/api/v1/cliente?nif= @Autowired
4. http://localhost:8080/api/v1/cliente/insert private ClienteRepository clienteReposi-
tory;
5. http://localhost:8080/api/v1/cliente/update
6. http://localhost:8080/api/v1/cliente/delete/{id} }
No terceiro caso, optamos por utilizar uma varivel de
query no URL, para demonstrar a utilizao das mesmas e no
Est na hora de criar o primeiro ponto de entrada da
ficarmos apenas com o exemplo das variveis de path.
nossa API. Para isso vamos utilizar a anotao
Decididos os pontos de entrada, vamos ento codificar @RequestMapping. O controlador dever ficar agora com o
o nosso controlador, que ir ser responsvel por gerir o mapea- seguinte cdigo:
mento dos URL.
package pt.api.controllers;
import java.util.Collection;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.
annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.
annotation.PathVariable;
import org.springframework.web.bind.
No package pt.api.controllers, vamos criar uma nova annotation.RequestBody;
classe a que iremos chamar ClienteController. import org.springframework.web.bind.
annotation.RequestMapping;
Nesta classe iremos utilizar a anotao import org.springframework.web.bind.
annotation.RequestMethod;
@RestController, a qual ser colocada imediatamente antes da import org.springframework.web.bind.
definio do nome da classe, indicando que esta uma classe annotation.RequestParam;
que ir ter funes de controlador e ir tratar dos pedidos de import org.springframework.web.bind.
annotation.RestController;
HTTP. Esta anotao, tem ainda a convenincia de marcar a
classe de forma a que todos os seus mtodos devolvam um import pt.api.entities.ClienteEntity;
objeto de um tipo definido. import pt.api.repositories.ClienteRepository;
21
A PROGRAMAR
API REST COM SPRING BOOT (PARTE 1)
utilizamo-lo na assinatura deste mtodo como forma de ace-
@RestController der ao objeto HttpServletResponse que utilizaremos para
public class ClienteController { devolver cdigos de erro HTTP.
@Autowired Por ltimo temos o parmetro id o qual deduzido a
private ClienteRepository clienteRepository;
partir do URI e se encontra anotado como @pathVariable,
// EndPoint #1 permitindo assim que o Spring possa determinar que o deve
@RequestMapping(value = "/api/v1/cliente/ recolher a partir do URI atribuindo-o de seguida String id.
{id}",
method = RequestMethod.GET, Uma das caractersticas das pathVariable beneficiarem de
produces = converso de tipo automtica. No entanto parece-nos mais
MediaType.APPLICATION_JSON_VALUE) lgico atribuir-lhes o tipo String e manusear a sua validao
e converso via cdigo, pois no existe nenhuma garantia de
public ClienteEntity getByClienteId(
HttpServletRequest request, que o pedido chegue corretamente formado e evitar assim
HttpServletResponse response, que seja atirado o erro "exception":
@PathVariable(value = "id") String "org.springframework.web.method.annotation.MethodArgum
id) throws Exception {
// verificao do ID entTypeMismatchException". Tambm se deixa a nota de
int idCliente = 0; que no caso do nome da varivel colocada dentro das cha-
try { vetas coincidir com o nome da varivel qual ser atribuda,
idCliente = Integer.parseInt(id); poderamos substituir o argumento @PathVariable(value =
} catch (Exception ex) {
response.sendError "id") String id) apenas por @PathVariable String id)
(HttpStatus.BAD_REQUEST.value());
return null; Quem j tiver tentado fazer algo semelhante sem o
} recurso a qualquer framework, ter certamente a noo da
// Fetch de um cliente por ID quantidade de cdigo que fomos dispensados de escrever.
ClienteEntity cliente =
clienteRepository.findOne(idCliente); O restante deste mtodo standard. Utilizando um
if (cliente == null) {
response.sendError bloco TryCatch tentamos converter a String clienteID num
(HttpStatus.NOT_FOUND.value()); inteiro, a fim de determinar se a mesma contm um valor
return null; vlido que possa eventualmente corresponder a um ID da
} else { tabela cliente. Se no for possvel a converso, ento algo
return cliente;
} est errado e devolvemos um erro HTTP standard indicando
} um BadRequest. Se a converso decorrer sem problemas,
recolhemos o elemento da tabela que corresponda ao ID
Vamos agora analisar este cdigo tomando especial
selecionado (que tambm poderia estar includo no bloco
ateno para as anotaes utilizadas.
trycatch).
Utilizamos @Autowired para injetar um componente, e o
Se no existir nenhum elemento que corresponda,
Spring encarregar-se de determinar (pelo tipo) qual deles
ento o Query tabela ir devolver null, e nesse caso envia-
corresponde ao pretendido. Neste caso concreto, ser o Clien-
mos tambm como resposta um cdigo de erro HTTP, caso
teRepository.
contrrio devolvemos o objeto cliente em formato JSON
Atentemos agora linha seguinte.
Nesta altura pode lanar o projecto e efetuar um pe-
queno teste. Aponte o seu browser para o endereo http://
@RequestMapping(value = "/api/v1/cliente/{id}",
method = RequestMethod.GET, produces = localhost:8080/api/v1/cliente/1 e dever obter um objeto
MediaType.APPLICATION_JSON_VALUE) JSON correspondente entidade solicitada. Se isso no
acontecer, verifique atentamente todo o cdigo digitado at
A anotao @RequestMapping ir indicar ao framework ao momento.
que dever mapear os pedidos HTTP, que se dirijam para o
Vamos agora implementar os mtodos em falta no
URI api/v1/cliente/{id}, para este controlador e logo de seguida
controlador para completar os pontos de entrada da nossa
indicamos que o mtodo disponibilizado do tipo GET e que
API.
ir produzir informao do tipo JSON. (ao colocarmos o identifi-
cador id dentro das chavetas estamos implicitamente a atribuir // EndPoint #2
-lhe o tipo de varivel de path). @RequestMapping(value = "/api/v1/cliente/
all",
Nas linhas seguintes criamos o mtodo getByClienteId method = RequestMethod.GET,
que ir devolver uma resposta do tipo ClienteEntity. Como pa- produces =
rmetros iremos receber em request um objeto do tipo HttpSer- MediaType.APPLICATION_JSON_VALUE)
vletRequest, que nos ir permitir obter dados sobre o cabea- public ResponseEntity<Collection
lho do pedido HTTP (iremos necessitar deste objecto para ace- <ClienteEntity>> getAllClientes(
der a dados que iremos incluir no log). HttpServletRequest request,
HttpServletResponse response) {
O segundo parmetro do tipo HttpServletResponse, e
22
A PROGRAMAR
23
A PROGRAMAR
API REST COM SPRING BOOT (PARTE 1)
return null; enviado no BODY inclui o campo ID, e que um elemento com
} esse ID j existe na nossa base de dados, caso contrrio
devolvermos o erro NOT_FOUND , mas aqui devolvemos
NO EndPoint #4, saveCliente, j temos algo de diferente uma mensagem extra que indica Erro de ID, deixando mais
em relao aos mtodos anteriores. Agora estamos a indicar um exemplo de como incluir mensagens customizadas nas
que o mtodo HTTP que iremos aceitar o mtodo POST que resposta.
vai consumir e produzir informao no formato JSON (neste
caso nem sequer estamos a devolver informao neste forma- if (cliente.getId() == null ||
clienteRepository.findOne(cliente.getId())
to, mas poderamos ter convencionado por exemplo que este == null) {
mtodo devolveria um objeto com a informao gravada, para response.sendError
verificao pelo equipamento chamador) (HttpStatus.NOT_FOUND.value(), "Erro de ID");
return 0;
@RequestMapping(value = "/api/v1/cliente/save", }
method = RequestMethod.POST,
consumes =
MediaType.APPLICATION_JSON_VALUE, Tal como no mtodo anterior utilizamos clienteRepo-
produces = sitory.save(cliente) que neste caso ir atualizar a tabela, pois
MediaType.APPLICATION_JSON_VALUE) refere-se a um ID que j existe aproveitando essa vantagem
que o SpringData nos proporciona e que nos evita ter de
Neste mtodo tambm solicitamos que como parmetro escrever cdigo diferente para INSERT e para UPDATE.
nos seja entregue o BODY do pedido HTTP, pois no BODY
A utilizao do verbo PUT nesta situao, uma pura
que o objeto JSON, que pretendemos persistir na tabela, ser
conveno. Era perfeitamente possvel obter o mesmo resul-
enviado, atribumos-lhe o tipo ClienteEntity.
tado recorrendo ao mtodo POST. Nestas situaes, pesso-
H um outro ponto importante neste mtodo que deve- almente, gosto de utilizar o POST para inseres e o mtodo
mos analisar, e que consiste na verificao da presena ou PUT para atualizaes, embora haja quem use convenes
no do campo ID no objecto JSON que enviado para a API e diferentes.
que passamos a explicar.
O ltimo mtodo, o deleteCliente (EndPoint #6) que
O SpringData apenas nos disponibiliza um mtodo sa- trata da eliminao de uma entrada na base de dados que
ve, no existindo nenhum especifico para UPDATE, e como o apenas verifica que a varivel de path {id} um nmero intei-
que queremos aproveitar o framework e poupar na escrita de ro (como j tnhamos feito anteriormente) e trata de apagar a
cdigo, podemos fazer uma artimanha, que convencionar entrada correspondente da tabela.
que um SAVE no ter o campo id, j que o mesmo atribudo
Neste caso, e por coerncia utilizamos o verbo DELE-
automaticamente pelo MYSQL, e de forma inversa convencio-
TE do HTTP, embora novamente, poderamos ter utilizado o
namos que uma operao de UPDATE ter que ter obrigatoria-
POST sem nenhum problema.
mente um ID. Caso esta situao no se verifique, devolvemos
um erro, sendo essa a razo da verificao efetuada em: E temos aqui um CRUD funcional, que embora muito
bsico, permite que um qualquer equipamento comunique
if (cliente.getId() != null) { via HTTP com a nossa base de dados. certo que no efec-
response.sendError tuamos uma correcta validao de dados, mas esse no era
(HttpStatus.METHOD_NOT_ALLOWED.value());
} o objetivo do artigo e o leitor deve faz-lo a fim de evitar a
ocorrncia de erros.
Repare-se que neste mtodo definimos o tipo de res- COMO TESTAR A NOSSA API ?
posta como um int, pois neste caso suficiente devolvermos
A minha ferramenta de eleio para testar APIS, o
apenas o cdigo de Status HTTP e serve como exemplo para
apache Jmeter, no entanto, o mesmo uma ferramenta com-
os diversos tipos de resposta que poderemos enviar.
plexa, que nos permite uma mirade de configuraes. Neste
No mtodo updateCliente (EndPoint #4), utilizamos artigo, vamos utilizar o POSTMAN que est disponvel na
mais um dos verbos HTTP, o PUT que, tal como o anterior, Chrome Store e serve perfeitamente para o efeito. Aps ter-
definimos como consomidor e produtor de informao em for- mos o Postman instalado, vamos lana-lo e iniciar os primei-
mato JSON (embora no estejamos a devolver nada para alm ros testes.
de status codes)
Endpoint #1
@RequestMapping(value = "/api/v1/cliente/update",
method = RequestMethod.PUT,
consumes =
MediaType.APPLICATION_JSON_VALUE,
produces =
MediaType.APPLICATION_JSON_VALUE)
24
A PROGRAMAR
25
A PROGRAMAR
API REST COM SPRING BOOT (PARTE 1)
Agora vamos selecionar o mtodo PUT e atualizar um O cdigo presente neste artigo est disponvel em
item da nossa base de dados. Digite o endereo http:// https://gitlab.com/Java-exemplos/apitutorial-parte1.git
localhost:8080/api/v1/cliente/update, selecionado de seguida o
Body do pedido. Certifique-se que est marcado RAW e que o
formato JSON. Na janela imediatamente por baixo, digite um
objeto JSON, como por ex : {id:1,"nomeCliente":"Tonecas &
Tonecas Lda","nif":"999999999","concelho":"VN.Gaia"} e de
seguida clique em SEND.
No mundo JAVA,
Na janela inferior dever receber o valor 202, que cor- o framework open
responde ao status code HTTP que utilizamos para informar
que a operao correu corretamente. Se verificar, o elemento
com o ID1 da sua tabela dever estar agora atualizado.
source Spring, no
Endpoint #6 sendo o nico, qua-
se um standard para
quem pretende adotar
um padro de injeo
de dependncias /
MVC, que nos facilita
bastante a vida pois
permite que nos con-
centremos essencial-
Selecionando o mtodo DELETE, vamos digitar http://
mente nas business
localhost:8080/api/v1/cliente/delete/2 que ir indicar API que
pretendemos eliminar o item com o ID n 2 da nossa tabela. De rules evitando ter de
seguida clique em SEND.
Na janela inferior, dever receber o cdigo 200, que
desenvolver as partes
indica que a operao correu como pretendido. Se verificar, o
elemento j no dever constar da sua base de dados.
mais trabalhosas as
Agora que temos a nossa API testada, podemos efetuar
testes suplementares, colocando valores errados e verificando
quais so geridas pelo
o seu comportamento.
framework.
Na 2 parte deste tutorial, iremos ver como configurar e
implementar um sistema de log utilizando o log4J-2 e como
empacotar o JAR final que nos ir permitir transportar a nossa
aplicao Spring para qualquer servidor.
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).
26
A PROGRAMAR
27
A PROGRAMAR
PROGRAMAO DE APLICAES CLIENTE/SERVIDOR ASSENTES NO PROTOCOLO DE TRANSPORTE UDP
Criao do socket: socket tipo struct sockaddr. Contudo, consoante o tipo de protocolo
Envia pedido: sendto selecionado, empregue uma estrutura de endereo ade-
Aguarda resposta: recvfrom
Fecha socket: close quado que depois mapeada (cast) para o tipo de dados
struct sockaddr. Para o caso do IPv4, a estrutura de en-
dereo a struct sockaddr_in (Listagem 6).
Listagem 3: Pseudo-cdigo de uma aplicao cliente UDP
Aplicao servidor struct sockaddr_in {
short int sin_family;
Fase de inicializao unsigned short int sin_port;
struct in_addr sin_addr;
A inicializao da aplicao servidor envolve dois pas- unsigned char sin_pad[8];
};
sos distintos: i) criao do socket e ii) registo do socket. De struct in_addr {
seguida, descrevem-se cada um desses passos. unsigned int s_addr;
/* Endereo IPV4 / formato de rede*/
Criao do socket };
Ao nvel da aplicao servidor, a primeira operao con-
Listagem 6: Estruturas sockaddr_in e in_addr empregues
siste na criao do socket. Para o efeito, feito uso da funo
para endereos IPv4
socket cujo prottipo mostrado na Listagem 4.
O campo sin_family serve para especificar o tipo de
int socket(int domain, endereo. No caso de um endereo IPv4 deve especificar-se
int type, int protocol);
AF_INET. O campo sin_port serve para indicar o porto que
se pretende registar. O porto especificado atravs de um
Listagem 4: Prottipo da funo socket inteiro de 16 bits que deve estar no formato big endian
O parmetro domain da funo socket serve para indi- (Blinn, 2016). O formato big endian tambm designado por
car o domnio do socket. No caso de um socket IPv4, deve ser formato de rede, pois os valores numricos correspondentes
indicado AF_INET, e AF_INET6 no caso de um socket IPv6. a portos e endereos IPs devem ser especificados nesse
Neste artigo usar-se-o endereos IPv4. O parmetro type formato. Para se garantir que o porto indicado no formato
identifica o tipo de socket pretendido. Para o caso de um soc- big endian, empregue a funo htons (host-to-network-
ket UDP, deve-se indicar SOCK_DGRAM. Por fim, o ltimo short) que efetua a converso de um inteiro com 16 bits do
parmetro da funo protocol especifica o protocolo. Con- formato local para o formato big endian.
tudo, em muitos casos, os dois primeiros parmetros so sufici- O campo sin_addr corresponde a uma estrutura onde
entes para definir plenamente o protocolo. o caso com o par deve ser guardado o endereo IPv4, novamente em formato
AF_INET/SOCK_DGRAM que define univocamente um socket de rede. A funo inet_pton (Listagem 7) permite obter um
do tipo IPv4/UDP. Nestes casos, indica-se 0 (zero) no parme- endereo IP em formato de rede a partir de um endereo IP
tro protocol. Em caso de sucesso, a chamada socket devolve (v4 ou v6) especificado em texto (e.g., 192.168.120.12). O
um valor inteiro positivo que corresponde ao descritor associa- primeiro parmetro serve para especificar o tipo de endereo
do ao recm-criado socket. Note-se que a chamada socket AF_INET para IPv4 e AF_INET6 para IPv6. O segundo
apenas cria um descritor do tipo socket no sistema local, no parmetro indica o IP a converter. Finalmente, o terceiro
efetuando nenhum contacto com o exterior. parmetro especifica a zona de memria para onde deve ser
Registo do socket - bind escrita a representao inteira em formato de rede do IP. A
funo inet_ntop efetua a operao inversa, isto , cria a
A segunda operao no estabelecimento de um servidor representao em formato de texto de um endereo IP (v4
UDP consiste no registo do socket no sistema local. Para o ou v6) especificado em formato binrio. O prottipo de am-
efeito, necessrio indicar quais as interfaces IP do sistema bas as funes mostrado na Listagem 7.
local para as quais o socket deve estar ativo, bem como o por-
to (UDP). O registo do socket feito atravs da funo bind, int inet_pton(int af,
cujo prottipo mostrado na Listagem 5. const char *src, void *dst);
28
A PROGRAMAR
tamanho dos dados que manipulam: htons processa valores de no um cdigo de erro apropriado. Caso a funo
16 bits, ao passo que htonl trata valores de 32 bits. O cdigo recvfrom seja bem-sucedida, devolvido o nmero de octe-
para inicializao da estrutura de endereos mostrado na tos que foram recebidos. importante notar que o nmero
Listagem 8. A funo memset empregue para se proceder de octetos recebidos pode diferir do nmero de octetos envi-
inicializao com zeros da estrutura de endereos. ados quando o tamanho da memria especificado atravs do
par buf/len for insuficiente para acolher todo o contedo
/* Preenche a estrutura */ do datagrama. Por exemplo, caso seja especificado uma
memset(&ser_addr, 0, sizeof(ser_addr));
ser_addr.sin_family = AF_INET; zona de memria com capacidade para 100 octetos e o da-
ser_addr.sin_addr.s_addr = tagrama recebido tenha 140 octetos, apenas os 100 primei-
htonl(INADDR_ANY); ros octetos so escritos na zona de memria apontada por
ser_addr.sin_port = htons(Porto);
buf. Os restantes 40 octetos so perdidos. Em termos
tericos, o tamanho mximo de um datagrama UDP de
Listagem 8: Preenchimento da estrutura de endereo para o
65507 octetos. Em ambientes de rea alargada (internet),
registo do socket
recomenda-se que o tamanho individual de cada datagrama
Fase de pedido/resposta no ultrapasse os 512 octetos. De facto, tamanhos maiores
levam a que o datagrama seja fragmentado pela camada de
Terminada a fase de configurao, o programa servidor
rede (camada IP), o que reduz substancialmente a probabili-
entra no modo de pedido/resposta. Neste modo, o programa
dade do datagrama chegar ao destino.
repete um mesmo ciclo: aguarda por um pedido, processa-o e
envia a respetiva resposta aplicao cliente que solicitou o Recebido o pedido, o servidor procede ao seu proces-
pedido. samento, que obviamente depende da aplicao. Igualmen-
te, o formato e contedo do datagrama recebido depende do
Leitura do pedido
protocolo aplicacional. Neste artigo elaborado um protocolo
A espera pelo pedido feita atravs da funo recvfrom aplicacional muito simples que suporta trs pedidos diferen-
(Listagem 9). tes expressos pelas seguintes strings: DATA_HORA,
DATA e HORA. O pedido DATA_HORA solicita que seja
ssize_t recvfrom(int sockfd, void *buf, enviada como resposta a data/hora corrente do servidor.
size_t len, int flags,
struct sockaddr *src_addr, Similarmente, os pedidos DATA e HORA solicitam o en-
socklen_t *addrlen); vio, respetivamente, da data e da hora.
Por omisso, a funo recvfrom bloqueia o processo O envio da resposta feito atravs da funo sendto,
chamante at que seja recebido um datagrama. O parmetro cujo prottipo mostrado na Listagem 10.
sockfd corresponde ao descritor do socket. O par de par- ssize_t sendto(int sockfd, const void *buf, si-
metros buf e len especificam o endereo e tamanho da zona ze_t len, int flags, const struct sockaddr
de memria fornecida pelo utilizador e no qual escrito o con- *dest_addr, socklen_t addrlen);
tedo do datagrama recebido. O parmetro flags permite ace-
Listagem 10: Prottipo da funo sendto
der a modos alternativos da funo. Por exemplo, a opo
MSG_DONTWAIT leva a que a funo deixe de ser bloquean- O primeiro parmetro corresponde ao descritor do
te, sendo devolvida uma notificao apropriada, caso a funo socket. O segundo e terceiro parmetros indicam, respetiva-
seja chamada e no exista nenhum datagrama. Finalmente, o mente, o endereo de memria onde se encontra a mensa-
par de parmetros src_addr e addrlen preenchido pela fun- gem a ser enviada e o respetivo tamanho. O parmetro flag
o, respetivamente, com o endereo/porto da entidade remota permite configurar comportamentos especficos para a fun-
e o tamanho do endereo. Note-se que o parmetro addrlen o. Finalmente, o par de parmetros dest_addr e addrlen
um parmetro valor/resultado, significando isso que deve ser indica o endereo e respetivo tamanho de destino. Tratando-
inicializado com o tamanho da estrutura de endereo antes da se de uma resposta a um pedido de um cliente, empregue
chamada funo, caso contrrio ocorre o erro do tipo EINVAL como par endereo destino/tamanho o par endereo/
argumento invlido. Importar relembrar que o tipo de dados tamanho anteriormente preenchido pela funo recvfrom. De
struct sockaddr corresponde a um endereo dito genrico. forma anloga ao que sucede com a funo recvfrom, o valor
Para aceder aos campos do endereo IPv4 torna-se necess- de retorno da funo sendto corresponde ao nmero de oc-
rio proceder respetiva converso (cast na designao anglo- tetos enviados em caso de sucesso. Numa situao de erro
saxnica), e ter em ateno que os campos de endereo IP e devolvido o valor -1, sendo atribuda varivel errno um
porto se encontram no formato de rede. O endereo da entida- cdigo de erro apropriado. importante notar que uma exe-
de remota obviamente necessrio para que o programa servi- cuo com sucesso da funo sendto no garante que o
dor possa enviar a resposta. Funciona de forma similar ao en- datagrama chegue ao seu destino. De facto, o protocolo
dereo do remetente numa carta enviada por via postal. UDP no confivel, no garantindo a entrega dos datagra-
mas no destino, nem detetando a sua eventual perda, tal
A funo recvfrom retorna um valor inteiro. Caso tenha
como sucede no envio de uma carta por via postal. Uma
ocorrido um erro, devolvido -1 sendo atribudo varivel err-
aplicao que requeira confiabilidade na troca de mensa-
29
A PROGRAMAR
PROGRAMAO DE APLICAES CLIENTE/SERVIDOR ASSENTES NO PROTOCOLO DE TRANSPORTE UDP
30
A PROGRAMAR
31
A PROGRAMAR
PROGRAMAO DE APLICAES CLIENTE/SERVIDOR ASSENTES NO PROTOCOLO DE TRANSPORTE UDP
32
A PROGRAMAR
AUTOR
Escrito por Sandro Patrcio Domingues
professor do Departamento de Eng Informtica na Escola Superior de Tecnologia e Gesto (ESTG) do Instituto Politcnico
de Leiria (IPLeiria). Tem lecionado, entre outras, as disciplinas de Programao Avanada e Sistemas Operativos da Licenci-
atura em Engenharia Informtica. ainda docente da ps-graduao em Informtica de Segurana e Computao Forense.
Escrito por Vtor Carreira
leciona as disciplinas de Programao Avanada, Sistemas Operativos, Aplicaes para a Internet e Desenvolvimento de
Aplicaes Distribudas ao curso de Licenciatura em Engenharia Informtica da Escola Superior de Tecnologia e Gesto do
Politcnico de Leiria.
Escrito por Carlos Grilo
coordenador do Mestrado em Engenharia Informtica Computao Mvel da Escola Superior de Tecnologia e Gesto do
Politcnico de Leiria. Leciona as disciplinas de Programao Avanada, Inteligncia Artificial e Desenvolvimento de Aplicaes
Empresariais ao Curso de Licenciatura em Engenharia Informtica.
33
A PROGRAMAR
PHP 7
<?php <?php
//php 5.6 //operatorSpaceship.php
function getTotal($a, $b) { $a = 10;
return $a * $b; $b = 20;
} print_r($a <=> $b); // -1
34
A PROGRAMAR
PHP 7
$a = 20; $var1 = 10;
$b = 10; $var2 = 3;
echo "<br />"; echo $var1 / $var2 . "<br />";
print_r($a <=> $b); // 1 echo (int)($var1 / $var2) . "<br />";
echo intdiv($var1, $var2) . "<br />";
$a = "AAa"; //asc "A" -> 65 ?>
$b = "AAA"; //asc "a" -> 141
echo "<br />";
print_r($a <=> $b); // 1 Resultado
?>
8
9223372036854775807
Diviso de inteiros e constant PHP_INT_MIN -9223372036854775808
O PHP fornece algumas constantes para obtermos os 3.3333333333333
limites de tipos inteiros. At a verso 5.6, s haviam as 3
3
constantes PHP_INT_SIZE e PHP_INT_MAX, que informavam
o nmeros de bits para o tipo inteiro e o valor mximo de um Agrupamento de declaraes use
tipo inteiro, respectivamente. O PHP no oferece suporte a
Classes, funes e constantes podem ser agrupadas
inteiros no sinalizados. No PHP7 foi disponibilizada a
em uma linha. Antes da verso 7, para cada classe, funo
constante PHP_INT_MIN, que informa o valor mnimo para o
ou constante que precisava ser adicionada ao fonte atual,
tipo inteiro.
era preciso escrever uma linha de cdigo. A partir da verso
A funo intdiv (int intdiv ( int $dividendo , int $divisor )) 7, os elementos em um mesmo diretrio podem ser
faz a diviso de inteiros. Antes da verso 7 no havia um agrupados, diminuindo a quantidade de cdigo a ser
operador e uma funo para diviso de inteiros, e se o digitado. Veja no exemplo a seguir:
resultado da diviso fosse um nmero de ponto flutuante o
PHP 5.6 e verses anteriores
PHP fazia a converso automaticamente. Para obter somente
a parte inteira, era preciso fazer a converso para inteiros, <?php
como pode ser visto no exemplo a seguir. A linha 6 demonstra // PHP 5.6
o resultado da constante PHP_INT_MIN, que na verso 5.6 use some\namespace\ClassA;
use some\namespace\ClassB;
no reconhecida e imprime na tela o texto PHP_INT_MIN e a use some\namespace\ClassC as C;
linha 12 demonstra como poderia ser feito a diviso de inteiros
no PHP 5.6, visto que no existe a funo intdiv(). use function some\namespace\fn_a;
use function some\namespace\fn_b;
Cdigo PHP 5 use function some\namespace\fn_c;
Resultado
8
9223372036854775807
PHP_INT_MIN
A linguagem PHP
3.3333333333333
3
surgiu na dcada de
Cdigo PHP 7.0
1990 como uma lingua-
<?php
// php7
gem de scripting inter-
echo PHP_INT_SIZE . "<br />"; pretada no servidor
echo PHP_INT_MAX . "<br />";
echo PHP_INT_MIN . "<br /><br />";
()
35
A PROGRAMAR
PHP 7
Concluso
Novas verses de softwares sempre geram
expectativas quanto s novas funcionalidades, melhorias de
desempenho, maior produtividade etc, mas quando se trata de
linguagens de programao com cdigo legado preciso ter
A especificao
cuidado. Antes de atualizar para a nova verso, preciso
realizar testes, verificar mudanas sintticas e se aprofundar do PHP pode ser en-
em todas essas mudanas.
Alm das mudanas em cdigo legado importante
contrada em http://
tambm conhecer as novas funcionalidades para realmente
aproveitar melhorias de produtividade e/ou desempenho, bit.ly/php-langspec.
afinal, aps trabalhar por anos seguindo um determinado
padro, deve haver um esforo para se adaptar a estas Possui uma sintaxe pa-
melhorias.
Um prximo artigo ser escrito com o objetivo de recida com C e Perl.
descrever profundamente algum aspecto bem especfico desta
linguagem de programao.
AUTOR
Escrito por Fbio Basso
Tcnico em Processamento de Dados pelo Colgio Estadual Emlio de Menezes, graduado em Processamento de Dados
pela UNOPAR - Arapongas, especialista em Cincia da Computao pela Universidade Estadual de Londrina. Trabalha com
tecnologia da informao desde 1994, atuando na rea acadmica e no mercado. Leciona para o CST em Anlise e Desen-
volvimento de Sistemas pela UNOPAR - Arapongas desde 2003, assumiu a coordenao do curso em Jul/2016 e em paralelo
atuou como consultor, desenvolvedor e gerente de tecnologia da informao, sempre focando na integrao de teoria e prti-
ca. Apaixonado pela sua famlia, pelo ensino, por tecnologia e cincia.
36
A PROGRAMAR
Com os devidos crditos originalidade do criador des- mo, que quaisquer caracteres que no sejam os 8 operado-
ta linguagem, e ainda mais pela originalidade e no menor res so simplesmente ignorados pelo interpretador, sendo
acertividade pelo nome dado, Brainfuck um clssico do mun- considerados comentrios ao cdigo.
do exotrico da programao. inegvel que, numa no muito
Uma soluo procedural
usual conversa de caf acerca de linguagens exotricas, Brain-
fuck comummente a primeira referida. Com o seu princpio Como tradicional na programao, o maior lema
extremamente simples e sintaxe altamente minimalista, esta Dividir para conquistar. Para simplificar a implementao
linguagem consegue fazer jus ao seu nome num piscar de do parser, vamos subdividi-lo em problemas genricos a
olhos. resolver:
No obstante a sua alta aplicabilidade no mundo exo- 1) Como representar a cadeia de clulas?
trico, talvez?, Brainfuck representa um exerccio bastante
2) Como gerir as clulas?
apetecvel para a implementao de um parser. Estando dispo-
nvel na Internet o cdigo-fonte Assembly do interpretador de 3) Como consumir os tokens?
Brainfuck, a sua implementao noutras linguagens recorrendo
4) Como inserir ciclos no parser?
a diferentes paradigmas representa um carcter didctico ine-
gvel. possvel subdividir cada problema apresentado e,
para cada um, vrias solues so possveis. De uma forma
Neste artigo ao qual referncias ao calo no iro
igualmente genrica, estas so as respostas que proponho
faltar por fora da circunstncia ser feita a implementao
para a implementao de uma soluo:
de um interpretador de Brainfuck em Pascal, recorrendo unica-
mente ao paradigma procedural. Iniciemos ento esta curiosa 1) A cadeia de clulas ser implementada atravs de um
jornada! array dinmico cujos valores so do tipo byte;
Uma brevssima introduo ao Brainfuck 2) A gesto das clulas ser feita com recurso a uma
funo por cada operao necessria;
No tendo este artigo por objectivo ser um tutorial desta
linguagem exotrica, ser simplesmente sumariado o princpio 3) Os tokens sero consumidos atravs de um ciclo que
que a rege e os operadores que a constituem. percorre todos os operadores do cdigo;
Brainfuck uma linguagem que tem por princpio a utili- 4) Os ciclos sero implementados recorrendo a recursi-
zao de uma cadeia de clulas (cells) que contm um valor vidade.
numrico positivo, o qual representa um caracter ASCII. Com
Todo o cdigo do parser ficar numa unit fpbrainfuck
os seus nicos 8 operadores, o programador desloca o aponta-
(de Free Pascal Brainfuck), funcionando esta como uma pe-
dor ao longo das clulas e modifica os seus valores unidade a
quena state machine, a qual ser totalmente abstrada dos
unidade. Esta linguagem suporta de igual forma operadores I/O
programas que importarem esta unit.
com um funcionamento extremamente simples: s feito out-
put e input de um caracter de cada vez. Para os propsitos do presente artigo, as operaes I/
O sero implementadas directamente na unit, ficando portan-
Os 8 operadores so, portanto, os seguintes:
to reservada a uma utilizao em aplicaes CLI.
> Desloca o apontador para a clula direita Declaraes preliminares
< Desloca o apontador para a clula esquerda Para representar os operadores, as boas prticas
incentivam ao uso de constantes ao invs do uso directo dos
+ Incrementa em 1 unidade o valor da clula
caracteres no cdigo. Desta forma:
- Decrementa em 1 unidade o valor da clula
const
. Faz output do valor da clula actual BF_NEXTCELL = '>';
BF_PREVIOUSCELL = '<';
, Faz input de um caracter para a clula actual BF_INCCELL = '+';
BF_DECCELL = '-';
BF_OUTPUT = '.';
[ Incio de um ciclo BF_INPUT = ',';
BF_BEGINCYCLE = '[';
] Fim de um ciclo BF_ENDCYCLE = ']';
Denote-se que um ciclo em Brainfuck terminado quan- Uma vez que iremos necessitar de verificar se cada
do o valor da clula actual iguala zero. Convm referir, por lti- caracter presente no cdigo Brainfuck um operador, ser
37
A PROGRAMAR
LETS BRAINFUCK IN PASCAL!
til t-los representados num set of char: inicializao da unit alocar de imediato uma clula no
array dinmico. Logicamente, o apontador iniciar
const com o ndice 0 (zero), apontando assim para a primei-
BF_COMMANDS =
[BF_NEXTCELL , BF_PREVIOUSCELL, ra clula.
BF_INCCELL , BF_DECCELL ,
BF_OUTPUT , BF_INPUT , Gesto das clulas
BF_BEGINCYCLE, BF_ENDCYCLE ]; medida que o cdigo interpretado, as se-
guintes operaes podem ser realizadas:
Uma vez que estas constantes so para uso exclusivo
do parser, sero colocadas na seco de implementao da Avanar para a clula seguinte ou anterior;
unit ao invs da de interface. Por seu turno, a representao
das clulas depender de tipos de dados especficos: Incrementar ou decrementar o valor da clula
actual.
type
TBFCommand = char; Uma vez que um programa em Brainfuck s se
TBFCycle = array of TBFCommand; inicia com uma clula, necessrio criar novas clu-
TBFCell = byte;
TBFArrCell = array of TBFCell; las medida que so necessrias, o que constitui
uma quinta operao de gesto das clulas. Para rea-
Uma vez que cada operador representa um comando lizar as operaes I/O, tambm ser necessrio ace-
directo, um conjunto destes ir representar um ciclo. O parser der e alterar o valor destas de forma directa.
ir, portanto, consumir os tokens fornecidos, sendo o contedo
dos ciclos consumido recursivamente. Todo um programa Cada uma destas operaes ser implementada
Brainfuck ser, portanto, considerado um ciclo por si mesmo, em mtodos separados. A criao de uma clula impli-
tendo como nica diferena o facto de terminar com o fim de ca a alocao de mais espao para o array dinmico,
operaes a realizar e no quando a clula actual tomar o va- devendo o seu valor inicial ser zero:
lor zero:
procedure CreateCell;
procedure ParseBrainfuck(code : TBFCycle); begin
SetLength(datacells, Length(datacells)+1);
A implementao deste procedimento e sua adaptao datacells[High(datacells)] := 0;
para acomodar ciclos sero efectuadas mais frente. end;
Comportamento da state machine A fim de se conferir a necessidade da criao
de novas clulas, ser til uma funo que devolva o
Uma vez que o interpretador ter como princpio uma nmero de clulas actualmente existentes:
state machine minimalista, duas variveis constituiro o cerne
de todas as operaes: o array de clulas e o respectivo apon- function CountCells : longword;
tador. begin
CountCells := Length(datacells);
var end;
datacells : TBFArrCell;
cellidx : longword; O incremento e decremento do valor de cada
clula so igualmente alcanados com dois procedi-
Estas variveis s sero acessveis na seco de imple- mentos nos quais se deve ter em ateno que o seu
mentao da unit, pelo que no devem ser declaradas na sec- valor se encontra no intervalo [0,255].
o de interface uma vez que, dessa forma, estariam publica-
mente acessveis aos programas que a importassem, constitu- procedure IncCell(idx : longword);
indo um elevado risco. begin
if datacells[idx] < 255 then
A state machine ser automaticamente inicializada Inc(datacells[idx]);
end;
aquando do arranque do programa que iomportar a unit
fpbrainfuck e, da mesma forma, ser automaticamente destru- procedure DecCell(idx : longword);
da: begin
if datacells[idx] > 0 then
initialization Dec(datacells[idx]);
SetLength(datacells, 1); end;
datacells[0] := 0;
cellidx := 0;
Para realizar o output do contedo de uma clu-
finalization la, dever ser feita a traduo do valor numrico para
SetLength(datacells, 0); o respectivo caracter da Tabela ASCII:
datacells := nil;
function CellToChar(data : TBFCell) : char;
Uma vez que qualquer programa em Brainfuck begin
CellToChar := Chr(data);
inicia-se obrigatoriamente com uma clula c0 definida, a end;
38
A PROGRAMAR
39
A PROGRAMAR
LETS BRAINFUCK IN PASCAL!
// parser Carregamento em memria do cdigo
Inc(i);
end; verdade! O interpretador de Brainfuck est
concludo! Contudo, ainda nos resta um problema o
Uma vez que s um total de 8 caracteres constitui
carregamento do cdigo a partir de um ficheiro.
a sintaxe de Brainfuck, necessitaremos de verificar se o
token actual , de facto, um operador Brainfuck (ao qual De forma a que um ficheiro com cdigo Brain-
denominmos de command): fuck seja traduzido num TBFCycle, necessitaremos de
realizar o loading do ficheiro em memria:
if IsBFCommand(code[i]) then begin
// ciclos?
ProcessBrainfuck(code[i]); function LoadBrainfuck(filename : string;
end; out thecode : TBFCycle)
: boolean;
Insere-se, portanto, a necessidade de uma nova var
f : file of char;
funo para verificar se um caracter , de facto, um ch : char;
operador Brainfuck: begin
LoadBrainfuck := FileExists(filename);
function IsBFCommand(ch : TBFCommand) : boolean; if not LoadBrainfuck then
begin Exit;
IsBFCommand := CharInSet(ch, BF_COMMANDS);;
end; AssignFile(f, filename);
Reset(f);
Agora que sabemos se um token um operador thecode := GenerateCycle;
da linguagem Brainfuck, falta apenas implementar o su- while not eof(f) do begin
read(f, ch);
porte a ciclos. Para tal, iremos necessitar das seguintes AddToCycle(ch, thecode);
variveis: end;
CloseFile(f);
var end;
cycle_count : byte;
acycle : TBFCycle = nil; No esquecendo o facto da memria alocada
Quando o token [, iremos ler todo o contedo para um array dinmico necessitar de ser libertada,
do ciclo at se encontrar o ] correspondente. Para tal, ser necessrio implementar o seguinte mtodo:
necessrio acautelar a eventualidade de existirem ci-
clos encadeados: esta a funo do contador procedure FreeBrainfuck(var thecode : TBFCycle);
begin
cycle_count. Iniciamos ento por gerar um ciclo em me- FreeCycle(thecode);
mria, inicializar o contador a 1 e avanar para o prxi- end;
mo token:
Limitaes da unit
if code[i] = BF_BEGINCYCLE then begin
acycle := GenerateCycle; A unit fpbrainfuck, tal como foi aqui implementa-
cycle_count := 1; da, apresenta algumas limitaes:
Inc(i);
end; No permitido interpretar mais do que um fi-
cheiro de cdigo de cada vez, o que impossibili-
Vamos assumir que o cdigo no tem erros, pelo
ta o seu potencial uso em multithreading;
que no existem parntesis desemparelhados. A obten-
o do contedo do ciclo realizada com o seguinte O suporte a comentrios em Brainfuck no
ciclo: completo;
while (code[i] <> BF_ENDCYCLE) or S suportado o seu uso em aplicaes CLI;
(cycle_count > 0) do
begin
if code[i] = BF_ENDCYCLE then exigido ao programador a alocao e liberta-
Dec(cycle_count) o explcitas da memria reservada ao cdigo;
else if code[i] = BF_BEGINCYCLE then
Inc(cycle_count); Uma vez que no est definido um standard de
if cycle_count <> 0 then Brainfuck, esta implementao pode no funcio-
AddToCycle(code[i], acycle);
Inc(i); nar com todos os cdigos disponibilizados na
end; Internet.
Aps a obteno do contedo do ciclo, realizamos Yet Another Brainfuck Interpreter...
o parsing recursivo deste, seguido da libertao da me-
mria alocada: Uma vez implementada a nossa unit fpbrain-
fuck, resta-nos implementar um pequeno programa
ParseBrainfuck(acycle, true);
FreeCycle(acycle); que realize a interpretao de cdigo Brainfuck. Para
40
A PROGRAMAR
AUTOR
Escrito por Igor Nunes
Farmacutico de profisso e programador amador nos tempos livres, tem um fascnio pelo mundo da tecnologia e a progra-
mao -lhe uma verdadeira terapria anti-stress sem medicamentos. E um bom caf com um Pastel de Belm!
41
A PROGRAMAR
JavaFX : Uma Breve Introduo
um conjunto de bibliotecas que permitem criar aplica- public static void main(String[] args) {
launch(args);
es grficas e o sucessor do Java Swing, no entanto ambos }
vm includos no JDK:
@Override
JDK 7 update 6: com JavaFX 2.2 public void start(Stage primaryStage)
throws Exception {
JDK 8: com JavaFX 8 // Stage Title
primaryStage.setTitle("Hello World");
Apesar de a nomenclatura do JavaFX ser diferente,
// Begin Scene definition
muitos dos conceitos mantm-se semelhantes com o Java Label helloLabel = new Label();
Swing, pelo que a transio no ser penosa, muito pelo con- helloLabel.setText("Hello World!");
trrio.
StackPane stackPane = new StackPane();
Conceitos Bsicos stackPane.getChildren().add(helloLabel);
Esta frase de William Shakespeare ajuda a compreen- Scene scene = new Scene(
der dois conceitos importantes: stackPane, // Layout Pane
200, // width
All the world's a stage, And all the men and women merely 200 // height
);
players. // End Scene definition
Uma aplicao em JavaFX corre num palco (Stage) e // Add Scene to Stage
composto por inmeras cenas (Scenes). primaryStage.setScene(scene);
// Show Stage
A Stage a janela da aplicao, onde est o titulo e os primaryStage.show();
botes de maximizar, minimizar e fechar. Enquanto uma }
}
Scene representa todo o contedo de uma janela.
Todos os intervenientes da aplicao (Stages, Scenes, Este o resultado:
Controlos) so ns. E um n pode conter muitos ns. Em
analogia com XML, um N um elemento XML.
Ciclo de vida
O ciclo de vida de uma aplicao JavaFX simples. A
classe estende de Application e sempre que uma aplicao
arranca so executadas as seguintes tarefas:
1. criada uma instancia da classe Application
2. invocado o mtodo init();
3. invocado o mtodo start(javax.stage.Stage);
4. Espera que o programa seja terminado (Plataform.exit())
5. invocado o mtodo stop();
O mtodo start(javax.stage.Stage) abstrato e tm que
ser implementado, enquanto os mtodos init() e stop() tm im-
plementao mas no fazem nada. Muito fixe
42
A PROGRAMAR
Label
TextField
Button
Como se quer que eles fiquem alinhados verticalmente,
vai ser utilizado o VBox como Pane.
Quando se clicar no boto, aparece uma janela a dizer
Hello <Nome>.
@Override
public void start(Stage primaryStage)
throws Exception {
this.primaryStage= primaryStage;
// Stage Title
primaryStage.setTitle("Hello ....");
// Begin Scene1 definition
Label helloLabel = setLabel1();
setTextField1();
Button helloButton = setButton1();
setScene1(helloLabel, helloButton);
// End Scene1 definition
// Begin Scene2 definition
setLabel2();
Button helloButton2 =getButton2();
43
A PROGRAMAR
JAVAFX : UMA BREVE INTRODUO
Tips and Tricks Para sair da aplicao basta em qualquer altura invo-
car:
Esta breve introduo apenas abre a porta para um
grande mundo no JavaFX, mas deixo algumas recomendaes Platform.exit();
que a longo prazo poupam tempo e pacincia J No entanto, ocorre frequentemente a necessidade de
efetuar trabalho antes de sair da aplicao (ex: fechar
Design First Write After
ligaes base de dados). Recomenda-se a fazer override
Um dos maiores desafios colocar os controlos onde do mtodo:
queremos. Recomendo que se desenhe a aplicao num for- Application.stop();
mato fsico e se identifique quais so os Panes e controlos que
so precisos para ficar de acordo com o que se pretende
E neste mtodo realizar as tarefas de cleanup.
Naming Convention
Concluso
Adotar uma conveno para os nomes dos controlos.
A transio de quem j conhece Java Swing pacifi-
Recomendo a Hungarian Notation, em que o nome da varivel
ca e para quem no conhece, so apenas uns breves instan-
contem o tipo de dados a que se refere. No exemplo anterior:
tes at perceber como as coisas funcionam.
Button helloButton;
JavaFX tem mais componentes e mais verstil que
Ao longo da implementao sabe-se sempre qual o Java Swing, mas nem por isso mais complicado, muito
que o helloButton. pelo contrrio. Acaba por ser bastante intuitivo.
Define the IDs Existem mais temas interessantes a falar de mbito
mais avanado, que ficar para o prximo artigo.
Em todos os controlos criados, fazer set do seu ID.
Sugiro que se use o mesmo nome da varivel que se esta a
usar uma vez que s por si j garante univocidade.
At breve.
Ao longo do cdigo pode-se obter o controlo da
seguinte forma:
Repositrio
Scene scene = primaryStage.getScene();
Node nodeToFind = scene.lookup("#nodeToFindId"); https://gitlab.com/masterzdran/pap-javafx/tree/master
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.
44
ELECTRNICA
Criptografia e segurana por hardware com Arduino/Genuino ou outros
sistemas por I2C
Electrnica
CRIPTOGRAFIA E SEGURANA POR HARDWARE COM ARDUINO/GENUINO
47
Electrnica
CRIPTOGRAFIA E SEGURANA POR HARDWARE COM ARDUINO/GENUINO OU OUTROS SISTEMAS POR I2C
Os dados so colocados na linha SDA logo aps o e 512 bits para informao fixa OTP. Mas nem tudo so
estado da linha SCL se mudar de alto (high) para baixo (low). prs, tambm existem uns quantos contras, e um deles a
O tempo entre a alterao do estado da linha SCL e a trans- necessidade de pr-programar chaves no circuito, caso se
misso dos dados na linha SDA definido pelos circuitos e pretenda usar para autenticao. Nesse caso existem outros
varia de circuito para circuito. circuitos semelhantes que servem o mesmo propsito e fun-
cionam de forma semelhante.
Como j referido a simplicidade deste circuito e as
suas funcionalidades, tornam fcil a utilizao deste tipo de
soluo para diversos projectos de IoT, como por exemplo
apenas aceitar perifricos verdadeiros, num determinado
IMG.1 circuito, ou implementar.
Para ser iniciada uma comunicao, tem de ser valida- Um problema simples e a soluo
da a condio de inicio (Start Condition), onde o circuito Master
No caso deste exemplo, para o efeito deste artigo
mantem a linha SCL em estado alto (high) e coloca a linha
apenas iremos realizar um pedido desafio resposta, para
DAS em estado baixo (low) deixando todos os circuitos escra-
verificar se um determinado acessrio novo, ligado ao nosso
vos (slave) em estado de escuta para uma transmisso de
circuito verdadeiro ou no. Para isso iremos iniciar uma
dados que ir iniciar e de seguida inicia a transmisso tem
comunicao com o circuito, enviar o desafio e receber a
inicio. Caso existam mais do que um dispositivo mestre
resposta.
(master) na mesma linha fsica e ambos pretendam iniciar uma
transmisso em simultneo, aquele que colocar a linha SDA /* Exemplo de uso de ATSHA204
em baixo (low) primeiro, o que toma o controlo do barramen- Revista PROGRAMAR, edio 54
to, quase como numa corrida, primeiro a chegar aquele que by: Sleep Deprived Loon
*/
manda. Uma vez estando no controlo do barramento, pode
iniciar a transmisso e proceder a novas transmisses de da- #include <sha204_library.h>
dos sem ter de perder o controlo do barramento ou iniciar uma
nova corrida, para ganhar controlo do barramento. const int sha204Pin = 7;
48
Electrnica
CRIPTOGRAFIA E SEGURANA POR HARDWARE COM ARDUINO/GENUINO OU OUTROS SISTEMAS POR I2C
AUTOR
Escrito por Antnio C. Santos
Apaixonado por tecnologia, autodidata desde tenra idade. Cresceu com o ZX Spectrum 48k. Com mais
de 20 anos de experincia em implementao e integrao de sistemas e desenvolvimento de software
por medida nas mais diversas linguagens. Formou-se no Instituto Politcnico de Viana do Castelo. Mem-
bro da Comunidade Portugal-a-Programar desde Agosto de 2007, tambm membro da Sahana Softwa-
re Foundation, onde Programador Voluntrio desde 2012. Twitter:@apocsantos
49
COLUNAS
C# - Interagindo com pginas web
Kernel Panic - WebSummit Lisboa 2016
C#
INTERAGINDO COM PGINAS WEB COM C#
Introduo driver.Navigate().GoToUrl("http://
www.bing.com");
Algumas vezes necessitamos que o nosso programa }
interaja com uma pgina web, seja para obter alguma
Notemos que o Selenium usa o conceito de driver
informao ou para testar o seu funcionamento. Normalmente,
para o browser. Podemos mudar o browser que ser utiliza-
isto pode ser feito interagindo com o contedo da pgina,
do atravs de um novo driver (como por exemplo, FirefoxDri-
usando a API DOM (Document Object Model representao
ver). No nosso programa, usamos o browser Edge, do Win-
dos objetos da pgina em forma de rvore) e obter informaes
dows 10.
ou interagir com a pgina (preenchendo caixas de texto ou
clicando em botes pelo programa). Ao executar o programa e clicar no boto, vamos
obter um erro:
Isto, alm de ser difcil e sujeito a erros, pode ter de
funcionar de maneira diferente nos vrios browsers. Uma
maneira mais simples de fazer isto, alm de ser compatvel
com a maioria dos browsers usar uma ferramenta open
source, chamada Selenium (http://www.seleniumhq.org/).
Neste artigo, iremos mostrar como usar o Selenium para
interagir com o Google, fazer uma pesquisa e mostrar os
resultados numa Listbox WPF.
Introduo ao Selenium
O Selenium uma ferramenta open source para
automatizar os web browsers, disponvel para muitas
plataformas e diversos browsers. Podemos us-la com vrias
linguagens, como C#, Java, Python ou Haskell. Uma utilizao
muito comum deste tipo de framework para testes de
interfaces web. Podemos criar testes unitrios que interagem
com uma pgina web e verificar se o resultado o desejado. Este erro devido ao fato de que o programa
Para isso, podemos integrar o Selenium com o Nunit e criar os MicrosoftWebDriver.exe no foi encontrado no caminho do
seus testes de interface com ele. executvel. Este programa necessrio para automatizar o
Edge. Conforme mostrado na mensagem, baixamos o
Para us-lo nas aplicaes no Visual Studio, podemos MicrosoftWebDriver.exe para a nossa verso do Edge em
instalar a documentao, as bibliotecas e os drivers para os http://go.microsoft.com/fwlink/?LinkId=619687. Aps
browsers em http://selenium- baixarmos o programa, colocamos o executvel no mesmo
release.storage.googleapis.com/2.51/selenium-dotnet- diretrio do executvel gerado pelo projeto e executamos
2.51.0.zip, mas a maneira mais fcil de us-lo usando o novamente o programa. Desta vez, ao clicarmos no boto, o
NuGet para instal-lo no projeto em causa. programa deve abrir o Edge e abrir a pgina do Bing.
Criamos um novo projeto WPF e, no Solution Explorer,
clicamos com o boto direito do rato sobre References e
selecionamos Manage NuGet Packages. Vamos a Browse e
selecionamos os pacotes Selenium.WebDriver e
Selenium.WebDriver.Support e clicamos em Install. Isto ir
instalar o Selenium na nossa aplicao.
Colocamos um boto na janela principal da aplicao:
<Grid>
<Button Content="Abre Bing" Width="85"
Height="35" Click="AbreBingClick"/>
</Grid>
51
C#
INTERAGINDO COM PGINAS WEB COM C#
Interagindo com as pginas do Bing nossa listbox. Para isso, podemos usar as ferramentas de
anlise de pgina do Edge, apertando a tecla F12. Com isso,
At aqui, tudo o que fizemos foi controlar o Edge, mas
vemos que cada resultado um li com classe b_algo. Dentro
queremos fazer mais queremos interagir com a pgina, fazer
deste li, temos um h2 e um a, com o endereo do resultado e
a pesquisa e obter as respostas. Para isso, devemos
o texto apresentado.
incrementar nosso programa:
Abaixo do ttulo, temos um div com classe b_caption,
private void AbreBingClick(object sender, com o contedo dentro de um p. Com estes dados, podemos
RoutedEventArgs e)
{ obter os resultados para colocar na nossa aplicao.
var driver = new EdgeDriver();
driver.Navigate().GoToUrl("http://
www.bing.com");
var query = driver.FindElementByName("q");
query.SendKeys("Windows 10 UWP Tutorials");
query.Submit();
var wait = new WebDriverWait(driver,
TimeSpan.FromSeconds(10));
wait.Until(d => d.Title.StartsWith("Windows
10", StringComparison.OrdinalIgnoreCase));
}
52
C#
INTERAGINDO COM PGINAS WEB COM C#
Podemos melhorar esta apresentao com o template Este cdigo abre o browser padro do sistema com o
para os itens da lista: link relativo quele resultado. Como podemos ver, obtivmos
apenas os primeiros 10 resultados, que o que a pesquisa
retorna. Para mostrarmos tambm os resultados seguintes,
<ListBox Grid.Row="1" Margin="5"
devemos clicar no boto para mostrar a prxima pgina. Isto
x:Name="Resultados"
HorizontalContentAlignment="Stretch" feito com o seguinte cdigo:
ScrollViewer.
HorizontalScrollBarVisibility="Disabled">
<ListBox.ItemTemplate> private IWebDriver _driver;
}
O programa clica no boto para a prxima pgina e
espera que pgina carregue. Em seguida, adiciona os
resultados lista. Para isso, criamos uma nova classe,
Resultado, que ir armazenar os resultados:
53
C#
INTERAGINDO COM PGINAS WEB COM C#
54
C#
INTERAGINDO COM PGINAS WEB COM C#
operao mais leve e independente do browser instalado na O que fizemos neste artigo poderia ser feito usando a API do
mquina. Bing para fazer as pesquisas, de modo mais simples, mas isto
um tema para um outro artigo, at l!
O cdigo fonte para este artigo est em https://
github.com/bsonnino/SeleniumCSharp
O Selenium uma
ferramenta open source
para automatizar os
web browsers, dispon-
vel para muitas platafor-
mas e diversos
browsers
AUTOR
Escrito por Bruno Sonnino
55
SQL Curtas
SQL Curtas #1: Intervalos de datas
Um dos problemas mais habituais em programao for especificada, corresponde a 00:00:00 (meia noite). Ora,
SQL pedir dados que aconteam no intervalo de duas datas. ao indicar "menor ou igual a 2016-12-31", estamos na reali-
O tipo de dados dos campos de data/hora variam conforme o dade a dizer para incluir o segundo 00:00:00 do dia 31, mas
SGBD (DATE, TIME, DATETIME, DATETIME2, SMALLDATE- excluir os outros 23h59m59s desse dia. Assim, o BETWEEN
TIME, etc.), mas o problema descrito em baixo semelhante no serve para datas e esta no uma soluo vlida.
em todos.
Soluo 3:
Problema: Necessito dos registos cujo campo CampoData
SELECT [...] FROM [...] WHERE CampoData >= '2016
est no intervalo 2016-01-01 (inclusive) a 2016-12-31 -01-01' AND CampoData < '2017-01-01';
(inclusive).
-- Soluo geral!
Soluo 1:
E finalmente temos a resposta correcta. Ateno ao
SELECT [...] FROM [...] WHERE YEAR(CampoData) = "maior e igual" primeira data, e ao "menor" (mas no igual)
2016; ao dia seguinte segunda data. Assim, queremos tudo o
que aconteceu "at" (mas no incluindo) o dia 2017-0101
Funciona, mas... 00:00:00, ou seja, tudo at (inclusive) 2016-1231
23:59:59,999999(9)...
Esta uma forma fcil (dado tratar-se do ano 2016 intei-
ro), mas infelizmente a maioria dos intervalos no correspon- Compatibilidade:
dem a anos de calendrio (ou a meses, acrescentando o
MONTH() condio, por exemplo). Temos ento que encon- SGBD: SQL Server; Oracle; MySQL/MariaDB; Outros;
trar uma soluo melhor para qualquer intervalo de datas.
Nota 1: Em algums SGBD o BETWEEN tem compor-
Soluo 2: tamento diferente do indicado, pelo que deve ser evi-
tado;
SELECT [...] FROM [...] WHERE CampoData BETWEEN
'2016-01-01' AND '2016-12-31'; Nota 2: A representao das datas nas queries (neste
caso 'AAAA-MM-DD') poder variar conforme a confi-
No funciona como queremos... gurao regional do SGBD, e para efeitos de exemplo
Ser que esta funciona? Bem, na maioria dos casos assume converso implcita, que nem sempre funcio-
no. Porqu? Primeiro temos que perceber como funciona na.
exactamente o BETWEEN: Documentao:
SELECT [...] FROM [...] WHERE Quantidade BETWEEN 10 SQL Server - https://msdn.microsoft.com/en-us/
AND 20; library/ms187752.aspx#Date-and-Time
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.
56
Kernel Panic
WEBSUMMIT LISBOA 2016
Como no podia deixar de ser, nesta edio resolvemos E creio poder afirmar, que todos os participantes
dedicar um espacinho ao Web Summit deste ano. aprenderam algo na sua caminhada pelo Web summit.
Para os leitores que no esto to familiarizados com o Uma outra coisa de que gostmos bastante, foi o fac-
mundo da tecnologia, queremos relembrar que a Web Summit to de que toda a cidade foi envolvida no espirito Web
uma das maiores conferncias mundiais de tecnologia. Summit.
A primeira vez que este evento teve lugar foi em 2009 Vrios smbolos Web Summit foram colocados em
em Dublin (onde se realizaram nos ltimos 5 anos) e rapida- pontos-chave da cidade, o que permitiu mais notoriedade
mente se tornou um dos maiores eventos do gnero, uma vez conferncia. Nas redes sociais vrias foram as pessoas que
que dos acontecimentos anuais mais aguardados. A Web partilharam fotos com os smbolos em fundo. Durante o dia
Summit foi fundada por Paddy Cosgrave, David Kelly e Daire
Hickey.
Em Setembro de 2015 Paddy Cosgrave, co-fundador e
CEO da Web Summit, anunciou que o evento seria realizado
pela primeira vez em Lisboa em 2016. Foi a primeira vez que o
evento no teve lugar em Dublin sendo que foi anunciado que
seria em Lisboa durante 3 anos, ou seja, quem perdeu a edi-
o deste ano, pode comear a pensar j em marcar presena
edio de 2017 e 2018.
Mas voltemos edio de 2016
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.
57
Media Partners da Revista PROGRAMAR
Anlises
Desenvolvimento gil de Software Guia Prtico, 1 edio.
HTML 5 4a Edio Atualizada e Aumentada
Review
60
Review
DESENVOLVIMENTO GIL DE SOFTWARE GUIA PRTICO, 1 EDIO.
Aps um captulo zero inicial, onde feita uma viso jeto, apesar de esquecida por muitas das metodologias geis
geral da engenharia de software e da sua saga na busca de mais mainstream. Artefactos produzidos nesta fase, e expli-
processos com sucesso, o livro est organizado em cinco cados neste captulo, incluem um documento de viso do
captulos. negcio e documento de enquadramento do mbito do pro-
jeto. A abordagem guiada por casos de uso, sendo estes a
unidade para estimao de esforo, em pontos relativos ou
em horas. Outros aspetos, como estimao de custos, anli-
() processo de se de riscos e oportunidades e qualidade do produto, so
tambm tratados neste captulo.
AUTOR
Escrito por Antnio Miguel Rosado da Cruz
Professor Adjunto no Instituto Politcnico de Viana do Castelo, onde leciona desde 2005, e membro do Software Engineering
and Management Group do Centro de Investigao ALGORITMI Universidade do Minho. Concluiu o Programa Doutoral em
Engenharia Informtica pela Universidade do Porto em 2011. Tem certificao PMP Project Management Professional do
PMI desde 2014. Publicou diversos trabalhos em actas de conferncias cientficas e jornais cientficos internacionais, e possui
3 captulos de livros publicados. Participa e coordena projetos de prestao de servios a empresas. Participou em 9 eventos
cientficos internacionais. Tem orientado projetos e dissertaes de mestrado nas reas de Engenharia Informtica, Cincias
da Computao e Sistemas e Tecnologias de Informao. Nas suas atividades profissionais interagiu com diversos colabora-
dores em co-autorias de trabalhos cientficos. Os seus interesses de investigao centram-se na Engenharia de Software,
Model-driven Development, Transformao de Modelos, software modeling, code generation, user interface modeling, Mto-
dos Formais, Cloud computing e Metamodelos.
61
Review
Ttulo: HTML 5 4 Edio Atualizada e Acredito que os primeiros captulos possam ser um
Aumentada pouco aborrecidos para quem j tem alguma prtica neste
assunto, mas no deixa de ser uma boa oportunidade para
Autores: Lus Abreu
recordar conhecimentos e at mesmo aprender algo que
Editora: FCA - Editora de Informtica possa ter escapado anteriormente.
dedicado a esta temti- associadas a esta API, assim como exemplos passo a passo
de como obter da melhor forma a localizao do utilizador de
ca. uma aplicao web. O captulo sete, por sua vez, traz-nos a
web storage, uma das novidades do HTML5. Mais uma vez,
o autor, apresenta-nos esta temtica de uma forma bastante
clara, sempre com exemplos, o que torna o livro numa til
ferramenta de consulta, para quem o usar apenas como refe-
rncia. (Sim, o livro permite que se utilize apenas como refe-
rncia, lendo s os captulos das temticas que mais vos
62
Review
HTLM 5 4A EDIO ATUALIZADA E AUMENTADA
interessem). So tambm abordados temas como a File API o de tarefas em paralelo. A meu ver, uma das funcionali-
e a Indexed Db. dades mais apetecidas nesta linguagem.
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.
63
Segurana
WIFI AIR DENIAL
"30 30 37 - For Your Eyes Only"
NSA Secrets - Hacking SQL Server - Dynamic Data (UN)Masking
Segurana
65
Segurana
Ilustrao 1 - Jumper-wires
66
Segurana
Ilustrao 6 - Adicionar o modulo ESP8266 ao Arduino IDE Ilustrao 9 - Adicionar o modulo ESP8266 ao Arduino IDE
67
Segurana
68
Segurana
// DeAuth template
uint8_t template_da[26] = { 0xc0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x70, 0x6a, 0x01, 0x00 };
69
Segurana
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.
70
Segurana
52 61 72 21 1A 07 00 CF 90 73 00 00 0D 00 00 00 00 CE E7 08 C3 E3 D5 52 01 40 F9 9B CE 97 41 3A 80
00 00 00 E2 31 7A 00 80 23 00 4C 00 00 00 58 00 00 D8 22 BB 82 7B 2C 3A 30 95 6E 24 13 8E 4A AC 81
00 02 C5 15 EF F0 FD 09 96 49 1D 33 03 00 01 00 00 D8 A0 C8 75 05 B5 17 44 E5 E7 AE C9 D2 55 07 97
00 43 4D 54 09 15 14 CF DD 00 CF D4 A2 A0 18 E9 97 76 CF 1C AB 85 47 C0 8D A8 0B D6 58 6E 0B 52 90
41 27 C0 6D 83 06 2E 37 02 91 51 68 12 85 45 F5 FA 72 A3 CF E8 E3 1B CC FA 26 96 6D 10 FC 9C 83 ED
3F 60 DD 37 7D B5 56 45 91 E1 94 6E C7 43 0E 0F 11 4E 5D 7E 9A 2E 5A 27 6A 2D A8 A8 A8 B5 2E 87 AF
FB 1A 40 8A D2 DB A9 6B 89 1E 9A 24 F9 4C 60 87 F3 A1 A7 2F E0 2F F8 4B 02 8B 77 C5 B4 97 F8 31 30
71 EA 3E 27 76 3B 2D CF E1 EA AA A8 0C 89 74 20 90 AB 77 4F 40 D9 FF AA AC 5E 6B DC 6B 0F 69 2A C5
40 00 4D 01 00 00 DE 05 00 00 02 D3 19 66 BE D5 09 82 8D 97 74 AD F4 CA 94 79 37 B2 47 5A 27 BB 38
96 49 1D 35 0D 00 20 00 00 00 54 6F 70 53 65 63 72 1F 66 4B 8C BC 93 72 A1 AB 0C 60 CB AF 23 CC 2B
65 74 2E 54 58 54 F0 BF 98 1C 64 9C 09 96 49 8F B8 C7 96 08 4E 99 F3 48 3A 72 B0 21 AB 09 74 5C 46
89 9C 09 96 49 8F B8 89 0D 41 0C 8D 53 D5 01 13 8D 73 EC 4D 68 F9 D1 04 5A DB E4 2E 69 93 7E 89 8E
5E F9 08 0D DC D9 F9 09 3B FF 24 B5 66 0B D1 7A 46 D3 3C 93 D9 71 94 BC E7 5A 2A B0 4B E4 32 D2 67
58 D8 E2 25 AF FD 2F F0 01 30 1E 0A 75 4C 38 E5 3C D3 4B 38 55 18 9E D3 E9 AE 89 37 79 8F E6 78 0F
34 C0 78 04 AB CC 54 C7 C1 F8 E7 E1 99 6D B5 34 A3 7E 4B 3D 5E DE 17 1E 94 FF 25 91 7F 29 5F 48 C4
2E CA 10 33 FB 16 42 84 1B E9 09 E3 5A 6E E2 9D B1 3D 7B 00 40 07 00 00 00 00 00 00 00 00 00 00 00
32 2F C6 90 64 07 4E 93 24 EA 2D 38 AC CE 09 D1 AA
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.
71
Segurana
Qualquer sistema informtico pode ser atacado. inevi- tes esto atribuidos a cada misso. Os agentes da NSA infil-
tvel, nada 100% seguro. Por vezes no depende dos pro- traram-se no MI6 disfarados de colaboradores e pretendem
gramadores. O sistema pode ser totalmente robusto e um ser descobrir quem so os agentes de cada misso.
humano, para "facilitar", cria acidentalmente buracos de segu-
Depois de criar uma base de dados vazia
rana.
(importante!), vamos ento criar alguns utilizadores:
Este artigo sobre Hacking, em particular a SQL Server,
vem na sequncia duma sesso com o mesmo nome que fiz USE <nome_da_base_de_dados_criada>;
mais de uma dezena de vezes (maioritariamente no estrangei- GO
ro), e cujos exemplos aqui partilho (e eventualmente tambm
CREATE USER M WITHOUT LOGIN;
em futuras edies). CREATE USER Q WITHOUT LOGIN;
CREATE USER Sean WITHOUT LOGIN;
Neste caso vamos falar sobre Dynamic Data Masking CREATE USER David WITHOUT LOGIN;
(DDM) (https://msdn.microsoft.com/en-us/library/ CREATE USER George WITHOUT LOGIN;
mt130841.aspx), uma nova funcionalidade da verso 2016 do CREATE USER Roger WITHOUT LOGIN;
CREATE USER Timothy WITHOUT LOGIN;
SQL Server da Microsoft. Resumidamente, impede quem faa CREATE USER Pierce WITHOUT LOGIN;
um simples query de SELECT de ver alguns campos crticos CREATE USER Daniel WITHOUT LOGIN;
(nmero de carto de crdito, morada, telefone, etc.), substitu-
indo-os por um padro de caracteres a definir pelo utilizador. De seguida criamos a tabela de filmes/misses e co-
S quem tem uma permisso especial, a de UNMASK (que s locamos os dados:
existe ao nvel de toda a base de dados por enquanto), poder
ver os resultados sem estarem mascarados. Isto aplica-se tam- CREATE TABLE dbo.BondFilms
bm ao utilizador que faz backups, que caso no tenha tam- (
bm UNMASK apenas salvar lixo (idem para SELECT INTO FilmID INT NOT NULL,
FilmTitle NVARCHAR(64) NOT NULL,
ou INSERT INTO). Note-se que fazer INSERT ou UPDATE ao FilmYear INT NOT NULL,
campo vai alterar normalmente nos dados (que depois ficam BondActor NVARCHAR(64) NOT NULL,
automaticamente mascarados). Agent SYSNAME NOT NULL,
CONSTRAINT PK_BondFilms PRIMARY KEY
CLUSTERED ( FilmID ASC )
CREATE TABLE Membership ( MemberID int IDENTITY );
PRIMARY KEY, FirstName varchar(66) MASKED WITH -- Insert some REAL top secret for-your-eyes-
(FUNCTION = 'partial(1,"XXXXXXX",0)') NULL, only information
LastName varchar(66) NOT NULL, -- Leaked from here: https://en.wikipedia.org/
Phone varchar(66) MASKED WITH (FUNCTION = wiki/List_of_James_Bond_films
'default()') NULL, INSERT INTO dbo.BondFilms
Email varchar(66) MASKED WITH (FUNCTION (FilmID, FilmTitle, FilmYear, BondActor, Agent)
= 'email()' ) NULL); VALUES
( 1, 'Dr. No', 1962,
Original: 'Sean Connery', 'Sean' ),
1 Roberto Tamburello 555.123.4567 ( 2, 'From Russia with Love', 1963,
RTamburello@contoso.com 'Sean Connery', 'Sean' ),
( 3, 'Goldfinger', 1964,
Masked: 'Sean Connery', 'Sean' ),
1 RXXXXXXX Tamburello xxxx ( 4, 'Thunderball', 1965,
RXXX@XXXX.com 'Sean Connery', 'Sean' ),
( 5, 'Casino Royale', 1967,
Infelizmente, h quem considere erradamente que DDM 'David Niven', 'David' ),
( 6, 'You Only Live Twice', 1967,
uma medida de segurana. No , e segundo a Microsoft 'Sean Connery', 'Sean' ),
nunca pretendeu ser. apenas uma forma de facilitar alguma ( 7, 'On Her Majesty''s Secret Service', 1969,
privacidade, mas sem qualquer garantia. O grande problema 'George Lazenby', 'George' ),
( 8, 'Diamonds Are Forever', 1971,
que quem implementa DDM, se estiver menos informado, ter 'Sean Connery', 'Sean' ),
uma falsa sensao de segurana. ( 9, 'Live and Let Die', 1973,
'Roger Moore', 'Roger' ),
O exemplo que se segue s funciona na verso 2016 ou (10, 'The Man with the Golden Gun', 1974,
superior do SQL Server. O cdigo fonte completo est dispon- 'Roger Moore', 'Roger' ),
vel AQUI. Para correr basta criar uma base de dados vazia e (11, 'The Spy Who Loved Me', 1977,
'Roger Moore', 'Roger' ),
executar gradualmente esse cdigo. (12, 'Moonraker', 1979,
'Roger Moore', 'Roger' ),
Cenrio: A tabela tem a lista dos filmes/misses MI6 do (13, 'For Your Eyes Only', 1981,
007 James Bond. Apenas a/o chefe "M" tem direito a ver todo o 'Roger Moore', 'Roger' ),
contedo. Os demais colaboradores no podem ver que agen- (14, 'Octopussy', 1983,
72
Segurana
Vamos agora criar uma tabela de agentes que ser til Imagem - DEMO3-MissesMASKED no final do artigo
mais tarde, e ver o seu contedo:
Vamos ento "atacar". Comeamos por pedir algo (
tentativa) com uma condio WHERE:
CREATE TABLE dbo.Agents
(
Agent SYSNAME NOT NULL, EXECUTE AS USER = 'Sean';
BondActor NVARCHAR(64) NOT NULL, SELECT * -- Seen as Sean
CONSTRAINT PK_Agents PRIMARY KEY CLUSTERED using DDM with WHERE hack
( Agent ASC ) FROM dbo.BondFilms
); WHERE BondActor Like '%Roger%' -- Hack: infer the
content of the field
-- Insert some REAL top secret for-your-eyes-only REVERT;
information
-- Leaked from here: https://en.wikipedia.org/wiki/
List_of_James_Bond_films Imagem - DEMO4-HackWHERE no final do artigo
INSERT INTO dbo.Agents
(Agent, BondActor) Como podem ver, conseguimos facilmente encontrar
SELECT DISTINCT Agent, BondActor as misses do utilizador Roger (neste caso at podia ser o
FROM dbo.BondFilms;
Roger Moore ou o Roger Rabbit, mas claro que podemos
-- Super advanced top secret spying technique limitar na condio). Mas este hack implica ter algum conhe-
SELECT * FROM dbo.Agents; cimento dos valores possveis no campo, ainda mais se se
trata dum campo de texto.
Imagem DEMO2-AgentesRAW no final do artigo
O hack seguinte aproveita a tabela de Agents que
Vamos agora aplicar Dynamic Data Masking ao campo
crimos anteriormente:
BondActor (deixamos as duas primeiras letras visveis, assim
como o campo duplicado Agent para podermos comparar).
Atribuimos tambm permisses de SELECT a todos os utiliza- EXECUTE AS USER = 'Sean';
SELECT b.*, a.BondActor AS AGENTS_BondActor --
dores nestas tabelas, e de UNMASK ao utilizador "M": Seen as Sean using DDM with EXACT JOIN hack
FROM dbo.BondFilms b
ALTER TABLE dbo.BondFilms INNER JOIN
ALTER COLUMN BondActor ADD MASKED WITH (FUNCTION = dbo.Agents a
'Partial(2, " ", 0)'); ON b.BondActor = a.BondActor -- Hack: infer
-- Nota: o caracter de mscara o que quisermos the content with JOIN
(neste caso " ") REVERT;
73
Segurana
74
Segurana
Demo 1
Agent BondActor
Daniel Daniel Craig
David David Niven
George George Lazenby
Pierce Pierce Brosnan
Roger Roger Moore
Sean Sean Connery
Timothy Timothy Dalton
Demo 2
Demo 3
75
Segurana
Demo 5
76
Segurana
FilmID FilmTitle FilmYear BondActor Agent L01 L02 L03 L04 L05 L06 L07 L08 L09 L10 L11 L12 L13 L14
Demo 6
Demo 7
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.
77
No Code
A primeira comunidade portuguesa de mulheres em tecnologia apresenta-se com no-
vo nome e objetivos mais ambiciosos
Instalando um servidor VPN num Raspberry Pi
Segurana Familiar Microsoft no Windows 10: Um guia para Pais e Educadores
GameJAM
Entrevista a: Edite Amorim
No Code
A primeira comunidade portuguesa de mulheres em tecnologia apresenta-se
AUTOR
Escrito por Vnia Gonalves (em colaborao com Joana Fillol)
80
No Code
INSTALANDO UM SERVIDOR VPN NUM RASPBERRY PI
Feito isto podemos comear com a instalao do Neste passo vai ser preciso ler o License Agreement
SoftEther. Primeiramente vamos fazer o download do pro-
e selecionar a opo 1 para confirmar que se concorda com o
grama. Como no existem packages prontos, teremos de
descarregar do website. Existem muitas formas de o fazer mesmo.
pelo que vou apenas apresentar duas deixando ao leitor a
Uma vez terminado este passo, iremos mover a di-
escolha de qual utilizar:
rectoria vpnserver para /usr/local, onde ir ficar, bem como
1. Utilizando o Lynx: alterar algumas permisses a ficheiros para que o SoftEther
Para tal, temos de instalar o Lynx antes de fazermos o Server possa funcionar correctamente:
download:
sudo apt-get install lynx y cd ..
sudo mv vpnserver /usr/local
cd /usr/local/vpnserver/
sudo chmod 600 *
De seguida executamos o Lynx, escolhemos a sudo chmod 700 vpnserver
ltima verso do SoftEther Server para ARM EABI e descar- sudo chmod 700 vpncmd
regamos.
81
No Code
NSA SECRETS - HACKING SQL SERVER - DYNAMIC DATA (UN)MASKING
#!/bin/sh Primeiro passo (Alterar a password de administrador).
# chkconfig: 2345 99 01
# description: SoftEther VPN Server Para realizar este passo executamos o vpncmd, selec-
DAEMON=/usr/local/vpnserver/vpnserver cionamos a opo 1 Managment of VPN Server or VPN Brid-
LOCK=/var/lock/subsys/vpnserver ge. No inserimos nenhum valor quando for pedido o ende-
test -x $DAEMON || exit 0
case "$1" in reo do servidor, uma vez que o servidor local, e quando for
start) apresentada a prompt, digitamos ServerPasswordSet, para
$DAEMON start alterar a palavra pass de administrador.
touch $LOCK
;; Segundo passo, criar um Hub Virtual, para se utilizar o
stop)
$DAEMON stop SoftEther.
rm $LOCK
;; obrigatrio criar um virtual hub, para se poder
restart) utilizar o SoftEther, assim sendo, neste caso chamaremos
$DAEMON stop ao hub VPN. Podem existir mais do que um HUB no mes-
sleep 3 mo servidor mas isso sai do mbito deste artigo. Vamos
$DAEMON start
;; utilizar novamente a ferramenta vpncmd. Dentro da ferra-
*) menta, na prompt dela basta digitar HubCreate VPN (neste
echo "Usage: $0 {start|stop|restart}" caso vpn o nome do nosso hub). De seguida o sistema ir
exit 1
esac solicitar a palavra passe de administrador do servidor, uma
exit 0 vez que estamos a efectuar configuraes.
Aps ter criado o ficheiro ainda preciso alterar as Assim que tenhamos criado o hub temos de o seleci-
permisses do mesmo com o comando: onar antes de prosseguir. Para isso, na prompt da ferramenta
digitamos Hub VPN .
sudo chmod 755 /etc/init.d/vpnserver && /etc/
init.d/vpnserver start Terceiro passo, activar o SecureNAT
Existem dois modos de acesso distintos a um
E por fim actualizar o arranque do sistema com o comando:
hub no SoftEther, o modo securenat e o modo bridge. Como
sudo update-rc.d vpnserver defaults o modo bridge no to comum de se utilizar e necessita
que se disponha de um servidor dhcp instalado localmente,
Neste momento o SoftEther Server j se deve encon- optaremos por usar apenas securenat evitando configuraes
trar em execuo pelo que teremos de verificar se est a de software adicionais. Para activar o securenat ainda dentro
funcionar correctamente. Para tal recorremos aos comandos da ferramenta vpncmd, na sua prompt digitamos SecureNat
seguintes: Enable .
cd /usr/local/vpnserver Quarto passo, criar e gerir utilizadores.
./vpncmd
Uma vez que j configurmos tudo at ao nosso hub
virtual, temos de criar os utilizadores para usar a VPN. Pode-
Neste momento pressionamos a tecla 3, para Use of mos criar utilizadores usando o comando UserCreate e ver a
VPN Tools e digitamos check. Se tudo apresentar a informa- lista de utilizadores existente usando o comando UserList. Os
o pass, digitamos exit para sair.
utilizadores podem ser adicionados a grupos e podem at ter
E pronto, temos o servidor instalado! Agora vamos a diferentes modos de autenticao (incluindo: Senha, Certifi-
configuraes! Existem duas formas distintas de configurar, cado, RADIUS, NTLM, etc.). Utilizando o comando UserCrea-
sendo uma a configurao local, usando a interface de linha te, na prompt da aplicao vpncmd vamos criar um utilizador
de comandos (vpncmd) e outra utilizando o software de ad- chamado paprevista. O comando ficaria assim: UserCreate
ministrao remota com interface grfica, que existe tanto paprevista.
para Windows, como para GNU/Linux e MacOS. Neste artigo
vou apenas focar as configuraes iniciais, recorrendo fer- A autenticao predefinida para os utilizadores
ramenta de interface de linha de comandos. No entanto, re- por password, mas poder ser alterada de acordo com o
comendo a todos os que forem mais proficientes em Win- que for pretendido usando os comandos listados abaixo:
dows o uso da ferramenta grfica para Windows, uma vez
UserNTLMSet for NT Domain Authentication
que muito intuitiva e simples de utilizar.
Configurando: UserPasswordSet for Password Authentication
Tal como j foi mencionado a configurao ser UserAnonymousSet for Anonymous Authentication
feita pela interface de linha de comandos recorrendo ao
UserRadiusSet for RADIUS Authentication
vpncmd. Esta configurao divide-se num conjunto de pas-
sos sequenciais que sero apresentados de seguida. UserCertSet for Individual Certificate Authentication
82
No Code
NSA SECRETS - HACKING SQL SERVER - DYNAMIC DATA (UN)MASKING
UserSignedSet for Signed Certificate Authentication Agora temos de transferir o certificado para os clien-
tes de vpn e adicion-los como trusted confiveis. Primeira-
Neste caso e apenas para manter a simplicidade, mente vamos guardar o certificado na directoria home do
vamos utilizar a autenticao por password e definir como nosso raspberry usando o comando ServerCertGet ~/
password !atsiveR para tal basta na prompt do vpncmd cert.cer .
digitar UserPasswordSet !atsiveR
Agora podemos transferir o certificado, quer seja por
Quinto passo, configurar o modo L2TP/IPSec SFTP quer seja em pen-drive, como nos for mais convenien-
Para activar o modo L2TP/IPsec VPN server basta digi- te, pois trata-se apenas de copiar um ficheiro. Ateno que
tar o comando IPsecEnable, na prompt do vpncmd. Este nas mquinas com sistema operativo Windows, o certificado
comando ir desencadear uma srie de questes para confi- tem de ser instalado nas Trusted Root Certification Autho-
gurar as funcionalidades do servidor L2TP, tal como esto rities
descritas em seguida. SstpEnable Yes
ltima parte
Enable L2TP over IPsec Server Function Digita-
mos yes para activar L2TP sobre IPSEC com chave
pr-partilhada. (Feito este passo, podemos aceder OpenVpnEnable Yes / PORTS: 1194
nossa vpn usando qualquer dispositivo incluindo dis-
positivos iOS, Android, Windows, Mac OS X, GNU/ Agora que crimos e registmos um certificado
Linux, etc
OpenVpnMakeConfig ~ / revistaProgra-
Enable Raw L2TP Server Function Isto ir activar mar_openvpn_config.zip
o L2TP para todos os clientes que no tenham SSL no servidor, podemos ativar a funo SSTP com o
IPSEC. comando seguinte:
Enable EtherIP / L2TPv3 over IPsec Server Func- E de seguida habilitar o modo OpenVPN:
tion Os routers que sejam compatveis com EtherIP /
Feito isto podemos gerar um ficheiro com as confi-
L2TPv3 sobre IPsec podem ligar-se a este server guraes utilizando o comando seguinte, na bash:
uma vez que esta opo est habilitada.
E de seguida transferimos para as mquinas clientes, da
Pre Shared Key for IPsec Aqui ser pedido que forma que nos for mais conveniente.
digitemos a chave pr partilhada para ser usada pelo O SoftEther tambm fornece um software cliente
L2TP VPN. VPN dedicado para Windows e GNU/Linux que suporta um
protocolo especfico do SoftEther chamado Ethernet sobre
Sexto passo, configurar as funcionalidades SSTP/ HTTPS ou SSL-VPN que bastante poderoso e flexvel.
OpenVPN Este usa o protocolo HTTPS e a porta 443, para estabele-
cer um tnel VPN e tira partido do facto de esta porta ser
O SoftEther pode copiar as funes de Microsoft bem conhecida e quase todas as firewalls, servidores proxy
SSTP VPN Server e/ou do OpenVPN Server. Mas antes de e NAT permitirem a passagem de trfego nesta porta. Para
ativ-las, temos de gerar um certificado SSL auto-assinado usar o protocolo SSL-VPN, devemos utilizar o cliente de
para o servidor. Para tal vamos usar o comando Server- VPN do SoftEther que est disponvel no prprio site do
programa.
CertRegenerate do SoftEther para gerar e registrar um
certificado SSL auto-assinado para o servidor. O argumen- No irei focar a instalao de um cliente no artigo
to passado para comando CN (Common Name) e deve uma vez que o objectivo se prende com a instalao e con-
figurao do servidor num raspberry pi correndo Pixel OS.
ser definido como o nome do host (FQDN) ou endereo IP:
Concluso
ServerCertRegenerate [CN]
Ao longo deste artigo, apresentei o processo de insta-
Notas: O SoftEther vem com um Dynamic DNS incorpo- lao e configurao de um servidor VPN SoftEther no siste-
ma operativo Raspberry Pixel OS, para Raspberry Pi e a
rado, que pode atribuir um hostname nico e permanente ao
configurao do mesmo pela interface de linha de comandos.
servidor. Se j tiver um certificado SSL ou tiver criado um Todas as tarefas feitas durante este artigo podem ser feitas
usando openssl, este pode ser adicionado ao servidor usan- utilizando o SoftEther Server Manager para Windows, que
do o comando ServerCertSet. bastante mais simples de usar para utilizadores menos expe-
rientes, ou mais ambientados plataforma Windows.
AUTOR
Escrito por Antnio C. Santos
Apaixonado por tecnologia, autodidata desde tenra idade. Cresceu com o ZX Spectrum 48k. Com mais
de 20 anos de experincia em implementao e integrao de sistemas e desenvolvimento de software
por medida nas mais diversas linguagens. Formou-se no Instituto Politcnico de Viana do Castelo. Mem-
bro da Comunidade Portugal-a-Programar desde Agosto de 2007, tambm membro da Sahana Softwa-
re Foundation, onde Programador Voluntrio desde 2012. Twitter:@apocsantos
83
No Code
SEGURANA FAMILIAR MICROSOFT NO WINDOWS 10:
84
No Code
SEGURANA FAMILIAR MICROSOFT NO WINDOWS 10: UM GUIA PARA PAIS E EDUCADORES
85
No Code
SEGURANA FAMILIAR MICROSOFT NO WINDOWS 10: UM GUIA PARA PAIS E EDUCADORES
86
No Code
SEGURANA FAMILIAR MICROSOFT NO WINDOWS 10: UM GUIA PARA PAIS E EDUCADORES
Navegao na Web
Ao ativar esta opo, os Pais garantem que
os contedos com classificao para adultos so bloquea
dos e que a pesquisa segura filtra os contedos
imprprios.
87
No Code
SEGURANA FAMILIAR MICROSOFT NO WINDOWS 10: UM GUIA PARA PAIS E EDUCADORES
Adicionalmente, possvel criar lista de sites que Tempo passado em frente ao ecr
os menores podem ou no visitar.
Nesta opo,
Estes bloqueios so definidos para o Microsoft
os Pais vo definir a quantidade de tempo que
Edge e Internet Explorer 11 apenas.
os menores podem passar em frente ao PC. Atravs
do calendrio disponvel,
os adultos podem configurar um horrio
dirio, bloquear determinado dia da semana ou no
impor qualquer limite.
88
No Code
SEGURANA FAMILIAR MICROSOFT NO WINDOWS 10: UM GUIA PARA PAIS E EDUCADORES
89
No Code
SEGURANA FAMILIAR MICROSOFT NO WINDOWS 10: UM GUIA PARA PAIS E EDUCADORES
SeguraNet: http://www.seguranet.pt/
Cybersegurana da G.N.R.: http://
www.comunicaremseguranca.sapo.pt/
Microsoft Online Safety: https://www.microsoft.com/about/
philanthropies/youthspark/youthsparkhub/programs/
onlinesafety/
Poder ainda rever as perguntas
frequentes e atualizaes da Segurana
Familiar em: https://account.microsoft.com/family/faq
Concluso
Como podemos ler ao longo do
Se o adulto pretender remover um membro da lista,
artigo, ferramentas de controlo parental como
poder faz-lo
a Segurana Familiar da Microsoft, oferecem um leque
no site clicando em "Mais" e selecionando a
variado de opes de simples
opo "Remover da Famlia".
configurao que Pais e Educadores podem implementar
Recursos nos dispositivos das suas crianas. No sendo esta
uma soluo definitiva para todos os perigos que
Existem online, inmeras entidades que
a Internet representa para as crianas e jovens de hoje,
disponibilizam informaes teis que ajudam Pais e Educa
fundamental ainda que os Pais estejam
dores a preparar as suas crianas para uma utilizao
sempre atentos a alteraes de comportamento que
segura e responsvel da Internet. Aqui ficam
podem indiciar problemas mais graves e nunca
alguns exemplos:
esquecendo de educar as crianas para
Projeto Internet Segura: http://www.internetsegura.pt/ a existncia de novas ameaas.
AUTOR
Escrito por Nuno Silva
IT Professional | Windows Insider MVP | Microsoft MVP - Windows Experience (2014-2016) | Microsoft Technical Beta Tester
(Windows International Team) | MCC | Certified Microsoft Windows Phone Expert | Windows Team Division Manager @ Micro-
soft Group Portugal (Facebook)
90
No Code
GameJAM
O Global Game Jam o maior evento de jam (criao oportunidades dentro da comunidade. Alm disso sempre
de jogos) do mundo que acontece em locais fsicos por todo um desafio intelectual. As pessoas so convidadas a explorar
o mundo . um hackathon focado no desenvolvimento de novas ferramentas tecnolgicas, tentando novos papis no
jogos. o crescimento de uma ideia de que, no mundo desenvolvimento e testando suas capacidades para fazer
fortemente conectado, poderamos unir-nos, ser criativos, algo que os obriga a projetar, desenvolver, criar e testar um
compartilhar experincias e expressarmo-nos de muitas novo jogo no perodo de 48 horas. O GGJ estimula a
maneiras usando jogos de vdeo. um fim de semana de colaborao e no uma competio.
criao de jogos, num processo iterativo em que todas as
A GGJ operada pela Global Game Jam, Inc., uma
etapas se realizam em poucos dias.
empresa internacional sem fins lucrativos com sede em San
Luis Obispo, Califrnia, com a misso de promover o design
de jogos e a educao de jogos atravs de eventos
inovadores.
91
No Code
ENTREVISTA A EDITE AMORIM
Ocupo-me a escrever para vrias publicaes, a dar RP: Numa das suas conferncias diz ser "criadora de
aulas de Dana e Expresso e a ser coordenadora da THIN- dias"! O que ser criadora de dias?
KING-BIG, atravs da qual dou formaes no que me apai- EA: Esta uma expresso que uso muitas vezes, que s
xona e define (Criatividade e Psicologia Aplicada, usando quer dizer que cada dia uma construo, sem rotinas fixas
dinmicas de grupo, conceitos da Filosofia e storytelling). ou pr-definio.
Troco o certo pelo incerto com muita frequncia e mudo de
papis sociais com alguma facilidade (de conferencista inter- Sendo freelancer acontece que cada dia guarda a
nacional a lavadora de pratos, de professora de dana a vo- possibilidade de ser inventado quase por inteiro. Significa que
luntria num campo de Refugiados). s vezes me demoro 3 horas no livro que leio ao pequeno-
almoo, outras vezes respondo a e-mails ou escrevo at 1
Continuo a falar muito, mas agora tambm medito e da manh, e noutros permito que um encontro com um estra-
aprecio o silncio. nho se prolongue por 2 horas.
RP Como surgiu a "Thinking-Big" (Pensar grande) ? No tenho os dias como garantidos e raro saber de
EA: A THINKING-BIG a evoluo natural do meu anterior antemo como vai ser o seguinte. Por isso, desejo estar sem-
projeto - Jogos de Corpo e Voz (JCV) (http:// pre desperta para os saber preencher da forma que mais
corpovoz.blogspot.fr), que criei mal sa da faculdade. Foi significado tenha, para poder aproveitar mais de mim e do
desenvolvido em parceria com a minha scia e grande amiga que sei e gosto de fazer.
Bianca Varandas e durou 7 anos, durante os quais invent- Ser criador de dias significa, sobretudo, estar consci-
92
No Code
ENTREVISTA A EDITE AMORIM
ente e procura da melhor forma de encher as 24 horas que Manter os sentidos abertos para as diferenas, para aprender
me so dadas viver a cada dia e inventar sequncias que me como se faz, para sentir o que muda e o que permanece
permitam viver, mais do que ir sobrevivendo. volta. Sem julgamentos de melhor ou pior, s anotando e
curioseando nas diferenas que vejo ao meu redor.
RP: Como ser um profissional nmada? Que dificulda-
des/desafios encontra normalmente? No meio de tudo isto, a escrita de dirio de vida (que
recolhe o bilhete de cinema, a fatura do caf, um pequeno
EA: Ser de algum modo um pouco nmada tem sido de-
panfleto bonito, uma folha de rvore, colecionando bem a
safiante e cativante na mesma proporo.
vida) e a ligao virtual ou por carta com as minhas pessoas
A parte bonita e saborosa bastante bvia de referncia, espalhadas um pouco pelo mundo, so os fato-
(variedade, estmulo, riqueza, intensidade,...). A contraparte res que me mantm os pontos-chave no lugar. Nunca se
um enorme desafio a vrios nveis. nmada das coisas de dentro.
A nvel prtico obriga-me a um grande rigor e discipli- E creio que o meu truque tem sido esse: procurar le-
na, porque sempre um comear de novo, a cada novo poi- var a vida de dentro onde quer que os passos de fora pou-
so. sem.
preciso procurar os lugares onde consigo trabalhar RP: Diz-se convencionalmente que arte "pintar um qua-
(no s com condies prticas, como internet e boas me- dro, fazer uma escultura", ser "criar algo, apenas por-
sas, mas com potencial de inspirao, de bem-estar). que se imaginou esse algo, 'out of the blue", arte ?
Depois, h sempre a habituao ao idioma, cultura, EA: Neste campo no posso dar mais do que o meu pon-
s formas de fazer (h lugares onde a naturalidade mais to de vista como passeante pelo mundo da Arte...
bem-vinda do que os formalismos e vice-versa; isso tambm
Eu acredito na Arte como um processo que nasce de
pede um grande foco e energia, e uma predisposio para
um percurso, uma construo sobre conceitos e referncias.
adaptar os meus passos quotidianos).
No existe, na minha opinio, um Out of the blue, j que
Tudo isto obriga-me a uma ateno muito fina, e a tudo criado a partir de um material pr-existente, a residir
uma capacidade para me reinventar de maneira quase per- c dentro. O que j aprendemos, com quem falmos, os fil-
manente. Nada assumido como demasiado garantido, tudo mes, msica, livros que nos passaram pelas mos... Tudo
implica um estado de alerta mais ou menos constante, e isso isso constri um material que, no momento de criar, se com-
s vezes cansativo, exigente, e muitas vezes solitrio. pe e manifesta. Como sublinhou um pensador portugus j
falecido, o Lus Falco: para entender a Criatividade neces-
A vida (a de fora e a de dentro) passa s vezes a ca-
srio olhar a tradio, a histria e todo o conjunto de peas
ber numa mala. H momentos em que essa mala sabe a
do passado que nos faz o que somos no presente. Assim,
pouco, mas esse desapego torna a vida mais leve, mais fo-
consciente ou inconscientemente, tudo se cria a partir de
cada no fundamental.
qualquer coisa. Da a importncia de nos enriquecermos do
Desafio bonito seria a expresso-resumo para esta pergun- j existente, quando desejamos criar o novo.
ta.
A Arte nascer, desde o meu ponto de vista, de um
RP: Algum truque especial que uses para os ultrapas- trazer realidade uma nova forma de sentir e expressar, seja
sar? atravs da pintura ou escultura, como referes, ou atravs de
qualquer outra manifestao criativa/expressiva, que colabo-
EA: No meu caso o truque o interesse grande no proces-
re para um sentido mais cheio do mundo de fora ou de den-
so de fazer casa fora de casa, nem que seja por alguns tro.
dias.
RP: Uma questo incomum! O que diria a algum que l
Procuro pessoas com quem me relacionar, atividades
pela primeira vez uma mas mais inquietantes e criativas
culturais que me satisfaam a sede de Beleza, e espaos
citaes de Richard Feynman ? "Estude o que mais lhe
onde danar, que para mim o exerccio e a expresso nu-
interessa da maneira mais indisciplinada, irreverente e
ma s atividade (manter o corpo acordado sempre uma
original possvel.
prioridade. Tento nunca o deixar desatendido, nem que seja
alongamentos no quarto ou caminhadas longas pela cidade). EA: Rir-me-ia e diria s: Sim, isso. Faz isso! Endoidece,
reinventa, sai e entra e sai e entra da caixa as vezes que
Vivo muito as cidades onde habito ou onde vou traba-
forem necessrias para chegares ao que queres aprender
lhar. Procuro cafs diferentes para pousar o computador,
com gosto, com prazer, com curiosidade, com vontade de
fao compras no comrcio tradicional, caminho pelas ruas,
que te brilhem os olhos. Procura o gozo extremo de integrar
falo com os lojistas todos, crio rotinas de coisas simples... em ti coisas novas que queiras fazer tuas.
Isso ajuda a perceber e viver os espaos, a conhecer as pes-
soas e a sentir que se faz parte da engrenagem social, de
um universo comum. Ajuda imensamente.
A curiosidade aguada tambm de grande auxlio.
93
No Code
ENTREVISTA A EDITE AMORIM
RP: "Os impossveis tardam um bocadinho mais!" ( Sim RP: Como possvel confiar quando tudo parece
ns fazemos o trabalho de casa!) O que dirias a um de- "negro" ?
veloper, ou um "tinkerer" algum que se desunha para
EA: Vou responder desde o meu percurso individual,
combinar palavras e "pequenas peas", para fazer algo,
sem tentar generalizaes ou dicas gerais.
e sente vontade de desistir face adversidade ?
Esta , na verdade, das aprendizagens que me tem
EA: A primeira coisa que lhe diria seria um Bem-vindo ao
sido mais difcil e dura ao longo dos anos. Mas talvez tam-
clube, meu/minha caro/a)! Sentimos todos essa vontade de
bm a mais preciosa.
retirada, em algum momento, creio eu. Eu, pelo menos, sinto
imensas vezes. Como freelancer passo, por vezes, por perodos sem
projetos externos (sem clientes que me peam uma formao
Mas a frase que citas (e que eu repito inmeras vezes
ou uma conferncia), o que me obriga a ter que gerir a vida
dentro da minha cabea), um bom organizador de motiva-
de uma forma particular, no s econmica como animica-
es.
mente. E s vezes as coisas parecem mesmo negras, claro.
Claro que duro caminhar a construir algo de novo. Imagino que no vosso caso aconteam coisas bem seme-
As dvidas (Estou mesmo no caminho certo?, Estou a lhantes.
fazer tudo o que posso?, Isto vai mesmo valer a pena?,
No meu caso, eu sinto uma clareza absoluta de estar
Valho o suficiente para isto?, Porque que minha volta
no caminho certo, de ser exatamente isto que me apaixona e
no reconhecem o que estou a fazer?) assaltam-nos nos
que me entusiasma fazer. Essa certeza uma fora gigante,
momentos mais inesperados. Mas a pacincia e a capacida-
nos dias de outras dvidas. Sentir que este o caminho de
de de esperar e perseverar (que so um treino bem desafian-
verdade para mim e que, por isso, preciso de o continuar.
te, pelo menos para mim), so chave para no desistir. Esta
frase uma espcie de pensar grande, de fazer zoom out Outro aspeto importante a contribuio para algo
aplicado ao que se est a construir. No momento talvez pare- maior: eu confio que o meu trabalho uma pea de uma en-
a absurdo (e parece-me muitas vezes), mas quando o tem- grenagem, um contributo para a sociedade, para a plantao
po avanou e se percebe que s mesmo aguentando, espe- de pedacinhos frteis de humanidade. Assim, quando as ta-
rando e continuando a acreditar que se conseguiu chegar a refas concretas a que me dedico se tornam isentas de efeito
ver algum resultado, confirma-se que a frase tem mais senti- ou de sentido (o que desmotiva), procuro re-sintonizar no
do do que o clich que parece. sentido maior do que fao. E nesse momento consigo perce-
ber que aquele impasse s uma parte do caminho, uma
A verdade que no se conhecem caminhos diretos
pedra. Mas que o caminho vale a pena, e que merece de
para chegar a lado nenhum, conhece? Todas as grandes
mim que persevere nele. (Imagino que haja projetos que um
histrias (de livros, filmes, de TED talks, de personagens que
programador esteja a desenvolver que sejam exatamente o
fizeram a diferena) tm sempre a parte de E um dia passei
mesmo: sentem que esto a colaborar para algo maior do
por um perodo horrvel um processo de falncia, um esgo-
que eles).
tamento, o quase fecho de um projeto profissional e depois
de resistir vontade de largar tudo e s desistir, voltei a Depois, h algo que da ordem do invisvel. H quem
agarrar-me ao que realmente desejava fazer e recomecei lhe chame F (no num sentido religioso, mas mais amplo).
com nova fora, trazendo-me esse percurso at ao lugar Eu chamo-lhe um Acreditar, e um continuar sem vergar, por
onde estou agora. um caminho que sabemos que est certo. um saber c por
dentro que vale a pena, que sempre se chegar aonde nos
Os impossveis fazem-se, acontecem, chegam. Mas
esperam, como dizia o Jos Saramago.
preciso acreditar com fora no lugar para onde se est a
caminhar e agarrar-se com convico a possvel e s ve- A um outro nvel, mais prtico, ajuda-me muito rodear-
zes a impossvel aos pedacinhos de caminho. me de pessoas que me animam a caminhada, sejam amigos
que me dizem Confio no que ests a fazer e na tua capaci-
E, s vezes, h que saber tambm desistir, quando se
dade para o fazer; sejam colegas que me validem as compe-
percebe com boa certeza, com grande clareza, que o investi-
tncias, que me reconheam o valor profissional; ou mesmo
mento necessrio nos consumir uma energia que no esta-
clientes com quem guardo boa relao, pedindo-lhes feed-
mos dispostos a perder.
back sobre os processos que fiz com eles. Os outros so,
Mas quando o caminho sentido como certo por den- sem dvida, a pea fundamental do meu caminho.
tro, como o tal do momento, s difcil nas formas e no pro-
Outra coisa que resulta comigo fazer um ponto e vrgula.
cesso, sou adepta da persistncia. Pegando nas dificuldades
parar para me deixar ir ao fundo, desabar temporariamente
todas e conversando com elas volta de um copo de vinho,
sem tentar aguentar nem manter-me forte. sintonizar na
ou num passeio pela cidade. Mas fazendo-as parte da cami-
minha fragilidade absoluta e na vulnerabilidade da incerteza,
nhada, amigavelmente. Por isso, developers, tinkerers: des-
e estar a uma semana, se necessrio. Nessas alturas queixo
cubram o vinho preferido das vossas dificuldades e convidem
-me, falo com gente, escrevo-me, fao listas do que no est
-nas para um jantar com queijos e pacincia. Ainda acabam
bem e do que j esteve. E depois procuro um novo respirar.
a noite a rir-se a bom rir das tropelias e preparados para con-
Fao muitas vezes pausas, quando as coisas se complicam.
tinuar, apesar do colesterol altoJ.
94
No Code
ENTREVISTA A EDITE AMORIM
Viajo para lugares onde tenha amigos, para fazer coisas dife- (bem visveis nos Hactkathons a que j assisti) do conta de
rentes, ou para mudar s o contexto, a inspirao (eis um uma crescente implicao dos Programadores no desenho
exemplo disso: http://www.thinking-big.com/blog/getting- de um mundo mais forte, e nesses que eu deposito as mai-
inspiration-an-experience-in-a-residence). s vezes pode ser ores expectativas.
mesmo ir lavar pratos para um restaurante, algo totalmente
RP: Dizem muitas vezes que os psiclogos so
distinto do habitual trabalho mais intelectual; um ganhar
"aborrecidos", de olhar carregado e pesado! No obstan-
lano para continuar a maratona, atravs de um sprint numa
te, ler-te, olhar para a Edite, no parece nada o clich
coisa diferente.
conhecido! Qual a razo ?
As pausas (no meu caso acompanhadas por reflexo,
EA: (Ai diz-se isso dos psiclogos? Eu devo dizer que co-
j que escrevo sempre sobre o processo, para poder perce-
nheo vrios bastante frescos e arejados:)
ber o que estou a ganhar com elas, de que forma que es-
to a colaborar para o grande projeto de vida que pretendo)
so momentos extremamente ricos, de empurro e oxignio.
Alm disso, a leitura uma fonte inacreditvel de
energia e inspirao. Autores que me fazem sentir esse qua-
dro maior do qual fazemos parte, so peas-chave no cami-
nho. Jos Tolentino Mendona, Rui Chafes, ou at mesmo,
na linha do romance, o Steinbeck ou o Saramago, contribu-
ram muitas vezes para no perder a noo de que, no fundo,
esta s uma viagem pela Terra. E uma viagem de que
importante desfrutar, com a qual nos podemos divertir e
aprender e evoluir como humanos. Quando isso se torna
claro por dentro, no h nada to negro que no se aclare.
(H um livro -O dirio de Etty Hillesum- que me traz
muita dessa perspetiva sobre o valor da caminhada, mesmo
com dificuldades tremendas pelo caminho. Um reforo no
continuar sempre e apesar de tudo, a batalhar pelo que se
cr).
Em 12 anos de empreendedorismo e de trabalho nu-
ma rea algo vanguardista, como a aplicao da Psicologia Foto: Ana Cancela
Positiva, tenho uma coleo de momentos negros bem rica.
E, apesar de j ter tido momentos de impasse quase violen- No meu caso, sinto que o meu profissionalismo, o
tos, estas coisas so o que me mantm na mesma linha, meu rigor e a minha exigncia comigo e com o trabalho que
mesmo tendo tido infinitas vezes a possibilidade de ir por fao no esto, de maneira nenhuma, ligados necessidade
caminhos mais fceis. de parecer sria. No sou. Rio gargalhada no meio de
reunies, fico com os olhos a brilhar com post-its de muitas
RP: Esta uma publicao de programadores, para pro-
cores quando entro numa sala de formao, vibro com uma
gramadores e aspirantes a tal, apaixonados pelas tecno-
sobremesa de chocolate num jantar de trabalho e pego no
logias. Pelo que conheces do mercado de trabalho, estas
vereador para danar, depois de uma conferncia muito s-
ainda so reas que tm procura?
ria. No deixo de ser uma menina de 36 anos, suponho. Uma
EA: Diria que SIM, sem dvida. Desde que se mantenham menina que psicloga porque se interessa pelo Outro,
abertos ao mundo que respira, que evolui, que muda. E so- com o que tem de difcil e doloroso, mas sobretudo com o
bretudo, desde que se mantenham sintonizados com o Hu- que tem de belo, de potico, de mgico, elevado, surpreen-
mano. Com as reais necessidades das pessoas, do ambien- dente. E ver isso tudo no nos pode deixar de olhar carrega-
te, do que nos faz seres globais, e no com o que nos que- do e pesado, mas de olho brilhante e curioso, vido, com
rem vender que so as tendncias, as modas ou os novos vontade de fazer parte desse todo chamado Humanidade.
indicadores.
RP: Num mundo competitivo, diz-se que "ou se nada com
Tenho a maior f nos programadores que usem o seu os tubares ou se tragado", por eles, como os peixi-
conhecimento e a sua paixo a favor de uma construo de nhos do oceano. O que diria a Edite, a algum que no
mundo mais amplo. Os exemplos de programas de interven- quer competir com ningum, no quer "tragar ningum",
o social proliferam: programadores que criaram apps para nem quer ser apenas um peixinho tragado por um tuba-
ajuda aos Refugiados; para melhoria das formas de utiliza- ro ?
o de servios de sade; para estratgias de apoio s mes
EA: A Edite diria diz, diz-se muitas vezes, e no tem a
ou pais que cuidam sozinhos dos filhos; para idosos que
menor dvida disso que a vida no a preto e branco. Que
vivem isolados; para estudantes que precisam de encontrar
no h nunca s duas alternativas para as situaes. E que a
solues de apoio escolar,... Os exemplos por todo o mundo
95
No Code
ENTREVISTA A EDITE AMORIM
criatividade, aliada aos valores no lugar certo, permite encon- estratgias para evitar isto).
trar solues que no passem s por ou nadar com tuba-
Alis, a criatividade fortemente aumentada com o
res ou ser comido por eles..
movimento, por isso, nos dias de bloqueios fica a dica: cami-
Pode, por exemplo, criar-se estratgias de unio de nhada de meia hora. Ativa corpo e conexes sinpticas.
foras com outros ditos peixes pequenos. Um bom cardume
Estar preparado para que vida pessoal, vida profissio-
intimidar qualquer peixe que se pense tubaro, no? Pesso-
nal e vida social sejam, por vezes, uma mesma coisa. Arran-
almente, tenho desenhado o meu caminho a enxot-los com
jar estratgicas para que isso no interfira ou para aprender a
os paus mais compridos que conheo. Digo que no muitas
separ-las, quando necessrio/possvel.
vezes. No a projetos, No a formas de trabalhar, No a
parcerias que no me parecem justas. A sobrevivncia a Saber viver com muito e com pouco, e desfrutar disso.
esses nos nem sempre fcil, mas em nenhum momento Saber gerir os recursos financeiros e a energia, quer quando
admito ceder quando so casos de algum peixe que se acha so muitos quer quando so poucos. Fazer disso quase um
tubaro. desporto.
E tambm podemos repensar a prpria noo de tu- Muita abertura ao mundo. Ningum vai passar uma
baro. Como diz o Novalis, no livro Fragmentos de Novalis, circular a anunciar necessidade de mudanas estratgicas,
Ao vermos um gigante, devemos examinar a posio do sol, ou de expandir negcio ou de diminuir custos dirios. Todas
primeiro e atentar se no ser apenas a sombra de um as mudanas estratgicas tero que vir da capacidade de
pigmeu. (...). E eu no acredito em tubares. Talvez eles se anlise do prprio negcio, do mercado, e da perspetiva so-
vejam assim, mas para mim no passam de peixes que ve- bre o prprio mundo volta. Estar escuta e atento a ele
mos com culos de aumentar. Se no pusermos esses cu- fundamental (E depois cada um escolhe como e se se adapta
los, so peixes, peixes normais. E no d vontade de dar a ele).
grande poder a peixes normais, pois no?
Capacidade para saber (ou saber a quem perguntar)
(Quando li esta pergunta a uma amiga designer, ela no s sobre a sua rea de negcio, mas sobre tudo o que
s me respondeu: Cria o seu prprio aqurio dentro do seu ter um implica: finanas, marketing, design, comunicao,...
oceano. No podia estar mais de acordo.)
Saber comunicar com assertividade, com clientes,
RP: Que conselho darias a algum que se quer tornar colegas, fornecedores e mundo volta. A comunicao flu-
freelancer, "nmada" ou no ? da, direta e fcil fundamental em todo o processo: acertar
prazos, negociar formas de pagamento, pedir e dar oramen-
EA: Acho que no me atreveria a dar propriamente con-
tos, anunciar alteraes, saber dizer no com delicadeza,..
selhos mas, pensando no meu percurso de 12 anos como
Para mim uma das grandes necessidades necessrias a
freelancer e no de quem conheo volta, fao uma checklist
qualquer freelancer que trabalhe com clientes finais, pelo
que pode dar jeito percorrer:
menos.
- Ser resistente instabilidade (econmica, de chega-
Ter seriedade nos valores. Ter uma palavra na qual se
da de projetos e de volume de trabalho, de ocupao). Estar
possa confiar, cumprir acordos, prazos, saber desculpar-se
preparado(a) para meses sem nada e meses com coisas a
perante um erro. Sendo a cara do projeto profissional (na
mais, e para uma vida em que os planos a mdio/longo pra-
verdade, o projeto todo), extremamente importante que os
zo podem ser uma miragem.
valores sejam ntegros e que a seriedade, o rigor pessoal e o
Capacidade para gerir e criar o quotidiano. Possuir brio sejam requisitos imprescindveis. Na minha opinio, esta
uma disciplina pessoal de criar rotinas que funcionem (nem ponto que mais marca a diferena entre um freelancer com
que de rotina tenham pouco, desde que siga uma estrutura que eu desejo ou no trabalhar.
que permita um equilbrio entre produtividade e vida real/
Ter uma boa rede de pessoas volta. Pessoas a
pessoal). Pode ser responder e-mails 2 da manh e dormir
quem pedir conselhos prticos em reas que se conhea
uma sesta no fim do almoo, desde que isso funcione com
menos; colegas, mesmo que sejam concorrncia, com quem
qualidade produtiva para o trabalho e sem rebentar a vida
se possa aprender com humildade; uma ou duas pessoas
pessoal.
que vo l estar quando apetecer gritar que se vai desistir
No esquecer o corpo. No vai haver cursos de Higie- (vai acontecer mais vezes do que as mos contem, provavel-
ne e Segurana no Trabalho, nem formaes em ergonomia, mente. E est tudo bem!); pessoas ou grupos que sejam lufa-
por isso importante cuidar o corpo no dia-a-dia, desde os das de ar fresco - artistas, criativos, pensadores, crticos -
hbitos forma de sentar. Nunca haver razo nenhuma que permitem sempre um zoom out da vida e que relembrem
para que os dias passem sem que se faa um pouco de que ela sempre mais do que o negcio que se est a de-
exerccio (nem que seja levantar-se de meia em meia hora senvolver (s vezes faz muita falta).
para esticar pernas 2 minutos e apanhar ar), comer o mais
EA: Eu falo destas coisas como pontos a desenvolver.
saudvel possvel (a tentao de petiscar todo o dia, de co-
Acho que quando comeamos nos faltam mais de metade
mer a primeira comida de plstico mo ou de passar horas
destas capacidades, naturalmente. Mas a vontade de estar
sem nada no estmago grande, por isso bom arranjar
atento(a) a elas e de as ir desenvolvendo que pode ajudar-
96
No Code
ENTREVISTA A EDITE AMORIM
nos a decidir se se est ou no preparado(a) para avanar. Para os que o comearem: BOA SORTE, mente bem aberta
e corao atento!
No acho que toda a gente se encaixe pacificamente
neste estilo de vida, de freelancer. A incerteza e insegurana
Para todos os leitores da Programar, Edite Amorim oferece um desconto no seu curso online
(Creative Thinking- opening perspectives and thinking big). Basta seguir o link at dia 31 de Ja-
neiro'17 (validade do mesmo) para aceder ao preo com desconto.
https://www.udemy.com/creative-thinking-online-course/?couponCode=PROGRAMAR
97
Veja tambm as edies anteriores da
www.revista-programar.info
51 Edio - Dezemb ro 2015 48 Edio - Maro 2015
Revista PROGRAMAR
e muito mais em
52 Edio - Maro 2016 49 Edio - Junho 2015
53 Edio - Agosto 2016 50 Edio - Setembro 2015