quarta-feira, 19 de junho de 2013

Backup da Kb II

Bom, felizmente esse tema ainda não acabou, e quem me trouxe uma nova luz foi o Alex Melo, e olha que não foi uma luzinha qualquer, o que ele disse foi o seguinte, após certo upgrade da versão X EV1, não precisamos mais do arquivo gxw e do knowledgebase.connection, basta apenas o mdf.

Então tá mais simples do que imaginava, o banco de dados é suficiente, e como devemos fazer?

  1. Copiar o mdf que se deseja restaurar na pasta onde se deseja criar a nova kb
  2. Diferentemente do artigo anterior, não é necessário conectar o banco ao SQL Server (atachar), e se estiver conectado deve-se desconectar
  3. Abrir o Genexus e em seguida execute a opção File - Open Knowledge Base, mude o filtro de tipos de arquivo para mdf, e aponte para o banco de dados previamente copiado.
O Genexus abrirá uma janela dizendo Knowledge Base Directory change detected, mas não ligue muito para isso, basta pressionar confirmar e a kb será recriada.

O Alex ainda alertou dos problemas relacionados com bases do SQL2008R2 que não abrem no SQL2008, então, será necessário um pouco de atenção com a versão correta do Banco de Dados instalada no equipamento.

Dica igual a essa não temos todos os dias, portanto, resta-nos um forte agradecimento ao nosso amigo.
 


segunda-feira, 17 de junho de 2013

Backup da Kb

Todos conhecemos muito bem o significado de Genexus Knowledge Base, visto que todo projeto Genexus é uma, mas poucos a respeito dos elementos que temos a nossa disposição em uma Kb.  E uma informação significativa, que fica meio obscura diante da estrutura da ferramenta é a simplicidade com que podemos restaurar um certo projeto por meio do próprio Banco de Dados da Kb.

Banco de Dados

A partir da versão Genexus X os projetos passaram a ser criados obrigatoriamente num banco de dados, mais especificamente no SQL Server, sendo que o próprio instalador do Genexus já adicionava uma versão 'Express' para que a ferramenta trabalhasse, isso caso não houvesse um banco desses instalados no equipamento. 

O fato é que a partir dessa versão a Kb passou a ser armazenada em um banco, não mais em arquivos no diretório do projeto, situação que inicialmente desagradou muita gente que, por falta de costume, diga-se de passagem, não gostou muito dessa ideia de ter que instalar um SQL Server, mas convenhamos esse mecanismo trouxe uma nova visão e recursos sobre o projeto.

Recriando a Kb através do BD

Um dos pontos positivos que o Banco de Dados trouxe para o projeto foi a possibilidade de se recriar totalmente certo projeto a partir do arquivo MDF/LDF.  Situação importante, principalmente em casos da quebra do computador, e claro, a falta de um backup do projeto.

Uma vez que o projeto encontra-se armazenado no banco de dados, podemos recriá-lo mediante uma pequena lista de ingredientes:
  1. O arquivo MDF e LDF do banco
  2. Um arquivo nome_do_projeto.gxw, cujo conteúdo é nenhum (vazio)
  3. Um arquivo knowledgebase.connection, contendo algo como:
<ConnectionInformation>
 <DBName>GX_KB_Curso</DBName>
 <IntegratedSecurity>True</IntegratedSecurity>
 <ServerInstance>SERVIDOR_BD</ServerInstance>
 <CreateDbInKbFolder>True</CreateDbInKbFolder>
 <Directory>Z:\NovaPasta\</Directory>
 <DataFile>GX_KB_Curso.mdf</DataFile>
 <LogFile>GX_KB_Curso_log.LDF</LogFile>
 <HostName>SERVIDOR_BD</HostName>
<ConnectionInformation>



Em negrito o caminho para a pasta onde o projeto será recriado.

Em seguida executar as seguintes operações:
  1. Anexar o BD ao SQL Server (Database - Attach), numa operação chamada de Attach.
  2. Abrir o arquivo gxw através do Genexus na operação File - Open Knowledge Base
O resultado é a reconstrução do projeto, claro que você deverá recriar o environment por meio da execução do Gx.


Esse recurso permite a realização do backup dos projetos Genexus simplesmente pelo Banco de Dados. Em caso de utilização do GxServer, o mesmo recurso pode ser utilizado, trazendo segurança aos projetos administrados pelo servidor.

Cuidado porém com o detalhe da informação Directory que se encontra no arquivo knowledgebase.connection, pois se não apontar para o novo local de criação do projeto, causará um erro Knowledge Base Directory change detected.



Cujo efeito será a tentativa de se recriar a base de dados, portanto, se aparecer uma mensagem assim você estará percorrendo um caminho incorreto para realizar a restauração e provavelmente tem a ver com essa propriedade directory.


PS: ver http://www.genexando.com/2013/06/backup-da-kb-ii_19.html

quinta-feira, 13 de junho de 2013

Quer aprender Genexus? (revisado)

Pessoal antes de iniciar um pequeno aviso, os links deste artigo são em sua maioria externos, me desculpe antecipadamente caso algum deles não responder adequadamente, pode ser que a fonte mudou de lugar.

O artigo foi revisado, e buscamos incluir novas conclusoes principalmente devido a abordagens que recebemos das pessoas que ingressam no desenvolvimento e de alguma forma esbarram em uma parede, que pode ser a própria dificuldade em aprender ou mesmo resistência, tentei deixar a coisa um pouco mais 'clara'.


Atualmente existe muito material disponibilizado para se aprender Genexus, a Artech oferece o site http://training.genexus.com com muitos vídeos em português, espanhol e inglês, abordando praticamente tudo que é necessário para se produzir excelentes programas com a ferramenta.

Por outro lado, aprender Genexus requer não apenas compreender uma nova linguagem de progranação, mas um conjunto de objetos com diversas finalidades, funcionalidades e características, que para um iniciante poderia trazer um pouco de confusão.

Me permitam selecionar certos fundamentos que, sob a minha ótica, são essenciais para compreender a filosofia envolvida no desenvolvimento com Genexus, e em cada um desses eixos fundamentais, um conjunto específico de objetos, que apresentamos na tabela abaixo, de forma resumida.

Modelagem
Tabela Base e Estendida


Diagrama e Navigation Report
Programação
Transformações
Interface Usuário

Na Modelagem o objetivo é representar a realidade através do objeto Transação, sendo necessário compreender um pouquinho de Análise de Sistemas.  Existe um outro video que apresenta alguns exemplos nesse sentido.

Tabela Base e Estendida são conceitos revolucionários na ferramenta e representam um importante nível de abstração para o acesso de dados nas tabelas, uma falha na aprendizagem deste conceito e você estará programando muito e obtendo poucos resultados com a ferramenta, portanto é crucial que compreenda isso.
Voce não precisa muita coisa para aprender tabela base e estendida, um objeto Diagram, uma Procedure para escrever seus for...eachs, e o objeto Navigation Report.

O objetivo da Programação é otimizar a aplicação por meio de operações não interativas, e aqui temos um reflexo do mundo real, pois Genexus oferece uma interessante linguagem de programação com muitos recursos automatizados.  O que você deve sempre pensar quando programa é fazer com que o resultado seja sempre eficaz, pois muitas vezes erramos produzindo programas lentos e ineficientes.
Outro conceito envolvido na programação é a busca por criar código reutilizável e de fácil manutenção, dai entramos no nivel dos Data Selectors e Business Components.
O conceito de Transformações representa o modelo no qual buscamos transferir informações de certo sistema para outro, muitas vezes recuperando informações de tabelas e transformando-as em outro formato como o XML ou JSON, por exemplo.  Trata-se de um conceito mais complexo, diria mais avançado, mas não deixa de ser importante destacá-lo.
Finalmente a questão relacionada com a construção de Interfaces Gráficas, aqui abordo somente Web, com dois objetos WebPanel e Patterns, não precisa muito mais que isso (talvez também o Theme, Images)

Conclusão e Dicas
Com um pouco de paciência nesse momento, porque entendo que aprender (ou reaprender) uma nova ferramenta sempre é um desafio bastante grande, procure conquistar os conceitos aos poucos. A sequencia que indicamos acima é interessante.

A dica principal que lhe passo é não buscar reproduzir a programação que está acostumado a desenvolver, no Genexus lembre-se que sempre é  ferramenta que programa para você, portanto se estiver escrevendo muito código numa procedure por exemplo, pode ser sinal que você pode não estar utilizando toda a capacidade de automação que tem a sua disposição.  Desligue um pouco seu modelo de pensar programação e passe a pensar 'como' o Genexus, quero dizer com isso que normalmente brigamos com coisas que não nos é lógica, e principalmente para desenvolvedores queremos reproduzir o que aprendemos a fazer ao longo de muitos anos de esforço e dedicação. Pensar que não será mais preciso programar um Insert por exemplo pode ser um pesadelo para alguns.

Se você não é programador, sinta-se livre para criar, sabe que tem uma pequena vantagem no inicio (mas só no inicio), conhecer sobre o que esta fazendo faz com que produza coisas 'mais' avançadas. Então, mesmo aprendendo Genexus é bom manter-se atualizado quanto as inovações.

Esqueça a programação das queries SQL (a menos que for encarregado da manutenção do BD), Genexus gera as queries de manutenção e também de recuperação e manutenção dos dados, e o próprio Genexus se encarrega de buscar os dados nas tabelas corretas.  Não precisa se preocupar com a programação de inner join, por exemplo. Mas para dominar esse tema precisa aprender o significado de tabela base e estendida.


Não queira provar que o Genexus está errado naquilo que faz, isso é sinal de que você não confia na ferramenta ou quer voltar rapidamente ao modelo 'tradicional' de programação, agindo assim não vai aprender nunca. A postura deve ser a inversa disso, deve entender 'como' o Genexus faz, aprender como o Genexus 'pensa'.  Buscar antecipar o que a ferramenta vai produzir é o exercício que o leva a dominar o bixo rapidamente.

Genexus não é fácil, parece simples, mas entenda, assim como toda tecnologia é muito simples para quem a domina, e leva-se um tempinho para assimilar tudo. Sempre me perguntam quanto tempo, e a resposta é:

Se você passar a respirar Genexus vai domina-la em um mês.  Se por outro lado ficar brigando com a ferramenta pode ser que nem aprenda.

Me desculpem agora, não quero gerar nenhuma polêmica, mas não sei quais as razões que te levaram a buscar Genexus, se for porque quer construir sistemas robustos altamente tecnológicos e de forma muito rápida, creio que vai gostar muito do que tem em mãos. Por outro lado se foi 'obrigado' a aprender porque sua empresa 'teve' que adota-la, lembre-se que deve ter havido uma razão para isso, pense comigo, a busca de uma ferramenta que automatize um pouco a programação pode significar que equipe de desenvolvimento pode não estar respondendo como deveria, ou ainda, que muitas oportunidades vem sendo perdidas devido a baixa capacidade de programação.  Em ambas as circunstâncias o melhor é realmente aprender.

Tenho plena certeza que é um excelente desenvolvedor, que tem habilidades absurdas, domina todos os frameworks, todos os caminhos que levam a produzir um programa 'especial'.  Entenda que Genexus vai expandir sua capacidade de produzir estas mesmas coisas especiais, mas pode ser que não pelo caminho que você conheça.


Desta forma desejo-lhe realmente um 'Caminho Suave' e bons estudos!

Ah, e claro que não se aprende sem o Genexus, portanto, pegue ele aqui.

Caminho Suave: que saudade dos meus tempos de criança!


sábado, 8 de junho de 2013

Javascript off, security crash!

Este é um teste interessante:
  1. Desliga a execução de Javascript no browser, Google Chrome por exemplo
  2. Execute a sua aplicação Gx
A intenção do usuário com isso era burlar as regras de negócio aplicadas na interface (browser), isso  para poder gravar coisas que anteriormente não poderia.  Sabe o que acontece?

Nada, a interface não é aberta pelo Genexus, ou seja, mesmo que o usuário venha a fazer isso, estamos bem na fita.  Agora não sei se isso foi um recurso de segurança planejado, ou não, mas o fato é que funciona.


Security Scanner

Segurança deve ser uma preocupação constante no desenvolvimento de uma aplicação, não apenas dedicarmos nosso cuidado com o desempenho, beleza e a usabilidade, como estamos mais acostumados e treinados a pensar.  Pior que isso, precisamos estar atentos aos últimos estilos e tendências dos ataques. Até parece moda! Aliás, qual será o destaque no próximo verão?  Ok, vamos ao que interessa, o que preciso programar para deixar minha aplicação segura?

Essa pergunta é difícil de responder, diríamos que podemos utilizar certos recursos para torná-la menos vulnerável. Segura totalmente, creio que nem mesmo as aplicações da Policia Federal estão. Então para dar uma mãozinha na descoberta dessas vulnerabilidades a Artech publicou uma importante extensão chamada SecurityScanner que investiga todos os objetos programados na kb e aponta as possíveis falhas de segurança que estas apresentam, utilizando para isso as recomendações apontadas na lista Top 10 da OWASP.

Para compreender melhor sobre essas possíveis vulnerabilidades, publicamos link's com as recomendações da Artech a respeito de segurança nas aplicações Genexus.
Finalmente, fizemos uma compilação básica dos possíveis problemas que podemos ter, seguindo essas recomendações e chegamos a uma conclusão mais resumida das principais configurações e recursos que devemos aplicar em nossa aplicação.
  1. Não utilize cookies para guardar informações relevantes (dados do usuário, informações confidenciais, ..., nem pensar)
  2. Utilize um certificado CSS Válido e chamadas HTTPS
  3. Marque a propriedade Encrypt URL Parameters
  4. Cautela ao utilizar campos de edição no formato HTML para que os usuários registrem suas próprias coisas.  Nesse caso bloqueie a inclusão de código do tipo
  5. Guarde informações na sessão Web encriptada, Encrypt64
  6. Guarde informações relevantes no banco de dados também encriptadas (com MD5, por exemplo)
  7. Cuidado com os diretórios abertos e acessíveis no servidor, e as operações de Upload
  8. Contrate um profissional de segurança para configurar seus servidores
  9. Não programe links com parâmetros por extenso, por exemplo, http://chama.com.br/criaconta.aspx?id=1111,senha=123456
  10. Não utilize SQL's dinâmicos, deixando para o usuário programar seu conteúdo, com o comando SQL ou acesso nativo
  11. Avalie a programação dos objetos nativos (C# ou JAVA) para observar se os mesmos não estão abrindo portas.
  12. Elimine arquivos desnecessários no UPLOAD do projeto para o servidor (elimine EXE's, cliente.exe.config, programas fontes, ...)
  13. Utilize o GAM, se possível
Esqueci de algo? com certeza, então nos auxilie dizendo qual será a próxima moda dos ataques mais comum no próximo verão.

Antes de fechar a conta, mais uma, o código do Security Scanner é aberto e público https://www.assembla.com/spaces/genexus-securityscan/wiki

terça-feira, 4 de junho de 2013

EPPlus?

Uma revolução silenciosa, porém importante, ocorreu no Genexus na versão EV2, e que também refletiu no EV1 U8, foi o EPPlus, sabe o que significa?

É uma DLL completa para construção de planilhas XLSX, incluída automaticamente em toda nova Kb com environment .Net Framework. Em outras palavras, acabou a novela, acho, e com esse recurso não precisamos mais recorrer a DLL´s externas como o JakartaPOI, entre outras.

Quer testar, não precisa muita coisa, a não ser o Genexus Ev2 ou o Ev1 com Upgrade 8, uma nova kb, e programar um webpanel com o seguinte código.

Event Enter
 &exceldocument.Open('teste.xlsx')
 &exceldocument.Cells(1,1).Text = 'alo mamae!'
 &exceldocument.Save()
EndEvent


A primeira vez que executei o Gx relutou em apresentar a planilha, creio que era o IIS tentando subir a DLL, não sei ainda, mas na segunda vez a planilha foi criada normalmente.

O EPPlus é livre sob a licença GNU, portanto, não precisa se preocupar em pagar para usá-la, a menos que queira retribuir o esforço dos pobres programadores que ralaram muito para produzir a coisa, que é digna de grandes elogios, pois permite muitos recursos além das propriedades apresentadas na variavel &exceldocument, como por exemplo a programação de PivotTables, vale a pena conferir.


Será que teremos um final feliz?







Maiores informações:

sábado, 1 de junho de 2013

MD5 com External Object

O Genexus X sofreu uma tremenda evolução, sob o ponto de vista do desenvolvedor, é claro, quando resolveu deixar que coisas externas pudessem ser encaixadas nos projetos, de forma, digamos, 'mais' natural. Porque nas versões anteriores o que tínhamos era uma ferramenta mais 'dura' e restritiva ao seu modelo mais conceitual, que consistia em entregar um conjunto de funcionalidades que pudessem ser utilizadas para programar seus sistemas, isto sem a necessidade de compreender ou utilizar códigos nativos.

E isso, claro, tem uma importante razão de ser, pois Genexus busca até hoje retirar do desenvolvedor o peso de ter que entrar no nível da programação mais manual, ou seja reduzir seu trabalho, mas como sabemos, algumas situações ainda exigem um pouco de 'intervenção', principalmente naquelas onde a ferramenta não atua de forma direta.

Assim entrou em cena um recurso tremendamente importante chamado External Object, que pode ser traduzido como: 1) a flexibilidade de incorporar em seu projeto uma DLL ou classe Java escrita externamente em outra ferramenta que não o Genexus. Ou pelos sinonimos, 2) permitir acessar Stored Procedures, Java Sessions Beans, Webservices, ...

Não vou ficar aqui discutindo a filosofia do desenvolvimento Tradicional x Genexus, mas que fique bem claro que quando se utiliza esse recurso seu projeto fica meio 'amarrado' na plataforma escolhida, portanto, cautela. Não vá saindo programando tudo externamente, Genexus ainda é a melhor opção em 99,99% dos casos.

Então, vamos a um exemplo prático.

MD5

Todos sabemos a importância de utilizarmos encriptação em nossos sistemas, que escondam informações relevantes para o caso do pior acontecer.  MD5 é um desses recursos, e que encontra muitas aplicações em nossos projetos, como por exemplo, esconder senhas de bisbilhoteiros.  O detalhe apenas é que esse algoritmo também esconde a informação de nós mesmos, pois uma vez encriptado não tem volta ao valor original.

Genexus não possui um algoritmo próprio MD, mas podemos incorporá-lo facilmente a nosso projeto com o tal External Object. Você precisa de uma classe Java ou DLL (em C#) que realize esta tarefa, e um objeto que realize a conexão com o Genexus.

Para fins de teste, vou utilizar o exemplo do MSDN da classe que realiza essa operação, que se encontra em http://msdn.microsoft.com/en-us/library/system.security.cryptography.md5.aspx,  o qual pegamos, criamos um projeto no Visual Studio e adaptamos um pouco o código, e que assim ficou.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;

namespace MD5Lib {
    public class MD5Library
    {
        private MD5 md5Hash = MD5.Create();
        public string GetMd5Hash(string input)
        { 
            byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));
            StringBuilder sBuilder = new StringBuilder();
            for (int i = 0; i < data.Length; i++)  {
                sBuilder.Append(data[i].ToString("x2"));
            }
            return sBuilder.ToString();
        }

        public bool VerifyMd5Hash(string input, string hash)
        {
            string hashOfInput = GetMd5Hash(input);
            StringComparer comparer = StringComparer.OrdinalIgnoreCase;
            if (0 == comparer.Compare(hashOfInput, hash)){
                return true;
            }
            else {
                return false;
            }
        }
    }
}

 
Olhando bem, não tem muito segredo isso ai, simples de fazer, e não fique triste se você gostaria de ver isso em Java, basta procurar na internet que terá um exemplo de classe semelhante a essa facilmente.
 
Após compilar essa classe no Visual Studio, com o .Net Framework 3.5, e obter o md5.dll, (colocamos o link ai para você baixá-la, se quiser economizar tempo) podemos partir para o Genexus para utilizá-la em nosso sistema.

 

Importando a Classe Externa


Agora a parte mais simples, que é incorporar a classe no Genexus, que conta com uma ferramenta que importa e configura a classe para nosso uso, basta seguir os passos a seguir.
  1. Copie a biblioteca md5.dll na pasta BIN do seu projeto
  2. Para isso, chame a ferramenta Tools->Application Integration, e selecione o tipo .Net Assembly Import
  3. Na janela abra o seletor de arquivos e aponte para o nosso MD5.dll, nesta pasta BIN, portanto, descubra primeiro onde se encotnra essa pasta (Tools->Explore Target Environment Directory)
  4. Na janela Select Object Parameters, pressione Next
  5. Na janela Select Classes, selecione a classe MD5Library
  6. Selecione a Classe MD5Library e os métodos GetMd5Hash e VerifyMd5Hash
  7. Pressione FINISH


 O Genexus criará o External Object nessa operação.

Usando o External Object

Enfim, depois de todo esse esforço podemos testar a coisa, criando um simples Webpanel, e uma variável do tipo Md5Library, sim, podemos criar uma variável (objeto) a partir dessa classe importada externamente.  Algo semelhante ao que foi escrito em Genexus a seguir, que pega uma palavra qualquer 'teste'e a encripta.

Event Start

 // gera um valor MD5 para um texto qualquer: teste 
 &md5gerado = &MD5Library.GetMd5Hash('teste')
 msg(&md5gerado )


 // verifica se a palavra 'teste' foi gerada corretamente
 &resultado = &MD5Library.VerifyMd5Hash('teste', &md5gerado )
 if &resultado
  msg('ok!')
 else
  msg('não ok!')
 endif

EndEvent

Por meio dessa variável podemos acessar os dois métodos criados externamente. O primeiro GetMd5Hash gera a encriptação, e o VerifyMd5Hash que verifica se certo valor (que foi encriptado anteriormente) corresponde ao texto, permitindo que testemos o valor encriptado.

Levando isso para um processo de teste de senha, seria algo assim:
  1. Quando tiver a senha do usuário encripte (GetMd5Hash) e grave o valor resultante no BD (UsuarioSenha)
  2. Quando a pessoa digitar a senha (&SenhaDigitada) avalie o valor armazenado no banco com o texto digitado, algo como: &MD5Library.VerifyMd5Hash(&SenhaDigitada, UsuarioSenha)

Conclusão

Creio que esse recurso revoluciona, pois permite aliar a potência das linguagens nativas (Java, C#) com a potência do Genexus em manipular tabelas, construir aplicações automáticas, ou seja, temos a possibilidade de construir aplicações absurdamente interessantes de forma rápida e eficiente.

Para os iniciantes em Genexus, no entanto, recomendo que tome muito cuidado para não querer fazer tudo na linguagem nativa, pois muitos vieram deste mundo tradicional e, claro, possuem mais segurança nas linguagens em que programava. Melhor é aprender Genexus, utilizar todo seu potencial, e nas situações em que este não atender, buscar essa alternativa. Digo isso porque quanto mais nativa for nossa aplicação, mais difícil será migrá-la para outros Environments, e com certeza não queremos perder essa flexibilidade ao trabalharmos com projetos Genexus.






Ps: mais uma pequena contribuição, caso queira o codigo (xpz) do exemplo + a Dll (md5.dll), pode baixar aqui.