terça-feira, 11 de novembro de 2014

Evolution 3 em 5 Passos

A cada mudança de versão do Genexus temos sempre uma boa expectativa de que teremos muitas coisas novas para aprender e tambem para turbinar nossos projetos. Esta sensação causa certo calafrio, pois sempre precisamos nos organizar para aprender coisas novas, aumentar um pouco nosso esforço em ajustar as coisas nos projetos, enfim, coisas que somente a evolução tecnológica traz.

Buscando ajudar você na migração para esta nova versão, pelo menos conceitualmente, montei uma lista, que reflete sob o meu ponto de vista,  quais as principais inovações nesta nova versão.

Módulos

Genexus está ficando orientado a objetos? Na pratica o produto gerado atualmente ja é orientado a objetos, visto que os geradores programam as Classes, Namespaces, Objects, ..., nos respectivos códigos fonte.  A organização dos objetos dentro do Genexus não era 'muito' orientado a objetos até este momento.

Genexus Ev3 traz implementado um novo recurso que promete revolucionar a forma com que organizamos nossos projetos, e apesar de sentir a falta de alguns pequenos detalhes, é possível ver que já temos um recurso que vai muito além da nossa necessidade imediata. O nome deste recurso: MODULO, leia-se 'Encapsulação'.

Seu objetivo fundamental é organizar a KB de forma a agrupar objetos que pertençam a uma certa classificação ou funcionalidade, que você mesmo determina, isso com o objetivo de permitir que possamos gerenciar (ou proteger) melhor a informação manipulada por estes.

Um detalhe apenas, para frustrar o pessoal mais da antiga, Módulos não é suportado para objetos Windows (workpanel, menu,...).

Módulos seguem os mesmos conceitos de encapsulação de dados da Programação Orientada a Objetos, de forma que certo recurso somente pode ser acessado na KB se o mesmo for definido como Públicos, uma propriedade adicionada em cada objeto. Na aba Interface, permite visualizar os objetos públicos do tipo Service (Procedures, Data Provider, External Objects), Data (Transações, SDT, Business Components) e User interface (Webpanel, Master Page, WebComponents).

Na aba Diagrama temos uma visualização da interligação do Modulo com outros Módulos na KB.

Enfim, esse recurso esta na minha lista de mais importantes, e acredito que esses poucos parágrafos, despertou em você o mesmo que em mim, uma certa vontade de começar a usar isso.  Então vamos por a mao na massa.


RWD

Dia desses me perguntaram o que era Bootstrap, imediatamente me lembrei da minha mamãe me dizendo para colocar uma bota para não enfiar um estrepe no pé, duro né! que imaginação fértil.  Enfim, falando sério, o pessoal da Twitter inventou uma forma de fazer mágica nas paginas web, fazendo coisas inúteis desaparecerem de acordo com a dimensão da tela.  O que significa que uma pagina apresentada em um dispositivo pequeno deveria apenas mostrar o que é mais importante, eliminando-se o desnecessário, pelo menos para os usuários desses dispositivos.

Essa mudança também reflete algo inovador no Genexus, pois temos um novo editor de interfaces Web chamado de Abstract, que permite que se monte telas responsivas,  esse é o significado de RWD, Responsive Web Design.


Smooth Web Experiencie

A frase é impactante, e na prática representa um conjunto de características que em suma querem dizer o seguinte: não precisamos atualizar a pagina inteira somente porque o usuário pressionou um singelo botão.  Nada mais desejável não? Pois é, uma das características irritantes dos sistemas web é o excesso de comunicação entre browser e servidor, que faz com que qualquer virgula alterada na interface represente a necessidade de execução de alguma coisa no servidor, e pior, toda pagina se reconstrói, alias seria muito bom se evoluíssemos para uma Web Offline, com a qualidade da nossa internet aqui no Brasil seria um sucesso.

No modelo de interface web Smooth, o que temos é uma mudança radical na ordem de execução dos eventos no servidor, pois ao invés de termos a execução de START-USER EVENT-REFRESH-LOAD, toda vez que ocorre uma comunicação com o server, temos na pratica neste novo modelo apenas o USER EVENT disparado.  Como consequência, teremos uma comunicação mais 'rápida' e mensagens mais curtas trocadas com o cliente, o que significa maior velocidade.

Por outro lado, migrar todas as interfaces do seu sistema para o modelo Smooth não é coisa simples de ser feita, pois devido a mudança da ordem de disparo dos eventos, a maioria das interfaces deixaria de funcionar, pois para a carga dos Grids, Componentes, e outros controles, teríamos que programar o Refresh dos mesmos, conceito que não existia nos idos do já antigo Genexus Evolution 2 para traz.  Por essa razão temos uma propriedade Web Form Defaults que é marcada como Previous version compatible, para que permaneçamos protegidos na caverna, enquanto não sairmos a caça para implementarmos esse magnifico recurso.

Novos comandos, que falam por si só:
  - WebComp1.Refresh()
  - Grid1.Refresh()
  - Refresh()

Outro mecanismo implementado neste modelo permite que somente o conteúdo do Content Place Holder de uma Master page se altere, enquanto que o conteúdo da própria Master Page permanece fixo, evitando-se, por exemplo, que o menu do sistema seja constantemente reconstruído.  Alem das transições que trazem um efeito cinematográfico na mudança das paginas.

Outro recurso digno de um parágrafo são as Web Notifications, que possibilitam o envio de mensagens para as paginas dos usuários que as leem sem que se precise realizar Refresh na interface. O único problema até o momento deste recurso: somente para a versão mais recente do IIS.


For each [<BaseTrnList>]

Temos aqui um recurso impactante, mas não sob o ponto de vista de nossas aplicações, pois ja passamos pela dificuldade de apontar para uma certa tabela base no modelo, mas creio que essa nova sintaxe vai auxiliar não apenas na melhoria da performance da especificação dos objetos, mas tambem para a compreensão na aprendizagem do comando for each,  pois não precisamos mais pensar em tabela mínima estendida, basta apontar o para a transação que origina a mínima estendida, e veja ai que podemos definir uma List, ou seja, podemos definir mais de uma tabela base no for each.


Single Sign On com GAM

Que tal criarmos um provedor de acesso a sistemas no protocolo OAUTH, assim como o disponibilizado no Facebook, por exemplo, isso para ingressar em vários sistemas distintos com apenas um único login. Este é o recurso implementado e que ja esta a sua disposição, bastando aplicar o GAM e ajustar um par de propriedades.

Ao realizar o login em um sistema, se dispara o acesso ao Single Sign On e se tudo estiver correto, será possível utilizar outros sistemas, desde que estejam sob o controle do mesmo GAM, ingressando nos mesmos sem a necessidade de realizar novamente o login.



Offline SmartDevice Application

O recurso mais esperado pela comunidade com certeza era a possibilidade de uma aplicação SmartDevice executar desconectada da Web, isto porque o mundo real não tem Internet em todo lugar, e ao contrario, as aplicações precisam executar em qualquer lugar.

Este recurso entrega não apenas um banco de dados local instalado no dispositivo, mas tambem um interessante mecanismo de sincronização dos dados com o servidor, que pode ser executada automaticamente ou não, e assim atualizar as informações manipuladas na aplicação.

Se você ja desenvolve Smartdevices com Genexus, tenho quase certeza que ja estudou este recurso e o esta utilizando, por outro lado, se não desenvolve, então creio que esse é um bom ponto de partida e motivador para iniciar na plataforma Genexus Evolution 3.

  • Para saber mais:  


  • Alem desses recursos temos muitos outros, mas creio que para um inicio no estudo desta nova versão, ja trazem uma boa experiência.
    Que tal sair da caverna?





    *.   Imagem 1: Fonte: http://mancave.cbslocal.com/2011/09/06/evolution-of-the-mancave/
    **. Imagem 2: Fonte: http://www.sleepwarrior.com/the-cavemans-guide-to-quality-sleep


    sábado, 8 de novembro de 2014

    iGenexus

    Sugestivo o titulo?  Na minha humilde opinião, seria muito bom se tivessemos o Genexus rodando com um formato de iGenexus, em um Mac, não?  Que tal voce entrar na Apple Store, digitar Genexus e receber um belo link para baixar o Genexus Evolution 3, rodando na ultima versão do OS X Yosemite.  Sonho! não custa nada né!


    Recentemente adquiri meu primeiro Mac, e tirando a infelicidade, agonia, e quase desespero de ter que esperar a maquina chegar dos Estados Unidos, coisa que levou cravados dois meses, dizem porque eu exagerei na dose de ter pedido uma top de linha, o resto é só alegria, tirando alguns pequenos detalhes (como a falta do Paint, por exemplo, :( )

    A decisão foi tomada devido a duas razões: 1) para criar Apps sérios para o iPhone/iPad precisamos de um Mac, e 2) estava cansado de formatar minha maquina a cada 3 meses.  Espero conseguir superar essas duas questões, pois o investimento foi alto.

    Vale a Pena?
    Muitas duvidas surgiram a respeito das possíveis e inúmeras incompatibilidades existentes entre esses mundos, questões relacionadas a desempenho, enfim, pela primeira vez na vida se aventurando fora do mundo windows é meio difícil.

    O fato e que tirando as questões relacionadas com acentuação, que eu creio que um dia vou conseguir resolver, o que pude perceber e que marte e terra não são tão diferentes assim. Sabe porque? ambos utilizam o mesmo processador (Intel i7 no meu caso), e por incrível que possa parecer o Windows roda muito bem no Mac, quase que nem percebemos que estamos em uma plataforma totalmente diferente.

    Portanto, se o seu receio é deixar suas lindas aplicações Windows quando migrar para o Mac a resposta que eu tenho é que voce pode continuar a usar todas, mesmo que isso possa constranger os puristas do Mac que, em sua maioria odeiam o Windows, não me pergunte porque.

    Genexus
    O mundo ideal seria se tivessemos o próprio Genexus rodando no Mac, coisa que acho que ainda nem esta nos planos do Sr. Jodal, de forma que pudessemos simplesmente baixar e instalar o iGenexus, mas na situação atual, temos que rodar o Genexus com Windows em uma maquina virtual no MAC.

    Temos duas opções: 1) particionar o disco do Mac e instalar o Windows, 2) rodar uma maquina virtual com Windows instalado.

    Em ambos os cenários a primeira questão que pode surgir tem a ver com desempenho, pois teríamos dois sistemas operacionais controlando a aplicação: OS X + Maquina Virtual + Windows.  Na pratica a Maquina Virtual é um computador virtual que gerencia seus próprios recursos no equipamento como CPU, Rede, RAM, Disco, ...) e que aceita não apenas o Windows, mas qualquer outro sistema operacional, e também permite dimensionar seus recursos.

    Se eu senti alguma diferença entre rodar o Genexus na máquina virtual no Mac e no PC, vou dizer para vocês que absolutamente são exatamente iguais, creio que pela atualização tecnológica, na maquina virtual esta mais rápido. Mas não podemos esquecer que estamos rodando uma aplicação Mac Os, e neste caso acho que é bem interessante porque temos o recurso de SnapShot que permite fazer um backup integral da maquina.

    Outro detalhe que passa despercebido é que estamos com dois sistemas operacionais, portanto precisamos das licenças originais para ambos, que envolve também um acréscimo de custo no projeto.

    Qual Virtual Machine?
    Existem muitas opções no mercado, eu optei por uma desenvolvida especificamente para o Mac que foi a Parallels (versão 10), e o resultado é ótimo, existe um modo Coherence que simplesmente faz com que os programas instalados no Windows apareçam no Mac como se fossem aplicações nativas, ou seja, são executadas independentemente de se montar a maquina virtual como se estivessem rodando no próprio OS X, que eu acho coisa de maluco, a que ponto chegamos com os sistemas.

    Lenda do Boot
    E aquela historia do boot no Mac ser mais rápido que no Windows? cronometrando aqui, entre o boot no Mac (estando a maquina em shutdown) e a disponibilização do Genexus para começarmos a trabalhar levam 20 segundos. Se isso é bom, acho que não, estou trabalhando uns 15 minutos a mais por dia.

    Conclusão
    Enfim, estou diante de um novo mundo, e posso dizer que algumas coisas ja fazem falta quando tenho que voltar ao notebook, o teclado do Mac é mais macio, a tecla command do Mac, depois que se aprende as funções, faz uma falta danada, e até mesmo a maluca sequencia CTRL + COMMAND + SHIFT + 4 para recortar uma imagem na tela agora não me parece coisa de marciano.

    Enfim, fica valendo a maxima de que coisa boa acostumamos fácil, fácil!




    quinta-feira, 11 de setembro de 2014

    Criptografia Segura?

    Criptografar informações importantes que devem ser protegidas é assunto sério, e com certeza todo projeto tem uma pontinha de preocupação neste sentido. Até as delações da última quadrilha que limpou a Petrobrás foram criptografadas, segundo a mídia, mas até ai vazaram...

    O fato é que será que existe algum algoritmo que seja forte suficiente que não possa ser quebrado?

    Os algoritmos RSA são importantes e muito utilizado para proteger nossas transações bancárias, e as chaves estão ficando cada vez maiores, na tentativa de torná-lo seguro. Imagina um que utiliza uma chave de encriptação de 4Kb, acho que deve ser um pouquinho mais seguro que o nosso encrypt64 de 64bits.

    O fato é que mesmo algoritmos pesados como o RSA de 4Kb foi quebrado, e o mais surpreendente, pelo barulho que o computador fazia para processar a encriptação, quer coisa mais maluca? veja ai voce mesmo.   Researchers crack the world’s toughest encryption by listening to the tiny sounds made by your computer’s CPU

    Em resumo, além de redes protegidas, firewall, certificados digitais, encriptação, também temos que trabalhar em uma sala a prova de som.

    sábado, 6 de setembro de 2014

    Responsive Web Design (I)


    Essa aqui acho que você 'talvez' nem se lembre, mas um dos desenhos mais incríveis que me fazia sonhar na infância, era Os Impossíveis. Porque? eles tinham uma bandinha de musica com instrumentos futuristas (telinha de vídeo no instrumento), o palco da banda se transformava em um carro moderninho, e as habilidades eram demais, o tal homem mola (Coin Man) esticava e encolhia, o homem fluido (Fluid Man) transformava-se em liquido para passar sob as portas, o multi-homem (Multi Man) que se replicava,..., coisa fenomenal para uma criança que não dispunha de celular e vídeo games, e muitos outros modernismos que nos transformam nos impossíveis do mundo moderno.  Ah, e tinha também sempre um super vilão para testar as habilidades dos nossos heróis.

    Não sei se essas coisas infantis e inocentes geram as idéias para a criação dos nossos aparelhos super modernos, mas muita coisa dessa época, parecem surgir nos dias atuais.

    Ao estudar um pouquinho a respeito do Design Responsivo me fez lembrar das habilidades dos nossos heróis, pois muitas características desta tecnologia, no mínimo meio maluca, são semelhantes ao tal desenho, talvez por uma simples ironia do destino. Quais?
    • Design fluido
    • Interfaces que esticam e encolhem
    • A mesma interface sendo replicada para muitos dispositivos diferentes
    • Fontes que se auto ajustam
    • E claro, nosso super vilão do desenvolvimento: tecnologias diferentes, dispositivos diferentes (leia-se aqui tanto monitores de vídeo, browsers, screens de dispositivos móveis), tamanhos e resoluções diferentes, muitos lugares distintos para mostrar a mesma informação
    Então, que tal estudar um pouco isso?

    Genexus Evolution 3


    A nova versão Evolution 3, inclui o Responsive Web Design, no padrão Genexus que é o de encapsular coisas complexas em simples propriedades, de forma a facilitar a vida do desenvolvedor, e com resultados muito interessantes.

    Vamos aos passos básicos para entender e utilizar este recurso:

    Configurando primeiro

    Inicialmente, em uma kb Evolution 3 será necessário um ajuste mínimo, que é a definição da propriedade Web Form Defaults que deve ser definida como Responsive Web Design, e se localiza em Preferences -> Version.  Abaixo desta propriedade temos outra também importante que é a definição da Master Page do sistema, que por default é marcada como RwdMasterPage.


    Isso será suficiente para que as novas transações nasçam com design responsivo.

    Estilo Flat

    Um detalhe importante nesse modelo é que o Theme Flat que deve ser incorporado na aplicação Default Theme, e que incorpora as definições CSS necessárias para a construção das interfaces responsivas.



    E agora?

    Simples, crie sua transação, e a mesma já nascerá com uma cara responsiva. No exemplo, criei uma simples transação Cliente e um web form totalmente diferente dos padrões anteriores.



    Ao invés de um tradicional Table temos um novo controle do tipo Container -> Responsive Table, e os demais controles incluídos neste componente.  Genexus inclui um novo dialogo na IDE chamado Form Preview que possibilita visualizar o resultado final.


    A transação visualizada no navegador é fantástica, parte causada pelo theme Flat que nos entrega um conjunto CSS bem mais interessante que os temas GenexusX e GenexusXEv2, anteriores, mas também pelo comportamento do próprio formulário.




    E a questão do design responsivo?

    Com os novos controles do tipo Container é possível desenhar novas interfaces que executam com comportamentos distintos, como por exemplo que responda de forma distinta às diferentes resoluções de tela, incluindo, ocultando ou alterando a posição das informações.

    Mas isso já é assunto para uma próxima aventura dos nossos super heróis. E para matar um pouco a saudade ai vai: https://www.youtube.com/watch?v=EVpmQtdpaW4 (olhando hoje, parece meio tosco, mas na época eu não perdia um, rs)


    Quer Mais?

    Você pode obter mais informações sobre Design responsivo em:
    • http://wiki.genexus.com/commwiki/servlet/hwiki?Responsive+Table,
    • http://alistapart.com/article/responsive-web-design
    • http://www.rafael.sienna.nom.br/2013/06/design-responsivo-x-genexus.html







    terça-feira, 3 de junho de 2014

    Try...Catch...

    Apagar registros por atualização direta em Genexus é uma aventura. Isso porque esse mecanismo não realiza o tratamento de integridade referencial, e se o registro é utilizado por outro, ocorre um erro/interrupção do programa, que sempre assusta bastante quem o recebe. 

    Sempre nesses casos é preferivel utilizar Business Component, mas a atualização direta ainda guarda seus encantos principalmente quando se trata de um melhor desempenho.

    Uma forma de evitar que o erro apareça nessa situação é envolve-la em um mecanismo de tentativa de execução, inexistente no Genexus, mas possível pela inclusão do código nativ
    o. Alias esta prática é bem interessante e util em muitas ocasiões.

    csharp try {
     for each
     where ClienteId = &clienteId
        delete
     endfor


    csharp } catch (Exception e) { 
        msg('Nao foi possivel completar a operacao')
    csharp }

    Nao seria muito bom se houvesse já esse simples recurso de programação disponibilizado no Genexus? Eu acho que sim.

    domingo, 1 de junho de 2014

    Senhas seguras?

    Por mais que se tente proteger informações sempre teremos curiosos com tempo e energia suficientes para espionar, invadir, quebrar o sigilo e pior, encontrar coisas importantes.  Segurança é assunto sério e proteger credenciais de acesso de pessoas, além de outras informações relevantes, deve ser uma meta a ser alcançada, visto que esta é uma das principais vulnerabilidades que estamos sujeitos na web (segundo a OWASP).

    Uma estratégia é que pelo menos que os invasores tenham muito trabalho para encontrar as coisas, ou mesmo, que as informações sejam transmitidas encriptadas para confundir e atrasar.

    Uma estrategia bastante interessante que ilustra bem essa história de confundir, é quebrar as senhas em pedaços, armazenando-a em locais distintos.  Uma idéia simples, e acredito, bastante eficiente.

    Abaixo dois links que tratam desse assunto.


    Portanto, chega de quebra-galhos, vamos melhorar a segurança dos nossos sistemas.


    terça-feira, 27 de maio de 2014

    Dois Recursos Interessantes

    De vez em quando vivemos momentos explosivos, normalmente aleatórios no tempo, em situações que muitas vezes não sabemos exatamente a causa, e que quando ocorrem a única solução é correr! Muitas vezes nem isso podemos fazer, principalmente porque a solução está em enfrentar o fogo.

    Essas situações podem surgir por meio de mensagens indecifráveis que nunca foram vistas por amigos que gentilmente postam soluções, ou pistas, que trazem um pouco de conforto nessas horas. De vez em quando trago algumas dessas situações aqui, no intuito de ajudar pessoas que talvez estejam enfrentando o mesmo leão, ou algum gatinho similar.

    Duas situações recentes relacionadas com WebServices fizeram o fogo consumir bastante a minha paciência:

    O Dia em que a Terra Parou ou
    The remote server returned an error: (404) Not Found . (-10001) 

    A primeira foi mais complexa, os webservices simplesmente deixaram de responder.

    Não me pergunte o porque ou como ocorreu, simplesmente os webservices que anteriormente se comunicavam naturalmente, deixaram completamente de responder.  O mais interessante é que ao ser chamado o tal programa respondia de forma clara com o WSDL, indicando que o sujeito estava ali esperando alguém. O programa cliente, no entanto, ao se conectar com o bixo enroscava. E uma mensagem de Not Found aparecia.

    Essa situação levou semanas para ser corrigida, muita gente foi envolvida para tentar entender a razão. E aproveito para agradecer ao pessoal da Artech (Pablo e Alex) que ajudaram bastante.

    E nas tentativas, nessa altura do campeonato movidas pelo desespero, de mexe aqui, acerta ali, a solução surgiu do nada, e veio meio estranha, e também sem explicação plausível, pelo menos para mim, que era a de renomear o webservice.  Incrível, mas ao renomear o tal programa voltou novamente a funcionar.

    Não interprete isso como um firewall ou antivírus, que havia bloqueado o tal programa, porque até isso desligamos para tentar resolver a questão, e não resolveu.  Enfim, não sei até agora o porque disso, mas o sistema voltou a funcionar.

    Intestino Preso ou
    The operation has timed out(-10001)

    A segunda apesar de ter sido resolvida de forma mais rápida, foi mais estranha ainda, principalmente porque tinha uma forte relação com os mesmos webservices que deixaram de responder no primeiro caso.  Dai claro, que a principal suspeita foi sobre os tais webservices, e perdemos novamente um tempinho com a mesma abordagem dessa vez com um pouco mais de experiência, renomeia aqui, mexe ali, reprograma.  Enfim, nada de novo, e ainda não funcionando.

    O maior problema é que os programas estavam funcionando, porque pararam novamente?  Sempre quando o sistema vai perdendo, ou perde desempenho ao longo do tempo, uma das causas possíveis pode ser o crescimento do banco de dados, pois um índice errado pode causar lentidão entre outras coisas.

    Quase por acaso, claro que após algumas horas, ou dias, tentando entender a coisa, finalmente, um select em uma das tabelas manipuladas pelo tal programa revelou uma surpresa. A mesma estava bloqueada:

    select * from sis_apptoken

    Msg 1205, Level 13, State 52, Line 1
    Transaction (Process ID 142) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.


    Enfim, uma luz, agora estava claro, o erro não era no webservice e sim no banco, que por alguma razão estava ficando 'preso'. Isso explicava porque no inicio não estava aparecendo problema, porque poucos dias após a tal tabela ter sido programada, agora tinha 20 mil registros.

    Um estudo sobre os processos bloqueados mostrou que o Genexus estava incluindo uma operação de UPDLOCK em um select, não sei o porque ainda, creio que temos um bom tema para um próximo artigo.

    (@AV11SIS_AppId char(20))SELECT [SIS_AppId], [SIS_AppTokenValid], [SIS_AppToken] FROM [SIS_AppToken] WITH (UPDLOCK) WHERE [SIS_AppId] = @AV11SIS_AppId ORDER BY [SIS_AppId]


    E os Dois Recursos Interessantes

    Enfim, nem tudo foi perdido, aprendemos alguma coisa, principalmente dois recursos que podem ajudar bastante no desenvolvimento de webservices, e também para entender um pouco situações iguais a esta.

    TCPTRACE:
    Este programa permite interceptar a comunicação na chamada de um webservice, permitindo visualizar o que está sendo transmitido para o programa e o que está sendo devolvido. Permite que se aprenda com grande facilidade como uma chamada GET ou POST é formada.  Muito útil, principalmente quando se constrói um cliente para um webservice que tenha sido programada em alguma tecnologia não Genexus.

    Basta executar o programa e definir uma porta e host de entrada (o qual o cliente deve enviar a solicitação) e a porta e host alvo (onde está de fato o webservice), formando um bypass (desvio). Para que funcione você deve programar uma porta falsa na chamada, ou seja, digamos que o webservice está em localhost na porta 80, seu programa cliente deverá ser programado para apontar para uma outra porta falsa, digamos 8085.  O TCPTRACE, vai interceptar a chamada nesta porta 8085 e redirecionar para a porta real 80.  Um pequeno trabalho, mas uma grande recompensa.

    Você pode tentar usar o Wireshark para fazer isso também, é até mais fácil, mas exige um pouco mais de experiência.

    Aqui um pouco mais de informação sobre esse recurso:
    • http://www.pocketsoap.com/tcptrace/
    • http://library.gxtechnical.com/gxdlsp/pub/home.htm?/genexus/internet/technicalpapers/debugcallsoap.htm

    LOG
    Esse aqui é muito interessante e está oculto nas propriedades do Genexus.  Trata-se de uma opção de gravação de LOG disponibilizada pelo próprio Genexus e que possibilita, entre outras coisas, avaliar as ações dos nossos programas em funcionamento.

    Para ligar essa opção vá no Enviroment e observe o valor da propriedade Log Level: o valor 6.All faz com que todas as ações sejam gravadas em um arquivo texto, que deve ser criado na raiz da aplicação com o nome client.log
    Não se esqueça de desligar isso ao mandar para o sistema para a produção.


    Créditos Foto: http://theonlinephotographer.typepad.com/the_online_photographer/2013/07/dont-try-this-at-your-volcano.html

    quinta-feira, 10 de abril de 2014

    Eletrônica com Genexus

    Genexus incorpora recursos para manipular dispositivos eletrônicos externos? A resposta é não. Mais não fique frustrado, é possível. E foi justamente esse tema que apresentamos no Evento GeneXus Brasil de 2014, e o que me deixou bastante feliz foi o fato de muita gente se interessar por esse assunto. Eu particularmente acreditava que tivéssemos algumas poucas almas perdidas nesta palestra, ou mesmo um punhado de 'nerds' malucos por eletrônica, mas de fato a presença dos participantes surpreendeu, e também me motivou a escrever esse artigo.

    Esse tema é bastante especializado então, me desculpem àqueles que não possuem muita intimidade com assuntos eletrônicos, confesso que eu mesmo não entendo muito dos detalhes envolvidos, tanto que tive que recorrer aos universitários (meu filho André), mas como como houve grande comoção e demanda dos presentes na apresentação sobre maiores informações, então afivele seu cinto se segurança e vamos lá.

    Incorporando 'Coisas'

    A grande questão envolvida aqui é como podemos nos comunicar com dispositivos eletrônicos que se conectam a portas seriais do computador? Genexamente falando não é possível, pois a ferramenta não oferece 'ainda' suporte direto ao hardware. Digo ainda porque em seguida a nossa apresentação tivemos a palestra do Nicolas Jodal que falou muito sobre o tema de sensores e a possível evolução do Genexus Evolution '4' neste sentido, mas ainda nada concreto.

    Desta forma precisamos recorrer ao conceito fundamental da ferramenta para entendermos como isso é possível.  Assim sendo, precisamos primeiro compreender que Genexus é um ambiente de desenvolvimento que possui uma linguagem de programação própria, mas o produto gerado pelo Genexus é de fato um programa escrito em uma linguagem nativa (C#, Java, Ruby), desta forma podemos incorporar recursos escritos nas linguagens nativas para 'complementar' aquilo que foi produzido automaticamente, assim como está esquematizado na Figura 1 abaixo.

    Figura 1

    Desta forma na geração do nosso sistema podemos incluir um código próprio que complemente com recursos aquilo que está 'faltando'.

    Mas atenção, gostaria de ressaltar que esta prática deve ser utilizada com cautela, Genexus na maioria dos casos gera um sistema excelente, e isso fere um pouco a filosofia Genexus, uma vez que devemos sempre nos distanciar da tecnologia e trabalhar num modelo de maior nível, justamente por causa dos benefícios proporcionados pelo aspecto multi-plataforma, mas também entendo que sob certas circunstâncias muito especificas, podemos recorrer a esta modalidade, para atender àqueles casos ditos especiais, como por exemplo abrir uma catraca eletrônica após a identificação de uma pessoa, ou obter o peso de uma balança, enfim, temos muitas situações em que essa prática é necessária.

    Como Incorporar Objetos Externos?

    Para realizar esta proeza é necessário que você produza uma classe (.Net ou Java) compatível com a versão do compilador utilizado para compilar o código produzido pelo Genexus. Atenção, isso não é feito no Genexus, mas em uma ferramenta externa qualquer.

    Esta classe deve ser programada para realizar as ações desejadas, como no nosso caso que foi o de ler e escrever coisas na porta serial do computador.

    Em seguida, de posse desta DLL ou Class Java, o processo de incorporação é simples bastando importar este objeto para o projeto Genexus, seguindo os seguintes passos:


    Figura 2
    1. Copie a DLL ou Class Java na pasta BIN da sua aplicação. Esta pasta pode ser acessada por meio da operação Tools -> Explore Target Environment Directory (no Genexus)
    2. Em seguida execute a operação Tools -> Application Integration -> .Net Assembly Import (ou Java Class Import), conforme apresentado na Figura 2, ao lado.
    3. Informe o local e o nome da DLL na caixa de texto, sendo que o local é o diretório completo até a pasta BIN de sua aplicação.
    4. Figura 3
    5. Clique em avançar, até o passo 3, no qual você deve escolher nesta classe quais os métodos públicos (da classe) que serão importados para o Genexus. Em nossa DLL incluímos os métodos abaixo, conforme podemos observar na Figura 3 ao lado: openPort,closePort,portStatus,GetResponse,SendRequest
    6. Pressione o botão Import para finalizar o processo.
    Esta ação criará um External Object na sua kb, que você poderá entender como sendo uma API (Application Programming Interface) para o seu 'hardware'.

    Para os interessados em testar este exemplo, disponibilizei a DLL Comunicação Serial que pode ser baixada a partir deste link.  Incluímos inclusive o código C# que a gerou. 

    Como Acessar a Porta Serial?

    A porta USB em seu computador é na verdade uma porta serial, e pode ser utilizada para conectar dispositivos externos, que agora passam a ser controlados pela DLL através do Genexus. Desta forma podemos incluir microcontroladores (como o Arduino, por exemplo) e sensores.

    Figura 4
    Um detalhe importante neste processo é a Porta, que é um termo que passará ao seu vocabulário a partir de agora, e que representa o local onde estaremos escrevendo e recebendo informações. Para o computador a porta é montada (definida) na medida que você conecta o dispositivo externo. Por exemplo, ao conectar nosso hardware (Arduíno) com um cabo serial ao computador, a porta montada foi a COM9. Isso foi possível de ver por meio do painel Device Manager do Windows, conforme pode ser visto na Figura 5 abaixo.

    Figura 5
    Este detalhe pode influenciar o funcionamento da DLL que você poderá baixar para o teste, visto que está programada para que funcione nesta porta COM9. Se em seu computador a porta for diferente desta você deverá alterar o código e compilá-lo novamente com o Visual Studio, alterando o texto da string para a sua porta.

    static SerialPort _serialPort = new SerialPort("COM9", 9600, Parity.None, 8, StopBits.One); 

    Prometo que estarei trabalhando em uma versão mais inteligente neste código.

    Referente ao Arduino, temos aqui um dilema, uma vez que você poderá utilizar outro tipo de dispositivo, e neste caso a situação ficaria específica para cada caso. Mas para que apenas complementemos o exemplo vou incluir aqui um pequeno programa de teste, que deve ser enviado para o microcontrolador.

    void setup()
    {
       Serial.begin(9600);
    }

    void loop()
    {
      switch(Serial.read())
      {
       case 'X': Serial.println("Ola mamae!");
                 break;
       case 'Y': Serial.println("Ola papai!");
                 break;
      }
    }

    Observe que este código se assemelha bastante à linguagem C, portanto é bastante fácil programar este microcontrolador.  No exemplo o que temos é o seguinte, se na porta serial tiver o 'comando' X o controlador responde com a mensagem Ola Mamãe! e se Y a mensagem Ola Papai!

    Como Programar no Genexus?

    Muito bem, ao chegar neste ponto acredito que você esteja com muita curiosidade para saber aonde vai parar esta história. Confesso que eu também estava muito ansioso para ver o final da operação, e acabei me frustrando porque tudo pareceu tão simples de ser programado, a não ser pelo fato da porta 'travar' com grande frequência. Ou seja, se por alguma razão ocorrer algum travamento do código, a porta ficará também alocada para o processo, gerando a necessidade de, pasmem, reiniciar a máquina. Tive que fazer isso várias vezes até pegar o jeito da coisa.

    Para evitar qualquer confusão utilizei o seguinte algoritmo para realizar a operação:

    1. Verificar o status da porta, por meio do método portStatus(), da API.
    2. Se estiver fechada abrir a porta, openPort()
    3. Realizar a operação de envio do comando, SendRequest()
    4. Realizar a leitura da porta para obter o resultado da operação, GetResponse()
    5. Fechar a porta com closePort().
    Para testar crie um WebPanel e programe dois botoes, conforme o modelo a seguir.

    Figura 6
    Ao se pressionar os botões os eventos são executados, cada qual definindo o comando a ser enviado para a porta e uma operação de execução definida no código a seguir.


    Event 'Mamae'
    &comando = comando.Mamae
    do 'Executar'
    Endevent

    Event 'Papai'
    &comando = comando.Papai
    do 'Executar'
    Endevent

    Sub 'Executar'
    &continua = false
    if not &Serial.portStatus()
    &Serial.openPort()
    &continua=true
    endif

    if &continua and not &Comando.IsEmpty()
    &Serial.SendRequest(&Comando)
    &Resposta = &Serial.GetResponse()
    msg(&resposta)
    endif

    // fecha se abriu
    if &Serial.portStatus()
    &Serial.closePort()
    endif
    EndSub

    As variáveis foram definidas como indicadas na Figura 7 abaixo.
    Figura 7
    Sendo que a variável comando foi definida como sendo domínio enumerado com os seguintes valores.
    Figura 8

    O resultado não poderia ser diferente, ou seja, apresentar o texto enviado pelo controlador conforme o pressionamento dos botões.

    Figura 9

    Observe que a DLL que importamos é facilmente acessada via Genexus por meio da programação de comandos simples, conforme foram definidos na Classe C#.

    &Serial.portStatus()
    &Serial.SendRequest(&Comando)

    Ou seja, nada diferenciando da programação tradicional da ferramenta.

    Conclusões

    Por meio deste exemplo, não vou dizer simples, porque esta palavra é meio perigosa ao se conectar mundos tão distintos, é possível verificar que Genexus oferece suporte, de forma elegante por meio dos External Objects, para realizar coisas que vão além da sua capacidade projetada.

    Utilizando os recursos de geração de sistemas Web e Smartdevices é possível conciliar esses mundos gerando aplicações muito interessantes.  Portanto, seja bem vindo a esta nova classe de aplicações.

    Para finalizar nada mais resta senão agradecer ao meu filho André pelo fato de um dia ter escolhido estudar Engenharia Elétrica (ou Eletricista), pois vou dizer uma coisa, conectar sensores, leds, fiozinhos, plaquinhas, e demais coisas não é tão simples assim. Tem um tal de 'espúrio' que é um bicho difícil de domar. Só um especialista em assuntos 'nerdianos' é capaz de matar a coisa com tanta eficiência. Portanto, valeu, o papai te ama.




    PS. Já estava esquecendo, preciso agradecer também ao Rodolfo Robalo e Alejandra Caggiano da Artech, que foram a fonte de inspiração para estudarmos este tema, em sua palestra Las Cronicas de SmartDevices: ..., do Genexus International Meeting de 2011/Uruguay.









    Se voce se interessou pela palestra o link é este aqui.
    /www.youtube.com/embed/16pEkN6yeo0

    terça-feira, 25 de março de 2014

    RowsToTabs

    Há um ano atras apresentamos aqui no Genexando uma forma de aproveitar o modelo de abas gerado pela aplicação do Pattern Work With em uma transação em outros objetos (Interface com Abas) . De fato esse recurso sempre foi necessário e o modelo que propusemos era 'meio facil' e útil. Interessante que na mesma época um novo UserControl surgiu no Genexus Market Place, que eu acredito que tem potencial suficiente para atender a grande maioria das interfaces que utilizam as tais abas (transações, webpanels, webcomponents), sem a complexidade do componente do Pattern.

    Então, nada mais justo que apresentar esse controle, produzido pelo S2b-Group e distribuído gratuitamente para a comunidade. Fiz o teste no Genexus Evolution 2 e resultado foi excelente, muito simples de utilizar.

    Como Funciona

    Após baixar (RowsToTabs) e instalar o controle no Genexus, o mesmo é apresentado no toolbox com o mesmo nome podendo ser arrastado para o WebForm de uma transação ou WebPanel.

    Melhor se jogar o controle dentro de uma tabela com várias linhas, o segredo está em colocar um nome em cada Row (linha) da tabela, que conterá os conteúdos a serem divididos nas abas:


    Em seguida em cada linha incluir as informações que se deseja dividir em abas. No meu caso na primeira Row inclui um Grid, na segunda e terceira dois webcomponents.  Lembrando que cada Row deve ter um nome distinto.


    Para programar o controle é necessário:

    1. Criar uma variável Character(40) e marcando-a como Collection

    2. No evento Start programar o conteúdo desta variável, sendo que cada Add()deve incluir uma das linhas que foram renomeadas anteriormente, e em seguida o nome que se deseja que apareça na aba do controle.

    3. Na propriedade Tab Pages do controle incluir a variável collection que representa as abas (&TabPage).


    O resultado

    A interface apresenta um controle bem interessante de agrupamento de informações.


    A configuração das cores pode ser feita no arquivo style.css que se encontra na pasta RowsToTabs na pasta web da aplicação.


    O que falta

    Não tenho criticas quanto ao controle, pois acredito que sua funcionalidade já supera as expectativas, mas creio que pra ficar melhor somente falta neste controle um tratamento de runtime, do tipo um evento que ao clicar em uma determinada aba se dispare um evento que possamos programar. Que possa, por exemplo, possibilitar que definamos o o conteúdo dos webcomponents.



    Para saber mais:


    • http://marketplace.genexus.com/product.aspx?rowstotabs,pt
    • http://wiki.genexus.com/commwiki/servlet/hwiki?RowsToTabs+User+Control,


    sexta-feira, 14 de março de 2014

    Genexus Evolution 3

    Enfim, sabemos que a Tilo de fato será chamada Genexus Evolution 3, e quais as suas principais 'evoluções'?

    Para obter as respostas a esta pergunta recomendo a você participar do 11o Evento Genexus Brasil, dia 9/4 no Caesar Park Faria Lima em Sao Paulo.

    Eu vou, rs...

    domingo, 9 de março de 2014

    Business Component ou Atualização Direta, eis a questão

    Aqui no Blog sou um defensor do uso de Business Component (BC) ao invés da realização da manutenção de registros por meio de Procedures, pois são muitas as vantagens que esse recurso nos oferece, mas como nem tudo nesta vida é um mar de rosas, tomemos alguns cuidados em sua aplicação. Se você ainda não foi apresentado aos BC's, convém dar uma olhada nos artigos anteriores sobre este assunto:
    1. Genexando...: Business Component com Transação de Dois Níveis
    2. Genexando...: Cuidados Básicos com Business Component

    Desempenho x Segurança

    Esta é a principal questão a ser considerada neste recurso pois ao optarmos por utilizar BC's não temos que nos preocupar com regras de negócio na manutenção dos registros, uma vez que serão aplicadas as que foram programadas na própria transação.  Isso trará maior segurança na operação dos dados, pois os mesmos serão tratados pelo modelo da transação Genexus, que envolve diversos controles como a Integridade Referencial, Unicidade, Regras, tornando muito mais simples e eficiente a programação de novas interfaces.

    Por exemplo, uma vez alterada a regra na transação o efeito será imediato, repercutindo em todas as demais interfaces do sistema que utilizam o BC, ou seja o impacto de manutenção do sistema seria mínimo. Talvez este efeito já seja justificativa suficiente para adotarmos BC's. Portanto é um recurso importante a ser considerado em seus projetos.

    Como grande inconveniente dos BC's temos o desempenho, que pode degradar muito o projeto dependendo de onde o mesmo é aplicado.  Isso porque o efeito de um LOAD é o mesmo que abrir o registro na própria Transação com o disparo das regras standalone (Default, Noaccept, ...) que por ventura não foram incluídas dentro da cláusula [web]{...}, já discutida aqui no segundo artigo da lista apresentada anteriormente. Como resultado temos uma perda imensa de tempo para realizar coisas que talvez já estejam definidas.

    Como se Beneficiar dos BC's

    Para simplificar sua vida, proponho a seguir uma tabela com diversas situações que talvez possam te auxiliar na escolha do recurso ideal:

    SituaçãoBCProcedures
    O registro ao ser inserido deve passar por um filtro de regras que impeçam que o mesmo seja gravado de forma erradasimnão
    O registro ao ser atualizado deve passar pelo mesmo filtro de regrassimnão
    O registro ao ser apagado pode gerar problemas de Integridade Referencialsimnão
    A interface criada protege as informações, de certa forma, permitindo que o usuário faça apenas ajustes em situações totalmente controladas, como por exemplo, permite-se a troca de certo status através de um controle combo cujos valores são sempre válidos.simnão
    A interface é do tipo Formulário de entrada e saída, apresentando apenas um único registro a ser manipulado.simnão
    A interface é do tipo GRID apresentando diversos registros da tabela, possibilitando que o usuário realize alterações de informações, porém com registros individuais. Por exemplo, cada linha possui um botão para salvar as alterações da linha.sim (*)sim
    A interface é do tipo GRID apresentando diversos registros da tabela, possibilitando a manutenção dos dados em todas as linhas ou apenas das que foram selecionadas pelo usuário (através de um checkbox, por exemplo)nãosim

    (*) mesmo nesta situação podemos ter perda de desempenho.

    Teríamos muitas outras situações a serem tratadas, mas fiquemos com essas por enquanto, pois já são suficientes para chegarmos a uma boa conclusão que é:

    Se você está manipulando um único registro opte sempre por BC, pois o resultado trará maior segurança e normalmente nesta situação o problema de desempenho está mais no operador do sistema do que no próprio sistema.  Por outro lado, se a operação envolve mais que um registro, cuidado, BC pode trazer lentidão ao processo, pois os controles e regras da transação seriam disparados em todos os registros.

    Recentemente tive que reprogramar uma interface do tipo GRID, regredindo ao modelo da programação de Procedures, pois a lentidão impedia uma boa utilização.  Portanto, fica ai a dica, uma boa observação do resultado final pode te orientar, no futuro, sobre as melhores práticas a serem adotadas em cada caso em seu projeto.