André L. S. Desenvolvimento de Softwares, Tecnologia e Games

30jul/100

INNER JOIN e OUTER JOIN

Se você é um DBA ou trabalha com programação e usa muito banco de dados SQL, este tópico não é você, a menos que não conheça as cláusulas INNER JOIN e OUTER JOIN, muito comuns em SGBDs SQL.

Não sabe o que é SGBD? Os Sistemas de Gerenciamento de Banco de Dados são programas que auxiliam na manipulação dos dados armazenados. O MySQL, PostgreSQL, MS SQL Server ou Oracle, que você tem em sua casa ou empresa, são SGBDs.

Para este tutorial você precisa ter, pelo menos, o conhecimento básico de SQL.

Chega de enrolação, vamos ao que interessa!

INNER JOIN

A cláusula INNER JOIN é usada quando se quer recuperar dados em mais de uma tabela através da igualdade de suas foreign keys.

Por exemplo, pense que você quer criar um programa que sirva como agenda telefônica. Você cadastra as pessoas e os contatos telefônicos, como uma pessoa poderá ter nenhum até N números de telefones, você separa em duas entidades como neste modelo:

Olhando rapidamente você percebe que a entidade TELEFONE tem o atributo NUM_PESSOA que é o número de identificação do registro na entidade PESSOA.

Vamos supor que as tabelas estejam preenchidas com os seguintes registros:

 +----------------------------+  +---------------------------+
 |           PESSOA           |  |         CONTATO           |
 +------------+---------------+  +------------+--------------+
 | NUM_PESSOA | NOME_PESSOA   |  | NUM_PESSOA | NUM_TELEFONE |
 | 1          | José          |  | 1          | 6589-3666    |
 | 2          | Arnaldo       |  | 3          | 9888-6699    |
 | 3          | Maria         |  | 3          | 8956-6666    |
 | 4          | Elverdelando  |  | 2          | 2888-9877    |
 +------------+---------------+  +------------+--------------+

Para recuperar os telefones de uma pessoa você deve usar INNER JOIN, implicitamente ou explicitamente. Vou explicar os dois casos.

O método explícito é usar a cláusula explicitamente (duh!), que é formada por INNER JOIN <tabela filha> ON <atributos de identificação>;, no nosso exemplo:
SELECT nome_completo, num_telefone FROM pessoa INNER JOIN telefone ON pessoa.num_pessoa = telefone.num_pessoa.

Estamos dizendo: "me traga o nome e os números dos telefones da pessoa onde o número da pessoa em TELEFONE seja igual ao número da pessoa em PESSOA".

Na forma implícita você não usa a cláusula INNER JOIN, o tratamento de igualdade é feito na cláusula WHERE. Usando o mesmo exemplo:
SELECT nome_completo, num_telefone FROM pessoa, telefone WHERE pessoa.num_pessoa = telefone.num_pessoa.

Em ambos os casos o resultado será:

 +---------------------------+
 |         CONTATO           |
 +------------+--------------+
 | NOM_PESSOA | NUM_TELEFONE |
 | José       | 6589-3666    |
 | Maria      | 9888-6699    |
 | Maria      | 8956-6666    |
 | Arnaldo    | 2888-9877    |
 +------------+--------------+

"Que simples! Hummmm espera um pouco... Onde está o Elverdelando (que nominho, hein?!)."

Lembra que dissemos ao banco "me traga o nome e os números dos telefones da pessoa onde o número da pessoa em TELEFONE seja igual ao número da pessoa em PESSOA"? Então! O Elverdelando não esta na tabela TELEFONE, por isso não foi retornado no resultado.

Quando você precisar retornar os dados, mesmo não estando na tabela filha, usamos o OUTER JOIN.

OUTER JOIN

A clásula OUTER JOIN tem duas variantes, LEFT OUTER JOIN e RIGHT OUTER JOIN, sendo que estas cláusula devem ser declaradas sempre de maneira explícita. Alguns SGBDs facilitam a utilização do OUTER JOIN te polpando de declarar toda a sintaxe, como é o caso do Oracle que utiliza o símbolo (+) na identificação fraca, mas NÃO É ANSI, ou seja, não funcionará em qualquer SGBD.

Para que apareçam todas as pessoas, inclusive as que não têm número de telefone cadastrado usamos LEFT OUTER JOIN ou RIGHT OUTER JOIN.

A sintaxe é parecida com a INNER JOIN, mudando apenas o nome da cláusula: LEFT[RIGHT] OUTER JOIN <tabela filha> ON <atributos de identificação>;

Assim, faremos...
SELECT nome_completo, num_telefone FROM pessoa LEFT OUTER JOIN telefone ON pessoa.num_pessoa = telefone.num_pessoa
ou então
SELECT nome_completo, num_telefone FROM telefone RIGHT OUTER JOIN pessoa ON pessoa.num_pessoa = telefone.num_pessoa

Em ambos os casos o resultado será:

 +-----------------------------+
 |         CONTATO             |
 +--------------+--------------+
 | NOM_PESSOA   | NUM_TELEFONE |
 | José         | 6589-3666    |
 | Maria        | 9888-6699    |
 | Maria        | 8956-6666    |
 | Arnaldo      | 2888-9877    |
 | Elverdelando |              |
 +--------------+--------------+

Como você pôde perceber, a única diferença entre o LEFT OUTER JOIN e o RIGHT OUTER JOIN é só a indicação de qual é o lado forte do relacionamento, ou seja, em qual lado da cláusula está a tabela que pode não ter valores na tabela filha. No nosso caso, ambos apontando para a tabela PESSOA.

INNER JOIN é muito usado para consulta em banco de dados, quase que totalmente em seu método implícito. Já as cláusulas OUTER JOIN também são usadas, mas não com tanta frequência, posso dizer que é raro encontra-las por aí.

Espero que este tutorial os ajude! ;)

6mai/102

Instalando suporte multi-idioma nos Windows 7 Professional e Home Premium

O suporte multi-idioma é nativo nas edições Enterprise e Ultimate do Windows 7, porém, seguindo este tutorial, você também conseguirá alternar entre os idiomas nas edições Professional e Home Premium.

Primeiro você precisará do Vistalizator. Este aplicativo lhe permite instalar o suporte multi-idiomas em todas as versões do Windows 7 e, como ele é portável, não precisa de instalação. Você pode baixa-lo clicando aqui.

Depois baixe os idiomas para a arquitetura x64 (64 bits) ou x86 (32 bits).

Agora execute o Vistalizator e clique em "Add languages".

Localize o arquivo com o idioma que deseja e clique em "Open".

Aparecerá a mensagem abaixo, então clique em OK para prosseguir.

Em seguida será aberta uma tela com os dados do arquivo e a descrição do idioma, então clique em "Install Language".

Aguarde e processo de extração e instalação.

O Vistalizator exibirá os idiomas instalados na sua máquina e, entre eles, estará o idioma que você escolheu. Selecione-o e clique em "Change language".

Reinicie o sistema e voilá. ;)

Agora você tem um Windows 7 com suporte multi-idioma.

A única coisa ruim que pude perceber até agora é que toda vez que quiser alternar entre os idiomas você precisará usar o Vistalizator, devido as edições Professional e Home Premium não ter esta opção habilitada por padrão.

2mai/102

Solucionando problemas com remoção de HD externo no Windows 7

Algumas vezes tive problemas quando removia meu HD externo usando o Assistente de Remoção de Dispositivos do Windows 7, o mais comum deles era o famoso "Este dispositivo está sendo usado no momento. Feche os programas ou janelas...". Esta mensagem aparecia mesmo com todos os programas fechados.

Depois de checar as configurações do Windows, seus processos e serviços, constatei que o problema estava no serviço "Serviço de compartilhamento de Rede do Windows Media Player", que me obrigava para-lo antes de remover o dispositivo.

Ainda sim, esta solução não me parecia correta, então encontrei a mais adequada. Segue:

O serviço "Serviço de compartilhamento de Rede do Windows Media Player" é responsável por compartilhar seus arquivos de mídia (músicas e vídeos) em sua rede ou internet (como seu próprio nome já diz). Esta configuração é padrão da instalação do Windows 7, então para desabilitar o recurso...

Clique em "Iniciar", na caixa de pesquisa digite "Central de rede e Compartilhamento" e selecione o aplicativo, conforme é exibido na imagem acima

Clique na opção "Escolher opções de grupo doméstico e de compartilhamento"

Agora clique em "Escolha opções de streaming de mídia..."

Altere a opção do item "Programas de mídia neste PC e conexões remotas" para "Bloqueado"

Pronto, a partir de agora você poderá remover seu HD externo ou qualquer outro dispositivo de armazenamento removível sem problemas.

;)

21abr/107

Habilitando a barra do Windows Media Player na barra de tarefas do Windows 7

Infelizmente o Windows Media Player 12, que é instalado junto com o Windows 7, não tem suporte para minimizá-lo como barra de ferramentas da barra de tarefas. Para habilitar a barra, apenas copie um aquivo do Windows Media Player que vem com o Windows Vista. Agora mostrarei como fazer:

1. Você precisará da dll wmpband.dll, que vem com o Windows Vista. Se não tiver, faça o download aqui (contém a dll para 32 e 64 bits);

2. Copie o arquivo (32 ou 64 bits, dependendo do seu Windows) para o diretório onde está instalado o Windows Media Player, no meu caso "C:\Program Files\Windows Media Player";

3. Agora verifique se o serviço "Serviço de Compartilhamento de rede do Windows Media Player" ("Windows Media Player Network Sharing Service" para Windows em inglês) está parado. Para isso clique no menu Iniciar e, na caixa de busca, digite "Serviços" (ou "Services" para Windows em Inglês) e clique no respectivo item da lista. Agora localize o serviço e pare-o, caso esteja rodando.

4. Abra o prompt de comando em modo administrador. Iniciar > Todos os Programas > Acessórios > clique com o botão direito em "Prompt de Comando" e clique em "Executar como Administrador".

5. Digite o comando regsvr32 "C:\Program Files\Windows Media Player\wmpband.dll", substituia o caminho para o local onde o arquivo foi copiado. Espere alguns segundos até aparecer a mensagem:

6. Abra o Windows Media Player e então o minimize-o. Depois clique com o botão direito na barra de tarefas > Barra de Ferramentas > Windows Media Player.

7. E voilá!

Esta característica a Microsoft devia ter mantido nativamente, muita gente que conheço usa este recurso. Só lamentos uncle Bill!

23mar/102

Configurando acesso à internet via proxy em aplicações Java

Hoje tive um problema no meu trabalho onde um client, que roda via prompt de comando (Prompt do DOS), não conseguia acessar o servidor hospedado na internet, isso porque a empresa onde trabalho utiliza proxy.

Depois de algumas tentativas acabei achando duas soluções para resolver o problema de acesso: a primeira foi passar como parâmetros Java as configurações do proxy.

$ java -Dhttp.proxyHost=serv -Dhttp.proxyPort=porta -Dhttp.proxyUser=usu -Dhttp.proxyPassword=senha ClasseJava

-Dhttp.proxyHost = IP ou nome do servidor proxy
-Dhttp.proxyPort = Porta do proxy
-Dhttp.proxyUser = Usuário
-Dhttp.proxyPassword = Senha

Desta forma a classe ClasseJava terá acesso à internet através do proxy.

A outra forma foi inserir as configurações na própria classe:

public static void main(String[] args){
...
System.getProperties().put("proxySet", "true");
System.getProperties().put("http.proxyHost", "serv");
System.getProperties().put("http.proxyPort", "porta");
System.getProperties().put("http.proxyUser", "usuario");
System.getProperties().put("http.proxyPassword", "senha");
...
}

proxySet = Define se passará ou não por um servidor proxy
http.proxyHost = IP ou nome do servidor proxy
http.proxyPortt = Porta do proxy
http.proxyUse = Usuário
http.proxyPassword = Senha

Usando um destes recursos você poderá configurar sua aplicação para acessar à internet através de um proxy.

Espero ter ajudado. Até +! ;)