terça-feira, 22 de dezembro de 2015

External Object e Modules... Melhor não.

Um pequeno teste revelou que um External Object dentro de um Modulo (Modules), gera uma certa dificuldade para se criar uma variável do tipo External Object. O Genexus não monta uma referencia adequada para o objeto, e inclusive o mesmo não aparece na lista de seleção de External Objects em Data Type.

E na prática isso tem tudo a ver porque os módulos geram um namespace próprio, em termos de código nativo gerado (C#, Java), e como os External Objects referenciam classes em separado que possuem seus próprios namespaces, realmente fica meio difícil que eles se encaixem para participar da festinha privada na salinha VIP do modulo.

   namespace GeneXus.Programs.{

   }

Então, para projetos modulares que venham a utilizar este recurso, melhor criar uma pasta simples em Folder View e colocar lá todos os External Objects.

Para saber mais:

segunda-feira, 7 de dezembro de 2015

Gracias Genexando!

Meus sinceros agradecimentos a comunidade Genexando por suas insistentes visitas ao blog, que nos renderem um belo reconhecimento no Gx25 em Montevideo.
Genexus International Meeting 25!

terça-feira, 1 de dezembro de 2015

Coisinhas que complicam a vida

Geralmente quem inicia na aprendizagem de Genexus encontra alguns muros difíceis de serem transpostos. Além dos conceitos revolucionários da própria ferramenta, que mudam muito em relação ao que aprendemos nas Faculdades, temos outras dificuldades que vão atrasando o que é mais importante: aprender Genexus.

Claro que este muro pode ser baixo para alguns, mas para outros excessivamente alto, digo isto porque tenho acompanhado algumas pessoas que sofrem bastante para decifrar alguns enigmas deste novo mundo.
Motivado por esta divagação e no intuito de contribuir com os iniciantes, vamos destacar alguns pontos que, pra falar a verdade inicialmente considerava até simples, mas ao término deste trabalho já mudei de opinião. Isso porque depois que pulamos a cerca, já nem lembramos de como era estar lá dentro, rs.

Uma mensagem mal colocada e pronto, para onde correr? Muitos infelizmente perdem muito tempo tentando decifrar mensagens que parecem absurdas, e de fato ja viu alguma mensagem de erro que não pareça absurda? Apesar da evolução do instalador, ainda não é possível, para todos que instalam a ferramenta, terminar o processo sem nenhum enrosco. Isso pelo fato de que os computadores possuem diferentes recursos instalados, diferentes sistemas operacionais, e isso pode causar alguns desajustes.

Vou tentar reunir aqui neste artigo algumas coisas muito elementares mas que podem auxiliar um pouco o pessoal iniciante no processo de instalação e configuração do Genexus. Se você é Sênior, por favor, pule para o próximo artigo, rs.

Se você continuou a leitura, vamos dizer que dá um certo trabalhinho configurar tudo para começar a usar o Genexus.  Vamos desenvolver uma série de perguntas para buscar criar um norte para direcionar os navegantes neste mar de tubarões.  Se a sua pergunta não estiver dentre as apresentadas comente o artigo e vamos evoluindo.

Sistema Operacional

 

Qual é o sistema operacional indicado para o Genexus?

Comecemos por aqui! Genexus roda em Windows, portanto é recomendado que você tenha um instalado em sua máquina, preferencialmente as versões 7 em diante.  Tem uma turminha rodando o Genexus no Windows XP (SP2), 7, 8 e 10 sem problemas.

Genexus roda no Mac ou Linux?

A resposta é sim 'em parte', o que significa o seguinte, roda muito bem no Mac mas não nativamente no OS X, desta forma voltemos ao Windows. Voce precisará de uma Maquina Virtual com Windows instalada, em seguida poderá instalar o Genexus dentro desta.  Linux segue o mesmo principio.

Qual máquina virtual devo utilizar?

Se você já tem Windows nativo, pule esta.  Se você tem um Mac pode utilizar qualquer maquina virtual que rode neste sistema operacional, eu tenho usado a Parallels, que tem alguns modos que rodam como se você estivesse nativamente no OS X, permitindo compartilhar pastas, executáveis, enfim, nem parece que está rodando Windows no Mac.

Mas atenção aqui, seu Mac deve estar muito bem configurado pois estará rodando o OS X, a Maquina Virtual e o Windows abaixo deste, e em seguida o Genexus, ou seja, muitas camadas é igual a necessidade de uma maquininha meio fortinha.

Qual é o hardware exigido pelo Genexus?

Aqui você encontra as exigências para instalação. Tenho rodado bem o Genexus num notebook com 5 anos de idade, Intel I5-450M de primeira geração, com dois SQL Server instalados, sem nenhum problema. Fiz uns upgrades na maquina adicionando mais RAM (8Gb) e ta tudo certo, acho que a maquina aguenta mais uns 5 anos.

IIS - Microsoft Internet Information Service

O IIS é o servidor web para desenvolvimento de aplicações para a plataforma Windows (.Net Framework), portanto se você objetiva construir aplicações no Genexus para este ambiente deverá configurar este recurso. Caso desenvolva para Java, então poderá desconsiderar esta parte, pulando para a configuração do Tomcat.

Maiores informações aqui.

Preciso comprar o IIS?

Não, o servidor é disponibilizado gratuitamente nos Windows na versão Home Premium ou superior, e existe também uma versão Express que pode ser baixada.

Como instalo o IIS?

O processo consiste em ligar o recurso por meio do painel de controle do Windows, na opção de instalação de programas existe uma opção Turn Windows features on or off (Windows em ingles).


Abrir esse recurso e marcar a instalação do IIS.


Escolher as opções para ligar o servidor web, que você pode conhecer um pouco mais aqui.

Como saber se o IIS está instalado?


Abrir o navegador e digitar http://localhost, se instalado e respondendo deverá retornar uma tela semelhante a apresentada a seguir.


Java: Tomcat

Para os desenvolvedores Java já postei uns artigos sobre este assunto, mas como já faz um tempo, creio que deve ter evoluído alguma coisa. Desde esta instalação o Tomcat está funcionando legal na minha maquina então acho que as dicas continuam valendo.

Genexando: Apanhando do Tomcat



SQL Server

Este é um ponto meio controverso pois a partir da versão X, o Genexus passou a exigir também a instalação do SQL Server para gerenciar seus projetos. Quando cria uma nova KB (Knowlegde Base, mesmo que um projeto Genexus) estará também criando uma base de dados neste servidor.

De forma resumida, você precisará de um SQL Server instalado em algum lugar que possa ser alcançado pelo seu Genexus, mesmo se deseja desenvolver uma solução para outro banco de dados, como Oracle, por exemplo. Se for no seu notebook melhor, assim terá a mobilidade para trabalhar em qualquer lugar. Se em uma máquina na rede, você somente poderá desenvolver se tiver acesso de rede a esta maquina.

O que é SQL Server?

Um sistema gerenciador de banco de dados importante no mercado (ver).
Sob o ponto de vista do Genexus e do seu sistema, você tem que pensar o seguinte:
  1. Genexus utiliza o SQL Server para gerenciar a KB
  2. Seu sistema precisa de um servidor de banco de dados (SQL Server, Oracle, Mysql, ...) para armazenar os dados da aplicação
São dois temas distintos, porém o mesmo SQL Server utilizado pelo Genexus pode ser utilizado para construir seu sistema.

Dá para substituir o SQL Sever por outro Banco de Dados, isto para uso do Genexus?

Não. Na versão corrente o Genexus apenas utiliza o SQL Server para auxiliar no gerenciamento da KB.

Posso usar o Oracle, Mysql, PostgreSQL,... que já tenho instalado para o Genexus gerenciar a KB?

Não. Resposta meio redundante com a anterior, mas vamos deixar bem claro, o Genexus somente aceita SQL Server para este papel. O Oracle poderá ser usado para construir o sistema mas não pelo Genexus.

Qual a sequencia de instalação do Banco, Servidor Web, Genexus?

Principalmente se for utilizar o Genexus com o gerador .Net, melhor configurar primeiro o IIS (Internet Information Service) e depois instalar o banco de dados SQL Server e o Genexus.

Qual versão do SQL Server devo instalar?

Se você não tem a sua disposição uma versão digamos mais profissional, poderá instalar a SQL Server Express, que a mesmo dará conta do recado.  Esta é gratuita e tem suas peculiaridades, das quais creio a mais comentada, o limite máximo de dimensão do BD.

Se a Microsoft não mudar o link da página, poderá obtê-lo aqui.

Posso utilizar uma versão SQL Server 2000 ou 2005 que já tenho instalada?

Bom, você sabe que a tecnologia evolui né, a menos que viva no Alaska, digamos que essas versões não são as mais indicadas para você criar um sistema atualmente.  Se o seu sistema já roda nesta versão desde 2000, tudo bem, mas iniciar um novo projeto nestas versões não é legal. Melhor evoluir um pouco sua infraestrutura e melhorar o banco.Aqui você encontra um link com a evolução dos recursos do SQL Server (a versão atual é a 2014), mas pena que esta evolução implica em investimento, e o valor do banco é meio salgado.

Sob o ponto de vista do Genexus, você precisará, para instalar uma Trial da Evolution 3, por exemplo, de no mínimo um SQL Server Express versão 2012. Versões anteriores poderão ser utilizadas para a construção do sistema mas não pelo Genexus.

Um pouco mais de documentação sobre a instalação da Trial, pegue aqui.

O Genexus instala automaticamente o SQL Server Express se eu não tiver instalado?

Sim. Mas atenção no processo de instalação e seleção dos usuários, e também criar o usuário administrador (sa). Se falhar aqui dai terá um trabalhão para ajustar o que faltou.

Uma boa documentação sobre a instalação banco pode ser alcançada no link a seguir, mas a versão não ajuda muito: SQL Server Express 2005. Esta documentação é interessante quando trata do SQL Browser e da configuração do acesso de rede do banco.

Posso usar o Oracle junto com o SQL, na mesma máquina?

Sem problemas se usar o Oracle para construir sua aplicação, mas cuidado vai ter que ter uma boa jaulinha para colocar esses dois elefantes juntos.

Posso ter várias instâncias do SQL Server na mesma máquina?

Sim, o instalador criará as instâncias separadas, você apenas deverá escolher corretamente a instância no momento de criar a KB e selecionar o banco do seu sistema.

Na KB, por exemplo, na operação de configuração do Datastore, a operação Edit Connection possibilitará que defina a instância, banco de dados, usuário e senha para conexão. Na imagem a seguir apresento como em minha máquina, por exemplo, tenho duas instâncias do SQL Server (DOUGLAS-PC é um SQL Server 2008 e DOUGLAS-PC\MSSQL2012 outra.


Como diferenciar o Banco de Dados do Genexus do Banco de Dados do meu sistema?

São dois momentos distintos, o primeiro é a criação da KB na qual indicamos o banco de dados para o Genexus gerenciar nosso projeto.


O segundo momento é o da seleção do banco da aplicação, que ocorre assim que você cria a primeira transação e executa o sistema.

Posso deixar o Genexus e Meu Sistema no mesmo Banco de Dados?


Pelas boas praticas... Não, pois voce estará armazenando no mesmo banco de dados, informações a respeito da KB e dados de seu protótipo. Isso também poderá prejudicar o processo de Backup da KB. Não seja pão-duro e crie bancos separados, cada um com sua função.

Depois da instalação, terei que configurar alguma coisa no Banco de Dados?

No SQL Server Express provavelmente sim, porque os protocolos de rede serão desabilitados, e com isso provavelmente você será exposto a algum tipo de erro de conexão, como por exemplo, o apresentado a seguir.

Ocorreu um erro ao estabelecer uma conexão com o servidor.Ao conectar-se ao SQL Server, essa falha pode ser provocada porque, sob as configurações padrão, o SQL Server não permite conexões remotas.(provedor: Provedor TCP, erro: 0 – Falha em uma tentativa de conexão porque a parte conectada não respondeu corretamente após um período ou houve falha na conexão estabelecida devido a uma falha na resposta do host conectado). (Microsoft SQL Server, Erro: 10060)
  
Ou.

A network-related or instance-specific error occurred while establishing a connection to SQL Server. the server was not found or was not accessible. verify that the instance name is correct and that sql server is configured to allow remote connections. (provider: TCP Provider, error: 0 - Uma tentativa de conexao falhou porque o componente conectado nao respondeu corretamente após um periodo de tempo ou a conexão estabelecida falhou porque o host conectado não respondeu) (Microsoft SQL Server, Error: 10060)

Para corrigir este problema você deverá deixar o serviço SQL Browser ativo e também habilitar o protocolo TCP/IP, através do SQL Server Configuration Manager.


Este programa permite acesso aos protocolos que serão liberados na instância do SQL Server Express. No caso da imagem a seguir temos duas instâncias na maquina a MSSQLSERVER e a MSSQL2012, e a liberação ocorre no Protocol Name TCP/IP (botão direito do mouse e em seguida Enable)


Um detalhe importante é a definição da porta a ser liberada para o protocolo TCP/IP, que voce escolhe ou deixa como 1433 (default). As vezes a maquina tem mais de um IP, e as portas precisam bem definidas. E pode ocorrer do firewall também bloquear esta porta.




Retomando a documentação que comentamos sobre a sobre a instalação e configuração do banco, é bastante boa na questão da liberação das portas SQL Server Express 005.

Como posso testar se o SQL Server esta respondendo?

Baixe o programa PortQry Command Line Port Scanner Version 2.0 no portal da Microsoft (aqui), e em seguida poderá executar o comando:



Se retornar um NOT LISTENING significará que o protocolo não se encontra liberado para a porta,  portanto, neste caso precisaríamos fazer um ajuste, tornando a porta Enabled=Yes para o Ip.



Será necessário reiniciar o SQL Server.

NET STOP MSSQLSERVER
NET START MSSQLSERVER


O que significa Add user IIS AppPool\Classic.Net?

Se você esta desenvolvendo sua aplicação com Microsoft .Net, e o SQL Server encontra-se configurado corretamente, ainda precisará realizar mais um ajuste no banco de dados adicionando o acesso a um usuário chamado IIS AppPool\Classic .Net, de forma a possibilitar que a aplicação possa acessar os dados e realizar as alterações nas tabelas por meio do usuário web padrão do servidor IIS.

Se você entrar no IIS verá que os tais pools são elementos de agrupamento de aplicações, e que precisam de uma conta de usuário para executar a aplicação web e fornecer os recursos necessários para que a mesma opere, a chamada application pool identity.  Com esse usuário padrão não será necessário criar contas locais para cada pessoa que acessa o sistema. O usuário padrão é definido na propriedade identity do Pool.



Quando se define o banco de dados da aplicação no Genexus será possível adicionar o mesmo usuário para acessar o banco de dados, e é exatamente isso que se oferece quando se está editando a conexão do datastore, mediante o link Add user IIS AppPool\Classic.Net.


Ao pressionar a mesma, será procedido um ajuste na lista de usuários atribuindo-lhe os privilégios necessários para o consulta e edição dos registros e tabelas.


Se o acesso for realizado por meio do usuário sa, esta adição de usuário não será necessária. Maiores informações aqui.

Porque a mensagem 'Connection Failed for user IIS AppPool/Classic ...' aparece?

Provavelmente porque o usuário já foi criado, feche a configuração e execute o Genexus. Na versão Evolution 3 o usuário é criado assim que voce pressiona o Create Database.


Como gerenciar os banco de dados das KBs?

O banco de dados da KB normalmente fica na pasta onde a mesma é criada (são dois arquivos com extensões mdf e ldf..


Basicamente não será necessário fazer nada no banco de dados da KB, a não ser tomar cuidado para que o mesmo não estrague. Se der algum problema neste arquivo o projeto será perdido, então um pouco de cautela e backup.

Para remover o banco de dados, tem um documento aqui que auxilia com algumas dicas.

Como fazer backup do banco de dados da KB?

A forma mais simples é realizar backup do arquivo GX_KB_..., diretamente no SQL Server.

Ja tratamos deste assunto em artigos anteriores, por favor consultar:

Genexando: Backup da Kb
Genexando: Backup da Kb II

Como faço para ver as tabelas que o Genexus criou no banco de dados?

Através de um programa que acesse e gerencie o banco, como por exemplo o Heidi, que funciona legal com Mysql e SQL Server também. (http://www.heidisql.com/)


---
Muitos temas distintos, mas acho que consegui cobrir o básico, caso tenha outras dificuldades além desta, vamos revisando o texto incluindo novos temas.

Boas instalações, configurações e aprendizagem!

sábado, 21 de novembro de 2015

Permissions

Presenciamos recentemente o Trick or Treat aqui no Brasil, nada mais natural para nós que vivemos em um pais de língua predominantemente inglesa e cuja tradição histórica tem tudo a ver com o assunto em questão.  Mas fazer o que, brasileiro gosta de 'importar coisas americanas`.  E por incrível que pareça, ainda bem que eu tinha alguns docinhos (claro que não proposital), não é que fui surpreendido com algumas crianças vestidinhas de caveirinha na porta de casa! Só que, claro, ainda não familiarizados com a frasezinha - trick or treat, iam direto ao assunto: queremos doces... rs

Então já que é pra falar de coisas esquisitas, vou eleger um tema que para mim representa um capitulo completo de esquisitices: GAM Permissions.  Falo isso não apenas com relação ao modelo que se determinou para se dizer que um certo objeto Genexus terá um nome diferente no GAM, mas também o trabalho que dá defini-las na produção, principalmente para os objetos novos que forem criados posteriormente a publicação inicial do sistema.

Então se é pra matar o bixo no ninho, vamos atacar, claro munidos das nossas abobrinhas...

Permissions?

De forma simplista, GAM Permission significa um registro de um certo programa com suas diversas funcionalidades, que vinculado a um perfil determinará se certo usuário terá acesso (Allow) ou não (Deny|Restricted) ao mesmo.  Se quiser algo mais formal busque a documentação no Wiki, pra mim isso ai basta.

O GAM determina automaticamente os tais GAM Permissions a partir dos objetos da kb, gerando um ou mais registros de funcionalidades identificados por um Permission Name. O tal Permission Name é importante e tem uma particularidade que é um nome composto formado pelo objeto (transação, procedure, ...)  acrescido de um sufixo (_Execute, _Insert, ...)

Posteriormente, na existência do Permission Name, será possível vincular a permissão (Alow ou Deny) ao objeto para um certo perfil (Role).

Se criamos uma transação Cliente, por exemplo, uma série de novos GAM Permissions serão criadas no momento da especificação/geração da aplicação.

========== GAM Permissions Creation started ==========
Reading KB Applications ...
Processing Permissions ...
Generating Permission Cliente (1 of 32)
...

E as permissões resultantes serão:

TransaçõesExemploFuncionalidade
<objeto>_FullControlcliente_FullControlPermissão para executar, inserir, atualizar e apagar o cliente, sendo que este agrupamento que define todas as permissões de uma única vez
<objeto>_Executecliente_ExecutePermissão para executar o programa e apresentar o registro do cliente
<objeto>_Insertcliente_InsertPermissão para inserir cliente
<objeto>_Updatecliente_UpdatePermissão para atualizar cliente
<objeto>_Deletecliente_DeletePermissão para apagar cliente

Uma observação sobre a cliente_FullControl, é que ao designar esta permissão as demais (execute, insert, update e delete) serão designadas com a propriedade inherited (herdada) marcada.

Existem outros sufixos para determinar as permissões, maiores informações:

Vale a pena consultar esse wiki pois temos também os sufixos específicos para webservices, business components, ..., que não apresentamos exemplos aqui.

Acesso com Allow, Deny, Restricted?

Para designar certa permissão é necessário vincular o GAM Permission ao nível de acesso, que pode ser determinado de três maneiras possíveis:

AcessoSignificado
AllowNível de acesso liberado para o perfil
DenyNível de acesso negado para o perfil
RestrictedInicialmente o nível de acesso é negado ao perfil do usuário, a menos que outro perfil libere para o mesmo. Considere, por exemplo, uma pessoa com mais de um perfil designado, o acesso restricted será negado se no outro perfil estiver deny ou restricted, ou liberado se no outro perfil estiver allow.

O GAM trata de forma o conceito de permissões em forma de cascata, ou seja, soma-se as permissões que o usuário tem em todos os perfis que tem designado certo objeto para determinar se o mesmo possui ou não autorização sobre o mesmo.

Por exemplo, se certo usuário possui os perfis Role1 e Role2, e para certo objeto qualquer o Role1 define allow e o Role2 define deny, a permissão resultante será deny.  A tabela abaixo apresenta um resumo desta lógica.



Esta situação é explicada em detalhes na documentação do wiki. Maiores informações em:
Não esta muito claro a necessidade do Restricted, posteriormente poderemos retomar este assunto para abordar melhores estratégias de uso com esse recurso.

Criando as Permissões na Produção

Para facilitar um pouco nossa vida de desenvolvedor, o proprio Genexus/GAM criam automaticamente as permissões aos novos objetos incluídos na KB no momento em que executamos o programa.  Uma observação importante é que essas permissões são criadas localmente, ou seja, enquanto estamos construindo a aplicação.

Desta forma quando publicarmos no servidor de produção essas definições já estarão disponíveis. A pergunta que fica na gargante é o que fazer com o GAM da produção, quando o sistema já estiver funcionando e tivermos alguns novos objetos incluídos na aplicação? como ficam as permissões para esses novos objetos?

A resposta é não ficam...

De forma mais clara, as permissões serão criadas localmente na maquina do desenvolvedor mas não serão publicadas automaticamente no GAM na produção.  Precisaremos de alguma forma levar essas permissões para lá.

Para facilitar vamos chamar de GAM Produção e GAM Local, para identificar dois GAMs, um que esta publicado no servidor de produção e serve para que seus usuários sejam autenticados e autorizados para utilizar seu sistema, e o outro GAM que está na máquina do desenvolvedor da aplicação em sua empresa (local)

Existem três maneiras de realizar a operação de geração da permissão no GAM Produção:

1) Criando a Permissão Manualmente

Nesta opção basicamente você terá que reproduzir manualmente no GAM Produção a configuração que foi automaticamente gerada no GAM Local, situação não muito confortável mas também não muito complexa de fazer. Através do GAM Web BackOffice, é possível realizar esta operação na produção.

O maior trabalho aqui é controlar administrativamente os objetos que foram criados a partir do momento em que o sistema entrou em produção.

Para criar, você deve acessar o Backoffice com o usuário admin e em seguida na aba Applciations - Permissions, pressionar ADD para incluir uma nova permissão.

No formulário inserir o objeto e o sufixo responsável pelo acesso, que no caso de um WebPanel, por exemplo, colocar _Execute como o apresentado a seguir.


Esta operação vai incluir o WebPanel3 na lista de permissões.
Em seguida basta definir os perfis (Roles) que terão acesso ao recurso, como por exemplo, o Administrador recebendo o Allow para executar o tal webpanel.

Neste modelo o trabalho é grande devido a necessidade de para cada novo objeto ter que:
  1. Identificar os objetos que não possuem permissões criadas
  2. Criar a permissão manualmente para o objeto, e dependendo do tipo do objeto, ter que criar várias permissões
  3. Definir o acesso nos diversos Roles que terão acesso ou negação ao objeto.
Uma alternativa é utilizar a GAM API para programar um recurso para criar via programação as novas permissões e também a designação aos diversos perfis. 

2) Programando as Permissões

Neste modelo utilizamos a GAM API para produzir um programa para criar as permissões, para que em seguida possam ser designadas aos Roles.

Bom, lembre-se que estamos aqui falando de esquisitices, então não vai agora começar a ter chiliques, pois a programação que estamos propondo é pra lá de esquisita. De fato para compreender bem este tipo de programação recomendo a você que gaste um pouco de tempo lendo os programas exemplos do GAM Web Backoffice.  Este trecho de código foi adaptado do código apresentado no programa GAMExampleAppPermissionSelect.

Event 'Add'
 &GAMApplications = GAMRepository.GetApplications(&GAMApplicationFilter, &GAMErrors)

 &GAMApplication.Load(&GAMApplications.Item(1).Id)
 &GAMApplicationPermission.Name = &Name
 &GAMApplicationPermission.Description  = &GAMDescriptionLong
 &GAMApplicationPermission.AccessType =  &GAMPermissionAccessTypeDefault
 &isOK = &GAMApplication.AddPermission(&GAMApplicationPermission, &GAMErrors)
 if &isOK
commit
 endif
Endevent

Basicamente o que ele faz é o seguinte:
  1. Pega a aplicação corrente que se encontra registrado no GAM. Se houver mais que uma aplicação a linha &GAMApplications.Item(1).Id deverá pegar a aplicação correta da lista.
  2. Carrega esta aplicação com LOAD (muito parecido com o que fazemos com Business Components)
  3. Adicionar uma nova &GAMApplicationPermission nesta aplicação
  4. Commit se tudo ok
Basta criar um botão Add num Webpanel qualquer com um formulário que permita ingressar &Name&GAMDescriptionLong&GAMPermissionAccessTypeDefault. Variáveis que foram criadas segundo as seguintes definições.

O código cria a nova GAMPermission nas tabelas do GAM, em seguida basta aplica-la aos Roles desejados.  Não se esqueça de incluir os sufixos, como o _Execute, _Insert, _Update, ..., que devem ser incluídos na propriedade Name.  Por exemplo, para um webpanel chamado Teste a permisson deve ser teste_Execute.

Já produzimos um artigo para auxiliar na programação dos Roles e Permissions:


2) GAM Deply Tool

Finalmente, o GAM possui um recurso bastante interessante chamado GAM Deploy Tool que é uma ferramenta para ser utilizada para publicar e atualizar o GAM na produção.  Este recurso é muito importante para deixar o banco de produção com as mesmas características que o GAM Local.

Uma das características desta ferramenta é a possibilidade de se levar permissões de novos objetos, para atualizar o sistema em produção. Portanto, vale a pena gastar uns minutos para entender a ferramenta que está bem documentada.

Maiores informações:

Conclusão

Muita coisa importante num unico artigo, mas o tema é importante, pois sem dominar o conceito de Permissões e Acesso dificilmente haverá sucesso no uso do GAM. Nossa proposta de programação da permissão não é tão maluca assim, pois, devido a necessidade de se gerenciar os grupos, menus, melhor se houver uma forma programável para tratar disso tudo, e o recurso no GAM Web Backoffice, no meu ponto de vista não é tão legal assim.

Enfim, o que não podemos negar é que brasileiro também gosta de uma confusãozinha sobrenatural, veja nossas lendas, nossas musiquinhas de ninar, coisas de arrepiar o cangote. Nem precisa de uma abóbora esculpida com uma carinha de mal para assustar, basta cantar pra criança o nana nenê que a cuca vem pegar.... que já da certo, dorme na hora, rs



terça-feira, 10 de novembro de 2015

Como aproveitar uma excelente oportunidade

Oportunidades não aparecem todos os dias, melhor sempre estar preparado para aproveitá-las quando surgem, então vou aqui te dar algumas dicas:

1) Primeiro a preparação, pois quando a oportunidade aparece você deve estar pronto.


2) Obtendo uma certificação profissional para te destacar no mercado, pois nada como ter estampado em seu curriculum uma Certificação Analista Sênior Genexus, não? No site training você encontra as provas teste para que possa identificar quais são os pontos que lhe faltam estudar.


3) Encontrando as oportunidades, e aqui a grande novidade, a própria Genexus acaba de nos presentear com um portal de oportunidades.


4) E sabe de uma coisa, tem muitas fora do Brasil, que tal estudar Espanhol também.


Boa preparação!

segunda-feira, 9 de novembro de 2015

Single Sign On


Que tal este cenário: Um usuário, digamos o Zezinho, abre uma aplicação sua chamada Solução1 e trabalha normalmente, isso após ter realizado o login corretamente.  Posteriormente, no mesmo navegador o Zezinho abre uma segunda aplicação, Solucao2, e digamos que de forma automática, a Solução 2 já identifica que o Zezinho já se encontra autenticado e o libera de realizar o login novamente.

De forma bem clara, o Single Sign On - SSO, prove um mecanismo para centralizar a autenticação de seus usuários a partir de um ponto único para todas as suas aplicações e o GAM é um recurso de proteção de um projeto Genexus construído com um protocolo que possibilita desenvolver sistemas de autenticação no formato do SSO.  Então que tal estudarmos um pouco a respeito deste assunto e melhorar a qualidade do serviço que prestamos a nossos usuários?


O nome disso? 
Single Sign On ou SSO, e se quiser uma definição mais formal olhe aqui.

Quem utiliza isso? 
Praticamente todos os fornecedores de aplicações que se prezem a realizar um trabalho com foco no conforto do usuário, como por exemplo o Google, Facebook. Lembre-se, por exemplo, do Gmail que uma vez realizado o login para ler seus emails, libera o acesso do Google Drive sem que se tenha de realizar a operação novamente.

Podemos programar isso em Genexus?
Sim, aplicando o GAM na nossa Kb e criando o chamado Identity Provider, um provedor de identidade. E não precisa programar nada, o próprio GAM se encarrega de controlar tudo para você, logo após uma pequena porção de configuração.


Como o GAM implementa o SSO?
O GAM é construído baseado na OAUTH, um protocolo que permite que Aplicações Clientes possam se conectar a aplicações Web, Desktop, Smartdevice e Living Room Device, provendo controle sobre a autenticação e autorização de usuários,


O que é Identity Provider?
É um tipo de aplicação que fornece um serviço de autenticar usuários remotamente.  Como resposta este sistema devolve se houve sucesso ao autenticar um usuário e senha fornecidos.  Um protocolo padrão na Web define os procedimentos necessários para implementar este tipo de ação, o OAUTH, o mesmo usado no GAM e em praticamente todos os demais Identity Provider (Facebook, Google. ...)


Como Fazer?
Primeiramente utilizando o GAM, seguindo os passos que já foram extensamente documentados no Wiki, que estarei incluindo aqui, mas como sou inxerido, resolvi adicionar um pouco mais de clareza neste tema, então neste artigo estaremos:
  1. Configurando um Identity Provider para gerar um SSO com Genexus
  2. Discorrendo sobre esta funcionalidade sob o ponto de vista da aplicabilidade no mundo real

Configurando o Identity Provider

Identity Provider é definido como sendo um provedor de identificação, e se algum dia você realizou uma conexão entre seu sistema e o Facebook, por exemplo, utilizou o provedor de identificação deste sistema. Este provedor, basicamente fornece um serviço que avalia se certo usuário e senha são os que se encontram registrados em seu repositório, devolvendo o resultado para a aplicação cliente.

O modelo Single Sign On proposto aqui basicamente define uma de nossas KBs como sendo um Identity Provider, por meio de um recurso que o GAM passou a implementar a partir da EV3.  E em seguida, outra KB cliente se conectará ao nosso Identity Provider para confrontar se certo usuário já se encontra logado, basicamente, o que o sistema analisa é se existe alguma sessão válida no navegador e se o usuário desta sessão pode utilizar os recursos disponíveis.

O processo de configuração é meio confuso, mas vamos 'tentar' explicar de forma mais simples.

Maiores informações a respeito do Single Sign On com o GAM pode ser alcançado daqui.

1. Crie Duas Kb: Provedor e Cliente

Vamos começar definindo duas kbs que estaremos configurando o GAM. Uma chamaremos de GAM.PROVIDER e outra de GAM.CLIENT, sendo que na GAM.PROVIDER definiremos posteriormente como sendo nosso Identity Provider, ou seja o GAM que será chamado pela aplicação GAM.CLIENT para autenticar remotamente um usuário qualquer.

Após criar as duas KBs acesse a propriedade Enabled Integrated Security (em Preferences - Kb) e a defina como YES. para aplicar o GAM em ambas.  (GAM Getting Started)  Tenha um pouco de paciência neste momento e espere ate que o Genexus volte a funcionar, pois esta operação realizará uma série de importações e pode parecer que a ferramenta ficará indisponível por alguns segundos.

Execute as duas Kbs, configurando os Datastores de ambas, cada qual com um banco de dados separado. O Datastore GAM de ambas as kbs pode ser o mesmo que o definido em Default.


O Genexus levará um tempo para executar as duas kbs, visto que muitos objetos foram criados com a aplicação do GAM.

2. Configurando o GAM

Um resumo do que faremos é registrarmos na GAM.PROVIDER a aplicação da KB GAM.CLIENT, e na GAM.CLIENT definir a autenticação remota.


2.1. Client Id e Secret
Quando ambas as kbs estiverem em funcionamento no navegador de internet, você deverá ingressar no GAMHome (User: admin, Senha: admin123), para ler as configurações que foram geradas.  Para isso acesse o Applications e abra o registro de GAM.PROVIDER e GAM.CLIENT.


Para facilitar as coisas anotei os dois Client Ids e Secrets que utilizaremos para configurar o Identity Provider.  Observe que os valores de Clent Id Secret de ambas as Kbs são distintos e estaremos os valores de GAM.CLIENT para configurar a operação de Single Sign On. Os valores da GAM.PROVIDER não serão utilizados.



2.2. Adicionando a Kb Client no GAM.PROVIDER
A primeira operação a caminho do Single Sign On é adicionar em GAM.PROVIDER um registro de uma aplicação cliente, nossa GAM.CLIENT. Isso é feito em GAM.PROVIDER - Applications, e em seguida uma operação ADD para adicione o registro com as seguintes informações.


Observe que o Client Id e Client Secret são os mesmos da GAM.CLIENT, e novas propriedades devem ser informadas:

Local Login URL deve apontar para o programa gamremotelogin.aspx da kb GAM.PROVIDER, portanto, http://localhost/GAMPROVIDER.NetEnvironment/gamremotelogin.aspx, e Callback URL o endereço da GAM.CLIENT, http://localhost/GAMCLIENT.NetEnvironment.

Após a inclusão da aplicação teremos o registro do GAM.CLIENT como uma segunda aplicação gerenciada pelo GAM de GAM.PROVIDER

Em outras palavras, estamos dizendo que o GAM localizado na kb GAM.PROVIDER será um dos provedores de identidade para os clientes de GAM.CLIENT.  Desta forma, para se executar o GAM.CLIENT será necessário realizar uma operação de login, e esta poderá ser disparada no provedor de identidade (GAM.PROVIDER).


2.3.Configurando o GAM.CLIENT
Para realizarmos o login no GAM.PROVIDER teremos que registrar um método de autenticação do tipo acesso remoto (GAM.REMOTE)  na GAM.CLIENT, Desta forma disparamos uma autenticação em outro GAM, que não o definido na aplicação cliente.

Ao adicionar este novo Authentication Type, teremos novamente que utilizar os valores de ClientId e ClientSecret e Private encryption key , que foram previamente registrados no GAM do provedor de identidade (GAM.PROVIDER), e para os valores de Local site URL = http://localhost/GAMCLIENT.NetEnvironment/ e Remote server URL = http://localhost/GAMPROVIDER.NetEnvironment/


Maiores informações em:


Logando uma Unica Vez

Para testar o modelo basta criar um usuário qualquer na kb GAM.PROVIDER, e em seguida realizar o login remoto a partir da kb GAM.CLIENT.

Apesar de não existir o usuário na kb GAM.CLIENT, o acesso será permitido porque a autenticação do mesmo acontecerá na kb GAM.PROVIDER. Na primeira vez que isso ocorrer, uma tela se abrirá para que o usuário seja criado também na GAM.CLIENT (sem a senha, que ficará na GAM.PROVIDER).

Desta forma, após o login ter sido realizado, o usuário passa a existir em ambos os GAMs. E se selecionar um objeto em ambas as kbs o mesmo será aberto sem que haja a necessidade de realizar novamente a operação de autenticação.

Um detalhe importante é que a operação de autenticação é realizada remotamente, ou seja, um objeto GAMRemoteAccess localizado na GAM.PROVIDER deverá ser aberto para que se ingresse com o usuário e a senha.



Sessão & Logout

Uma vez autenticado remotamente, uma sessão valida será aberta também no GAM.CLIENT, ou seja, a autenticação já havia criado uma sessão valida anteriormente no GAM.PROVIDER. E as duas sessões já liberam o acesso a ambos os sistemas.

Todo o processo de validação da sessão é realizado mediante o definido no protocolo da OAUTH, e tratado pelo GAM sem que seja necessário programar nenhuma linha de código.

Para encerrar a sessão é necessário realizar o logout no GAM.CLIENT, mas isso não encerrará a sessão no GAM.PROVIDER.  Isso causará um efeito, no minimo interessante, pois mesmo se fechar a aba do navegador do cliente, e abrir uma nova no mesmo navegador, o login no GAM.PROVIDER estará ativo e não será necessário autenticar novamente, pois uma nova chamada ao GAMRemoteLogin abrirá novamente a sessão.

Event 'Logout'
GAMRepository.Logout(&gamerrors)
for &gamerror in &gamerrors
msg(&gamerror.Message)
endfor
Endevent

Um logout definitivo somente ocorrerá se a sessão no GAM.PROVIDER for encerrada, como por exemplo, pelo fechamento do navegador.

Maiores informações em:


Tratando o Perfil do Usuário

Para que tudo funcione corretamente no sistema, precisamos ainda tratar da questão do perfil do usuário (Role), isso porque o acesso aos objetos são definidos no próprio Role.

Uma nota importante aqui é que as definições de permissões são sempre no CLIENTE, mediante as definições de Allow e Deny que foram definidas para cada objeto a um certo Role. A autenticação (Authentication) determinará se o cliente pode ingressar no sistema e a autorização (Authorization), determinará quais objetos podem ser acessados, e qual o privilégio de acesso.  Desta forma as definições do PROVIDER não contribuirá no acesso do cliente.

Por outro lado, um detalhe importante é a transferência dos Roles do usuário para a aplicação cliente, que pode ocorrer no processo de login.  Ou seja, quando uma pessoa realiza o login remoto, os Roles definidos na aplicação PROVIDER podem ser replicadas na aplicação CLIENT.

Para que isso ocorra é necessário mapear os perfis utilizando-se a propriedade ExternalId, isso ocorre porque os nomes dos perfis podem até serem iguais, mas como o GAM somente leva em conta o GUID dos perfis, e como estes sempre serão diferentes, precisaremos definir um código próprio para estabelecer a correspondência, sendo aceito números, letras, para definir uma palavra que crie a associação. Por exemplo:


Ao fazer isso, quando realizar a autenticação de um usuário, os perfis (Roles) definidos no PROVIDER serão replicados no CLIENT.

Maiores informações:



Criticas a OAUTH

Finalmente, o GAM é baseado especificamente no protocolo da OAUTH, e como existem similares no mercado que se propõe a realizar a mesma coisa, existem criticas e elogios aos modelos propostos, e fica sempre a duvida a respeito da robustez do GAM para atender as nossas aplicações.

Separei dois artigos interessantes a respeito desta novela para que você tire suas próprias conclusões.


Conclusão 

Antes de finalizar, vamos destacar o excelente trabalho feito pela Genexus para nos disponibilizar este grande recurso, e principalmente pelo farto material disponibilizado na Wiki que foi uma base excepcional para que chegássemos a este artigo, que em muitos detalhes reproduziu a mesma linha de raciocínio dos desenvolvedores. (Atualmente a Wiki possui 405 artigos sobre GAM!)

Este tema é muito interessante para ficar em um único artigo, acredito que logo voltaremos ao tema, para mostrar detalhes mais práticos a respeito do SSO em multiplas kbs Genexus.



sábado, 31 de outubro de 2015

Resolution, Density, Pixel, File Size, ...

Manipulação de imagem é assunto interessante mas ao mesmo tempo cheio de detalhes técnicos. Compreender um pouco deste tema é fundamental para construir aplicações bonitas, mas também bem dimensionadas na questão armazenamento. Praticamente todo mundo virou fotografo nos dias atuais, com direito a equipamento de alta qualidade e também armazenamento instantâneo em sites como facebook, snapchat, ..., e nada mais natural aproveitarmos a câmera dos smartphones para capturar momento, eventos, situações para armazenarmos no nosso App.

Outra motivação importante diz respeito a escolha das imagens para comporem nossa aplicação, normalmente por meio de um ícone, um background, enfim, imagem é um recurso necessário, mas vem acompanhado de muita teoria: Pixel, Resolution, Density, ....

Então vamos estudar um pouco a respeito deste tema, buscando aprender um pouco sobre a teoria, mas também informando os caminhos para desenvolvermos imagens para nossas aplicações.  Vai ficar um pouco longo, me desculpem, e para quebrar um pouco vou deixar os dois primeiros temas neste artigo e o terceiro que trata da resolução de dispositivos móveis num segundo.
  • 1: Conceituação sobre imagens, resolução, pixel
  • 2: Manipulação de imagens no Genexus
  • 3: Resolução de imagens para dispositivos móveis.


1: Resolução, Densidade, Pixel, File Size

Inicialmente consideremos que uma imagem é formada por um conjunto de Pixels (Picture and Element) uma certa unidade de medida . Cada câmera digital possui um sensor que captura milhões de células ou  pontos de luz. Cada ponto ou célula capturada é chamada de pixel, e quando se fala 8 Megapixel ou 8 Mp se define um dispositivo que consegue capturar 8 milhões de pontos em uma única imagem.  O valor de cada pixel capturado determina uma certa cor lida pelo sensor, que também possui uma teoria para medir sua composição a partir de três cores básicas (Red-Green-Blue ou RGB), estaremos mais abaixo discutindo este assunto..

Somente e total de células ou pontos de luz não define se uma imagem será boa ou não, porque entra em cena um segundo elemento que determina a dimensão da imagem em função de sua largura e altura, Width e Height, que alguns autores chamam de Resolução (Resolution).  Esta define o total de pixel medidos a partir da horizontal (width) e vertical (height) que o sensor da câmera consegue capturar, portanto nosso 8Mp não quer dizer muita coisa, precisamos também identificar a resolução horizontal e vertical, que normalmente é descrita por meio de uma representação do tipo 640 x 480, 1216 x 912, 1600 x 1200, 2240 x 1680, 4256 x 2832.  Esta última representa uma imagem com 12052992 pixels, ou seja, uma imagem de 12.1Mp.

Para os fotógrafos profissionais o fator mais importante não é a resolução em si, mas sim o tamanho impresso da imagem, que seria formado pela combinação de uma alta resolução mas também pela distância entre cada pixel, tanto horizontal quanto vertical, ou seja, se os pontos estão comprimidos ou espaçados. Mais comprimido, mais nítida seria a imagem, mais espaçado, teríamos uma imagem mais granulada.  Desta forma uma nova unidade de medida PPI (Pixels Per Inch ) define a densidade (Density) da mesma. Máquinas fotográficas profissionais trabalham com densidades de 300PPI, um monitor de vídeo 72PPI or 96. A Unidade PPI normalmente é associada a outra DPI (Dots Per Inch), referindo-se aos pontos de impressão em uma impressora laser ou jato de tinta.O iPhone 6, por exemplo, possui uma densidade de 326 PPI na tela retina.

Pixel não é Byte


Finalmente vamos falar da dimensão da imagem gravada, o File Size, onde buscamos traduzir a unidade megapixel em megabytes, bytes e bits, para enfim tratarmos da quetão armazenamento. Neste sentido entra em cena a criatividade humana, que identificou que quando analisamos uma certa imagem pixel-a-pixel, se concluiu que existem sequencias onde os valores se repetem. Por exemplo, se você pegar um retângulo de dimensões 4256 x 2832, totalmente preenchido com uma única cor vermelha, não precisaríamos de todos os pixels armazenados no arquivo, mesmo porque seria uma repetição, bastaria de algo como 'repita a mesma cor vermelha, 12.1Mp vezes' e em seguida um processador para ler e repetir a informação no momento de apresentar. Sabe quem faz isso? os formatos de imagem: PNG, JPG, GIF que são algoritmos que comprimem uma imagem para a menor dimensão possível de armazenamento.

Se tivéssemos esta mesma imagem de 4256 x 2832 consumindo, para cada pixel um único bit, e sem nenhuma compressão, teríamos um arquivo com 12.1Mbytes, mas para se medir a dimensão de um pixel em bits, precisamos entender um pouco do que podemos representar em termos desta unidade. Por exemplo, se cada pixel consumir um único bit, podemos apenas designar duas cores para esse pixel (branco/ligado e preto/desligado),  desta forma, para representar mais cores, precisamos de mais bits, e aqui temos mais um conceito importante chamado Color Depth  (ou Bit Depth).  Neste, um Bit Deph de 8 bits permite representar 256 cores diferentes.

Portanto, para se calcular a dimensão final em bytes de uma imagem, precisaríamos incluir em nossa conta a dimensão da imagem, o bit depth, a densidade, a compressão, e mesmo assim, nunca chegaremos a uma conclusão definitiva, porque cada imagem tem suas próprias características que influenciariam na dimensão final.

Por exemplo, uma foto com dimensão de 2592 x 1936, imagem (a) abaixo, com  resolução horizontal de 72 dpi e vertical de 72 dpi, com bit depth de 24, comprimida com formato JPEG, gera uma dimensão aproximada de 1.5Mb. Digo aproximada, porque outra foto neste mesmo aparelho, imagem (b) poderá ter uma dimensão completamente diferente, devido a compressão, mesmo se tiradas do mesmo dispositivo.





O fato é que atualmente os dispositivos precisam de cada vez mais memória para guardar todas as imagens capturadas e nossos Apps e sistemas também sofrem influencia deste novo comportamento, precisamos então compreender quais os recursos que temos a nossa disposição para programarmos.


2: Armazenamento de Imagens no Genexus

No Genexus as imagens podem ser capturadas e armazenadas diretamente na tabela por meio do tipo Image ou Blob.  O primeiro é indicado para imagens com formatos tradicionais (JPEG, GIF, PNG) enquanto que o segundo tipo permite armazenar qualquer coisa, desde imagem a documentos Word, Excel, PDF, ...

Image

Muito simples, definir um atributo com o tipo Image, e o Genexus se encarrega de fazer o resto (upload, armazenamento, recuperação). Nas versoes mais antigas o Genexus definia este tipo como Bitmap.

Este tipo utiliza dois atributos no banco para armazenar a informação.  O primeiro, do tipo VARBINARY armazena a imagem em si num formato BLOB (binário). O segundo uma string com um formato meio esquisito, por exemplo: gxdbfile:1_6095d6f151664be2b40f6d073e391b69.PNG, que é o nome do arquivo de controle da imagem no BD.

 [ClienteFoto]     VARBINARY(MAX)    NOT NULL,
 [ClienteFoto_GXI] VARCHAR(2048)    NOT NULL


Blob

Tipo bastante interessante que permite armazenar qualquer coisa na tabela, um EXE, PDF, ... Ja exploramos esse assunto no Genexando.


UploadFy

Além desses dois tipos, você poderá optar por realizar um upload manual da imagem para o servidor, armazenando-a fisicamente em uma pasta no servidor. Neste caso, recomendo estudar um pouco o controle uploadfy.


Temp Storage

Falar sobre Image ou Blob nos remete também ao assunto de reconstrução da imagem para sua inclusão na pagina ao usuario, isto considerando que a mesma deve existir fisicamente no servidor para que possa ser incluida em uma tag <img> no browser.

Para isso o Genexus reconstroi a imagem do BD para uma imagem fisica, armazenando-a em dois diretorios: PrivateTempStorage e PublicTempStorage.  Estes ficam localizados na raiz da aplicação (web para o .Net), e apontadas no web.config no appSettings:

  <appSettings>
      <add key="CS_BLOB_PATH" value="PublicTempStorage" />
      <add key="TMPMEDIA_DIR" value="PrivateTempStorage" />


Nestas pastas o Genexus armazenara o arquivo para upload e também restaurará a imagem para mostra-la no browser.


Maximum Upload Size Property

A versão Genexus Evolution 3 apresenta um recurso para controlar a dimensão da imagem a ser submetida ao banco de dados (upload) que é a resolução da mesma de acordo com uma determinada dimensão Large, Medium e Small, previamente definida em Preferences - Kb.


Em seguida, no próprio atributo Image definimos em Maximum Upload Size a dimensão que permitiremos ao usuário subir para o servidor.


No Maximum Upload Size se você deixar o valor Actual Size será submetida a imagem original ao Banco de Dados, evidentemente sujeitando o sistema a crescente evolução da resolução dos dispositivos. Por outro lado se a opção for limitar em um tamanho Small, Medium, Large, a mesma será reduzida mantendo-se o Aspect Ratio, ou seja, a proporção, caso a mesma seja maior que a dimensão definida. Ate o momento este tratamento é realizado em iPhone e Androids.

sexta-feira, 23 de outubro de 2015

Que? App Transport Security Policy?

Construir coisas com recursos muito novos pode dar nisso, mensagens malucas que não apenas levam um tempo para serem entendidas mas também acabam gerando um pouco de frustração, principalmente quando se da conta que a ferramenta ainda não dá suporte ao XCode 7.


Para ser mais exato o problema se chama The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.


Esta situação somente afeta quem usa o Mac e atualizou o XCode recentemente para a nova versão, se estiver usando outro emulador, como o KBN, por exemplo, não viverá este problema.


Portanto, fica a dica, não saia atualizando tudo sem antes dar uma olhada se o Genexus já oferece suporte ao recurso. Quanto ao XCode, sim, já estão trabalhando para atender aos recursos de proteção incluidos nesta nova versao, eu só vou ter que esperar um pouquinho, :(