Wednesday, March 05, 2008

Criando um certificado com autenticação própria para uso em SSL

Aqui iremos gerar um certificado do qual você mesmo é a autoridade certificadora (sigla do inglês CA). Este certificado é extremamente útil para o símples caso que queremos usar SSL, o certificado serve apenas para dizer que você é você. Existem empresas que funcionam como verdadeiros cartórios virtuais, e podem gerar um certificado dito mais confiável para o visitante do seu site. Este certificado pode ser usado para casos onde se deseja apenas criptografar um "canal" entre os visitantes e um certo serviço na web. Eu utilizei este certificado para disponibilizar Trac e Subversion de forma segura na internet para que os colaboradores possam baixar, atualizar e gerenciar os projetos.

Como não posso supôr qual distribuição de Gnu/Linux você está usando, vou assumir aqui que você já tem o OpenSSL instalado.

Gerando a chave privada (sem criptografia):

openssl genrsa -out ssl.key 1024
Generating RSA private key, 1024 bit long modulus
........++++++
.++++++
e is 65537 (0x10001)
Gerando o certificado:

openssl req -new -key ssl.key -x509 -out ssl.crt -days 999
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:
Email Address []:
O campo Common Name é Endereço do qual receberá o certificado, suponhamos o endereço http://www.davirtavares.com, eu colocaria davirtavares.com aqui. No caso de eu ter vários subdomínios, eu poderia criar um "certificado-curinga" ao qual servirá para todos os meus subdomínios, basta trocar/adicionar o subdomínio "*" (asterísco), ficando, neste caso, *.davirtavares.com.

Respondidas as perguntas (das quais algumas são opcionais, e são identificadas por valores-padrão em branco), o certificado será gerado para o período de 999 dias (argumento -days 999, mude para outro valor se quiser).

Você pode (opcionalmente) empacotar esses dois arquivos em um só:

cat ssl.key ssl.crt > ssl.pem

E é só. Em outros artigos eu pretendo mostrar como configurar SSL no Apache e também Trac e Subversion, para você poder ter um ambiente de trabalho em equipe pela internet.

Friday, January 04, 2008

Bancos de Dados

Definição:

Um Banco de Dados é um conjunto de dados estruturados e, habitualmente, gerenciados por um software. Essas estruturas são definidas de acordo com o tipo de banco de dados, veremos aqui o mais comum, o banco de dados Relacional. O banco de dados Relacional trabalha somente com tabelas e relacionamentos entre elas, também são definidas várias outras estruturas mantidas pelo fabricante do software (Funções, Procedimento e Visões, por exemplo).

Uma tabela é uma matriz bidimensional. Compondo linhas e colunas. A forma como os dados (linhas) são organizados é definida pelas colunas. Uma coluna tem basicamente 4 propriedades:

- Nome;
- Tipo;
- Tamanho;
- Se pode assumir valores Nulos;

O Nome de uma coluna é uma seqüência de letras e números que são limitados segundo normas seguidas ou definidas pelo software. Em geral podemos usar a mesma idéia de identificadores em C e Java: composto por letras e números ou "_" e não pode começar com número.

O Tipo de uma coluna especifica o que esta coluna irá guardar. Se é um número, uma seqüência de caractéres ou um valor lógico (1 ou 0). Existem vários tipos, que são basicamente variações de tipos como número inteiro, número com ponto flutuante, seqüências numéricas. O software responsável pelo banco de dados, que é conhecido como SGBD, mantém outros tipos de dados diversos, como tipos Espaciais, usados para guardar informações geométricas sobre uma área, relevo, clima etc.

Além do Banco de Dados Relacional, existe outro nem tão conhecido mas com significativo aumento de uso nos últimos anos, o Banco de Dados Orientado a Objetos, para quem teve a chance de estudar Java (e aprender) isso soa familiar. Basicamente passamos a tratar os dados como instâncias e não mais como símples linhas em uma tabela, os relacionamentos passam a ser melhor tratados por relacionamentos de composição, herança etc.

Meios de Acesso:

Para atualizar ou acessar os dados contidos em um banco de dados, precisamos nos comunicar com o SGBD que mantém, isso era feito de inúmeras. Os fabricantes dos SGBD's criaram e documentavam uma API (Application Programming Interface) de funções e rotinas para acesso ao banco de dados deste fabricante. Isso para um mundo de poucos SGBD's era razoável, mas o mercado cresceu e surgiram várias opções e avanços significativos nos softwares que os utilizavam para aproveitar os benefícios deles (SGBD's).

Como cada fabricante mantinha sua própria API (que faziam a mesma coisa, cada qual com seu respectivo SGBD), foi proposta uma linguagem única de acesso, uma forma que fosse possível acessar qualquer banco de dados em qualquer SGBD que a implementasse, essa linguagem era a SQL (Structured Query Language). Uma linguagem símples e direta, que efetuava as operações básicas de um banco de dados (Inserir, Modificar, Excluir e Consultar). Esta linguagem se tornou um padrão para a indústria do segmento e já foi melhorada diversas vezes e adotada como padrão ANSI.

A linguagem SQL:

Para começar vou começar com algo que sempre vejo associado ao aprendizado de uma nova linguagem... não, não é "Hello, World!"...

Vou começar com um exemplo:
SELECT * FROM contato
Esse último trecho efetua um comando bastante comum em SQL, ele recupera dados (efetua uma consulta, do inglês, query). Neste caso uma tabela contato retornará TODOS os dados para quem estiver solicitando, mas essa consulta tem um problema: posso não querer todos os dados, posso querer somente um que satisfaça uma certa condição:
SELECT * FROM contato
WHERE data_nascimento >= "1990-01-01"
Agora eu usei uma outra expressão, a cláusula "WHERE", que significa, do inglês, "ONDE". Neste caso eu quero todos os registros cujo campo "data_nascimento" seja maior-ou-igual a 01/01/1990 (em SQL, as datas se escrevem da forma AAAA-MM-DD).

As seleções da cláusula WHERE são feitas linha-a-linha, ou seja, para uma linha ser retornada, aquela condição tem que ser satisfeita.
SELECT * FROM contato
WHERE data_nascimento >= "1990-01-01"
ORDER BY data_nascimento DESC
Agora fiz diferente, além dos registros da tabela contato que satisfaçam a condição dada, adicionei mais uma expressão, o "ORDER BY". O "ORDER BY" ordena os registros obtidos pelo SELECT tomando como referência um campo. Neste caso eu solicitei esta ordenação pela data de nascimento (campo data_nascimento). Logo após o "ORDER BY" veio o "DESC", que diz "em ordem decrescente". Eu poderia omitir o "DESC", neste caso seria assumido o "ASC", logo, os registros seriam retornados em ordem ascendente.

A SQL é um assunto bastante extenso e não caberia neste espaço, ficarei devendo para um outro tutorial mais completo. Por enquanto, existem ferramentas em seu próprio computador que você poderia treinar SQL, o Microsoft Access é (quem diria) um SGBD com cara de Excel. Fuçando por lá você poderia achar uma forma de criar tabelas e colocar dados nelas (como no Excel), após isso feito, tabela com dados, tente executar estas contultas que eu mostrei aqui.

Segue a estrutura da tabela que você poderia usar:

Nome: contato
Coluna(1): codigo, tipo inteiro, não-nulo
Coluna(2): nome, texto
Coluna(3): data_nascimento, data
Coluna(4): telefone, texto

Procurem mais sobre SQL no grande portal do saber: Google. Também recomendo os tutoriais (todos, mas neste caso...) de SQL: www.w3schools.com.

Friday, November 23, 2007

Configurando um ambiente de desenvolvimento Verilog no Windows

Mostrarei como ter um ambiente pronto para desenvolvimento em Verilog utilizando versões de conhecidos programas que desempenham o mesmo papel no GNU/Linux.

Softwares necessários:

Eclipse;
VEditor (plugin para edição de Verilog e VHDL no Eclipse);
Icarus Verilog (compilador Verilog);
GTKWave (visualização das ondas geradas nas simulações- arquivos VCD);
GTK+ (Necessário para o GTKWave)
MinGW (conjunto de ferramentas GNU portadas para Windows);

As versões usadas nesse tutorial foram: Eclipse (3.2.2); VEditor 0.5.1; Icarus Verilog (0.8); GTKWave (3.1.1); GTK+ (2.10.13); MinGW (5.1.3). Na dúvida, use exatamente estas versões.

Instale o Eclipse (não falarei como fazer isto aqui), descompacte o VEditor dentro do diretório do Eclipse. Você já poderá editar arquivos do Verilog/VHDL. Porém você ainda não configurou um compilador apropriado.

Faça o download do MinGW e o execute. Nas telas abaixo são mostradas as opções que devem ser selecionadas. Nas outras janelas, deixe a opção padrão.


Selecione "Download and install"


Selecione "Current"


Marque "MinGW base tools" e "MinGW Make"

Agora instale o Icarus Verilog, mantenha as opções padrão que ele oferecer.
O GTKWave vem com uma extensão um tanto incomum no ambiente Windows: a GZ. É um tipo de compactação, como o ZIP. Se não me engano o WinRAR é capaz de descompacta-la, eu sei que o 7-Zip suporta este tipo de arquivo. Resolvido o problema, descompacte este arquivo em um lugar qualquer (sugiro C:\GTKWave). Em seguida, instale o GTK+.

Agora coloque os diretórios do GTKWave e o do Icarus Verilog ("DIRETORIO_IVERILOG\bin") no seu PATH (Botão direito em Meu computador -> Propriedades -> aba "Avançado" -> parte inferior, em "Variáveis de Ambiente". Em "Variáveis do sistema", procure por PATH (ou crie uma nova caso não exista), nesta variável se encontra uma seqüência de diretórios separados por ";". Acrescente os diretórios do GTKWave e do Icarus Verilog e confirme).

Normalmente seu Makefile seria alguma coisa parecida com isso:
compilar:
[TAB]iverilog tb.v ff_jk.v cont_4b.v -o tb
[TAB]./tb
[TAB]gtkwave wave.vcd
No Windows, deve ser:
compilar:
[TAB]iverilog -o tb tb.v ff_jk.v cont_4b.v
[TAB]vvp tb
[TAB]gtkwave wave.vcd
Nem deveria dizer, mas vou: [TAB] é um caractere de tabulação - tecla TAB do seu teclado...

Note que "./tb" passou a ser "vvp tb". Isto se deve ao fato de "tb" ser um script reconhecido nativamente pelo GNU/Linux. Esse script chama automaticamente o "vvp" para iniciar a simulação de "tb". O Windows não reconhece tal recurso, então você terá que chamar o "vvp" passando como argumento o "tb". Este mesmo Makefile funcionará sem problemas no GNU/Linux.

Após criado o Makefile resta apenas configurar o Eclipse para executa-lo.

Na configuração "External Tools", no campo "Location",
clique em "Browse File System..." e procure pelo executável "mingw32-make.exe" em "DIRETÓRIO_MINGW\bin". Conforme figura abaixo:



Acho que é isso. Se não esqueci nada, você poderá realizar simulações em Verilog no Windows.

PS. Notei que nas versões mais recentes do Icarus Verilog o comando $stop() não finaliza apropriadamente a simulação, para resolver este problema, use o comando $finish() no lugar do $stop().

Wednesday, October 17, 2007

Configurando a Pixelview PlayTV Pro Ultra.

Adquiri uma placa de captura de TV modelo Pixelview PlayTV Pro Ultra que funciona rasoavelmente bem no GNU/Linux (Debian 4). Vou mostrar como configura-la.
Esse modelo não tem EEPROM, logo o GNU/Linux não consegue saber que placa ela é... Talvez saiba o chip, mas não sabe exatamente o modelo. Por isso assim que o Debian iniciar surgirá um série de mensagens informando sobre o fato e instruindo um meio de informar exatamente qual é a placa, com uma lista de modelos suportados.

No meu caso o modelo é definido pelo código 27.

Então dando uma olhada em /etc/modprobe.d eu criei um arquivo chamado cx88xx com o seguinte conteúdo:

options cx88xx card=27 tuner=69 i2c_scan=1

E é só... Basta executar esta seqüência de comandos:

rmmod cx88xx
modprobe cx88xx

Ou reiniciar todo o sistema se estiver tendo outros problemas ou simplesmente está sem saco :P

Monday, October 30, 2006

Patch da salvação

Um patch para quem não acredita em Deus mas teme ir pro inferno. Fiz em pascal por motivos de clareza.

procedure TPessoa.BeforeDie(Sender: TObject);
var
..I: Integer;

begin
..try
....with (Sender as TPessoa).Religiao do
....begin
......for I := 0 to Deuses.Count - 1 do
......begin
........Deuses[I].SeArrepender();
........Deuses[I].Acreditar();
......end;
....end;
..except
....{ fudeu }
..end;
end;

Sunday, August 20, 2006

Slackware + Bluetooth + Palm -> Internet

Continuando minha insana busca pelo acesso à internet via Bluetooth no meu Palm eu descobri milhares de links. Cada link que achei mostrava uma maneira um pouco diferente e algumas vezes totalmente controversa.

No meu post Bluetooth no Slackware eu mostrei como configurar o Bluetooth para ficar funcional. Agora eu consegui acessar a internet pelo Palm usando o Bluetooth. Eu uso um Tungsten E2 (que vem com Bluetooth embutido).

Faça seu Bluetooth funcionar tanto no Palm quanto no teu PC (dê uma olhada no meu post Bluetooth no Slackware, se não souber como).

O BlueZ traz um daemon chamado dund, que implementa a capacidade do Palm "discar" para o PC via Bluetooth. Ele usa o PPP (que você deve configurar também) para levar teu Palm até a internet. Também é necessário o daemon sdpd que capacita o teu Linux a servir o protocolo SDP. Ative-o com o comando sdpd.

Após ativar o sdpd, você deve executar o comando sdptool add SP. Isso faz teu Linux habilitar o serviço SP, que faz ele usar uma serial virtual para se conectar ao PC. Para a serial é necessário um arquivo em /dev chamado rfcommX, onde X é a variação. Verifique se esse(s) arquivo(s) existe(m). Caso não exista, crie com mknod -m 666 /dev/rfcomm0 c 216 X. Eu nem preciso repetir que X é a variação, em geral execute este comando apenas uma vez , com o valor de X igual a 0 (zero).

Agora a configuração do rfcomm. Abra o arquivo /etc/bluetooth/rfcomm.conf e atente para duas seções da configuração do arquivo: device, coloque aqui o endereço físico do teu Palm (execute hcitool scan, para ver uma lista de todos os dispositivos nas proximidades - com seus endereços físicos). Veja também a seção comment, nela você coloca algum nome qualquer, eu coloquei o nome do meu Palm. Note que o nome da configuração é rfcomm0, o mesmo nome do arquivo que representa a linha serial virtual entre teu Palm e teu PC, caso consiga conectar mais de um dispositivo à internet usando este tutorial, este poderia ter sido o seu ponto de partida: incluir mais configurações.

Você quase pode acessar a internet agora... Só não pode acessar por que não iniciou o dund, que vamos fazer após configurá-lo. Procure o diretório /etc/ppp/peers, se não existir o diretório peers, não tenha medo de criá-lo... Dentro dele, tu vai definir um arquivo com as opções para usar no pppd, o daemon que serve o PPP no teu Linux.

O meu está configurado assim:

115200
AAA.AAA.AAA.AAA:BBB.BBB.BBB.BBB
local
ms-dns XXX.XXX.XXX.XXX
noauth
debug

Observe que o A e o B são dois endereços de IP, o primeiro é o endereço do teu Linux, o segundo será o endereço atribuido ao Palm. O X é endereço de algum servidor DNS, use o do teu ISP...

Salve esse arquivo em /etc/ppp/peers/dun. Quase lá... Agora vamos ligar o dund. Rode o daemon dund desta forma: dund --listen --persist --msdun call dun. Ela irá executar e se soltar do terminal, indo para o plano de fundo.

Vamos ao Palm... Detecte e faça pairing entre teu Palm e o Linux. Agora configure o Palm para se concetar ao PC para uso da internet, da forma mais convenitente... No meu Palm existe um assistente, nas opções de Bluetooth tem uma opção chamada "Configurar dispositivos" ou alguma coisa assim, meu Palm tá em inglês. Esse assistente deixa teu Palm pronto para se conectar. Então faça isso logo! Se conecte.

Quando conectar verá um diálogo de progresso, alguns ícones bonitinhos e então... Established. Agora tu está conectado ao PC, mas só isso, nem tente dar Ping ou abrir o Blazer para ver e-mails, não funciona ainda...

O Linux não ia deixar qualquer coisa que chegue à ele usar a conexão de rede, sabe lá o que pode ser, então o iptables bloqueia. Alén disso tem a opção ip_forward, que aqui estava desativada...

Ative o ip_forward:

echo '1' > /proc/sys/net/ipv4/ip_forward

Converse com o iptables:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i ppp0 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

Olha que tem uma referência a tua placa de rede (eth0), mude caso seja diferente disto. Também observe uma referência à ppp0, não sei não, mas acho que pode ser diferente em cada configuração, aqui é apenas um velho Celeron me servindo por meio de SSH, então só existe ppp0 mesmo. Existindo ADLS ou Dial-up podem exister mais... Lembre-se disso.

Agora a coisa ta feita, se eu não esqueci de nada, acho que é tudo. Tenta ping, tenta ler e-mail, tenta MSN etc. Acho que você deve ter ficado feliz da vida... Eu fiquei... Em meus defecos não levo mais revistas INFO Exame (eu sei, mas ganhei de presente), levo meu Palm e fico secando o W3Schools, Google e outras ricas fontes do saber.

Nem preciso dizer, mas vou: Coloque tudo que for comando repetitivo (Acho que tudo exceto o mknod que cria o rfcommX) em teu rc.local (/etc/rc.d/rc.local). Assim num vai ficar escrevendo isso a cada vez que reiniciar o PC...

Seguem toneladas de links:

(Palm)
http://www.harbaum.org/till/palm/bluetooth/index.html
(Syncing the Treo 650 with Bluetooth)
http://www.linuxjournal.com/article/8185
(Configuração)
http://www.linuxquestions.org/.../Bluetooth_in_Slackware_HOWTO
(Bluetooth HOWTO's)
http://www.holtmann.org/linux/bluetooth/
(Bluetooth Adapter)
http://www.nslu2-linux.org/wiki/Peripherals/BluetoothAdapter
(Internet Access via Bluetooth on Linux)
http://www.metacon.ca/bcs/view.php?page=bluetooth
(Surf the Web with Bluetooth)
http://howto.pilot-link.org/bluesync/ga.html
(Connecting your PalmOS® handheld device to the Internet via PPP)
http://howto.pilot-link.org/ppp/

Monday, August 07, 2006

Destaques em ancomarcio.com

Uma abordagem prática ao uso de opções de destaques em sites.

A idéia seria fazer com que o usuário não precisasse definir todos os dias os items que aparecem em destaque. Seria mostrada uma lista (tabela) informando o que está em destaque em cada posição. Essa lista seria preenchida com os itens mais atuais de cada posição, ou seja, quando uma posição for alterada, será criada uma nova entrada informando a data e a posição do novo item.

Uma consulta desta maneira, traria os itens mais atuais de cada posição:

select *
from destaque d
where (
d.data = (
select max(destaque.data)
from destaque
where (d.tipo = destaque.tipo)
)
)
order by d.tipo

Outra consulta usando o comando replace (presente somente no MySQL, até onde eu sei), mantém atualizado a posição do destaque, alterando o item selecionado, ou criando caso não exista.

Exemplo:

replace into destaque
set item = 110, data = '2006-08-08', tipo = 2