Categorias
banco de dados desempenho dicas sql server

Problemas de cache no SQL Server

Se voc?? estiver recebendo uma mensagem do tipo:

O SQL Server encontrou %d ocorr??ncia(s) de libera????o de armazenamento em cache para o cache ‘%s’ (parte do cache do esquema) devido ?? manuten????o do banco de dados ou opera????es de reconfigura????o.

ou

SQL Server has encountered %d occurrence(s) of cachestore flush for the ‘%s’ cachestore (part of plan cache) due to some database maintenance or reconfigure operations.

?? porque, segundo a MSDN, ao limpar o cache do plano gera uma recompila????o de todos os planos de execu????o subseq??entes e pode provocar uma queda repentina e tempor??ria no desempenho da consulta. Para cada armazenamento em cache limpo no cache do plano, aparece a mensagem supracitada.

Para resolver isso, basta ir no banco correspondente, clicar com o direito sobre ele e escolher Properties (Propriedades). Entre em Options (Op????es) e configure o Auto-Close (Fechamento Autom??tico) para False.

Categorias
asp erros iis seguran??a web.config

Error 500 Internal Server Error – Como descobrir o problema

Quando d?? esse erro muitas pessoas tremem s?? de ver! Abaixo darei uma dica para quem ?? marinheiro de primeira viagem e se depara com isso.

Essa tela ?? gerada pelo IIS para camuflar o erro para o usu??rio. Se a aplica????o n??o for bem tratada quanto a erros, esse ?? o ??ltimo recurso que o IIS faz para n??o exibir o erro na tela. Seria bem inc??modo para o usu??rio ver na tela o erro de seu site, por exemplo. Para quem est?? gerenciando a aplica????o ?? inc??modo at?? certa parte, pois muitas vezes o desenvolvedor resolve o problema mais olhando o erro do que analisando log, events, etc. Pois bem, vamos l??!

Abra o IIS e procure pela fun????o Error Pages (P??ginas de Erro) no m??dulo IIS. Entre e procure pelo link Edit Resource  Settings (Editar Configura????es de Recurso). Ao abrir, a tela de Edit Error Pages Settings (Editar Configura????es de P??gina de Erro) escolha a op????o Detailed errors (Erros detalhados) e OK.

Ou, mais especificamente para o ASP.NET, procure a fun????o .NET Error Pages (P??ginas de Erro do .NET) no m??dulo ASP.NET. Entre e procure pelo link Edit Resource  Settings (Editar Configura????es de Recurso). Ao abrir, a tela de Edit Error Pages Settings (Editar Configura????es de P??gina de Erro) escolha a op????o Desactive (Desativar) e OK.

Com isso, a depender do erro, j?? estar??o sendo enviados para a tela. Lembram do post sobre seguran??a? No web.config, deixe o customErrors com o atributo mode=”Off” caso necess??rio para que os erros sejam exibidos.

Caso ainda n??o tenha descoberto o problema, acesse a configura????o do ASP  no m??dulo IIS. Expanda a propriedade Debugging Properties (Propriedades de Depura????o) e coloque como True a fun????o Send Errors to Browser (Enviar Erros ao Navegador).

Isso deve ser mais do que o suficiente para exibir o erro e identificar qual o problema est?? na aplica????o. Lembrando que, se prefer??vel, n??o deixar o erro ser exibido para o cliente. Deve-se fazer o poss??vel para tratar e localizar adequadamente o problema. Seguran??a em primeiro lugar!

Categorias
cufon dicas javascript jquery master page

Cufon na Master Page

Para quem est?? com problemas no carregamento/aplica????o do Cufon quando estiver usando Master Page, chame-o da seguinte forma:

<script>
Cufon.now();
function pageLoad(sender, args) {
      Cufon.refresh();
}
</script>

Assim ele aplica corretamente ap??s o carregamento da p??gina.

Categorias
ajax dicas

Out of Memory at Line – Mem??ria Insuficiente

Dica r??pida para quem tiver esse tipo de problema: remova o atributo LoadScriptsBeforeUI=’false’ from ScriptManager. Dentro de Grid edit??veis ou em formul??rios din??micos a valida????o do Javascript falha quando estiver fazendo esse tipo de otimiza????o.

Categorias
analytics api google integra????o

Integra????o ASP.NET (C#) com o Google Analytics

Nesse artigo irei demonstrar como fazer consultas no Google Analytics, de um determinado site, para ser usado em c??lculos estat??sticos afim de gerar gr??ficos semelhantes. Ou seja, irei demonstrar como fazer a consulta e retornar os dados. Os gr??ficos e exposi????o dos dados ficar?? ao seu crit??rio. Ao final poder?? ter algo assim:

Primeiramente e ??bvio, ?? preciso dos dados da conta Google como o e-mail e senha para autentica????o. Cada site cadastrado no Analytics tem um ID do Perfil e ele pode ser localizado na seguinte p??gina  de Configura????es do Perfil. Atrav??s desse Id ?? que consultamos os dados de um determinado site.

Com esses dados em m??os, vamos ao entendimento da integra????o. O Google disponibilizou um framework que auxilia na consulta e retorno de dados em .NET e ela pode ser baixada no Google GData. Dentro dela cont??m v??rios bin??rios mas precisaremos apenas dos seguintes:

  1. Google.GData.Analytics.dll
  2. Google.GData.Client.dll
  3. Google.GData.Extensions.dll

Adicione-os ao seu projeto. Mas antes de come??ar a programar isso, vamos ao entendimento das consultas realizadas. No link http://code.google.com/intl/pt-BR/apis/analytics/docs/gdata/gdataExplorer.html tem um simulador que ser?? similar ?? consulta feita pela sua aplica????o. J?? no link http://code.google.com/intl/pt-BR/apis/analytics/docs/gdata/gdataReferenceDimensionsMetrics.html cont??m toda as especifica????es necess??rias.
Como n??o gosto de perder tempo e, para muitos pode ser um pouco confuso o seu entendimento logo de cara, vamos fazer uma abstra????o:

  • ids: ?? o ID do Perfil conforme vimos anteriormente;
  • dimensions: vamos “acatar” que seja os relacionamentos (linhas)  (n??o ?? obrigat??rio);
  • metrics: vamos “acatar” que seja o que deseja buscar (colunas);
  • segment: especifica????o do tipo de consulta (n??o ?? obrigat??rio); 
  • filters: ?? o WHERE da consulta (n??o ?? obrigat??rio);
  • sort: ordena????o  (n??o ?? obrigat??rio);
  • start-date: data de in??cio (formato yyyy-MM-dd);
  • end-date: data final (formato yyyy-MM-dd);
  • start-index: serve para paginar dados (como o MySQL usa o LIMIT);
  • max-result: quantidade m??xima de registros retornados.

Essa ?? a explica????o mais entend??vel poss??vel e que posso passar para voc??s. Logo, antes de botar a m??o na massa, sugiro fazer v??rias simula????es e ver como ?? retornado os objetos. De acordo com a simula????o que fiz, por exemplo, e de acordo com a figura seria a seguinte busca:

“Me retorne todas as cidades, que visitaram meu blog, com suas respectivas quantidades de visitas no per??odo de 03/07/2011 a 17/07/2011 ordenada por cidade. S?? me traga os 50 primeiros registros.”

Ent??o, me seria retornado a seguinte “tabela”:

Ficou claro? Tranquilo, n??? A pior parte j?? passou. Agora, porqu?? escrevi “tabela”… Porque n??o ??! Lembra que abstra??mos para que seja isso. Sabendo de como a API trabalha ent??o bastemos implementar. Vamos l??! Pode-se criar uma classe ou incorporar na mesma p??gina o c??digo. Fica a seu crit??rio!

Adicione os seguintes namespaces:

using Google.Analytics;
using Google.GData.Analytics;
using Google.GData.Client;
using Google.GData.Extensions;

Tamb??m as vari??veis abaixo s??o necess??rias para a devida autentica????o e consulta nas quais descrevem:

// Vari??veis
string user; // Usu??rio da Conta Google Analytics
string pass; // Senha  da Conta Google Analytics
string id_tabela; // ID do Perfil

// Inicializa????o
user = “email@gmail.com”;
pass = “senha”;
id_tabela = “ga:30897221”; // Tem que colocar a string “ga” na frete do ID do Perfil

Agora adicione os seguinte m??todos:

/// <summary>
/// Consulta o Analytics
/// </summary>
/// <param name=”query”></param>
    private DataFeed ConsultaAnalytics(DataQuery query)
    {
        AnalyticsService asv = new AnalyticsService(“gaExportAPI_acctSample_v2.0”);
        asv.setUserCredentials(user, pass);
        String baseUrl = “https://www.google.com/analytics/feeds/data”;
        query.Ids = id_tabela;
        query.Uri = new Uri(baseUrl);
        return asv.Query(query);
    }


/// <summary>
/// Retorna o resultado da consulta
/// </summary>
/// <param name=”query”></param>
/// <returns></returns>
    private DataTable RetornaTabela(DataQuery query)
    {
        DataTable resultado = new DataTable();
        DataFeed feed = ConsultaAnalytics(query);
        if (feed.Entries.Count > 0)
        {
            // Cria as colunas
            DataEntry colunEntry = feed.Entries[0] as DataEntry;
            foreach (Dimension colundimension in colunEntry.Dimensions)
                resultado.Columns.Add(new DataColumn(colundimension.Name.Substring(3)));
            foreach (Metric colunmetric in colunEntry.Metrics)
                resultado.Columns.Add(new DataColumn(colunmetric.Name.Substring(3)));          


            // Insere os dados
            foreach (DataEntry singleEntry in feed.Entries)
            {
                DataRow rw = resultado.NewRow();
                foreach (Metric metric in singleEntry.Metrics)
                    rw[metric.Name.Substring(3)] = metric.Value;
                foreach (Dimension dimension in singleEntry.Dimensions)
                    rw[dimension.Name.Substring(3)] = dimension.Value;
                resultado.Rows.Add(rw);
            }
        }
        return resultado;
    }

??bvio que essas s??o apenas sugest??es de implementa????es e voc?? podem mudar o quanto achar melhor a depender de sua unidade de neg??cio. Agora vamos fazer aquela consulta:

        // Dados da consulta
        DataQuery q = new DataQuery();
        q.Dimensions = “ga:city”;
        q.Metrics = “ga:visits”;
        q.GAStartDate = DateTime.Parse(“03/07/2011”).ToString(“yyyy-MM-dd”);
        q.GAEndDate = DateTime.Parse(“17/07/2011”).ToString(“yyyy-MM-dd”);
        q.Sort = “ga:city;
        q.NumberToRetrieve = 50;


        // Resultado
        DataTable resultado = RetornaTabela(q);

Pronto! Ir?? me retornar um DataTable com aquela tabela de dados. Basicamente todas aquelas informa????es que voc?? v?? no Analytics s??o vindas em formato tabela e que, posteriormente, s??o feitos tratamentos e c??lculos sobre eles. Como disse no in??cio do artigo, agora basta usar a tabela de dados conforme desejar…
Espero que tenham gostado depois de um tempo sem postar nada…