Um Manifesto!

...

  • Increase font size
  • Default font size
  • Decrease font size

Blog

Melhorando o tempo de resposta de pesquisa do Mysql

E-mail Print PDF

Após o cáos com caracteres estranhos, chegou a hora de refatorar a camada de Persistência, os acessos a DAO e o banco de dados em si.

O erro inicial foi de planejamento, não se tinha noção da quantidade de dados que iria no sistema , e este estrapolou o nível aceitável para performace razoavel. Veremos três casos onde houve melhora de performace em partes críticas:

O gargalo era principalmente ao trabalhar com uma tabela de respostas(a resolução do problema anterior), que em menos de 6 meses chegou a cem mil ( 100 000 ) registros. Sendo que cada consulta nesta incluia/recuperava/atualizada 400 linhas no mínimo.

Primeiro, persistência de modo conhecido como Lazy, onde só se recupera o necessário para a determinada tarefa. Por exemplo, vamos listar os Relatórios com dados e seus resumos (numeros). Para isso fazemos a busca na tabela de Relatórios, esses para calcular seus resultados(que vao aparecer na lista) fazem buscas nas respostas dadas. No caso conseguimos melhor performace ao reduzir a busca na tabela de respostas apenas à pontuação.

Segundo caso, para retornar respostas ao relatório preparamos uma query especial (por fora do framework de persistência) no DAO. Frameworks sempre são uma mão na roda, neste caso foi um desenvolvido especialmente para o sistema, mas costuma consumir mais recursos.  Nesta query especial já se armazenava as respostas desta auditoria a ser usada, evitando buscas uma-a-uma. Podemos dizer que a 2.1 foi o mesmo para o sistema de atualização. Fui uma melhoria inestimável.

Terceiro foram melhorias no banco de dados em si, não sou DBA. Primeira melhoria no banco de dados foi a troca de engines. Por padrão o banco de dados usava a engine innodb, esta dá mais recursos as tabelas. Troquei , apenas nesta tabela, pela myisam mais rápida. A troca é feita através de sql mesmo, com "alter table respostas engine=myisam". Isso representou 40% menos tempo de carga.

A segunda no BD foi a divisão da tabela através de views. Na verdade primeiro criou-se a tabela fisicamente, mas depois optei por views.

A view é uma tabela criada a partir do resultado de uma query, no caso dividimos pelos fk relatorio .  Assim:

"create view resposta1 as select * from respostas where relatorio < 300" ;

"create view resposta2 as select * from respostas where relatorio < 600 and relatorio > 300" ;

E por ai vai. A solução inicial seria particionar a tabela, mas este recurso nao estava disponivel. Desta forma mexemos no DAO para saber qual view buscar, assim reduzindo uma busca em 100.000 registros para 30.000 . O problema é que ainda não sei como automatizar isto, e tenho certeza que tem solução melhor, mas como disse não sou DBA.

Resumindo, dicas:

  • Lazy, recupere apenas o necessário
  • Pré-carga, já mantenha em memoria o que for usar
  • Engine, escolha a mais adequada a cada tabela
  • Partcionamento/Views, uma consulta em 30 mil é mais rápida que em 100 mil

Completo afirmando que o MySql é um grande banco de dados, esta aguentando muito bem a carga de várias tabelas com muitiplas relações.

Eu sofri bastante e aprendi muito, hoje teria modelado diferente, mas mesmo assim, foi possivel reverter facilmente o sistema de modo a ter melhorias, graças a uma boa modelagem e um sistema de camadas eficiente, isso se tornou (esta se tornando) melhor escalável.

De qualquer forma, ainda estou estudando possíveis soluções e melhorias para o sistema. 

Last Updated on Wednesday, 27 February 2008 00:14
 

Sobre Codificação de Caracteres em PHP

E-mail Print PDF

Esta semana passei por sérios apuros em um sistema que estava terminando, devido a acentuação e codificação dos textos.

O problema era com caracteres especiais, e estavam se perdendo acentos e cedilhas. Trata-se de um sistema, onde se podiam criar formulários. Criando seções, perguntas  e possiveis respostas.

Ao preencher um formalário, este era obviamente salvo e , entre varios outros detalhes, podia-se personalizar a resposta dada a cada pergunta, em cima das opções disponiveis de respostas. Logo, toda a informação deste formulário era salva, ao invés de apenas referências as respostas, para garantir a informação após finalizar, caso alguma resposta fosse alterada.

O sistema, devidamente divido em camadas, MVC, DAO e tudo mais de bom. O formulario então era salvo em XML no Banco de dados, para ter mais flexibilidade.

O problema foi quando as respostas personalizadas entravam no banco de dados que iam para o XML, voltavam para o Model. Como o sistema era em português, entravam dados em ISO-5899-1, padrão. O erro foi utilizando o SimpleXML do PHP.

O SimpleXML do PHP, apenas aceita UTF-8, com isso tivemos que codar o XML na entrada para UTF-8. E assim decodava no View. Porém ainda estava errado, pois já havia uma conversão ao recuperar o Model, ao passar pelo DAO, e isso não foi percebido.

Logo se encodou DUAS vezes em UTF-8 , gerando varios carateres, e apenas uma em Model. Porém, até descobrir onde isso acontecia, tentou-se encodar/des no View, para dar logo uma solução. E foi ai que houve o conflito.

Foi necessário a correção de todas as areas relacionadas, mantendo o utf-8 apenas no Model, assim apenas ele mexe nisso.

Fica ai o alerta, tomem muito cuidado com codificação de caracteres. Especialmente se for usar XML, WebServices, Json esse tipo de coisa, também costuma dar trabalho.

A dica é desenvolvendo em camada, tenha a certeza que todas trabalham no mesmo encoding, do View ao Banco de Dados, e que apenas no Model ou no DAO, sejam feitas alteração nisto. 

Feito o desabafo! 

As funções referentes são a utf8_encode() , utf8_decode() e simpleXML()

Last Updated on Sunday, 24 February 2008 13:51
 

Migração Para o Joomla (REPUBLICADO)

E-mail Print PDF

Estou terminando de migrar todo o site para o joomla, que esta se mostrando uma ferramenta de gerência de conteúdo incrivel! Tem plena documentação e muita informação pela internet. É sem dúvida uma grande escolha, pois você terá um sistema que serve para sites menoreso ou blogs, mas é escalavel para grandes portais sem mais trabalho.

Ele por si só, já vem bem interessante com bons recursos. Mas existe muito mais explorando suas extensões, que são extremamentes simples de instalar e configurar. Existe ainda diretorios de extensões, como este onde achei quase todos que uso. Eis as que eu uso:

  • Tradução do front-end para português do Brazil.  Que é indispensável.
  • Componente para gerenciar Feeds, o ds-syndicate ,já que outros não funcionaram bem.
  • !JoomlaComment para gerenciar comentários.
  • joomla-visities , para estatisticas completas e bem eficientes de acesso.
  • my-content , para gerenciar conteúdo através do front-end, o propio site, ao invés do administrador. Útil para conteudo colaborativo.
  • sh404SEF , para URL amigaveis, já que o openSEF é ... complexo, e o do joomla não é suficiente.
  • ShowRSSLink , para aparecer o "link rel", que fica o icone RSS na barra de endereços.
  • O tema ainda não lembro aonde achei.

Ainda esta tudo "meio" em teste, mas espero que de tudo certo, e ,por hora, estou satisfeito como resultado.

A única parte que deu trabalho foi copiar e colar os textos, criando as categorias e seções devidas.

 

Mudança nos Feed e Yoomp

E-mail Print PDF

Após a migração aparentemente bem sucedida para o Joomla! agora foi a vez dos  feeds rss  mudarem, apartir de hoje estou queimando meus feeds no yoomp. Para quem não conhece ainda, o Yoomp, é um agregador de blogs muito legal e bem desenvolvido, que esta crescendo muito e muito rápido, além de contar com widgets bem legais.

De agora em diante o novo feed está em http://feeds.yoomp.com/manifestoblog  caso tenha alguma alma perdida assinando meus feeds, favor atualizar :). 

Agora também podem ver as ultimas "blogagens" sobre tecnologia dos blogs cadastrados na barra a esquesda, cortezia do yoomp.

Bom, é isso ae. 

Last Updated on Monday, 18 February 2008 16:40
 

Como criar pacotes Debian

E-mail Print PDF

Agora descrevo como criar pacotes debian, os famosos .deb. Muito uteis para facilitar a instalação de seus programas e scripts, para compartilhar configurações  e distribuir seus pacotes de forma a ficarem integrados ao sistema.

Neste processo farei como exemplo a criação de um pacote para o Qfacul, minha interface gráfica para o qemu.

O Primeiro passo é criar uma pasta para tomar como base do pacote, no caso criarei a pasta "pacote" dentro do diretório de arquivos temporários "tmp":

# mkdir /tmp/pacote

# cd /tmp/pacote

Dentro desta pasta deve existir também uma outro pasta chamada DEBIAN (tuda em maiuscula), que guardará a configuração de seu pacote:

# mkdir DEBIAN

Dentro deste diretório deve ter três arquivos:

  • control : Responsável pela configuração do pacote
  • postinst : Script que será executado após a instalação do pacote, para, por exemplo, configurar o sistema com o pacote.
  • prerm : Script que será executado antes da remoção do pacote, por exemplo, para remover arquivos temporários.

Eis o exemplo do arquivo control do pacote Qfacil:

Package: qfacil
Priority: optional
Version: 0.4
Architecture: all
Maintainer: Diogo Souza da Silva < This e-mail address is being protected from spambots. You need JavaScript enabled to view it >
Depends: qemu , python-gtk2
Recommends: kqemu-common
Description: Interface gráfica para o uso do Qemu.

Onde:

  • Package : Descreve o nome do pacote
  • Priority : A prioridade
  • Version : A versão deste pacote
  • Architecture : A arquiterura de processador a qual se destina
  • Maintainer : O responsável pelo pacote
  • Depends : As depêndecias
  • Recommends : Recomendações
  • Description : Descrição geral.

O postinst e prerm são scripts comuns, podem ser escritos em qualquer linguagem, sendo mais comum em pearl e shell/bash.

Este pacote servirá para instalar o QFacil, e para isso colocara o programa em /usr/bin/qfacil , logo não é um caso onde o postinst é necessário, mas por exemplo, podemos fazer assim um postinst:

#!/bin/sh

chmod 755 /usr/bin/qfacil

Na verdade não seria necessário, mas fica só de exemplo. O prerm pode ser feito qualquer coisa também.

Para copiar o arquivo para o devido lugar devemos recriar a estrutura de pastas aonde o arquivo deverá ser criado tendo como raiz, base, o diretorio do pacote.

Neste caso o diretorio do pacote é /tmp/pacote e o diretorio em que quero o script é /usr/bin, com isso crio a pasta /tmp/pacote/usr/bin. 

# cd /tmp/pacote

# mkdir -p /usr/bin

Agora dentro de /tmp/pacote/usr/bin coloco o conteúdo que quero que seja copiado para esta pasta, no caso o programa qfacil. Agora geramanos o pacote:

# dpkg-deb -b /tmp/pacote /tmp

Isto irá criar o pacote na pasta tmp, no caso exemplo o arquivo gerado será "qfacil_0.4_all.deb". Basta distribuir seu pacote, espero que seja útil. 

Last Updated on Tuesday, 12 February 2008 15:20
 

Resolução 2007 2008

E-mail Print PDF

Natal, Fim de ano. Encerrando serviços, escritos, leituras... contando saldo, revendo metas, e avaliando o que fazer para o ano que vem. Foi um ano muito bom profissionalmente. Trabalhei alocado em empresa, completei um ano de freela, que esta melhorando a cada dia. Li livros, aprendi muuuita coisa, fiz até um curso. Faltou entrar na faculdade, já esta certo para o proximo ano, chega de enrolação!

  •  Trabalhei 4 meses em empresa, que foi bem divertido. Tinha bastante liberdade e aprendi muito no percurso. A rotina mata um pouco, ter essa viagem de ida e volta e tals, mas foi uma ótima experiência, que ainda pretendo repetir. Sai para estudar, para então procurar algo melhor.
  • Os freela andam bem, deram uma acalmada pois reduzi o tempo para me dedicar aos estudos, mas ainda esta na ativa!
  • Estudei muuuito! Muito php, linux, java. Fiz a formação em Java, para aplicações distribuidas, no instituto infnet, o que foi muito bom! Estou estudando para me certificar, e estou procurando trabalho na area! Esse conhecimento também esta sendo portado para PHP.
  • Aprendi muito sobre PH, especimente sobre os recursos do PHP 5 e muita orientação a objetos. Também compreendo muito melhor SQL e banco de dados qualquer, depois de alguns projetos de maior porte de dados, compreendo o "gargalo" que um esquema de banco de dados, e queries mal escritas podem ser a uma aplicação.
  • UML, muito bom, XP melhor ainda!
  • Livros, li muito nesses 6 meses recentes. Ótimos livros! Muitos ainda para ler:
  • Extreme Programming (novatec), ótimo livro sobre a metodologia agil
  • UML (brasport), boa didatica.
  • PHP, programando com orientação a objetos(novatec), simplesmente incrivel. Aborda ótimo recursos, com muitos exemplo, classes super voltadas ao dia a dia, a parte de persistencia em especial lhe da um belo framework!
  • SQL curso prático (novatec), muitos conceitos para queries, algo que ainda quero estudar muito. O mundo DBA me interessa muito!
  • entre outros... alguns não tecnicos.
  • Internet, sempre lendo muito na internet.

 Muitas metas para o próximo ano, mas nada muito especifico, "go with the flow".

  • Começar a faculdade , chega de enrolar!
  • Ler mais, estudar mais ainda!
  • Certicar-me em java
  • Talvez em linux
  • Aprender mais de DBA e SQL
  • Aumentar minha renda, seja como freela ou como clt.
  • Me dedicar mais a meus projetos.
É isso, desejo todos que vem até aqui um feliz natal! Prospero ano novo, e até ano que vem!
 


Page 10 of 11