quinta-feira, 28 de agosto de 2014

Treinamento - HCAA - Hospital de Caridade Dr. Astrogildo de Azevedo

Ministrei um treinamento avançado em Delphi XE6 à equipe de desenvolvimento do HCAA - Hospital de Caridade Dr. Astrogildo de Azevedo, na cidade de Santa Maria - RS. O treinamento teve como principal objetivo a migração e evolução da atual solução da instituição para versões mais atualizadas do Delphi, incluindo migração de tecnologias de acesso a dados, adaptações na arquitetura a fim de facilitar a inclusão de novas plataformas como Web e Mobile, bem como o uso de técnicas de desenvolvimento ágil, programação orientada a objetos e padrões de projeto, a fim de se obterem benefícios como facilidade de manutenção, evolução, inclusão de novos requisitos, migração / evolução para novas plataformas dentre outros. O programa do curso incluiu o seguintes tópicos: Programação Orientada a Objetos com Delphi, Abstração, Polimorfismo, Herança e Encapsulamento, Delegação, Associação, Composição, Interfaces, Classes Estáticas, Classes Helpers, Generics Diretivas de Compilação, Tratamento Estruturado de Exceções, Pacotes, BPLs, Componentes e Modularização, Auditoria e Métrica de Código, Modelagem Orientada a Objetos e UML, Técnicas de Desenvolvimento Ágil com Delphi, Refatoração - melhorando arquitetura e código, Qualidade de software e Testes Unitários, Evitando Bad Smells (problemas em código), Code Clean - programando com código limpo, Refatoração para Padrões, Design Patterns - Padrões de Projeto em Delphi, Abstract Factory, Factory Method, Singleton, Template Method, Facade, Composite, Proxy, Adapter, Strategy, Chain of Responsibility, Observer, Acesso a Dados no Delphi e Multicamadas, Modelo Client/Server vs. MultiTier (Multicamadas), ClientDataSet, FireDac e DataSnap, Migração do BDE Oracle para FireDac, REST, Web Services, XML e  JSON, Novidades do Delphi XE2, XE3, XE4, XE5 e XE6, CodeSite, FinalBuilder, AQTime, Documentação, SVN, Controle de Versão, Gerência de Configuração, FireMonkey, Visual Live Bindings, Desenvolvimento Web e Mobile.

Se o time de desenvolvimento de sua empresa também estiver interessado em treinamentos, seja para capacitação, reciclagem, evolução, migração e manutenção de sistemas Delphi, entre em contato pelo email guinther@gpauli.com



quarta-feira, 27 de agosto de 2014

Pós-Graduação em Programação e Gestão em Tecnologia da Informação - Horus Faculdades

O curso de Pós-Graduação em Programação e Gestão em Tecnologia da Informação da Horus Faculdades, de Pinhalzinho - SC, contou com uma disciplina ministrada por mim, sobre a Programação Orientada a Objetos com Delphi, incluindo técnicas avançadas e boas práticas. Especial atenção dada ao correto emprego dos princípios SOLID, o uso e aplicação prática dos Padrões de Projeto - Design Patterns, uso de técnicas de desenvolvimento Ágil como Refatoração e Testes, além de exemplos práticos que mostraram os conceitos básicos da POO como Abstração, Encapsulamento, Herança e Polimorfismo, além da Delegação. Outros tópicos foram abordados, como utilização de Interfaces, Generics, Coleções, Pacotes, Componentes, RTTI, Live Bindings, um estudo aprofundado da hierarquia das classes do núcleo da VCL e FireMonkey, incluindo TObject, TPersistent, TComponent, TControl etc. A disciplina contou com a participação de profissionais de empresas da região, incluindo JB Software, Agência4, Grupo Dass, Zetta Brasil Web Sites e Sistemas de Gestão, Cresol Central SC/RS, Eletro Zagonel, Ceraçá e H2J Innovative Solutions.

Participação recebeu destaque na imprensa local

Referência no Brasil em Delphi ministra aula na Horus Faculdades
A pós-gradução em Programação e Gestão da Tecnologia da Informação da Horus Faculdades recebeu para aula no último fim de semana (13 e 14/06) o professor Guinther Pauli, considerado uma das maiores referências do Brasil em linguagem de programação Delphi. A disciplina ministrada foi Programação orientada a objeto com Delphi. Guinther Pauli possui diversas certificações e é autor do livro Delphi - Programação para Banco de dados e Web. Além de extensa publicação, o professor foi um dos responsáveis pela criação do software de gerenciamento das contribuições do programa Criança Esperança, realizado pela ONU, com apoio da rede Globo. Para o coordenador do curso de sistemas de informação, professor Eduardo Urnau, receber o professor Guinther Pauli foi uma honra pelo conhecimento e número de certificações que possui. “A presente do professor Guinther vem contribuir ainda mais com a qualidade da pós-graduação da Horus Faculdades e com a formação dos profissionais que participam dela”, destacou. O objetivo da explanação da aula, segundo o professor Guinther Pauli, foi atualizar os participantes com programação a programação orientada a objeto, em virtude da grande predominância, entre os programadores, da criação de softwares a partir de casos de uso. “Com a programação orientada a objeto, o software se torna melhor, com uma base mais sólida, podendo ter mais atualizações ou novos componentes”, explicou.
Fonte - Jornal A Sua Voz


terça-feira, 26 de agosto de 2014

Treinamento - JB Software

Ministrado um treinamento na JB Software na cidade de Pinhalzinho - SC, capital nacional da amizade. O encontro, que contou com a participação dos engenheiros da equipe de desenvolvimento e gerência da empresa, tratou da evolução e manutenção de aplicações Delphi, incluindo o emprego de técnicas de refatoração, padrões de projeto, refatoração para padrões de projeto e técnicas de desenvolvimento ágil.




Sobre a JB Software

Tendo em mente encontrar algo que facilitasse o dia-a-dia dos escritórios de contabilidade de três irmãs e da esposa, o contador por formação, Roque Bach, em 1990 começou por "hobby", em suas horas vagas, a criar um programa para computador, enfocando a área contábil, (visando proporcionar uma maior agilidade e facilidade no cotidiano dos escritórios contábeis). Até meados de 1993 o aplicativo então criado, denominado JB Software, foi usado nos escritórios da família: em Maravilha no de Elisabete Jussara e Bernadete Bach e em Pinhalzinho por Luísa Cecília Rüdiger Bach e Salete Bach. Vendo a qualidade do sistema e vislumbrando uma grande oportunidade de negócios neste ramo, foi convidado o Sr. Júlio Roberto Rüdiger, o qual em setembro de 1993 passou a integrar o grupo a fim de atuar no departamento comercial, instalação e suporte técnico da aplicação. A partir desta data a programação foi transferida para Srta Elisabete Bach (Bete), que na época continuou na administração de seu escritório em Maravilha. De "hobby" o programa JB entrou em escala industrial, competindo de igual para igual com as maiores "softhouses" do segmento contábil do país. A empresa disparou comercialmente, embalada pelo sistema inovador criado. O destaque estava em ser o primeiro software no país com integração instantânea (on line) entre os aplicações de: Contabilidade, Escrita Fiscal, Patrimônio, Impostos e Lalur. Desta forma, com um único lançamento o contador contemplava todos os módulos relacionados,evitando a manipulação e digitação repetitiva de documentos e dados. Novos mercados foram conquistados, concessionários adquiridos e a participação em eventos do segmento passou a ser constante. Com isso, chegou a necessidade crescente de profissionais tanto na área de consultoria, quanto na área de produção (hoje o maior Ativo da empresa). E assim, em outubro de 1995, o escritório contábil de Maravilha foi vendido, quando a Srta Bernadete Bach passou a fazer parte da área de software, fortificando a empresa pinhalense. Hoje, passados 23 anos, a JB tem um nome. E o seu sobrenome Pinhalzinho. Com sede própria sita na Av. Belém, 2084, conta com mais de 40 colaboradores internos, mais de 30 franquias, distribuídas no território nacional, com alocação de mais de 250 colaboradores. Atualmente possui mais de 10000 sistemas instalados, levando o nome de Pinhalzinho - Capital da Amizade - para todo Brasil. Agora a JB comemora seu sucesso nos bastidores do mundo empresarial regional, pois suas atividades não são visíveis uma vez que não se vêem chaminés, barracões industriais, movimentação de materiais, caminhões ou operários, o que existe no entanto, e é uma realidade, é um sistema de qualidade, criado em Pinhalzinho. É a Inteligência colocada a serviço da classe contábil/empresarial. Todo o trabalho e esforço foi coroado quando a empresa sagrou-se Campeã do Premio Talentos Empreendedores 2008, sendo assim reconhecida como MELHOR empresa de médio porte do ramo de Tecnologia da Informação no estado de Santa Catarina.

domingo, 24 de agosto de 2014

SQL Server e .NET: Performance de acesso a Dados

Nesse video mostro como melhorar a performance de aplicações de acesso a dados com .NET e SQL Server. São apresentadas dicas simples, voltadas a desenvolvedores que não têm tanta experiência em database administration (DBA), como análise dos planos de execução, uso correto de índices, tipos de índices, boas práticas na escrita de comandos SQL, boas práticas na criação de Views, Triggers e Stored Procedures, entre outras dicas gerais de desempenho como campos LOB, Full Text Search, Fetch on Demand, cursores e tempo de execução (query cost). Dicas simples que podem fazer a diferença na performance da solução como um todo.

quarta-feira, 30 de julho de 2014

Consumindo objetos Win32 a partir de aplicações .NET

Nesse video mostro como consumir objetos Win32 a partir de aplicações .NET. Mostra como criar uma classe utilizando uma plataforma e linguagem para Win32 seguindo o padrão COM (Component Object Model), a seguir, mostra como consumir esta classe (chamada co-class) importando sua biblioteca de tipos, o que chamamos de type library. Uma classe proxy é então gerada para facilitar o consumo dos métodos do objeto a ser acessado, facilitando a interoperabilidade entre as diferentes plataformas. Usando essa abordagem, não é necessário redeclarar cada um dos métodos da interface da type library, podendo ainda o vínculo ser feito estaticamente com apoio do Intellisense do Visual Studio.

quarta-feira, 23 de julho de 2014

Padrão de Projeto State na prática com .NET / C#

Nesse video mostro como trabalhar como criar um pequeno sistema de processamento de folha de pagamento de funcionários de uma empresa - setor de RH. Mostra como criar um framework que define colaboradores e suas classes descendentes, através de herança e abstração. Um método polimórfico então permite calcular o salário de cada colaborador de acordo com sua função (Estagiário, Funcionário, Gerente etc.). O problema ocorre quando um colaborador muda de cargo, ou seja, passa da situação de estagiário para funcionário. O estado deste objeto, como as informações sobre nome, CPF e data admissão permanecem os mesmos, porém a regra de cálculo, que é o método polimórfico, precisa mudar. Como separar neste caso estado e comportamento? A solução é aplicar o padrão de projeto State para prover a delegação polimórfica externa deste cálculo.

terça-feira, 22 de julho de 2014

Unit Tests - Testes Unitários com .NET

Nessa video mostro como trabalhar com testes unitários na plataforma .NET através da integração presente no IDE do Visual Studio. Testes automatizados provam que funcionalidades estão corretamente implementadas. Testes mantêm seu valor com o passar do tempo. Permitem que outras pessoas verifiquem se o software ainda está funcionando após mudanças. Melhora a confiança e a qualidade da aplicação. A filosofia é deixar que os desenvolvedores escrevam os testes e tornar fácil o desenvolvimento de testes. Inicie com “o mais simples que possa funcionar”, faça primeiro o teste e depois escreva o código para passar neste teste. Refine o projeto através do uso de padrões e aplicação de refatorações constantes. Tentar quebrar o ciclo: mais pressão, menos testes, gastando menos tempo com atividades de depuração.

sexta-feira, 18 de julho de 2014

Serializando Objetos em XML com C#

Nesse video mostro como serializar objetos escritos em C# para arquivos XML, usando a classe XmlSerializer do namespace System.Xml.Serialization. Mostra como criar uma classe Cliente definindo seus respectivos atributos, bem como uma relação de Contatos (1 para muitos), representado por uma coleção genérica. A classe XmlSerializer através do método Serialize e um objeto StreamWriter pode então persistir seu estado em disco, mantendo a hierarquia de relação entre cliente e contatos. O processo inverso também é mostrado, como desserializar objetos usando o método Deserialize usando um objeto FileStream.

quarta-feira, 16 de julho de 2014

POO e Desenvolvimento Ágil no Delphi XE6 - Artigo Revista ClubeDelphi 158

Neste artigo publicado na Revista ClubeDelphi edição 158 mostro alguns recursos de programação orientada a objetos com Delphi, como herança, abstração e polimorfismo, aplicados em um exemplo prático. Através do uso de boas práticas, veremos como estes fundamentos podem tornar um software mais fácil de ser mantido e evoluído, usando ainda algumas técnicas de desenvolvimento ágil associada a design patterns, como a refatoração rumo a padrões de projeto. Veremos como resolver problemas comuns encontrados em código fonte (bad smells, ou “maus cheiros”), usando uma abordagem de desenvolvimento corretiva e evolutiva. Uma introdução ao desenvolvimento ágil evolutivo é apresentada, como forma de unir estas técnicas de orientação a objeto com as técnicas atuais de engenharia de software, demonstradas em um exemplo prático com Delphi XE6.

quinta-feira, 10 de julho de 2014

ADO .NET: Performance no Acesso a Dados

Nesse video mostro como melhorar a performance de acesso a dados em aplicações com Visual Studio e C#. As técnicas apresentadas incluem o uso de cache, cursores undirecionais, stored procedures, relacionamentos, datasets, visualizações de dados, parâmetros e filtros em memória, a fim de otimizar o desempenho de aplicações Web, que possuem um nível crítico de performance. O video mostra como detectar estes gargalos de performance e aplicar as soluções ideais para resolver estes problemas, otimizando o resultado da solução como um todo, usando recursos nativos da plataforma .NET.

quarta-feira, 9 de julho de 2014

Bad Smells (Code Smells)

Nesse video mostro o que são os bad smells (“mau cheiros”) no código, que dificultam a sua manutenção. O video apresenta um catálogo dos principais bad smells presentes no código, que são estruturas que precisam ser refatoradas, ou seja, ter sua arquitetura melhorada sem alterar o comportamento externo observável, a fim de tornar o sistema de software mais fácil de manter, evoluir e incluir novas funcionalidades, livre de bugs. Entre os principais bad smells podem citar: código duplicado, legibilidade, complexidade e sentenças condicionais. O video apresenta também a solução (refatoração) para cada um destes problemas.

quarta-feira, 2 de julho de 2014

Packet Records em ambiente Multicamadas / DataSnap

Nesta videoaula mostro como utilizar o recurso de PacketRecords em ambiente multicamadas com o novo DataSnap. Apresenta como funciona a obtenção de pacotes sob demanda e como o life cycle do DSServer influencia no uso deste recurso. Mostra como usar o uso de pacotes com fetch automático e usando o método GetNextPacket do ClientDataSet. PacketRecords permitem otimizar o tráfego de registros entre servidor de aplicação e cliente, mas deve ser usado com cuidado, pois ele prende o cursor de dados no servidor de banco de dados (SGBD), apesar de IAppServer oferece mecanismos stateless para recuperar o estado do cursor sem prendê-lo.

terça-feira, 1 de julho de 2014

Criando o Banco de Dados - CRUD com FireDAC, Firebird e DataSnap

Nesta videoaula mostro como construir uma aplicação de cadastro de produtos e relacionamento, com a implementação das operações CRUD (Create / Insert, Read / Retrieve, Update e Delete) usando os componentes de acesso do novo FireDAC do Delphi XE5 / XE6. Mostra a criação do banco de dados com as tabelas e views no Firebird, bem como as constraints. Mostra a configuração da conexão no Data Explorer do IDE do Delphi e também do Connection Definition no Firedac Explorer. Dessa forma, deixaremos a arquitetura independente do DBExpress, que após a introdução do Firedac, deixou de ser o principal engine de acesso a dados do Delphi.

terça-feira, 24 de junho de 2014

Versionando Assemblies no GAC e evitando o DLL Hell em .NET

Neste video mostro como trabalhar de forma correta com o versionamento e assinatura de assemblies (strong names e keys) na plataforma .NET com Visual Studio e C#. O recurso permite definir uma versão (ex. 1.0.0.0) para um determinando assembly (ex. DLL ou EXE) e a seguir fazer com que outros assemblies utilizem a versão “assinada” pelo manifesto de assembly, evitando o problema de uma diferente versão de uma mesma DLL quebrar funcionalidades de outros aplicativos que a usam, problema conhecido como DLL Hell. Mostra como a plataforma .NET resolve isto através do uso do GAC - Global Assembly Cache.

domingo, 22 de junho de 2014

Criando Class Helpers em .NET

Publicado no portal DevMedia um video onde mosto como criar Class Helpers em C#, que permitem reduzir a duplicação de código, através da definição de classes e funções que encapsulam a complexidade de tarefas cotidianas, como enviar e-mails, executar comandos no banco de dados, abrir arquivos, o que normalmente tende a replicar código, pois várias classes precisam realizar tarefas únicas para se obter um comportamento final. A técnica de criação de Helpers é muitas vezes associada a aplicação do padrão de projeto - design pattern - conhecido como Facade, que encapsula a complexidade de um framework tornando o mais simples de utilizar. Clique aqui para visualizar.

Relacionamentos N para N com Entity Framework

Publicado um video no portal DevMedia onde mostro como trabalhar com relacionamentos N para N no Entity Framework 6.1 no Visual Studio em projetos C#. O recurso permitirá associar duas entidades de acordo com uma multiplicidade muito para muitos (* *), de forma que uma ocorrência em uma entidade condiciona a existência de vários objetos relacionados em outra, que também possui N correspondências na entidade de origem. Por exemplo, um pedido que possui N produtos e produtos que estão presente em N pedidos. O video mostra como definir este tipo de relação na modelagem de modelos do EF e como isto é transformado em tabelas de um sistema relacional no SQL Server. Clique aqui para acessar.

quinta-feira, 12 de junho de 2014

Associação e Tipos Complexos no Entity Framework

Publicado no Portal DevMedia um video onde mostro como trabalhar com associações no Entity Framework 6.1 no Visual Studio em projetos C#. O recurso permitirá associar duas entidades de acordo com uma data multiplicidade, por exemplo, 1 para N (*), criando-se uma relação master-detail. O video mostra como o EF é capaz de gerenciar toda a complexidade para inserir dados relacionados no banco de dados, manipulando chaves primárias, foreign keys e mantendo a integridade da relação, tudo em um nível abstraído de orientação a objetos, ocultando detalhes inerentes ao SQL Server. Já os tipos complexos permitem criar subtipos formados a partir de tipos primitivos que são agregados a uma entidade no  Entity Framework, reaproveitando código. Clique aqui para acessar o video (somente para assinantes).

quarta-feira, 11 de junho de 2014

Herança no Entity Framework: do modelo Orientado a Objetos ao Sistema de Banco de Dados Relacional

Publicado um video no Portal DevMedia onde mostro como trabalhar com o recurso de herança entre entidade do Entity Framework 6.1 no Visual Studio em projetos C#. Isso permite o maior reaproveitamento de código, visto que atributos comuns podem ser herdados de classes superiores. Porém, mostramos também que o uso de herança no Entity Framework, assim como na OO, pode criar complexidade extra, principalmente porque no Entity Framework, dependendo da estratégia de geração de código, cada herança será mapeada para uma relação de foreign key (1 para 1) no SQL Server ou banco utilizado, exigindo o uso de joins. Lembrando que herança é um recurso da orientação a objetos e não existe equivalência direta em bancos de dados relacionais tradicionais. O video mostra como fazer esta relação de herança, ressaltando os benefícios, cuidados e vantagens. Clique aqui para visualizar (acesso somente para assinantes).

quinta-feira, 5 de junho de 2014

Definindo Arquitetura de Soluções em Camadas em C#

Publicado um video no Portal DevMedia onde mostro como definir a arquitetura de soluções em camadas de projetos C# com Visual Studio, usando as ferramentas de Layer Diagram e Architecture. Em cima de um cenário, que demonstra a complexidade de se distribuir diferentes tipos de aplicações clientes na internet usando diferentes tecnologias e plataformas, o video mostra como um arquiteto de software pode definir uma solução ótima para um determinado problema, identificando corretamente as camadas e como elas se relacionam e trocam informações, como o servidor de aplicação, banco de dados, aplicações clientes, web, e protocolos.

quarta-feira, 4 de junho de 2014

Collections em C# - ArrayList, HashTable, List, Dictionary, Stack e Queue

As coleções em .NET desempenham um papel fundamental no tratamento de conjuntos de objetos em memória, dispensando o uso de arrays primitivos, propiciando alocação dinâmica de memória e vários métodos para manipulação de dados. As principais coleções da plataforma .NET estão concentradas nos namespaces System.Collections e System.Collections.Generics. Coleções do tipo ArrayList são simples e não tipadas (no sentido de não serem genéricas), têm crescimento dinâmico, implementam a interface IEnumerable, armazenam objetos (Object), possuem métodos para adição, remoção etc. Porém, não consegue tipar objetos ao armazenar, logo é necessário type casting para remover (operador AS), ou se usa reflexão. São estruturas mais fáceis de trabalhar do que comparadas a vetores tradicionais com sintaxe primitiva e controle manual de alocação e dimensões, a alocação é gerenciada pela CLR do .NET Framework. Já List é genérica, é uma coleção tipada com uso de Generics, tem crescimento dinâmico, implementa a interface IEnumerable, armazenam qualquer tipo de objeto, porém com informação estática de tipo, possuem métodos para adição, remoção etc, além de métodos adicionais através de extensões LINQ e lambda expressions, porém com informações de tipo. Permitem o uso de delegates genéricos e expressões lambda para operações comuns, escritas normalmente em uma linha, como buscar objetos que satisfação determinada condição. Possuem melhor performance do que arraylists. HashTables funcionam como “tabelas” simples não tipadas em memória em aplicações C#, têm crescimento e alocação de memória dinâmica, são baseadas no conceito de par de chave / valor (key pair value), armazenam objetos (Object) tanto para Key quanto Value. Não consegue tipar objetos ao armazenar, logo é necessário type casting para remover, ou reflection. São estruturas rápidas para recuperar valores, já que os valores (value) são buscados na tabela hash diretamente pelo valor da sua chave (key). Dictionary, ou dicionários, funcionam como “Tabelas” simples, porém tipadas em memória em aplicações C# através do uso generics, têm crescimento e alocação de memória dinâmica, são baseadas no conceito de par de chave / valor (key pair value), armazenam objetos tipados tanto para Key quanto Value. São estruturas rápidas para recuperar valores, já que os valores (value) são buscados na tabela hash diretamente pelo valor da sua chave (key). Basicamente é uma combinação de List com HashTable. Pilhas (stacks) em C# são um tipo especial de coleção (collection) na plataforma .NET. Stacks são coleções que permitem “empilhar” objetos. Possuem a versão clássica chamada Stack, que trabalha com objects, a versão Stack (genérica). Segue o modelo LIFO – Last In First Out, ou seja, o último elemento e entrar é o primeiro a sair. Possui os métodos Push – Adicionar elemento; Pop – Lê e retira elemento; Peek– Lê mas não retira elemento. Também possuem alocação dinâmica de memória e podem armazenar diferentes tipos de objetos, porém necessita de type cast ao remover o objeto. Queues (filas) em C# possuem a versão clássica chamada Queue, que trabalha com objects, a versão Queue (genérica). Segue o modelo FIFO – First In First Out, ou seja, o primeiro elemento e entrar é o primeiro a sair. Possui os métodos Queue – Adicionar elemento; Dequeue – Lê e retira elemento; Peek– Lê mas não retira elemento. Também possuem alocação dinâmica de memória e podem armazenar diferentes tipos de objetos, porém necessita de type cast ao remover o objeto. A versão genérica já permite tipar o objeto.  Foram publicadas videoaulas no portal DevMedia que mostram como usar estas coleções na prática, clicando nos links (somente para assinantes): ArrayList List HashTable Dictionary Stack Queue

Exemplos de uso:

ArrayList

var turma = new ArrayList();
turma.Add("Guinther");
turma.Add("Rudolfo");
turma.Add(new DataSet()); // é possível colocar qualquer objeto
foreach (var item in turma)
  Console.WriteLine(item);
// a capacidade é alocada por páginas
Console.WriteLine("Capacidade: " + turma.Capacity); 
// count é o número real de elementos
Console.WriteLine("Count: " + turma.Count);
List
public class Cliente: Object
{
  public int Codigo;
  public string Nome;
  public string CPF;
  public override string ToString()
  {
    return Codigo.ToString() + " - " + Nome;
  }
}
class Program
{
  static void Main(string[] args)
  {
    // cria três clientes
    var c1 = new Cliente() { Codigo = 123, Nome = "Guinther", CPF = "123" };
    var c2 = new Cliente() { Codigo = 234, Nome = "Rudolfo", CPF = "456" };
    var c3 = new Cliente() { Codigo = 456, Nome = "Fabio", CPF = "789" };
    // adiciona com collection intializer
    var lista = new List<Cliente>() { c1, c2, c2 };
    // também poderia adicionar um por um
    //lista.Add(c1);
    //lista.Add(c2);
    //lista.Add(c3);
    // mostra o CPF do primeiro cliente
    Console.WriteLine(lista[0].CPF);
    // varre coleção, mostra item, ToString com override mostrará todos os dados
    foreach (var item in lista)
      Console.WriteLine(item);
    // expressão lambda para obter cliente com determinado CPF
    var cli = lista.FirstOrDefault(c => c.CPF == "456");
    Console.WriteLine(cli.Nome);
  }
}

HashTable

public class Aluno
{
  public int Matricula;
  public string Nome;
  public override string ToString()
  {
    return Matricula.ToString() + ":" + Nome; 
  }
}
class Program
{
  static void Main(string[] args)
  {
    var alunos = new Hashtable();
    var a1 = new Aluno() { Matricula = 123, Nome = "Guinther" };
    var a2 = new Aluno() { Matricula = 456, Nome = "Rudolfo" };
    alunos.Add(123, a1);
    alunos.Add(456, a2);
    // mostra aluno com key = 123, necessário type cast
    Console.WriteLine((alunos[123] as Aluno).Nome);
    // método para verificar se lista contém objeto com chave
    if (lista.ContainsKey(123))
      Console.WriteLine(lista[123]);
    // varredura pelas chaves
    foreach (var obj in lista.Keys)
      Console.WriteLine(obj);
    // varredura pelos values
    foreach (var obj in alunos.Values)
      Console.WriteLine(obj);
  }
}

Dictionary

public class Pedido
{
  public int CodPedido;
  public string Cliente;
  public double Valor;
}
class Program
{
  static void Main(string[] args)
  {
    var pedidos = new Dictionary<int, Pedido>();
    var p1 = new Pedido() { CodPedido = 1, Cliente = "Guinther", Valor = 1234.56 };
      var p2 = new Pedido() { CodPedido = 2, Cliente = "Rudolfo", Valor = 3456.23 };
      var p3 = new Pedido() { CodPedido = 3, Cliente = "Fabio", Valor = 6789.01 };
    pedidos.Add(1, p1);
    pedidos.Add(2, p2);
    pedidos.Add(3, p3);
    Console.WriteLine("Nomes dos clientes que fizeram pedidos:");
    foreach (Pedido p in pedidos.Values)
      Console.WriteLine(p.Cliente);
    Console.WriteLine("Pedidos:");
    foreach (KeyValuePair<int, Pedido> kvp in pedidos)
      Console.WriteLine(kvp.Key + " = " + kvp.Value.Cliente);
    Console.WriteLine("Soma dos pedidos:");
    var valor = pedidos.Sum(p => p.Value.Valor);
    Console.WriteLine(valor.ToString());
  }
}

Stack

public class Documento
{
  public int Codigo;
  public string Tipo;
  public string Nome;
}
class Program
{
  static void Main(string[] args)
  {
    // LIFO - Last in First Out
    var d1 = new Documento() { Codigo = 1, Nome = "Planilha", Tipo = "xls" };
    var d2 = new Documento() { Codigo = 2, Nome = "Artigo", Tipo = "doc" };
    var d3 = new Documento() { Codigo = 3, Nome = "Apresentacao", Tipo = "ppt" };
    var pilha = new Stack<Documento>();
    pilha.Push(d1);
    pilha.Push(d2);
    pilha.Push(d3);
    var obj = pilha.Pop();
    while (pilha.Count > 0)
      Console.WriteLine(pilha.Pop().Nome);
    Console.WriteLine(pilha.Count);
    // Pop obtém o objeto e retira da pilha
    var obj1 = pilha.Pop();
    Console.WriteLine(obj1.Nome);
    var obj2 = pilha.Pop();
    Console.WriteLine(obj2.Nome);
    Console.WriteLine(pilha.Count);
   // Peek obtém o objeto e mantém da pilha
    var obj3 = pilha.Peek();
    Console.WriteLine(obj3.Nome);
    Console.WriteLine(pilha.Count);
  }
}

Queue

public class Correntista
{
  public string Agencia;
  public string Conta;
  public string Nome;
  public override string ToString()
  {
    return "Agência: " + Agencia + " - Conta: " + Conta + " - " + Nome;
  }
}
// Programa que simula uma fila de correntistas aguardando chamada
class Program
{
  static void Main(string[] args)
  {
    var p1 = new Correntista() { Agencia = "123", Conta = "456", Nome = "Guinther" };
    var p2 = new Correntista() { Agencia = "456", Conta = "123", Nome = "Rudolfo" };
    var p3 = new Correntista() { Agencia = "789", Conta = "000", Nome = "Fabio" };
    var fila = new Queue<Correntista>();
    fila.Enqueue(p1);
    fila.Enqueue(p2);
    fila.Enqueue(p3);
    //fila.Enqueue(10); // não pode porque agora é tipada
    Console.WriteLine("Correntistas aguardando na fila:");
    foreach (var c in fila)
      Console.WriteLine(c);
    Console.WriteLine("Primeiro da fila: " + fila.Peek().Nome);
    while (fila.Count > 0)
    {
      Console.WriteLine("Pressione uma tecla para chamar correntista");
      Console.ReadKey();
      Console.WriteLine("Chamando: " + fila.Dequeue());
    }
    Console.WriteLine("Fila vazia");
  }
}

terça-feira, 3 de junho de 2014

Before Update Record e o processo de Resolving em DataSnap

Veja nessa videoaula publicada no portal DevMedia como utilizar o evento BeforeUpdateRecord do DataSetProvider para receber atualizações enviadas em data packets pela aplicação cliente, de forma a serem manipulados no app server antes que essas modificações sejam realmente efetivadas no banco de dados (processo conhecido como Resolving). Esse evento é ideal para alterar informações de um registro antes que as mesmas sejam aplicadas no SGBD, por exemplo, para fornecer valores default para campos, ou mesmo aplicar regras de negócio e validações centralizadas no server, sem replicação nas aplicações clientes, que não precisam ser alteradas / recompiladas / redistribuídas caso a regra mude.
Abaixo um exemplo da arquitetura de funcionamento do processo de Providing, Resolving e Reconcile do DataSnap.





















Abaixo um exemplo de código com os parâmetros passados para o evento e alteração feita em um registro:

procedure TSM.dspBeforeUpdateRecord(
  Sender: TObject;
  SourceDS: TDataSet; // dataset apontado pelo DSP
  DeltaDS: TCustomClientDataSet; // registro modificado
  UpdateKind: TUpdateKind; // tipo de atualização
  var Applied: Boolean // true se você atualizou manualmente
);
begin
  // se for inserção
  if (UpdateKind = ukInsert) then 
  begin
    DeltaDS.Edit();
    DeltaDS.Fields[1].AsString := 'Valor Default';
    DeltaDS.Post();
  end;
end;

Mestre-detalhe em ambiente Multicamadas com DataSnap

A natureza state-less das aplicações Web ou Multicamadas faz com que se precise ter cuidado ao desenvolver aplicações com cadastros no estilo mestre-detalhe (master-detail), principalmente devido a necessidade do tratamento de transações e manutenção da integridade referencial, podendo dados de vários datasets relacionados precisarem ser colocados em cache simultaneamente. Trabalhar com vários resultsets desconectados do database e aplicar atualizações em uma única transação é vital para ambientes distribuídos que precisam obter o máximo de performance, compartilhar conexões (pool) e otimizar o consumo de recursos do SGBD. E o relacionamento master-detail é peça crítica nesse sentido. Em um relacionamento desse tipo, uma tabela detalhe estará relacionada pela chave-estrangeira com uma chave-primária da tabela master, usando o recurso de Master Source ou Data Source de um DataSet, recurso que existe no DB framework do Delphi desde a época do BDE com Paradox. No caso do TClientDataSet, pode-se utilizar um único DataPacket para guardar informações de ambos os conjuntos de dados, gerenciados em uma única transação, otimizando o uso de recursos e a comunicação na rede. Este recurso é ideal para manter o controle automático sobre os relacionamentos e filtros em aplicações DataSnap com ClientDataSets, sem a necessidade de código adicional. Outro é o uso do recurso de DataSetFields do ClientDataSet em relacionamentos Master Detail em ambientes multicamadas, usando campos TFields no DataSet que representa um conjunto inteiro de dados, que neste caso, é a tabela detalhe, fazendo parte do próprio DataSet principal (Master). Pode-se utilizar alguns recursos para modificar dados do detalhe como se fosse parte do Dataset principal. As atualizações de ambos as tabelas são então aplicadas em uma única transação gerenciada automaticamente por IAppServer, em um único DataPacket, otimizando também o tráfego de dados. Confira a solução nestes dois vídeos publicados no Portal DevMedia (somente assinantes).
DataSetField em ambiente Multicamadas
Master Detail em DataSnap

segunda-feira, 2 de junho de 2014

CONVITI - I Congresso Virtual de Tecnologia de Informação

De 23 a 29 de junho será realizado o I Congresso Virtual de Tecnologia de Informação (CONVITI), sendo que nesta primeira edição ministrarei uma palestra sobre "Desenvolvimento de Soluções Multicamadas com Delphi XE6, FireDac e DataSnap". O evento é on-line e gratuito. Clique aqui para realizar a inscrição.



quarta-feira, 28 de maio de 2014

Refatoração para Padrões de Projeto - Palestra ministrada no X Simpósio Brasileiro de Sistemas de Informação

O Simpósio Brasileiro de Sistemas de Informação é um evento para a apresentação de trabalhos científicos e discussão de temas relevantes na área de Sistemas de Informação, aproximando estudantes, pesquisadores, profissionais e empresários da comunidade de Sistemas de Informação. Os sistemas de informação são estratégicos para as organizações contemporâneas, pois automatizam os processos de negócios, construindo vantagem competitiva por possibilitar: análise de cenários, apoio ao processo de decisão, definição e implementação de novas estratégias organizacionais. Contudo, a incorporação da Tecnologia de Informação nas organizações provoca o surgimento de novos problemas que demandam pesquisas voltadas aos aspectos conceituais e práticos. As pesquisas em Sistemas de Informação combinam aspectos multidisciplinares das áreas da Ciência da Computação, Matemática, Ciência da Informação, Administração, Comportamento Organizacional, entre outras. A aplicação dos diversos domínios de conhecimento na busca por soluções aos problemas envolvendo os Sistemas de Informação é o que motiva a realização deste evento. Na edição deste ano, apresentei uma pesquisa sobre como buscar oportunidades de refatoração para aplicação de padrões de projeto, mais especificamente, para o padrão de projeto Strategy. Manter e adaptar código mal escrito apresentando problemas em sua estrutura é uma tarefa difícil. As técnicas de refatoração são usadas para melhor o código e a estrutura de aplicações, tornando-as melhores e mais fáceis de serem modificadas. Padrões de Projeto - Design Patterns - são soluções reutilizáveis usadas para resolver problemas comuns em sistemas orientados a objetos, então não é necessário recriar estas soluções. A aplicação de padrões de projeto dentro do contexto de refatorações usando uma abordagem corretiva se torna uma atividade interessante no ciclo de vida de um sistema de software. Contudo, para projetos de larga-escala, examinar manualmente os artefatos de software para encontrar problemas e oportunidades para aplicar um dado padrão de projeto é uma tarefa árdua e difícil. Nesse contexto, apresento uma função baseada em métricas que permite detectar onde um padrão de projeto pode ser aplicado em um determinado código-fonte, mais especificamente, o padrão de projeto Strategy, que usa em seu núcleo dois dos principais fundamentos da orientação a objetos: abstração e polimorfismo (além de delegação). Para avaliar a função desenvolvi uma ferramenta que avalia código-fonte e exibe possíveis oportunidades para aplicar uma refatoração rumo ao padrão Strategy. Essa ferramenta foi desenvolvida através do uso de ASTs (Abstract Syntax Trees), procurando por oportunidades de refatoração, indicando o local exato no código fonte onde o padrão é sugerido, mostrando ainda algumas evidências usadas para a detecção. A edição deste ano do simpósio foi organizada pelo Departamento de Computação da Universidade Estadual de Londrina - PR, com o apoio do CNPQ, CAPES e da Sociedade Brasileira de Computação (SBC), com patrocínio da SERPRO - Serviço Federal de Processamento de Dados.


















terça-feira, 27 de maio de 2014

Criando aplicações móveis para iOS e Android usando AppMethod e REST

Planejamento de férias? Gostaria de saber como vai estar o tempo no local escolhido para o seu descanso? Este artigo mostra como construir um aplicativo móvel utilizando os componentes da biblioteca REST Client para selecionar uma Data, Localização e visualizar a previsão do tempo para os próximos 7 dias de acordo com estas informações. Você pode começar a construir a aplicação mobile usando o menu File - New - Mobile Application no AppMethod para abrir os modelos de projetos de aplicativos móveis e escolhendo o template "Tabbed Application" (clique nas figuras do artigo para ver versões maiores de todas os imagens ). Uma vez que este aplicativo só precisa de 3 guias, você pode excluir uma delas.




















A interface principal de usuário (UI) contém um TTabControl para conter três guias para informações de temperatura, um navegador (browser) e opções de configuração. O aplicativo usa um TGeocoder para obter a latitude e longitude de um determinado endereço. O aplicativo usa um TWebBrowser para usar um mapa do Google Maps para mostrar o local das férias. Um componente TCalendarEdit é usado para selecionar a data de férias usando o controle e específico para iOS. Finalmente, o aplicativo usa os componentes da biblioteca REST Client Library API para acessar o serviço de API JSON do WeatherBug para exibir a previsão de tempo para os próximos 7 dias. Aqui estão os três TabItems do aplicativo móvel:


























A primeira coisa que o código faz, usando evento OnCreate do formulário, é inicializar algumas variáveis, configurar o Geocoder e carregar a chave API do WeatherBug de um arquivo INI. Foi usado o menu Project - Deployment para adicionar o arquivo "weather.ini" na pasta "StartUp\Documents" no caso do iOS e em ".\assets\internal" no caso do aplicativo estar rodando no Android. Aqui está o arquivo INI (sem a minha chave de API, você pode obter sua própria chave, seguindo os passos em http://developer.weatherbug.com/page):
weatherbug.ini:
[WeatherBug]
APIKey=xxxxx
Aqui está o código Object Pascal para manipulador de eventos OnCreate do formulário:

procedure TForm5.FormCreate(Sender: TObject);
var
   Ini: TIniFile;
begin
  // set up for Geocode
  FGeocoder := TGeocoder.Current.Create;
  FGeocoder.OnGeocode := OnGeocodeEvent;
  VacationTabControl.ActiveTab := WeatherTabItem;
  FoundLatitude := 0.0;
  FoundLongitude := 0.0;
  FoundAddrLatLong := false;
  RefreshButton.Visible := false;
  // read WeatherBug API Key from INI file
  {$IF DEFINED(IOS) or DEFINED(ANDROID) or DEFINED(MACOS)}
  Ini := TIniFile.Create(TPath.GetDocumentsPath + PathDelim + 'weather.ini');
  {$ELSE}
  Ini := TIniFile.Create('c:\temp\weather.ini');
  {$ENDIF}
  APIKeyString := Ini.ReadString('WeatherBug','APIKey','');
end;
A figura a seguir mostra a entrada do arquivo "weather.ini" no menu Project - Deployment, indicando que está sendo feito o deploy para as pastas corretas no iOS e Android de acordo com a plataforma escolhida para deployment:












Na TabItem de configurações, você pode selecionar a sua data e endereço de férias. Quando o endereço for alterado, o evento OnChange dispara, armazena o endereço na classe TCivicAddress e chama o Geocode para obter as novas coordenadas de Latitude e Longitude. TGeocoder também tem um método GeocodeReverse e um evento OnGeocodeReverse que recebe coordenadas de latitude / longitude e retorna informações em um tipo TCivicAddress. Você pode encontrar mais informações sobre Geocoding e ReverseGeocoding no DocWiki do Appmethod. Há também um tutorial em Object Pascal que trata do tema: Usando Localização e Sensores (iOS e Android). Aqui está o código Object Pascal para o evento AddressEditChange:
procedure TForm5.AddressEditChange(Sender: TObject);
begin
  // Address changed - get Latitude/Longitude via GeoCoding
  RefreshButton.Visible := false;
  // use address to find Latitude and Longitude
  lAddress := TCivicAddress.Create;
  try
    lAddress.Address := AddressEdit.Text;
    FGeocoder.Geocode(lAddress);
  finally
    lAddress.Free;
  end;
Geocode é chamado com o CivicAddress e, quando o geoconding for concluído, o evento OnGeocodeEvent é disparado. O parâmetro para o manipulador OnGeocodeEvent contém as coordenadas de latitude e longitude. Se o endereço for encontrado e retorna as coordenadas, então são exibidos na página de configurações e também chama o método Navigate do TWebBrowser para carregar um mapa do Google no navegador.
Aqui está o código Object Pascal para a OnGeocodeEvent:
procedure TForm5.OnGeocodeEvent(const Coords: TArray);
begin
  if Length(Coords) > 0 then begin
    FoundLatitude := Coords[0].Latitude;
    FoundLongitude := Coords[0].Longitude;
    FoundAddrLatLong := true;
    LatLongLabel.Text :=
      Format('%3.5f/%3.5f',[Coords[0].Latitude, Coords[0].Longitude]);
    {$IF DEFINED(IOS) or DEFINED(ANDROID)}
    FormatSettings.DecimalSeparator := '.';
    WebBrowser1.Navigate(Format(LGoogleMapsURL, [FoundLatitude.ToString, FoundLongitude.ToString]));
    {$ENDIF}
    RefreshButton.Visible := true;
  end
  else begin
    FoundAddrLatLong := false;
    LatLongLabel.Text := 'Address not Found!'
  end;
end;
Para terminar a codificação, o aplicativo tem um componente TActionList com uma ação chamada MyAction. A ação é executada quando o RefreshButton é clicado. O RESTRequest é executado para chamar a API do WeatherBug para obter o resultado JSON. O RESTRequestDataSetAdapter converte o JSON retornado e preenche o FDMemTable (componente do FireDac para armazenar dados em cache de memória, estilo ClientDataSet) com os 7 dias de previsão do tempo. O código preenche o WeatherListBox por iteração das linhas FDMemTable. Aqui estão as figuras dos componentes REST clients e suas propriedades no Object Inspector. As propriedades circuladas em vermelho são as mais utilizadas para processar as chamadas de API e retornar os resultados para o FDMemTable.


















Cada item de caixa de listagem contém as altas e baixas temperaturas e a descrição do tempo para cada dia.
Aqui está o código Object Pascal para MyAction:
procedure TForm5.MyActionExecute(Sender: TObject);
var
  MyListBoxItem : TListBoxItem;
begin
  // days to vacation
  CountdownLabel.Text :=
    'Days to Vacation: '
    + IntToStr(DaysBetween(
        Now(),
        CalendarEdit1.Date)
      )
  ;
 
  if FoundAddrLatLong then begin
 
    // uses WeatherBug REST API
    // http://developer.weatherbug.com/docs/read/WeatherBug_Rest_XML_API
    // update RESTRequest Resource property
    // with latitude, longitude and API key
    RESTRequest1.Resource :=
      'REST/Direct/GetForecast.ashx?'
      + 'la='+FoundLatitude.ToString
      + '&'
      + 'lo='+FoundLongitude.ToString
      + '&ht=t&ht=i&ht=d&'
      + 'api_key='+APIKeyString
    ;
 
    // get weather temperatures
    RestRequest1.Execute;
 
    // Populate listbox with temperatures for next 7 days
    WeatherListBox.Items.Clear;
    WeatherListBox.BeginUpdate;
    FDMemTable1.First;
    while not FDMemTable.Eof do begin
      // TODO: get day and night icons for condition codes
      //   For now just display strings
 
      MyListBoxItem := TListBoxItem.Create(WeatherListBox);
      MyListBoxItem.Text :=
        copy(FDMemTable1.FieldByName('dayTitle').AsString,1,3)
        + ' Hi: '
        + FDMemTable1.FieldByName('high').AsString
        + ' Lo: '
        + FDMemTable1.FieldByName('low').AsString
        + ' '
        + FDMemTable1.FieldByName('dayDesc').AsString
      ;
      MyListBoxItem.TextAlign := TTextAlign.taCenter;
      WeatherListBox.AddObject(MyListBoxItem);
      FDMemTable1.Next
    end;
    WeatherListBox.EndUpdate
  end
end;
Este é todo o código necessário para escrever e rodar a aplicação.
Para completar, aqui está a declaração do formulário mostrando os componentes utilizados e as variáveis ​​declaradas privadas e o evento OnGeoCodeEvent usados ​​em todo o aplicativo:
TForm5 = class(TForm)
  ToolBar1: TToolBar;
  CountdownLabel: TLabel;
  Layout1: TLayout;
  WeatherListBox: TListBox;
  RefreshButton: TSpeedButton;
  ActionList1: TActionList;
  MyAction: TAction;
  RESTClient1: TRESTClient;
  RESTRequest1: TRESTRequest;
  RESTResponse1: TRESTResponse;
  BindingsList1: TBindingsList;
  RESTResponseDataSetAdapter1: TRESTResponseDataSetAdapter;
  BindSourceDB1: TBindSourceDB;
  LinkFillControlToField1: TLinkFillControlToField;
  ClientDataSet1: TClientDataSet;
  VacationTabControl: TTabControl;
  WeatherTabItem: TTabItem;
  SettingsTabItem: TTabItem;
  ListBox1: TListBox;
  AddressListBoxItem: TListBoxItem;
  LatLongListBoxItem: TListBoxItem;
  AddressEdit: TEdit;
  WebBrowser1: TWebBrowser;
  DateListBoxItem: TListBoxItem;
  CalendarEdit1: TCalendarEdit;
  LatLongLabel: TLabel;
  BrowserTabItem: TTabItem;
  procedure RefreshButtonClick(Sender: TObject);
  procedure MyActionExecute(Sender: TObject);
  procedure AddressEditChange(Sender: TObject);
  procedure FormCreate(Sender: TObject);
private
  { Private declarations }
  FoundAddrLatLong : boolean;  // if LatLong found using Address
  FoundLatitude : double;
  FoundLongitude : double;
  lAddress : TCivicAddress;
  APIKeyString : string;
  FGeocoder: TGeocoder;
  procedure OnGeocodeEvent(const Coords: TArray<TLocationCoord2D>);
public
  { Public declarations }
end;
Aqui estão as telas da aplicação rodando a partir do IDE do AppMethod, em execução no meu iPhone 4S. O aplicativo móvel também funciona no meu Samsung Galaxy S4. As telas mostram: 1) Guia de configurações com o DatePicker, 2) Guia de configurações com o endereço e latitude / longitude retornado do Geocoder, 3) guia Navegador mostrando o mapa do Google e 4) meteorologia mostrando 7 dias de previsão do tempo via API JSON do WeatherBug.






















Clique aqui para fazer o download do código-fonte do exemplo.

Adaptado do original by David I em http://community.embarcadero.com/

segunda-feira, 26 de maio de 2014

vNext: a nova geração do ASP.NET

A próxima versão do ASP.NET (chamada ASP.NET vNext) foi redesenhada a partir do zero, focada na utilização de componentes leves, combináveis e reutilizáveis, para a construção de modernas aplicações Web baseadas em nuvem (plataforma cloud). Listo a seguir os principais recursos da nova plataforma ASP.NET vNext, que basicamente mesca muitos recursos existentes em outros frameworks já amplamente utilizados:
  • vNext inclui novas versões otimizadas para nuvem do MVC, Web API, Web Pages, SignalR e Entity Framework;
  • MVC, Web API  e Web Pages serão fundidos em um único framework, chamado MVC 6. O novo framework remove várias sobreposições existentes entre MVC e Web API. Usa um conjunto comum de abstrações para routing, actions, filters, model binding e assim por diante. Você pode usar o framework para criar tanto UI (HTML) e APIs;
  • Aplicações ASP.NET vNext podem usar um subconjunto otimizado para nuvem do .NET vNext. Este subconjunto é destinado a servidores web que requerem alta disponibilidade e performance; 
  • MVC 6 não tem nenhuma dependência com System.Web. O resultado é uma estrutura mais enxuta, com o tempo de inicialização mais rápido e menor consumo de memória;
  • vNext suporta a implantação side- by-side. Você pode fazer o deploy dos binários do seu aplicativo e todas as suas dependências, incluindo o . NET vNext sem afetar outros aplicativos no mesmo servidor;
  • vNext não depende de servidor para ser hospedado, pode ser hospedado no IIS, ou em um "self-host", ou em um processo personalizado;
  • Injeção de dependência (DI) incluído no framework .Use seu contêiner IoC preferido para registrar dependências; 
  • vNext usa o compilador Rosyln para compilar o código dinamicamente. Você será capaz de editar um arquivo de código, atualizar o navegador e ver as mudanças sem recompilar o projeto. 
  • vNext é open source e multiplataforma, poderá rodar por exemplo em Mac OSX e Linux
Para atingir esses objetivos, o ASP.NET vNext contém alterações significativas. As estruturas atuais (Web Forms 5, MVC 5, Web API 2, Web Pages 3, SignalR 2 e Entity Framework 6) continuarão incluídas no Visual Studio, e será totalmente suportado no . NET vNext. Veja abaixo o video da palestra ministrada por Scott Hanselman e Scott Hunter, arquitetos ASP.NET na Microsoft, sobre o futuro da plataforma .NET no lado servidor, durante a edição americana do Microsoft Tech Ed.

domingo, 25 de maio de 2014

Performance, Load Balancing e Fail Over no DataSnap

Dois videos publicados no Portal DevMedia mostram como trabalhar com balanceamento de carga, tolerância a falhas e fail no DataSnap XE4 /XE5 / XE6. Esta videoaula mostra como criar um servidor que possui alguns métodos invocados a partir de aplicações clientes. Mostra como o cliente se comporta quando o servidor de aplicação cai, seja por uma falha, necessidade de manutenção, ou substituição por uma nova versão. Neste caso, as aplicações clientes perdem a conexão com o servidor por um período de tempo, o que é um problema. Esta outra videoaula mostra como fazer uso de um utilitário que permitirá o gerenciamento de vários servidores de aplicação replicados rodando em portas diferentes, de forma que um servidor possa atender a um determinado cliente quando outro servidor cair ou apresentar falhas, ou ainda quando precisar sair do ar por manutenção / atualização. Nesse caso, o servidor FailOver implementado através de um utilitário servirá como um “meio de campo” entre clientes e servidores de aplicação replicados. Se um servidor cair, imediatamente outro pode passar a responder as solicitações, garantindo a disponibilidade do serviço.

sábado, 24 de maio de 2014

Novidades do DataSnap no Delphi XE6

Uma das novidades do Delphi XE6 é o suporte a hospedagem de aplicações WebBroker como módulos do servidor Apache HTTP. Com isso, agora é possível distribuir servidores DataSnap sobre o Apache HTTP server (usando HTTP or HTTPS) através da arquitetura do próprio WebBroker. Dessa forma, servidores DataSnap construídos utilizando Delphi podem usufruir de todos os benefícios oferecidos pelo servidor Apache, além daqueles suportados nativamente pelo próprio DataSnap. O servidor Apache é o mais bem sucedido servidor web livre e representa cerca de metade dos servidores ativos no mundo. É a principal tecnologia da Apache Software Foundation, responsável por mais de uma dezena de projetos envolvendo tecnologias de transmissão via web, processamento de dados e execução de aplicativos distribuídos. Uma outra novidade do DataSnap no XE6 é a capacidade de usar recursos específicos do FireDac para expor seus DataSets e utilizar em aplicações multicamadas.

sexta-feira, 23 de maio de 2014

A nova metodologia de trabalho em TI

Infográfico de um post segundo a Forbes mostra a evolução do trabalho em TI, e que brevemente atingirá outros setores. Empresas estão fazendo mais com menos. O trabalho está claramente e constantemente evoluindo, o que significa que nós estamos presenciando novas tecnologias e comportamentos fazendo parte de nossas organizações. Da hierarquia para empresas horizontais, como já sugerem algumas metodologias ágeis, o MSF por exemplo, que não prega o conceito de hierarquia na equipe, todos têm mesma responsabilidade. De horário comercial para jornadas flexíveis, entregar mais resultados do que cumprir horários. De informações controladas para informações compartilhadas, comunicação aberta e sem hierarquia. Da liderança baseada no medo da autoridade para a inspiração, este é sem dúvida o principal ponto: a TI está carente de líderes mais do que qualquer outra área. Dos servidores para a nuvem, do e-mail como principal forma de comunicação para uma forma secundária de comunicação, de subir a escada corporativa para criar a escada, de uma empresa fragmentada para uma empresa conectada, de trabalhar no escritório para trabalhar em qualquer lugar.