quarta-feira, 29 de fevereiro de 2012

PostgreSQL - Junção entre tabelas no PostgreSQL

A compreensão da real utilidade da junção de tabelas no estudo de banco de dados, e de que forma isto é feito, é um obstáculo para muitos estudantes. A dúvida mais constante a cerca do assunto é com o comando SQL conhecido como JOIN. Já recebi vários e-mails contendo dúvidas relacionadas a utilização correta dos JOINs. Por isso, o objetivo de hoje é esclarecer com uma seqüência de exemplos os tipos de junções de tabelas possíveis no PostgreSQL.

Para os nossos exemplos utilizaremos uma estrutura de três tabelas simples com alguns dados inseridos. O diagrama abaixo representa o relacionamento entre as tabelas:
Vamos partir para o povoamento das tabelas, em que serão inseridos alguns poucos dados, apenas para a efetuação de nossas consultas:
Tabela cidade
codigo
cidade
subregiao
1
Curitiba
1
2
Sao Paulo
2
3
Guarulhos
2
4
Buenos Aires
4
5
La Plata
4
6
Cordoba
5
7
Los Angeles
6
8
San Francisco
6
9
Orlando
7
10
Miami
7
11
Siena
8
12
Florenca
8
13
Milao
9
14
Yokohama
Null
Tabela subregiao
codigo
subregiao
pais
1
Parana
1
2
Sao Paulo
1
3
Rio Grande do Sul
1
4
Buenos Aires
2
5
Cordoba
2
6
California
3
7
Florida
3
8
Toscana
4
9
Lombardia
4
10
Aquitania
5
11
Borgonha
5
12
Calabria
5
13
Massachussetts
3
14
Chiapas
Null
Tabela País
codigo
pais
1
Brasil
2
Argentina
3
Estados Unidos
4
Italia
5
Franca
6
Noruega
Script SQL para criação das tabelas
Tabela cidade
CREATE TABLE "public"."cidade" (
"codigo_cidade" SERIAL,
"nome_cidade" VARCHAR(50),
"codigo_subregiao" INTEGER,
CONSTRAINT "cidade_pkey" PRIMARY KEY("codigo_cidade")
) WITH OIDS;
Tabela subregiao
CREATE TABLE "public"."subregiao" (
"codigo_subregiao" SERIAL,
"nome_subregiao" VARCHAR(50),
"codigo_pais" INTEGER,
CONSTRAINT "subregiao_pkey" PRIMARY KEY("codigo_subregiao")
) WITH OIDS;
Tabela país
CREATE TABLE "public"."pais" (
"codigo_pais" SERIAL,
"nome_pais" VARCHAR(50),
CONSTRAINT "pais_pkey" PRIMARY KEY("codigo_pais")
) WITH OIDS;
Inserção de dados
INSERT INTO pais (nome_pais) VALUES ('Brasil');
INSERT INTO pais (nome_pais) VALUES ('Argentina');
INSERT INTO pais (nome_pais) VALUES ('Estados Unidos');
INSERT INTO pais (nome_pais) VALUES ('Italia');
INSERT INTO pais (nome_pais) VALUES ('Franca');
INSERT INTO pais (nome_pais) VALUES ('Noruega');
INSERT INTO subregiao ( nome_subregiao, codigo_pais) VALUES ( 'Parana', 1);
INSERT INTO subregiao ( nome_subregiao, codigo_pais) VALUES ( 'Sao Paulo', 1);
INSERT INTO subregiao ( nome_subregiao, codigo_pais) VALUES ( 'Rio Grande do Sul', 1);
INSERT INTO subregiao ( nome_subregiao, codigo_pais) VALUES ( 'Buenos Aires', 2);
INSERT INTO subregiao ( nome_subregiao, codigo_pais) VALUES ( 'Cordoba', 2);
INSERT INTO subregiao ( nome_subregiao, codigo_pais) VALUES ( 'California', 3);
INSERT INTO subregiao ( nome_subregiao, codigo_pais) VALUES ( 'Florida', 3);
INSERT INTO subregiao ( nome_subregiao, codigo_pais) VALUES ( 'Toscana', 4);
INSERT INTO subregiao ( nome_subregiao, codigo_pais) VALUES ( 'Lombardia', 4);
INSERT INTO subregiao ( nome_subregiao, codigo_pais) VALUES ( 'Aquitania', 5);
INSERT INTO subregiao ( nome_subregiao, codigo_pais) VALUES ( 'Borgonha', 5);
INSERT INTO subregiao ( nome_subregiao, codigo_pais) VALUES ( 'Calabria', 5);
INSERT INTO subregiao ( nome_subregiao, codigo_pais) VALUES ( 'Massachussetts', 3);
INSERT INTO subregiao ( nome_subregiao, codigo_pais) VALUES ( 'Chiapas', NULL);
INSERT INTO cidade (nome_cidade, codigo_subregiao) VALUES ('Curitiba', 1);
INSERT INTO cidade (nome_cidade, codigo_subregiao) VALUES ('Sao Paulo', 2);
INSERT INTO cidade (nome_cidade, codigo_subregiao) VALUES ('Guarulhos', 2);
INSERT INTO cidade (nome_cidade, codigo_subregiao) VALUES ('Buenos Aires', 4);
INSERT INTO cidade (nome_cidade, codigo_subregiao) VALUES ('La Plata', 4);
INSERT INTO cidade (nome_cidade, codigo_subregiao) VALUES ('Cordoba', 5);
INSERT INTO cidade (nome_cidade, codigo_subregiao) VALUES ('Los Angeles', 6);
INSERT INTO cidade (nome_cidade, codigo_subregiao) VALUES ('San Francisco', 6);
INSERT INTO cidade (nome_cidade, codigo_subregiao) VALUES ('Orlando', 7);
INSERT INTO cidade (nome_cidade, codigo_subregiao) VALUES ('Miami', 7);
INSERT INTO cidade (nome_cidade, codigo_subregiao) VALUES ('Siena', 8);
INSERT INTO cidade (nome_cidade, codigo_subregiao) VALUES ('Florenca', 8);
INSERT INTO cidade (nome_cidade, codigo_subregiao) VALUES ('Milao', 9);
INSERT INTO cidade (nome_cidade, codigo_subregiao) VALUES ('Yokohama', NULL);
A junção de tabelas ocasiona uma tabela derivada de outras duas tabelas (reais ou derivadas), de acordo com as regras do tipo de junção. No PostgreSQL as junções são classificadas como sendo qualificadas ou cruzadas.
Junções cruzadas
SELECT * FROM Tabela1 CROSS JOIN Tabela2

Cada linha de Tabela1 irá combinar-se com todas as linhas de Tabelas2. Para cada combinação de linhas de Tabela1 e Tabela2, a tabela derivada conterá uma linha com todas as colunas de Tabela1 seguidas por todas as colunas de Tabela2. O número de linhas retornadas por esta consulta sempre será o número de linhas de Tabela1 multiplicado pelo número de linha de Tabela2. Por exemplo, se Tabela1 possuir 20 linhas e Tabela2 possuir 10 linhas, será retornado 200 linhas. A consulta
SELECT * FROM cidade CROSS JOIN subregiao de nosso exemplo retornará 196 linhas.
É óbvio que destas 196 linhas retornadas a maioria pode ser considerada inútil, portanto, devemos selecionar os nossos dados através de condições para nossa consulta. Essas condições são adicionadas através de cláusula WHERE.
SELECT * FROM cidade CROSS JOIN subregiao WHERE cidade.subregiao = subregiao.codigo
Como é perceptível, o uso de CROSS JOIN permite a junção de apenas duas tabelas. No entanto, nosso exemplo precisa juntar três tabelas, para isso, teremos que primeiro unir duas tabelas, para que o resultado desta junção seja utilizado com a terceira tabela.
SELECT * FROM cidade CROSS JOIN (subregiao CROSS JOIN pais).
Utilizar SELECT * FROM cidade CROSS JOIN subregiao equivale a utilizar SELECT * FROM cidade, subregiao, tanto uma como outra retornará as mesmas 196 linhas e utilizar SELECT * FROM cidade CROSS JOIN (subregiao CROSS JOIN pais) equivale a SELECT * FROM cidade, subregiao, pais, ambas retornarão as mesmas 1176 linhas.
Junções Qualificadas
As junções qualificadas trazem um pouquinho mais de complexidade e são divididas em junções internas e externas. Na utilização de junção qualificada, se não for especificado como junção interna ou externa, por padrão o PostgreSQL considera como sendo interna.
Junções internas
A utilização da cláusula INNER é o que caracteriza o comando para uma junção interna, porém, ele não é obrigatório. Pode parecer à primeira vista que as junções internas se equiparam com as junções cruzadas vistas anteriormente, até por que as duas consultas a seguir são equivalentes:
SELECT * FROM cidade CROSS JOIN subregiao
SELECT * FROM cidade INNER JOIN subregiao ON TRUE
Mas nas junções internas é sempre obrigatória a especificação de condição de junção, ou seja, quais linhas de uma tabela têm alguma ligação com a linha de outra tabela. Para isso podemos utilizar uma das cláusulas ON ou USING ou utilizar a palavra NATURAL no nosso comando.
A cláusula ON é o mais comumente utilizado por se assemelhar com a cláusula WHERE, ou seja, um par de linhas de Tabela1 e Tabela2 são correspondentes, se a expressão da cláusula ON produz um resultado verdade (true) para este par de linhas.
SELECT * FROM cidade INNER JOIN subregiao ON
cidade.codigo_subregiao = subregiao.codigo_subregiao
codigo_
cidade
nome_
cidade
codigo_
subregiao
codigo_
subregiao_1
nome_subregiao
codigo_
pais
1
Curitiba
1
1
Parana
1
2
Sao Paulo
2
2
Sao Paulo
1
3
Guarulhos
2
2
Sao Paulo
1
4
Buenos Aires
4
4
Buenos Aires
2
5
La Plata
4
4
Buenos Aires
2
6
Cordoba
5
5
Cordoba
2
8
San Francisco
6
6
California
3
7
Los Angeles
6
6
California
3
9
Orlando
7
7
Florida
3
10
Miami
7
7
Florida
3
11
Siena
8
8
Toscana
4
12
Florenca
8
8
Toscana
4
13
Milao
9
9
Lombardia
4
A cláusula USING traz alguma semelhança com o ON, por também retornar um valor verdadeiro ou falso para aquele conjunto de linhas, no entanto, ele é uma forma mais rápida e abreviada de criação da consulta. Passando um nome de coluna, a execução desta consulta irá procurar nas tabelas a coluna especificada e comparar as duas. Por exemplo, t1 INNER JOIN t2 USING (a, b, c) equivale a t1 INNER JOIN t2 ON (t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c). Portanto, a consulta anterior equivale à consulta abaixo:
SELECT * FROM subregiao INNER JOIN cidade USING
(codigo_subregiao)
Para facilitar mais, existe a utilização de NATURAL, que nada mais é abreviação de USING. Com NATURAL, a consulta encontrará todas as colunas que tem nomes iguais nas duas tabelas e fará a comparação de igualdade. O exemplo de USING acima equivale ao seguinte:
SELECT * FROM subregiao NATURAL INNER JOIN cidade
Mas cuidado com a utilização de NATURAL, pois, ele vai comparar todas as colunas com nomes iguais, o que pode trazer resultados inesperados quando houver duas colunas com o mesmo nome e estas não tenham nenhuma relação.
Junções Externas
Para representar uma junção externa utiliza-se a cláusula OUTER, no entanto, ela não é obrigatória. O que caracteriza realmente as junções externas são as cláusulas LEFT, RIGHT e FULL. As cláusulas ON, USING e NATURAL valem da mesma forma nas junções internas e externas.
LEFT OUTER JOIN

Primeiro, uma junção interna é realizada. Depois, para cada linha de T1 que não satisfaz a condição de junção com nenhuma linha de T2, uma linha juntada é adicionada com valores nulos nas colunas de T2. Portanto, a tabela juntada possui, incondicionalmente, no mínimo uma linha para cada linha de

T1.
SELECT * FROM subregiao LEFT OUTER JOIN cidade USING (codigo_subregiao)
codigo_subregiao
nome_subregiao
codigo_pais
codigo_cidade
nome_cidade
1
Parana
1
1
Curitiba
2
Sao Paulo
1
2
Sao Paulo
2
Sao Paulo
1
3
Guarulhos
3
Rio G. do Sul
1
Null
Null
4
Buenos Aires
2
4
Buenos Aires
4
Buenos Aires
2
5
La Plata
5
Cordoba
2
6
Cordoba
6
California
3
7
Los Angeles
6
California
3
8
San Francisco
7
Florida
3
9
Orlando
7
Florida
3
10
Miami
8
Toscana
4
11
Siena
8
Toscana
4
12
Florenca
9
Lombardia
4
13
Milao
10
Aquitania
5
Null
Null
11
Borgonha
5
Null
Null
12
Calabria
5
Null
Null
13
Massachussetts
3
Null
Null
Reparem nas linhas destacas acima. As sub-regiões Rio Grande do Sul, Aquitania, Borgonha, Calabria e Massachussets não possuem nenhuma cidade registrada. Em uma consulta normal eles seriam ignorados. Com o uso de LEFT todos as linhas das tabelas da esquerda que não possuem correspondentes na tabela da direita são acrescidas no resultado da consulta.
RIGHT OUTER JOIN
Primeiro, uma junção interna é realizada. Depois, para cada linha de T2 que não satisfaz a condição de junção com nenhuma linha de T1, uma linha juntada é adicionada com valores nulos nas colunas de T1. É o oposto da junção esquerda: a tabela resultante possui, incondicionalmente, uma linha para cada linha de T2.
SELECT * FROM subregiao RIGHT OUTER JOIN pais USING (codigo_pais)
codigo_pais
codigo_subregiao
nome_subregiao
nome_cidade
1
2
Sao Paulo
Brasil
1
3
Rio Grande do Sul
Brasil
1
1
Parana
Brasil
2
4
Buenos Aires
Argentina
2
5
Cordoba
Argentina
3
13
Massachussetts
Estados Unidos
3
6
California
Estados Unidos
3
7
Florida
Estados Unidos
4
9
Lombardia
Italia
4
8
Toscana
Italia
5
10
Aquitania
Franca
5
11
Borgonha
Franca
5
12
Calabria
Franca
6
Null
Null
Noruega
Basicamente, a diferença entre RIGHT e LEFT está na escolha da tabela em que os elementos que não possuem correspondentes serão escolhidos para ser acrescidos no resultado da consulta. Neste exemplo, Noruega não tem nenhuma sub-região cadastrada, mas mesmo assim ele entra no resultado final.

Java Script - Aumentando tamanho da fonte CSS/JavaScript

Fala pessoal! devido o excesso de trabalho, somente agora arranjei tempo pra escrever meu primeiro artigo no MX Masters, que logo logo vai estar bombando de tanto conteúdo.
Neste primeiro exemplo vou relatar uma situação que vivi hoje, quando entreguei um site magnifico à um cliente e o mesmo reclamou que não consegue visualizar as fontes direito, já que tem certos problemas de visão.


Qual webmaster nunca montou um site com um índice de notícias? E quem nunca teve problemas com tamanho de fontes nos textos das notícias? às vezes o tamanho ideal para o layout acaba sendo pequeno demais para quem tem algum prolema de visão. Eu, por exemplo, já estou tendo dificuldades para ler noticias e artigos em alguns sites e preciso aumentar a fonte usando CTRL + “+” para conseguir visualizar melhor.
No entanto, na grande maioria dos casos, quanto aumentamos a fonte de forma “manual”, o layout do site se estraga completamente e algumas imagens ficam totalmente desproporcional ao que site original, já que, ao invés de somente o texto da notícia, todas as fontes são aumentadas, como menu, títulos, índice de noticias, etc, etc, etc…
Sendo assim, neste primeiro artigo iremos ver como se cria uma página, na qual o usuário tem na própria tela do site, uma opção de aumentar a fonte do texto principal da notícia, já que o interessante para nós é justamente o seu conteúdo.
A página que iremos criar utiliza CSS e Javascript (é intessante que você tenha uma noção básica dessas tecnologias). De início iremos fazer com três tamanhos de fonte. Uma padrão, que melhor combina com o layout e outras duas de tamanho superior, para aqueles que tem dificuldades de visão ou preferem não forçar a vista.
Abaixo vai o código de Estilo CSS. Veja que o Body terá a fonte Verdana. No div com id texto, definimos apenas a largura dele, que é de 600px (varia de acordo com seu layout). A classe “fonte1″ será o padrão do texto. Já as classes “fonte2″ e “fonte3″ são as maiores (alternativas):
 
 
<style type="text/css">
<!--
body { font-family: verdana; }
#texto { width: 600px; }.fonte1 { font-size: 12px; }
.fonte2 { font-size: 16px; }
.fonte3 { font-size: 20px; }
-->
</style>
Agora vamos criar os links para o usuário alterar o tamanho da fonte do texto. Vamos utilizar Javascript para que o tamanho da fonte se altere sem atualizar a página.

<span class="fonte1"><a href="#" onclick="TamanhoFonte(1, 'texto')">a</a></span>
<span class="fonte2"><a href="#" onclick="TamanhoFonte(2, 'texto')">a</a></span>
<span class="fonte3"><a href="#" onclick="TamanhoFonte(3, 'texto')">a</a></span>
Quando selecionar um tamanho de fonte nos links do código acima, o link estará chamado uma função Javascript que fará o trabalho de aumentar a fonte instantaneamente. Segue o código para colocar no cabeçalho de sua página:

<script type="text/javascript">
function TamanhoFonte(num, id)
{
document.getElementById(id).className = "fonte"+num;
}
</script>

Para encerrar, vamos criar o DIV com a nossa notícia:
 
<h4>TÍTULO DA NOTÍCIA</h4>
<div id="texto" class="fonte1">
<p>Este é o texto principal da notícia, onde o usuário poderá aumentar o tamanho da fonte através de um simples clique e sem estragar o layout do site. Este é o texto principal da notícia, onde o usuário poderá aumentar o tamanho da fonte através de um simples clique e sem estragar o layout do site. Este é o texto principal da notícia, onde o usuário poderá aumentar o tamanho da fonte através de um simples clique e sem estragar o layout do site.</p>
</div>
Agora, mãos a obra, faça e adapte para o seu site da maneira que ficar melhor em seu layout! Espero que seja útil!

<HTML>
<HEAD>
<TITLE>Script CSS e JavaScript</TITLE><!-- AQUI VAI O CÓDIGO JAVASCRIPT -->
<script type="text/javascript">
function TamanhoFonte(num, id)
{
document.getElementById(id).className = "fonte"+num;
}
</script> 
<!-- AQUI VAI O ESTILO CSS -->

<style type="text/css">
<!--
body { font-family: verdana; }
#texto { width: 600px; }

.fonte1 { font-size: 12px; }
.fonte2 { font-size: 16px; }
.fonte3 { font-size: 20px; }
-->
</style>
</HEAD>
<BODY>

<!-- AQUI VAI OS BOTÕES PARA AUMENTAR O TAMANHO DA FONTE -->
<span class="fonte1"><a href="#" onclick="TamanhoFonte(1, 'texto')">a</a></span>
<span class="fonte2"><a href="#" onclick="TamanhoFonte(2, 'texto')">a</a></span>
<span class="fonte3"><a href="#" onclick="TamanhoFonte(3, 'texto')">a</a></span>

<span class=”fonte1?><a href=”#” mce_href=”#”onclick=”TamanhoFonte(1, ‘texto’)”>a</a></span>
<span class=”fonte2?><a href=”#” mce_href=”#”
onclick=”TamanhoFonte(2, ‘texto’)”>a</a></span>
<span class=”fonte3?><a href=”#” mce_href=”#”
onclick=”TamanhoFonte(3, ‘texto’)”>a</a></span>
<h4>TÍTULO DA NOTÍCIA</h4>

<!-- AQUI VAI O TEXTO DA NOTICIA QUE SERA AUMENTADO-->
<div id="texto" class="fonte1">
<p>Este é o texto principal da notícia, onde o usuário poderá aumentar o tamanho da fonte através de um simples clique e sem estragar o layout do site. Este é o texto principal da notícia, onde o usuário poderá aumentar o tamanho da fonte através de um simples clique e sem estragar o layout do site. Este é o texto principal da notícia, onde o usuário poderá aumentar o tamanho da fonte através de um simples clique e sem estragar o layout do site.</p>
</div>
</BODY>
</HTML>

Dream Waver - Slide show de fotos com efeitos de transição

Olá! Nesta vídeo aula, iremos aprender a desenvolver um slide show de fotos com efeito de transição bem simples de se fazer. Através do Dreamweaver, é criado um controle em flash que você poderá ocultar ou não através das propriedades. Você poderá adicionar quantas fotos quiser, colocar títulos e escolher o tipo de transição.
Além disso, o próprio slide terá um preloader, caso a animação fique um pouco pesada.
Assista à vídeo aula




terça-feira, 28 de fevereiro de 2012

Servidores - Instalando Apache + MySQL + PHP 5 no Windows


1. Download dos itens necessários
Primeiro, faça o download dos programas a serem usados.Quanto ao Apache, usaremos o Apache 1.3.*, visto que na documentação do PHP existe a seguinte recomendação: "Não use Apache 2.0 e PHP em um sistema de produção, seja no Unix ou no Windows" (http://www.php.net/manual/pt_BR/install.apache2.php).


-
Apache: http://httpd.apache.org/download.cgi
- MySQL: http://dev.mysql.com/downloads/
- PHP: http://www.php.net/downloads.php

2. Instalação

- Execute a instalação do Apache e o instale com as configurações padrões. Se quiser, pode escolher outro diretório para a instalação.
- Extraia o MySQL em uma pasta qualquer. Recomendo dentro da pasta onde você instalou o Apache. Ex: C:\Arquivos de Programas\Apache Group\Apache\mysql
- Extraia o PHP 5 na pasta C:\php5

3. Configuração do PHP

Vá para a pasta c:\php5 e copie o arquivo php5ts.dll para a seguinte pasta, de acordo com o seu Windows:
- c:\windows\system (em Windows 9x/Me)
- c:\windows\system32 (em WindowsXP)
- c:\winnt\system32 (para Windows NT/2000)

Copie também o arquivo c:\php5\
libmysql.dll para umas das pastas ditas acima, de acordo com o Windows em uso. Esse arquivo é necessário para o funcionamento do MySQL no PHP.Ainda no c:\php5, renomeie o arquivo "php.ini-dist" para "php.ini" e abra-o. Procure a linha extension_dir = "./" e a altere para extension_dir = "c:/php5/ext/", é o diretório onde ficam as extensões do php (MySQL, Curl, GD, etc). Agora, localize a linha ;extension=php_mysql.dll e tire o ; do início dela. Se quiser também, já aproveite e faça o mesmo na linha ;extension=php_gd2.dll, caso queira a biblioteca GD para a manipulação de imagens.

Salve as alterações e mova o "
php.ini" para a pasta:
- c:\windows (em Windows 9x/Me/XP)
- c:\winnt (para Windows NT/2000)

4. Configuração do Apache

Vá para a pasta onde você instalou o Apache e abra o arquivo conf/httpd.conf em qualquer editor de texto. (Ex: Bloco de Notas).

1º) Localize a linha
#LoadModule unique_id_module modules/mod_unique_id.so e logo abaixo dela adicione:
LoadModule php5_module "c:/php5/php5apache.dll"


2º) Localize a linha
AddModule mod_setenvif.c e logo abaixo, adicione:
AddModule mod_php5.c


3º) Localize
AddType application/x-tar .tgz e logo abaixo, adicione:
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps


4º) Localize:


<IfModule mod_dir.c>
    DirectoryIndex index.html
</IfModule>

E logo ao lado do index.html adicione:
index.php default.php main.php

5. Configuração do MySQL
Não há nada para se configurar no MySQL, você só deve iniciar o mesmo. Vá para a pasta que instalou o MySQL, então abra o bin/mysqld.exe, iniciando o servidor do MySQL.Lembre-se que sempre você terá de iniciar o MySQL. Se não quiser ir na pasta toda vez que iniciar o computador, crie um atalho para o bin/mysqld.exe e coloque no "Iniciar, Programas, Inicializar (ou Iniciar, de acordo com o windows)".

6. Falta pouco!
Agora, vá em "Iniciar, Programas, Apache HTTP Server, Control Apache Server, Restart", para reinicializar o Apache com as alterações feitas. Pronto! Agora você pode tem PHP5 + MySQL em seu Windows!.

Para efetuar um teste, crie um arquivo chamado phpinfo.php, com o conteúdo:
<?
phpinfo
();
?>
e o coloque na pasta htdocs dentro da pasta do Apache. Abra seu navegador e digite http://localhost/phpinfo.php. Se a página abrir com as informações do PHP, significa que tudo deu certo.

Observações: Lembrando que nos caminhos que mostrei, o C:\ deve ser substituído pela letra do HD em que está seu Windows e onde foram instalados os programas. Uso o C:\ no artigo, pois é a letra que é normalmente usada.

Caso queira register_globals no PHP, abra o c:\windows\php.ini, localize a linha "register_globals = Off" e arrume para "register_globals = On". Veja mais aqui: http://www.php.net/manual/pt_BR/security.registerglobals.php

Faça o download do php.ini e do httpd.conf já configurados, você só precisará enviar cada um para as pastas aqui explicadas. Download: http://alfred.auriumsoft.com.br/galeria/arquivos_wamp.zip

SQL Server - Entendendo tabelas temporárias

Olá pessoal! Já deixei de ser “calouro”, pois este é o meu segundo artigo no iMasters. Espero um dia chegar ao centésimo, como o grande Mauro Pichiliani!
Vamos ao que interessa então. Várias e várias vezes já vi desenvolvedores criando tabelas no banco de dados, pois precisavam realizar operações complexas sobre alguns dados e isto não dava pra ser feito apenas com uma instrução SQL. Logo, eles armazenavam estes dados nas tabelas e realizavam operações sobre eles. Não que isto seja errado, contudo estas tabelas ocupam espaço do banco de dados e ficam lá quando não são mais necessárias.
O SQL Server tem um recurso extremamente interessante pra quem tem esse tipo de problema: as tabela temporárias.
Tabelas temporárias são tabelas que existem apenas durante a conexão com o banco de dados.
Ou seja, quando a conexão é encerrada, a tabela é automaticamente eliminada. Resumindo, estas tabelas resolvem o problema do desenvolvedor, que consegue armazenar os dados e não aporrinha o DBA. As tabelas temporárias têm as seguintes características:
- Não são armazenadas no database de produção. Ao invés disso, elas são armazenadas no database de sistemas tempdb; - Seus nomes são iniciados com #; - São visíveis apenas ao usuário da conexão; - São eliminadas quando a conexão é encerrada.
Então vamos à prática!
Todos os comandos de criação, alteração e exclusão da tabela são os mesmos de tabelas normais (CREATE TABLE, ALTER TABLE e DROP TABLE). Por exemplo:
--Criando uma tabela temporária
CREATE TABLE #Temp(Codigo INT NULL, Nome VARCHAR(40) NULL)
Comandos para os dados também são exatamente iguais, ou seja, INSERT, UPDATE, DELETE e SELECT.
--Inserindo um registro na tabela temporária
INSERT INTO #Temp VALUES(1, ‘Lawrence’)
Na figura abaixo são demonstradas algumas das propriedades da tabela temporária. Temos duas conexões no Query Analyser (cada janela aberta no Query Analyser é uma conexão diferente). Na primeira conexão foram executados os comandos acima e realizado um comando SELECT para exibir o conteúdo completo da tabela, o qual retorna apenas a linha inserida. Na segunda conexão foi realizado apenas o comando SELECT, que retornou erro, pois o SQL Server não encontrou a tabela temporária #Temp para aquela conexão.
Outra propriedade interessante a ser mostrada sobre as tabelas temporárias é que elas podem ser criadas com o mesmo nome em conexões diferentes, que uma não interferirá na outra (isso uma tabela normal no banco de dados de produção não pode fazer). Na figura abaixo foi criada a tabela temporária #Temp nas duas conexões e inseridos registros diferentes. Perceba que uma não interfere com a outra.
O SQL Server consegue realizar este controle, pois no banco tempdb não é criada uma tabela simplesmente com o nome #Temp e sim #Temp concatenado com um identificador. Para conferir as propriedades da tabela, basta usar os seguintes comandos:
--Obtendo propriedades da tabela temporária
USE tempdb
EXECUTE SP_HELP #Temp
Para finalizar, existe um caso especial de tabela temporária, dita global. São tabelas que tem as mesmas propriedades de uma tabela temporária normal, contudo várias conexões podem enxergá-las. A única diferença é que seu nome inicia com duplo #. Confira o exemplo na figura.
--Criando uma tabela temporária global
CREATE TABLE ##Tempglobal(Codigo INT NULL, Nome VARCHAR(40) NULL)
Vale lembrar que, como qualquer outra tabela temporária, ela é excluída no momento que a conexão, que a criou, é encerrada.
Bom pessoal, espero que tenham gostado do artigo. No próximo pretendo juntar o de cursores com este em uma aplicação prática. Um grande abraço a todos!

FireWorks - Usando máscara em texto

Olá!
Nesta vídeo aula iremos aprender como usar máscara em um determinado texto, usando a opção Group as mask e convert to paths. O resultado final, ficará como as imagens acima.Aproveite a vídeo aula e use sua imaginação!
Nota: Nas imagens acima, eu incrementei um solid shadow e um texto somente com bordas brancas.
Bom aprendizado!
Assista à vídeo aula
 


Java - Configurando seu ambiente de desenvolvimento

Esta matéria consta em forma escrita e, logo abaixo, sua vídeo aula.
Antes de começar a configuração do software de desenvolvimento que será usado, deverá ser verificado se o SDK (Software Development Kit) do Java está instalado. Normalmente ele é instalado no c:\j2sdk*, onde * é a versão do SDK, mas pode ser que esteja em outro diretório. Caso não esteja, será necessário fazer a instalação deste software.

Para fazer o download do SDK, acesse o site da Sun (http://java.sun.com/j2se/downloads.html). No site, faça a opção pela versão mais atual, depois escolha seu sistema operacional. Após o download instale o SDK para que possamos passar para próxima etapa.
Agora com o SDK já instalado, vamos fazer o download do J2ME Wireless Toolkit (WTK). Acesse a página http://java.sun.com/products/j2mewtoolkit/download-2_2.html e faça o download. Nós vamos tratar nesta matéria a versão 2.2 do WTK.
Execute o arquivo que foi baixado e aceite os termos de uso (é claro se você concordar). Se a instalação do SDK foi feita corretamente o instalador vai achá-lo automaticamente, caso o instalador não ache você poderá escolher o diretório onde foi instalado. No próximo passo escolha o diretório onde será instalado o WTK.
Depois de instalado o J2ME Wireless Toolkit pode ser encontrado em Programas no menu Iniciar. O programa que iremos utilizar é o KtoolBar.
Figura 1 - Menu do WTK
Clicando em Ktoolbar, espere um pouco e esta tela abaixo irá abrir. Você vai perceber que o WTK é um pouco pesado, mas roda bem em um Pentium 3 com 256 de memória.

Figura 2 - Tela principal do Ktoolbar
Esta é a tela principal do KtoolBar. A partir desta tela teremos acesso a várias funcionalidades. Clicando no botão "New Project" iremos criar um novo projeto.
O "Open Project" vai listar projetos existentes e você poderá abri-los. No "Settings" o sistema apresenta uma tela com várias opções de configuração referente ao projeto.
O botão "Build" compila o projeto e o "Run" executa o emulador (Device) selecionado com seu projeto que estiver aberto. Ao clicar em "Clear Console" as mensagens que aparecem na tela de console serão apagadas.
Criando um novo projeto:
Clique no botão "New Project" e escolha o nome do projeto e o nome de sua classe principal.
Figura 3 - Criando um novo projeto
Ao clicar no botão "Create Project" o Ktoolbar irá abrir uma tela de configurações do seu Midlet.
MIDLET
Uma aplicação MIDP (Mobile Information Device Profile) pode receber o nome de MIDlet. O MIDlet é similar a um Applet, pois tem um ciclo de vida em estados que são representados como métodos. O startApp() é a execução do MIDlet, pauseApp() é executado quando se está em espera e destroyApp(boolean uncondition) que verifica a finalização.
A opção Target Plataform vem selecionada com o padrão JTWI (Java Technology for the Wireless Industry).
De acordo com o dispositivo alvo, poderemos alterar essa opção para MIDP 1.0, por exemplo, celulares mais antigos não têm suporte a tecnologias mais novas como o MIDP 2.0.

Figura 4 - Tela de configurações
Num artigo que será apresentado mais tarde iremos abordar em detalhes todas as opções de configuração do WTK. Por hora basta sabermos isto que foi explicado até agora.
Aperte o botão OK. Neste momento foi criada uma estrutura de pastas onde os arquivos do seu sistema ficarão alocados.
Na pasta bin ficarão os arquivos JAR e JAD. Na lib vamos colocar alguns pacotes externos que poderemos utilizar no nosso aplicativo. A pasta res serve para armazenarmos arquivos de recurso como imagens, sons e até vídeos. O código deverá ser colocado na pasta src.
Vamos guardar este projeto que foi criado (HelloImasters) para o próximo artigo onde iremos desenvolver nosso primeiro Midlet.
JAR
JAR (Java Archive) é um formato de arquivo criado pela SUN. Ela se baseou no mesmo formato de compactação de arquivos ZIP, para distribuir aplicações e bibliotecas através de um só arquivo. Em um arquivo de extensão JAR podemos incluir qualquer tipo de arquivo como, por exemplo, suas classes, imagens, sons etc....

JAD
JAD (Java Application Descriptor) é um arquivo de texto que guarda informações sobre o JAR. Ele carrega as configurações do aplicativo. No JAD devemos especificar o tamanho do JAR, a localização com sua URL (Uniform Resource Locators), o fabricante, o nome do aplicativo etc. A partir destes dados, na hora do download do aplicativo para o dispositivo, este aparelho consegue determinar se tem suporte ou não à tecnologia usada no desenvolvimento.
Abrindo um projeto:
Agora podemos voltar ao Ktoolbar e iremos abrir um projeto existente. Clique no botão "Open Project" e escolha Games.

Figura 6 - Lista de Projetos
Com o projeto Games aberto podemos agora rodar o Midlet. Clicando no botão "Run" irá aparecer uma tela com a imagem de um celular. Esta é a tela do emulador onde você ira testar seus aplicativos.
Os emuladores da lista não são celulares reias, porém em breve estarei fazendo um artigo sobre como inserir novos emuladores em seu WTK.

Figura 7 - Tela do Emulador
Na tela acima aparece 3 Midlets de jogos que você poderá manipular através das teclas do emulador. Aproveite e dê uma olhada no código destes Midlets. Com certeza vai ajudar bastante.
Glossário
SDK
Software Development Kit
WTK
J2ME Wireless Toolkit
MIDP
Mobile Information Device Profile
JTWI
Java Techonology for the Wireless Industry
JAR
Java Archive
JAD
Java Application Descriptor
URL
Uniform Resource Locators

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Eagle Belt Buckles