Google Analytics libera API para desenvolvedores

Ontem li no Profissionais Web que o Google disponibilizou uma API para o Google Analytics, isso significa que agora será possível desenvolver aplicativos utilizando as estatísticas vindas do Analytics.

Uma verdadeira mão na roda!

 

O que é possível fazer com a API do Analytics?

Com a API significa que você pode ter acesso a TODOS os dados disponíveis no Analytics de um aplicativo terceirizado ou desenvolvido por você, ou em sites de terceiros. Para o meu caso pensei em duas aplicações.

 

1. Exibir relatórios para os clientes em interface própria

 

Atualmente eu trabalho com aplicativos web e com CMS próprio (GS Intra), porém nunca desenvolvi um sistema de estatísticas para ele por dois motivos principais relacionadas ao Analytics:

  • Gratuito
  • Não utiliza recursos do meu servidor
  • Superioridade técnica ao que eu poderia desenvoler

Com o uso da API será possível que eu centralize em um só aplicativo o gerenciamento do conteúdo, dos clientes e estatísticas do site de meus clientes. Não preciso mandar o cliente para um site externo para que ele visualize as estatísticas. Facilita para o cliente, é obviamente é melhor para o desenvolvedor, que agrega mais funcionalidade e valor ao sistema.

 

2. Acompanhar impacto de mudanças no site

Eu tenho sérios problemas para acompanhar o impacto das alterações realizadas no And After. Por exemplo, adiciono um elemento de navegação visando aumentar o tempo médio de visita dentro do site no dia 27 de abril.

Preciso de um log, onde eu adicione nesta data todas as alterações feitas para que posteriormente eu colete informações do "antes e depois". Utilizei por algum tempo o Excel para fazer isso, mas era praticamente no CTRL+C e CTRL+V para mesclar dados do Buscapé, AdSense e Analytics em uma mesma tabela, além das datas das modificações.

Agora é possível eu tem um banco de dados com todas as alterações realizadas em no site (como o exemplo do elemento de navegação) e mesclar com os dados que serão importados da API, facilitando a criação do "antes e depois" das alterações de forma automática. 

Quando (e se) a API do AdSense for liberada então, ficará show. Em um único aplicativo será possível medir o impacto de mudanças nas visitas e rendimentos de um site. 

 

Ta aí a dica para um aplicativo que eu utilizaria. haha 🙂

 

 

Saiba mais sobre a API do Analytics em

Blog oficial do Google Analytics

Google Code Analytics

Javascript

Java

 

 

O que já existe desenvolvido?

Polaris

Até o momento testei um aplicativo desktop, o Polaris. Ele utiliza a plataforma (plataforma?) Adobe Air, e a versão free é extremamente simples de usar.

Apresenta diversas informações em uma pequena janela com uma interface bastante intuitiva. 

Confira algumas telas do Polaris , o  analytics desktop:

Polaris - Google analytics destkop

Polaris - Google analytics destkop

Polaris - Google analytics destkop

Polaris - Google analytics destkop

 

Recomendo! 

 

Mobile

Não testei, mas no blog oficial do Analytics recomendaram uma aplicação Android do Analytics.

 

 

Assim que eu fizer testes com a ferramenta publicarei os resultados e programações aqui no O desenvolvedor, se você já desenvolveu alguma coisa ou quer compartilhas suas idéias pode publicar um artigo ou comentar. 🙂

Como contar arquivos em uma pasta usando ASP (FSO)

Na intranet de um cliente existe um módulo para distribuição de arquivos para os clientes dele, para isso eu utilizo o File System Object (FSO), que navega pelas pastas especificadas do sistema (onde meu cliente sobe diversos arquivos por FTP), identifica os arquivos e distribui cada arquivo para o respectivo usuário final (o cliente do meu cliente).

Com poucos arquivos a distribuição acontece tranquilamente, os arquivos são movidos para a pasta de cada usuário, cada usuário recebe uma notificação por e-mail com o link para a área de login do sistema com acesso aos arquivos. Porém todo o servidor tem um limite para execução de scripts e muitas vezes simplesmente aumentar esse limite de tempo de execução não é recomendável, pois se alguma coisa der errado (como um loop infinito) vai ficar sobrecarregndo o servidor.

New Folder

Isso sim é organizar os documentos em pastas

 

Começaram a acontecer problemas quando existiam muitos arquivos para mover, pois além da listagem de todos os arquivos o sistema segue uma lógica para identificar de qual usuário é cada arquivo para que a distribução seja feita de forma correta.

A solução para não retornar o erro de limite de tempo excedido e não aumentar loucamente este limite (o usuário certamente vai achar que deu erro quando uma página demorar demais para carregar) foi limitar o número de arquivos movimentados por vez, isso permite dar um feedback entre a "paginação" evitando que o usuário pense que o aplicativo travou ou deu erro e clique repetidamente em botões da interface. Eles gostam disso.

Segue uma parte da solução que adotei.

 

Como contar quantos arquivos tem em uma pasta utilizando o FSO?

Quando procurei informações de como contar quantos arquivos existiam em uma pasta a maioria envolvia um loop por todos os arquivos, e isso me lembrou minha experiência com POG: Não programe isso!

Twittei para ver se alguém conhecia uma solução melhor do que um loop, @chrisloki@cleiverrr e @alinedecampos responderam com idéias/sugestões, não achei nenhuma documentação completa do FSO (ok, só dei uma googleada básica) mas resolvi testar algumas coisas como UBound (para pegar o índica mais alto de uma array) e depois um count.

O UBound não funciona, o array de arquivos não pode ser tratado como um normal, mas existe o comando COUNT no FSO, segue abaixo o script para contar quantos arquivos existem em uma pasta:

 

dirtowalk = "../web_users/gssolutions/arquivos/"

Set fs = CreateObject("Scripting.FileSystemObject")

Set f = fs.GetFolder(server.mappath(dirtowalk))

Set fc = f.Files

total = fc.count

response.write "Total de arquivos na pasta " & dirtowalk & ": " & total

 

É isso aí, um simples .count no "array" de arquivos retorna o número de arquivos dentro da pasta. Caso existam subpastas, você teria que criar um loop para ir navegando e somando os arquivos dentro de cada subpasta…

Mais funcional e elegante do que um "For Each arquivo In fc"!

Obrigado a todos os que ajudaram e responderam meus pedidos de socorro no twitter, espero ter ajdado também! 🙂

Como imprimir aspas no Javascript

Esta semana eu liberei novamente a Vitrine Fácil Buscapé, que permite a criação e gerenciamento de Vitrines personalizadas para o programa de afiliado Buscapé. Quando estava liberando a aplicação em beta tive problemas para implementar um sistema de rastreamento de clicks.

Muito bem, voltando ao assunto vou explicar o contexto do meu problema, eu tinha um link que era impresso em Javascript, e precisava adicionar o atributo onClick nele, que ficaria no resultado final assim:

onClick="funcao(´var1´,´var2´)"

Mas no Javascript, se eu fosse usar um document.write ou qualquer outro método de alguma biblioteca (jQuery, no meu caso) quando eu utilizasse a aspa simples automaticamente estaria fechando a string (não sei se string é o correto para o que eu quero definir, sorry) do Javascript, ou seja, estaria "cortando" a minha linha que seria exibida no código pela metade.

Uma pesquisa rápida em fóruns e encontrei a solução: você precisa utilizar uma barra invertida (lembrouexpressões regulares, utiliza a barra para transformar o próximo caracter em "normal"), então ficaria assim no Javascript:

document.write("onClick="funcao(´var1´,´var2´)" ")

Antes das duas aspas VERMELHAS você deve inserir uma barra invertida, não consegui exibir ela aqui pois o sistema de publicação "engole" as barras (depois irei verificar).

Utilizei o document.write apenas como exemplo da possibilidade de uso, no meu caso utilizei as barras invertidas em um $("#link123").html("onClick….") sem problema nenhum.

 

Uma dica simples que para quem trabalha com Javascript não deve ser novidade, mas lembro de ter tido problemas com isso em um passado distante, como tive o mesmo problema agora resolvi fazer o post para ajudar quem pode precisar (e evitar ter que googlear novamente este mesmo problema).

 

Dúvidas, dicas e críticas nos comentários 🙂

 

Não programe isso!

Meu primeiro contato profissional com desenvolvimento server-side  foi em 2004, quando comecei a trabalhar como estagiário em uma agência de design, onde aprendi muito sobre clientes, gráficas, prazos e internet.

Eu já havia “programado” em PHP, na verdade tudo o que eu tinha feito foi um CMS bem meia boca para um blog, com um sistema de comentários. Nunca gostei do blogger e na época não conhecia o WordPress (ele existia em 2002?).

E eu aprendi errado. Aprendi a programar com um designer, não com um desenvolvedor “de verdade”. Faltava conhecimento técnico para quem me ensinou e eu mal tinha noção da vida, quem dirá de se preocupar com fazer um script correto. Funcionou? Beleza, deixa. Essa é a ética POG.

 

 

Hey, antes de ler saiba que…

Esse texto é FOR DUMMIES. Ou um bom exemplo de piada para desenvolvedores mais experientes. É um pouco da minha experiência desde que comecei a programar. Apresento aqui um caso de script BIZARRO, e comento sobre os problemas dele e suas gambiarra.

Se você é ninja pode achar um desperdício do seu precioso tempo continuar a leitura, então recomendo que você vá para a Home e procure algo do seu nível.

Ou continue a leitura e se mije de rir.

 

 

Boas soluções lógicas porém debilidade técnica, eis é a fórmula da gambiarra.

Ontem, quando comecei a desenvolver o novo blog do And After (antecipo que o novo blog será sobre Arquitetura de Informação, com uma galerinha que manja muito! 😀 ) fui dar uma olhada em uns script antigos, desenvolvidos na época do meu estágio, e isso me levou a escrever este artigo.

Ah, e antes que me acusem: eu defendo o estágio, e aprendi muito quando o fiz.

Leia outros artigos sobre estágio:

Estágio é só exploração?

Na vida de um estagiário… (vídeo)

 

Encontrei uma SUPER GAMBIARRA em um script de paginação (ASP) que era utilizado na empresa que eu trabalhava. Vou repetir: SUPER GAMBIARRA. POG de mestre em POG.

 Gambiarra

Isso é uma gambiarra.

 

Vamos lá, como NÃO fazer um script de paginação:

A primeira coisa que precisamos para fazer uma paginação é saber o total de dados e quantos dados vamos exibir em cada página, correto? E já neste início está a gambiarra que eu quero apresentar, para quem está começando jamais utilizar.

 

Gambiarra?

Não faça isso também.

 

Primeiro, cria-se uma consulta no banco para pegar todos os dados, aí está o primeiro problema. Uma consulta extensa e inútil.

set rs = conntemp.execute("SELECT * FROM imoveis WHERE aprovado = 1 ORDER BY data desc")

Agora vamos ver qual o total dos resultados, par saber quantas páginas iremos criar, veja só o que não fazer.

max= 10
total = 0

do while not rs.eof
                total = total + 1
                rs.movenext
loop




Na época mesmo sem entender NADA eu pensei: tem que ter um comando para contar as linhas de uma consulta. E óbvio, isso existe.

Bom, vou pular a parte normal do código e partir para a próxima gambiarra. Vou chamar essa consulta de todos os dados de super consulta. Nunca use uma super consulta. É desnecessário. Se estava na página 1, o script era o seguinte para exibir os dados:

For x = 1 to max

Response.write rs(“dados”)
rs.movenext

next

Onde max é a variável que define o número de itens exibido por página. Achou ridículo? Calma, tem mais.

Se o usuário vai para a página 3, já imaginou como é feito? Isso mesmo, a consulta com todos os resultados continua e calcula se quantos movenext serão necessários para chegar na linha desejada. Veja como fica esta obra de arte POG:

for z = 1 to pagina

                for dado = 1 to max

                               if not rs.eof then

                               rs.movenext

                               end if

                next

next

O que esta gambiarra faz? Se você está na página 3, o script por três vezes repete o comando movenext por 10 vezes (a variável max). Depois disso, repete-se o loop do max, para exibir os itens.

Se você não entendeu porque isso é prejudicial (você é noob), vamos lá, vou falar um pouco de otimização.

 

Explicando os problemas

 

Problema #1 – A super consulta

Não precisa ser nenhum gênio para pelo menos imaginar que diversas consultas no banco de dados prejudicam o desempenho de um script. A super consulta pode ter como resultado 9 linhas como 999.234.765 linhas. E você vai usar apenas 10 destas linhas.

Outra coisa muito comum (para quem desenvolve aplicações pequenas e não tem conhecimento técnico) é utilizar o SELECT * FROM. Exemplo, você faz a pesquisa que resulta em 9 colunas por linha. E você precisa apenas de duas, nome e ID.

Solução #1

Retorne os resultados com apenas com os dados que precisa, utilize o comando LIMIT sempre!

Se você vai utilizar somente os 10 primeiros resultados e quer apenas o a coluna ID e o NOME utilize a seguinte consulta:

SELECT id,nome FROM tabela LIMIT 10

 

Problema #2 – A contagem das linhas

Ficar percorrendo todas as linhas de uma consulta e criar um contato estilo  x = x+1 definitivamente não é uma boa opção. Na verdade não deveria nem ser considerado uma opção.

Solução #2

Como contar as linhas sem utilizer a SUPER CONSULTA? Simples, pequeno gafanhoto.

Utilize o comando COUNT, veja o exemplo abaixo.

SELECT count(ID) as total FROM tabela

Fazendo isso você utiliza o total como umas coluna da tabela, por exemplo:

total = rs(“total”)

 

Problema #3 – Chegar na linha desejada

Tudo bem, você conseguiu fazer a consulta e pegar o valor total, se a página for a 1 você utiliza o LIMIT, mas quando a página for maior que 1 não tem jeito, você vai utilizar a SUPER CONSULTA e contar os movenext, certo?

NOT!

Nada de SUPER CONSULTA, jamais nesta vida.

Solução #3

Para chegar na linha desejada utilizaremos novamente o comando LIMIT, suponto que você está na página 3 e o máximo de itens exibidos por página é 10. Você precisa pegar da linha 21 até a 30. Sua consulta:

SELECT id,nome FROM tabela LIMIT 21,10

Simples assim, o LIMIT pode não somente limitar o número de resultados, utilizando o formato acima ele seleciona exatamente quais linhas serão resultados da consulta.

 

Conclusão

Jamais confiem em um designer programando server-side.

Brincadeira! 🙂

Sou formado em design e está fazendo 5 anos que programo em ASP (clássico). Sim, ASP clássico, eu sei, estou OLD e já passou da hora de me atualizar.

Mas meus códigos de hoje são limpos, são orientados não por uma pessoa, mas por fóruns, blogs e muitas Googleadas. Este ano comecei a estudar .NET (estou começando, na verdade 🙂), li artigos e um livro de SCRUM, testei scrum solo. Acompanho blogs de desenvolvimento, ano passado comecei a estudar mais a fundo javascript (e jQuery). Ah, fiz um pequeno framework para desenvolver as intranets de meus clientes, está funcionando bem, de forma modular, permitindo diferentes configurações. Além do aprendizado (javascript, ASP, SQL) depois um BOM tempo com o aprendizado comecei a utilizá-la para meus clientes, o retorno financeiro começou no final do ano passado.

O que eu quero dizer é: estude. Estude muito.

Duvidem do código que estão vendo. Duvidem da primeira solução que encontrar.

Se tiverem oportunidade participem de um projeto de porte médio ou grande, ou façam um teste de carga em seus scripts. Gambiarra só “funciona bem” em aplicações pequenas, pois guando o bicho pega vai tudo pro pau.

Estude.

Leia metodologias, baixe scripts, teste soluções novas para problemas antigos.

Aprenda a economizar consultas ao banco de dados.

Aprenda a utilizar cache. Invente um modelo de cache. Mas não gambiarras.

Estudem.

E claro, assinem o FEED do O Desenvolvedor, pois o Chris Benseler manda muito bem. E ele não é um designer metido a programador como eu. 🙂

 

 


 

Atenção 2

Jamais utilize os códigos que estão em VERMELHO neste artigo. Se você fizer isso provavelmente você perderá o emprego. A honra. E sua conta naquele fórum bacana de desenvolvimento que você participa.

Como permitir que subdomínios leiam os Cookies do domínio principal em ASP

Criei o And After para dominar o mundo e me tornar um milionário da internet, para isso conto com a ajuda dos donos do mundo (Bia, Chris e recentemente o Cristian). 

As idéias foram crescendo, Um dos projetos está sendo desenvolvido em um subdomínio, mas por padrões de segurança um cookie só pode ser lido pelo domínio que o criou, então os cookies ficam inacessíveis para os subdomínios.

Cookies

Se você não sabe NADA sobre cookies recomendo as leituras:

Como criar e ler cookies em ASP

Classe para gravar e ler cookies – por javascript

 

Para permitir que todos os subdomínios consigam ler o cookie precisamos apenas adiconar a propriedade domain na hora de criar o cookie.

 Por exemplo, tenho um cookie chamado odesenvolvedor que foi criado pelo domínio andafter.org e quero permitir que o subdomínio testes.andafter.org consiga ler este cookie, quando eu gerar o cookie adiciono a seguinte linha:

 

Response.Cookies("odesenvolvedor").domain = "andafter.org"

 

Neste cado o atributo domain permite que todos os subdomínios de andafter.org tenham acesso ao domínio.

Todo poderosoTodo poderoso

"That”s the way the cookie crumbles"*

"E é assim que o biscoito é repartido"*

 

Simples e fácil, agora posso dominar o mundo utilizando diversos subdomínios!

Espero que isso tenha ajudado, sugestões, dúvidas e críticas nos comentários 🙂

 


 

Para quem não lembra no filme Todo Poderoso, esta é a "assinatura" do âncora que se torna deus, interpretado por Jim Carrey. Via Wikiquote