segunda-feira, 25 de outubro de 2010

phpNucleum 5 - Onde formatar?

Onde formatar? Estamos usando o padrão MVC, mas onde é o melhor local para formatar um valor? No Model, no View, ou no Controller?

Model) Foi feita uma tentativa de formatar no Model, existem duas classes Model que deveriam receber a implementação: Modelo e Grid.
- Classe Modelo: os atributos desta classe seriam formatados automaticamente após rodar o método "encontrar" (que carrega os valores). Notou-se que se o valor de um atributo estivesse sempre formatado no Model, quando o Controller fosse utilizá-lo para efetuar cálculos (datas, monetários, etc) ele teria que "desformatar" o valor e depois formatar novamente. Sendo que o Controller fazer isso é algo bastante comum. Um outro problema registrado foi o fato de que nem sempre se deseja todos os atributos formatados, pois na página de consulta se necessita os valores de um jeito, mas na alteração de outro.
Uma solução para estes problemas foi criar um método que retornasse um array com os valores formatados, sendo que os valores dos atributos permaneciam originais.
- Classe Grid: a formatação via Model, para montantes de dados carregados em grid's, implicaria na construção de um método que percorreria todos os valores e formataria de acordo com o tipo de dado.

Problema de implementar formatação nesta camada: muitas vezes temos tipos de dados que tem uma formatação própria (independe do tipo no BD). Exemplo: campos monetários (no BD é numérico), CPF, CNPJ, telefone, etc. Nestes casos, se chegou a implementar um método para formatação personalizada de atributo na classe Modelo, porém para a classe Grid se viu dificuldade em se ter a formatação em montantes de dados grandes e, principalmente, a identificação de campos com formatação personalizada.

View) Nesta camada a formatação ocorre somente no momento de exibir os dados para o usuário. Ou seja, todas as formatações que se deseja fazer devem ser explicitamente declaradas. Esta já era a maneira utilizada para formatação no phpNucleum 4.x, um diferencial que  foi implementado no phpNucleum 5 é a utilização pelo Smarty dos mesmos métodos de formatação usados no PHP. Exemplo:
CPF: {$valoresTeste.cpf|escape|formatarCpf}
Valor: {$valoresTeste.valor|escape|formatarMonetario}
Os modificadores 'formatarCpf' e 'formatarMonetario' são os próprios métodos Auxilio::formatarCpf e Auxilio::formatarMonetario. Desta forma o código de formatação não fica redundante (pelo menos entre o PHP e o Smarty).
Os locais que possuem funções de formatação são:
- PHP (phpNucleum\Auxilio)
- jnGrid (e suas dependências)
- jnCalendar (e suas dependências)
- iReport
É fato que usando esta camada se perde a configuração única de localização, pois ao se desejar a alteração de uma configuração de formatação de data/valor, devem ser alteradas as configurações em todos os locais acima mencionados. Porém notou-se que usando a camada Model e Controller isto também aconteceria, pois a configuração de formatação do jnCalendar e do iReport seria necessária de qualquer maneira.

Controller) Não se percebeu muita diferença entre realizar a formatação nesta camada e na camada View. Porém o problema de formatar montantes grandes de dados se repetiria nesta camada (percorrer todos os registros e fazer formatação personalizada).


Conclusão
Todas as camadas tem seus prós e contras, as camadas Model e Controller têm problemas com desempenho, pois percorrer 18 mil registros para formatar valores de cpf, data, valores, etc é bastante custoso em termos de memória e processamento. Na camada View sofremos com a falta de um arquivo único de configuração, porém se percebeu que tal problema acontece também no Model e no Controller. Outra característica da View é que não existe formatação automática (tudo é explicitado). A característica de formatação automática pode ser visto como vantagem e também como desvantagem, ou seja, como tudo na informática, DEPENDE.
Em razão do exposto acima, levando-se em conta principalmente o fator desempenho, optou-se por utilizar a camada View na formatação dos dados.


phpNucleum 5 - Formatação de datas

Mudanças na classe Auxilio:
- O método obterDataFormatada($dataiso,$formato) foi renomeado para formatarDataViaGetDate($dataiso,$formato)
- O método obterDataFormatadaPadraoStrftime($timestamp,$formato) foi renomeado para formatarDataViaStrftime($timestamp,$formato)
- Adicionalmente, foi criado o método formatarData($dataiso,$formato), que recebe uma data em formato ISO e converte para o formato especificado no padrão strftime ("%d/%m/%Y"). Internamente, o método formatarData converte a data ISO em timestamp e chama o método formatarDataViaStrftime. - O método formatarData utiliza o formato que está no XML da aplicação caso o parâmetro $formato não seja especificado.
Isto foi feito pois o comando utilizado pelo método que utiliza strtime permite obter dias da semana e nomes de mês em português.
Porém, o retorno do nome destes detalhes em português não funciona com períodos menores que 1970 e maiores que 2038.

Exemplos:
Caso de teste 1: OK, data 31/12/2010.
 
    $data = "2010-12-31";
    $dataF = N::$objAuxilio->formatarData($data, "%d/%m/%Y %A");
    var_dump($dataF);
    $dataF = N::$objAuxilio->formatarDataViaGetDate($data, "d/m/Y l");
    var_dump($dataF);
/* Saída:
string '31/12/2010 sexta' (length=16)
string '31/12/2010 Friday' (length=17) */

Caso de teste 2: ERRO, data 31/12/2010.
    $data = "1965-12-31";
    $dataF = N::$objAuxilio->formatarData($data, "%d/%m/%Y %A");
    var_dump($dataF);
    $dataF = N::$objAuxilio->formatarDataViaGetDate($data, "d/m/Y l");
    var_dump($dataF);
/* Saída:
string '31/12/1965 Friday' (length=17)
string '31/12/1965 Friday' (length=17) */

Para obter a data atual basta chamar: N::$objAuxilio->formatarData(false, "%d/%m/%Y");

sexta-feira, 24 de setembro de 2010

Como percorrer um array em PHP sem usar foreach

A função foreach utiliza muito espaço em memória e pode até dar estouro de memória se o array for muito grande. Este problema acontece quando alteramos valores do array dentro do foreach.
Uma alternativa para percorrer um array grande é movimentar o ponteiro interno do array.


    $registro = reset($listaDeRegistros);
    while ($registro !== false) {  //foreach estoura memória
      $i = key($listaDeRegistros);
      //faça o que quiser....   var_dump($listaDeRegistros[$i]);
      $registro = next($listaDeRegistros);
    }

sexta-feira, 25 de junho de 2010

Instalação do Subversion (integrado com Apache)

Basta seguir este tutorial: http://ubuntuforums.org/showthread.php?t=51753&page=2

Algumas ressalvas:
  • O comando "apache2-ssl-certificate" não existe. Ao invés disso deve ser feito:
    • sudo mkdir /etc/apache2/ssl
    • sudo /usr/sbin/make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/apache2/ssl/apache.pem
  • Ao editar o dav_svn.conf, adicione as seguintes linhas após o AuthUserFile
    • Require valid-user
    • SSLRequireSSL

quinta-feira, 20 de maio de 2010

Validação XML usando XSD

Visando padronizar o uso da validação XML utilizando arquivo XSD, publicarei aqui alguns problemas que passei e a respectiva solução.
  • Para facilitar o trabalho de criar o XSD, é possível transformar um XML em XSD?

Sim, basta acessar http://www.flame-ware.com/Products/XML-2-XSD/

  • Como validar uma lista enumerada no XSD?
<xs:simpleType name="tAmbiente"> <xs:restriction base="xs:string"> <xs:enumeration value="Desenvolvimento" /> <xs:enumeration value="Testes" /> <xs:enumeration value="Produção" /> </xs:restriction> </xs:simpleType>
  • Como ter um elemento inteiro (ou qualquer outro tipo) que aceite vazio no XSD?
<xs:simpleType name="tVazio"> <xs:restriction base="xs:string"> <xs:length value="0" /> </xs:restriction> </xs:simpleType> <xs:simpleType name="tInteiroOuVazio"> <xs:union memberTypes="xs:integer tVazio" /> </xs:simpleType>
  • Como validar e-mail no XSD?
<xs:simpleType name="tEmail"> <xs:restriction base="xs:string"> <xs:pattern value="^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$" /> </xs:restriction> </xs:simpleType> <xs:simpleType name="tEmailOuVazio"> <xs:union memberTypes="tEmail tVazio" /> </xs:simpleType> <xs:simpleType name="tVariosEmails"> <xs:restriction base="xs:string"> <xs:pattern value="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*([,;]\s*\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)*" /> </xs:restriction> </xs:simpleType> <xs:simpleType name="tVariosEmailsOuVazio"> <xs:union memberTypes="tVariosEmails tVazio" /> </xs:simpleType>

quarta-feira, 28 de abril de 2010

Membro do NSA selecionado para projeto da Google

Leonardo Sápiras, membro do NSA e aluno do curso de Sistemas de Informação da FACCAT, concorrendo com estudantes graduandos, mestrandos, doutorandos e pós-doutorandos de universidades do mundo todo, foi um dos selecionados para trabalhar em projeto do Google Summer of Code (GSoC), programa da empresa Google que oferece bolsas a estudantes programadores de softwares. A lista dos selecionados foi divulgado no dia 26 de abril, no site específico do GSoC [http://socghop.appspot.com/].



Os alunos selecionados passam três meses trabalhando no desenvolvimento de algum dos projetos patrocinados pela Google. Especificamente, o Leonardo irá trabalhar em melhoramentos da ergonomia do software phpPgAdmin (famoso sistema Software Livre da área de Bancos de Dados). Esse projeto foi aceito pela Google, pela própria phpPgAdmin e pela organização mantenedora do PostgreSQL, um dos mais reconhecidos sistemas gerenciadores de banco de dados e que será a organização “mentora” da proposta do Leonardo.

segunda-feira, 19 de abril de 2010

sexta-feira, 16 de abril de 2010

Software a ser instalado após formatação

Pacotes a serem instalados

Atenção! Alguns pacotes não estão mais no repositório padrão do Ubuntu a partir da versão 10.04. Para eles estarem disponíveis siga estes passos:
  1. Synaptic->Configuração->Repositórios->Outro software
  2. Selecione o repositório "partner" e clique em Fechar
  3. Clique em Recarregar. Agora o sun-java6-jdk irá aparecer.
Pacotes
  • build-essentials
  • rpl
  • guake
  • acroread
  • openssh-server
  • apache2
  • php5

    • php5-gd
    • php5-cli
    • php5-ldap
    • php5-mysql
    • php5-pgsql
    • php5-xdebug
    • php5-curl
  • postgresql
  • mysq-server
  • sun-java6-jdk

    • Rodar o comando "sudo update-alternatives --config java" para escolher o Java da SUN
  • subversion
  • vim
  • alien

    • Pacote opcional para instalar pacotes RPM (Red Hat). Para usar o alien faça: sudo alien -i pacote.rpm

Ferramentas NSA (encontrados no "docs/ferramentas")

  • Billfish
  • Astah
  • DbDesigner Fork
  • Eclipse PDT

    • Plugin SubVersive (SvnKit connector)
    • Plugin SmartyPDT

segunda-feira, 12 de abril de 2010

Instalação do PostgreSQL 8.2 no Ubuntu 9.04 ou superior

Para instalar o PostgreSQL 8.2.x no Ubuntu 9.04 ou superior, os seguintes passos devem ser seguidos:

1) Entrar no gerenciador de pacotes Synaptic;
2) Entrar em 'Configurações', e depois em 'Repositórios';
3) Na aba 'Programas de terceiros', clicar em 'Adicionar' e preencher com:

deb http://cz.archive.ubuntu.com/ubuntu hardy main universe

ou o mirror brasileiro

deb http://sft.if.usp.br hardy main universe

4) Confirmar inclusão do repositório;
5) Verificar se o repositório novo está selecionado na aba 'Programas de terceiros';
6) Na tela principal do Synaptic clicar em 'Recarregar';

7) Após os Synaptic recarregar as informações dos pacotes, pesquisa por PostgreSQL;
8) Selecione a opção 'postgresql-8.2';
9) Clique em 'Aplicar';

10) Após a instalação do ocorrer, entre novamente na tela de configuração de repositórios (Passo 2);
11) Desmarque o repositório do Ubuntu Hardy;
12) Recarregue os pacotes novamente;

13) Fim.