Escolar Documentos
Profissional Documentos
Cultura Documentos
Revista PROGRAMAR 51 PDF
Revista PROGRAMAR 51 PDF
Christmas_tree.cpp
EQUIPA PROGRAMAR
Coordenador
Antnio Pedro Cunha Santos
#include "stdafx.h"
#include<stdio.h>
Editor void main()
Antnio Pedro Cunha Santos { int rows,starNo,spaceNo; //Perguntar e definir metas prprias
printf("Enter Rows:\n"); scanf("%d",&rows);
// Definir o algoritmo
Design for(int i=1;i<=rows;i++) {starNo=i*2-1; spaceNo=i+rows-starNo;
Srgio Alves for(int j=0;j<spaceNo;j++) {printf("%c",' ');}
Twitter: @scorpion_blood for(int k=0;k<starNo;k++) {printf("%c",'*');}
printf("\n"); }
Ilustrao //Continuar a apostar no algoritmo
Sara Freixo for(int l=0;l<3;l++){ for(int m=0;m<(rows*2+1)/2;m++) {printf("%c",' ');}
printf("%c\n",'*'); } printf("\n ");
Redaco /*
Andr Melancia
Andr Silva Eis-nos chegados ltima edio do ano 2015, com a nossa equipa a deixar
Antnio Pedro Cunha Santos aos leitores mais uma edio em jeito de prenda no sapatinho. tempo de os geeks
Carlos Grilo descansarem e darem ateno famlia (e que se note que pra mim, o meu porttil
Esteban Solano tem toda a legitimidade de receber o seu prprio presente uma vez que at
Fbio Pinho partilhamos vrios jantares ao longo do ano).
Filipa Peres
Jos Viana Nesta poca sentimentalista em que recordamos o ano que agora termina e
Nuno Silva em que quase todos desejamos criar o algoritmo que nos permita encontrar as
Patrcio Domingues prendas perfeitas, quisemos tornar esta edio numa edio de todos e para todos.
Patrick Freitas Para os programadores e para os designers. Para os fanticos da informtica e para
Rita Peres os simplesmente simpatizantes.
Sara Silva
Tnia Valente Em suma, para os geeks e para os no geeks. Nesta edio h artigos para
Vtor Carreira todos os gostos e feitios, sem nunca esquecer quem somos e para quem
escrevemos.
E escrevemos para ti, caro leitor, quer nos acompanhes h vrias edies,
Staff
quer seja esta a primeira que ls. Esta edio dedicada a cada um de vs.
Antnio Pedro Cunha Santos
Rita Peres Que 2016 seja um ano de triunfos, que tenham inspirao, que as vossas
Rui Gonalves linhas de cdigo se reinventem e as vossas compilaes no falhem, que 2016 vos
traga ideias e oportunidades para as por em prtica!
Contacto
revistaprogramar@portugal-a- Porque ns, programadores, somos gente de ideias e no desistimos!
programar.org
Por isso e por muito mais PROGRAMAR ontem, hoje e amanh! At
prxima edio.
Website
http://www.revista-programar.info */
Rita Peres
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 Travessia de uma rvore de diretrios usando recursividade - Patrcio Domingues; Vtor Carreira; Carlos Grilo
A PROGRAMAR
ELECTRNICA
32 Aquisio de dados via TCP/IP com GENUINO (ARDUINO) - Antnio C. Santos
COLUNAS
36 Cross-Platform - A soma de todas as mudanas - Antnio C. Santos
ANLISES
NO CODE
43 Windows 10: As novidades da actualizao de Novembro (BUILD 10586 - VERSION 1511) - Nuno Silva
EVENTOS
- Shift APPens (19 a 21 de Fevereiro de 2016)
- SINFO (23 a 28 de Fevereiro de 2016)
Para mais informaes/eventos: http://bit.ly/PAP_Eventos. Divulga os teus eventos para o email eventos@portugal-a-programar.pt
3
NOTICIAS
4
TEMA DE CAPA
Travessia de uma rvore de diretrios usando recursividade
TEMA DA CAPA
6
TEMA DA CAPA
TRAVESSIA DE UMA RVORE DE DIRETRIOS USANDO RECURSIVIDADE
Em termos de cdigo, para alm da chamada funo stat, ctime_r(&(buf_ptr->st_mtime),dia_hora_str));
a aplicao metadados_dir_corrente implementa a funo printf("st_ctime (ultima alter. estado)=%s",
tipo_file_str que recebendo o campo st_mode da struct stat ctime_r(&(buf_ptr->st_ctime),dia_hora_str));
}
devolve uma cadeia de caracteres indicando se a entrada
corresponde a um ficheiro regular, diretrio, atalho (symbolic int main(void){
char *nome = "."; /* diretrio corrente */
link) ou outro. Para determinar o tipo de entrada, a funo int ret_stat;
tipo_file_str() faz uso das macros do sistema S_IS_REG(), struct stat stat_buf;
S_IS_DIR() e S_IS_LNK() indicando como parmetro o cam- ret_stat = stat(nome, &stat_buf);
if( ret_stat == -1 ){
po st_mode da entrada em anlise. Importa notar que para fprintf(stderr,"Erro: chamada stat"
alm do tipo de entrada, o campo st_mode contm, a infor- " para recurso '%s' - %s\n",
mao referente s permisses de acesso do recurso leitu- nome, strerror(errno));
exit(1);
ra, escrita, execuo para o dono, o grupo e o outros. Fi- }
nalmente, os campos do tipo time_t, isto , st_atime, mostra_struct_stat(&stat_buf);
return 0;
st_ctime e st_mtime so convertidos para uma representa- }
o dia/hora atravs da funo ctime_r que corresponde
verso reentrante da funo ctime. Mais detalhes podem ser Listagem 3: aplicao mostra_metadados_dir_corrente
encontrados na respetiva pgina do manual (man ctime).
st_dev = 8.17
Conforme referido anteriormente, a famlia de funes st_ino = 3662149
st_mode = 41fd (Diretrio)
stat tem, para alm da funo stat propriamente dita, as fun- st_nlink = 2
es fstat e lstat. Na funo fstat, o ficheiro do qual se pre- st_uid = 1000
tende os respetivos metadados indicado por um descritor st_gid = 1000
st_rdev= 0
de ficheiro, descritor esse previamente obtido atravs da st_size= 4096
funo open. Por sua vez, a funo lstat comporta-se de st_blksize= 4096
st_blocks=8 (blocos de 512B)
forma similar funo stat, com uma exceo: quando st_atime (ultimo acesso)=Sat Oct 31 01:04:05 2015
indicada uma ligao simblica, o lstat devolve os metada- st_mtime (ultima modificao)=Sat Oct 31 01:10:16
dos da ligao simblica e no os metadados para a qual 2015
st_ctime (ultima alter. estado)=Sat Oct 31 01:10:16
aponta a ligao simblica. Mais adiante neste artigo, far-se- 2015
uso da funo lstat na implementao recursiva da traves-
sia de uma rvore de diretrios.
Listagem 4: sada produzida pela execuo de metada-
#include <>
char *tipo_file_str(mode_t st_mode){ dos_dir_corrente
if( S_ISREG(st_mode) ){
return "ficheiro normal"; Acesso ao contedo de um diretrio
}else if( S_ISDIR(st_mode) ){
return "Diretrio"; Em termos de programao, o acesso ao contedo de
}else if( S_ISLNK(st_mode) ){ um diretrio ficheiros, diretrios, atalhos, etc. apresenta
return "Atalho";
} algumas semelhanas com a leitura de um ficheiro, sendo
/* ainda aqui? */ necessrio efetuar a abertura do diretrio antes que se possa
return "outro"; aceder ao contedo e fechar o diretrio quando se terminou o
}
respetivo uso. Para o efeito existem as funes opendir
void mostra_struct_stat(const struct stat *buf_ptr) (abertura) e closedir (fecho). O acesso ao contedo feito
{ atravs de chamadas sucessivas funo readdir que devolve
char dia_hora_str[128];
printf("st_dev = %u.%u\n", uma entrada por chamada. Os prottipos das funes neces-
major(buf_ptr->st_dev), srias para iterar o contedo de um diretrio esto indicados
minor(buf_ptr->st_dev));
printf("st_ino = %ld\n", buf_ptr->st_ino); na Listagem 5.
printf("st_mode = %x (%s)\n", buf_ptr->st_mode,
tipo_file_str(buf_ptr->st_mode) ); No acesso ao contedo de um dado diretrio, a primei-
printf("st_nlink = %d\n", buf_ptr->st_nlink); ra operao consiste na abertura do diretrio atravs da fun-
printf("st_uid = %d\n", buf_ptr->st_uid); o opendir que, caso seja bem sucedida, devolve o endereo
printf("st_gid = %d\n", buf_ptr->st_gid);
printf("st_rdev= %d\n", (int)buf_ptr->st_rdev); de memria de um descritor de diretrio do tipo de dados DIR.
printf("st_size= %lu\n", buf_ptr->st_size);
printf("st_blksize= %ld\n", #include <sys/types.h>
buf_ptr->st_blksize); #include <dirent.h>
printf("st_blocks=%ld (blocos de 512B)\n",
buf_ptr->st_blocks); DIR *opendir(const char *name);
/* ctime devolve string com '\n' no final */
printf("st_atime (ultimo acesso)=%s", struct dirent *readdir(DIR *dirp);
ctime_r(&(buf_ptr->st_atime),dia_hora_str)); int readdir_r(DIR *dirp, struct dirent *entry,
printf("st_mtime (ultima modificao)=%s", struct dirent **result);
7
TEMA DA CAPA
TRAVESSIA DE UMA RVORE DE DIRETRIOS USANDO RECURSIVIDADE
int closedir(DIR *dirp); das todas as entradas do diretrio, a funo readdir devolve
NULL, devolvendo ainda NULL na ocorrncia de um erro, por
Listagem 5: prottipos das funes opendir, readdir e close- exemplo, caso o descritor de diretrio indicado seja invlido.
dir (fonte: man opendir e man readdir) Deste modo, torna-se necessrio distinguir entre o trmino
do diretrio (situao normal) e a ocorrncia de um erro
O descritor devolvido pela funo opendir empregue
(situao anormal). A distino feita atravs do valor da
para iterar o contedo do diretrio atravs da funo readdir.
varivel de erro errno que fica com um valor no nulo caso
Esta funo deve ser chamada em ciclo, devolvendo para
tenha ocorrido um erro na execuo da funo readdir. O
cada chamada uma entrada do diretrio. A funo readdir
cdigo da funo mostra_dir (Listagem 6) exemplifica o uso
assinala o trmino da iterao atravs da devoluo do valor
da varivel errno para distinguir entre a normalidade do tr-
NULL, indicando que j foram iteradas todas as entradas do
mino do diretrio e a anormalidade que a ocorrncia de
diretrio. O passo final corresponde ao encerrar do diretrio,
erro na execuo da funo readdir.
efetuando-se atravs da chamada funo closedir. De se-
guida, analisam-se separadamente cada uma das etapas De acordo com a norma POSIX sempre garantido
para acesso aos contedos de um diretrio: abertura, leitura que a struct dirent tenha o campo d_name, que como o no-
e encerramento do diretrio. me sugere, contm o nome da entrada. No Linux, a struct
dirent contm mais alguns campos, nomeadamente o campo
Obteno do descritor opendir
d_type que permite determinar o tipo da entrada (diretrio,
A obteno de um descritor do tipo DIR para um de- ficheiro regular, ligao simblica, etc.). Contudo, caso se
terminado diretrio efetua-se atravs da funo opendir. A pretenda manter a portabilidade do cdigo para ambientes
funo recebe como nico parmetro o caminho (absoluto ou POSIX, apenas deve ser empregue o campo d_name. Este
relativo) do diretrio para o qual se pretende receber um artigo segue esta abordagem, fazendo uso da funo stat
descritor. Caso a operao seja bem sucedida, a funo para aceder aos metadados de uma entrada devolvido via
devolve o endereo de uma estrutura do tipo DIR. Essa es- struct dirent pela funo readdir. A struct dirent disponibiliza-
trutura contm, entre outros elementos, um descritor para o da em sistemas Linux apresentada na Listagem 7.
diretrio. Por questes de simplicidade, este artigo emprega
a designao descritor de diretrio para designar a estrutura #include <stdio.h>
do tipo DIR. Caso ocorra um erro na tentativa de abertura do #include <sys/types.h>
#include <dirent.h>
diretrio (por exemplo, o diretrio especificado no existe), a #include <errno.h>
funo opendir devolve NULL, sendo atribudo varivel de #include <string.h>
#include <stdlib.h>
erro errno o respetivo cdigo numrico do erro. Dado que os
cdigos numricos so pouco descritivos para os operadores /*
humanos, possvel obter uma frase descritiva do cdigo de * Mostra as entradas do diretrio 'nome_dir'.
* Devolve 0 se tudo ok, -1 em caso de erro.
erro indicado pelo valor da varivel errno atravs da funo */
strerror. A Listagem 6 apresenta o cdigo do programa mos- int mostra_dir(const char *nome_dir){
tra_dir_corrente que faz uso da funo strerror para tornar as DIR *dir_d;
int finito, n_entradas;
mensagens de erro mais compreensveis. Mais informaes struct dirent *dir_entry;
sobre a varivel errno e a funo strerror esto disponveis dir_d = opendir(nome_dir);
nas respetivas pginas de manual eletrnico (man errno e if( dir_d == NULL ){
fprintf(stderr,"erro:"
man strerror). "impossvel abrir DIR '%s' - %s\n",
nome_dir, strerror(errno));
Iterao do diretrio readdir return -1;
}
Obtido um descritor para o diretrio, passa-se fase n_entradas = 0;
de leitura das entradas existentes no diretrio. Para o efeito finito = 0;
do{
faz-se uso da funo readdir que atua de forma similar a um dir_entry = readdir(dir_d);
operador de iterao: sempre que chamada, devolve uma if( dir_entry == NULL){
entrada diferente do diretrio at que estejam esgotadas if(errno){
fprintf(stderr,"erro:readdir"
todas as entradas. Deste modo, e caso se pretenda iterar (entrada %d)\n",n_entradas);
todo o contedo do diretrio, a funo readdir deve ser cha- closedir(dir_d);
return -1;
mada em ciclo at que seja alcanada a ltima entrada do }else{
diretrio. printf("Iterao de DIR '%s' "
"terminada (%d entradas)\n",
Como parmetro, a funo readdir recebe o descritor nome_dir, n_entradas);
de diretrio anteriormente obtido atravs da funo opendir. finito = 1;
}
Caso a chamada seja bem sucedida, a funo readdir devol- }else{
ve o endereo de uma estrutura do tipo struct dirent associa- printf("entrada: '%s'\n",
da entrada corrente. Ao invs, se j tiverem sido percorri- dir_entry->d_name);
8
TEMA DA CAPA
TRAVESSIA DE UMA RVORE DE DIRETRIOS USANDO RECURSIVIDADE
n_entradas++; vido pela funo readdir. Seguidamente, o campo st_mode
} da struct stat preenchido pela funo stat passado fun-
}while(finito == 0); o devolve_tipo_entrada que devolve uma cadeia de carac-
if( closedir(dir_d) == -1 ){
fprintf(stderr,"erro: impossvel fechar " teres descritiva do tipo de entrada, tais como DIR para dire-
"DIR '%s' - %s\n", nome_dir, strerror trio, ligao simblica para uma ligao simblica,
(errno));
return -1; ficheiro para um ficheiro regular, etc. Importa notar que a
} determinao do tipo de entrada feita aplicando-se uma
printf("DIR '%s': %d entradas\n", operao de AND binrio entre o valor st_mode e a mscara
nome_dir, n_entradas);
return 0; S_IFMT, comparando-se o resultado dessa operao com as
} constantes S_IFDIR (diretrio), S_IFIFO (pipe FIFO),
int main(void){ S_IFLNK (ligao simblica), S_IFREG (ficheiro regular) e
char *nome_diretorio = "."; /* dir. corrente */
int ret = mostra_dir(nome_diretorio); S_IFSOCK (socket). Tanto a mscara S_IFMT, bem como as
return ret; constantes S_IFIFO, S_IFLNK, S_IFREG e S_IFSOCK so
} disponibilizadas quando se faz uso dos ficheiros de cabea-
lho (.h) associados funo stat. Esta informao e mais
Listagem 6: programa mostra_dir_corrente alguns detalhes constam da pgina do manual eletrnico da
funo stat, acessvel atravs de man stat.
struct dirent {
ino_t d_ino; /* inode number */ #include <>
off_t d_off; /* not an offset */ /* Devolve string descritiva da entrada st_mode. */
unsigned short d_reclen /* length of record */ char *devolve_tipo_entrada(mode_t st_mode){
unsigned char d_type; /* type of file; switch( st_mode & S_IFMT ){
not supported by all filesystem types */ case S_IFDIR:
char d_name[256]; /* filename */ return "DIR";
}; case S_IFIFO:
return "FIFO/pipe";
Listagem 7: struct dirent em sistemas Linux (fonte: man read- case S_IFLNK:
dir) return "ligao simblica";
case S_IFREG:
return "ficheiro";
Encerramento case S_IFSOCK:
return "socket";
O encerramento de um descritor DIR realizado atra- default:
vs da chamada funo closedir. Essa operao neces- return "outro";
sria para garantir que os recursos associados ao descritor }
return NULL; /* Nunca alcanado */
so convenientemente libertados. A funo closedir recebe o }
descritor do tipo DIR que se pretende encerrar. Caso o en- /* Mostra as entradas do diretrio 'nome_dir'
cerramento seja bem sucedido, a funo devolve 0; caso * Devolve 0 se tudo ok, -1 em caso de erro */
int mostra_dir(const char *nome_dir){
contrrio, devolve -1, atribuindo varivel errno um cdigo DIR *dir_d;
numrico descritivo do erro. Na funo mostra_dir (Listagem int finito, n_entradas;
7) exemplifica-se a verificao da eventual ocorrncia de struct dirent *dir_entry;
char path[PATH_MAX];
erros na sequncia do fecho do diretrio. size_t path_len = sizeof(path);
dir_d = opendir(nome_dir);
Uso combinado das funes readdir e stat if( dir_d == NULL ){
fprintf(stderr,"erro: impossvel abrir"
A travessia de uma rvore de diretrios requer a ca- "DIR '%s' - %s\n",nome_dir, strerror(errno));
pacidade de identificar os tipos de cada entrada existente return -1;
}
num diretrio. De facto, torna-se necessrio identificar as n_entradas = 0; finito = 0;
entradas do tipo diretrio por forma a que esses subdiret- do{
rios possam eles tambm ser visitados. Para o efeito, torna- dir_entry = readdir(dir_d);
if( dir_entry == NULL){
se necessrio o uso combinado das funes readdir if(errno){
(convenientemente enquadrada com opendir e closedir) e fprintf(stderr,"erro: readdir"
stat. A Listagem 8 apresenta o cdigo da aplicao mos- "(entrada %d)\n", n_entradas);
closedir(dir_d);
tra_dir_stat que faz uso das funes readdir e stat para listar return -1;
o contedo do diretrio cujo nome (absoluto ou relativo) }
printf("Iterao de DIR '%s' terminada "
indicado aplicao atravs do nico argumento a linha de "(%d entradas)\n", nome_dir,
comando. A aplicao lista o contedo do diretrio indicado, n_entradas);
mostrando o tipo diretrio, ficheiro regular, ligao simbli- finito = 1;
}else{
ca de cada entrada. Assim, para cada entrada do diretrio struct stat stat_buf;
devolvida pela funo readdir chamada a funo stat usan- snprintf(path,path_len, "%s/%s",
do como parmetro o campo d_name da struct dirent devol- nome_dir,dir_entry->d_name);
if( stat(path,&stat_buf) == -1 ){
9
TEMA DA CAPA
TRAVESSIA DE UMA RVORE DE DIRETRIOS USANDO RECURSIVIDADE
fprintf(stderr,"impossvel stat"
pela nova instncia. Por exemplo, caso a funo se encontre
" '%s':%s\n", dir_entry->d_name, a processar o diretrio dir_A/dir_B/dir_C e se torne necess-
strerror(errno)); rio processar o subdiretrio dir_D, a funo chamada com
return -1;
} o caminho dir_A/dir_B/dir_C/dir_D. Quando termina a traves-
n_entradas++; sia desse subdiretrio (e dos eventuais subsubdiretrios,
printf("[%03d]'%s' (%s)\n", etc.), a nova instncia termina, regressando a execuo ao
n_entradas, dir_entry->d_name,
devolve_tipo_entrada diretrio corrente para processamento da entrada seguinte e
(stat_buf.st_mode)); assim sucessivamente.
}
}while(finito==0); A Listagem 9 apresenta o cdigo da funo
if( closedir(dir_d) == -1 ){ dir_recursivo que efetua a travessia uma rvore de diretrios
fprintf(stderr,"erro: impossvel fechar"
"DIR '%s' - %s\n", nome_dir, strerror e subdiretrios. O primeiro parmetro nome_dir corres-
(errno)); ponde ao caminho do diretrio a percorrer. Por sua vez, o
return -1;
} segundo parmetro profundidade indica a profundidade
printf("------------------------------------\n"); do diretrio em anlise. A profundidade mede o nmero de
printf("DIR '%s': %d entradas\n", subdiretrios a que se encontra o diretrio corrente em rela-
nome_dir, n_entradas);
return 0; o ao diretrio original. Por exemplo, se a funo for cha-
} mada com o diretrio original / (raiz) num sistema Linux, o
int main(int argc, char *argv[]){ subdiretrio /usr ter profundidade 1 e o subsubdiretrio /usr/
if( argc != 2) {
fprintf(stderr,"usage: %s <path_of_dir>\n", bin ter profundidade 2 e assim sucessivamente. Para o efei-
argv[0]); to, considera-se que o diretrio original tem profundidade 0
exit(EXIT_FAILURE);
} (zero), sendo esse o valor que deve ser passado na primeira
char *nome_dir_ptr = argv[1]; chamada funo dir_recursivo. Depois, para cada chama-
mostra_dir(nome_dir_ptr); da recursiva, passado o valor de profundidade + 1, refletin-
return 0;
} do o facto de que a nova instncia da funo processa um
novo nvel de subdiretrio.
Listagem 8: programa mostra_dir_stat
Na travessia recursiva de uma rvore de diretrios
Travessia de uma rvore de diretrios necessrio ainda ter em conta duas situaes particulares. A
Analisando-se uma rvore de diretrio, facilmente se primeira est relacionada com os diretrios . (ponto) e
identifica um padro repetitivo: uma rvore composta por .. (ponto ponto), que conforme anteriormente foi visto, cor-
subrvores. De facto, um subdiretrio pode ser considerado respondem respetivamente ao diretrio corrente e ao diret-
a raiz de uma subrvore do diretrio que contm o subdiret- rio pai. Dadas as especificidades desses diretrios, torna-se
rio e assim sucessivamente. Deste modo, a travessia de um necessrio ignor-los em termos de travessia recursiva. De
diretrio e de todos os seus subdiretrios pode ser decom- facto, caso se considerasse o diretrio . para efeitos de
posta noutras operaes de travessia, uma travessia por travessia, chamando recursivamente a funo dir_recursivo
cada subdiretrio. Na informtica, este tipo de operao que com ., cair-se-ia num ciclo sem fim, preso no diretrio cor-
se subdivide em operaes do mesmo tipo em sub-conjuntos rente. Na prtica, a aplicao terminaria devido a um exces-
do conjunto original de dados presta-se ao uso de recursivi- sivo nvel de recursividade materializado com um transbordo
dade. De uma forma aproximada, pode dizer-se que em ter- de pilha ou stack overflow na designao anglo-saxnica
mos de programao programticos, a recursividade consis- (Chris Anley, 2007). Similarmente, o diretrio .. deve ser
te no chamar de uma funo por ela prpria por forma a tra- ignorado, pois levaria o controlo de execuo para o diretrio
tar um subconjunto dos dados originais. O chamar da funo ascendente, impedindo o normal processamento do diretrio
por ela prpria origina uma nova instncia da funo. No corrente e respetivos subdiretrios. O ignorar dos diretrios
caso da travessia de uma rvore de diretrios, cada nova . e .. para efeitos de travessia consegue-se comparando o
instncia da funo de travessia recebe um subdiretrio do nome do novo diretrio a visitar com . e .., comparao
diretrio que est a ser processado pela funo chamante, efetuada atravs da funo strcmp.
invocando ela prpria uma nova instncia para cada subdire- A segunda situao a acautelar est relacionada com
trio que tenha e assim sucessivamente. ligaes simblicas. Assim, caso seja detetada uma ligao
Embora a descrio seja relativamente complexa, em simblica para um diretrio, essa mesma deve ser ignorada,
termos de cdigo, a operacionalizao simples: sempre caso contrrio corre-se o risco de se saltar para outra rvore
que se deteta uma entrada do tipo diretrio no diretrio cor- de diretrio, interrompendo a travessia pretendida. A neces-
rente, cria-se uma nova instncia da funo. Essa nova ins- sidade de deteo de uma ligao simblica requer o uso da
tncia (i.e., chamada recursiva) recebe como parmetro na funo lstat que, conforme anteriormente referido, no caso
chamada funo o caminho correspondente ao diretrio de uma ligao simblica devolve os metadados referentes
corrente acrescido do nome do diretrio a ser processado ligao simblica e no ao recurso (diretrio/ficheiro) aponta-
10
TEMA DA CAPA
TRAVESSIA DE UMA RVORE DE DIRETRIOS USANDO RECURSIVIDADE
do pela ligao simblica. Desta forma, torna-se possvel
d_name*/
detetar uma ligao simblica. snprintf(entrada,sizeof(entrada),"%s/%s",
nome_dir, dir_entry->d_name);
O programa dir_recursivo mostrado na Listagem 9 struct stat stat_buf;
efetua a travessia de todos os diretrios, ficheiros e subdire- if( lstat(entrada,&stat_buf) == -1 ){
fprintf(stderr,"erro stat '%s':%s\n",
trios de uma rvore de diretrio. A raiz da rvore de diret- entrada, strerror(errno));
rios deve ser indicada como o nico parmetro da linha de continue;
comandos do programa. Como bvio, apenas so mostra- }
n_entradas++;
dos os contedos para os quais o utilizador que executa a if( S_ISLNK(stat_buf.st_mode) == 1 ){
aplicao tem permisses de acesso. fprintf(stderr,"Ignorado link %s\n",
entrada);
continue;
#include <...> }
/* Devolve string descritiva da entrada if( S_ISDIR(stat_buf.st_mode) ){
* indicada por st_mode. Caso o tipo de entrada no if( strcmp(".",dir_entry->d_name) &&
* seja reconhecido, a funo devolve "outro". */ strcmp("..",dir_entry->d_name)){
char *devolve_tipo_entrada(mode_t st_mode){ dir_recursivo(entrada,
switch( st_mode & S_IFMT ){ profundidade + 1);
case S_IFDIR: }
return ("DIR"); }else{
case S_IFIFO: printf("(DIR='%s',P=%d) '%s' (%s)\n",
return ("FIFO/pipe"); nome_dir, profundidade,
case S_IFLNK: dir_entry->d_name,
return ("ligao simblica"); devolve_tipo_entrada(stat_buf.st_mode));
case S_IFREG: }
return ("ficheiro"); }
case S_IFSOCK: }while(finito==0);
return ("socket");
default: if( closedir(dir_d) == -1 ){
return ("outro"); fprintf(stderr,"erro: impossvel fechar DIR"
} "'%s' - %s\n",nome_dir, strerror(errno));
/* Nunca alcanado */ return -1;
return NULL; }
} return 0;
/* Funo recursiva que percorre a rvore de }
* diretrios definida por 'nome_dir'.
'profundidade' int main(int argc, char *argv[]){
* indica o nvel de profundidade de nome_dir if( argc != 2 ){
* relativamente raiz da rvore de diretrios fprintf(stderr,"ERRO\n");
* em anlise. fprintf(stderr,"%s <diretrio raiz>\n",
* Devolve -1 em caso de erro, 0 se tudo OK. argv[0]);
*/ exit(EXIT_FAILURE);
int dir_recursivo(char *nome_dir, int profundidade) }
{ int profundidade = 0;
DIR *dir_d; char *nome_diretorio = argv[1];
int finito, n_entradas; dir_recursivo(nome_diretorio, profundidade);
struct dirent *dir_entry; return 0;
dir_d = opendir(nome_dir); }
if( dir_d == NULL ){
fprintf(stderr,"erro: impossvel abrir DIR "
"'%s' - %s\n",nome_dir, strerror
(errno)); Listagem 9: programa dir_recursivo
return -1;
} Reentrncia
n_entradas = 0;
finito = 0; O facto do cdigo apresentado neste artigo usar a
do{ funo no reentrante readdir, leva a que no seja seguro
errno = 0; usar o cdigo em ambiente multithreaded. Contudo, no caso
dir_entry = readdir(dir_d);
if( dir_entry == NULL ){ da funo readdir relativamente fcil substituir o seu uso
if(errno){ pela verso reentrante readdir_r. Esta abordagem deixada
fprintf(stderr,"erro: readdir " como exerccio para os leitores, sugerindo-se a consulta do
"(entrada %d)\n",n_entradas);
closedir(dir_d); manual eletrnico (man readdir_r).
return -1;
}else{ Nota final
printf("(DIR='%s',P=%d) "
"DIR terminada (%d entradas)\n", Este artigo abordou a travessia com busca em profun-
nome_dir,profundidade,n_entradas); didade de uma rvore de diretrios, com o intuito de visitar
printf("------------------------\n");
finito = 1; todos os recursos (ficheiros, subdiretrios) dessa mesma
} rvore. Embora o enfoque tenha sido em diretrios, uma
}else{ metodologia similar pode ser empregue, com as devidas
char entrada[PATH_MAX]; /* path p/
11
TEMA DA CAPA
TRAVESSIA DE UMA RVORE DE DIRETRIOS USANDO RECURSIVIDADE
adaptaes, com outros tipos de rvores, por exemplo, rvo-
res binrias.
O acesso ao conte-
do feito atravs de
chamadas sucessivas
funo readdir que de-
volve uma entrada por
chamada ()
Bibliografia
AUTOR
Escrito Por 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 Licencia-
tura em Engenharia Informtica.
AUTOR
Escrito Por Vtor Carreira
AUTOR
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 e Desenvolvimento de Aplicaes Empresariais ao
Curso de Licenciatura em Engenharia Informtica.
12
A PROGRAMAR
Validao de formulrios em JavaScript
Aplicaes Mobile com o Xamarin Studio
Plotagem de dados em tempo real com Python usando matPlotLib
Xamarin 4 tem tudo que precisa para criar ptimas aplicaes mveis!
A PROGRAMAR
<script type="text/javascript">
Cdigo HTML: <!--
function validaform(frm) {
Segue abaixo o cdigo HTML para criar o formulrio. /*
o parametro frm desta funo significa: this.form,
<form name="frmTeste" method="post" action="#" pois a chamada da funo - validaForm(this) foi
onsubmit="return validaForm(this);"> definida na tag form.
<p>Validao de formulrio</p> */
<p>
Nome:<input type="text" name="nome" //Verifica se o campo nome foi preenchido e
id="nome" /> //contm no mnimo
</p> //trs caracteres.
<p>Email: if(frm.nome.value == """ || frm.nome.value ==
<label><input type="text" name="email" null || frm.nome.value.lenght < 3) {
id="email" /></label>
// mostrado um alerta, caso o campo esteja
</p> //vazio.
<p>Sexo: alert("Por favor, indique o seu nome.");
<label>
<input type="radio" name="sexo" value="M" //Foi definido um focus no campo.
id="masc" /> Masculino frm.nome.focus();
</label>
<label> //o form no enviado.
<input type="radio" name="sexo" value="M" return false;
id="fem" /> Feminino }
</label>
</p> //o campo e-mail precisa de conter: "@", "." e
<p>Profisso //no pode estar vazio
<label>
<select name="cargo"> if(frm.email.value.indexOf("@") == -1 ||
<option value = "">Selecione o cargo frm.email.valueOf.indexOf(".") == -1 ||
</option> frm.email.value == "" ||
14
A PROGRAMAR
VALIDAO DE FORMULRIOS EM JAVASCRIPT
AUTOR
Escrito por Tnia Valente
Natural de Coimbra, licenciou-se em Engenharia Informtica pelo Instituto Superior de Engenharia de Coimbra e, actualmente,
frequenta o mestrado em Human Computer Interaction. entusiasta na rea de Desenvolvimento Web, no que concerne s
Tecnologias Web, Design de Interface (UI) e User Experience (UX). Curiosa e motivada por novos desafios, acredita que a
criatividade pode transformar a maneira como as pessoas pensam, sentem e agem.
15
A PROGRAMAR
Descrio
16
A PROGRAMAR
APLICAES MOBILE COM O XAMARIN STUDIO
opo para editar o layout por drag and drop, Content (ver figu- Neste artigo, no vou aprofundar nenhum cdigo es-
ra 5), ou ento por cdigo puro, Source (ver figura 4). pecfico, ou desenvolver algo, sendo que, o que falta aqui
ver a aplicao a funcionar. Para tal, vamos ter de ir barra
de menu do Xamarin, clicar em Ferramentas e no sub-menu
escolher a opo Android Devices.... Abrir uma pequena
janela com uma lista dos emuladores que j esto predefini-
dos no IDE, mas vamos criar o nosso prprio. O processo
exactamente o mesmo que no Android Studio, ou no SDK.
Depois de o emulador estar criado, vamos executar a nossa
aplicao, simplesmente carregando no boto Start, no can-
to superior esquerdo do nosso IDE. Assim, desta maneira
vamos ver a app em aco (ver figuras 7 e 8).
Figura 4: Source
Figura 5: Content
Concluso
AUTOR
Andr Silva
Entusiasta das tecnologias desde pequeno, decidiu seguir a vida de programador. Formado em Gesto e Programao de Sis-
temas Informticos e Programao Android. Neste momento Co-Fundador da Digital Soul Games. digitalsoulgames.org
17
A PROGRAMAR
18
A PROGRAMAR
PLOTAGEM DE DADOS EM TEMPO REAL COM PYTHON USANDO MATPLOTLIB
dos, deixando espao entre eles. A grelha ser algo semelhan- plt2.set_ylabel('Humidade-2 %')
te figura abaixo: plt2.ticklabel_format(useOffset=False)
plt2.legend(loc='upper right')
#Plot 3
plt.subplot(gs[-1,0])
plt.ylim([0,100])
plt.title('Humidade do solo')
plt.grid(True)
plt.ylabel('Humidade %')
plt.plot(moist, 'ro-', label='Humidade')
plt.legend(loc='upper left')
#Plot 4
plt.subplot(gs[-1,-1])
plt.ylim([0,2000])
plt.title('Luminosidade')
plt.grid(True)
plt.ylabel('Luminosidade (lux)')
plt.plot(lum, 'ro-', label='Luminosidade')
plt.legend(loc='upper left')
19
A PROGRAMAR
PLOTAGEM DE DADOS EM TEMPO REAL COM PYTHON USANDO MATPLOTLIB
ciclo, mas por uma questo de comodidade, usou-se um while, plt.ylabel('Luminosidade (lux)')
deixando-se ao critrio do leitor, usar qualquer outro ciclo da plt.plot(lum, 'ro-', label='Luminosidade')
sua preferncia. plt.legend(loc='upper left')
20
A PROGRAMAR
PLOTAGEM DE DADOS EM TEMPO REAL COM PYTHON USANDO MATPLOTLIB
dos layouts para a apresentao de grficos usando a lingua- matplotlib.org/
gem de programao python e a biblioteca matplotlib. de
facto simples comunicar via porta srie usando a biblioteca
Documentao oficial da biblioteca numpy: http://
serial e desenhar objectos grficos no ecr recorrendo ao con- www.numpy.org/
junto de bibliotecas drawnow. Documentao oficial da biblioteca pySerial: https://
pythonhosted.org/pyserial/
Referncias
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.
AUTOR
Escrito por Antnio C. Santos
Com uma enorme paixo por tecnologia, autodidacta desde tenra idade, cresceu com o ZX Spectrum.
Tem vasta experincia em implementao e integrao de sistemas ERP, CRM, ERM, BI e desenvolvi-
mento de software por medida nas mais diversas linguagens. Diplomado do Curso de Especializao
Tecnolgica em Tecnologias e Programao de Sistemas de Informao pela ESTG-IPVC. Membro da
Comunidade Portugal-a-Programar desde Agosto de 2007, tambm membro da Sahana Software
Foundation, onde Programador Voluntrio. Neste momento aluno no Instituto Politcnico de Viana do
Castelo, na Escola Superior de Tecnologia e Gesto no curso de Licenciatura em Engenharia Informtica
e Xamarin Student Partner nesta mesma escola Twitter:@apocsantos
21
A PROGRAMAR
Xamarin 4 tem tudo que precisa para criar ptimas aplicaes mveis!
Vamos dar uma olhada nalgumas das funcionalidades e Ento, vamos escolher o modelo Xamarin.Forms da
melhorias includas no Xamarin 4.0 para o desenvolvimento de lista disponvel dentro do Visual Studio:
aplicaes multi-plataformas, incluindo Android, iOS e UWP
(Universal Windows Apps).
projeto iOS
projeto UWP
22
A PROGRAMAR
XAMARIN 4 TEM TUDO QUE PRECISA PARA CRIAR PTIMAS APLICAES MVEIS!
Construo de interfaces com MVVM, de uma forma multi- Lembra-se como se faz para gerar um nmero aleat-
plataforma: rio em C # ? Mas no temos a certeza se sabemos faz-lo
para uma aplicao mobile? No existe preocupao! Pode-
Vamos dar vista de olhos no cdigo XAML usado para
mos usar os recursos principais do sistema padro em C #
definir a lista de participantes:
(at verso 6.0) alm de outros recursos interessantes,
<ListView x:Name="PlayersSelector" incluindo expresses lambda, delegates, actions, Linq e ope-
ItemsSource="{Binding Path=Players}" raes assncronas.
SeparatorColor="Gray"
SelectedItem="{Binding Path=Winner,
Mode=TwoWay}"> private void Play()
<ListView.ItemTemplate> {
<DataTemplate> ...
<ViewCell> var random = new Random
<ViewCell.ContextActions> (DateTime.Now.Millisecond);
<ToolbarItem Command="{Binding
DeleteCommand}" Text="Borrar" /> var lucky = random.Next(0,
</ViewCell.ContextActions> ViewModel.Players.Count);
<Grid> var selectedPlayer =
<StackLayout ViewModel.Players.ElementAtOrDefault(lucky);
Orientation="Horizontal"
HorizontalOptions="Start"> if (selectedPlayer != null)
<Image IsVisible=" {
{Binding Path=IsWinner}" selectedPlayer.IsWinner = true;
Source="Prize.png" ViewModel.Winner = selectedPlayer;
HeightRequest="25"
WidthRequest="25" /> PlayersSelector.ScrollTo(selectedPlayer,
ScrollToPosition.MakeVisible, true);
<Label Text="GANADOR!" }
IsVisible="{Binding }
Path=IsWinner}"
TextColor="Red" Trazer funcionalidades de desenho para as aplicaes
FontAttributes="Bold" Android
VerticalTextAlignment="Center"/>
Outra grande caracterstica de Xamarin para Android
<Label Text="{Binding
Path=PlayerName}" a capacidade de incorporar facilmente capacidades de
erticalTextAlignment="Center"/> desenho nos aplicativos do Android. Isto pode ser feito atra-
</StackLayout>
<Button HorizontalOptions="End" vs da adio da biblioteca Support Design Library dispon-
Command="{Binding vel em pacote de NuGet.
Path=DeleteCommand}"
Text="x" /> Recursos adicionais e links
</Grid>
</ViewCell> Introducing Xamarin 4
</DataTemplate>
</ListView.ItemTemplate> Adding Material Design to Xamarin Apps
</ListView>
Lucky Winner source code
O Binding atua como cola entre a View e os ViewMo-
dels para que permitir ter uma clara separao de tarefas entre
eles. Outras caractersticas comuns suportados pelo Xama-
Traduzido para a Revista PROGRAMAR por Antnio San-
rin.Forms com MVVM incluem Two-way binding, Command
tos, com permisso e acompanhamento do autor do artigo
Pattern and Value Converters.
AUTOR
Escrito por Esteban Solano
Xamarin, Web & Full Stack Software Engineer, Founder of the Costa Rica Mobile .Net Developer Group www.meetup.com/es/
Xamarin-Costa-Rica-Mobile-NET-Developer-Group/
23
A PROGRAMAR
O crescimento da Internet
No incio dos anos 1990s, e at hoje, d-se um cresci- IPv6, o sucessor do IPv4
mento continuado do nmero de pessoas ligadas Internet, Desde o final dos anos 1980s que este problema tem
que actualmente se situa perto de 50% da populao mundial. sido analisado. Vrias alternativas para substituio do IPv4
Adicionalmente, cada utilizador tem mais que um aparelho foram propostas:
(computador, telemvel, etc.). Mais recentemente (e apesar de Verso Nome Estado
o conceito no ser novo), surge a Internet of Things, cuja ideia IP (*)
0a3 Internet Protocol tests Experimental / Obso-
ligar todos os aparelhos do dia-a-dia Internet (televiso, leta
frigorfico, carro, elevador, relgio, roupa, animal de estimao, 4 Internet Protocol Version 4 (IPv4) Ainda em funciona-
mento
etc.).
5 Internet Stream Protocol Experimental
O protocolo IPv4 tem uma grave limitao de enderea- 6 Internet Protocol Version 6 (IPv6) Em funcionamento /
mento: s suporta 232 ou 4294967296 endereos (tericos) Actual
7 TP/IX Experimental / Obso-
mas devido a limitaes tcnicas, apenas se podem atribuir leta
pouco mais de 3000 milhes, ou seja, h actualmente menos 8 PIP Experimental / Obso-
leta
endereos pblicos disponveis que o nmero de utilizado- 9 TCP and UDP with Bigger Addresses Experimental / Obso-
res e mquinas/dispositivos. (TUBA) leta
10 a 15 Reservada Reservada
A IANA (Internet Assigned Numbers Authority) a enti-
dade responsvel pela atribuio de endereos IPv4 e IPv6, (*) Corresponde ao campo de Verso do cabealho dum
assim como outras numeraes (e.g. portas dos protocolos pacote IP, cuja dimenso 4 bits.
24
A PROGRAMAR
IPV6 PARA PROGRAMADORES
Aps vrios anos de debate e anlise, as instituies tante grandes, cada operador tem tipicamente
que geriam a Internet optaram pelo IPv6 como melhor alternati- um nico bloco;
va ao IPv4. Devido lenta adopo do IPv6, foi tambm criado
o protocolo NAT (Network Address Translation) [4] que permite
Sem NAT no existe necessidade de traduo
partilhar um nico endereo IPv4 pblico com vrios dispositi- de endereos pblicos/privados.
vos que usam endereamento privado (e.g. 10.0.0.0/8, O IPv4 ser descontinuado num futuro prximo, fican-
172.16.0.0/12, 192.168.0.0/16, entre outros). do apenas a funcionar o IPv6.
O IPv6 trouxe algumas melhorias. Estas so apenas algumas:
25
A PROGRAMAR
IPV6 PARA PROGRAMADORES
32 dgitos hexadecimais (0-9, A-F), case insensitive; semelhana de IPv4, existem alguns endereos
especiais em IPv6. Por exemplo, o "::1" equivalente ao
8 grupos de 4 dgitos hexadecimais usando ":" como "127.0.0.1" ou "LOCALHOST":
separador;
Endereo:
2001:0690:0A00:1036:1113:0000:0000:0247/12
8
26
A PROGRAMAR
IPV6 PARA PROGRAMADORES
Alm dos endereos IPv6, toda a infraestrutura de no- Afinal o que necessrio para armazenar endereos numa
mes DNS funciona com IPv6 com pequenas alteraes: base de dados (relacional ou outra) ?
27
A PROGRAMAR
IPV6 PARA PROGRAMADORES
$Andy_IPVersion = "IPv4";
} $Andy_Exists_A = DNS_Get_Record,( $Andy_DNS_NAME
Else If (PReg_Match("/[0-9A-F]+\:[0-9A-f\:\.]+/ DNS_A);
i", $Andy_IPAddress) ) $Andy_Exists_AAAA = DNS_Get_Record
{ ( $Andy_DNS_NAME DNS_AAAA);
$Andy_IPVersion = "IPv6";
} Print_R ($Andy_DNS_Get_A);
Else Print_R ($Andy_DNS_Get_AAAA);
{ ?>
$Andy_IPVersion = "?";
} O resultado neste caso :
Print ("\tYour IP Address is: <STRONG>" .
$Andy_IPAddress . "</STRONG><BR>\n"); Array
Print ("\tYour IP Version is: <STRONG>" . {
$Andy_IPVersion . "</STRONG><BR>\n"); [0] => Array
?> {
[host] => FCCN.PT
E se tentarmos programar uma ligao a uma mquina [class] => IN
[ttl] => 3600
remota, quais as recomendaes? [type] => A
[ip] => 193.137.196.247
Sempre que possvel usar endereos DNS e nunca en- }
dereos IPv4 ou IPv6. Isto garante que o sistema opera- }
tivo decidir qual a melhor forma de efectuar a ligao;
Array
Nos casos em que queremos reduzir o tempo despendi- {
do com a consulta DNS (e.g. ligao dum servidor web [0] => Array
{
a uma base de dados), pode ser realmente ser neces- [host] => FCCN.PT
srio colocar o endereo. O recomendado colocar o [class] => IN
endereo IPv6, j que a latncia normalmente menor; [ttl] => 3600
[type] => AAAA
[ipv6] => 2001:690:a00:1036:1113::247
Em algumas situaes raras, pode ser til incluir a inter- }
face no endereo, para evitar que o sistema operativo }
demore a escolher por qual deve fazer a ligao. No
entanto, uma mudana de hardware poder implicar Anexos
alteraes s configuraes, pelo que no recomen-
dado.
Diagrama do routing mundial entre os principais AS
Se uma aplicao ou pgina web necessitar realmente (Autonomous Systems) da Internet (em IPv4 e IPv6):
de obter um endereo IPv4 ou IPv6 (registos "A" ou "AAAA") a
partir dum endereo DNS, pode usar funes de consulta DNS.
Todas as linguagens mais utilizadas j suportam IPv6 (nota:
estas funes variam muito de linguagem para linguagem).
Para detectar se existe um determinado registo DNS:
<?php
$Andy_DNS_NAME = "ANDY.PT"; //Don't forget the
"." in the end!
$Andy_Exists_A = (CheckDNSrr($Andy_DNS_NAME,
"A" ) ? "Yes" : "No");
$Andy_Exists_AAAA = (CheckDNSrr($Andy_DNS_NAME,
"AAA") ? "Yes" : "No");
28
A PROGRAMAR
IPV6 PARA PROGRAMADORES
Referncias e links FCCN/FCT: http://FCCN.PT/en/academic-network/
Referncias presentes no texto: ipv6
Dinamizadores em Portugal:
AUTOR
Escrito por Andr Melancia
Programador/DBA/Formador independente, Voluntrio, orador e/ou participante regular nas comunidades IoT Portugal, IPv6
Portugal, DNSSec Portugal, ISOC.PT, SQLPort, NetPonto, Office365PT, SharePointPT, PTXug, PHPLx, etc.
29
ELECTRNICA
Aquisio de dados via TCP/IP com Genuino (Arduino)
Electrnica
O problema
claramente apresenta-
do, est meio resolvi-
do. (Charles F. Kette-
ring)
32
Electrnica
AQUISIO DE DADOS VIA TCP/IP COM GENUINO (ARDUINO)
Ligaes Programao do Genuino
Escolhido o hardware, necessrio proceder s liga- Chegados a esta parte, est na hora de programar o
es antes de passarmos escrita do cdigo destinado a ser Genuino de forma a comunicar por rede ethernet, usando o
executado pelo microcontrolador ATMega328. Para este efeito conjunto de protocolos TCP/IP. Felizmente uma parte subs-
e uma vez que no se trata de um circuito definitivo, mas ape- tancial do trabalho, j vem pr feito pela biblioteca ether-
nas um circuito de teste, as protoboards, como se pode ver na net.h, que nos disponibiliza uma maior abstraco do hard-
imagem abaixo, so bastante uteis e facilitam as ligaes. ware propriamente dito, deixando-nos livres para a progra-
mao da aplicao que ser executada. No entanto conti-
nua a ser necessrio executar algumas tarefas como a defi-
nio de um mac address, a colocao em modo cliente
DHCP, caso tenhamos um servidor DHCP na rede, ou a
definio de um endereo ip v4, bem como a respectiva
mscara de sub-rede e gateway. Desta biblioteca iremos
usar maioritariamente o mtodo write, da classe server, para
enviarmos dados para o nosso cliente TCP, bem como o
mtodo read, para lermos instrues transmitidas pelo servi-
dor.
33
Electrnica
AQUISIO DE DADOS VIA TCP/IP COM GENUINO (ARDUINO)
light.setTiming(gain,time,ms); }
light.setPowerUp(); commandString = "";
pinMode(ledPin, OUTPUT); return;
Ethernet.begin(mac, ip, gateway, subnet); }
server.begin(); commandString = "";
Serial.begin(9600); instructions();
while (!Serial) {;} }
Serial.print("Socket Server:"); void instructions()
Serial.println(Ethernet.localIP()); server.println("Comando no reconhecido");
} server.println("Use um dos seguintes
comantos:");
void loop() { server.println("* dht1, para obter a humidade e
EthernetClient client = server.available(); temperatura do ar");
if (client) { server.println("* light, para obter a informao
if (!alreadyConnected) { da luminosidade");
client.flush(); }
commandString = ""; //to my late night owl angel, thanks for the wisdom
server.println("--> insira um dos comandos //inspiration and company,
disponiveis!"); //Stephan|B|
alreadyConnected = true;
} Concluso
while (client.available()) {
char newChar = client.read(); Uma vez feito o upload do cdigo, para o Genuino,
if (newChar == 0x0D)
{ processCommand(commandString);} basta ligar um cabo de rede e um cliente simples ou usar a
else { commandString += newChar; } nossa prpria aplicao para comunicar por sockets com o
} Genuino, enviando a instruo que pretendemos e receben-
}
} do o resultado da mesma. Neste exemplo usei o putty, para
simplificar, apenas defini a porta como 77, pois era uma das
void processCommand(String command) portas disponveis. O objectivo ao usar sockets neste exem-
{
//dht11-1 plo, prendeu-se com a simplicidade com que se comunica
if (command.indexOf("dht1") > -1) com o dispositivo, bem como com o leque de possibilidades
{ que deixa em aberto para o desenvolvimento de aplicaes
delay(1000);
float h1 = dht1.readHumidity(); que interajam com o circuito, como o caso de aplicaes
float t1 = dht1.readTemperature(); mobile, feitas por exemplo com C# e Xamarin, usando o
if (isnan(h1) || isnan(t1))
{ return; } componente sockets-for-pcl, que bastante simples de
server.print("Humidade "); usar e bastante intuitivo.
server.print(String (h1));
server.print("; Temperatura ");
server.println(String (t1));
commandString = "";
return;
}
//light
Se procuras re-
if (command.indexOf("light") > -1)
{
delay(200);
sultados distintos, no
unsigned int data0, data1;
if (light.getData(data0,data1))
{
faas sempre o mes-
double lux;
boolean good;
//calculo de Lux
mo! (Albert Einstein)
good = light.getLux
(gain,ms,data0,data1,lux);
server.print("luminosidade em lux ");
server.println(lux);
AUTOR
Escrito por Antnio C. Santos
Com uma enorme paixo por tecnologia, autodidacta desde tenra idade, cresceu com o ZX Spectrum.
Tem vasta experincia em implementao e integrao de sistemas ERP, CRM, ERM, BI e desenvolvi-
mento de software por medida nas mais diversas linguagens. Diplomado do Curso de Especializao
Tecnolgica em Tecnologias e Programao de Sistemas de Informao pela ESTG-IPVC. Membro da
Comunidade Portugal-a-Programar desde Agosto de 2007, tambm membro da Sahana Software
Foundation, onde Programador Voluntrio. Neste momento aluno no Instituto Politcnico de Viana do
Castelo, na Escola Superior de Tecnologia e Gesto no curso de Licenciatura em Engenharia Informtica
e Xamarin Student Partner nesta mesma escola Twitter:@apocsantos
34
COLUNAS
Kernel Panic - Cross-Platform - A soma de todas as mudanas
Kernel Panic
36
Kernel Panic
CROSS-PLATFORM - A SOMA DE TODAS AS MUDANAS
mework .NET da Microsoft, para que corresse em todas as j permitem execuo de aplicaes cross-platfrom, sendo
plataformas de hardware e software, desde computadores que todos os sistemas operativos acima referidos, promovem
x86 / IA64 com sistema operativo Windows, at outros disposi- uma cada vez maior abstraco entre o programador de
tivos e sistemas operativos como GNU/Linux, BSD Mac OS X aplicaes e o hardware em que estas aplicaes so exe-
da Apple, Solaris e at nas consolas de jogos como o caso da cutadas a um nvel substancialmente mais baixo.
PlayStation 3, Nintendo Wii e Xbox 360. Apesar de controverso
As mudanas, decorridas ao longo de dcadas de
dentro da prpria comunidade open-source, conseguiu avan-
avanos e recuos, de pontos altos e pontos baixos, de ideias
ar, manter-se, existir e dar origem ao que agora muitos pode-
contraditrias e personalidades divergentes, foram todas
ro conhecer como Xamarin, fornecendo ferramentas de de-
elas contribuindo e somando para que o desenvolvimento
senvolvimento cross-platform para dispositivos mveis, que
cross-platform fosse uma realidade! O desenvolvimento em
executem os sistemas operativos Windows Phone, Android e
que o programador, o criador de software, no tem de se
iOS.
preocupar com o hardware onde o seu programa vai ser
Este foi um projecto que cativou a minha ateno desde o seu executado, to pouco com o sistema operativo onde este
incio, por permitir desenvolver para diversas plataformas e ser ser executado, de longe a maior vantagem desta nova
um projecto de cdigo aberto, livre, deixando a liberdade criati- realidade. Basta escolher uma boa ferramenta de desenvol-
va para os programadores fazerem o que fazem bem: Criar vimento cross-platform, e tudo ser resolvido! No haver
novos mundos, melhores mundos, no cdigo que escrevem! necessidade de recompilar e reescrever cdigo, para correr
Esta ideia, esta filosofia, cativou-me pelo que recomendo o na plataforma A ou B, ou ter de fazer opes entre que plata-
leitor a explorar o projecto Mono e a filosofia do desenvolvi- formas suportar e no suportar, limitando tanto o programa-
mento cross-platform, como ela se encontra descrita em diver- dor, como o utilizador que por querer usar uma determinada
sos artigos, sendo a parte mobile bem focada no artigo de aplicao teria de adquirir hardware e sistema operativo que
Stephen Fluin, no artigo de Henning Heitktte, entre outros. a executasse em concreto.
AUTOR
Escrito por Antnio C. Santos
Com uma enorme paixo por tecnologia, autodidacta desde tenra idade, cresceu com o ZX Spectrum.
Tem vasta experincia em implementao e integrao de sistemas ERP, CRM, ERM, BI e desenvolvi-
mento de software por medida nas mais diversas linguagens. Diplomado do Curso de Especializao
Tecnolgica em Tecnologias e Programao de Sistemas de Informao pela ESTG-IPVC. Membro da
Comunidade Portugal-a-Programar desde Agosto de 2007, tambm membro da Sahana Software
Foundation, onde Programador Voluntrio. Neste momento aluno no Instituto Politcnico de Viana do
Castelo, na Escola Superior de Tecnologia e Gesto no curso de Licenciatura em Engenharia Informtica
e Xamarin Student Partner nesta mesma escola Twitter:@apocsantos
37
Media Partners da Revista PROGRAMAR
Anlises
MySQL
Programao em Python: Fundamentos e Resoluo de Problemas
Review
MySQL
Ttulo: MySQL Operaes com tabelas
Autores: Frederico Tavares Stored procedures e funes
Editora: FCA - Editora de Informtica
Cursors, triggers e erros
Pginas: 248
Utilizadores e acessos
ISBN: 978-972-722-803-4
Gesto do servidor
Cpias de segurana
Sublinho a estrutura e organizao do livro. Captulos No ltimo captulo o autor escreve sobre as normas
progressivos de aprendizagem que assentam em nveis bsi- de segurana nomeadamente de backup. ento aborda-
co, intermdio e difcil, diversos exemplos ilustrativos, que do sobre 8 pginas a funcionalidade Slave e Master que
usam como ferramenta de auxlio o MySQL Workbench. Per- muitos tendem a no conhecer e que assenta num paradi-
feito para quem se est a iniciar, perfeito para quem deseja gma de segurana e estabilidade de dados. Esta funcionali-
adquirir mais conhecimentos. dade permite em tempo real manter um ou mais backups da
base de dados principal (Master) em base de dados secun-
A obra est dividida em 9 captulos que consolidam a
drias (denominadas slaves) sem qualquer interveno do
linha de ascendncia em termos de complexidade:
utilizador.
Instalao do MySQL Por fim, aconselho a aquisio do livro pois o valor
Modelao e desenho da base de dados monetrio pago converter-se- em conhecimentos slidos e
anlise crtica.
SQL para iniciantes
AUTOR
Escrito por Fbio Pinho
Programador entusiasta nas mais diversas linguagens, sendo PHP, .NET e Java (Android) as suas preferncias.
40
Review
41
Review
PROGRAMAO EM PYTHON: FUNDAMENTOS E RESOLUO DE PROBLEMAS
apresentar UML no exerccio da mquina multibanco. Num registo mais pessoal, creio que o livro cumpre
mais do que aparentemente promete numa primeira apreci-
Achei de particular interesse, tendo-me captado a
ao da capa. No parece prometer tanto quanto cumpre
ateno, o facto de o autor apresentar o tratamento e visuali-
quando se l a obra de forma atenta, algo raro em literatura
zao de imagens provenientes de ficheiros. Isto algo no
da especialidade, pelo que sado o autor com alegria! A
muito comum num livro de Python, mas que se revela parti-
obra no seu todo de uma qualidade excepcional, numa
cularmente interessante, pois desperta interessa no leitor
linguagem extremamente acessvel. O texto no de todo
para temas que de outra forma, muito provavelmente acaba-
maador, como os menos vidos da leitura por vezes di-
riam por passar despercebidos. De igual modo podem ser
zem ao adjectivar livros. A ateno mantida de forma to
teis caso o utilizador pense dar continuidade aos exemplos
eficaz que ousaria opinar que ao ler esta obra, se est pe-
de jogos que se encontram na parte final do livro, acrescen-
rante um ciclo de formao orientado por um formador e no
tando por exemplo, uma imagem de fundo, de entre um vas-
de uma obra de consulta, como uma esmagadora maioria
tssimo leque de situaes nas quais os conhecimentos
das obras tende a ser utilizada.
transmitidos nesta obra, so de grande utilidade e valncia,
mesmo para quem pense que a programao se destina Realo o facto de nesta obra se encontrarem ilustra-
apenas a um pblico mais tcnico e cientfico. es a cores, algo que no comum e foi com agrado que
constatei. Independentemente do rigor tcnico e cientfico da
A ttulo de exemplo apenas ilustrativo desta opinio pessoal,
obra, que diga-se elevado, o facto de dispor de algumas
a linguagem Python de extrema utilidade quando se traba-
ilustraes mais relevantes a cor, ajuda a captar a ateno
lha com ferramentas de edio de imagem como o caso do
inicial dos mais desatentos. Da mesma forma gostaria de
GNU Image Manipulation Program (GIMP), para o qual
destacar os intermezzos disponveis entre os vrios captu-
possvel desenvolver toda uma srie de plug-ins em Python.
los que compem esta obra, sendo excelentes complemen-
Creio poder considerar que um profissional da edio de
tos para o leitor e onde o autor aborda de forma, diria que
imagem que utilize a ferramenta acima mencionada, aps a
mais suave, algumas questes mais complexas e alguns
leitura desta obra, sentir-se- mais capaz de desenvolver
mitos ou pseudo-dogmas, chamemos-lhe assim, da progra-
cdigo que lhe automatize tarefas e at acrescente funciona-
mao para quem principiante, como o facto de ser todos
lidades ferramenta.
os problemas terem apenas uma soluo, a apresentada
No ltimo dos captulos o autor foca-se inteiramente pelo autor, professor, formador, a pessoa que transmite o
nos aspectos relacionados com as interfaces grficas de conhecimento. O autor desmistifica este facto num dos inter-
utilizador, algo que essencial num programa de computa- mezzos, apresentando uma argumentao simples e igual-
dor que execute mais tarefas do que simplesmente o trata- mente slida.
mento de dados provenientes de suporte informtico. A apre-
Em concluso, um livro que recomendo vivamente
sentao do tema, permite ao leitor uma consolidao dos
tanto a programadores, como a estudantes de programao,
temas anteriormente abordados, alm de levantar interesse
entusiastas e no entusiastas, em suma a qualquer pessoa
adicional e proporcionar os conhecimentos necessrios ao
que se interesse um pouco, por tecnologia e que esteja dis-
desenvolvimento de aplicaes amigas do utilizador e grafi-
posto a aprender um pouco mais! Como referi anteriormente
camente atractivas.
nesta anlise, o livro de uma qualidade impar, adequando-
O livro dispe ainda de um exemplo de uma animao e de se a todas as pessoas que se interessem pela programao.
um jogo simples, como o jogo do galo, tambm conhecido
A aprendizagem de programao, por si s algo de
por tic-tac-toe, que apesar de ser trivial e impossvel de
grande importncia, nos dias que correm. No obstante a
vencer, caso os dois jogadores estejam ao mesmo nvel de
linguagem Python, quer pela maturidade atingida, quer pela
ateno e capacidade cognitiva, pois dada a simplicidade do
quantidade cada vez maior de bibliotecas disponveis, para
jogo a probabilidade de empate entre jogadores em situao
as mais diversas funes, pela sua versatilidade parece-me
de igualdade de faculdades de quase 100%.
ser uma linguagem que todos devem aprender.
AUTOR
Escrito por Antnio C. Santos
Com uma enorme paixo por tecnologia, autodidacta desde tenra idade, cresceu com o ZX Spectrum.
Tem vasta experincia em implementao e integrao de sistemas ERP, CRM, ERM, BI e desenvolvi-
mento de software por medida nas mais diversas linguagens. Diplomado do Curso de Especializao
Tecnolgica em Tecnologias e Programao de Sistemas de Informao pela ESTG-IPVC. Membro da
Comunidade Portugal-a-Programar desde Agosto de 2007, tambm membro da Sahana Software
Foundation, onde Programador Voluntrio. Neste momento aluno no Instituto Politcnico de Viana do
Castelo, na Escola Superior de Tecnologia e Gesto no curso de Licenciatura em Engenharia Informtica
e Xamarin Student Partner nesta mesma escola Twitter:@apocsantos
42
No Code
Windows 10: As novidades da atualizao de novembro (Build 10586 - Version 1511)
ECMAScript 2015: a nova verso do JavaScript
Raspberry Pi Zero O novo Membro da Famlia!
Beta-i HACKATHON Lisbon has been Hacked
Xamarin 4.0 Tudo o que precisa para criar aplicaes mveis
Impressoras 3D Escolhe a tua
Xamarin para Docentes e estudantes
HIGH TECH FASHION
Projecto em Destaque na Comunidade p@p: Portugol +
No Code
Instalao da atualizao
Novidades da verso
Ativao do Windows
44
No Code
WINDOWS 10: AS NOVIDADES DA ATUALIZAO DE NOVEMBRO (BUILD 10586 - VERSION 1511)
do Windows 7, Windows 8 e Windows 8.1., aps a Personalizao > Inicio e ativar a opo Mostrar mais
instalao da atualizao via Windows Update (caso a mosaicos.
ativao no seja feita automaticamente) ou durante uma
instalao limpa.
Menu Iniciar
Menus de Contexto
45
No Code
WINDOWS 10: AS NOVIDADES DA ATUALIZAO DE NOVEMBRO (BUILD 10586 - VERSION 1511)
Esquema de cores
46
No Code
WINDOWS 10: AS NOVIDADES DA ATUALIZAO DE NOVEMBRO (BUILD 10586 - VERSION 1511)
disponvel no Japo, Austrlia, Canad e ndia (em ingls),
com funcionalidades e experincias especficas para estes
mercados. Considerando a dimenso do mercado portugus,
continuaremos ansiosamente a aguardar a disponibilizao
da Cortana na lngua de Cames.
47
No Code
WINDOWS 10: AS NOVIDADES DA ATUALIZAO DE NOVEMBRO (BUILD 10586 - VERSION 1511)
App Mensagens
Reconhecimento escrita Cortana
Ainda relacionado com as Apps, a Microsoft voltou a
Windows Apps
disponibilizar a opo que permite a instalao de Apps
Como tem sido habitual, tambm as Apps nativas do em dispositivos externos como cartes SD. Esta opo foi
Windows 10 so atualizadas com novas funcionalidades e apresentada inicialmente em algumas Technical Previews,
correes que melhoram significativamente a sua mas no foi includa na verso RTM do Windows 10.
performance. Nesta Build foram atualizadas as Apps Correio
Esta opo pode ser configurada em Definies >
e Calendrio, Fotografias, Mapas, Groove e
Sistema > Armazenamento > As novas aplicaes sero
tambm Xbox. No Windows Blog, poder encontrar mais
guardadas em.
detalhes sobre as novidades includas em cada uma destas
Apps. Adicionalmente, a App Feedback passa a estar Gesto da Memria
disponvel para todos os utilizadores do Windows 10, Em regra geral, o Windows mantm itens em memria
mesmo que no estejam inscritos no Windows Insider para melhorar a performance, mas quando a memria
Program. comea a esgotar, comea a usar cache em disco para
armazenar estes itens. Nesta Build, a gesto de
memria inclui um novo componente que se
chama System and compressed memory. Este
componente permite que o Windows faa a compresso de
informao na memria antes que esta se esgote, e antes
que esta seja passada para o disco.
App Correio
48
No Code
WINDOWS 10: AS NOVIDADES DA ATUALIZAO DE NOVEMBRO (BUILD 10586 - VERSION 1511)
Para saber um pouco mais sobre a compresso da
memria no Windows 10, poder consultar o seguinte vdeo
no Channel 9: Memory Compression in Windows 10 RTM.
Enterprise Features
Estes dois servios gratuitos disponibilizados pela Mais detalhes sobre estas funcionalidades, podem ser
Microsoft, vo permitir s equipas de IT gerir a forma como consultadas nos seguintes links: Enterprise management for
so distribudos os Updates nestes equipamentos, Windows 10 devices | Azure Active Directory Join
assegurando que os mesmos esto atualizados e que
Segurana
cumprem os requisitos de segurana impostos pela
organizao. A propagao de malware que tem como objetivo a
subtrao de informao confidencial cada vez mais
Atravs da Store for Business, as equipas de IT
frequente. A Microsoft desenvolveu o Windows 10 para
podem adquirir e distribuir Apps para os dispositivos com
proteger os seus utilizadores deste tipo de ameaas, atravs
Windows 10 de forma prtica, seja estas Apps da Loja
de funcionalidades como o Windows Hello, o Windows
Windows ou App desenvolvidas internamente pela
Defender, o Device Guard e o Credential Guard, agora
melhoradas com a atualizao de novembro.
empresa (LOB).
49
No Code
WINDOWS 10: AS NOVIDADES DA ATUALIZAO DE NOVEMBRO (BUILD 10586 - VERSION 1511)
podem ser consultados no seguinte link: Microsoft Technet Concluso
Windows 10 Enterprise Features. Em concluso, a Build 10586 chega aos utilizadores
estvel e com melhorias significativas em termos de
performance e experincia de utilizao. O processo de
instalao em tudo igual verso RTM, pelo que no
Uma das funcio- dever trazer problemas maioria dos utilizadores. De referir
apenas que existem outras novidades que merecem ser
nalidades do Windows exploradas e que no foram abordadas neste artigo. Caso
ainda no tenha atualizado para a Build 10586, no deixe
AUTOR
Escrito por Nuno Silva
50
No Code
51
No Code
ECMASCRIPT 2015: A NOVA VERSO DO JAVASCRIPT
nrio. Por agora ainda no faz parte do portugus, foi um tas em ES2015 sem ter qualquer preocupao de compatibili-
dicionrio de lngua inglesa de referncia, o Oxford English dade com os browsers.
Dictionary, que o incluiu na listagem das novas palavras.
Como diz o slogan utilizado no site do Babel: Use next
Atualizaes ao referido dicionrio: generation JavaScript, today. Subscrevo.
http://public.oed.com/the-oed-today/recent-updates-to-the-
Concluso
oed/june-2015-update/new-words-list-june-2015/
O ECMAScript2015 mudar (j muda) a forma como
se programa em JavaScript.
Podemos utilizar o ES2015 desde j?
Em contexto de produo, neste momento, deparamo-
Com entusiasmo diria, no imediato: claro que sim. nos com um problema que devemos ter em considerao: o
suporte nas vrias plataformas disponveis. Com efeito, o
Muitas das especificidades do ES2015 j so disponi-
ES2015 ainda no integralmente suportado pelos browsers,
bilizadas pelos browsers Firefox e Chrome (consultar https://
embora se assista a constantes e rpidas evolues nesse
kangax.github.io/compat-table/es6/). No caso deste ltimo
sentido.
poder ser necessria a ativao da opo Ativar JavaS-
cript Experimental (Enable Experimental JavaS- Na minha opinio, no faz grande sentido intervir nu-
cript) acessvel nas configuraes atravs do acesso a chro- ma aplicao terminada e j em produo e migr-la para a
me://flags (na barra de endereo do browser). nova verso do JavaScript. O mesmo se aplica a uma aplica-
o num estgio de desenvolvimento j avanado. No entan-
Numa abordagem muito pouco tcnica, mas elucidati-
to, j faz todo o sentido a utilizao do ES2015, no momento
va, o ES2015 atualiza o JavaScript. Neste contexto, imagine-
em que iniciado um novo desenvolvimento aplicacional.
se o cenrio em que temos uma aplicao estvel com funci-
Sempre de considerar o suporte (ou a falta dele) por parte
onalidades suportadas pelo JavaScript (exclusivamente ES5,
dos browsers.
no caso). Na realidade temos disponvel, para programar
sobre um browser atual e atualizado, tudo o que sabemos da Conclundo e clarificando, enquanto programadores
especificao da linguagem definida pelo ES5, somada a de JavaScript, no temos a necessidade de aprender um
melhorias desta ltima, mais as novidades trazidas pelo ES6. JavaScript novo. Podemos continuar a programar utilizando
Ento como proceder? Recomendaria a programao em todo o nosso conhecimento e sintaxe aprendida at ento,
ES2015 testando, sempre, o cdigo em diferentes browsers, tirando partido das melhorias, do que j existia, agora introdu-
de resto como prtica comum nos programadores de apli- zidas pelo ECMAScript 2015 e, sempre que necessrio, tirar
caes web. partido do que o referido standard nos traz de novo.
Em suma, o desafio traduz-se em utilizar o ES2015 Como referido na introduo gostaria de voltar com,
gradualmente nos nossos projetos, aproveitando as melhori- pelo menos, a apresentao do que, na prtica, o ES2015
as/atualizaes do que j existia no ES5 e tirando partido nos proporciona. A ver vamos Se for caso disso um "at j"
das novidades trazidas pela nova verso. E no esqueam e foi um prazer escrever para vocs.
que, hoje, as nossas aplicaes em JavaScript so executa-
das em browsers que j suportam o ES2015.
AUTOR
Escrito por Jos Viana
exerce profissionalmente a atividade de programador desde h, aproximadamente, 15 anos. Docente da Escola Superior de
Tecnologia e Gesto do Instituto Politcnico de Viana do Castelo, na rea Cientfica de Informtica e Multimdia.
Licenciado em Engenharia da Computao Grfica e Multimdia.
52
No Code
53
No Code
RASPBERRY PI ZERO O NOVO MEMBRO DA FAMLIA!
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.
54
No Code
55
No Code
BETA-I HACKATHON LISBON HAS BEEN HACKED
Apresentadas idei-
Mais do que um fim-de-semana diferente, foi possvel
conhecer novas pessoas, criar novos laos, aprender e parti-
lhar uma experincia nica. Sem dvida uma experincia a
as, formadas as equi-
repetir que ficar na memria de todos os participantes!
pas e dai ao work &
code foi um rpido
passo ()
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.
56
No Code
57
No Code
XAMARIN 4.0 TUDO O QUE PRECISA PARA CRIAR AS SUAS APLICAES MVEIS
se. Concluso
Para terminar, a Xamarin aproveitou este lanamento Em concluso, podemos concluir que a equipa da
para estimar os seus clientes e ofereceu a todos os utilizado- Xamarin continua a trabalhar arduamente para nos fornecer
res ativos: boas solues de forma a facilitar o desenvolvimento de apli-
caes mveis e com o lanamento do Xamarin 4.0 nota-se a
Relatrios de erros do Xamarin Insights, com reten- melhoria de qualidade e em muitos casos a voz do utilizador
o de dados at 30 dias; tida em conta.
60 minutos de Xamarin Test Cloud por ms Referncias
30 dias de acesso Xamarin University https://blog.xamarin.com/
http://developer.xamarin.com/
() o Xamarin 4.0,
que apresenta muitas
novidades que para
quem est a fazer de-
senvolvimento de apli-
caes mveis deixa
qualquer um soberbo
uma vez que a qualida-
de e leque de funciona-
lidades continua a
crescer de forma expo-
nencial()
AUTOR
Escrito Por Sara Silva
Licenciada em Matemtica pelo DMUC, e o seu foco de desenvolvimento est direccionado para a rea
Mobile. Atualmente desenvolve na rea do Windows, Xamarin, Azure, e Microsoft MVP Mentor. A Sara foi
condecorada com vrios prmios com especial destaque: Microsoft MVP, Xamarin MVP, Telerik Developer
Especialista, C# Corner MVP, TechNet Wiki - Technical Guru. O trabalho que vai sendo desenvolvido pela
Sara pode ser seguido atravs do seu blog www.saramgsilva.com e do twitter @saramgsilva.
58
No Code
59
No Code
IMPRESSORAS 3D ESCOLHE A TUA
aparenta, esta impressora no consta ser pesada pois gran- Contudo, este modelo oferece um interface tctil e
de parte alumnio e a sua parte inferior aberta permitindo contm como ferramenta de apoio com vdeos que colocam o
assim um acesso simples e fcil aos motores, electrnica e utilizador a realizar a sua primeira impresso em apenas
aos ps de borracha que impedem a mesma de deslizar so- 30min.
bre a mesa durante a impresso. Em comparao com os
Rostock Max v2
seus antecessores, este modelo contm um slot SD mais
acessvel e um apoio para o filamento no topo da estrutura.
60
No Code
IMPRESSORAS 3D ESCOLHE A TUA
Por ultimo deixo aos leitores, uma outra impressora ajuda, caso se entusiasmem e iniciem esta temtica.
3D, bastante conhecida no meio.
61
No Code
IMPRESSORAS 3D ESCOLHE A TUA
actividade. Concluso
Claro que todos estes materiais, com as suas especi- A impresso 3D, continua numa vertiginosa evoluo, quer
ficaes variadas, muitas vezes requerem capacidades de em termos de modelos de impressoras, cada vez mais bara-
impresso especificas, pelo que a finalidade de uma impres- tos e cada vez mais capazes, como tambm de polmeros
sora e os materiais que ela dever ser capaz de disponveis para utilizao na impresso 3D. Desde os pol-
imprimir, permanece interligada. meros biodegradveis e no muito resistentes, feitos base
de material orgnico, at aos polmeros mais resistentes co-
mo o caso do ABS (acrilonitrila butadieno estireno), ampla-
()a primeira im- mente conhecido pela sua elevada resistncia.
AUTOR
Escrito por Patrick Correia de Freitas
Tcnico de Design de Interiores e Exteriores, est a terminar a Licenciatura em Design de Interiores e Equipamento. Procura
desafiar-se diariamente na sua rea e nos seus hobbies. Desenvolveu desde os seus 10anos uma enorme paixo por Gam-
ming, na qual acabaria por se tornar um auto didacta na montagem dos seus prprios computadores de elevado desempenho
grfico. Tem um gosto particular por programas de modelao tridimensional de espaos interiores e equipamentos.
Designisnotjustwhatitlookslikeandfeelslike.Designishowitworks.(SteveJobs)
62
No Code
63
No Code
XAMARIN PARA DOCENTES E ESTUDANTES
Uma das grandes vantagens para os educadores Os educadores , ao utilizarem Xamarin e ensinarem
recai no facto de que, ao no terem que ensinar um novo Xamarin aos seus educandos, esto a possibilitar uma apren-
paradigma de programao, podem usar o paradigma j en- dizagem de um conjunto extremamente til de capacidades e
sinado de programao orientada a objetos, de forma a pro- conhecimentos, proporcionando-lhes uma mais enriquecedo-
porcionar aos estudantes uma nova e imersiva experincia ra e completa educao. Desta forma preparam melhor os
no desenvolvimento cross-platform para plataformas mobile. estudantes para a sua vida futura enquanto profissionais de
Ao utilizarem a linguagem de programao C# e uma ferra- tecnologias de informao, seguindo assim a premissa base
menta que est em expanso, dotam os futuros profissionais das funes de um educador: formar as pessoas para um
das tecnologias de informao de um conjunto de capacida- mundo melhor.
des e valioso conhecimento, para emprego futuro, cativando
o seu interesse e mantendo alta motivao de aprendiza-
gem. A necessidade de programadores mobile continua
a crescer. Em 2013 existiam 2.3 milhes de programadores
mobile, sendo o seu salrio mdio de 71.432 USD, podendo
Uma das grandes
por vezes chegar aos 110.000 USD (Economic Journal).
vantagens para os edu-
cadores recai no facto
de que, ao no terem
que ensinar um novo
paradigma de progra-
mao, podem enqua-
Em concluso, o futuro da tecnologia passa inevitavelmen-
te pelo desenvolvimento mobile, observando as metodolo-
gias de Mobile First. Nos dias de hoje podemos considerar
drar estas ferramentas
os conhecimentos de desenvolvimento mobile o equivalente
a saber os comandos de uma shell para se programar um
e linguagem na matria
computador. A avidez da indstria por aplicaes mveis
multi-plataforma e por profissionais competentes nestas ma- de j ensinada de pro-
trias e com este tipo de skillset, cresce de dia para dia.
AUTOR
Escrito por Antnio C. Santos
Com uma enorme paixo por tecnologia, autodidacta desde tenra idade, cresceu com o ZX Spectrum.
Tem vasta experincia em implementao e integrao de sistemas ERP, CRM, ERM, BI e desenvolvi-
mento de software por medida nas mais diversas linguagens. Diplomado do Curso de Especializao
Tecnolgica em Tecnologias e Programao de Sistemas de Informao pela ESTG-IPVC. Membro da
Comunidade Portugal-a-Programar desde Agosto de 2007, tambm membro da Sahana Software
Foundation, onde Programador Voluntrio. Neste momento aluno no Instituto Politcnico de Viana do
Castelo, na Escola Superior de Tecnologia e Gesto no curso de Licenciatura em Engenharia Informtica
e Xamarin Student Partner nesta mesma escola Twitter:@apocsantos
64
No Code
65
No Code
HIGH TECH FASHION
sante? O vestido tem uma forma redonda, tambm sido este temos sensao de conforto quando queremos danar ou
impresso. E como se junta a tecnologia de ponta a isto? Ben- abraar uma pessoa que nos querida, automaticamente o
jamin Males o criativo de servio nesse setor - o que Nancy vestido desativa os mecanismos de defesa e deixa que a
desenha, Benjamin consegue dar vida, o que faz desta par- outra pessoa esteja perto de ns. A moda aliada a ns, a
ceria uma das mais ricas em todo o mundo da moda. Todos algo to sensvel como a nossa mente.
estes hbridos no passaram despercebidos aos olhos da
Ento, achas que j tens roupa de trabalho?
rainha do excntrico, Lady Gaga. Sendo a TechHaus uma
diviso tcnica da to aclamada House of Gaga, e em con-
junto com a STUDIO XO, foi criado especialmente para Lady
Links onde se podem ver os vestidos a interagir:
Gaga um vestido que voa Volantis. Este vestido, feito em
fibra de carbono e movido por seis grandes tubos de bateri- Hussein Chalayan - https://www.youtube.com/watch?
as, sendo todo ele ecolgico (ao estilo do to conhecido dro- v=Ae81FcczsI8
ne voador) e aqui que os detalhes se tornam fundamen-
STUDIO XO - https://www.youtube.com/watch?
tais, pois se o vestido no fosse construdo em fibra de car-
v=ZVtURELhy1w
bono, nunca levantaria do cho. Admitamos algo que esta
equipa tem de maravilhoso um extremo conhecimento tc- Anouk Wipprecht - https://www.youtube.com/watch?
nico. Ainda assim, e se estiveres na rua e por acaso algum v=D40n_oZW5Ig
decidir que te vai atacar?
66
No Code
HIGH TECH FASHION
STUDIO XO
Bubelle Dress
ANOUK WIPPRECHT
AUTOR
Escrito por Filipa Antunes Peres.
Licenciada em Design de Moda e Txtil e Ps-graduada em Marketing. Desde pequena que desenvolveu um forte sentido
para tudo o que tenha a ver com Design.
67
No Code
PROJECTO EM DESTAQUE NA COMUNIDADE P@P: PORTUGOL +
programa e as semelhanas entre a linguagem de
Este projecto um interpretador de uma linguagem
programao e a lngua portuguesa.
de programao bastante simples, com uma sintaxe
semelhante ao portugus, que permite uma fcil
/*
aprendizagem de algoritmia e programao. Funo recursiva de calculo do factorial de um
nmero
De entre as muitas funcionalidades j > parametro[real] : n
implementadas, destacam-se as seguintes: valor do qual o factorial ir ser calculado
68
Elege o melhor artigo desta edio
Revista PROGRAMAR
http://bit.do/ProgramarED51_V
Veja tambm as edies anteriores da
www.revista-programar.info
Revista PROGRAMAR
e muito mais em
49 Edio - Junho 2015 46 Edio - Setenmbro 2014
50 Edio - Setembro 2015 47 Edio - Dezembro 2014