Escolar Documentos
Profissional Documentos
Cultura Documentos
EDITORIAL
EQUIPA PROGRAMAR
Coordenadores
Antnio Silva
Fernando Martins
Editor
Antnio Silva
Design
Srgio Alves (@scorpion_blood)
Redaco
Andr Lage, Augusto Manzano, Diogo
Constantino, Fernando Martins, Joo Mares,
Joo Matos, Jorge Paulino, Paulo Morgado,
Pedro Aniceto, Ricardo Rodrigues, Ricardo
Trindade, Sara Silva
Contacto
revistaprogramar@portugal-a-programar.info
Website
http://www.revista-programar.info
ISSN
1 647-071 0
INDICE
4
11
18
23
26
31
35
41
43
47
54
56
Sempre em movimento
Porque sabemos que parar morrer, nesta edio da Revista
PROGRAMAR introduzimos vrias alteraes que achamos importantes
para continuidade deste projecto. Das vrias alteraes introduzidas, a salta
imediatamente vista, mesmo ao leitor que ainda est somente a ler a
pgina do editorial, a mudana de design . Em qualquer tipo de
publicao o design influencia o modo como vemos como lemos. Aqui
temos que agradecer a todos quantos ajudaram a adaptar este novo design,
mas especialmente ao Srgio Alves por toda a parte da idealizao e
desenho do novo design.
Outra alterao, que todavia no ser to notada pelos leitores a
alterao do software de paginao. Chegamos concluso que o Scribus
j evoluiu bastante desde a ltima vez que foi utilizado para paginar a
Revista PROGRAMAR e est altura das nossas necessidades. Assim
decidimos que no havia necessidade de continuarmos a utilizar um
software pago e que trazia vrios problemas de leitura a alguns utilizadores
(dos quais chegamos a receber comentrios).
Tambm fizemos vrias parcerias com algumas comunidades
portuguesas que esto de algum modo relacionadas com programao, de
modo a obter mais e melhores artigos para si. Todavia no estamos
fechados a mais parcerias, continuamos abertos a futuros contactos para o
nosso endereo de correio electrnico, que sero posteriormente analisados
por toda a equipa.
Trazemos tambm at si, colunas de opinio e colunas direccionadas a
um tema especfico. Assim poder contar que surgiro artigos desse
assunto com uma periodicidade especfica na sua Revista favorita.
Por fim, achamos que estamos prontos para voltar a trazer a Revista
PROGRAMAR at si de 2 em 2 meses , e por isso a prxima edio dever
sair em Fevereiro ao invs de Maro como estava programado.
Tudo isto para si, que est ler. Espermos que as alteraes sejam bem
recebidas por todos, mas tambm espermos opinies sobre todas estas
alteraes, mesmo porque as novidades podero no ficar por aqui,
contmos ter mais novidades na prxima edio. Por isso no tenha medo
de nos contactar para revistaprogramar@portugal-a-programar.org a dizer o
que acha de todas estas alteraes. Porque voc importante para ns,
quer as suas opinies, quer o seu trabalho a divulgar o nosso projecto aos
seus amigos e colegas, e mais importante a sua preferncia que nos
permite crescer para lhe oferecer algo maior e melhor.
A equipa da Revista 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 responsabilizada por alguma impreciso ou erro. Para qualquer dvida ou esclarecimento poder sempre contactar-nos.
2
Noticias
NOTICIAS
U p l o a d Li s b o a e U p l o a d Li s b o a
Se m i n ri o Po c ke tPT s o b re
Pro 2 0 1 0
te c n o l o gi a s Wi n d o ws Ph o n e
Encontram-se abertas as inscries para o 6 Seminrio
PocketPT sobre tecnologias mveis Windows Phone. Este
ano o seminrio ser dedicado nova plataforma mvel da
Microsoft, e ir incluir vrias sesses que iro dar a
conhecer as funcionalidades do mesmo.
Ser ainda uma excelente oportunidade para os
participantes testarem e verem em primeira mo os novos
equipamentos.
Como tem vindo a acontecer nos anos anteriores a
inscrio este ano gratuita e ir ter lugar no auditrio da
Microsoft Portugal no TagusPark em Porto Salvo no
prximo dia 1 8 de Dezembro pelas 1 0h.
Mais informaes e inscries:
http://www.mtechseminar.com/201 0/index.htm
1 6 a R e u n i o Pre s e n c i a l d a
SAPO C o d e B i ts 2 0 1 0
C o m u n i d a d e N e tPo n to
De 11 a 1 3 de Novembro de 201 0 decorreu o Sapo
Codebits 201 0. A comunidade Portugal-a-Programar esteve
presente, tendo alguns membros efectuado alguns
projectos. Este ano, com oferta da comunidade, todos os
que participaram e solicitaram, tiveram direito a uma t-shirt
para usar durante o evento.
Esta foi a foto de grupo de alguns dos elementos que
estiveram presentes (infelizmente no foi possvel juntar
todos):
TEMA DE CAPA
LI N Q: I m p l e m e n ta o d o s o p e ra d o re s Ta ke La st,
Ta ke La stWh i l e , Ski p La st e S ki p La stWh i l e
.Reverse()
.TakeWhile(criteria)
.Reverse();
TakeLast<TSource>(IEnumerable<TSource>)
Console.WriteLine("As
so:");
notas
mais
Console.WriteLine(grade);
altas
TEMA DE CAPA
LI N Q: I m p l e m e n ta o d o s o p e ra d o re s Ta ke La st, Ta ke La stWh i l e , Ski p La st e Ski p La stWh i l e
/*
string[] fruits =
98
92
85
*/
TakeLastWhile<TSource>(IEnumerable<TSou
rce>, Func<TSource, Boolean>)
/*
string[] fruits =
*/
.TakeLastWhile(fruit =>
SkipLast<TSource>(IEnumerable<TSource>)
string.Compare("laranja",
Console.WriteLine(fruit);
Console.WriteLine(fruit);
int[] grades =
/*
.OrderBy(g => g)
maracuj
.SkipLast(3);
uva
morango
*/
top 3:");
TakeLastWhile<TSource>(IEnumerable<TSou
rce>, Func<TSource, Int32, Boolean>)
Console.WriteLine(grade);
TEMA DE CAPA
LI N Q: I m p l e m e n ta o d o s o p e ra d o re s Ta ke La st, Ta ke La stWh i l e , Ski p La st e Ski p La stWh i l e
SkipLastWhile<TSource>(IEnumerable<TSour
ce>, Func<TSource, Int32, Boolean>)
/*
56
59
70
82
*/
int[] amounts =
{
SkipLastWhile<TSource>(IEnumerable<TSour
ce>, Func<TSource, Boolean>)
};
index * 1000);
/*
.SkipLastWhile(grade =>
Console.WriteLine(amount);
5000
80:");
2500
*/
int[] grades =
Console.WriteLine(grade);
IMPLEMENTADO OS OPERADORES
TAKELAST
/*
56
59
70
*/
TEMA DE CAPA
LI N Q: I m p l e m e n ta o d o s o p e ra d o re s Ta ke La st, Ta ke La stWh i l e , Ski p La st e Ski p La stWh i l e
var sourceEnumerator =
source.GetEnumerator();
sourceEnumerator.MoveNext(); idx++,
numOfItems++)
{
buffer[idx] = sourceEnumerator.Current;
if (count <= 0)
{
yield break;
(idx
0;
sourceEnumerator.MoveNext();
sourceEnumerator.Current;
System.Linq.Enumerable.Empty<TSource>();
return
listCount; idx++)
Implementando os Operadores
TakeLastWhile
TEMA DE CAPA
LI N Q: I m p l e m e n ta o d o s o p e ra d o re s Ta ke La st, Ta ke La stWh i l e , Ski p La st e Ski p La stWh i l e
else
{
if (predicate(item))
{
}
buffer.Add(item);
buffer.Clear();
var sourceEnumerator =
source.GetEnumerator();
sourceEnumerator.MoveNext(); idx++)
var idx = 0;
IMPLEMENTANDO OS OPERADORES
SKIPLAST
else
{
buffer.Clear();
buffer.Add(item);
buffer[idx] = sourceEnumerator.Current;
if (predicate(item, idx++))
{
TEMA DE CAPA
LI N Q: I m p l e m e n ta o d o s o p e ra d o re s Ta ke La st, Ta ke La stWh i l e , Ski p La st e Ski p La stWh i l e
idx = 0;
while (sourceEnumerator.MoveNext())
{
Implementando os Operadores
SkipLastWhile
if (count <= 0)
// ...
return
System.Linq.Enumerable.Empty<TSource>();
buffer[idx] = sourceEnumerator.Current;
TEMA DE CAPA
LI N Q: I m p l e m e n ta o d o s o p e ra d o re s Ta ke La st, Ta ke La stWh i l e , Ski p La st e Ski p La stWh i l e
else
if (predicate(item))
{
}
if (buffer.Count > 0)
{
buffer.Add(item);
else
{
}
if (buffer.Count > 0)
var idx = 0;
Recursos
if (predicate(item, idx++))
buffer.Clear();
Concluso
buffer.Clear();
buffer.Add(item);
AUTOR
Escrito por Paulo Morgado
licenciado em Engenharia Electrnica e Telecomunicaes (Sistemas Digitais) pelo Instituto Superior de
Engenharia de Lisboa e Licenciado em Engenharia Informtica pela Faculdade de Cincias e Tecnologia
da Universidade Nova de Lisboa. Pelo seu contributo para a comunidade de desenvolvimento em .NET
em lngua Portuguesa, a Microsoft premeia-o com o prmio MVP (C#) desde 2003. ainda co-autor do
livro LINQ Com C# da FCA.
10
A PROGRAMAR
BYAC C
No artigo anterior adquirimos algumas noes
sobre flex e vimos como implementar um
scanner simples. Relembrando, o flex um
gerador de analisadores lexicais ou scanners, e
o byacc um gerador de parsers. Usados em
conjunto permitem escrever aplicaes bastante
sofisticadas, mas no nosso artigo limitamo-nos a
considerar uma calculadora simples, servindo
como exemplo introdutrio. Agora que temos o
scanner para a nossa calculadora escrito
podemos comear a considerar o parser.
%union {
};
definies
%token<d> NUMBER
%token NL
%%
gramtica
%%
%nonassoc UMINUS
int main()
{
}
double d;
%%
yyparse();
...
%%
int main()
{
}
11
yyparse();
A PROGRAMAR
BYAC C
%%
expr_list
: expr NL
{ std::cout
expr_list
expr
NL
expr
-$2; }
: NUMBER
{ $$ = $1; }
{ $$ =
{ $$ = $1-
$1+$3; }
$3; }
{ $$ =
{ $$ =
{ $$ =
$1*$3; }
$1/$3; }
pow($1, $3); }
}
%{
{ $$ =
{ $$ = $2;
#include <iostream>
#include <cmath>
%%
%}
int main()
{
%union {
};
double d;
yyparse();
%token<d> NUMBER
%token NL
%nonassoc UMINUS
%type<d> expr
A PROGRAMAR
BYAC C
...
;
%%
program : list
;
list
: statement
| list statement
;
statement : declaration
| function
;
expression
stmt : block;
...
13
|
;
type
identifier
'='
A PROGRAMAR
BYAC C
s : x
| y
type : INT
| DOUBLE
x : A B C ;
| CHAR
y : A B C ;
s : x
| y
;
stmt_list : stmt
x : A B C ;
| stmt_list stmt
...
y : A z C ;
z : B ;
%%
s : x
| y
x : A B C ;
y : z C ;
z : A B ;
x : A B;
y : A B;
A PROGRAMAR
BYAC C
s : x D
%nonassoc IFX
| y F
%token ELSE
x : A B;
...
y : A B;
%%
...
stmt : IF expression stmt
%prec IFX
...
%%
if(b) c = a + b; else c = a;
15
A PROGRAMAR
BYAC C
| NUMBER
%nonassoc UMINUS
%%
%%
expr : NUMBER
%{
#include <iostream>
#include <cmath>
%}
16
A PROGRAMAR
BYAC C
%union {
};
double d;
%token<d> NUMBER
%token NL
%nonassoc UMINUS
%type<d> expr
%%
expr_list
: expr NL
| expr_list expr NL
;
expr : NUMBER
%%
{ $$ = $1; }
{ $$ = -$2; }
{ $$ = $1+$3; }
{ $$ = $1-$3; }
{ $$ = $1*$3; }
{ $$ = $1/$3; }
{ $$ = pow($1, $3); }
{ $$ = $2; }
int main()
{
}
tipos
associados,
associatividade
e
precedncia. Conclumos a
primeira seco com a
declarao que o smbolo no
terminal expr tem um valor
associado do tipo double. Isto
essencial porque as nossas
operaes no esto a
receber tokens NUMBER
como argumentos mas sim
no terminais expr. O smbolo
inicial da nossa gramtica
expr_list e est definido como
uma sequncia de um ou mais
no terminais expr, separados
por mudanas de linha.
Associamos a cada produo
de expr_list a aco da
impresso do valor de expr.
As produes com cabea
expr tem associadas as
aces que realizam os
clculos,
guardando
os
valores na cabea. Na terceira
seco temos um main que
chama o yyparse().
yyparse();
17
CRIAO DO
(database-first)
MODELO
RELACIONAL
from
Aps este processo est criado o ficheiro EDMX,
que no mais do que um conjunto de classes e
mtodos que nos permitir aceder base de
dados de uma forma simples, como iremos ver
de seguida.
OPERAES CRUD
context.clientes.AddObject(cliente)
context.SaveChanges()
End Using
Apagar registos
Para apagar um registo necessrio seleccionar
o registo correcto, neste caso usando uma
Lambda Expression, e caso o resultado seja
vlido, executamos o mtodo DeleteObject(),
indicando o registo a apagar.
Inserir registos
Para inserir novos registos, neste caso um novo
cliente, criamos uma nova instncia da
respectiva classe, definindo as suas
propriedades,
que
correspondem
aos
respectivos campos. Depois adicionamos o
objecto atravs do mtodo AddObject() e,
finalmente,
executamos
o
mtodo
SaveChanges() que ir efectuar as respectivas
alteraes, neste caso inserir um registo, na
base de dados.
context.clientes.DeleteObject(cliente)
context.SaveChanges()
Else
End If
.datanascimento =
}
MessageBox.Show(
End Using
20
Modificar Registos
Dim listaClientes =
From c In context.clientes
Next
Dim cliente =
(From c In context.clientes
Debug.WriteLine(c.nome)
End Using
Where c.id = 1
Select c).FirstOrDefault()
Entre
entidades
existir
normalmente
associaes, e essas associaes (tambm
representadas na ltima imagem), tm algo que
se designa por Navigation Properties. As
Navigation Properties permitem uma navegao
bidireccional entre entidades, de acordo com as
suas associaes. Isto algo bastante prtico
pois permite-nos criar queries entre vrias
entidades usando LINQ to Entities.
End With
Else
New DateTime(1985, 1, 1)
context.SaveChanges()
MessageBox.Show(
End If
End Using
Listar Registos
Dim listaClientes =
From c In context.clientes
Join m In context.movimentos
Join p In context.produtos
Select m.datavenda,
21
especiais), etc
c.nome,
p.produto,
m.preco
Me.DataGridView1.DataSource = listaClientes
End Using
CONCLUSO
Como foi possvel ver ao longo do artigo, que
abordou de uma forma muito superficial algumas
das funcionalidades deste ORM, o Entity
Framework uma excelente opo para se
trabalhar com bases de dados.
AUTOR
Escrito por Jorge Paulino
Exerce funes de analista-programador numa multinacional sediada em Portugal. formador e ministra
cursos de formao em tecnologias Microsoft .NET e VBA. Microsoft Most Valuable Professional (MVP),
em Visual Basic, pela sua participao nas comunidades tcnicas . administrador da Comunidade
Portugal-a-Programar e membro de vrias comunidades (PontoNetPT, NetPonto, MSDN, ExpertsExchange, CodeProject, etc). autor do blog http://vbtuga.blogspot.com - twitter @vbtuga
22
A PROGRAMAR
Pro gra m a o Fu n c i o n a l c o m Pe rl ( p a rte I )
sobre PF por exemplo). Como j h vrios
artigos sobre PF em diversas linguagens, como
Python, Scheme, Haskell (recomendo que os
leiam), deixo aqui a sugesto a algum, para
redigir um artigo terico e agnstico (em relao
a linguagens de programao) sobre
Programao Funcional.
23
A PROGRAMAR
Pro gra m a o Fu n c i o n a l c o m Pe rl ( p a rte I )
my %lingua = (
);
my $str = $format->($string);
}
my
print $str;
$format
sub
formatao da string
#funo
sub dispach {
annima
my $l = shift;
de
if(defined
$lingua{$l}) {
my $str = shift;
};
#dispach table
$lingua{$l}
&&
exists
my $str = $lingua{$l}->();
return $str."\n";
print $str."\n";
else {
dispach("fr");
A PROGRAMAR
Pro gra m a o Fu n c i o n a l c o m Pe rl ( p a rte I )
25
COMUNIDADE NETPONTO
B a c kgro u n d Wo rke rs - I m p l e m e n ta o p r ti c a e m
Wi n d o ws Pre s e n ta ti o n Fo u n d a ti o n ( WPF)
Neste artigo pretendo mostrar o que o
BackgroundWorker e vou exemplificar como se
deve proceder sua implementao usando a
tecnologia WPF na verso .Net Framework 4.
System.ComponentModel. Esta classe permitenos ajudar a gerir uma tarefa numa thread
separada da thread principal sem termos de nos
preocupar com a inicializao e gesto da thread
onde vamos executar a tarefa.
Suponhamos:
CancellationPending
WorkerSupportsCancellation
CancelAsync
ReportProgress
COMUNIDADE NETPONTO
B a c kgro u n d Wo rke rs - I m p l e m e n ta o p r ti c a e m Wi n d o ws Pre s e n ta ti o n Fo u n d a ti o n ( WPF)
ProgressChanged
RunWorkerCompleted
COMUNIDADE NETPONTO
B a c kgro u n d Wo rke rs - I m p l e m e n ta o p r ti c a e m Wi n d o ws Pre s e n ta ti o n Fo u n d a ti o n ( WPF)
_backgroundWorker.DoWork +=
new DoWorkEventHandler(DoWork);
_backgroundWorker.ProgressChanged +=
new ProgressChangedEventHandler(
ProgressChanged);
_backgroundWorker.RunWorkerCompleted +=
new RunWorkerCompletedEventHandler(
RunWorkerCompleted);
_backgroundWorker.RunWorkerAsync(
(object)_world);
btnCancel.IsEnabled = true;
btnRunBackground.IsEnabled=false;
_backgroundWorker.WorkerReportsProgress =
true;
_backgroundWorker.WorkerSupportsCancellation
= true;
}
private
void
DoWork(object
DoWorkEventArgs e){}
sender,
28
foreach
(IAlgorithmStep step in algorithm.Steps)
{stepValue = step.DoWork(stepValue);}
e.Result = stepValue;
COMUNIDADE NETPONTO
B a c kgro u n d Wo rke rs - I m p l e m e n ta o p r ti c a e m Wi n d o ws Pre s e n ta ti o n Fo u n d a ti o n ( WPF)
foreach
(IAlgorithmStep step in algorithm.Steps)
{
if
(_backgroundWorker.CancellationPending)
{
_backgroundWorker.ReportProgress(10,
string.Format(
"{0} is canceled.", step.Name));
e.Cancel = true;
return;
}
else
{
_backgroundWorker.ReportProgress(10,
string.Format(
"{0} is starting.", step.Name));
stepValue =
step.DoWork(stepValue);
foreach
(IAlgorithmStep step in algorithm.Steps)
{
if
(_backgroundWorker.CancellationPending)
{
e.Cancel = true;
return;
}
else
{
stepValue =
step.DoWork(stepValue);
}
}
e.Result = stepValue;
}
_backgroundWorker.ReportProgress(20,
string.Format(
"{0} is finished.", step.Name));
e.Result = stepValue;
_backgroundWorker.ReportProgress(5,
"Finished.");
mtodo
_backgroundWorker.ReportProgress(
5, "Is starting...");
29
progressBar.Value +=
args.ProgressPercentage;
lbxProgress.Items.Add(
args.UserState.ToString());
A PROGRAMAR
B a c kgro u n d Wo rke rs - I m p l e m e n ta o p r ti c a e m Wi n d o ws Pre s e n ta ti o n Fo u n d a ti o n ( WPF)
Em concluso, a implementao de um
BackgroundWorker permite-nos correr uma
tarefa numa thread separada sem que esta
interfira com a interface com o utilizador.
Permite-nos ainda ter a capacidade de:
- Cancelar a tarefa;
- Reportar o progresso da tarefa;
- Actualizar os controlos de WPF enquanto a
tarefa decorre.
private
void
RunWorkerCompleted(object
sender, RunWorkerCompletedEventArgs e){}
btnRunBackground.IsEnabled = true;
btnCancel.IsEnabled = false;
Visite-nos em http://netponto.org
30
A PROGRAMAR
31
A PROGRAMAR
j Qu e ry - O q u , c o m o e p o rq u ?
dispositivos mveis, pois o seu grande trunfo
ser cross-browser entre as vrias plataformas
mveis e alm disso as prprias themes serem
adaptadas ao aspecto do dispositivo em uso,
fazendo com que o aspecto e usabilidade (look
& feel) das aplicaes desenvolvidas com este
plugin no se distingam das aplicaes nativas
do dispositivo, o que um avano enorme no
desenvolvimento de aplicaes web para
dispositivos mveis.
<head>
<script
type="text/javascript"
src="jquery-1.4.3.min.js"></script>
<script type="text/javascript">
</script>
</head>
<a
<body>
href="http://www.portugal-a-
programar.org/">PaP</a>
</body>
</html>
32
A PROGRAMAR
j Qu e ry - O q u , c o m o e p o rq u ?
$(document).ready(function() {
$(a).bind(click,
function(event) {
alert("Aceder ao site da comunidade
Portugal a Programar)
})
})
img.1
$(function() {
})
<html>
<head>
<script type="text/javascript"
src="jquery1.4.3.min.js">
</script>
<script type="text/javascript">
$(document).ready(function() {
$(a).bind(click,
function(event) {
</html>
alert("Aceder
ao
site
da
comunidade Portugal a Programar)
img.2
})
$(document).ready(function() {
//cdigo aqui
})
33
A PROGRAMAR
j Qu e ry - O q u , c o m o e p o rq u ?
})
</script>
</head>
$(document).ready(function() {
$(a).bind(click,
function(event) {
alert("Deste modo, j no somos
direccionados para o site Portugal
a Programar)
event.preventDefault()
})
})
<body>
<ahref="http://www.portugala
programar.org/">PaP</a>
</body>
</html>
img.2
Actualmente existem
cerca de 4000 plugins
na pgina oficial !
img.3
34
A PROGRAMAR
j Qu e ry - O q u , c o m o e p o rq u ?
Uma framework to
acessvel quanto poderosa
e com um potencial cada
vez maior
img.4
AUTOR
Escrito por Ricardo Rodrigues
tcnico Nvel III em Informtica/Gesto pela Fundao Escola Profissional de Setbal, tendo ingressado
aps na FCT da Universidade Nova de Lisboa.
Posteriormente frequentou vrios cursos da Microsoft em diversas reas como Windows Forms,ASP.NET,
Securing .NET Applications, WCF, WWF, Web Services e COM+ tendo obtido as certificaes MCP .NET
2.0, MCAD .NET 1 .1 , MCSD .NET 1 .1 , MCPD Windows, Web e Distributed Applications e MCPD Enterprise Applications Developer.
(MCP Profile)
Contribui activamente em comunidades como StackOverflow e tambm possui um blog/twitter como
temtica relacionada: Blog / @ricmrodrigues
35
A PROGRAMAR
Lu a Li n gu a ge m d e Pro gra m a o ( Pa rte 6 )
No artigo anterior (quinto artigo desta srie) fora
apresentado o tema relacionado ao uso e
criao de funes. Como prometido este artigo
tratar do tema relacionado ao uso de arquivos.
Alm deste ser tratado tambm alguns
aspectos ainda no mencionado sobre o
ambiente interactivo da linguagem e a obteno
de tamanho de strings.
Ambiente Interactivo
A linguagem de programao Lua possui um
ambiente de trabalho que pode ser usado na
forma interactiva.
Neste modo de operao pode-se realizar
algumas tarefas operacionais. Para tanto, na
linha de comando prompt (modo terminal) do
sistema operacional em uso faa a chamada do
programa lua e accione <Enter>. Neste sentido
ser apresentada uma mensagem de
identificao semelhante a:
Lua 5.1.4
>
print(7.5 + 4.8)
A PROGRAMAR
Lu a Li n gu a ge m d e Pro gra m a o ( Pa rte 6 )
=9.5e2
print(-2 + -3)
print(2 * 3)
print(10 / 4)
print(10 % 4)
print(2 ^ 3)
print(2 + 5 * 3)
print(2 + (5 * 3))
print((2 + 5) * 3)
=0xa
=0xA
=0Xa
=0XA
print(2 + + 3)
A = 2
=2+3
print(A + B)
=2/3
B = 3
=2-3
37
A PROGRAMAR
Lu a Li n gu a ge m d e Pro gra m a o ( Pa rte 6 )
print(#" ")
COr = 2
print(#"Linguagem Lua")
Cor = 3
cor = 4
Cor = 5
cOr = 6
CoR = 7
coR = 8
print(COR)
print(COr)
Arquivos
print(Cor)
print(cor)
print(Cor)
print(cOr)
print(CoR)
print(coR)
for N = 1, 200 do
R = N % 2
if (R == 0) then
ARQ:write(N.."\n")
end
end
38
A PROGRAMAR
Lu a Li n gu a ge m d e Pro gra m a o ( Pa rte 6 )
ARQ:close()
end
ARQ:close()
print(SOMA)
-- fim do programa ARQ02
A PROGRAMAR
Lu a Li n gu a ge m d e Pro gra m a o ( Pa rte 6 )
ARQ:write(REGISTO.."\n")
RESP = string.upper(io.read())
end
ARQ:close()
-- fim do programa ARQ03
for REGISTO in
io.lines("agenda.txt") do
io.write(REGISTO.."\n")
end
ARQ = io.open("agenda.txt","a+")
ARQ:close()
RESP = "S"
NOME = string.upper(io.read())
io.write("Telefone ...: ")
TELE = io.read();
40
A PROGRAMAR
Lu a Li n gu a ge m d e Pro gra m a o ( Pa rte 6 )
ARQ:close()
-- fim do programa ARQ04
Concluso
Neste artigo foi dado ateno as aces de uso
de arquivos em modo texto na linguagem Lua.
Foi tambm fornecido informaes sobre o uso
do ambiente em modo interactivo.
No prximo artigo ser tratado o uso de funes
para acesso em tabelas, escopos de variveis,
descrio de dados, meta-tabelas e orientao a
objectos em Lua.
Errata
ARQ = io.open("agenda.txt","r")
for REGISTO in
io.lines("agenda.txt") do
io.write(REGISTO.."\n")
end
AUTOR
Escrito por Augusto Manzano
Natural da Cidade de So Paulo, tem experincia em ensino e desenvolvimento de programao de
software desde 1 986. professor da rede federal de ensino no Brasil, no Instituto Federal de Educao,
Cincia e Tecnologia. tambm autor, possuindo na sua carreira vrias obras publicadas na rea da
computao.
41
MAC ADDRESS
E s e a m a n h a Ap p l e d o m i n a r?
conceitos...
a Apple fez de um
mercado que no existia
(...) um imprio colossal
que rende milhes de
dlares
O caso do iPod paradigmtico na minha linha
de pensamento: No a criao do hardware,
no a criao do software (que, recordo, foi
Mac only durante um ano e alguns meses...) que
fazem (ou fizeram) a revoluo. a experincia
do utilizador. Pela primeira vez, um ecossistema
permitia ao cliente no "power user", uma
experincia de uso integrada, pacfica e
totalmente tranquila. Esse um dos grandes
capitais da Apple. Colocar no mercado produtos
pensados (verdadeiramente pensados) para o
utilizador comum, que de uma forma tranquila se
vai rendendo aos encantos desse esforo. Sim,
a Apple fez de um mercado que no existia
(Napster. Anyone?), um imprio colossal que
rende milhes de dlares. Artistas, compositores
e msicos querem hoje cortar o "middleman" e
estar de forma directa na Store. Meia dzia de
anos passados, quem se lembra de como eram
as coisas anteriormente?
MAC ADDRESS
E s e a m a n h a Ap p l e d o m i n a r?
AUTOR
Escrito por Pedro Aniceto
Pedro Aniceto, Gestor de Produto Apple desde 1 998 e utilizador da marca desde bem mais cedo. No
acredita em monstros, mas espreita de quando em vez para debaixo da secretria.
43
A PROGRAMAR
S QL e m O ra c l e
Introduo
a lentido de uma
aplicao com acessos
base de dados resulta de
SQL mal construdo ou de
estruturas
de
dados
desadequadas
O tempo de espera na
execuo de uma query
pode
arruinar
uma
aplicao e, em ltima
instncia, uma base de
dados inteira
A PROGRAMAR
SQL e m O ra c l e
1.
4.
a base de dados.
Se repetirmos a mesma
processo ser o seguinte:
1.
2.
query,
de seguida, o
dados
partilhados
pelos
vrios
utilizadores/aplicaes da BD. Armazena dados
no Buffer Cache e instrues SQL na Shared
Pool.
3.
4.
cliente.
A PROGRAMAR
SQL e m O ra c l e
query ->
:nif_n;
query ->
(...)
:nif_n;
select
hash_value,sql_text,
loads, executions
nome,
morada,
telefone
from
parse_calls,
from v$sqlarea
A PROGRAMAR
SQL e m O ra c l e
A utilizao de bind
variables uma prtica
que deve ser adoptada
sempre que possvel
e muitas
Concluso
Uma
parse_calls
AUTOR
Escrito por Ricardo Trindade
actualmente o responsvel pela rea informtica dos Servios Sociais da Cmara Municipal de Lisboa
onde efectua, desde administrao de sistemas, at programao em .NET. Est tambm ligado ao
projecto N-Ideias na rea da consultoria, webdesign e software, trabalhando essencialmente com BD's
Oracle, PostgreSQL e SQL Server.
47
A PROGRAMAR
As p e c to s l o w- l e ve l d e 3 D
Introduao ao 3D
A PROGRAMAR
As p e c to s l o w- l e ve l d e 3 D
Geometry stage
Esta fase recebe os vrtices
3D enviados para a placa
grfica pela fase anterior, e
executa uma srie de
transformaes necessrias
para adaptar estes dados
num formato adequado para
o
processamento
da
prxima fase. Esta a parte
mais importante da pipeline,
e onde so efectuados a
maior parte dos clculos.
Application stage
Tal como o nome implica, a primeira fase ocorre
na aplicao desenvolvida pelo programador, e
processada apenas no CPU. Nesta etapa, so
normalmente processadas tarefas como
deteco de coliso (Collision detection),
animao, simulao de fsica, algoritmos de
acelerao (Space partitioning, Culling), entre
outros, dependendo do tipo de aplicao.
A aplicao tambm responsvel por enviar os
dados dos objectos 3D para a API. Os objectos
em 3D so geralmente representados por
polgonos: tringulos e quadrilteros. Existem
outras formas de representao, como
curvas/superfcies
NURBS
(Non-uniform
Rational B-splines), mas apesar de permitirem a
modelao de alguns tipos de objectos de forma
mais precisa (atravs de modelos matemticos)
precisam de ser convertidas noutras
representaes.
Antes de analisarmos em
mais detalhe cada uma das transformaes
desta etapa, vamos ver o que so espaos de
coordenadas e como so representados os
vrtices.
Em 3D comum utilizarmos vrios espaos de
coordenadas pois faz sentido falar de diferentes
coordenadas dependendo do objecto ou
referncia que estejamos a considerar. Os
espaos fundamentais so denominados por
Model/Object Space, World Space e
Camera/Eye Space, pela ordem que so
processados na pipeline.
Inicialmente um objecto em 3D reside num
espao chamado Model Space, que significa que
49
A PROGRAMAR
As p e c to s l o w- l e ve l d e 3 D
50
A PROGRAMAR
As p e c to s l o w- l e ve l d e 3 D
1.
Model transform, transformao de
Model Space para World Space.
2.
View transform, transformao de World
Space para Camera Space.
3.
Projection transform, transformao de
Camera Space para Clip Space.
A PROGRAMAR
As p e c to s l o w- l e ve l d e 3 D
Projection
Depois de os objectos estarem posicionados no
espao da cmara, necessrio que eles sejam
projectados. A projeco consiste no
mapeamento dos vrtices (em 3D) para um certo
plano com representao bi-dimensional (2D).
Podemos considerar dois tipos de projeces:
A PROGRAMAR
As p e c to s l o w- l e ve l d e 3 D
Rasterizer stage
Viewport Mapping
As APIs grficas normalmente permitem a
definio de uma sub-regio da janela onde o
output final mostrado. Imaginem por exemplo
um jogo de carros, com suporte para 2
jogadores no mesmo ecr (o que os jogos
normalmente chamam de split-screen).
Normalmente o ecr dividido ao meio e
mostrada a rea de jogo de cada jogador em
cada uma dessas regies. Nas APIs grficas,
cada uma dessas regies conhecida por
viewport.
A PROGRAMAR
As p e c to s l o w- l e ve l d e 3 D
54
CORE DUMP
Qu a n d o s e ! Pro d u ti vo
Quem ganha a vida a bater cdigo est
habituado a ver a sua produtividade medida. Por
vezes essa medio no efectuada de forma
correcta e, pior, muitas vezes no sequer
efectuada de forma justa. O resultado , muitas
vezes, uma enorme irritao para com a gesto
por esta se refugiar em frases, quase
infindveis, como Ests quase sempre atrasado
nos prazos de entrega, ou O desenvolvimento
nunca entrega as coisas a tempo e horas.
Se a produtividade
pode ser medida, a
ineficincia tambm
CORE DUMP
Qu a n d o s e ! Pro d u ti vo
56
COMUNIDADE SHAREPOINTPT
C l i e n t O b j e c t M o d e l p a ra S i l ve rl i gh t
crescido a nvel de servio e a nvel de
importncia nas instituies empresariais,
tornando uma aposta mais que decisiva da
Microsoft, com a sua implementao e
integrao de todos os seus produtos nesta
plataforma, tornando-se o sistema operativo das
empresas.
COMUNIDADE SHAREPOINTPT
C l i e n t O b j e c t M o d e l p a ra S i l ve rl i gh t
58
COMUNIDADE SHAREPOINTPT
C l i e n t O b j e c t M o d e l p a ra Si l ve rl i gh t
Mtodo 1 :
ClientContext clientContext =
new ClientContext("http://[Site]");
oWebsite = clientContext.Web;
collList = oWebsite.Lists;
clientContext.Load(oWebsite,
collList.Include(
clientContext.ExecuteQueryAsync(onQuerySuccee
ded, onQueryFailed);
}
ClientRequestFailedEventArgs args)
"\n" + args.StackTrace);
59
COMUNIDADE SHAREPOINTPT
C l i e n t O b j e c t M o d e l p a ra S i l ve rl i gh t
_projectItems
projects.GetItems(camlQuery);
context.Load(_projectItems);
collList = oWebsite.Lists;
listBox1.ItemsSource = listInfo;
}
context.ExecuteQueryAsync(OnRequestSucceeded,
listBox1.DisplayMemberPath = "Title";
null);
}
#region Methods
private
OnRequestSucceeded(Object
Dispatcher.BeginInvoke(BindData);
Mtodo 2:
context
ClientContext("http://[Site]");
new
projects
context.Web.Lists.GetByTitle("Geral");
}
Datagrid
nossa Lista
camlQuery.ViewXml
"<View><Query><Where><Geq><FieldRef
Name='ID'/>" +
Activo
Lista
na
Convert.ToBoolean(li["Activo"].ToString())
context.Load(projects);
Title = li["Title"].ToString(),
Nome = li["Nome"].ToString(),
list.Add(new Geral
{
context.Load(context.Web);
Geral
void
Exemplo:
http://msdn.microsoft.com/enus/library/ee538971 .aspx
});
//adicionar
os
Dados
da
dataGrid1.ItemsSource = list;
"<Value
Type='Number'>0</Value></Geq></Where></Query>
<RowLimit>100</RowLimit></View>";
60
COMUNIDADE SHAREPOINTPT
C l i e n t O b j e c t M o d e l p a ra Si l ve rl i gh t
oListItem["Title"] =
oListItem["Body"] =
oListItem.Update();
clientContext.Load(oList,
list => list.Title);
clientContext.ExecuteQueryAsync(onQueryInsert
Succeeded, onQueryInsertFailed);
}
else
{
}
MessageBox.Show("Vazio!!");
Mtodo 3:
ClientContext clientContext =
new ClientContext(TxtUrl.Text);
clientContext.Web;
oWebsite.Lists;
Web
oWebsite
ListCollection collList =
oList
clientContext.Web.Lists.GetByTitle("Anuncios"
);
oList.AddItem(new
ListItem oListItem =
ListItemCreationInformation());
61
COMUNIDADE SHAREPOINTPT
C l i e n t O b j e c t M o d e l p a ra S i l ve rl i gh t
Concluso
Este foi um pequeno exemplo de como o Client
62
COMUNIDADE SHAREPOINTPT
C l i e n t O b j e c t M o d e l p a ra Si l ve rl i gh t
AUTOR
Escrito por Andr Lage
Microsoft SharePoint MVP, trabalhando na Suia em empresa Farmaceutica e Banca.
Apoiando as diversas Comunidades em SharePoint pelo mundo com participaoes em eventos como
speaker e efectuando artigos com focus nas tecnologias SharePoint. Um dos administradores da
Comunidade Portuguesa de SharePoint, Co-fundada por Rodrigo Pinto, www.Sharepointpt.org. Blog
pessoal http://aaclage.blogspot.com/
63