segunda-feira, 21 de outubro de 2013

Recursos de Design

Essa definitivamente não é a minha praia, mas sabe como são as coisas, volta e meia temos que improvisar, e além de analisar, especificar, projetar, programar, também desenhar.

Por falar em especialidade em WebDesign sou especialista em Paint, e essa é a minha ferramenta preferida para desenhar coisas, mas convenhamos, para um graduado na escola do Ilustrator, Photoshop, ..., parece até um pecado falar isso.  E definitivamente não dá pra fazer muita coisa com o Paint neste sentido.

Então, como gosto de compartilhar coisas, estou publicando aqui uma lista dos sites que mais gosto de frequentar quando o assunto é Design Web ou SD, espero que te ajude.

Design Web

http://www.webmonkey.com/
http://www.creativebloq.com/

Paleta de Cores

Adobe Kuler
https://kuler.adobe.com/

Fontes

Pencil Scoop
http://www.pencilscoop.com/tag/typography-tag/

Ícones

Icon Finder
https://www.iconfinder.com/

(*) Windows 8 Set
http://icons8.com/download-huge-windows8-set/

(*) Ios7 Set
http://icons8.com/free-ios-7-icons-in-vector/

(*) Para uso gratuito deve-se incluir o link para o icons8 na pagina.

IOs

Templates
http://www.pencilscoop.com/2013/09/free-ios-7-resources-for-developers-and-designers/

Designing iOS7 style icons
(ensina como criar um icone)
http://www.campaignmonitor.com/blog/post/4080/designing-ios7-style-icons

The iOS Design Cheat Sheet
Dimensoes, resolucao
http://ivomynttinen.com/blog/the-ios-7-design-cheat-sheet/

Bars and Bar Buttons
https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/Bars.html

Palestras

Temos também algumas palestras bem interessantes nos últimos eventos Genexus, que trataram deste tema.

Resources to be used in UX of Smart Device applications
Sebastian del Rio - Artech
 
Design for developers
Lucía Guedes - Artech

WEB: HTML5 wins. And now what?
Daniel Méndez - Artech

The design is ready! What do I do next?
Fabian Bonilla - Artech


Design and Development: searching for integration 
Lucía Guedes, Alejandro Cimas - Artech

quarta-feira, 16 de outubro de 2013

Pop3

Pop é de fato uma boa abreviação para popular, como diria o bom dicionário Oxford, o difícil é defini-lo como um estilo musical, o mesmo dicionário faz uma confusão danada ao tentar descrevê-lo.  A primeira referencia ao Pop é de 1926!, mas os mais estudiosos o posicionam em 1950 na Inglaterra, quando o termo Pop Music foi criado. Mas o fato é que uma pesquisa no Google revela 1.250 milhões de páginas que tratam deste assunto. Portanto, todos gostam de um bom estilo popular.

Acho que quando foi criado o Pop3 a ideia era popularizá-lo assim como ocorreu com a musica que se tornou mundial e importante.  E por incrível que pareça, creio que o tal Pop3 hoje deve ser mais importante no seu dia-a-dia que a própria musica Pop. Porque? simples, é o protocolo Post Office Protocol, que traduzido para o português simples significa: protocolo utilizado para acesso a uma caixa postal de correio eletrônico (email).

Agora vamos a um cenário interessante, que tal se você construir o próximo sistema de caixa de correio, para substituir os já re-estilizados Google Mail, Outlook e assim por diante, quem sabe se seu projeto incluísse recursos de troca de imagens, grupos, contatos,..., viagem? Acho que sim, creio que ninguém vai gastar muita energia para produzir algo assim, mesmo que em Genexus a coisa seja muito fácil de fazer.  Ou seja, Genexus oferece a você recursos que possibilitam a construção de sistemas do tipo caixa de correio eletrônico. Vamos programar uma, digamos, só por curiosidade?

Tipo Pop3Session

Tudo começa com uma variável &Pop3Session, do mesmo tipo, que tem por incumbência conectar a um certo servidor de e-mails, e obter as mensagens que lá estão.

// conexao no POP3
&pop3session.Host       = '*** servidor POP ***'
&pop3session.Port       = 110
&pop3session.UserName   =
'*** email ***'
&pop3session.Password   = '*** senha ***'     
&pop3session.Login()


Em caso de sucesso na conexão ao servidor, uma mensagem OK poderá ser utilizada para prosseguir com a operação.

if &pop3session.ErrDescription = 'OK'

   ... continuar ...
endif

Esse comando If nos permite saber se a conexão ocorreu com sucesso, mas caso contrário, talvez seja interessante você conhecer as possíveis mensagens de erro retornadas na operação.

Lendo mensagens

A segunda parte do processo consiste em ler as mensagens que estão no servidor, sendo que para isso podemos realizar dois algoritmos simples:

1) Total de mensagens a ler

&total = &pop3session.Count
for &i=1 to &total
  &pop3session.Receive(&mailmessage)

  
   ... tratar a mensagem
 
endfor

2) Ler enquanto não ocorrer erro

do while &erro=0
   &erro = &pop3session.Receive(&mailmessage)
   if &Erro = 0
      ... tratar a mensagem
   endif
enddo

Em ambas as situações o que Receive nos devolve é a mensagem no formato MailMessage, ou seja, com todas as informações, To, Subject, ..., bem simples de ler e entender o conteúdo recebido.

Uma vez lida a mensagem do servidor, algumas ações poderão ser realizadas, como por exemplo:

&pop3session.delete()
Para apagar a mensagem previamente lida, removendo-a da caixa de entrada remota.

Tem uma outra propriedade MarkAsRead que insiste em apresentar um erro quando utilizo, mas creio que possa ser útil, não tenho certeza.

Fechando a conta

Antes de fechar não se esqueça de realizar um.

&pop3session.logout()

Assim como ocorreu com o Pop Music, em 1950, esse tipo existe desde a versão 7.5 do Genexus, não que o nosso Gx existia nesta época, é que o recurso que temos em mãos na verdade já é bem antigo, mas continua a provocar suspiros nas meninas.

Eu particularmente, gosto bastante.




segunda-feira, 7 de outubro de 2013

Vários destinatários!

Mais uma para envio de emails, desculpa se o tema está meio recorrente, mas vamos aos poucos encerrando este assunto.

Outra necessidade que temos para o envio de emails é a opção de enviar para mais de um destinatário, na opção TO, BC, ou BCC, o que é plenamente possível, visto que temos nestas operações uma função Add(), que possibilita criar uma coleção de itens.

Recebi recentemente no Genexando um trecho de código que achei bem interessante e simples para implementar esse mecanismo, espero que o Antonio não fique bravo por explorarmos um pouco essa ideia, mudei um poucoe implementei uma collection ao invés de vetor.

Na estrutura do envio de emails, incluímos apenas uma sub rotina auxiliar que inclui os emails destinatários, que chamamos de 'incluidestinatarios'

Event Start 
    &smtpsession.Host            = 'smtp.gmail.com'
    &smtpsession.Port            = 465
    &smtpsession.Secure          = 1
    &smtpsession.Authentication  = 1
    &smtpsession.UserName        = '* usuario (email) *'
    &smtpsession.Password        = '* senha *'     
    &smtpsession.Sender.Address  = '* email de envio *'
    &smtpsession.Sender.Name     = '* nome  *'
       
    &smtpsession.Login()
    if &smtpsession.ErrCode <> 0
        msg(&smtpsession.ErrDescription)
    else
        &mailmessage.Text     = 'texto da mensagem'
        &mailmessage.Subject   ='titulo'
        
        do 'incluidestinatarios'
                  &smtpsession.Send(&mailmessage)
        msg(&smtpsession.ErrDescription)
    endif
   
EndEvent

Nessa rotina o que temos é o acesso a uma certa tabela de Clientes, que filtramos em um determinado Pais, e a construção de uma coleção de emails. Esse modelo é bem interessante pois não precisamos dimensionar a coleção antes de começar a carregá-la.  É um bom substituto para um vetor.


Sub 'incluidestinatarios'
    // carga dos emails, segundo uma condição
    for each
    where PaisNome='Brasil'
        &emails.Add(
ClienteEmail)
    endfor
 
    &mailmessage.To.Clear()
    for &email in &emails
       &mailrecipient.Address      = &email
       &mailrecipient.Name         = &email
       &mailmessage.To.Add(&mailrecipient)
    enddo 

EndSub 


São dois os detalhes para manipulação desta coleção, a variável &email e a &emails que são declaradas com Char(200), e a última marcada como Collection. Em seguida um for...in para recuperar os dados desta coleção.

Utilize com cautela isso hein! não vá me mandar um monte de spams.


Tilo: O que chama mais atenção!

Próximo da liberação da versão Beta2 o novo Genexus chamado de Tilo já começa a mostrar robustez e recursos muito interessantes e impactantes no modelo Genexus. Confesso que certos recursos de fato me surpreenderam.

Neste artigo apresento minhas impressões iniciais:

1) O GAM pode se tornar um provedor de identificação assim como ocorre com Facebook, Twitter, Google, Hotmail,  permitindo que as aplicações GX sejam Single Sign On, uma vez autenticado todos os demais sistemas Genexus acessados na mesma sessão não precisam de login.

2) Objeto modulo não apenas permite organizar uma kb que contem diversos subsistemas, mas também aproxima a linguagem de programação Genexus da já clássica Orientação a Objetos, com direito a Interface, Dados públicos e privados, Métodos, Objetos privados e públicos, e por ai vai. Porem, de uma forma mais visual, simples de ser compreendida no melhor padrão Genexus.

3) Gerador web com um novo modelo de chamada eventos de sistema, com o objetivo de minimizar os impactos de recarga da interface.  Eventos de usuário não executam Start, Refresh e Load, mas somente os que participam da ação provocada pelo user.  Isso faz com que o tamanho da mensagem trocada entre o Cliente e Servidor seja drasticamente reduzida, e como consequência um aumento significativo de desempenho.

4) Filtros e recarga de dados em webcomponentes a partir de ações em outro webcomponentes, por meio de notificações. Isso atualmente pode ser realizado por meio de TrackContext, mas o novo modelo é ativo, com envio de mensagens de um programa a outro, muito mais interessante.

5) Full Html5 com muitos novos recursos como web sockets, broadcast, notifications e event onmessage, podendo fazer modelos de interface tipo chat (facebook).

6) for each line in grid, modifica o grid sem recarregar tudo, recorrendo os registros alterados

7) Nova linguagem de programação como novos elementos como as transações dinâmicas que se conectam a um Data Provider para realizar a carga da informação, com isso a transação não precisa estar associada a uma tabela mas pode ser  alimentada por outras tabelas, dados obtidos de outras fontes, enfim, uma flexibilização total.  Esse recurso ainda encontra-se em definição se será liberado na nova versão Tilo ou em outra.

8) Gerador para Windows 8.
9) Aplicações full offline e com direito a um SQLLite no dispositivo para armazenar informações que serão posteriormente sincronizadas com o servidor. Deixei essa por último porque já vem sendo amplamente divulgada por ai.

Tudo isso pode ser conferido através dos vídeos das palestras do XXIII Encontro Genexus que finalizou quarta passada.








domingo, 6 de outubro de 2013

Integração Continua

Enfim, depois de um longo período de expectativas e frustrações, consegui finalmente integrar o CruiseControl.Net ao GxServer, claro que não fiz isso sozinho, tive a ajuda de nada mais nada menos do que o mestre José Lamas da Artech.  Qual foi o resultado final disso? espetacular! Parece até um sonho, ver o CCNet ler o GxServer e em caso de alterações na Kb iniciar um processo MSBuild para criar uma aplicação de forma automatizada, ou seja, sem a necessidade de nenhuma pessoa.
No desenvolvimento de software de forma compartilhada, ou seja, com muitos desenvolvedores, o que temos  é um processo constante de entrega de objetos e a necessidade de uma validação imediata se o mesmo pode ou não ser integrado ao que chamamos repositório central.  Isso ocorre porque todos os desenvolvedores possuem projetos locais que podem sofrer pequenas variações em termos de configurações, versões de objetos, banco de dados diferentes em relação à produção, enfim muitos fatores que podem levar a um problema. Isso ocorre porque nem todos os desenvolvedores baixam as atualizações em seu projeto com o repositório central de forma constante, por razões que vão desde preguiça, falta de interesse, tempo, ou mesmo coisas mais complexas como erros de objetos publicados por outros, que produzem atrasos, enfim é um processo meio caótico.

Integrar continuamente significa que ao ser publicado alguma coisa no repositório central, algum mecanismo deve validar se essa operação não afetou a construção do sistema como um todo, e qual a melhor forma de fazer isso? Recriando o sistema novamente, gerando não apenas o objeto que subiu, mas suas referências, e é exatamente isso que o servidor de integração faz.

O cenário que conseguimos resolver em nosso modelo envolve o GeneXus + GxServer + CruiseControl (CCNet) + .NetFramework, 

De forma que ao entregar algum objeto ao GxServer, faz com que o CCNet entre em ação fazendo com que uma aplicação seja construída.

Ao desenvolvedor cabem duas ações posteriores à entrega:
  1. Ingressar no painel do CCNet para verificar se houve sucesso em sua ação
  2. Testar o sistema gerado para ver se a operação

Não dá pra encerrar sem citar o post do José Lamas a respeito do CruiseControl.Net, sobre o tema Integração Continua. Se você se interessa por esse assunto, vale a pena ver.

Gracias José!

Anexando...

Este tema também já é antigo, mas sempre causa duvidas nas pessoas, já tínhamos postado sobre o Genexus Mail! versão em código nativo, mas não explorado muito sobre arquivos anexados que é muito simples também.

Neste caso, caso necessite incluir algum arquivo ao email, existe uma opção no tipo MailMessage, &mailmessage. Attachments, que é uma coleção de links de arquivos que podem ser incluídos por meio de uma operação Add()

 Event Enter

 // Conexao no provedor de email
 &smtpsession.Host     = 'smtp.gmail.com'
 &smtpsession.Port     = 465
 &smtpsession.Secure    = 1
 &smtpsession.Authentication  = 1
 &smtpsession.UserName    =
'***email sender***'
 &smtpsession.Password    = '*****'

  // remetente
  &smtpsession.Sender.Address  =
'***email sender***'
  &smtpsession.Sender.Name   = '*** Seu nome ***'

 &smtpsession.Login()
 if &smtpsession.ErrCode <> 0
  // composicao da mensagem
 &mailmessage.Text     = 'texto da mensagem'
 &mailmessage.Subject   ='titulo'

 // enviar para
 &mailrecipient.Address    =
'***email a enviar***'
 &mailrecipient.Name    = '*** nome da pessoa a receber ***'
 &mailmessage.To.Add(&mailrecipient)

 // anexos
 &arquivo      = 'C:\imagem.png'
 &mailmessage.Attachments.Add(&arquivo)


  msg(&smtpsession.ErrDescription)
 else
  &smtpsession.Send(&mailmessage)
   msg(&smtpsession.ErrDescription)
 endif

Endevent


Observe que a referencia ao arquivo a ser anexado é por meio do endereço físico do mesmo no diretório, não importando  a raiz da Web. Uma observação apenas, lembre-se que é possível utilizar uma procedure para gerar um relatório PDF que pode ser anexado, ou mesmo um arquivo XLS.

Neste ultimo caso, caso o arquivo seja grande, você deverá esperar até que o mesmo seja gerado fisicamente antes de anexar e enviar a mensagem, em certos casos é necessário programar um Delay devido ao processamento do arquivo.

quinta-feira, 3 de outubro de 2013

Como comparar JSON ou XML?

Quando se trata de comparações somos especialistas, sabemos distinguir facilmente um Fusca de uma Ferrari, mesmo se ambos forem da mesma cor, chega a ser impressionante nosso senso de observação, rs.

Comparar expressões numéricas ou texto também é simples, mas como comparar coisas mais complexas, como por exemplo dois xml´s, ou json, se estão exatamente iguais? Por incrível que pareça também é simples bastando um Hash, mas com um pequeno trabalho adicional.

Temos aqui um uso de encriptação em uma situação pouco comum e que traz resultados interessantes. Vamos a um exemplo.

Comparando Dois Textos


Em um Webpanel programamos um conteúdo tipo Json gerado no formato do tipo Messages, um SDT incluído automaticamente na Kb do Genexus.  Em seguida geramos um Hash que será utilizado para se comparar com um segundo texto que informamos livremente, e que utiliza a mesma chave e mecanismo de encriptação utilizado no primeiro texto, gerando um segundo hash.  Se forem diferentes ou iguais a respectiva mensagem será apresentada.

No primeiro teste utilizamos dois textos distintos e os valores calculados produzem resultados diferentes, (Hash e Hash2), devido aos valores em Original e Comparar Com.


Ao se copiar o conteúdo de Original , colando-o em Comparar Com, produzir-se-há hashs iguais, e o resultado será uma comparação positiva.


A programação é bem simples.

Event Start
 &message.Id    = "1"
 &message.Description  = 'Mensagem1'
 &messages.Add(&message)

 &message = new()
 &message.Id    = "2"
 &message.Description  = 'Mensagem1'
 &messages.Add(&message)

 &key=getsitekey()
 &original = &messages.ToJson()
 &hash = encrypt64(&original, &key)
Endevent


Event 'Comparar'
 &hash2 = encrypt64(&compararcom, &key)
 if &hash=&hash2
  msg('são iguais')
 else
  msg('são diferentes')
 endif
Endevent


Mais informações:


Sobre hashs tem um site bem interessante que gera encriptações com diferentes algoritmos que pode ser visto aqui.

O Xpz com o exemplo, para que você possa testar está aqui.

Duas conclusões:

  • Esse mesmo mecanismo poderia ser utilizado para comparar o conteúdo de um arquivo completo, aliás é isso que normalmente os sites sérios de download nos oferecem.
  • Qualquer pequena diferença (um espaço em branco, por exemplo) seria suficiente para tornar as duas strings diferentes.
Outra coisa que sabemos comparar com grande facilidade é a diferença de preço entre o tal Fusca e a tal Ferrari, veja como nosso senso de observação é apurado para coisas tão semelhantes...

Ainda não estamos seguros

Continuando a discussão sobre o tema de segurança nas aplicações Genexus, recebi recentemente um post do blog do Marcos Crispino (Seguridad en Aplicaciones Genexus), que joga um pouco mais de pimenta sobre este tema já ardido que é a insegurança de nossas aplicações, e claro, uma visão consciente de que o tema está longe de chegar ao final.

O que gosto no artigo é que inclui além das vulnerabilidades, também algumas estratégias, para buscarmos programar Gx de forma segura.