Você pode ser substituído por uma máquina?

Este foi um dos temas de redação propostos no processo seletivo da Universidade Federal de Uberlândia 2015-2. E com base neste tema, é proposto redigir uma CARTA ARGUMENTATIVA ao Ministro do Trabalho, sugerindo a criação de medidas que minimizem a situação dos trabalhadores que poderão ser substituídos por uma máquina.

Trata-se de um tema que menciona um problema atual, com uma referência enorme junto aos produtos e sub-produtos criados por programadores, tais como eu. E como nem só de linhas de código são escritos os posts deste blog, mas também de pensamentos e ideias que dizem e expressam nossa opinião sobre qualquer assunto envolvendo tecnologia. Eis aqui nossa humilde opinião sobre formas de amenizar este problema.

Frame1

Continuar lendo

Campos redundantes relacionados as entidades do EntityFramework 6.x

O erro descrito à seguir é obtido em tempo de runtime e não é identificado pela compilação da aplicação. Sendo assim, torna-se mais difícil a identificação da origem do problema, por não ficar evidenciado em nenhum momento em qual parte do código, dos dados, dos arquivos binários, há a ocorrência desta mensagem:

The item with identity ‘Id’ already exists in the metadata collection. Parameter name: item

Continuar lendo

Problema com testes unitários em controllers do ASP.NET MVC envolvendo AutoMapper.

Existe a possibilidade de ocorrer um problema na criação de testes unitários envolvendo chamadas de métodos de controllers do ASP.NET MVC que utilizam o AutoMapper para mapeamento das entidades de domínio e ViewModels. Na execução de um teste sobre o controller, foi lançado uma exceção do tipo FileLoadException, no momento da chamada que seu construtor era carregado com seus dois parâmetros, um serviço de CRUD e a interface IMappingEngine do AutoMapper. A opção por passar a interface IMappingEngine como parâmetro, injetando-a no construtor. Este procedimento tem o intuito de facilitar os testes, tornando possível a definição do objeto IMappingEngine, antes da instância do controller. No caso deste exemplo, o construtor do controller tem uma assinatura similar a esta:

Continuar lendo

O que, onde, quando e quem testar no seu código


“O que testar? Onde testar? Quem testar? Este é um post com alternativas práticas para se testar a camada de domínio, acesso a dados e interface de usuário em aplicações real. Sugerindo tipos de testes de acordo com a camada em que pertence, dentro de uma arquitetura baseada em DDD, numa típica aplicação ASP.NET MVC.“

Em teoria testes unitários são relativamente simples de serem construídos e compreendidos. Uma vez que assemelham-se a pequenos programas, com entradas, processamento e saídas bem definidos. Porém a implementação de testes em “aplicações reais” é bem mais complicada de ser colocada em prática do que em teoria. Seja usando testes unitários em toda a aplicação, ou apenas em algumas partes mais críticas para a escrita de testes específicos. O que pode ser constatado em geral é que após o entendimento da teoria referente à testes é difícil saber onde aplicar os testes unitários? E principalmente “o que” e “como” testar nosso código?

Este post objetiva mostrar alguns exemplos de testes para as camadas de uma aplicação MVC, com métodos que acessam um banco de dado, interações de usuários, de acordo com os conceitos do DDD. O padrão arquitetural DDD fornece uma estrutura de práticas e terminologia para a tomada de decisões de design que focam e aceleram projetos de software, lidando com domínios complicados (Wikipedia), possuindo camadas previamente definidas, Domain Layer, Application Layer, Data Acess Layer e Presentation Layer (Figura 1). Cada uma destas camadas possuem diferentes responsabilidades e características e consequentemente diferentes tipos de testes unitários.

Continuar lendo

What, where, when and who to test in your code

This article was also published in CodeProject.


“What to test? Where to test? Who to test? This is a post with practical alternatives to test the domain layer, data access and user interface in real-world applications. Suggesting types of testing according to layer on which it belongs, within a DDD-based architecture, in typical applications ASP.NET MVC.“

In theory a unit testing is straightforward to be built and comprehended. Since it seems small programs, with inputs/processing/outputs well-defined. But the implementation of testing in “real-world applications” is much more complicated in practice than in theory. Either using unit testing throughout the application or only the most critical parts for writing specific tests. In general, often after that is understood theoretical examples, it’s difficult to know where applying unit testing? What to test? And mainly, how to test our own source code?

This post aims to show some examples of tests to the layers of an MVC application with methods that access a database, user interactions, according to the DDD concepts. The DDD architectural pattern provides a framework of practices and terminology for making design decisions that focus and accelerate software projects, dealing with complicated domains (Wikipedia), with previously defined layers, Domain Layer, Application Layer, Data Access Layer and Presentation Layer (Figure 1). Each of these layers have different responsibilities and characteristics, therefore different types of unit testing.

Continuar lendo

Roteiro para Instalação do Team Foundation Server – TFS no Windows 2012 Server

orchard-tfs

A instalação do Team Foundation Server- TFS não é trivial, uma vez que envolve alguns pré-requisitos obrigatórios que permitem várias opções de cenários para prover os serviços. Inicialmente é necessário traçar e abstrair a forma de trabalho do time de desenvolvimento, de acordo com os recursos (software e hardware) disponíveis na organização à usá-lo, em sintonia com as funcionalidades da versão adquirida. Existem várias possibilidades de instalação que podem ou não ser vinculadas a outras aplicações e ferramentas de controle do sistema operacional. Porém, a intenção deste roteiro é resumir de forma bastante simplificada as informações contidas na documentação original. Guiando por um único caminho, seguindo regras pré-determinadas para o seu bom funcionamento após a instalação. Este artigo é indicado não só pelas informações de documentação contidas nele, mas também pelas experiências verificadas ao longo do processo de instalação do TFS. Ilustrando algumas boas práticas para o seu funcionamento futuro, sequências de instalação junto ao ambiente do sistema e configuração de pré-requisitos.  Exibindo uma série de erros que podem ocorrer ao longo do processo, a fim de evitá-los.

O assistente/wizard de instalação possibilita um número variado de possibilidades para a instalação do TFS. Podendo ter por exemplo, uma instalação vinculada a um único servidor ou com mais servidores, com o objetivo de separação das responsabilidades e escalonamento de cargas. Ou pode-se ter uma instalação vinculada ao Reporting Services do SQL Server, para o uso de seus poderosos recursos de criação de relatórios. Ou ainda uma instalação com vínculo as features do Sharepoint. Além de questões como segurança e a forma de permissões de acesso aos projetos, podendo ser implementada de várias formas. São várias as possibilidades, que são suceptíveis a vários tipos de erros que serão listados neste roteiro! Embora não seja possível a demonstração de todas as possibilidades de instalação, este roteiro experimentou inúmeros cenários e configurações utilizando o SQL Server 2008 R2, o SQL Server 2012, suas versões Express, o Team Foundation Server 2012, junto ao Windows Server 2012 R2 Datacenter.

Continuar lendo

Roteiro para criação de uma Máquina Virtual no Windows Azure e implantação de aplicações ASP.NET MVC

Este post tem como objetivo fornecer uma sequência de passos a fim de guiar na criação, manipulação de recursos e no uso de uma máquina virtual do Windows Azure (VM). Seguindo desde a criação de uma VM, seus recursos e pré-requisitos até a implantação de uma aplicação web dentro do sistema. Descrevendo alguns erros e acertos cometidos nesta experiência ao longo do processo. Exibindo ao final do processo, um cloud-server funcional, do ponto de vista das necessidades de desenvolvimento e deploy de aplicações. Neste post não há nenhum enfoque em segurança, performance de hardware, escalabilidade e acessibilidade. Como já afirmado anteriormente, o único objetivo é a disponibilidade de uma máquina virtual em rede e pronta para hospedagem de aplicações ASP.NET.

A opção por uma VM vem da necessidade de haver uma máquina com toda a sua infraestrutura alocada na rede, com permissão e controle total de seu sistema operacional. Para o caso da instalação de apenas uma aplicação web, o mais recomendado seria o item ‘Site’, dentre as opções de produtos do Windows Azure. Neste caso, a escolha da plataforma IaaS, surgiu da previsão de que futuramente não somente esta aplicação, mas outras também possam estar presentes no cloud-server. Havendo a possibilidade de termos bancos de dados diversos, gerenciamento de arquivos para download/upload, serviços para entrega e recepção de mensagens entre aplicações, Windows services criados para suporte aos processamentos mais pesados, e outras demandas possíveis que tornam-se facilitadas com o uso de uma mesma infra-estrutura. É interessante que a contratação dos produtos esteja bem embasada nos conceitos de IaaS, PaaS e SaaS. Para isto recomendo a leitura de http://msdn.microsoft.com/pt-br/magazine/ee309870.aspx, no intuito do melhor uso dos recursos, objetivando um melhor custo/benefício.

Continuar lendo

Migrando uma aplicação ASP.NET MVC 2 para o MVC3

Este post não é um roteiro contendo as melhores ferramentas e técnicas para a migração do framework ASP.NET MVC 2 para o ASP.NET MVC 3. Trata-se de uma sequência de erros e acertos cometidos ao migrar uma aplicação do MVC 2 para MVC 3, disponibilizada de forma documental, conforme a execução cronológica das tarefas realizadas num projeto específico. Existe a possibilidade de ter sido tomada algumas decisões erradas e ter sido utilizado ferramentas menos eficientes que outras existentes. Foi priorizada a escolha de ferramentas que a primeira vista parecessem mais confiáveis e que fossem mais eficientes, tomando o menor tempo possível em adaptações manuais. O mais importante é que ao final deste processo foi obtido sucesso, iniciando com uma aplicação contendo mais de 250 Views, Partial Views e Masterpages, transformando-a numa aplicação totalmente funcional.

Continuar lendo

As linguagens de programação e seus ciclos de vida.

Hoje recebi um e-mail de um dos grupos de discussão que participo no LinkedIn, a respeito de uma empresa em busca de um programador pleno em PHP. Imediatamente pensei: “Coitados, vão ter que procurar muito”. Não que eu esteja menosprezando a linguagem, mas apenas baseado no que vejo no mundo atual, onde se percebe claramente a escassez cada vez maior destes profissionais no mercado. Vejo o PHP como um “paciente terminal”, se é que ainda não aconteceu o fatídico dia e não me contaram. Nada contra a linguagem, mas o Ruby, o Java, as linguagens .NET conquistaram todas, ou quase todas as escolhas para desenvolvimento web atualmente. Por isto o meu pensamento tão pessimista com relação à busca por estes profissionais.

Continuar lendo

Uma paginação de registros mais inteligente

A paginação de registros para exibição dos dados numa interface qualquer é realmente necessária para evitar o carregamento desnecessário de informações. Uma vez que o custo de utlização de memória do servidor é muito alto, se tornando mais alto ainda quando é multiplicado por um grande número de usuários da aplicação. É praticamente consenso o uso de paginação dos dados, exibindo registros de uma fonte de dados qualquer (banco de dados, arquivo XML, TXT, etc.) em uma quantidade fixa por vez, para que haja possibilidade de “navegar” por todo o conjunto dos dados, com o menor custo possível de memória e a melhor performance possível. O objetivo deste artigo é apontar para algumas possibilidades de implementação para a execução desta tarefa conforme a situação, ou conforme as características da aplicação ou de parte dela e não seguindo sempre um mesmo algoritmo tradicional para esta finalidade. Analisando os prós e contras de cada implementação  e situação, em função da otimização do hardware e desempenho da aplicação.

Continuar lendo