Professional Documents
Culture Documents
índice
3 notícias
4 tema de capa
11 a programar
25 tecnologia
29 electrónica
35 tutorial
40 gnu/linux
45 eventos
47 análises
49 internet
50 blue screen
51 comunidade
equipa PROGRAMAR
administração
Rui Maia
David Pintassilgo A vida é feita de mudança...e surpresas
coordenador Foi há pouco mais de um ano que este projecto nasceu, fruto da ideia
Miguel Pais mas, principalmente, do trabalho de bastantes utilizadores dos quais,
embora não sendo sempre os mesmos, ainda hoje dependemos para
coordenador adjunto que a cada dois meses possamos lançar aquela que é a única revista
e editor de programação (de carácter generalista) em países de expressão
Joel Ramos portuguesa.
<3>
tema de capa
<4>
tema de capa
Podemos ver nesta imagem uma comparação entre o modelo de transferência de dados com e
sem Ajax.
Vamos começar com um exemplo muito simples e útil de Ajax. Vamos ter um form com input de
texto e cada vez que uma tecla for pressionada e libertada será executada uma função
JavaScript que usa o XMLHttRequest para fazer o pedido de informação ao script PHP. De
seguida é colocada a informação na página principal sem ter de a carregar em cada letra
colocada no input. Primeiro vamos criar o formulário que pode ser feito num simples ficheiro
html.
<html>
<head>
<script src="ajax.js"></script>
</head>
<body>
<form>
Texto:<input type="text" id="txt1" onkeyup="showHint(this.value)">
</form>
<p>
Sugestoes: <span id="sug"></span>
</p>
</body>
</html>
<5>
tema de capa
if (xmlHttp==null){
alert ("O browser não suporta
var xmlHttp
AJAX!");
return;
function MakeXmlHttpObject(){
}
var xmlHttp=null;
var pedido="pedidos.php";
pedido=pedido+"?q="+str;
try{
// XmlHttpRequest para Firefox,
Opera, Safari e derivados.
xmlHttp.onreadystatechange=stateChanged;
xmlHttp = new XMLHttpRequest();
xmlHttp.open("GET",pedido,true);
}
xmlHttp.send(null);
}
catch (e){
o método “ActiveXObject
}
<6>
tema de capa
Nas linhas 31 a 52 temos a função principal // Array com das sugestões possíiveis.
que vai usar as funções anteriormente $a[]="A";
definidas para executar o pedido ao servidor $a[]="AA";
e colocar os dados retornados por este. $a[]="AAA";
Começamos por verificar se foi colocado $a[]="AAAA";
algum carácter no nosso input do form, no $a[]="B";
caso de não ter sido colocado nenhum $a[]="BB";
valor, então o campo das sugestões será $a[]="BBB";
colocado em “branco” (linha 34), no caso $a[]="BBBB";
de ter sido colocado algum valor no input é $a[]="C";
executado o método “MakeXmlHttpObject”, $a[]="CC";
para criar o XMLHttpRequest Object (linha $a[]="CCC";
38), caso este retorne null então será emitido $a[]="CCCC";
um alert e termina a função (linhas 40 a 43), $a[]="D";
caso contrário é construído o pedido que $a[]="DD";
neste caso será para o método GET. $a[]="DDD";
$a[]="DDDD";
Nas linhas 45 e 46 vemos que o pedido é $a[]="E";
constituído pelo URL da página à qual o $a[]="EE";
pedido vai ser feito, juntamente com o valor $a[]="EEE";
contido no input box; o próximo passo (linha $a[]="EEEE";
48) é dizer que a função deve ser executada
<7>
tema de capa
<8>
tema de capa
<9>
tema de capa
(linha 58).
$d[]="Lisboa";
$d[]="Setubal";
<10>
tema de capa
elseif($r == 4){
for($i=0; $i<count($d); $i++){
$cidades .= "<option>$d[$i]</option>";
}
}
echo $cidades;
?>
Tal como no ficheiro pedido.php começamos por recolher a região enviada, em seguida
usamos a função sleep em condições normais esta função não seria usada, a sua função
neste caso é a de apenas colocar o script a “dormir” durante uns segundos de forma a que a
imagem de loading apareça, visto que neste exemplo sem esta função o tempo de loading
será quase nulo. Em seguida são definidos três arrays, cada um destes arrays corresponde a
uma região e cada um tem nomes de cidades pertencentes a essa região, para finalizar o
processo dependendo do array selecionado são criadas options para colocar na combo box
“cidade” e envia sob forma de uma String. .
Os exemplos aqui apresentados podem ser visualizados e/ou descarregados em
http://www.wmagician.hf-tuga.net/Ajax/
Para complementar o artigo vamos agora ver a "API" do XMLHttpRequest Object. Começamos
com por ver a tabela de métodos disponíveis: .
Método Descrição
abort () Cancela o pedido actual.
getAllResponseHeaders () Retorna todas as headers HTTP sob a forma de uma
getResponseHeader( header ) String.
open( método, URL , async ) Retorna o valor de uma header HTTP dada.
Atribui o método, URL e o modo de pedido.
Método pode ser GET, POST, HEAD, PUT, DELETE.
URL pode ser qualquer endereço absoluto ou relativo.
Modo (async) pode ser true para assíncrono ou false
para síncrono.
send( conteúdo ) Envia o pedido.
setRequestHeader( nome, valor ) Adiciona o par nome/valor como Header HTTP ao
pedido.
Agora a tabela de propriedades do objecto.
Propriedade Descrição.
onreadystatechange Contém a referêencia à função a ser executada a
cada vez que o estado muda.
readyState Retorna o estado actual do pedido 0,1,2,3,ou 4.
responseText Retorna a resposta sob forma de String
responseXML Retorna a resposta sob forma de XML.
status Retorna o código HTTP do estado, (404 para "NOT
FOUND") ou (200 para "OK")
statusText Retorna o estado do pedido como String. "OK" ou "NOT
Fábio Correia
FOUND".
E assim termina este artigo. A partir deste momento já tem bases para criar aplicações Ajax -
PHP; para a frente é usar a imaginação.
<11>
a programar
Framework
CakePHP
Instalação
A primeira coisa a ser feita é verificar a
configuração do arquivo httpd.conf do
Apache para activar o mod_rewrite. Para
activar basta descomentar as seguintes
linhas (nalguns casos pode estar já activo,
nesse caso deve passar-se ao passo
O que é o CakePHP?
seguinte):
Vantagens de utilizar o
CakePHP
AllowOverride All
Requisitos
• Este artigo é baseado na versão
1.1.14.4797 do CakePHP, a última versão
estável na data da escrita do artigo. Para
fazer download visite
http://www.cakephp.org/ . Repare na imagem acima que apenas
• Servidor Apache, PHP e MySQL. coloquei a pasta do CakePHP na minha
pasta revistaphp.
<12>
a programar
<13>
a programar
Desenvolvendo a nossa
{
aplicação
var $default = array('driver' =>
'mysql',
'connect' => 'mysql_connect',
'host' => 'localhost',
'login' => 'cakeBlog', Vamos agora criar os nossos ficheiros.
Começamos por criar um ficheiro chamado
'password' => 'c4k3rUl3Z',
post.php que será o nosso modelo.
'database' => 'cake_blog_tutorial',
'prefix' => '');
var $test = array('driver' =>
'mysql', <?php
'connect' => 'mysql_connect', class Post extends AppModel
'host' => 'localhost', {
'login' => 'user', var $name = 'Post';
'password' => 'password', }
'database' => 'project_nametest', ?>
Controllers
ou seja, em tradução literária: Controlador
do Modelo de Visão. Basicamente
relacionam-se os conceitos de Controlo,
Modelo e Visão. Vamos agora criar o arquivo chamado
posts_controller.php que será o nosso
Visão: É a camada de visualização da controlo que deverá estar na pasta
sua aplicação, onde apenas se apresenta /app/controllers ficando assim
o que foi obtido através do controlo. Eu /app/controllers/posts_controller.php.
diria que é o que chega ao utilizador final,
a parte visual, a interface. A visão não
deve ter nenhuma lógica de código,
apenas a exibição dos dados.
<14>
a programar
<?php Views
Vamos agora criar uma pasta chamada
class PostsController extends
Ficheiro index.thtml:
function index(){
$this>set('posts',$this> Post
>findAll());
} <h1>Blog posts</h1>
<p><?php echo $html>link("Add Post",
function view($id) { "/posts/add"); ?>
$this>Post>id = $id; <table>
$this>set('post', $this> Post <tr>
>read()); <th>Id</th>
} <th>Title</th>
<th>Created</th>
function add() { </tr>
if (!empty($this>data)) { <?php foreach ($posts as $post): ?>
if ($this>Post> save($this <tr>
>data)) { <td><?php echo
$this>flash('Your post $post['Post']['id']; ?></td>
has been saved.','/posts'); <td>
} <?php echo $html>
} link($post['Post']['title'],
} '/posts/view/'.$post['Post']['id']);
echo $html>
function edit($id = null) { link('Delete',"/posts/delete/{$post['P
if (empty($this>data)){ ost']['id']}",null,'Are you sure?');
$this>Post>id = $id; echo $html>link('Edit',
$this>data = $this>Post '/posts/edit/'.$post['Post']['id']);?>
>read(); </td>
} else { </td>
if ($this>Post> save($this <td><?php echo
>data['Post'])) { $post['Post']['created']; ?></td>
$this> flash('Your post </tr>
has been updated.','/posts'); <?php endforeach; ?>
} </table>
}
Ficheiro view.thtml:
}
function delete($id) {
$this>Post>del($id); <h1><?php echo
$this>flash('The post with id: $post['Post']['title']?></h1>
'.$id.' has been deleted.', <p><small>Created: <?php echo
'/posts'); $post['Post']['created']?></small></p>
} <p><?php echo
} $post['Post']['body']?></p>
?>
<15>
a programar
<16>
a programar
Clicando na opção Add Post temos o Repare que não fizemos qualquer select, o
seguinte: CakePHP fez tudo por nós, isso é valido para
incluir, editar, apagar, entre muitas outras
opções. Podemos adicionar um novo
post ao nosso blog.
Referências
http://www.cakephp.org
http://bakery.cakephp.org/
http://manual.cakephp.org/
http://en.wikipedia.org/wiki/CakePHP
http://cakephp.blogspot.com/
Carlos Silva
<17>
a programar
<18>
a programar
Começando pelo mais fácil, a variável para processar todos os dados recolhidos
$template_path irá apenas conter a nas funções anteriores. Ou seja, usando as
localização no sistema operativo onde referências lidas com o uso da função
residem os ficheiros que fazem parte do TemplateDefine(), procura por essas mesmas
nosso template. Certifique-se que o referências no código html carregado na
caminho aponta correctamente para a função TemplateLoad() e substitui-as pelo
localização dos ficheiros ou o Sistema conteúdo também obtido através da função
Básico de Templates não irá funcionar TemplateDefine(). O código html processado
correctamente. com novo conteúdo irá ser devolvido pela
função TemplateExport() após a substituição
Seguidamente, temos as variáveis das referências pelo respectivo conteúdo.
$template_html e $template_vars. A
primeira vai armazenar, sem quaisquer No entanto, e como é bem possível que
alterações, todo o código html que a determinado template não necessite de ter
função TemplateLoad() irá posteriormente alguma referência a ser substituída por
obter dos mais diversos ficheiros. Já a conteúdo, esta função possui 2 parâmetros.
segunda, irá armazenar as referências por O primeiro diz-nos qual o template que
nós definidas e o conteúdo pelo qual desejamos processar e o segundo, caso seja
essas referências devem ser substituidas Verdadeiro - pois o seu valor predefinido é
no código html armazenado na primeira Falso - indica que apenas queremos que o
variável. código html seja devolvido sem
necessitarmos de procurar por referências a
Passando agora para as funções, a substituir por conteúdo.
TemplateLoad(), como o próprio nome
indica, serve para carregar os nossos
<19>
a programar
mesmo: funnction
TemplateDefine($references) {
<?php
// Clears the current references
class BasicTemplateSystem { and their content
var $template_html = array();
var $template_vars = array(); $this>template_vars = array();
var $template_path;
// // Saves the content with it's
// Load template html files reference associated
into variables
// foreach ($references as
function $reference => $content) {
TemplateLoad($template) { $this>
template_vars['{'.$reference.'}'] =
// Goes through every $content;
template and loads it }
foreach ($template as $index }
=> $value) {
//
// Just load the template or // Replace references in template
check if we should load it? with saved content
if (is_array($value)) { //
foreach ($value as
$file => $load) { function TemplateExport($template,
// Should we load $getonly = false) {
this template?
if ($load) { // Should we parse the
$this> tempalte references or just get the
template_html[$index] = html?
file_get_contents($this>
template_path.$file); if (!$getonly) {
} // Split the html code
} into lines
} else {
$this> $html_code = $this
template_html[$index] = >template_html[$template];
file_get_contents($this
>template_path.$value); $html_code = explode("\n",
} $html_code);
} $line_count =
} count($html_code);
<20>
a programar
conteúdos diferentes.
Utilização da class
return $html_code;
}
}
O próximo passo será copiar todo este classe. Seguidamente, e usando a cláusula
código para um ficheiro, ie: 'template.php'. New, criamos um novo objecto que irá
englobar todas as variáveis e funções que a
Conteúdo com referências classe possui. Exemplo:
<21>
a programar
<22>
a programar
Quando a função TemplateExport() fosse procurar por uma ou várias ocorrências das
invocada, apenas as referências últimas referências definidas e substituí-las
{background.color} e {spantext.color} pelo respectivo conteúdo. Após a
seriam substituídas pelo conteúdo a elas substituição de tudo o que for encontrado, a
atribuído. A referência {webpage.title} e o função TemplateExport() devolve o template
seu conteúdo deixam de existir quando html processado.
invocamos pela segunda vez a função
TemplateDefine(). Posto isto, o código final do nosso exemplo
seria o seguinte:
Durante o meu uso deste meu Sistema
Básico de Templates, deparei-me com o
facto de que muitas das referências que
<?php
classe.
'background.color' => "#660000",
'spantext.color' => "#FFFFFF")
substituição das referências pelo conteúdo Copiem o código e guardem num ficheiro,
e ver o resultado. É exactamente isso que por exemplo, 'bts.php', juntamente com os
a função TemplateExport() faz e esta é ficheiros anteriores, 'template.php' e
invocada da seguinte forma: 'exemplo.html', num servidor HTTP com
suporte para PHP e executem-no para testar
esta simples classe para gerir um Sistema
echo $BTS>TemplateExport('exp'); Básico de Templates.
<23>
a programar
práticas): ?>
Conclusão
<ul>
{list.items}
<24>
tecnologia
<25>
tecnologia
O Leitor
O leitor comunica com a etiqueta de
RFID por ondas de rádio e
passa as informações em
formato digital para um
sistema de computador.
De acordo com TELECO
(2005) a antena
encaracolada do leitor cria
um campo magnético com FIG. 2
a antena encaracolada da
etiqueta. A etiqueta retorna
ondas para o leitor. Essas A Antena RFID
ondas são transformadas
pelo leitor em dados
digitais, o código A antena é o elemento condutivo
electrónico do produto. que permite a etiqueta receber e
Na figura 1 visualiza-se um enviar dados para o leitor.
exemplo de leitor RFID em FIG. 1
Tanto o leitor como a etiqueta
barras. RFID possui uma antena RFID,
<26>
tecnologia
Referências
ASK SOLUTION - Obid - Gate solutions for LR200 and LRM200.
COMPUTERWORLD - Porta-voz do Mercado de TI e Comunicação
IBOPE - Número de cartões com chip cresce 204% em 2001
TELECO - RFID: Tecnologia Entendendo a Tecnologia
RFID JOURNAL- The world's RFID Authority, RFID Tags How much information can
an RFID tag store?
<27>
<28>
electrónica
<29>
electrónica
<30>
electrónica
<31>
electrónica
Para a terceira categoria estão reservados Por sua vez, o segundo bloco desta
os três blocos que permitem actuar a categoria permite relacionar as leituras dos
velocidade dos motores: sensores de infravermelhos e LDR’s
• PWM (Modelação da largura de impulso) (resistências que variam com a luz)
dos motores ; existentes no robot, I0, I1, I2, I3, I4, I4, I5 e I6,
com diferentes velocidades para cada uma
das rodas.
• Configuração da PWM com
emissores/receptores (infra-vermelhos) Na verdade, analisando a imagem aqui
. ; apresentada, podemos distinguir no menu
três campos distintos (assinalados a
vermelho). Assim, no topo superior esquerdo
• Configuração da PWM mas com a desta janela (zona identificada com o 1) é
bússola ; apresentada a configuração dos sensores
que se pretende utilizar. Neste caso, a figura
mostra a configuração para a utilização de
I1, I2, I3, I4 e I5. No entanto, se se pretender
Neste sentido, o primeiro bloco representa a utilizar os outros sensores de infravermelhos,
forma mais simples de actuar e regular a teremos de assinalar aqui o sensor
velocidade de ambos os motores, ou pretendido, pois nas etapas seguintes deixa
apenas um. de estar disponível. Por sua vez, na parte
direita da janela, podemos visualizar a
Assim, o programador pode escolher a configuração dos níveis dos sensores (zona
velocidade numa escala de 0 a 255, identificada com o 2). Ora os níveis são
escala esta em que o valor médio equivale basicamente valores de tensão entre 0 e 5V
a ter o motor parado, enquanto os extremos fornecidos pelos sensores e convertidos pelo
representam as velocidades mais elevadas microcontrolador (contém um conversor
para a frente ou para trás, conforme se analógico-digital) em valores entre 0 e 255.
pode visualizar na figura seguinte:
Por outras palavras, depois dos sensores
escolhidos serem lidos, os valores são
comparados com os níveis, sendo
convertidos em binário, zero ou um,
conforme estejam acima ou abaixo do
nível. Neste sentido, se o valor lido for
superior ao valor do nível, neste caso o
bloco considera que o valor do sensor é 1
(actuado), colocando imediatamente os
motores em funcionamento conforme os
personalizaremos na etapa seguinte. Por
outro lado, se o valor lido for inferior ao valor
do nível, então o bloco considera que o
valor do sensor é 0 (inactivo), não
colocando, portanto, os motores em
funcionamento conforme especificado na
PWM.
<32>
electrónica
Por fim, o terceiro campo, situado na parte do meio e inferior esquerda da janela, diz respeito
à configuração da modelação de largura de impulso (PWM). Com efeito, depois dos sensores
serem lidos e obtidos os
valores lógicos, 0 (não
actuado) e 1 (actuado), é
possível tratar todas as
situações, correspondendo à
tabela lógica, até 8 bits. O
utilizador poderá, para cada
uma das situações, programar
a velocidade dos dois
motores. Para introduzir um
novo elemento na lista basta
carregar na opção de
introdução “Novo Elemento”. É aberta
uma nova janela que permite seleccionar
a nova configuração de infravermelhos,
bem como os dois novos valores a serem
enviados para os motores. É de notar que
só se poderá adicionar elementos
utilizando os sensores anteriormente
assinalados. No entanto, é de grande
importância revelar que este tipo de
bloco é apenas uma alternativa mais
simples daquilo que se poderia fazer com
uma série de blocos.
Por exemplo, em vez do bloco específico
de PWM através de infravermelhos
poderíamos substituir, para este caso, por:
<33>
electrónica
<34>
tutorial
<35>
tutorial
RSS.
'item_title' ].'</title>
conteúdos.
}
de RSS.
$value ) {
$this>$key = $value;
}
}
<36>
tutorial
‘$output’.
rss_version.'">
<language>'.$this>
rss_language.'</language> $connection = mysql_pconnect(
'localhost' , 'nome_do_utilizador',
<pubDate>'.$this> 'password' ) or die( mysql_error( )
rss_pubDate.'</pubDate> );
mysql_select_db( 'exemploRSS' ,
<lastBuildDate>'.$this> $connection );
rss_lastBuildDate.'</lastBuildDate> $noticias = mysql_query( 'SELECT *
FROM noticias ORDER BY data_hora
<docs>'.$this> DESC LIMIT 15' , $connection ) or
rss_docs.'</docs> die( mysql_error( ) );
<37>
tutorial
‘header()’.
$myFeed[ 'rss_lastBuildDate' ] =
date("D, d M Y H:i:s T");
http://www.portugal-a-
$myFeed[ 'rss_webmaster' ] =
programar.com/rss.php
'bruno.vaz@netvisao.pt';
$rss>set_item( $myItem );
}
<38>
<39>
gnu/linux
Introdução
Depois de terem escrito o vosso primeiro
A primeira distinção necessária é a de programa em Linux usando o vosso editor
editor versus compilador. favorito (um simples "Olá Mundo" é
suficiente para começar) e de o terem
O editor é o programa que nós usamos guardado no disco, coloca-se a grande
para escrever o nosso código. Existem pergunta: e agora?
milhares de programas que o fazem,
tanto em Windows como em Linux, desde Simples:
os simples gEdit ou Kate aos mais
complexos Vi, eMacs, Joe… a lista é
praticamente interminável.
gcc ola.c o ola
complexo.
E o resultado é imediato:
Do outro lado da barricada, aquele em
que nos vamos concentrar, encontra-se o Ola Mundo
compilador. O compilador é responsável
por transformar o vosso código em algo
interpretável pela máquina. Mas as opções são muitas, as flags de
compilação que podemos usar são
Ao longo do resto do texto vou partir do imensas:
princípio que já programaram em C
antes, pelo menos em Windows.
<40>
gnu/linux
Debugging – o gdb
Entra em acção o gdb.
Começamos por correr o gdb com o
nosso programa (chamei-lhe “ex1”)
Programação é uma arte exacta. Os
comandos produzem um resultado
predefinido, e ao programador só resta
gdb ex1
ordená-los de modo a produzir o efeito Atenção que este passo deve ser dado
desejado. DEPOIS de se compilar o programa
usando a flag -g.
Quando os programas não fazem o que Entramos imediatamente no mundo do
nós esperamos, então começa a fase de gdb, e o programa aguarda as nossas
debugging: vamos percorrer o nosso ordens.
código à procura do erro. Vamos mandá-lo correr o programa.
<41>
gnu/linux
/lib/libc.so.6
(gdb ) run ..
funções chamadas:
x = y;
return 0;
}
<42>
gnu/linux
<43>
gnu/linux
Outras opções:
(gdb) ignore 1 5
Conclusões
Como podem ver, o gdb é uma
ferramenta poderosa, que quando
totalmente dominada pode ser a melhor
arma de um programador.
<44>
eventos
<45>
eventos
(Da esquerda para a direita) Em baixo, Pedro Abreu e Pedro Diogo; Em cima, João Matos e Miguel
Pais, alguns dos participantes membros do portugal-a-programar.
<46>
análises
Web 2.0
Estas tecnologias a que o AJAX se refere são: O uso de AJAX tem duas vantagens
• Apresentações que assentam em “principais”:
predefinições, ou seja, modelos que • Separação dos dados, formatação, do
assentam em XHTML (eXtensible HyperText estilo e da funcionalidade;
Markup Language), ou HTML (HyperText • A vantagem anterior traz consigo outra
Markup Language), e CSS (Cascading associada: a largura de banda usada. Uma
StyleSheets) ; vez que tudo está separado, torna-se mais
• Manipulação dinâmica desses modelos fácil modificar cada coisa. Pode-se
usando o DOM (Document object model); modificar uma imagem, um texto ou um link
• Interacção com o servidor de forma sem ter que o cliente tenha de receber tudo
assíncrona usando o objecto novamente.
XMLHttpRequest do browser, embora
<47>
análises
Mas, todas as rosas têm os seus espinhos: Uma solução para este problema poderá
• Na integração com os browsers, existem ser a “filtração” de user-agents, de forma a
diversos “problemas” ou incómodos. Como mostrar aos crawlers dos motores de busca
o conteúdo que é apresentado é dinâmico páginas completas. Aos invisuais acontece
e, por isso, não é registado no histórico do o mesmo que aos motores de busca. A falta
browser, clicar em retroceder não produz o de dados aquando da aquisição da página
efeito desejado. Para este problema em torna impossível uma leitura por parte dos
específico, são por vezes usadas Iframes browsers especiais deste tipo de pessoas;
invisíveis para registar mudanças para que
ao clicar no retroceder apenas mude essa • A integração de serviços de estatísticas
Iframe, evitando assim incómodos ao 3rd party por vezes não servem as
utilizador. Este método é usado, por necessidades do webmaster devido às
exemplo, no Gmail do Google. Outro actualizações dinâmicas do conteúdo,
incómodo está relacionado com a obrigando-o a escrever o seu próprio
“dependência” de JavaScript para o sistema de estatísticas.
funcionamento da página.
No entanto, estas “tecniquices” suportam
As implementações do JavaScript podem algo mais importante: a partilha de
diferir nos vários browsers, as restrições ao conteúdos e sentimentos. E é isso que a Web
mesmo definidas pelo utilizador ou plugins 2.0 “defende”: uma Internet semântica, com
para o browser (como o NoScript para os significado para nós humanos. No YouTube
browsers da Mozilla) podem limitar a partilhamos um vídeo gravado numa festa
funcionalidade das aplicações; com os amigos, exibimos o nosso desktop
• A latência da rede pode por vezes tornar- ou mostramos o nascimento dos nossos
se mais evidente e incomodativa para o filhos. No del.icio.us partilhamos links para
utilizador quando não existe feedback da uma receita do nosso bolo preferido, para
aplicação, um género de “aviso” de que a opiniões que apoiamos sobre o problema
aplicação está a interagir com o servidor, o da fome em África ou sobre o novo iPhone
que o pode levar a clicar outra vez num da Apple que detestamos. As pessoas
botão, por exemplo, o que vai levar a uma partilham pensamentos e sentimentos pela
segunda chamada ao servidor e pode levar Internet, tal como o fazem na vida real.
a uma duplicação de dados no servidor,
entre outros problemas; A fronteira entre o real e o virtual, o
• Este tipo de páginas são pouco search conhecimento e a ignorância, cada vez
engine friendly devido à falta de dados mais se torna maius ténue, tudo fruto de
aquando do caching da página pelo ideias, ideias como esta que a Web 2.0
mesmo. representa.
Ler mais:
http://en.wikipedia.org/wiki/AJAX
http://pt.wikipedia.org/wiki/AJAX_%28programa%C3%A7%C3%A3o%29
http://en.wikipedia.org/wiki/Semantic_Web
http://pt.wikipedia.org/wiki/Web_sem%C3%A2ntica
http://en.wikipedia.org/wiki/Web_2.0
David Ferreira
http://pt.wikipedia.org/wiki/Web_2.0
http://www.youtube.com/watch?v=6gmP4nk0EOE
<48>
internet
Factbites
http://www.factbites.com
VodPod
VodPod é um agregador dos vídeos disponibilizados nos diversos sites
existentes para partilha dos mesmos.
http://www.vodpod.com
Shareminer
Uma das mais famosas aplicações na web, este
query builder para o Google facilita a procura de
ficheiros em vários provedores de alojamento de
ficheiros, nomeadamente o RapidShare e o
MegaUpload. Um site obrigatório nos favoritos.
http://www.shareminer.com
<49>
blue screen
Às vezes a informática
torna-se complicada...
A informática chega
mesmo a todos...
A evolução do programador
<50>
comunidade
<51>
Queres participar na revista
PROGRAMAR? Queres integrar este
projecto, escrever artigos e ajudar
a tornar esta revista num marco
da programação nacional?
Vai a
www.revista-programar.info
revistaprogramar
@portugal-a-programar.org
Equipa PROGRAMAR
Um projecto Portugal-a-Programar.org