quarta-feira, 19 de março de 2008

WAMP em nova versão.

Saiu do forno a nova versão do WAMP. As novidades são o Apache 2.2.8 e o MySQL 5.0.51a.

Segundo o changelog, foi adicionado também o suporte a línguas complementares e corrigido um bug no Windows Vista 64.

Maria: a evolução do MyISAM

Distribuído originalmente como uma extensão do MyISAM, o Maria é o novo engine do MySQL com suporte a recuperação após quedas (crash recovery).

Este engine, no momento em que escrevo este post, está sendo distribuído como preview.

Baseado na versão 5.1 do MySQL, ainda não há previsão de lançamento oficial e nem quando será fundido junto a distribuição do MySQL.

A documentação completa pode ser encontrada aqui e o download aqui.

Assim que eu fizer testes mais apurados, publicarei um artigo aqui.

E você: já testou este engine? Conte-nos sua experiência.

sexta-feira, 8 de fevereiro de 2008

Iniciando com XML e XSLT.

Linguagens de programação modernas como PHP, Python, Perl, ASP, ASP.net, Delphi, C#, Visual Basic, ColdFusion, Ruby on Rails, entre outras suportam XML e XSLT.

Muitos já devem ter ouvido falar dela. Mas o que acaba acontecendo é que muitos não conseguem decifrar, destrinchar entender e compreender infindáveis páginas de documentação, que geralmente encontram-se em inglês.

A Visie, empresa voltada para o desenvolvimento WEB, elaborou um PDF contendo um "curso rápido" incluindo exemplos sobre como funcionam o XML e o XSLT.

Ilustrado e com uma didática muito boa, suas 31 páginas são de leitura recomendada, mesmo para os mais experientes.

Parabéns Elcio e a todos os envolvidos no trabalho.

quinta-feira, 7 de fevereiro de 2008

Expressões regulares.

Você não entende nada de expressão regular? Não sabe o que a expressão "^\s{2,}$" significa? Seus problemas acabaram!

Há dois endereços muito bons explicando sobre expressões regulares, os quais podem ser vistos aqui e aqui. Leitura recomendada.

Utilizando o SVN.

Àqueles que desejam iniciar o desenvolvimento de aplicações (não necessariamente só com PHP) utilizando o SVN, há estes links aqui e aqui que poderão ajudá-lo a aprender como utilizá-lo.

Para usuários Windows, há um cliente bem bacana: o TortoiseSVN que pode ser obtido aqui.

Enviando e-mails diretamente do PHP.

Esta é uma tradução livre deste artigo do howtoforge.

Este tutorial mostra como você pode facilmente enviar e-mail de um servidor com suporte ao PHP. Algumas utilizações possíveis são utilizar para processar dados de formulários, enviar alertas, criar um workflow dentro da sua aplicação, entre outras.

Também é explicado um pouco sobre os cabeçalhos de e-mail.

Continuar lendo...

terça-feira, 5 de fevereiro de 2008

Segurança: Detecção de intrusão no Ubuntu 7.10 (Gutsy Gibon)

Para você que deseja instalar detecção de intrusão ou tentativas de acesso indevido, foi publicado no howto-forge um guia de como fazê-lo utilizando o MySQL, Apache2, Snort e o Base.

domingo, 3 de fevereiro de 2008

Otimizando o tamanho de bancos de dados PostgreSQL

Neste artigo escrito para a LinuxInsight são apresentadas as técnicas para otimizar o tamanho ocupado pelos banco de dados em PostgreSQL, bem como uma explicação de cada um dos procedimentos.

É interessante notar o quanto pode-se recuperar de espaço em disco após alguns procedimentos de DBA serem executados.

Conforme o autor demonstra, um banco de dados que ocupava quase 6 GB, após os procedimentos listados, caiu para aproximadamente 1,7 GB.

Não preciso nem falar sobre o ganho de velocidade para a aplicação que utiliza o banco.

Portando aplicações PHP para utilizar AJAX.

Neste artigo escrito no site onLamp.com, Bill Lubanovic mostra como utilizar o AJAX(através do jQuery), JSON, em aplicações PHP. Leitura recomendada.

Documentação para o aprendizado de Linux.

Para aqueles que desejam aprender Linux, além da documentação, geralmente em inglês, existe a opção do Guia Foca Linux. Escrito de forma clara, linear e didática. Seu conteúdo é organizado em 3 níveis de aprendizado: Iniciante, Intermediário e Avançado.

O guia possui explicações diretas, dotadas de exemplos práticos e comentados, faciliatando o aprendizado dos mais apressados e que já entendem do assunto abordado.

Utilizando o MSSQL Server para autenticar usuários no Apache2

Neste artigo do HowToForge.com, Gatis Spats descreve o que deve ser feito para o Apache2 autenticar através do MS SQL Server.

Ao escrever o artigo, foi utilizado o MS SQL rodando no Windows 2003 Server. O Apache2 estava rodando no SuSe Linux Enterprise 9.

Emitindo boletos com o PHP.

Quem ainda não precisou montar um site de coméricio, seja ele de produtos e/ou serviços e não precisou emitir para seu cliente um boleto bancário, passe para o próximo post. :)

Elizeu Alcântara em seu projeto de código aberto, tem por objetivo criar um sistema de geração de boletos auxiliar o desenvolvimento de aplicações em PHP, procurando facilitar a emissão do boleto.

Originário do BBBoletoFree com a colaboração de Daniel William Schultz e Leandro Maniezo e derivado do projeto PHPBoleto (desenvolvido por João Prado e Pablo Martins F. Costa), o projeto BoletoPHP é distribuído sobre licença GPL.

No momento em que escrevo este artigo, o projeto já suporta 12 bancos, entre eles Banco do Brasil, Unibanco, Caixa Econômica, Itaú, HSBC, Bradesco e Banco Real.

Possuindo uma infraestrutura que facilita o desenvolvimento de suporte a outros bancos, basicamente são três arquivos para serem personalizados.

O download pode ser feito aqui e um exemplo da emissão de um boleto (no caso da Caixa Econômica Federal) pode ser acessado aqui.

quarta-feira, 23 de janeiro de 2008

Bancos de dados livres e ferramentas comerciais.

O Fabio Telles Rodrigues do Savepoint, publicou um artigo muito bem escrito mostrando os principais motivos aos quais os produtores de softwares comerciais preferirem bancos de dados comerciais aos livres (no caso o PostgreSQL) . Leitura recomendada.

MySQL: Store procedures com recursividade.

O Uzed em seu blog postou um artigo explicando como montar store procedures com recursividade no MySQL. O artigo está de fácil compreensão, explicando passo a passo como criar recursividade em store procedures e ainda tem os links para a documentação a ser consultada.

Parabéns pelo artigo Uzed.

IE 8 virá com compatibilidade W3C desabilitada por padrão.

No CyberNet hoje, foi publicado um artigo falando sobre o IE 8 e os web standards.

Um dos pontos que chamam a atenção é que, por padrão, o suporte web standards será desabilitado. Isto tem um lado ruim, pois não força com que os webmasters utilizarem em seus sites com o padrão (web standards).

Por outro lado, o que os webmasters necessitarão fazer será incluir uma nova meta tag no seu cabeçalho, para ativar o suporte.

Eu sou a favor de web standards. E você?

terça-feira, 22 de janeiro de 2008

Um script para backup de suas bases do MySQL.

Falando mais um pouco sobre backups e MySQL, resolvi compartilhar com vocês o script que utilizo para gerar backup de minhas bases de dados do MySQL.

Eu tenho ciência que é um script bem simples para backup. Sugestões serão bem vindas. Este script pode ser distribuído seguindo as normas da GNU GPL.


#!/bin/bash
#
# Efetua o backup das bases de dados do MySQL.
#
# Autor: Luis FernandoKieça

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. http://www.gnu.org/licenses/.

# Diretório de destino.
DSTDIR="/home/backup"

# senha do usuario root para acessar ao mysql, caso exista.
DBPASS=""

########################################
# Altere daqui para baixo por sua própria conta e risco. #
########################################

TMPFILE="/tmp/dbs$$.txt"
DIA=`date +%Y%m%d`
MYSQLSHOW=`which mysqlshow`
MYSQLDUMP=`which mysqldump`
TAR=`which tar`
WC=`which wc`
CUT=`which cut`
GREP=`which grep`
XARGS=`which xargs`
TAIL=`which tail`
RM=`which rm`

# Recupera as bases de dados do sistema.
if [ "$DBPASS" == "" ]; then
$MYSQLSHOW >> $TMPFILE
else
$MYSQLSHOW --password=$DBPASS >> $TMPFILE
fi

TOTAL=`$WC -l $TMPFILE | $CUT -d' ' -f 1`
DBS=`$TAIL -$((TOTAL - 3)) $TMPFILE | $GREP -v "^+-" | $CUT -d ' ' -f 2 | $XARGS`
$RM -rf $TMPFILE

for DB in $DBS; do
if [ "$DBPASS" == "" ]; then
$MYSQLDUMP -B $DB -c --create-options > mysql-$DB-$DIA.sql
else
$MYSQLDUMP -B $DB -c --create-options --password=$DBPASS > mysql-$DB-$DIA.sql
fi
$TAR -czvf mysql-$DB-$DIA.tgz mysql-$DB-$DIA.sql --remove-files
done

Bem, como disse anteriormente, o script é bem simples. Utilize-o por sua própria conta e risco. Sua utilização implica na completa aceitação da GNU GPL.

E você: como efetua seus backups de suas bases de dados?

Utilizando o Linux como secretária eletrônica.

Há algum tempo atrás, disponibilizei em vários locais na internet que tratavam de linux uma maneira de utilizar o modem que tornou-se ocioso em decorrência da utilização de acesso à internet através da banda larga.

Com receio que este se perdesse, resolvi republicá-lo. Caso você resolva publicá-lo em seu blog, peço a gentileza de utilizar-se de link para este documento.

Este tutorial foi testado em um RedHat Linux 7.2

Hardware necessário

  • Computador com fax-modem instalado.
Software necessário
  • Red Hat Linux 7.2 (ou qualquer outra distribuição. Entretanto, faz-se necessário verificar os locais corretos para os arquivos de configuração);
  • sendmail, postfix, qmail ou qualquer MTA executando na máquina;
  • pacote mpack (http://rpmfind.net);
  • mgetty+sendfax (http://rpmfind.net;
  • Apache + PHP + Webmail (opcional).

Instalação e configuração do mgetty
Após a instalação e configuração do MTA (favor consultar a documentação do MTA a respeito de como instalá-lo), baixe a última versão do mpack (pacote que facilita o envio de e-mails com anexos). Para instalá-lo, execute o comando rpm -ivh mpack-{versão}.rpm.

Baixe e/ou atualize os pacotes mgetty-1.1.28-3, mgetty-viewfax-1.1.28-3, mgetty-voice-1.1.28-3 e mgetty-sendfax-1.1.28-3 (sendo o mgetty e mgetty-voice são os pacotes realmente necessários).

Para instalá-los, execute o comando rpm -ivh mgetty-*. Para atualizar uma versão já existente do mgetty, utilize o comando rpm -Uvh mgetty-*.

Agora, entre no diretório /etc/mgetty+sendfax. Utilizando o seu editor preferido, edite o arquivo voice.conf.

Procure pela linha message_list e informe o nome do arquivo que conterá as mensagens de voz a serem utilizadas quando o telefone for atendido. Este arquivo deverá estar no diretório message_dir (normalmente em /var/spool/voice/messages).

Na linha backup_message, deverá ser colocado o nome do arquivo (também presente no diretório message_dir) que será utilizado como mensagem padrão nos casos onde o mgetty não conseguir localizar o arquivo de mensagem em questão.

A próxima linha a ser alterada é o port_speed, o qual deverá conter a velocidade suportada pelo modem. Um pequeno detalhe: nesta linha o valor colocado DEVE ser o mesmo do que o encontrado na linha speed do arquivo mgetty.config.

Na linha rings, deve ser especificado o número de toques a esperar para atender o telefone.
Como eu não utilizo o telefone para receber fax, eu modifiquei a linha answer_mode para voice.

Na linha message_program, deve-se indicar nome do programa a ser utilizado para processar os arquivos recebidos pelo mgetty.

É necessário indicar ao mgetty, qual será o dispositivo de voz que ele deverá utilizar (ttyS0, ttyS1, ttyS2 ou ttyS3).

Talvez seja necessário revisar o arquivo inteiro e procurar por configurações envolvendo a mesma ttySx do modem ou até mesmo do mouse.

Com o seu editor de textos preferido, edite o arquivo /etc/inittab e inclua a seguinte linha:

S3:345:respawn:/sbin/vgetty ttyS3
Salve as configurações e saia do arquivo.

Execute um kill -1 1 para o init reler o arquivo de configuração e ativar o vgetty. Com um
ps -ax | grep vgetty
você deverá ver o processo lá·

Agora, o próximo passo é gravar a mensagem. Utilizando-se do seu programa preferido, grave a(s) mensagem(ns) de saudação da secretária em formato wav. Em seguida, utilize o programa wavtopvf .

O próximo passo é converter o arquivo no formato pvf para o formato compreendido pelo modem. Isto é feito através do utilitário pvftormd. Utilize o comando pvftormd -L para listar os formatos suportados pela sua marca de modem.

Após a conversão basta colocar arquivo da mensagem no diretório especificado em message_dir e a secretária já está pronta para operar.

Criação do script para enviar o arquivo recebido para o e-mail

Abaixo, segue o script que eu utilizo para enviar-me a mensagem via e-mail.
#!/bin/bash
# Voicemail.sh
#
# Converte o arquivo gravado do modem em voc e envia por e-mail.
#
# Autor: Luis Fernando Kieça

ARQUIVO=`echo $1 | cut -d "." -f 1`
DATA=`date +%d/%m/%Y`
HORA=`date +%H:%M`
EMAILADDRESS="luis@localhost"

# Converte o arquivo para voc
rmdtopvf "${ARQUIVO}.rmd" |
pvfcut -T 34.0 |
pvfspeed -s 32000 |
pvftovoc > "${ARQUIVO}.voc"

# Cria o arquivo txt
echo "Voice mail recebido" >> ${ARQUIVO}.txt
echo " " >> ${ARQUIVO}.txt
echo " Voce recebeu um voice mail as ${HORA} do dia ${DATA}." >> ${ARQUIVO}.txt
echo " " >> ${ARQUIVO}.txt
echo " Para acessa-lo, abra o arquivo anexo a este e-mail." >> ${ARQUIVO}.txt
echo " " >> ${ARQUIVO}.txt
echo "VoiceMail Server." >> ${ARQUIVO}.txt

# Envia o e-mail
mpack -s "Voicemail!!!" -d "${ARQUIVO}.txt" "${ARQUIVO}.voc" "${EMAILADDRESS}"

# Remove os arquivos temporarios
for i in voc rmd txt; do
rm -f ${ARQUIVO}.${i}
done
Este script você deverá referenciá-lo no mgetty.conf na linha message_program. Não esqueça de dar permissão de execução.

Apache + PHP + Webmail

A título de sugestão, pode-se utilizar o apache + php + squirrel (ou outro webmail qualquer), para que a visualização das mensagens possa ser feita através de qualquer computador com acesso à internet. Uma vez que você já utiliza banda larga em sua máquina, basta agora configurar para que você possa acessar seus e-mails de qualquer lugar (não esqueça é claro da segurança :-) ).

domingo, 20 de janeiro de 2008

Backup: Uma solução para Windows, Linux e BSD's

Todo administrador de rede sabe que:

Quem tem um backup, não tem nenhum.
Pode parecer brincadeira, mas quando os problemas aparecem, não aparecem sozinhos. Então, um único backup, pode ser pouco, uma vez que podem ocorrer problemas ao restaurá-los.

Um administrador de sistemas muitas vezes se depara em unificar um método para fazer os backups de seus servidores, principalmente se eles forem de ambientes mistos (por exemplo, Windows e Linux - o mais comum).

Este tutorial não é específico para servidores. Pode ser utilizado para fazer backup de estações Windows (9x/NT/2000/XP), Linux e BSD's (FreeBSD, OpenBSD, NetBSD).

Ao contrário de soluções proprietárias, que são caras por sinal, neste artigo, pretendo descrever uma maneira simples para criar um sistema de backup de dados descentralizados. Por exemplo, você tem uma rede heterogênea e precisa fazer o backup de todos os seus servidores Linux, Windows, BSD's.

Neste pequeno tutorial pretendo mostrar como é fácil criar uma rotina de backup homogênea e simples para facilitar a vida de muitos administradores de sistema.

O que você vai precisar
  • Servidor(es) Windows NT4/2000/2003;
  • Servidor(es) Linux (qualquer distribuição);
  • Servidor(es) BSD's (FreeBSD, OpenBSD, NetBSD);
  • cwRsyncServer (para servidores Windows);
  • rSync (para servidores Linux);
  • Script para o backup;
  • Dispositivo de armazenamento (neste tutorial utilizaremos o HD de nosso servidor encarregado dos backups).
Download, instalação e configuração do cwRSyncServer O primeiro passo é baixar o cwRsyncServer:
Sua instalação segue o padrão de instalação de qualquer aplicação Windows (Next-Next-Finish :P ).

Apenas um detalhe: durante a instalação será exibido um quadro informando a senha utilizada para o serviço criado do cwRsyncServer. Anote-a e guarde-a em local seguro caso precise dela em algum momento.

OBS: Esta senha é aleatória e difere em cada instalação do cwRSyncServer.

Configuração do cwRSyncServer

No diretório onde foi instalado o cwRSyncServer você encontrará o arquivo rsyncd.conf. Basta modificar o arquivo para atender as suas necessidades e iniciar/reiniciar o serviço do cwRSyncServer.

Para maiores detalhes sobre os parâmetros a serem utilizados no arquivo de configurações do rsync, consulte a página man do rsync, disponível em: Exemplo do rsyncd.conf

Abaixo, temos um exemplo de configuração do cwRSyncServer:
use chroot = false
strict modes = false
hosts allow = 172.30.31.253/255.255.255.255 127.0.0.1/255.255.255.0
log file = rsyncd.log
pid file = rsyncd.pid
#Tratamento de caracteres acentuados.
charset=iso8859-1

[Compartilhamentos]
path = /cygdrive/c/Compartilhamentos
comment = Documentos
read only = true
transfer logging = no
OBS: Note que no PATH temos "/cygdrive/" antes de "c/compartilhamentos". Esta é a convenção utilizada pela cygwin.

Rsync Geralmente nas distribuições Linux você já pode encontrar o rsync pré-instalado. Assim como fizemos no cwRSyncServer, você deverá editar o arquivo rsyncd.conf.

Este arquivo tem sua localização variada, dependendo da distribuição Linux/BSD utilizada. Na maioria dos casos está localizada no /etc. Caso esteja em outra localização, consulte a documentação do rsync (man rsyncd.conf ou man rsync).

Juntando tudo

Agora que você já tem o rsync/cwRSyncServer instalado e configurado nos equipamentos que sofrerão backup, basta criar um script para fazer o backup e agendar no cron.

Eis um exemplo de script para backup de várias máquinas:
#!/bin/bash
#
# backup.sh
#
# Faz o backup dos servidores da rede, criando um subdiretório para cada
# um dos diretórios exportados via rsyncd.
#
# Autor: Luis Fernando Kieça
# Criado em: 14/10/04
# Última modificação em: 14/10/05
#

BACKUP_DIR"=/mnt/hdc1/backup"
BACKUP_SERVERS="172.30.31.250 172.30.31.251 172.30.31.252 172.30.31.253 172.30.31.254"

for SERVER in ${BACKUP_SERVERS}; do
# cria o diretório do backup se não existir
if [ ! -d ${BACKUP_DIR}/${SERVER} ]; then
mkdir ${BACKUP_DIR}/${SERVER}
fi

# entra no diretório do servidor correspondente
cd ${BACKUP_DIR}/${SERVER}

# descobre os diretórios exportados
SHARES=`rsync ${SERVER}:: | awk "{ print $1 }"
for SHARE in $SHARES; do
# Cria o diretório para cada compartilhamento (se não existir) e entra nele.
if [ ! -d ${BACKUP_DIR}/${SERVER}/${SHARE} ]; then
mkdir ${BACKUP_DIR}/${SERVER}/${SHARE}
fi
cd ${BACKUP_DIR}/${SERVER}/${SHARE}

# Faz o backup do compartilhamento
rsync -vurgoapl --iconv=utf8,iso88591 --delete-excluded${SERVER}::${SHARE} .
done
done

OBS: Não esqueça de colocar a permissão para execução no script. :)

Agora, com o script criado, basta agendar a tarefa no crontab (ou no próprio agendador de tarefas do Windows).

Considerações finais

Num primeiro momento, puxo todos os arquivos para o disco rígido do servidor encarregado do backup. Após isto ter sido concluído, efetuo a cópia em meio removível. Desta maneira, o servidor não demora para executar os backup diários (incrementais + diferenciais). Será demorado apenas na sua primeira execução (a máquina que conterá os arquivos precisará ter uma cópia de tudo o que possui nas demais máquinas).

Algumas coisas para se implementar nesta rotina:
    Segurança (esta rotina não utiliza-se de nenhuma validação de usuário/senha);
    Criptografia (os dados trafegam sem criptografia);
    Compressão (para não congestionar sua rede e poder executar o script nos horários de expediente e possuir mais de um backup por dia);
    Retorno do backup (pode-se exportar o diretório onde acontecem os backups via Samba para que esteja disponível facilmente via rede ao retornar os arquivos).

Mas estes itens, deixo para você, leitor, implementar em seus servidores...

Conclusão

Com este artigo procurei mostrar como é simples e fácil implementar um backup em seus servidores de modo a centralizar o backup e torná-lo mais homogêneo, facilitando o retorno da informação e minimizando as perdas no caso de um desastre.

O que você achou desta rotina?

quinta-feira, 17 de janeiro de 2008

Restringindo seus usuários a um único login por vez.

Quantas vezes você precisou criar uma aplicação ou até mesmo um site onde o usuário só possa estar logado num único lugar por vez evitando o compartilhamento de usuário/senha?

Este tipo de situação pode ocorrer facilmente quando você está desenvolvendo uma aplicação.

Após este tipo de dificuldade ter aparecido, resolvi criar uma classe em PHP para resolver este problema.

Nesta classe, considerei as seguintes hipóteses:
  1. O usuário efetua o login e fecha o navegador sem efetuar o logout.
  2. O usuário efetua o login em uma máquina e repassa seus dados de conexão para terceiros que o utilizam no momento em que ele está logado e usando o sistema.
  3. Evitar roubo de sessão.
As respostas a cada uma dessas hipóteses, foram dadas da seguinte forma:
  • Quando o usuário efetuar um novo login, este irá desconectar todas as sessões existentes (ítens 1 e 2 acima). Afinal uma pessoa não pode estar em dois lugares ao mesmo tempo.
  • Criar um token de sessão que possa ser verificado com base em alguns dados fixos (por exemplo o id de usuário no sistema ou o seu nome), dinâmicos (id de sessão, endereço ip) e variáveis (como a senha do usuário).
  • Geração do id de sessão de tempos em tempos.
  • Duração da sessão com tempo fixo.
  • Garbage collection para as sessões.
Tendo isto tudo em mente, arquitetei a solução baseada em banco de dados para armazenar todos os dados referentes ao gerenciamento das sessões.

E, para um reaproveitamento de código e interdependência de banco de dados, utilizei o AdoDB. Assim, a mesma classe pode ser utilizada tanto com MySQL quanto PostgreSQL ou qualquer outro banco suportado pela AdoDB.

Após isto tudo, codifiquei minha classe. Em cada página instanciei-a e chamo apenas um método que faz todas as verificações. Caso uma delas não seja satisfeita, o usuário pode ser redirecionado para uma página de login, por exemplo, indicando o motivo pelo qual o login está sendo requisitado.

Em sua aplicação, como você tem feito para controlar múltiplos logins de um mesmo usuário?

Sun: mais informações sobre a compra da MySQL AB.

Dando continuidade ao post da aquisição da MySQL AB pela Sun, este post publicado pela ComputerWorld apresenta mais algumas informações sobre o que deve ocorrer no futuro, de modo a tranquiliziar os desenvolvedores que utilizam o banco de dados, incluindo comentários de Jon "Maddog" Hall.

MySQL & Store Procedures: Uma maneira de recuperar os múltiplos resultados.

Para quem não usa o ADOdb, pode utilizar este trecho de código disponibilizado pelo Peter Brawley no fórum de PHP no site do MySQL.

A recomendação é que seja utilizado o driver MySQLi ao invés do MySQL tradicional.

Da maneira tradicional, não há possibilidade de recuperarmos o resultado de parâmetros de retorno (OUT) utilizados nas store procedures, além da possibilidade de recebermos mensagens de erro como Procedure mySP can't return a result set in the given context.

Estas limitações não acontecem no driver MySQLi.

Sun adquire MySQL. E agora?

Esta notícia não é tão nova. Conforme noticiado no site da MySQL AB, a Sun adiquire a empresa fabricante de um dos bancos de dados open-source mais populares por US$ 1 Bilhão sendo destes US$800 milhões em dinheiro e o restante em ações da empresa.

Em princípio, nada deve mudar para usuários do MySQL. Só resta esperarmos o pronunciamento oficial da Sun sobre como deverá ser a política de utilização do banco daqui em diante.

Mais informações podem ser encontradas aqui e aqui.

Quem sabe, o pessoal da Sun acaba abrindo o Java? Só o tempo nos dirá.

quarta-feira, 9 de janeiro de 2008

Cursores em PostgreSQL

Daniel Matte Freitas publicou em seu blog um artigo mostrando como utilizar cursores PostgreSQL juntamente com a linguagem C. Independente da linguagem utilizada, pode-se utilizar a teoria e aplicá-la juntamente com store procedures ou até mesmo outras linguagens.

Para quem conhece um pouco de PHP, o código em C será de fácil entendimento, uma vez que a sintaxe é muito parecida. Leitura recomendada.

sexta-feira, 4 de janeiro de 2008

Tutoriais sobre pl/pgsql.

O Ivo Nascimento disponibilizou em seu blog, o início de uma série de tutoriais para quem deseja aprender pl/pgsql. Sua intenção é lançar dois artigos por semana. Os artigos podem ser lidos aqui e aqui. Boa leitura a todos.

quinta-feira, 3 de janeiro de 2008

Captchas no PHP.

Captcha é uma técnica para evitar que tarefas possam ser automatizadas por programas. Um bom exemplo é a página de login de alguns blogs ou até mesmo quando se soliticita alguma informação sobre algum domínio no registro.br.

Um bom exemplo de utilização para seu site ou aplicação em PHP seria o formulário de login do usuário, evitando ataques por força bruta (também conhecido como tentativa e erro) aumentando ainda mais sua segurança.

Por mais avançado que seja uma implementação OCR, reconhecer imagens não é tarefa fácil, principalmente por causa das distorções, cores, traços sobrepondo letras, entre outras coisas dificultando o reconhecimento. Esta inteligência humana de discernir letras e números as vezes retorcidos, por enquanto ainda não está completamente implementada nestes OCR's.

Neste endereço, você verá como é simples implementá-lo no PHP e ainda, de quebra, ajuda uma instituição sem fins lucrativos a digitalizar livros. Funciona assim: quando o software OCR não consegue entender uma palavra, esta é exibida na tela para o usuário digitá-la fazendo o trabalho que o OCR não conseguiu identificar. Pode ficar tranqüilo, seu usuário não irá precisar digitar uma página inteira para se logar no seu site ou aplicação. :)

Há outras implementações de captchas como esta e esta. Mas aí cabe você avaliar qual delas é melhor para o seu caso.

Você conhece outra implementação de captcha? Deixe sua sugestão nos comentários.

quarta-feira, 2 de janeiro de 2008

Problemas: como resolvê-los.

Certas vezes encontramos certos desafios que nos deixam até nervosos ao ver que é difícil transpô-los. Muitas vezes, não raciocinamos direito qual a melhor maneira de resolver as coisas. E geralmente, a maneira mais eficiente é aquela não desconsideramos no início.

Já dizia o ditado:

Quando a cabeça não pensa, o corpo padece!

Na maioria das vezes, os problemas mais complexos são os mais simples de se resolver, desde que tenhamos feito uma análise antes de começar a desenvolver. Parar para pensar, na maioria das vezes, agiliza o trabalho.

Outra dica importante: quando você estiver com um obstáculo em seu desenvolvimento e já estiver trabalhando muito tempo sem interrupções, as vezes, uma pausa para um café ou uma água no rosto podem dar um ânimo àquela que aparentava ser uma tarefa intransponível.

Pense nisso!

E você, tem alguma sugestão para resolução de problemas? Deixe sua dica nos comentários.