segunda-feira, 26 de fevereiro de 2007

Testando o indexador do Google

Duas ferramentas google das quais faço uso são:
- Google Analytics
- Ferramentas Google para Webmasters

Sem muito mais comentários sobre elas. Se você nunca viu, recomendo fortemente experimentar.

Mas o galho é que as páginas do keepLearning não apareciam como sendo rastreadas nas Ferramentas Google para Webmasters.

No google, ao procurar por keeplearningblog, apareciam apenas duas páginas, meus dois primeiros posts aqui.

O engraçado é que ele continuava a indexar normalmente as páginas do meu outro blog. Troquei o layout por um dia, revisei as as tags de confirmação, tudo.

Olhando melhor depois vi que o outro blog não tinha marcadores e esse tinha. Um detalhe bobo, mas que poderia ser o que estivesse fazendo toda a diferença.

Coloquei marcadores em todos os posts do outro blog, e voilá! No outro dia ele já não aparecia como indexados completamente no google. Mãos à obra: retirar todos os marcadores.

Pass um dia, passa dois, três... Nada agora os dois blogs aparecem timidamente no google. E o pior é que não há estatísticas do keepLearning no "Ferramentas Google para Webmasters".

Parece que o serviço não é tão inteligente assim, ainda mais se tratando de serviços relacionados intimamente na fonte (blogger e o sitemaps).

Mas ainda bem que o Google Analytics continua funcionando firme e forte. A única pena é ele não informar os pages rankings. Se ele contasse com isso, com algum tipo de relatório de rastreio indicando se houve algum erro como um timeout, e quais as páginas da net que fazem referência para nosso site, não seria necessário usar o sitemaps.

Té+
-----------
keepReading

sábado, 24 de fevereiro de 2007

Errata - artigo sobre Transações

No artigo sobre Transações que publiquei, havia dito que o Python não suportava diretamente os commits e rollbacks da vida.

Na verdade o módulo MySQLdb têm os métodos de suporte commit() e rollback(), assim como o PHP.

[retirado do manual do módulo MySQLdb versão revisada 1.1, por Andy Dustman]
-----------
keepReading

Aventuras e soluções - Javascript

Ainda estou muito longe de programar de forma eficiente e levando em conta todas as exigências de um site eficiente e politicamente correto: regras de acessibilidade, normas, etc... Mas faço o possível para chegar cada vez mais próximo disso.

O caso é que o famigerado Ajax NÃO é um padrão, e por isso mesmo nunca fiz questão de ir muito atrás para aprender. Porém resolvi usá-lo num site meu, como um mimo pra mim mesmo (nada que fosse ficar exposto à navegação).

Dá-lhe eu a correr atrás de um tutorial. Encontrei alguns, mas mesmo assim ainda incompletos, sem muita informação técnica como por exemplo manipulação de headers, mas dava pro gasto.

Não conheço um programador que não tenha uma pasta "experiências" ou "laboratório" destinada a fazer testes básicos com a tecnologia que se quer implementar, para depois mandar ver em sua aplicação principal. Comigo não é diferente. Criei uma página apenas com fins de teste, e pra variar deu errado.

Tentava daqui e de lá, trancrevi os exemplos dos tutoriais, googlei, e nada. Os exemplos dos tutoriais dava certo, mas o meu não. Why?

Mandei os códigos para um amigo mais experiente, o Júlio, dar uma olhada. Tenho que agradecer a ele por ter gasto seu tempo ajudando esta pobre mula cósmica que esta escrevendo este artigo.

O galho estava na declaração do objeto XMLHttpRequest. A declaração estava dentro de uma função, e quando chegava no trecho
myvar.onreadystatechange = umaOutraFunçãoDeclaradaAbaixo();
dava galho.

Coloquei vários alerts para fazer o debug e chegamos a uma solução: fazer a instanciação do objeto XMLHttpRequest ANTES de iniciar as funções.

O erro que aparecia era que as propriedades myObject.status e myObject.readyState não estavam definidas ("undefined").

Foi interessante notar que nos exemplo que transcrevi dos tutoriais estes erros também apareciam quando se colocava um alert para debug.

Javascript nunca foi meu forte, mas depois de dar uma lida mais aprofundada vi que há uma outra possibilidade mais interessante, eficiente e correta do que o Ajax, o E4X.

Não vou me ater a detalhes aqui, mas o E4X é um acrônimo para ECMAScript For XML. ECMAScript é o nome oficial do Javascript.

Pois bem, a possibilidade interessante é trabalhar com a biblioteca DOM do PHP, já citada aqui, e usar os métodos do E4X. Além de ser um padrão (o que o Ajax não é), o código fica muito mais limpo e inteligível.

A biblioteca DOM permite salvar em um arquivo ou retornar uma string tanto em XML quanto em HTML. E o E4X dá o tratamento à informação, com as mesmas possibilidades do Ajax e de quebra fica mais fácil manter um código acessível (sem aqueles links que não mandam pra lugar nenhum) e dentro das normas.

A infelicidade, como sempre, fica por conta da Microsoft que até o IE 6 não dava suporte ao E4X. Não sei se o IE 7 o suporta.

Enfim, pra finalizar, aí está o link da ECMA (European Computers Manufacturers Association) que detem normas de um porrilhão de coisas (quer saber quais são as normas e regras de como se grava um CD ou uma fita K7? Eles tem isso) e a promessa de logo publicar um tutozinho de como trabalhar com o E4X.
-----------
keepReading

terça-feira, 20 de fevereiro de 2007

Trabalhando com a classe DOM do PHP

No artigo que publiquei há uma chamada de uma função, a addToLog.

Bem, ela trabalha basicamente com a classe DOM do PHP. Esta classe tem muitas aplicações, podendo ser amplamente usada com arquivos XML (e SGML em geral), como, por exemplo, RSS.

Vou descrever aqui seu funcionamento. Primeiro vamos supor uma estrutura inicial para o arquivo. Algo assim:
<log>
<entrada>
<data></data>
<ip></ip>
</entrada>
</log>
Onde cada novo registro será um novo nó . E vamos batizar este arquivo de log.xml (nada mais justo).

Agora no PHP:
function addToLog($arquivo,$data,$ip) {
// instanciando a classe
$entry = new DOMDocument();

// isso é para manter a saída indentada
$entry->preserveWhiteSpace = false;
$entry->formatOutput = true;

// carregando o arquivo
$entry->load($arquivo);

//selecionando o nó log
$log = $entry->getElementsByTagName('log');
$log = $log->item(0);

// criando a nova entrada
$entrada = $entry->createElement('entrada');
$entrada = $log->appendChild($entrada);

// criando os nós ip e data
$ip_entry = $entry->createElement('ip', $ip);
$ip_entry = $entrada->appendChild($ip_entry);
$data_entry = $entry->createElement('data', $data);
$data_entry = $entrada->appendChild($data_entry);

// salvando o arquivo
$x = $entry->save($arquivo);

// dando a saída
if ($x) {
return true;
} else {
return false;
}

}

Dúvidas? Deixa um comentário.

Té+
-----------
keepReading

Artigo - Transações

O artigo sobre transações em bancos de dados está concluído e pronto para download.

Para baixar basta ir aqui.

Os próximos artigos que pretendo publicar nesta linha sobre bancos de dados são sobre:

Stored Procedures e Funções;
Triggers;
Scheduled Events;
Views;
e talvez sobre Replicação e Otimização.

Sugestões de temas para artigos são bem-vindas.

Té+
-----------
keepReading

terça-feira, 13 de fevereiro de 2007

Destrinchando

Tem algumas ferramentas que são indispensáveis para um webmaster. Não estou falando de editores WYSIWYG, ou criadores de animação. Estou falando de add-ons do Mozilla Firefox e serviços web-based como o google analytics. Resolvi conhecer o google analytics faz pouco tempo, depois de ler uma matéria no site Info Western.

Realmente ele é uma ferramenta e tanto para webmasters e seus clientes. Mas o galho foi que percebi que muitas informações não apareciam direito. Faltava muita informação nos gráficos (as legendas!).

Aí descobri qual era o galho: o plugin do flash player.

Eu tinha a versão 7 do plugin instalada, e a atual recomendação é que se instalasse o 9, que além de corrigir muitos erros, era mais seguro.

Alright, download, instalação... e nada. E ao digitar "about:plugins" na barra de endereços do Firefox, vi que as duas versões estavam instaladas, a 7 (antiga) e a 9. Aí é onde a briga toda começa.

Apaguei os arquivos de /home//.mozilla/plugins/ e o arquivo /home//.mozilla/firefox/pluginreg.dat com o browser fechado e iniciei novamente o firefox.

De novo a versão estava lá. Apaga de novo, instala a versão 9. E a coisa volta.

Nada. Que raios. Dá-lhe google, mozillaZine, fóruns, página da Adobe.... FAQ's, blogs, technical reports, bug fixes.... E NADA.

Vasculhando... /etc/... nada, /home//... nada. Resolvi ler o arquivo mozver.dat mais uma vez com $cat mozver.dat

A saída era meio ilegível, mas num dos trechos deu para ler: /usr/lib/firefox/

Fui dar uma conferida neste diretório. E não é que a versão 7 estava instalada lá dentro do diretório plugins. Apaguei os dois arquivos, apaguei os arquivos dentro de .mozilla dentro do meu diretório. Reinstalei a versão 9 e aí... Deu certo!

Quanto sofrimento... mas vale a pena. Vale muito a pena. Conhecer melhor o Linux (e os sistemas UNIX-like em geral), e não abrir mão de um navegador como o firefox.

Té+
-----------
keepReading

segunda-feira, 12 de fevereiro de 2007

Bancos de dados - Transações

Muita gente conhece por vários nomes: Integridade Referencial, Consistência de dados, Transação... O importante é que os dados e as operações fiquem em seus devidos lugares, contornando os erros.

O exemplo clássico do uso das transações é numa transferência bancária. Uma transferência constitui-se basicamente de duas operações:
- se tira dinheiro de uma conta
- e se deposita em outra

Mas e se uma operação é realizada com sucesso e outra não? Uma conta ficaria com menos dinheiro e na outra não se acrescentaria nada?

Pode acontecer algum erro na comunicação entre os servidores, não estamos livres disso. E justamente para isso se usam os recursos de transação.

Como a parte técnica é longa demais para postar num blog (e creio eu que tudo o que eu publicar passe pelo mesmo problema), logo colocarei o material disponível para download num site, em formato PDF (posto um aviso aqui, assim você poderá acompanhar por leitores de feeds RSS).

Mas só para dar uma prévia cobrirei o assunto de duas formas diferentes:
- o PHP tem uma biblioteca, a MySQL Melhorada, que dá suporte a este tipo de operação [também na forma orientada a objeto, através da classe mysqli];
- através do manual do MySQL 5.1 (filtrarei o que segue a norma SQL para o artigo ter aplicação a outros servidores como o PostgreSQL). Isso é para o caso de se usar diretamente o servidor ou outra linguagem como Python ou Ruby, que não dão suporte a transações.

Té+
-----------
keepReading

sábado, 10 de fevereiro de 2007

Início

Sabem como é iniciar um blog... (se não sabe inicie um). Aqui vou compartilhar dicas rápidas, tutoriais, artigos, matérias, sugerir leituras e fontes de pesquisa, tudo relacionado à computação.

Sou apenas um programador, insatisfeito com os fóruns e portais da vida, onde geralmente se cobre tópicos repetidos, conteúdo be-a-bá, etc... Se você é curioso como eu e o basicão já não te agrada tanto (com excessão de novas normas, protocolos, linguagens, etc), sugiro assinar o feed desse blog e até mesmo entrar em contato, podemos trocar experiências.

Tenho interesses em sistemas UNIX-like, software open source, bancos de dados, protocolos, normas (de tudo), registro do Rwindows (por que não? a enorme maioria dos linuxers não sabe mexer direito nele), linguagens, e por aí vai.

Então, conforme eu for garimpando, experimentando, descobrindo e digerindo coisas novas (pra mim), vou publicando aqui.

-----------
keepReading