Ebook Windows Phone 7 grátis

Quer aprender Windows Phone 7 ? O time da framework preparou um presentão!

E falo presentão porque o livro é completo 24 capítulos em mais de 1000 paginas com código fonte, o livro esta dividido em 3 partes. A primeira parte mostra o básico ,a segunda fala sobre Silverlight e a terceira sobre XNA.

Enquanto espero com muita ansiedade a chegada dos aparelhos aqui no Brasil, vou me divertindo com esse presentão!

Segue o link e bom estudo

http://blogs.msdn.com/b/microsoft_press/archive/2010/10/28/free-ebook-programming-windows-phone-7-by-charles-petzold.aspx

Daniel Fonseca Castro

Meu primeiro projeto com Android

Recentemente inicie um projeto com Android e confesso que estou surpreso com os resultados, espera uma curva de aprendizado grande e uma instalação de ambiente complicada mais encontrei outro cenário, claro que patinei em algumas coisas básicas mais acredito que isso faz parte do aprendizado. Para quem quer se aventurar nesta praia criei uma pequena lista com os alguns links essenciais.

Claro o primeiro passo deve ser a preparação do ambiente, você pode escolhe quais versões que deseja baixar do Android SDK ou simplesmente baixar todas (se escolhe todas da mais de 1 GB), depois da SDK baixe o Eclipse e o ADT Plugin for Eclipse.

http://developer.android.com/sdk/index.html

A temida classe “R”, ela realmente da medo, basicamente ela é uma classe gerada automaticamente com classes internas com constantes do tipo inteiro, todo recurso ou qualquer coisa que você crie dentro do diretório “res” será refletido nesta classe em forma de constante identificada pelo nome do recurso, por exemplo,um XML de uma tela com os seus controles são acessados por essa classe, resumindo sem essa classe não tem aplicação. Confesso que essa foi a parte que eu não gostei do Android, mais não chega a ser um problema.

http://developer.android.com/reference/android/R.html

As Activity são simplesmente as telas da aplicação, cada Activity roda em uma Thread que é gerenciada pelo SO, entender seu funcionamento e ciclo de vida é fundamental.

http://developer.android.com/reference/android/app/Activity.html

Para iniciar uma Activity você sempre precisa configurar uma Intent.

http://developer.android.com/reference/android/content/Intent.html

Esse pacote é sensacional , eles pensaram nos programadores que se preocupam com a qualidade do seu trabalho e criaram mocks para as classes de infra, se você cria testes unitários você vai precisa!

http://developer.android.com/reference/android/test/mock/package-summary.html

Google Android do Ricardo R. Lecheta é um bom livro para iniciantes aprendi bastante com esse livro, em alguns momentos ele é um pouco repetitivo, mais mesmo assim é uma boa leitura.

http://novatec.com.br/livros/googleand/

Acredito que os links acima são úteis para um iniciante como eu na plataforma, tem material para algumas semanas, então bom estudo e até a próxima!

Daniel Fonseca Castro

Tech-ed Brasil 2010

Minha agenda no tech-ed deste ano, tem também Kinect e Windows Phone 7, serão três dias intenso!

Programação do dia 13/09/2010

13:45 – 15:00

Título: Desenvolvendo para Azure  
Palestrante (s): Otavio Pecego Coelho,
Sala: Jaçanã 2
Público: Desenvolvedores / Profissionais de TI



15:30 – 16:45

Título: Arquitetura de Soluções com o Windows
Server AppFabric, WCF e WF – Patterns de Aplicações, Serviços e
Workflows 
Palestrante (s): Waldemir Cambiucci,
Sala: Jaçanã 1
Público: Desenvolvedores / Profissionais de TI



17:15 – 18:30

Título: Tudo o que você precisa saber sobre
Scrum e Visual Studio ALM em 150 min – Parte 1 
Palestrante (s): André Dias, Giovanni Bassi begin_of_the_skype_highlighting     end_of_the_skype_highlighting,
Sala: Cantareira 5
Público: Desenvolvedores / Profissionais de TI



18:45 – 20:00

Título: Tudo o que você precisa saber sobre
Scrum e Visual Studio ALM em 150 min – Parte 2 
Palestrante (s): André Dias, Giovanni Bassi begin_of_the_skype_highlighting     end_of_the_skype_highlighting,
Sala: Cantareira 5
Público: Desenvolvedores / Profissionais de TI



 

Programação do dia 14/09/2010

09:00 – 10:15

Título: Criando Rich Internet Applications
(RIA) com ASP.NET AJAX e jQuery 
Palestrante (s): Fernando Cerqueira,
Sala: Cantareira 3
Público: Desenvolvedores / Profissionais de TI



10:45 – 12:00

Título: Tudo que você sempre quis saber sobre o
Windows Presentation Foundation (WPF) 4 
Palestrante (s): Bruno Sonnino,
Sala: Cantareira 5
Público: Desenvolvedores / Profissionais de TI



13:45 – 15:00

Título: Trace, Log, Provisionamento e
Monitoração no Azure 
Palestrante (s): Luciano Condé,
Sala: Jaçanã 2
Público: Desenvolvedores / Profissionais de TI



15:30 – 16:45

Título: Implementando Serviços RESTful usando o
Microsoft .NET Framework 
Palestrante (s): Israel Aece,
Sala: Cantareira 5
Público: Desenvolvedores / Profissionais de TI



17:15 – 18:30

Título: Plataforma Azure AppFabric – utilizando
o Service Bus e o Access Control Services 
Palestrante (s): Rafael Godinho,
Sala: Jaçanã 1
Público: Desenvolvedores / Profissionais de TI



 

Programação do dia 15/09/2010

09:00 – 10:15

Título: Usando o pattern MVVM
(Model-View-ViewModel) para desenvolvimento em WPF e Silverlight 
Palestrante (s): Bruno Sonnino,
Sala: Jardim São Paulo
Público: Desenvolvedores / Profissionais de TI



10:45 – 12:00

Título: Como e onde devo utilizar o Managed
Extensibility Framework (MEF)  
Palestrante (s): Rogério Moraes de Carvalho,

Sala: Jardim São Paulo
Público: Desenvolvedores / Profissionais de TI



13:45 – 15:00

Título: Segurança da informação: os perigos da
Internet e seus riscos legais 
Palestrante (s): Rony Vainzof,
Sala: Horto Florestal
Público: Desenvolvedores / Profissionais de TI



15:30 – 16:45

Título: Entendendo a Plataforma de Aplicações
do Windows Phone 7 
Palestrante (s): Galileu Vieira, Luciano
Condé,
Sala: Cantareira 5
Público: Desenvolvedores / Profissionais de TI



17:15 – 18:30

Título: Escalabilidade de Soluções Database
Oriented através do SQL Server Service Broker 
Palestrante (s): Marcondes Faria,
Sala: Cantareira 6
Público: Desenvolvedores / Profissionais de TI

 

Encontro você lá!

Daniel Fonseca Castro

O que testar nos Controllers?

Além do coração da sua aplicação e quando falo “coração” estou me referindo às regras de negócio, você precisa testar os Controllers da aplicação e é claro que você não espalha as suas regras de negócio pelos Controllers, eu acredito que a cobertura de testes nos Controllers pode ser menor que a cobertura das regras de negócio, no meu caso acredito que no mínimo 70% dos meus controllers deve estar protegido.

Não importa como você desenha a suas aplicação, mais o papel dos Controllers em uma aplicação ASP.NET MVC é muito claro ,as Actions dentro dos Controllers recebem uma solicitação(request), e retorna (response) alguma coisa, eu liste os tipos de retorno disponíveis em um outro post Conheça os ActionResult disponíveis.

Quando eu testo os meus Controllers eu faço a seguinte pergunta, dado um request o response esta correto? O template padrão do ASP.NET MVC mostra um exemplo muito claro de teste de Controllers, talvez os nomes dos teste não seja o melhor exemplo, mais refatorando ficaria assim.

[TestClass]
public class Home_Controller_Quando_Action_Index
{
    [TestMethod]
    public void Executada_Com_Sucesso()
    {
        // Arrange
        HomeController controller = new HomeController();

        // Act
        ViewResult result = controller.Index() as ViewResult;

        // Assert
        ViewDataDictionary viewData = result.ViewData;
        Assert.AreEqual("Welcome to ASP.NET MVC!", viewData["Message"]);
    }
}

[TestClass]
public class Home_Controller_Quando_Action_About
{
    [TestMethod]
    public void Executada_Com_Sucesso()
    {
        // Arrange
        HomeController controller = new HomeController();

        // Act
        ViewResult result = controller.About() as ViewResult;

        // Assert
        Assert.IsNotNull(result);
    }
}

Galera é isso, no próximo post vou falar um pouco de Mock até lá!

Daniel Fonseca Castro

Não faz teste porque não quer!

Conversando com um amigo ele disse que é difícil praticar teste, ele disse que ainda esta na faculdade e tem acesso apenas a versão express do Visual Studio, as versões express não suporta nenhum tipo de add-in,etc…

Para resolver esse problema existe varias opções de framework, mais vou falar somente do NUnit.O NUnit é uma framework para unit test open source para todas as linguagens .NET com a possibilidade de rodar os testes fora do Visual Studio, sendo assim o problema esta resolvido, você pode escrever os testes com as ferramentas express e depois rodar os testes com o NUnit, vamos ver como isso funciona na pratica.

Você precisa baixar o NUnit http://www.nunit.org/?p=download o setup inclui a framework de teste, outra de mock e um executável que vamos utilizar para rodar os testes, antes de iniciar vale uma olhada no Quick Start para conhece os atributos básicos http://www.nunit.org/index.php?p=quickStart&r=2.5.5 , feito isso crie um projeto ASP.NET MVC e um projeto do tipo Class Library que será o nosso projeto de teste, para esse exemplo estou utilizando o Microsoft Visual Web Developer 2010 Express, para o projeto Class Library (projeto de teste) siga os passos abaixo:

  • Adicione referência a DLL nunit.framework no projeto de teste, essa DLL esta dentro da pasta framework do diretório de instalação do NUnit, no meu caso ela ficou neste caminho C:\Program Files (x86)\NUnit 2.5.5\bin\net-2.0\framework\nunit.framework.dll
  • Agora adicione as referências para o projeto ASP.NET MVC e para DLL System.Web.Mvc
  • Agora é só escreve os testes veja um exemplo abaixo
[TestFixture]
public class HomeControllerTest
{
    [Test]
    public void Index()
    {
        // Arrange
        HomeController controller = new HomeController();

        // Act
        ViewResult result = controller.Index() as ViewResult;

        // Assert
        ViewDataDictionary viewData = result.ViewData;
        Assert.AreEqual("Welcome to ASP.NET MVC!", viewData["Message"]);
    }

    [Test]
    public void About()
    {
        // Arrange
        HomeController controller = new HomeController();

        // Act
        ViewResult result = controller.About() as ViewResult;

        // Assert
        Assert.IsNotNull(result);
    }
}

Para rodar os teste você precisa abrir o NUnit, no menu Project selecionar Add Assembly , procure a DLL do projeto Class Library, selecione os teste que deseja executar e clicar em Run, veja o resultado na imagem abaixo

Resultado Esperado

Amigos é isso ai, motivos para testar você tem mais de mil, framework para teste não falta, então vamos testar!

Antes de finalizar vou deixar alguns links com outras opções, eu gosto muito do MbUnit http://www.mbunit.com/, com o Gallio fica melhor ainda http://www.gallio.org/ e para executar os testes a partir do Visual Studio você pode utilizar o TestDriven.NET http://www.testdriven.net/. Nem precisa dizer que o TestDriven.NET não funciona com as versões express

Baixe aqui o projeto de exemplo é até a próxima!

Daniel Fonseca Castro

Não se assuste esse ainda é o meu blog!

Ainda não esta 100% falta alguns detalhes de layout , mais estou satisfeito com o resultado atual é muito ruim navegar pela web é encontrar outros blogs com o mesmo layout, acho que isso não vai mais acontece! .

O legal desta repaginação foi descobrir alguns bugs, a próxima etapa é corrigir esses pequenos problemas e fechar 100% das alterações de layout.

Você gostou da nova cara do blog? Deixe seu comentário!

Daniel Fonseca Castro

Select simples mais perigoso

Sabe aquele obstáculo que parece ser a coisa mais simples do mundo?

Pois é! Em um novo projeto com EF 1.0 surgiu uma necessidade simples, fazer um select utilizando Linq to Entites que retornasse todos os ids de um array de inteiro , como no exemplo abaixo:

static void Main(string[] args)
{
    NorthwindEntities context = new NorthwindEntities();
    int[] ids = new int[] { 1, 2, 3 };
    var resultado = from product in context.Products
                    where ids.Contains(product.ProductID)
                    select product;

    foreach (var item in resultado)
        Console.WriteLine("Nome: {0}", item.ProductName);

    Console.Read();
}

Super simples, esse código inclusive funciona perfeitamente no L2Q, mais no EF 1.0 uma exception do tipo NotSupportedException é lançada com a seguinte mensagem de erro:

“LINQ to Entities não reconhece o método ‘Boolean Contains[Int32](System.Collections.Generic.IEnumerable`1[System.Int32], Int32)’, que não pode ser convertido em uma expressão de armazenamento.”

Fui pesquisar como resolver esse problema e a maioria das soluções que encontrei “cheirava mal”, e as que não tinha cheiro nenhum eram complicadas demais para um problema tão pontual, quase todas as soluções seguia a lógica abaixo , com pouquíssimas variações.

static void Main(string[] args)
{
    NorthwindEntities context = new NorthwindEntities();
    int[] ids = new int[] { 1, 2, 3 };
    var resultado = from product in context.Products.AsEnumerable()
                    where ids.Contains(product.ProductID)
                    select product;

    foreach (var item in resultado)
        Console.WriteLine("Nome: {0}", item.ProductName);

    Console.Read();
}

Note a presença do método AsEnumerable() isso resolveu o problema, mais conversando com outra pessoa questionei que esse código provavelmente trazia todos os dados da tabela para depois aplicar o filtro.

Utilize uma ferramenta open source http://code.google.com/p/sqlexpressprofiler/ para verifica se a afirmação estava correta, veja abaixo a consulta SQL gerada.

SELECT 1 AS [C1],
[Extent1].[ProductID] AS [ProductID],
[Extent1].[ProductName] AS [ProductName],
[Extent1].[QuantityPerUnit] AS [QuantityPerUnit],
[Extent1].[UnitPrice] AS [UnitPrice],
[Extent1].[UnitsInStock] AS [UnitsInStock],
[Extent1].[UnitsOnOrder] AS [UnitsOnOrder],
[Extent1].[ReorderLevel] AS [ReorderLevel],
[Extent1].[Discontinued] AS [Discontinued],
[Extent1].[CategoryID] AS [CategoryID],
[Extent1].[SupplierID] AS [SupplierID]
FROM [dbo].[Products] AS [Extent1]

Para tudo! Select sem where e pedi para DBA pegar no seu pé e “tacar o pau” em todos ORMs do mundo!

Eu resolvi esse problema utilizando Entity SQL, veja o código abaixo:

static void Main(string[] args)
{
    NorthwindEntities context = new NorthwindEntities();
    var resultado = context.Products.Where("it.ProductID IN {1,2,3}");

    foreach (var item in resultado)
        Console.WriteLine("Nome: {0}", item.ProductName);

    Console.Read();
}

Talvez a minha solução não seja a mais adequada mais com certeza o select será gerado de forma correta, para finalizar eu tenho uma boa noticia nada disso é problema para o EF 4, então corra para VS 2010!

Daniel Fonseca Castro

Vídeo de demonstração do ASP.NET MVC Scaffold – Beta 1.0

Segue vídeo de demonstração da versão atual do ASP.NET MVC Scaffold

Link para o vídeo anterior

http://www.danielfonsecacastro.com.br/post/2010/04/18/ASPNET-MVC-Scaffold-Video-de-demonstracao-da-versao-Preview-10.aspx

Link para código fonte

http://aspnetmvcscaffold.codeplex.com/SourceControl/list/changesets

Link para versão setup

http://aspnetmvcscaffold.codeplex.com/releases/view/45717

Daniel Fonseca Castro

ASP.NET MVC Scaffold – Beta 1.0

Disponibilizei a versão beta do ASP.NET MVC Scaffold ,essa versão corrige muitos problemas da versão anterior, por exemplo , o projeto de setup esta mais inteligente, a integração com Visual Studio também esta melhor e os templates edit e details agora utilizam os HTML helpers EditorForModel e DisplayForModel possibilitando a utilização de T4. Baixe a versão atual neste link http://aspnetmvcscaffold.codeplex.com/releases/view/45717 e deixe seu comentário.

O mais rápido possível vou disponibilizar um vídeo de demonstração desta versão, até la!

Daniel Fonseca Castro

JQuery: ASP.NET MVC com AJAX retornando JSON

O JQuery oferece algumas opções para fazer suas solicitações AJAX com retorno JSON, neste post vamos analisar três opções, uma utilizando o método getJSON outra com método post e por fim uma com o método ajax.

Antes de começar os exemplos com JQuery precisamos preparar a aplicação no lado do servidor. Para o modelo vou utilizar o Entity Framework com o banco de dados Northwind , no EF vou manter todas as configurações padrão e vou utilizar a entidade Customers, após as configurações do EF podemos criar o “CustomersController”, conforme o código abaixo.

public class CustomersController : Controller
{
    //
    // GET: /Customers/

    public ActionResult Index()
    {
        return View();
    }

    public ActionResult ActionGetJSON(string termo)
    {
        Entities context = new Entities();
        var resultado = from customer in context.Customers
                        where customer.CompanyName.Contains(termo)
                        select new { CompanyName = customer.CompanyName, CustomerID = customer.CustomerID };
        return Json(resultado, JsonRequestBehavior.AllowGet);
    }

    [HttpPost]
    public ActionResult ActionPostJSON(string termo)
    {
        Entities context = new Entities();
        var resultado = from customer in context.Customers
                        where customer.CompanyName.Contains(termo)
                        select new { CompanyName = customer.CompanyName, CustomerID = customer.CustomerID };
        return Json(resultado);
    }
}

Para montar os nosso exemplos vou utilizar as Actions “ActionGetJSON ” e “ActionPostJSON”, como você já deve ter percebido uma é acessada via GET e a outra via POST, note que a Action acessada via GET passa dois parâmetros para o método Json que é responsável pela serialização do objeto, se você não passar o segundo parâmetro indicando que o GET é permitido uma execption será lançada.

Agora podemos definir a view Index,veja o código abaixo.

<div>
    <%=Html.TextBox("termo") %>
    <button id="btnBuscarComGetJson">Buscar com método getJSON</button>
    <button id="btnBuscarComPost">Buscar com método  post</button>
    <button id="btnBuscarComAjax">Buscar com método ajax</button>
</div>

<div id="resultado"></div>

Vamos definir os eventos onclick dos três botões abaixo, em um arquivo JavaScript separado do HTML, esse arquivo será criado no decorrer do post.

Método getJSON

O nome do método define o que ele faz, ele faz uma solicitação get e espera um retorno JSON, ele espera três parâmetros url,data e callback.O parâmetro url: define a url da solicitação,data: define os parâmetros da solicitação e callback: define a função que vai tratar o retorno do servidor, a função de callback será executada somente se a solicitação for executada com sucesso.

function btnBuscarComGetJson_click() {
    $.getJSON("/customers/ActionGetJSON/", { termo: $("#termo").val() }, function(data) {
        $("#resultado").empty();
        $("#resultado").append("<table><thead><tr><th>Company Name</th><th>Customer ID</th></tr></thead><tbody id='bodyTable'>");

        $(data).each(function() {
            $("#bodyTable").append("<tr><td>" + this.CompanyName + "</td><td>" + this.CustomerID + "</td></tr>");
        });

        $("#resultado").append("</tbody></table>");
    });
}

O código acima define o método que trata o evento onclick do botão “btnBuscarComGetJson”, a função de callback que foi definida de forma anônima escreve uma table dentro da DIV “resultado”.

Método post

Esse método também diz o que faz, ele faz uma solicitação post, você pode passar quatro parâmetros para esse método url,data,callback que já conhecemos e dataType.O parâmetro dataType defini o tipo de retorno, ele é um parâmetro opcional caso você não defina o tipo de retorno ele será identificado automaticamente.

function btnBuscarComPost_click() {
    $.post("/customers/ActionPostJSON/", { termo: $("#termo").val() }, function(data) {
        $("#resultado").empty();
        $("#resultado").append("<table><thead><tr><th>Company Name</th><th>Customer ID</th></tr></thead><tbody id='bodyTable'>");

        $(data).each(function() {
            $("#bodyTable").append("<tr><td>" + this.CompanyName + "</td><td>" + this.CustomerID + "</td></tr>");
        });

        $("#resultado").append("</tbody></table>");
    },"json");
}

O método acima define a função que vai tratar o evento onclick do botão “btnBuscarComPost”, ele é muito parecido com o método “getJSON”, a única diferença é o quarto parâmetro que foi definido como JSON.

Método ajax

O método ajax é o mais completo de todos, ele recebe apenas um parâmetro que é um objeto com todas configurações, para esse exemplo eu vou definir um objeto com sete propriedades, você pode ver a lista completa de opção na documentação http://api.jquery.com/jQuery.ajax/

function btnBuscarComAjax_click() {
    $.ajax({
        url: "/customers/ActionPostJSON/",
        data: { termo: $("#termo").val() },
        type:"post",
        dataType: "json",
        beforeSend: function(XMLHttpRequest) {
            alert('Inicio....');
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            alert('Erro....');
        },
        success: function(data, textStatus, XMLHttpRequest) {
            $("#resultado").empty();
            $("#resultado").append("<table><thead><tr><th>Company Name</th><th>Customer ID</th></tr></thead><tbody id='bodyTable'>");

            $(data).each(function() {
                $("#bodyTable").append("<tr><td>" + this.CompanyName + "</td><td>" + this.CustomerID + "</td></tr>");
            });

            $("#resultado").append("</tbody></table>");
        }
    });
}

O método acima define a função que vai tratar o evento onclick do botão “btnBuscarComAjax”, o objeto de configuração passado como parâmetro para a função ajax possui sete propriedades:

url :define a url da solicitação.

data: defini os parâmetros.

type: define o tipo de solicitação os mais comuns são GET ou POST.

dataType: define o tipo de retorno os mais comuns são xml, json, script, ou html.

beforeSend: define a função que será executada antes da solicitação, você pode utilizar esse método para fazer confirmações e validações, essa função pode ser utilizada também para mostrar um modal com uma animação ou um simples “Aguarde…”.

error: define a função que será executada caso ocorra algum erro na solicitação.

success: define a função que vai tratar o resultado quando a função for executada com sucesso.

Para finalizar falta apenas adicionar o código que registra o evento click para os três botões.

$(document).ready(function() {
    $("#btnBuscarComGetJson").click(btnBuscarComGetJson_click);
    $("#btnBuscarComPost").click(btnBuscarComPost_click);
    $("#btnBuscarComAjax").click(btnBuscarComAjax_click);
});

Acho que deu para perceber que o método ajax é o mais flexível de todos, a partir deste método você pode criar rotinas especificas para sua aplicação, por exemplo, você pode criar um método que utiliza o método ajax e colocar um loading padrão para todas solicitações, colocar uma mensagem de erro padrão,tratar o resultado de forma padrão em fim as possibilidades são muitas.

Os método getJSON e post são excelentes opções, mais por padrão eles não tem suporte a métodos auxiliares ,por exemplo, se eu quiser fazer algum tratamento antes das minhas solicitações ou tratar erros eles não possui definições para isso, você poderia utilizar métodos globais que o JQuery disponibiliza para resolver esse problema, mais isso é assunto para outro post.

Baixe aqui o fonte em C# ou VB.NET

Daniel Fonseca Castro