sexta-feira, 19 de fevereiro de 2010

C#: Twitter API

Página da apiwiki estão desatualizadas,

passo para vocês uma segunda opção:
http://www.twitterizer.net/


[OLD:]
Objetivo: 

"Twittar" a partir de um programa feito em .NET para sua conta no twitter. 

Primeiro passo é fazer o download da bibliotéca do Twitter que vamos usar na nossa aplicação 


ou se preferir, podemos ser mais diretos:

  • Descompacte o arquivo
  • Use o Add Reference do projeto que está aberto na sua IDE.
Depois disso, a coisa fica mais simples, e a primeira coisa que temos que fazer é usar a referência que criamos

using Twitterizer.Framework;
 Agora vamos instânciar a classe Twitter, note que os paramêtros de login e senha são obrigatorios para criarmos esse objeto
Twitter t = new Twitter("twitter_user", "twitter_password");
 depois de instanciarmos vamos dar nosso primeiro post
t.Status.Update("Ola Mundo");

quarta-feira, 17 de fevereiro de 2010

Dica: IBatis Data Mapper framework

Objetivo

Se você não gostar muito do NHibernate, a dica que eu dou é usar esse outro framework para persistir nossos dados:

http://ibatis.apache.org/

e aqui um tutorial da própia apache, muito bom:

http://ibatisnet.sourceforge.net/Tutorial.html

quarta-feira, 10 de fevereiro de 2010

C#: Agrupando um GridView

Objetivo: 

Agrupar um GridView por determinada coluna.

Ola pessoal, hoje vamos falar de algo que era para ser default do GridView mas que ainda gera muitas duvidas em relação ao seu uso, que é o agrupamento do GridView por um determinado "assunto" mas antes de começarmos, vamos fazer o download do GridViewHelper, desenvolvido pela http://www.agrinei.com/ (eu não sei quem são, mas fizerem um bom trabalho).

segue o link do download: 

descompacte o zip, e sobre a pasta App_Code do seu site, ou em um projeto de classe, adicione todos esses arquivos, menos, claro o webform, ".aspx"


O uso dele é muito simples, e no site do desenvolvedor você encontra todas as funções, vou listar aqui apenas a mais básica, mas com um porém, no site da fornecedora desse "ajudante" eles esquecem de mencionar que precisa ter uma referência para um evento do gridView que não foi postado lá. 

 Agora vamos criar nossa pagina, e vê como está a estrutura do nosso projeto:



Agora vamos colocar um pouco de código nisso aqui!

primeiro vá no seu projeto e adicione o arquivo Pais.xml com a seguinte estrutura:



Até ai ta tudo normal, nada que você não tenha visto, agora vamos adicionar o código do nosso helper, e vê como o gridview vai se comportar


using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

namespace testeHelper
{
    public partial class _Default : System.Web.UI.Page
    {
        public void RealizaConsulta()
        {

            //==============================================
            // Criando um dataset e lendo arquivo XML
            //==============================================

            DataSet objDataSet = new DataSet();
            objDataSet.ReadXml(Server.MapPath("\\") + "Pais.xml");

            //==============================================
            // Passando nosso dataset e dando bind dos dados
            //==============================================

            grvGridHelper.DataSource = objDataSet;
            grvGridHelper.DataBind();

       
        }

        protected void Page_Load(object sender, EventArgs e)
        {

            RealizaConsulta();
          
            GridViewHelper helper = new GridViewHelper(this.grvGridHelper);
            helper.RegisterGroup("Estado", true, true);
            helper.ApplyGroupSort();

        }

        protected void grvGridHelper_Sorting(object sender, GridViewSortEventArgs e)
        {
            // Esse evento precisa ser declarado
            RealizaConsulta();

        }
    }
}

Reparem no código acima; Tivemos que realizar a consulta duas vezes, o que não é muito aconselhado se for um sistema muito requisitado, pense em outra forma de da um bind no grid no momento que ele faz o Sorting. 

E o resultado da nossa Grid fica assim:


Simples não? mais facil que isso só andar pra frente.

sexta-feira, 5 de fevereiro de 2010

JQuery: Barra superior de avisos como no Twitter

Objetivo: 
Avisos iguais ao usado pelo Twitter.



Mais facil que andar pra frente. 



quinta-feira, 4 de fevereiro de 2010

C#: Teste de Software com Pex

Objetivo: 

Explicar melhor o que é o Pex, como utilizal-o e suas vantagens, então antes de continuar lendo esse post, por favor, faça o download da versão de estudo, no site:



Mas então o que é o Pex?


é um gerador de Testes Unitários que assim como o nunit usa assertivas de pré-condição  para garantir um teste mais seguro, usando como conceito o test de Caixa Branca, que em linhas gerais seria o teste do código em si, ele vai fazer uso de uma pespectiva do seu código para modelar os casos de teste, e o pex veio para isso, identificar o que poderia "ser testado".


O seu uso é muito simples e vamos ver no decorrer do post.

Qual sua vantagem em relação aos outros metódos de test de software?

Agilidade! com pex (Muitos programadores java vão ficar mais loucos com isso)
apenas alguns clicks ele já monta seu projeto de test, alem de você poder fazer teste em momento de execução. 

"Ao mesmo tempo que se mantém a garantia do software nos permite centralizar os esforços ao desenvolvimento da lógica do negócio. (André Nobre)"


Antes de criar o projeto, vamos executar o instalador do pex que está disponivel no começo desse post, ele ira criar a integração com o visual studio (amo essa IDE) para facilitar nossa vida de nos deixar ainda mais preocupados apenas com o modelo do nosso negócio :)

Agora vamos criar um projeto ClassLibery chamado DAOComponente:


Depois de criar o projeto, vamos adicionar um novo item, uma classe que se chamará CLComparar.

Nossa solução vai ficando assim:




 E na classe  CLComparar vamos  adicionar o seguinte código:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DAOComponente
{
    public class CLComparar
    {
        ///
        /// Comparar objetos.
        ///

        public void Comparar()
        {
       
        }
    }
}
e agora vem a mágica:


antes que alguem fale, é meu Visual Studio tem o fundo preto, mas não é para ser matrix não é para nao ficar cansando a vista com a tela branca! :D

Depois de clicar com o botão direito sobre nossa classe e ir em Pex>Create Parameterized Unit Tests ira se abrir uma tela onde teremos algums valores, mas eu não aconselho vocês a mudarem ele agora não, deixa para "bulir" depois do exemplo, vamos deixar como está!


Na proxima tela, ele vai perguntar qual o nome do novo projeto de teste que você deseja criar... vamos colocar: "DAOComponente.Test":


Vamos ver como ficou nossa solução depois do wizard:


Reparem na estrutura criada pelo Pex, para a solução ele adicionou uma pasta com os arquivos de configuração e com o arquivo de metadados que esta ligado ao Test List, se a gente de um duplo click sobre ele, vocês veram a lista de todos os testes do projeto. 

Vamos agora abrir o arquivo de teste "CLCompararTest.cs"gerado pelo Pex:

using System;
using DAOComponente;
using Microsoft.Pex.Framework;
using Microsoft.Pex.Framework.Validation;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace DAOComponente
{
    /// This class contains parameterized unit tests for CLComparar
    [PexClass(typeof(CLComparar))]
    [PexAllowedExceptionFromTypeUnderTest(typeof(InvalidOperationException))]
    [PexAllowedExceptionFromTypeUnderTest(typeof(ArgumentException), AcceptExceptionSubtypes = true)]
    [TestClass]
    public partial class CLCompararTest
    {
        /// Test stub for Comparar()
        [PexMethod]
        public void Comparar([PexAssumeUnderTest]CLComparar target)
        {
            target.Comparar();
            // TODO: AQUI VOCE FAZ OS TESTES ANTES DE IMPLEMENTAR
        }
    }
}

Reparem que ele já criou o nossa função para Comparar (Igual a que ta no nosso componente ) assim podemos testar antes mesmo de implementar no projeto "real" isso é muito bom pois evita muita dor de cabeça depois.
        [PexMethod]
        public void Comparar([PexAssumeUnderTest]CLComparar target)
           {
            target.Comparar();
            // Escreva seu teste aqui!
         }


Não há atualmente nenhuma TestMethod como você esperaria um teste de unidade padrão do Visual Studio. Em vez disso, você tem um PexMethod. Este método é um teste de unidade parametrizadas. Posteriormente, quando você deixar Pex explorar código sob teste, ele criará outra classe parcial que contém os testes de unidade padrão anotados com atributos TestMethod. Esses testes gerados será acessíveis através do Visual Studio Test Editor.

Muito simples, não?!
Mais facil que isso só andar pra frente.

Obrigado e até a próxima.





ASP.NET: MVC x WebForm

Objetivo:

Falar um pouco sobre essa "polêmica" e interessante discução.

Antes de você tomar uma decisão por qual modelo usar, você deve levar em consideração algumas coisas; 


O que é o MVC?

Originalmente foi criado como padrão de projeto arquitetural desenvolvido para o ambiente Smalltalk, mas ele pode ser utilizado para qualquer aplicação interativa. Separação entre os dados (Model) e o layout (View). Desta forma, alterações feitas no layout não afetam a manipulação de dados, e estes poderão ser reorganizados sem alterar o layout. Porém se você quer ter controle total sobre tudo que acontece no seu frontend, esqueça Gridviews, DetailsViews ou qualquer controle "Visual" pois é tudo na unha!

O que é um Webform?
Na época que a Microsoft lançou o .NET o PHP e o JAVA estavam dominando o mercado, deixando o tradicional ASP, ou ASP Classico que é como eu chamo, de lado, como trazer, de maneira rápida e não dolorosa os programadores VB  e ASP para essa nova arquitetura, sem traumas e de maneira "transparente"? o webform foi a resposta, na época foi uma grande sacada, você arrastar um botão para seu webform da um duplo click e programar o evento dele ali mesmo, isso te lembra alguma coisa? Delphi, Visual Basic? se sim, então você já entendeu porque esse conceito se tornou popular e ajudou de maneira brilhante a aceitação do .NET para a comunidade.

Agora que já espanei a diferença entre eles, vamos listar o que tem de positivo em cada modelo:

  • Facilidade para testes - Ponto para o MVC.
  • ASP.NET Routing ou mapeamento de rotas - Ponto para o MVC.
  • Maior controle sobre o html - Ponto para o MVC.
  • Wizards - Ponto para o WebForm.
  • Produtitivdade - Ponto para o WebForm.
Colocando esses pontos em cima da mesa, podemos dizer quer o MVC sai "ganhando" mas não se engane, eu ainda não aconselho usar o MVC se você quer produtividade.

Links para você se decidir, experimentar e testar:


quarta-feira, 3 de fevereiro de 2010

Mono: Bastidores da Implantação do Mono na PGE-CE

Objetivo:

Vou explicar como foi a experiência de implantar o Mono na Procuradoria Geral do Estado do Ceará. (Mas não vou dar nome aos bois)

Tudo começou se não me engano em Dezembro de 2007, quando o governador "Recomendou" para que os orgãos migrassem tudo para software livre, esse pedido foi atendido de prontidão pelo então procurador geral do estado, e repassado a CTI que era a empresa que geria toda a tecnologia usada na PGE, ( e ainda deve ser )  que acatou muito bem as ordens e com muito esforço implantou de forma brilhante, o uso de tecnologia livre em todos os setores do orgão. 

Mas voltando ao assunto, quando iniciamos o projeto a nossa equipe era relavivamente pequena, de desenvolvedores, fui chamado na sala do coordenador junto com o gerente de projetos para ouvir o que ele tinha a dizer, que era para avisar que o Procurador Geral pediu para ele pessoalmente que todos os softwares tinham que ser livres. me assustei um pouco, mas quase que de imediato pensei em uma nova tecnologia que se propunha a rodar .NET no linux e deixar ele "Portátil" o Mono, quando eu falei eles não acreditaram muito nao...  Ainda lembro que na época o então Coordenador do CTI, junto com o Gerente de Infra, me pediu para assinar um termo me comprometendo a rodar uma aplicação .NET no Linux, mas sinceramente eu não lembro se era brincadeira, mesmo assim tive sete dias para instalar em uma maquina que foi "doada" exclusivamente para essa tarefa uma aplicação .NET rodando perfeitamente no linux, e com muito esforço conseguimos rodar nosso primeiro helloword. 

Mas nem tudo foram flores, para chegar e dizer para o nosso coordenador que estava tudo ok, foram mais três meses de luta, primeiro que o Assessor Especial de Tecnologia do Governo na epoca batia o martelo junto com um outro profissional parceiro dele que a distribuição tinha que ser Fedora, o que eu não concordava muito, pois me parecia lógico que se o mono tem apoio da novell, nada mais inteligente usar OpenSuse, mas tudo bem, ordens são ordens ( acredito que essas pessoas estavam muito mais acostumadas com fedora e não queriam alterar ou mudar seus habitos ) isso acarretou muitos problemas de instalação dificultando muito a configuração do servidor por parte do nosso amigo Rafael, e por minha parte com o MonoDevelop, que não rodava legal nesse ambiente (Não compilava nada feito em VB e só estava rodando parte  de algums códigos, não reconhecer o CodeBehind do webform e erros de dependências impossiveis de decifrar), mesmo que em teoria era para funcionar com perfeição, Só que quando instalamos o openSuse e conseguimos rodar um app que já tinha sido feito em .NET com o Visual Studio e sem praticamente migrar nada, é que bati o martelo e falei para o coordenador do CTI que éra a unica forma de rodar legal e sem dificuldades seria a adoção do openSuse. e o que acabou se confirmando e até hoje está nessa distro.

No final do projeto, entrei em contato com o MonoBrasil que é um grupo de usuários que eu acreditava que fossem se interessar pela notícia, o que se confirmou, recebemos inclusive a visita de um dos engenheros da novell do mono, mas apartir dai eu segui outro caminho e a PGE/CTI o seu. 

Só para lembrar que hoje são 400 Desktops Linux. Eles estão usando Firefox + Thunderbird + OpenOffice como solução base, a distribuição escolhida foi o OpenSuse. Os servidores da rede foram todos migrados para Suse Enterprise Linux, agora eles estão rodando um ambiente 100% livre e não esquecendo, com um ambiente de desenvolvimento, que até esse texto era Mono.

Matheus, mas as maquinas eram dualboot? ou rodava em uma VM? tinha interlicense no codigo? tinha o famoso Arrastar e soltar controles da toolbox? 
R:Não nada disso, e acredito que até hoje não tenha, mas foi muito proveitoso.

Matheus posso usar mono com outros frameworks, como Nhibernate e Spring.NET?
R:Sim, claro, porque não? é até um conselho que dou, sempre teste seus componentes de negócios antes de colocalos em uma interface , use NUnit para testar, é até melhor do que esse framework da Microsoft para testes. 

Você trabalha com mono hoje em dia? 
R:Apenas em um, estou trabalhando no projeto com Iphone com Mono Touch, e quando esse projeto estiver "OK" eu posto um feedback dele.

NUnit: Testes unitários com C#

Objetivo:

Test-Driven Development em .NET

Primeiramente vamos fazer o downloado do NUnit ( esse index.php ta matando )

Eu não vou entrar em detalhes, se você está aqui é porque já tem idéia do que é testes unitários e para que eles servem


eu mesmo era contra, achava perca de tempo (nessa época eu programava em VB, desculpa) 

Vamos a prática, esse blog tem que ser prático:
  1. Criar um projeto chamdo ProjetoTest e add:
    a classe clDAOTest no Diretório: DAO
  2. vamos importar a referência para "nunit.framework".
  3. vamos usá-la no topo da sua classe: using NUnit.Framework; 

Agora precisamos dizer para a classe que ela vai conter methodos de testes:
 [TestFixture(Description = "Teste unitário para a classe clAlgumaCoisa.")]

E vai ficando assim:
using NUnit.Framework;
namespace ProjetoTest.DAO
{
   

    [TestFixture(Description = "Teste unitário para a classe clDAOTest.")]
    public class clDAOTest
    {
    }
}
O Atributo TestFixture vai dizer para a classe que ela é visivel ao NUnit e que deve ser testada, Pronto,  já temos nossa estrutura básica para testar nosso software. 

Vamos ao segundo atributo:
[Test(Description = "Teste unitário do método ProcurarTodos().")] 
  
[Test(Description = "Teste unitário do método ProcurarTodos().")]
        public void ProcurarTodos()
        { 
        }
e nossa classe ta ficando assim:

using NUnit.Framework;
namespace ProjetoTest.DAO
{
   

    [TestFixture(Description = "Teste unitário para a classe clDAOTest.")]
    public class clDAOTest
    {
                [Test(Description = "Teste unitário do método ProcurarTodos().")]
                public void ProcurarTodos()
                { 
                      //Entra com o código de teste.
                }
    }
}
 Bom agora chegamos em um ponto que vamos ter que falar sobre os "Assertions" que acredito seja o "ponto G" do nosso teste, eu não vou me aprofundar muito e vou usar somente  o que compara dois objetos ( AreEqual ), é ele que vai dizer se passou ou não! GREENBAR ou REDBAR! 


 Vamos imaginar que eu tenha uma entidade chamada Pessoa
Pessoa oPessoa= new Pessoa();
oPessoa.ID = 1;
oPessoa.Nome = "Matheus";
// Notem que eu estou preenchendo na mão esse infeliz, e o outro
// eu vou preencher atravez da minha DAO passando o mesmo ID
Pessoa oPessoaDAO = MinhaDAO.Recuperar(1);
Assert.AreEqual( oPessoa, oPessoaDAO);
ÓóòòòÓO... só isso? mais ou menos. 

Vamos ver como esta ficando nosso código: 


using NUnit.Framework;
namespace ProjetoTest.DAO
{
   

    [TestFixture(Description = "Teste unitário para a classe clDAOTest.")]
    public class clDAOTest
    {
                [Test(Description = "Teste unitário do método ProcurarTodos().")]
                public void ProcurarTodos()
                { 
                    
              Pessoa oPessoa= new Pessoa();
              oPessoa.ID = 1;
              oPessoa.Nome = "Matheus";              
              Pessoa oPessoaDAO = MinhaDAO.Recuperar(1); 
              Assert.AreEqual( oPessoa, oPessoaDAO);
                }
    }
}

Se esses objetos etiverem idênticos, quer dizer que a sua DAO está agindo da forma que você esperava e com isso você evita muita dor de cabeça, claro isso é muito básico. e tem muito mais entre o céu e o inferno do que sonha seu vã visual studio. mas já é um começo.

C#: Transformar uma GridView em um Arquivo do Excel

Objetivo:

Gerar um arquivo do Excel apartir de uma GridView.

public void geraExcel(GridView gridView, Page oPage, string nomeArquivo)
    {
        try
        {
            System.Web.HttpContext.Current.Response.Clear();
            System.Web.HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
            System.Web.HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename= " + nomeArquivo + ".xls");

            System.Web.HttpContext.Current.Response.Charset = "";

            gridView.EnableViewState = false;

            System.IO.StringWriter oSW = new System.IO.StringWriter();
            System.Web.UI.HtmlTextWriter oHtmlTw = new HtmlTextWriter(oSW);
            HtmlForm frm = new HtmlForm();

            oPage.Controls.Add(frm);
            frm.Controls.Add(gridView);
            frm.RenderControl(oHtmlTw);

            System.Web.HttpContext.Current.Response.Write(oSW.ToString());
            System.Web.HttpContext.Current.Response.End();
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
    }

 Mais simples que andar pra frente.

C#: Retorna o IP do cliente.

Objetivo: 

Retorna uma String contendo o IP do Cliente, o que você vai fazer com esse IP é problema seu :)

public static string retornaIP()
    {
        string s = "";

        IPAddress[] addressList = Dns.GetHostByName(Dns.GetHostName()).AddressList;

        for (int i = 0; i < addressList.Length; i++) s += addressList[i].ToString() + "\n";

        return s;
    }

C#: Validação de CPF

Objetivo:
public static bool validaCPF(string cpf)
    {
        int[] multiplicador1 = new int[9] { 10, 9, 8, 7, 6, 5, 4, 3, 2 };
        int[] multiplicador2 = new int[10] { 11, 10, 9, 8, 7, 6, 5, 4, 3, 2 };
        string tempCpf;
        string digito;
        int soma;
        int resto;

        cpf = cpf.Trim();
        cpf = cpf.Replace(".", "").Replace("-", "");

        if (cpf.Length != 11)
            return false;

        tempCpf = cpf.Substring(0, 9);
        //calcula primeiro digíto
        soma = 0;
        for (int i = 0; i < 9; i++)
            soma += int.Parse(tempCpf[i].ToString()) * multiplicador1[i];

        resto = soma % 11;
        if (resto < 2)
            resto = 0;
        else
            resto = 11 - resto;

        digito = resto.ToString();

        tempCpf = tempCpf + digito;

        //calcula segundo digíto
        soma = 0;
        for (int i = 0; i < 10; i++)
            soma += int.Parse(tempCpf[i].ToString()) * multiplicador2[i];

        resto = soma % 11;
        if (resto < 2)
            resto = 0;
        else
            resto = 11 - resto;

        digito = digito + resto.ToString();

        return cpf.EndsWith(digito);
    }

Não tem muito o que falar né? mais facil que isso só andar pra frente. 

JavaScript: Mascara de um campo para CEP no WebForm C#

Objetivo:

Entre as tags "Head" e depois entre as tags do "Javascript" coloque:

function mascaraCEP(CEP, e)


        {


            var codigoTecla = (e.which)?e.which:event.keyCode;


            if (codigoTecla != 8 && codigoTecla != 46)


            {


                var valorCEP = CEP.value;


                if (valorCEP.length == 2)


                {


                    valorCEP = valorCEP + '.';


                    CEP.value = valorCEP;


                }


                if (valorCEP.length == 6)


                {


                    valorCEP = valorCEP + '-';


                    CEP.value = valorCEP;


                }


            }


        }

E agora é só Add no evento Page_Load do seu webform:  


TextBox1.Attributes.Add( "onkeydown", @" if(event.keyCode != 8 && event.keyCode != 13 && event.keyCode!=9)
                                                {
                                                    MascaraCEP(this);
                                                }");