Cientistas divididos sobre perigos da recriação do Big Bang

Às 12:06 horas da última terça-feira fez-se História no CERN. 30 de março de 2010 vai ser, para sempre, relembrado como o dia em que o homem recriou, em versão miniaturizada, a explosão que deu origem ao Universo. Alguns cientistas dizem que estas experiências põem em risco a humanidade.

Inspirados pelo sucesso de terça-feira, os investigadores do CERN têm agora como objectivo alargar a experiência até ao momento exacto da criação do Universo. Depois da colisão de partículas à velocidade de 50 embates por segundo, a 30 de março, o centro de investigação na Suíça pretende aumentar o número de colisões para 300 por segundo.

Milhares de cientistas em todo o mundo estão a seguir as colisões que acontecem no LHC, e que são representadas em gráficos multicoloridos nos monitores do CERN. Tendo como propósito aprender mais sobre as partículas subatómicas e o papel que desempenham no Universo, tanto eles como os seus colegas do CERN esperam descobrir matéria negra, que acreditam compor cerca de 25% do Universo. Esta substância é apenas detectável através dos seus efeitos gravitacionais, bem como por meio de radiação.

Procurar matéria negra é perigoso para a humanidade?

O LHC pode, ainda, ajudar a perceber se a matéria negra existe de todo, como explicou John Ellis, citado pelo “Information Week”. “Temos muitas teorias sobre o que podemos vir a encontrar, mas apenas através de experiências é que podemos saber quais estão certas, se é que alguma está!”, afirmou o membro do Grupo Teórico do CERN.

Como acontece, muitas vezes, em experiências inovadoras, alguns investigadores externos, de que fazem eco os teóricos da conspiração, consideram que o CERN está a pôr em risco a humanidade, dado que as colisões a acontecer no LHC criam “mini buracos negros” – versões extremamente reduzidas dos originais gigantes que se encontram no centro de várias galáxias, e que sugam a matéria em seu redor.

Mas os responsáveis pelo LHC põem de parte essa possibilidade. “Os buracos negros que possam surgir a partir das nossas colisões duram uma fracção de segundo antes de se dissolverem. Não são perigo nenhum para a humanidade”, assegurou o físico do CERN, Denis Denegris.

Planos definidos até 2013

Mas a experiência levada a cabo no centro instalado na Suíça não se resume apenas aos acontecimentos dos últimos dias: o projeto, dividido em várias fases, tem já etapas definidas até, pelo menos, 2013. “Estamos a aproximar-nos de fronteiras científicas totalmente novas”, disse James Gillies, porta-voz do CERN, à agência Reuters.

Caso não surjam problemas de maior, a inserção de feixes de prótons no LHC será quase diária até ao final de 2011, altura em que a máquina será preparada para suportar colisões mais poderosas. A partir de 2013, as partículas vão passar a chocar a um total de 14 TeV.

Os resultados podem vir a ser aquilo a que Segio Bertolucci, director de Investigação do CERN, chama “o desconhecido desconhecido”, isto é, aspectos da criação do Universo que se afigurem como uma surpresa total.

O dia seguinte à experiência inédita

Se os acontecimentos de 30 de março foram paradigmáticos, as etapas levadas a cabo um dia depois, quarta-feira, não trouxeram nada de extraordinário. Entretanto, os técnicos aproveitaram para consertar pequenas falhas no Acelerador Atómico de Partículas (LHC na sigla original), semelhantes às que atrasaram o início da experiência em alguma horas na terça-feira.

James Gillies não se mostrou preocupado. “Estamos a avançar progressivamente. Pequenos problemas como estes são normais em projetos desta envergadura”, explicou.

Paralelamente ao aumento do montante de partículas inseridas no LHC, o CERN quer aumentar a informação relativa aos resultados de colisões a sete teravolts (TeV), o que corresponde a 99,99% da velocidade da luz. A essa potência, as colisões de partículas são praticamente uma simulação perfeita dos eventos que aconteceram poucos nano-segundos após o Big Bang, e que levaram à criação das galáxias, estrelas e à vida na Terra – e, quem sabe, noutros pontos do Universo.

Gillies confirmou que o montante total de partículas a inserir no LHC vai ser aumentado de dois de cada vez para 2700 entre os primeiros 18 meses e dois anos da fase “Nova Física” do projeto.

“Vai ser como se fizéssemos cada vez mais carros acelerarem em direções opostas na mesma faixa de uma auto-estrada: haveria cada vez mais choques frontais”, explicou o porta-voz do CERN.

À procura da “partícula de Deus”

De acordo com o comunicado presente na página oficial do CERN, as experiências no LHC vão continuar até se ter recolhido dados suficientes para se poder fazer uma “re-descoberta” do Modelo Standard de Partículas.

Só a partir desse momento, necessário para se poder avançar com a procura de novos modelos da Física, é que as experiências levadas a cabo no LHC terão como objetivo a descoberta do Bóson de Higgs. Conhecido como “a partícula de Deus”, é a partícula hipotética de energia, tida como responsável pela criação do Cosmos através da transformação em massa da matéria gerada pelo Big Bang.

Os especialistas do CERN acreditam que só nessa fase do projeto é que esse elemento será encontrado. A sua descoberta, a acontecer, vai permitir resolver várias inconsistências dos modelos teóricos da física correntes hoje em dia.

Fonte: Jornal de Notícias

Quer comparar preço antes de comprar música?

Lançado há pouco mais de um mês, o site TuneChecker.com promete encontrar o local mais barato para você baixar qualquer música.

Basta digitar o single ou CD em MP3 que se está procurando que ele faz uma busca em algumas das maiores páginas de downloads disponíveis, um banco que conta com nove milhões de faixas.

Por enquanto, iTunes, Amazon, Play, 7digital, HMV, we7, Tesco, Orange e Tunetribe estão na lista, mas a organização do TuneChecker já está em contato com a Sky Songs e o Juno.

O site funciona construindo um banco de dados com os preços, buscando a cada 24 horas as músicas mais populares e algumas das menos conhecidas. O site alerta que pode haver uma pequena diferença de preços dependendo da hora da pesquisa – especialmente porque a iTunes fornece dados a outros sites apenas uma vez por semana.

Uma outra ferramenta de busca é o Top 40 Albuns & Singles. Com dados fornecidos pela Official Charts Company, o TuneChecker elabora o ranking das categorias Pop, RnB, Clássica e Dance. Todo o serviço é gratuito.

Verdadeira Ilha de Lost é descoberta

O Serviço Secreto Britânico acredita ter encontrado a verdadeira Ilha de Lost, um arquipélago remoto que, surpreendentemente, parece ter inspirado a criação do seriado norte-americano.

A descoberta foi feita por acaso, no ato da prisão de piratas somalis que haviam sequestrado um cargueiro norueguês no golfo de Áden. Com os piratas, foi encontrado um mapa que mostrava a localização de uma ilha. Enviados ao local, agentes da SAS, a tropa de elite da Força Aérea inglesa, relataram que a área está sob forte influência de um campo eletromagnético até então desconhecido.

O que mais deixou os agentes perplexos foi a descoberta de destroços de um avião Boeing 737 sem nenhum vestígio de corpo por perto. No avião, havia apenas um caixão, vazio, no compartimento de bagagens. Na ilha, havia ainda um cão da raça labrador com uma coleira em que se lê o nome Vincent.

O coronel John Smith, fã da série Lost, foi quem primeiro atentou para as coincidências. “Em 20 anos de SAS, nunca havia ficado tão assustado”, confessou. Os piratas somalis usavam a ilha como esconderijo. Havia um bunker com uma escotilha no topo e uma sequência de números – 4, 8, 15, 16, 23 e 42. Os militares dizem não saber o que isso significa.

A ilha ainda não foi batizada. Um agente sugeriu o nome “Lost” (“Perdido”, em inglês), mas outro argumentou que isso não fazia sentido, já que a ilha não estava mais perdida. Como ela foi descoberta por militares britânicos, caberá à Rainha Elizabeth II o batismo da ilha.

Dos quatro piratas somalis presos, dois, curiosamente, usavam camisas do Botafogo. Um deles se chamava Paulinho Criciúma, um nome pouco comum na Somália. Eles dançavam ao som do Rebolation quando foram surpreendidos pelos agentes britânicos.

Dentre o material apreendido com os piratas constavam três caixas de CDs do Biquini Cavadão, dezenas de latas de Goiabada Cascão e garrafas vazias de Guaraná Jesus. Um imenso tonel cor de rosa levou o Serviço Secreto Britânico a concluir que o local era usado para fabricação pirata da bebida, que depois seria vendido em camelôs das ruas da Tanzânia.

Caro leitor, esta notícia é um trote de 1º. de abril.

Google, um símbolo de excelência

“Quando você quer dizer que uma empresa é líder em um ramo, você diz que ela é o ‘Google’ daquele ramo. Se você procurar por “*is the Google of *”, você encontrará diversos serviços e empresas comparadas ao Google”, escreve Ionut do Google System Operating, ao criar um post baseado no blog de Chris DiBona, funcionário do Google.

Abaixo estão os resultador que o Ionut encontrou e fazem do Google um modo de comparação:

  • Krugle é o Google dos códigos de programação
  • Baidu é o Google da China
  • YouTube é o Google do Vídeo
  • Michael Arrington é o Google da Web 2.0 (?!)
  • Gamespot é o Google dos Vídeo-games
  • Nero é o Google dos softwares de gravação
  • Winamp é o Google dos MP3 players
  • Technorati é o Google da busca por blogs
  • Flickr é o Google de compartilhamento de fotos
  • Bloglines é o Google dos leitores de RSS
  • Amazon é o Google da venda online de livros
  • ImageShack é o Google de host grátis para fotos
  • TailRank é o Google de rastreador de memes
  • Skype é sempre o Google do VoIP
  • Pandora é o Google da música
  • Honda é o Google dos automakers
  • imdb é o Google dos filmes
  • MySpace é o Google das redes sociais
  • iTunes é o Google do mundo podcasting
  • Lonely Planet é o Google dos livros de guias

Pesquisadores criam sistema de touchscreen na pele

Ainda em fase de pesquisa, o Skinput é uma interface de toque que permitirá a você usar a mão e o antebraço como tela de celular, computador e iPod.

Por que usar smartphones ou aparelhos enormes se o nosso próprio corpo pode ser transformado em touchscreen? Segundo foi publicado no site da New Scientist, uma nova técnica é desenvolvida pela Microsoft e Universidade Carnegie Mellon que usa a mão e o antebraço para comandar e exibir informações de aparelhos eletrônicos.

Batizado de Skinput, o sistema não projeta simplesmente uma tela na pele, mas consegue reconhecer a parte que você tocou. Ele combina duas tecnologias: um detector acústico, que “ouve” o som de baixa frequência produzido pelo toque do dedo na pele, e um projetor do tamanho de um microchip, ambos integrados a uma braçadeira.

Pesquisas identificaram que cada região do antebraço e da mão produz uma característica acústica diferente ao ser tocada. O detector de som contém uma espécie de sensor que reconhece as frequências dos sons do toque na pele e os transforma em impulsos elétricos. Basta colocara braçadeira precisamente na posição correta para a projeção aparecer no local certo e o sistema funcionar.

O desejo dos desenvolvedores é de que o Skinput utilize tecnologia sem fio, como o Bluetooth, para transmitir comandos a vários tipos de dispositivos – iPods, celulares e até computadores.

O trabalho final vai ser apresentado em abril na CHI 2010 – Conferência sobre Fatores Humanos em Sistemas Computacionais -, na cidade de Atlanta, nos Estados Unidos.

Animation: bounce

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Checkbox;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Frame;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Label;
import java.awt.Panel;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.Stroke;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.font.FontRenderContext;
import java.awt.font.GlyphVector;
import java.awt.geom.GeneralPath;
import java.awt.geom.Rectangle2D;
import java.text.NumberFormat;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Bouncer extends JPanel implements Runnable {
private boolean trucking = true;

private long[] previousTimes; // milliseconds

private int previousIndex;

private boolean previousFilled;

private double frameRate; // frames per second

private Image image;

public static void main(String[] args) {
final Bouncer bouncer = new Bouncer();
Frame f = new AnimationFrame(bouncer);
f.setFont(new Font("Serif", Font.PLAIN, 12));
f.setSize(200, 200);
Panel controls = new Panel();
controls.add(bouncer.createCheckbox("Anti.", Bouncer.ANTIALIASING));
controls.add(bouncer.createCheckbox("Trans.", Bouncer.TRANSFORM));
controls.add(bouncer.createCheckbox("Gradient", Bouncer.GRADIENT));
controls.add(bouncer.createCheckbox("Outline", Bouncer.OUTLINE));
controls.add(bouncer.createCheckbox("Dotted", Bouncer.DOTTED));
controls.add(bouncer.createCheckbox("Axes", Bouncer.AXES));
controls.add(bouncer.createCheckbox("Clip", Bouncer.CLIP));
f.add(controls, BorderLayout.NORTH);

f.setVisible(true);
}

// Tweakable variables
private boolean mAntialiasing, mGradient, mOutline;

private boolean mTransform, mDotted, mAxes, mClip;

// ...and the constants that represent them. See setSwitch().
public static final int ANTIALIASING = 0;

public static final int GRADIENT = 1;

public static final int OUTLINE = 2;

public static final int TRANSFORM = 3;

public static final int DOTTED = 4;

public static final int AXES = 5;

public static final int CLIP = 6;

private float[] mPoints;

private float[] mDeltas;

private float mTheta;

private int mN;

private Shape mClipShape;

public Bouncer() {
previousTimes = new long[128];
previousTimes[0] = System.currentTimeMillis();
previousIndex = 1;
previousFilled = false;

mN = 38;
mPoints = new float[mN];
mDeltas = new float[mN];
Random random = new Random();
for (int i = 0; i < mN; i++) {
mPoints[i] = random.nextFloat() * 500;
mDeltas[i] = random.nextFloat() * 3;
}

addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent ce) {
Dimension d = getSize();
for (int i = 0; i < mN; i++) {
int limit = ((i % 2) == 0) ? d.width : d.height;
if (mPoints[i] < 0)
mPoints[i] = 0;
else if (mPoints[i] >= limit)
mPoints[i] = limit - 1;
}
}
});
}

public void setSwitch(int item, boolean value) {
switch (item) {
case ANTIALIASING:
mAntialiasing = value;
break;
case GRADIENT:
mGradient = value;
break;
case OUTLINE:
mOutline = value;
break;
case TRANSFORM:
mTransform = value;
break;
case DOTTED:
mDotted = value;
break;
case AXES:
mAxes = value;
break;
case CLIP:
mClip = value;
break;
default:
break;
}
}

protected Checkbox createCheckbox(String label, final int item) {
Checkbox check = new Checkbox(label);
check.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent ie) {
setSwitch(item, (ie.getStateChange() == ie.SELECTED));
}
});
return check;
}

public void timeStep() {
Dimension d = getSize();
for (int i = 0; i < mN; i++) {
float value = mPoints[i] + mDeltas[i];
int limit = ((i % 2) == 0) ? d.width : d.height;
if (value < 0 || value > limit) {
mDeltas[i] = -mDeltas[i];
mPoints[i] += mDeltas[i];
else
mPoints[i] = value;
}
mTheta += Math.PI / 192;
if (mTheta > (2 * Math.PI))
mTheta -= (2 * Math.PI);
}

public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
setAntialiasing(g2);
setClip(g2);
setTransform(g2);
Shape shape = createShape();
setPaint(g2);

g2.fill(shape);

if (mOutline) {
setStroke(g2);
g2.setPaint(Color.blue);
g2.draw(shape);
}
drawAxes(g2);
}

protected void setAntialiasing(Graphics2D g2) {
if (mAntialiasing == false)
return;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
}

protected void setClip(Graphics2D g2) {
if (mClip == false)
return;
if (mClipShape == null) {
Dimension d = getSize();
FontRenderContext frc = g2.getFontRenderContext();
Font font = new Font("Serif", Font.PLAIN, 144);
String s = "Java Source and Support!";
GlyphVector gv = font.createGlyphVector(frc, s);
Rectangle2D bounds = font.getStringBounds(s, frc);
mClipShape = gv.getOutline(
(d.width - (float) bounds.getWidth()) / 2,
(d.height + (float) bounds.getHeight()) / 2);
}
g2.clip(mClipShape);
}

protected void setTransform(Graphics2D g2) {
if (mTransform == false)
return;
Dimension d = getSize();
g2.rotate(mTheta, d.width / 2, d.height / 2);
}

protected Shape createShape() {
GeneralPath path = new GeneralPath(GeneralPath.WIND_EVEN_ODD,
mPoints.length);
path.moveTo(mPoints[0], mPoints[1]);
for (int i = 2; i < mN; i += 6)
path.curveTo(mPoints[i], mPoints[i + 1], mPoints[i + 2],
mPoints[i + 3], mPoints[i + 4], mPoints[i + 5]);
path.closePath();
return path;
}

protected void setPaint(Graphics2D g2) {
if (mGradient) {
GradientPaint gp = new GradientPaint(0, 0, Color.yellow, 50, 25,
Color.red, true);
g2.setPaint(gp);
else
g2.setPaint(Color.orange);
}

protected void setStroke(Graphics2D g2) {
if (mDotted == false)
return;

Stroke stroke = new BasicStroke(1, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_ROUND, 10, new float[] { 4, 4 }, 0);
g2.setStroke(stroke);
}

protected void drawAxes(Graphics2D g2) {
if (mAxes == false)
return;
g2.setPaint(getForeground());
g2.setStroke(new BasicStroke());
Dimension d = getSize();
int side = 20;
int arrow = 4;
int w = d.width / 2, h = d.height / 2;
g2.drawLine(w - side, h, w + side, h);
g2.drawLine(w + side - arrow, h - arrow, w + side, h);
g2.drawLine(w, h - side, w, h + side);
g2.drawLine(w + arrow, h + side - arrow, w, h + side);
}

public void run() {
while (trucking) {
render();
timeStep();
calculateFrameRate();
}
}

protected void render() {
Graphics g = getGraphics();
if (g != null) {
Dimension d = getSize();
if (checkImage(d)) {
Graphics imageGraphics = image.getGraphics();

imageGraphics.setColor(getBackground());
imageGraphics.fillRect(0, 0, d.width, d.height);
imageGraphics.setColor(getForeground());

paint(imageGraphics);

g.drawImage(image, 0, 0, null);

imageGraphics.dispose();
}
g.dispose();
}
}

// Offscreen image.
protected boolean checkImage(Dimension d) {
if (d.width == 0 || d.height == 0)
return false;
if (image == null || image.getWidth(null) != d.width
|| image.getHeight(null) != d.height) {
image = createImage(d.width, d.height);
}
return true;
}

protected void calculateFrameRate() {
// Measure the frame rate
long now = System.currentTimeMillis();
int numberOfFrames = previousTimes.length;
double newRate;
// Use the more stable method if a history is available.
if (previousFilled)
newRate = (double) numberOfFrames
/ (double) (now - previousTimes[previousIndex]) * 1000.0;
else
newRate = 1000.0 / (double) (now - previousTimes[numberOfFrames - 1]);
firePropertyChange("frameRate", frameRate, newRate);
frameRate = newRate;
// Update the history.
previousTimes[previousIndex] = now;
previousIndex++;
if (previousIndex >= numberOfFrames) {
previousIndex = 0;
previousFilled = true;
}
}

public double getFrameRate() {
return frameRate;
}

// Property change support.
private transient AnimationFrame mRateListener;

public void setRateListener(AnimationFrame af) {
mRateListener = af;
}

public void firePropertyChange(String name, double oldValue, double newValue) {
mRateListener.rateChanged(newValue);
}

}

class AnimationFrame extends JFrame {
private Label mStatusLabel;

private NumberFormat mFormat;

public AnimationFrame(Bouncer ac) {
super();
setLayout(new BorderLayout());
add(ac, BorderLayout.CENTER);
add(mStatusLabel = new Label(), BorderLayout.SOUTH);
// Create a number formatter.
mFormat = NumberFormat.getInstance();
mFormat.setMaximumFractionDigits(1);
// Listen for the frame rate changes.
ac.setRateListener(this);
// Kick off the animation.
Thread t = new Thread(ac);
t.start();
}

public void rateChanged(double frameRate) {
mStatusLabel.setText(mFormat.format(frameRate) + " fps");
}
}

Data Manager – Banco de Dados, Tabelas, Índices, Relacionamentos e Chaves Primárias

Criando um Banco de Dados

Para criar um banco de dados com o Data Manager, execute o Data Manager e selecione a opção File/New Database no menu principal. Um diálogo no padrão Salvar Como será aberto solicitando o nome do arquivo. Informe o nome do banco de dados que deseja criar, por exemplo Controle. A janel Tables/QueryDefs da figura abaixo surge; seu banco de dados já está criado e você está pronto para criar suas tabelas.

Criando uma Tabela

Para criar uma tabela com o Data Manager, proceda da seguinte forma: clique no botão New da janela Tables/QueryDefs e no diálogo Add Table mostrado abaixo.

Siga os seguintes passos:

  1. Informe o nome da tabela na caixa de texto Name
  2. Informe o nome do campo na caixa de texto Field Name
  3. Selecione o tipo de dado apropriado na caixa de combinação Data Type
  4. Digite o tamanho do campo, no caso do tipo Text, na caixa de texto Size
  5. Clique no botão > para incluir o campo na tabela
  6. Repita os passos 2 a 5 até que todos os campos da tabela estejam definidos e clique no botão OK para criá-la.

Alterando a Estrutura de uma Tabela

Para definir propriedades não obrigatórias de uma tabela, clique no botão Design da janela Tables/QueryDefs. O Data Manager abrirá a janela Table Editor, mostrada na figura abaixo.

Na janela Editor você pode:

  • Editar as propriedades de qualquer campo selecionado. Neste caso, os dados existentes serão perdidos.
  • Adicionar e remover campos.
  • Criar, remover e alterar índices.

Para definir as propriedades opcionais dos campos de uma tabela, selecione o campo e clique no botão Edit da janela Table Editor. O Data Manager abrirá a janela abaixo. Basta alterar as propriedades desejadas para o campo editado.

Obs.: O Data Manager não admite a edição de um campo componente de uma expressão de índice ou de um relacionamento. Nestes casos, é obrigatória a remoção do índice ou do relacionamento.

Criando e Editando Índices

A criação de um índice de uma tabela no Data Manager é simples. Basta selecionar a janela Table Editor, clicar no botão Indexes e seguir os passos:

  1. Informar o nome do índice na caixa de texto Index Name
  2. Definir as propriedades do índice, marcando as caixas de verificação apropriadas
  3. Selecionar os campos componentes na caixa de listagem apropriada
  4. Selecionar a ordem do índice, se ascendente ou descendente, clicando no botão de comando indicado

Definindo Relacionamentos

Para visualizar ou definir relacionamentos entre os campos das tabelas de um banco de dados, clique no botão Relations na janela Tables/QueryDefs e siga os passos:

  • Selecione a tabela primária na caixa de combinação Primary Table
  • Selecione a tabela dependente na caixa de combinação Related Table
  • Defina o tipo de relacionamento, selecionando o botão de opção apropriado na caixa de grupo Type
  • Selecione a chave externa na caixa de combinação Select Matching Fields
  • Marque, se for o caso, a caixa de verificação indicando se a integridade referencial dos dados deve ser garantida]

Obs.: Para definir um relacionamento, é indispensável que o campo origem seja a chave primária da tabela primária. Além disso, o campo definido como chave externa deve ser do mesmotipo de dado da chave primária.

Definindo uma Chave Primária

Para definir uma chave primária, selecione o botão Keys (janela Table Editor) e o Data Manager abre o diálogo mostrado na figura abaixo, onde a chave pode ser definida clicando-se e selecionado-a da lista Primary.

Bounce Thread

/**
* @version 1.20 1999-04-25
* @author Cay Horstmann
*/

import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class BounceThread {
public static void main(String[] args) {
JFrame frame = new BounceThreadFrame();
frame.show();
}
}

class BounceThreadFrame extends JFrame {
public BounceThreadFrame() {
setSize(300, 200);
setTitle("Bounce");

addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});

Container contentPane = getContentPane();
canvas = new JPanel();
contentPane.add(canvas, "Center");
JPanel p = new JPanel();
addButton(p, "Start", new ActionListener() {
public void actionPerformed(ActionEvent evt) {
Ball b = new Ball(canvas);
b.start();
}
});

addButton(p, "Close", new ActionListener() {
public void actionPerformed(ActionEvent evt) {
canvas.setVisible(false);
System.exit(0);
}
});
contentPane.add(p, "South");
}

public void addButton(Container c, String title, ActionListener a) {
JButton b = new JButton(title);
c.add(b);
b.addActionListener(a);
}

private JPanel canvas;
}

class Ball extends Thread {
public Ball(JPanel b) {
box = b;
}

public void draw() {
Graphics g = box.getGraphics();
g.fillOval(x, y, XSIZE, YSIZE);
g.dispose();
}

public void move() {
if (!box.isVisible())
return;
Graphics g = box.getGraphics();
g.setXORMode(box.getBackground());
g.fillOval(x, y, XSIZE, YSIZE);
x += dx;
y += dy;
Dimension d = box.getSize();
if (x < 0) {
x = 0;
dx = -dx;
}
if (x + XSIZE >= d.width) {
x = d.width - XSIZE;
dx = -dx;
}
if (y < 0) {
y = 0;
dy = -dy;
}
if (y + YSIZE >= d.height) {
y = d.height - YSIZE;
dy = -dy;
}
g.fillOval(x, y, XSIZE, YSIZE);
g.dispose();
}

public void run() {
try {
draw();
for (int i = 1; i <= 1000; i++) {
move();
sleep(5);
}
catch (InterruptedException e) {
}
}

private JPanel box;

private static final int XSIZE = 10;

private static final int YSIZE = 10;

private int x = 0;

private int y = 0;

private int dx = 2;

private int dy = 2;
}

Banco de Dados: Introdução

Podemos entender por banco de dados qualquer sistema que reúna e mantenha organizada uma série de informações relacionadas a um determinado assunto em uma determinada ordem.

A lista telefônica é um exemplo. Nela, percebemos que todos os dados referentes a uma pessoa estão na mesma linha. A isso chamamos registros.

O tipo ou categoria da informação (nome, telefone, etc.) sobre uma pessoa está separada em colunas, as quais chamamos campos.

Um Sistema Gerenciador de Banco de Dados Relacionais (SGBDR) é usado para armazenar as informações de uma forma que permita às pessoas examiná-las de diversas maneiras.

O Gerenciador Relacional de Bancos de Dados do Visual Basic e do Access é o Microsoft Jet. Ele pertence a uma categoria diferente dos gerenciadores tradicionais, como o Dbase e o Paradox, pois possui características em comum com os bancos de dados cliente-servidor. Tais características comuns são:

  • Todas as tabelas, índices, consultas, relatórios e código são armazenados num único arquivo MDB
  • Os campos de data suportam informação de hora
  • Admite o armazenamento permanente de comandos SQL
  • É possível forçar a integridade referencial entre tabelas
  • Os campos suportam valores nulos (Null)

No Dbase/Clipper, banco de dados significa um arquivo que contém a estrutura de dados (campos) e os dados (arquivo padrão DBF). Para o padrão MDB, este conjunto de dados e sua estrutura denomina-se Tabela.

Portanto, aquilo que o Dbase/Clipper considera um banco de dados, o Access e o Visual Basic consideram como uma tabela.

Podemos então definir tabela como um conjunto de dados dispostos em forma de linhas e colunas. Como exemplo, vejamos a tabela de endereços abaixo:

Nome Endereço Telefone
Carlos Lima Bueno Rua Pindamonhangaba , 1200 226-2356
Carlos Lima Buel Rua Voluntários de São Paulo , 2785 224-1078
Carlos Luiz Moraes Rua D. Pedro II , 123 223-0991

As linhas da tabela são os registros (nome, endereço, telefone) e as colunas são os campos. A interseção de uma linha com uma coluna define um atributo representando um valor do campo. Para a tabela representada acima, a interseção da segunda linha com a coluna nome define o valor do campo nome como Carlos Lima Buel.

Para o Access e o Visual Basic, todos os componentes do sistema estão em um único arquivo com extensão MDB. A este “pacote” consideramos o banco de dados, o qual é um conjunto das tabelas nele contidas.

Logo, quando abrimos um arquivo MDB, temos acesso a todos os componentes do sistema: tabelas, consultas, macros, relatórios, etc. A esses componentes chamamos objetos do sistema e em resumo, podemos descrevê-los a seguir:

Tabelas Onde armazenamos as informações que queremos tratar
Consultas Filtram as informações das tabelas e permitem sua visualização.Geralmente são comandos SQL
Formulários São janelas destinadas à edição e visualização dos dados
Relatórios Organizam os dados de tabelas e consultas de uma maneira que possam ser impressos
Macros Rotinas que automatizam determinadas tarefas sem necessidade de programação (utilizadas no Access)
Módulos Armazenam instruções e comandos da linguagem Access Basic/VBA e permitem melhorar e expandir os recursos do sistema

Obs.: Embora o Visual Basic utilize arquivos padrão MDB, formulários, relatórios e módulos são tratados de forma diferente pelo próprio Visual Basic e, nativamente, o Visual Basic não utiliza Macros. Além disso, no Access e Visual Basic, podemos utilizar outros arquivos além dos arquivos MDB, como arquivos DBF do Dbase/Clipper, arquivos do Paradox, do Btrieve, etc.

Os recursos de definição de dados do mecanismo Jet permitem a criação, a modificação e a exclusão de tabelas, índices e consultas. O Jet também aceita a validação de dados em nível de campo e registro. A integridade de dados tem suporte sob a forma de chaves primárias e integridade referencial entre tabelas.

Para manipulação de dados, o Jet admite o uso da SQL e de objetos de acesso aos dados. Esses objetos permitem ao programador manipular informações contidas no banco de dados através da definição das propriedades dos objetos e pela execução dos métodos associados aos objetos. A tabela abaixo relaciona esses objetos e descreve resumidamente suas funções:

Objeto Descrição
DBengine O objeto que referencia o mecanismo de bancos de dados do Microsoft Jet
Workspace Uma área na qual o usuário pode trabalhar com os bancos de dados
Database Uma coleção de informações organizadas em tabelas, juntamente com informações a respeito de índices e relações sobre as tabelas
TableDef Uma definição da estrutura física de uma tabela de dados
QueryDef Uma consulta armazenada de SQL das informações contidas no banco de dados.
Recordset Uma coleção de registros de informações sobre um único tópico
Field Uma única unidade de informações em um banco de dados
Index Uma lista ordenada de registros em um recordset, baseada em um campo chave definido
Relation Informações armazenadas a respeito do relacionamento entre duas tabelas

O poder da SQL

A linguaguem SQL (Structured Query Language) é uma linguagem de alto nível para manipulação de dados dentro do modelo relacional. Seu objetivo é fornecer uma interface de alto nível ao usuário. É uma linguagem não procedural e não cabe ao usuário definir como o gerenciador de banco de dados executará uma tarefa, mas somente o que ele deve fazer.

Uma instrução SQL consiste de três partes:

  • As declarações de parâmetros
  • A instrução manipulativa
  • As declarações de opções

Para termos uma idéia do seu poder, imagine que temos que atualizar o campo valor em 10% de uma tabela com diversos registros. Na abordagem procedural, teríamos os seguintes passos:

  1. Abrir a tabela
  2. Posicionar o ponteiro no início da tabela
  3. Atualizar o campo valor em 10%
  4. Mover o ponteiro para o próximo registro
  5. Continuar a atualização do campo valor até o final da tabela

O código poderia ter o seguinte aspecto:

Dim db as database
Dim tabela as recordset
set db=workspaces(0).Opendatabase(“c:base.mdb”)
set tabela=db.Openrecordset(“tabela”)
While not tabela.eof

tabela.edit
tabela.valor=tabela.valor*1.10
tabela .update
tabela.movenext

Wend
tabela.close

Agora utilizando uma instrução SQL, teríamos o seguinte trecho de código:

Dim db as Database
Set db=Workspaces(0).Opendatabase(“c:base.mdb”)
db.execute “UPDATE tabela SET valor=valor*1.10”
db.close

Observe a utilização da instrução SQL UPDATE, bem mais simples, não é?
Então, se você não está utilizando a SQL, está trabalhando muito e seu código sofrendo as consequências.

Veja na tabela abaixo um resumo das cláusulas manipulativas e suas finalidades:

Instrução Função
SELECT Obtém um grupo de registros e insere os registros em um dynaset ou em uma tabela
UPDATE Define os valores dos campos de uma tabela em uma atualização
TRANSFORM Cria uma tabela de resumo, utilizando o conteúdo de um campo como cabeçalho de cada coluna
DELETE FROM Remove registros de uma tabela
INSERT INTO Acrescenta um grupo de registros a uma tabela.

Veja alguns exemplos da instrução SELECT:

1) Seleciona os campos “Primeiro nome” e “Sobrenome” de todos os registros da tabela Empregados.

SELECT [Primeiro nome], [Sobrenome] FROM Empregados

2) Seleciona todos os campos da tabela Empregados. Note o uso parâmetro (*) indicando todos os campos da tabela indicada.

SELECT Empregados.* FROM Empregados

3) Conta o número de registros que têm uma entrada no campo “Código postal” e coloca o título Contagem no topo da coluna.

SELECT Count([Código postal]) AS Contagem FROM Clientes

4) Seleciona os campos “Primeiro nome” e “Sobrenome” de cada registro cujo sobrenome seja Pereira.

SELECT [Primeiro nome], [Sobrenome] FROM Empregados WHERE [Sobrenome] = ‘Pereira’

5) Seleciona os campos “Primeiro nome” e “Sobrenome” para Empregados cujos sobrenomes começam pela letra S.

SELECT [Primeiro nome], [Sobrenome] FROM Empregados WHERE [Sobrenome] Like ‘S*’

FROM – indica as tabelas utilizadas como fonte de dados

WHERE – especifica as condições que os registros devem satisfazer para compor o subconjunto de dados.