Arquivo de setembro \27\-03:00 2013

Sobrescrever o método open da classe window

Imagine a seguinte situação: Você entra numa empresa e o sistema que você vai manter usa aquelas janelas pop-ups do javascript, não estou falando do alert() me refiro aquelas da classe window, uma tristeza, inda mais se estivermos pensando em usabilidade e desempenho, eu digo isso, pois, é comum do usuário abrir inúmeros pop-ups destes e deixar em segundo plano ou minimizado, levando em conta maus hábitos de programação conhecido de alguns programadores em PHP, considere então conexões com o banco de dados não finalizadas até o término do script PHP, a solução é fazer com que o usuário abra estes pop-ups na mesma janela, substituindo o conteúdo de uma TAG DIV ou o atributo SRC de um IFRAME, mas, imagine também dez centenas de formulários abertos com window.open(), ficaria difícil ir a cada um e substituir né? Pois, para solucionar isso, nós podemos sobrescrever o método open() da classe window do javascript facilmente, veja abaixo um exemplo:

<script type="text/javascript">
window.open = function (open) {
    return function (url, name, features) { 
        return alert(url);
    };
}(window.open);


</script>

este código acima substitui a funcionalidade do método open() abrindo um alert() com a URL passada como parâmetro (return alert(url);), você poderia por ali qualquer coisa, por exemplo, escrever a URL com document.write().

Ao chamar o método ele mostrará uma caixa de texto com a URL passada por parâmetro.

<input type="button" value="clique" 
    onclick="javascript:window.open('http://www.google.com');">

Caso queira substituir o conteuúdo de um IFRAME, você deveria somente substituir
return alert(url); por document.getElementById("id_do_iframe").src=url;

Uma boa ideia agora é implentar este código para abrir as janelas em um painel esmaecido com DIV flutuante na frente da página que o chamou, fica muito bom!

Escrito por Roberson Carlos robersonfox at gmail.com 27/09/13

Written with StackEdit.

, , ,

Deixe um comentário

Otimizando consultas em um banco de dados MSSQL SERVER 2008

Na era dos bancos de dados NoSQL me deparei aqui na empresa onde trabalho com um velho problema, a otimização de consultas em um banco de dados relacional, e para piorar meu caso, um MSSQL 2008. No MySQL eu sempre fiz paginação usando LIMIT, porém, até pouco tempo atrás eu desconhecia o equivalente para o MSSQL, foi apanhando muito que cheguei ao estado de hoje e neste artigo ensino para quem se interessar boas práticas para otimização de consultas.

Quando enfrentei o problema pela primeira vez logo tentei usar o comando LIMIT do MySQL, porém, o MSSQL reportou um erro, então o jeito era definir uma data para exibição dos registros, imagine a seguinte situação, uma tabela que é consultada por 200 usuários simultâneos, esta tabela tem quase um milhão de registros e o programador anterior não fez nenhuma otimização de consultas, toda vez que um único usuário faz uma requisição na página do sistema o banco de dados percorre todos os quase um milhão de registro e mostra num JQuery todos os dados de uma vez, paginando no lado do cliente, um SELECT * FROM TABELA; eleva quatro processadores Xeon a 30%, isso com um único usuário, imagine a situação que este servidor passa, imagine o sofrimento dele.

Pois então, este é o cenário da batalha. A minha segunda tentativa foi definir para toda pesquisa sem condição uma condição que para o meu caso é muito válida, esta tabela possui um campo data_cadastro e na maioria das vezes o usuário não precisa ver os dados informados além do ano atual, então uma condição between entre a data 01-01-<?= date('Y')?> (01-01-2013) e a data atual: <?= date('m-d-Y') ?>, isso ajudou bastante, pois, reduziu a paginação do JQuery para 50 páginas, mesmo assim isso não desafogou o servidor e seus quatro processadores, as consultas retornavam tantos registros que geravam um arquivo HTML com 9.5MB de peso, até a rede sofria, o gasto médio de memória era de 6GB só para o MSSQL.

Uma nova intervenção foi necessária, o servidor estava negando serviço em muitos casos, então resolvi apelar para o LIMIT, pesquisei na web em busca de um equivalente para o MSSQL e descobri o TOP, analisei por um tempo o tanto de registro que os usuários exigiam e defini um limite 300, ainda assim seis telas na paginação do JQuery, adotei o critério de implementar a instrução TOP somente nas telas onde se faziam muito uso dos dados e ainda mais utilizadas pelos usuários, desta forma consegui desafogar o MSSQL.

O uso conjuto da instrução BETWEEN e da instrução TOP foi suficiente para assegurar um bom desempenho do servidor, mas, ainda assim não foi suficiente, um código mal escrito pode derrubar facilmente um servidor HP dedicado com ISS, PHP 5 e MSSQL 2008, não acreditava nisso até ver acontecer aqui, todas as medidas a nivel de codigo foram tomadas, o melhor a se fazer seria instalar um APACHE e a ultima versão do PHP, pois, esta já suporta as bibliotecas de Garbage Collector, coisa tão necessária e que esperou quase seis versões do PHP para ser implementado (disponível a partir da versão 5.3 do PHP).

A sintaxe para o uso do TOP é a seguinte: select TOP 300 * from tabela;.

Por fim, ainda com as instruções acima, algumas páginas geravam arquivos HTML enormes e que demoravam bastante para serem exibidos para o usuário final, então apliquei a função do artigo anterior e reduzi o tráfego da rede pela metade.
Estas otimizações não levaram nem uma semana para serem implementadas.

Escrito por Roberson Carlos robersonfox at gmail.com 23/09/13

Written with StackEdit.

, , , , ,

Deixe um comentário

Compactando uma página HTML antes de mostrá-la ao usuário

Compactando uma página HTML antes de mostrá-la ao usuário

Eu sempre quiz enviar a página final para o usuário compactada, quis isto para, economizar banda e reduzir tráfego, imagine a situação de uma página ter 512kb acessada por 100 usuários suponhamos a cada 10 minutos isto daria um tráfego enorme para um servidor simples

((512kb/1024)MB*100) a cada 10min

por hora algo em torno de 300MB. Uma forma de fazer isso seria compactar todo o código no servidor nas requisições do usuário, porém, isto gera alguns erros com alguns javascripts, teriamos que ter um código que faça uma compactação seletiva, por exemplo, algum algorítimo que compactasse somente os dados abaixo da tag de fechamento do cabeçalho ou início do corpo da página, mexendo no php.net compreendi como o PHP monta o HTML para o usuário e como ele manuseia o buffer, sendo assim, fácil implementar um compactador usando a função preg_replace, foi o que fiz, veja o resultado abaixo:

ob_start("compactar");
function compactar($b) { 
		$b = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $b); 
		$b = str_replace(array("\r\n", "\r", "\n", "\t", '  ', '    ', '    '), '', $b);
		return $b;
}

ao final da página deve ser colocada a função ob_end_flush();.

Eu tenho usado esta função em alguns casos no início das páginas PHP e em outros casos acima do <body> , notei que alguns javascripts não gostam de serem desidentados. Tem funcionado perfeitamente e reduzido o volume de tráfego no servidor, o que devo fazer agora é remover todo o código javascript que está no index e colocá-lo separado. Quanto ao CSS, este não mostrou problemas algum.

Escrito por Roberson Carlos robersonfox at gmail.com 17/09/13

Written with StackEdit.

Deixe um comentário

  • Follow Carl Roberson's on WordPress.com
  • Fallow me
  • Linux 20 Anos
  • Ubuntu LTS Trusty Tahr

    Lançamento da versão LTS do Ubuntu20 de abril de 2014
    Ubuntu LTS Trusty Tahr Chegou!!! http://www.ubuntu.com/download/desktop
  • Grafica Livre

  • O que estou lendo agora

  • Na minha estante me aguardando


    Literatura
  • Bookmark and Share