sexta-feira, 28 de janeiro de 2011

Drag & Drop's

Antigamente, no escurinho do cinema, na minha cidadezinha lá no interior, entre uma jujuba, uma balinha Banda, um drops Ducora, a coisa rolava solta. Nada tão avançado como hoje, a coisa era somente mão-na-mão, hehehe.... Parece que o único sobrevivente daquela época foi o Hall's, extra-forte, :(.

Então para reviver um pouco o clima do passado, e com a boca cheirando menta, vamos ao Drag & Drop, que na realidade não tem nada a ver com balinhas no cinema. Ou melhor, talvez tenha alguma coisa a ver sim, pois com ele dá pra fazer interfaces do tipo "Guerra nas Estrelas".

Na Web 2.0 um dos recursos badalados é pegar coisas na interface e arrastá-las de um lado pro outro, coisa meio inútil a principio, mas que bem planejada, pode gerar interfaces muito legais. Não é um recurso muito recente, visto que já está a nossa disposição desde o Genexus X, mas acredito que você tem usado muito pouco, e se for por falta de algum exemplo simples pra embalar seu sábado à noite, então lá vai.

Genexus implementa o mecanismo através das propriedades Allow Drag e Allow Drop. e o processo de programação é interessante e muito simples.  Tem algum material disponível na Artech, aqui estaremos apenas simplificando um pouco a coisa.  O processo é simples, pegar um registro em algum lugar e transportar para outro, sendo que para isso ocorrer é necessário ajustar flags e programar alguns eventos.

Existem diversas possibilidades para troca via Drag & Drop, Grid para Grid, Grid para Imagem, e assim por diante, vamos nos limitar, nesse momento ao processo entre Grid's

Grid para Grid

Nesse exemplo, a idéia é pegar (Drag) um registro de um Grid1 e fazer com que o Drop ocorra em segundo Grid2. Nesse exemplo agregamos um complicômetro a mais que consiste em definir o registro no Grid2, que receberá a informação transportada. Isso, quer dizer que estamos buscando arrastar alguma coisa de um Grid para soltá-la em um registro definido em outro Grid.

A primeira coisa a ser feita é definir quem fará o Drag e quem o Drop, no nosso exemplo Grid2 = Drag e Grid1 = Drop, ou seja, pega um registro no Grid2 e solta no Grid1. Em outras palavras, selecionar uma Cidade qualquer, e em seguida atribui-la a um determinado Cliente.


Pelo fato de ser necessário determinar o Cliente que vai receber a Cidade, temos que selecioná-lo no Grid1 (Drop). Para que isso ocorra é necessário que se defina o AllowSelection=True, e que o usuário clique no registro antes de realizar o Drop. Provavelmente o usuário não vai se acostumar com isso, então o truque é obrigá-lo a selecionar um registro no Grid alvo através de um Check Box.

Desta forma, ele poderá selecionar um ou mais registros para receberem a informação arrastada.
Os eventos que controlam o processo são simples, é só seguir o modelo abaixo.


Event Grid1.Drop(&ClienteId)

   for each line in Grid1

      if &selecao = 1

         msg('Inserir '+&ClienteId.ToString()+' em '+&CidadeNome)

      endif

   endfor

EndEvent

Event Grid1.Refresh
   &selecao = 0
EndEvent

Event Grid1.Load
   &CidadeId   = CidadeId
   &CidadeNome = CidadeNome
   load
EndEvent

Event Grid2.Load
   &ClienteId   = ClienteId
   &ClienteNome = ClienteNome
   load
EndEvent

A variável &seleção é Numeric(1.0), simples, e &ClienteId e &ClienteNome seguem o padrão dos respectivos atributos.

O resultado desse simples WebPanel é um programa visualmente complexo e muito interessante sob o ponto de vista do usuário.


Acho que vale apena chupar essa balinha!

Para maiores informações:

domingo, 16 de janeiro de 2011

Migrando Aplicações para o IIS7.0

Uma das razões pelas quais optei em utilizar o Windows 7 - 64 Bits era a possibilidade do computador de desenvolvimento utilizar a capacidade de RAM provida pelos 64 bits, e claro, a melhoria do desempenho na geração dos programas com o Genexus, e isso de fato aconteceu sem muitos trancos e barrancos.

A Microsoft vem evoluindo de forma furiosa a integração entre o Windows Server + IIS7.0 + .NET Plataform, de forma a prover uma melhor segurança e desempenho nas aplicações ASP.NET, e recentemente pude passar algumas dificuldades referentes a desempenho da aplicação no Windows Server e a pergunta que me fizeram me levou a seguinte reflexão:  Porque ainda temos que rodar aplicaçõe no IIS7.0  em modo "Clássico", ou, em outras palavras, porque ficamos na idade da pedra enquanto o homem explora Marte?  Então, ficamos nesse post meio que alienigena, para tentar entender um pouco dos mecanismos que integram Genexus ao IIS7.0 Confesso que as configurações do IIS nunca foram o meu forte, aliás por isso tive que gastar alguns dias para entender um pouco mais a esse respeito.

Running in 32 or 64bits?
Genexus, em modo Web, por natureza roda em 32 bits, e isso acontece porque algumas DLL's são construidas em 32 bits, mais especificamente a geração de PDF's.

Integrated or Classic Pipeline Pool?
Uma das formas do IIS executar aplicações compativeis com versões anteriores do ASP.NET é a possibilidade da execução do Pipeline em modo Classico.  IIS 7.0 possibilita a execução da aplicação de forma integrada, ao próprio servidor, evidentemente com muito mais potência e recursos.

Para entender um pouco a respeito do novo IIS 7.0 temos essas três referências muito interessantes:
Genexus, por sua vez, ainda não suporta o modo Integrated, mas tudo leva a crer que em breve teremos alguma nova propriedade no environment para configurar esse tipo de aplicação.

Desta forma o que podemos fazer nesse exato instante para melhorar o desempenho de nossa aplicação?

Rodando a aplicação Web em modo 64 bits

Apesar da restrição da DLL para relatórios PDF apontado pela Artech, estaremos migrando a aplicação para 64 bits, para fins de teste, e para isso precisamos cumprir alguns passos importantes:
  1. Criar um Pool isolado para a aplicação, isso porque ao configurar o IIS ele cria automaticamente um DefaultAppPool e por falta de habilidade (no meu caso) todas as aplicações Web nesse servidor podem estar usando esse mesmo Pool.

    Isso, em outras palavras faz com que processos distintos de aplicações diferentes, compartilhem o mesmo controle de cache, afetando o desempenho do sistema. Uma DLL meio travada de outro programa, influencia o desempenho de seu lindo sistema, por exemplo.

    Criar o pool é simples, e isso se faz no próprio IIS.



    Sua aplicação deve apontar para esse Pool, ou seja, nas propriedades avançadas, da pasta virtual ou application, no IIS, voce deve selecionar o Pool recém criado.



    Para saber mais:
    http://technet.microsoft.com/pt-pt/library/cc725564(WS.10).aspx
    http://technet.microsoft.com/pt-pt/library/cc731784(WS.10).aspx
     
  2. Pipeline ou Classic: temos essa pequena limitação em Genexus, ou seja, não podemos executar em modo Integrated ainda, portanto, nas propriedades avançadas do Pool, selecione a opção Classic.


  3. Versão do Framework: nessa mesma interface existe a possibilidade de se selecionar a versão do Framework da aplicação, que deve ser a mesma indicada na propriedade Compiler Path do Environment, no Genexus.
     
  4. Migrar a aplicação para o IIS 7.0 (assunto tratado pela Artech já em 2008), que é realizada bastando executar um script no próprio servidor Web.  Para isso, uma janela de CMD e o comando abaixo são suficientes:

    c:\windows\system32\inetsrv\Appcmd migrate config "ApplicationPath ", onde o ApplicationPath deve apontar para o caminho Default Web Site/virtual directory.

    Por exemplo:
    c:\windows\system32\inetsrv\Appcmd migrate config "Default Web Site/Invoice2.NetEnvironment"


    Para que o comando execute completamente é necessário que não tenha ninguém conectado ao sistema, e o script alterará o arquivo Web.Config, portanto, recomenda-se um backup deste para o caso de ocorrer algum problema. futuras manutenções no sistema.   A alteração inclui neste arquivo duas novas áreas e tags em uma seção system.WebServer.

    Para saber mais:http://www2.gxtechnical.com/portal/hgxpp001.aspx?15,4,61,O,S,0,,24521;S
     
  5. Para verificar se o Pool está configurado corretamente, é necessário verificar se a aplicação está rodando em modo correto, para isso o comando a seguir apresenta os Pools que estão configurados para rodar em 64bits:

    c:\Windows\System32\inetsrv\appcmd list apppool /enable32BitAppOnWin64:false
     
  6. Finalmente uma opção é definer o valor da propriedade Compiler Flag no Environment, para indicar o tipo de CPU que a aplicação executará.

    Nas propriedades do Environment, defina o valor do Compiler Flags.



    Segundo a Microsoft, em um Windows de 64 bits:
    * Assemblies compilados com /platform:x86 executará em modo 32 bits
    * Executaveis compilados com /platform:anycpu executará em modo 64 bits
    * DLL´compiladas com /platform:anycpu executará no mesmo modo do IIS (64 bits em nosso caso)

    Para saber mais:
    http://msdn.microsoft.com/en-us/library/zekwfyz4(v=vs.80).aspx
Mesmo com a restrição apontada na execução em modo 64 bits, em nosso caso não houve nenhuma consequencia adicional para que o sistema rodasse sem problemas, inclusive imprimindo em PDF.

Apesar da quantidade de conceitos, o propósito aqui é garantir que nossa aplicação pelo menos rode no modo correto no servidor, ainda falta um degrau para chegarmos ao ideal.

sábado, 1 de janeiro de 2011

2011

xmais alegria, amor, paz e prosperidade, ...
0 xde tristeza, infelicidade, frustrações, decepções, ...
1primeiro lugar Deus e as demais coisas sempre são acrescentadas
1xpaciência e perseverança, pois essas são condições para avançamos na construção de um ano melhor, pois tudo depende da nossa atitude em relação aos desafios que virão
+some tudo!
=E o resultado é igual a um ano repleto de muitas realizações!