sábado, 2 de março de 2013

Configuração de Servidores - Erro no envio de emails

Configuração Servidor
Uma das dificuldades de se trabalhar com aplicações web, são as configurações dos servidores, seja de produção ou homologação.

Quando iniciamos com o Genexus, temos um desafio inicial, que é correta configuração do ambiente, tanto para compilar aplicações em Java quando em .Net. Após esta configuração inicial, do ambiente de desenvolvimento, temos um outro desafio: A configuração dos servidores de produção e homologação. 

Esta tarefa se torna árdua em virtude das "N" combinações possíveis de ambiente. Podemos trabalhar com SQL Server 2005 em um servidor Windows Server 2003, 32 bits, ou talvez com Postgresql em um sistemos operacional Windows Server 2008 64 bits. Além destas possíveis combinações, temos as diferentes versões  do Genexus. Tudo isso combinado, se torna um pesadelo para qualquer profissional da TI.

Bom pessoal, vou compartilhar um erro que enfrentei nesta última semana. Estou trabalhando em um projeto na versão do Genexus Upgrade 2, ao publicar o sistema em um ambiente Windows Server 2008 64 bits, enfrentei uma dificuldade nos envios de email pela aplicação.

Independente da configuração do firewall, ele podia inclusive estar desligado, e das portas configuradas através da programação da procedure, eu sempre recebia a mesma mensagem:

"An error occurs while communicating with the remote host."

Esta mensagem aparecia logo na hora de realizar o login junto ao host. Cheguei inclusive, a dar privilégios totais de segurança para o usuário IIS, isso, para verificar se era alguma configuração do servidor. Porém, mesmo assim, nada disso trouxe um efeito positivo.

Após algumas pesquisas e pesquisas, encontrei um post de um usuário, isso em 2010, onde este, afirma ter encontrado um bug ao realizar envios  de emails em um servidor Windows 7 64 bits, este usuário estava programando na versão Upgrads 2 do genexus, a mesma que a minha.

Segundo a artech, este bug foi corrigido na versão Upgrade 7, logo, as outras versões devem apresentar o mesmo problema.
E qual a solução proposta?

Encontrei no blog Genexando, uma rotina de envio de email em CSharp, a ser implementada no genexus. Esta programação contorna o problema, porém restringe a aplicação para um único gerador, caso deseja compliar em Java, deverá criar a mesma rotina em Java.

Vamos lá pra o código. Criei um objeto Procedure no Genexus, e em Source programe:
//=====Variáveis utilizadas - poderão ser recebidas como parâmetros=====

//=====Host de conexão - Varchar(40)=====
&SMTPHost = 'smtp.gmail.com.br'

//=====Usuário e senha de conexão -Varchar(40)=====
&SMTPUserName = 'Usuario'
&SMTPEmailPassword = 'senha'

//=====Enviar o email para... - Varchar(40)=====
&EMailTo = 'edu_ferroni@hotmail.com'

//=====Assunto - Varchar(40) e Mensagem - LongVarchar=====
&EMailSubject = 'Assunto'
&EMailMessage = 'Mensagem'

//=====Código nativo CSharp=====
csharp try
csharp {
csharp System.Net.Mail.MailMessage mM = new System.Net.Mail.MailMessage();

csharp mM.From = new System.Net.Mail.MailAddress([!&SMTPUserName!]);
csharp mM.To.Add([!&EMailTo!]);
csharp mM.Subject = [!&EMailSubject!];
csharp mM.Body = [!&EMailMessage!];
csharp mM.IsBodyHtml = true;
csharp mM.Priority = System.Net.Mail.MailPriority.High;

//=====Porta de conexão utilizada: 587=====
csharp System.Net.Mail.SmtpClient sC = new System.Net.Mail.SmtpClient([!&SMTPHost!], 587);
csharp string strId;
csharp string strPassword;
csharp strId = [!&SMTPUserName!];
csharp strPassword = [!&SMTPEmailPassword!];
csharp sC.Credentials = new System.Net.NetworkCredential(strId, strPassword);
csharp sC.Send(mM);

//=====Verifica status: 1 = envio com sucesso; 0 = erro ao enviar=====
csharp [!&statusEnvio!] = 1;
csharp }
csharp catch (System.Exception ex)
csharp {
csharp [!&statusEnvio!] = 0;
csharp }

Agradeço ao Genexando pelo código, me ajudou bastante, e espero que ajude a quem mais precisar.

Com o tempo irei postar mais sobre este assunto, configuração de ambientes. Irá inclusive, me ajudar a documentar os processos que venho passando.

Grande abraço.

segunda-feira, 25 de fevereiro de 2013

Teste seu conhecimento #2 (lógica de programação)

Genexus Desafio Lógica
Bom esse novo desafio não tem história por trás, apenas pesquisei e encontrei em um site sobre lógica e desafios matemáticos, hehehe.

Vamos lá, desafio vocês a encontrarem o menor código possível para resolver o seguinte problema:

Se nós listarmos todos os números naturais menores que 10 que são múltiplos de 3 e 5, teremos: 3; 5; 6 e 9. Somando estes múltiplus naturais o resultado será 23!

Encontre a soma de todos os números naturais múltiplos de 3 e 5 menores que 1000! Sem pega ratão.. haha

Existe apenas um resultado certo, o desafio maior é realizar este procedimento com o menor código possível!

Gostaria muito de receber o resultado encontrado e o código utilizado para chegar a este número. Obrigado. :D

domingo, 17 de fevereiro de 2013

Genexus e Google Analytics

Genexus Google Analytics
Google Analytics é uma ferramente poderosa e gratuita que possibilita conhecer como os usuários de sua aplicação se comportam. A partir de estatísticas em tempo real e em períodos determinados, podemos saber entre muitas outras coisas, a quantidade de visitantes únicos por dia, quais páginas eles mais acessam, em qual horário e quanto tempo eles permaneceram na aplicação.

Para desfrutar desta API (Application Programming Interface) é necessário possuir uma conta no Google, qualquer conta, como Gmail, YouTube e Orkut, acessar o site da ferramente e clicar
sobre o botão "Criar Conta". Seguindo o passo a passo da criação você irá informar seu nome, a url da aplicação, país, entre outras coisas.

Após a sua conta ser criada, o Google irá fornecer um código javascript de monitoramento, é necessário incluir este código na Master Page da sua aplicação. Este código contém uma Id única, cada aplicação adicionada ao Analytics terá a sua própria Id, e é desta forma que o Google irá reconhecer a sua aplicação.

Este código poderá ser encontrado através do menu "Administrador" no canto superior direito do site, opção "Informações de acompanhamento", segunda aba apresentada.

Genexus Google Analytics
código que estamos procurando

Inserção de código na aplicação Genexus

Para adicionar o código, em projeto web crie um novo arquivo de extensão ".js" (analytics.js) dentro da pasta "web" do seu projeto, e, abra-o com o bloco de notas, ou qualquer editor que text que desejar.

Inclua o código fornecido pelo Google:

var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-99999999-9']);
_gaq.push(['_trackPageview']);

(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();

Agora, no objeto Master Page, inclua o código abaixo no evento Start:

Form.JScriptSrc.Add('analytics.js')

Após a publicação deste objeto Master Page em ambiente de Produção, já poderemos monitorar as estatísticas da aplicação. Por exemplo a quantidade de visitas x quantidade de páginas acessadas por visita nos últimos 30 dias:

Genexus Google Analytics


segunda-feira, 4 de fevereiro de 2013

Genexus - Grid Design

Genexus Grid Design
O Design aplicado ao Genexus

Quando trabalhamos em um projeto, a parte gráfica deste, seu design, imagens e estilos, é sempre a última tarefa a ser realizada. Isso, quando não aplicamos o design default disponível a partir da ferramenta Genexus.

Para nós analistas, o design pode parecer algo supérfluo, que não alterará em nada as aplicações. Porém para muitos usuários é algo essencial, a aplicação pode estar perfeita porém se o usuário não se interessar pelo seu design, a sua expectativa com relação ao sistema não terá sido alcançada.

Temos de ser racionais, e considerar que todas estas visões estão corretas. Não podemos transformar a parte gráfica das aplicações no principal processo de desenvolvimento, mas também, devemos considerar que a parte estética pode aumentar em muito a interação de nossas aplicação junto ao usuário final.

Hoje irei tratar de uma configuração simples, como transformar o design padrão dos grids em um grid igual ao da figura do topo do post, muito semelhante à biblioteca gxui. Acredito que a partir deste post podemos avançar para outros mais avançados, como, utilizar consideravelmente a biblioteca jquery em nossa MasterPage.

Configuração do Grid a partir do Tema

Primeiramente, iremos abrir o nosso tema padrão do projeto, a partir da pasta "Customization" - "Themes" (figura 2). Após aberto, precisamos criar uma nova classe do objeto "Grid". Para isso, clicamos com o botão direito sobre o objeto "Grid" e clicamos em "Add Class" (figura 3).

Genexus Folder View
figura 2 - Folder View
Genexus Tema
figura 3 - Adicionar Classe

OK, agora vamos começar a configurar suas propriedades gráficas. Abaixo irei listar cada propriedade, seu valor de configuração, e uma descrição explicativa:

PropriedadeValorDescrição
NameGridBlog(nome da classe)
Background Repeatrepeat-x(determina se a imagem de fundo irá se repetir horizontalmente, verticalmente)
Margin1pt 1pt 1pt 1pt(margem externa: acima, a direita, abaixo, a esquerda)
Padding1pt 5pt 1pt 5pt(margem interna: acima, a direita, abaixo, a esquerda)
Background ColorTransparent(cor de fundo do grid)
Background ImagemGridBackground(imagem de fundo do grid, disponível abaixo do post)
Border Color#1a67b8 #1a67b8 #1a67b8 #1a67b8(cores das bordas: acima, a direita, abaixo, a esquerda)
Border Stylesolid (estilo da borda, linha solida)
Border Width1px(largura da borda)
Line Back Colortransparent(cor das linhas impares)
Line Back Color EvenGainsboro (cor das linhas pares)
Line Font Stylenormal(estilo de fonte normal)
Line Font Size11px(tamanho da fonte das linhas)
Line Font FamilyArial (fonte das linhas)
Title Back Colortransparent (cor de fundo dos títulos das colunas)
Title Font Stylenormal(estilo de fonte normal)
Title Font Weightbold (peso da fonte dos títulos das colunas)
Title Font Size12px(tamanho da fonte dos títulos das colunas)
Title Font FamilyArial (fonte dos títulos das colunas)
Title Fore ColorBlack (cor dos títulos das colunas)
Custom CSS Propertiespadding-top:2pt;(margem interna aplicada ao topo)

Imagens Utilizadas

Neste exemplo estamos utilizando apenas 4 imagens. Imagens de ação (alteração, exclusão e visualização) e a principal e referenciada na propriedade da classe, a imagem de fundo do grid (degrade do topo). São elas:

alteração
alteração
Exclusão
Exclusão
Visualização
Visualização
Imagem GridBackground
Imagem GridBackground
Estas imagens são de escolha do desenvolvedor, indico um ótimo site de ícones. Muito bom para encontrar as imagens adequadas para a sua aplicação, o site é http://findicons.com/.

Definição de classe

Por fim, é necessário definir esta classe criada em nossos grids apresentados. Para isto, no objeto trabalhado (transação ou web panel), clique sobre o grid de modo a apresentar as suas propriedades à direita. No item "Appearance - Class", selecione o nome da classe criada, GridBlog, conforme a figura abaixo:

Genexus Grid Propriedades

quinta-feira, 17 de janeiro de 2013

Teste seu conhecimento #1 (lógica de programação)

Desafio
Nos primórdios de 2007, quando estava começando a entrar no mundo da TI, em meio a tantos currículos enviados fui convidado para fazer uma entrevista em uma empresa que desenvolvia softwares em php. Nessa primeira entrevista, todos os candidatos ficavam na mesma sala e recebiam cada um, uma folha contendo 5 questões de lógica de programação e conhecimentos da linguagem (métodos, funções, etc). 

Dentre estas questões, teve uma que dificilmente vou esquecer, era uma pergunta simples mas que fugia do cotidiano. Lanço um desafio para aqueles que desejarem participar e ver em quantos comandos são capazes de resolves. Mas sem colar... hahaha

A Missão

A proposta deste desafio é:

Dada duas variáveis A e B, sendo A = 3 e B = 5, escreva um código, sem utilizar uma terceira variável, capaz de trocar o valor entre elas. Ao fim, as variáveis deverão ser iguais a: A = 5 e B = 3......

Ah sim! Daqui a UM mês irei divulgar o resultado, então há tempo de sobra.

Gostaria muito de receber sua contribuição. Obrigado. :D