segunda-feira, 21 de fevereiro de 2011

Como Configurar Vários Domínios no Apache 2

Este artigo ensina como fazer para que seu Apache aceite requisições com um ou mais domínios diferentes. Antes de mais nada, lembre-se de que é preciso que você registre o domínio que você deseja usar e que exista um servidor de DNS, como o Bind, configurado e rodando em seu servidor, de forma que ele intercepte as requisições e as envie para o Apache. O escopo deste artigo é apenas a configuração do Apache, e não a do Bind ou como fazer para pagar e registrar um domínio na internet.
Com a técnica ensinada aqui, você poderá receber em seu servidor requisições para vários domínios (ex: www.dominio1.com.br, www.dominio2.com.br, www.dominio3.com.br, etc.) e processá-las pelo Apache para que as chamadas sejam redirecionadas para a pasta virtual correta (ex: /var/www/site1, /var/www/site2, /var/www/site3). Se não é exatamente isto que você deseja, mas é próximo, ou se é isso e mais um pouco, você pode tentar vasculhar a documentação do Apache 2 sobre a criação de Virtual Hosts, clicando aqui.


  • Pré-Requisitos para a Configuração dos Domínios no Apache

Vamos partir de um exemplo... imagine que desejemos configurar os seguintes domínios:

www.dominio1.com.br para /var/www/site1
www.dominio2.com.br para /var/www/site2
www.dominio3.com.br para /var/www/site2

Consideremos que:

1- Os sites existem e já respondem perfeitamente com os endereços:

[nome de seu servidor]/site1/
[nome de seu servidor]/site2/
[nome de seu servidor]/site3/

2- Os três domínios foram comprados em um serviço de registro de domínios, a fatura está paga e todos já se encontram devidamente registrados;

3- O Bind (ou outro servidor DNS) de seu servidor está funcionando e está configurado para redirecionar as chamadas a estes domínios para seu inocente Apachezinho...

4- No serviço de registro de domínios, você já configurou o uso de seu DNS (nome e IP dos DNS primário e secundário) e já esperou o tempo necessário para a replicação desta informação pela rede.

É claro que estas condições podem ser ligeiramente modificadas de acordo com sua situação, mas, em geral, é isso de que precisamos para começar a trabalhar...


  • Criando o Virtual Host

Para o Apache 2, as diversas configurações a respeito do acesso às pastas virtuais ficam em contêineres <VirtualHost>. Estes contêineres normalmente ficam no arquivo /etc/apache2/apache2.conf. Evidentemente, modificar este arquivo é permitido apenas ao root e as modificações exigem que se reinicie o Apache para tomar efeito.
Cada domínio novo supõe uma nova configuração do VirtualHost, ou seja, um novo contêiner. Assim, para a realização do exemplo, precisaremos de 3 contêineres, um para cada domínio, conforme segue:

<VirtualHost *:80>
ServerName www.dominio1.com.br
ServerAlias dominio1.com.br *.dominio1.com.br
DocumentRoot /var/www/site1
</VirtualHost>

<VirtualHost *:80>
ServerName www.dominio2.com.br
ServerAlias dominio2.com.br *.dominio2.com.br
DocumentRoot /var/www/site2
</VirtualHost>

<VirtualHost *:80>
ServerName www.dominio3.com.br
ServerAlias dominio3.com.br *.dominio3.com.br
DocumentRoot /var/www/site3
</VirtualHost>


O que isso tudo significa?? Vamos por partes...

VirtualHost *:80 - Inicia a tag do contêiner, informando que estamos interessados na porta 80 (protocolo http). Se você, por algum motivo qualquer, usa outra porta, substitua o "80" pela porta desejada. O "*" pode ser substituído pelo IP interno de seu servidor.

ServerName www.dominio1.com.br - Indica o nome do domínio que você deseja configurar. Evidentemente, coloque o domínio que você registrou e que está configurado no Bind.

ServerAlias dominio1.com.br *.dominio1.com.br - Isto garante que quaisquer chamadas a este domínio vão ser redirecionadas para a pasta virtual que está sendo configurada.

DocumentRoot /var/www/site1 - Enfim, a referência no sistema de arquivos para a pasta virtual!! Ou seja, em que canto do disco está o seu portal. Note que, aqui, você só pode especificar uma pasta por VirtualHost. Por isso que necessitamos de três contêineres VirtualHost configurados!!

Se, por algum motivo, esta configuração não funcionar, então experimente acrescentar a linha:

NameVirtualHost *:80

Antes da declaração do primeiro VirtualHost.

Bom, pessoal, esta configuração é razoavelmente simples e indolor. É claro que você pode tornar a sua configuração do VirtualHost muito mais complexa, acrescentando as diversas diretivas suportadas pelo mesmo. Mas isto já seria tema para um novo artigo...
Se gostaram, detestaram, ajudou ou atrapalhou, então COMENTEM!!!

terça-feira, 15 de fevereiro de 2011

Instalando a Suíte Ubuntu Studio no Ubuntu

O Ubuntu Studio nada mais é do que uma modificação do Ubuntu para compreender uma série de programas de áudio, vídeo e multimídia. Assim como o Edubuntu, todos estes programas, seus temas e suas configurações especiais (inclusive o Kernel do Ubuntu Studio) podem ser fácil e seguramente instalados via apt-get, a partir de uma distribuição padrão do Ubuntu ou Kubuntu.
Claro: instalar quilos e quilos de programas que vêm com o Ubuntu Studio via apt-get, além de todas as suas dependências, não é tarefa fácil!! Para diminuir esta tortura, o repositório padrão do Ubuntu tem alguns meta-pacotes que englobam todas as seções do Studio que se deseje instalar!! Este artigo mostra a lista dos meta-pacotes e ensina como instalá-los!!


  • Pacotes e Meta-pacotes do Ubuntu Studio

Um meta-pacote é um pacote que, ao invés de conter um programa ou biblioteca, contém um monte de referências a outros programas, que são computados como dependências. Assim, por ser um pacote vazio, ele na verdade não instala nada, mas exige um monte de dependências que serão forçosamente instaladas ao se instalar o meta-pacote em questão. Esta é uma maneira simples e ágil de se agrupar programas e bibliotecas diferentes em um único pacote.
Abaixo, a lista completa de pacotes e meta-pacotes do Ubuntu Studio. Note que não necessariamente é preciso que se instale todos estes pacotes!! Você pode instalar apenas aqueles que interessam.

ubuntustudio-audio: contém referências para toda a coleção de aplicativos para criação e edição de áudio do Ubuntu Studio.

ubuntustudio-audio-plugins: plugins do projeto LADSPA e DSSI.

ubuntustudio-controls: este de fato não é um meta-pacote, mas um programa mesmo. Trata-se de um configurador gráfico de opções internas de Áudio e Vídeo desenhado especificamente para o Ubuntu Studio.

ubuntustudio-default-settings: pacote com configurações padrão para o Ubuntu Studio e um tema gráfico personalizado para o Desktop (o Ubuntu Studio usa o Gnome por padrão, mas nada impede de utilizar o seu artwork no KDE, se desejado).

ubuntustudio-desktop: todos os aplicativos responsáveis pela parte gráfica do sistema, incluindo o gerenciador de janelas.

ubuntustudio-font-meta: algumas fontes para aprimorar sua experiência no uso dos programas gráficos.

ubuntustudio-gdm-theme: se você usa o Gnome e o GDM (Gnome Desktop Manager) para fazer login, talvez se interesse em instalar um tema personalizado do Ubuntu Studio para o GDM. Desculpe, não existe um equivalente para o KDM...

ubuntustudio-graphics: contém referências para toda a coleção de aplicativos para criação e edição gráfica em 2D e 3D do Ubuntu Studio.

ubuntustudio-icon-theme: contém o tema de ícones padrão do Ubuntu Studio.

ubuntustudio-look: contém referências a todos os pacotes de temas e perfumaria gráfica do Ubuntu Studio (inclusive o de sons ali embaixo). Serve como um atalho para não precisar explicitá-los um por um.

ubuntustudio-menu: instala um menu para o Ubuntu Studio, com submenus "Áudio" e "Vídeo".

ubuntustudio-screensaver: como o próprio nome diz, instala protetores de tela (oriundos do gnome-screensaver).

ubuntustudio-sounds: mais um item de perfumaria: sons personalizados para o Desktop do Ubuntu Studio.

ubuntustudio-theme: configurações do GTK e do Metacity para o visual do Ubuntu Studio.

ubuntustudio-video: contém referências para toda a coleção de aplicativos para criação e edição de vídeos do Ubuntu Studio, incluindo ripadores de DVD.

ubuntustudio-wallpapers: contém lindos panos de fundo para seu ambiente de trabalho do Ubuntu Studio!!


  • Finalmente, Instalando!!

Bom, tenha em mente que a instalação destes pacotes vai obrigar que se baixe e se instale uma enorme quantidade de dependências e que esta operação não é rápida, mesmo que sua conexão seja boa. Portanto, faça a instalação em um momento apropriado. Toda a instalação deve ser feita como root, evidentemente.

Uma sugestão para quem vai utilizar os programas de música e áudio:

apt-get install ubuntustudio-audio ubuntustudio-audio-plugins ubuntustudio-controls ubuntustudio-default-settings ubuntustudio-desktop ubuntustudio-look ubuntustudio-menu ubuntustudio-screensaver
apt-get clean

Uma sugestão para quem vai usar os programas de gráficos e vídeo:

apt-get install ubuntustudio-video ubuntustudio-font-meta ubuntustudio-controls ubuntustudio-default-settings ubuntustudio-desktop ubuntustudio-look ubuntustudio-menu ubuntustudio-screensaver
apt-get clean


Agora é só esperar o comando baixar e instalar tudo isso!! Boa sorte!!

domingo, 13 de fevereiro de 2011

Tutorial Java: Convertendo uma String em Decimal, Hexadecimal ou Octal em Inteiro

Este artigo é um complemento para o artigo anterior desta série: Convertendo Binário, Octal, Hexadecimal em Inteiro em Java. A diferença entre os dois é que, no artigo citado, você precisa saber em qual formato (sistema numérico) o número está (precisa saber se está em decimal, em octal, ou em hexadecimal antes de tentar a conversão). Assim, a conversão seria feita facilmente com sobrecargas dos métodos valueOf ou parseInt, ambos da classe Integer. Este artigo ensina uma técnica para converter uma String em formato numérico desconhecido em um Inteiro.
A técnica apresentada no primeiro artigo pode ser muito útil em cenários como:

  • Leitura de dados de um arquivo XML;
  • Entrada de dados oriundo de interconversões;
  • Entradas específicas para determinados formatos (ex: uma classe que exige forçosamente a entrada de uma String em hexadecimal para a perfeita computação de seus dados, e não só a simples conversão desta String em inteiro);

A técnica apresentada neste artigo é mais flexível e pode ser usada em cenários como:

  • Entrada de dados de um componente gráfico (ex: Swing);
  • Entrada de dados de um formulário Web;
  • Entrada de dados de um arquivo texto sem formatação rigorosa (ex: um CSV);


  • Aferindo o Sistema Numérico de uma String e Convertendo-a em Inteiro

Para situações como esta, a classe Integer tem um método que é uma "mão na roda": o método estático decode(String s). Seu retorno é um Integer carregado com o valor correspondente ao que a String represente. Ele reconhece tanto valores decimais quanto octais e hexadecimais, positivos ou negativos.
Note que, para valores hexadecimais, é preciso informar o "0x" ou "0X" na frente, e para valores octais, o "0" na frente. Isto é necessário para que se cumpra a convenção numérica e que se evite ambigüidades no reconhecimento do sistema numérico empregado (sem isso, um valor como "12" estaria em decimal, octal ou hexadecimal?? Você saberia dizer?? Nem eu!!). Se nada for informado, supõe-se que o valor esteja em decimal. O método pode lançar um NumberFormatException. Esta exceção não é marcada (unchecked), mas pode ser sabiamente capturada.

Exemplo: decodificando uma String em hexadecimal:

String hexadecimal = "0xff";
Integer result = Integer.decode(hexadecimal);
System.out.println(result);

// Resultado:
255

Exemplo: decodificando uma String em octal:

String octal = "010";
Integer result = Integer.decode(octal);
System.out.println(result);

// Resultado:
8

Exemplo: decodificando uma String em decimal:

String decimal = "10";
Integer result = Integer.decode(decimal);
System.out.println(result);

// Resultado:
10


  • Interconvertendo os Dados!!

Como o resultado é sempre um Integer, e não um int (primitivo), ele pode ser igualmente auto-vertido para qualquer formato:

String number = "16";
Integer result = Integer.decode(number);
System.out.println(Integer.toHexString(result));
System.out.println(Integer.toOctalString(result));
System.out.println(Integer.toBinaryString(result));

// Resultado:
10
20
10000


  • Observações

1- Lá em cima eu havia afirmado que a técnica apresentada neste artigo permite a conversão de uma String em formato numérico desconhecido, ou seja, você não precisa saber em que formato ela está. É claro que estou fazendo uma metonímia e, assim, refiro-me não a você, desenvolvedor, mas ao código de seu programa. O mais formal seria: seu programa não precisa saber de antemão em que formato está a String para funcionar corretamente. Isto é uma coisa boa pois permite a aplicação do conceito de ocultamento de Orientação a Objetos. Na verdade, a entrada de dados precisa ser de alguma forma conhecida, para evitar ambigüidades ou para evitar o lançamento de uma exceção. Disto, não há escapatória, infelizmente...

2- Todos os exemplos foram testados e nenhum deles se machucou no processo de feitura deste artigo. :-)

3- Feliz?? Triste?? Este artigo salvou a sua vida (ou seu emprego) ou você agora odeia o Pajé?? Não faz mal, pelo menos COMENTE!!!

quinta-feira, 3 de fevereiro de 2011

Wireless sem funcionar no Ubuntu 10.10

Neste post descrevo o que fiz para colocar minha rede sem fio para funcionar no Ubuntu 10.10.

O dispositivo de rede (Broadcom Corporation BCM4312 802.11b/g LP-PHY (rev 01)) era reconhecido via lspci, mas o networkmanager não mostrava redes para conectar.

Ao invés de usar o driver sta que vem no Ubuntu eu usei o do fabricante. Segui as instruções do próprio fabricante que resumo aqui:

1. Instalar as dependências necessárias:

sudo apt-get install build-essential linux-headers-generic
sudo apt-get build-dep linux

2. Baixar e descompactar o driver do fabricante (o meu é o de 32 bits)

3. Compilar o driver:
make

4. Remover possíveis módulos de drivers anteriores:

sudo rmmod b43
sudo rmmod ssb
sudo rmmod wl

5. Garantir que ssb e b43 não serão mais usados

sudo echo "blacklist ssb" >> /etc/modprobe.d/blacklist.conf
sudo echo "blacklist b43" >> /etc/modprobe.d/blacklist.conf

6. Fazer backup do driver antigo (se é que ele serve para alguma
coisa). É bom confirmar o diretório dele. Na minha máquina estava em
/lib/modules/2.6.35-24-generic/updates/dkms/

mv /lib/modules/2.6.35-24-generic/updates/dkms/wl.ko /lib/modules/2.6.35-24-generic/updates/dkms/wl.ko.orig

7. Copiar o driver compilado para o local correto (verificar o local
em sua máquina):

sudo chown root.root wl.ko
cp wl.ko /lib/modules/2.6.35-24-generic/updates/dkms/

8. Fazer backup do ramfs e gerar um novo:

cp /boot/initrd.img-`uname -r` ~/
sudo update-initramfs -u
sudo reboot

Ao reiniciar a rede já voltou ao normal