ASP.NET SignalR – Acompanhando o percentual de uso da CPU em tempo real

Standard

Atendendo alguns pedidos do Facebook e por email que recebi semana passada, hoje vou demostrar um exemplo de utilização do SignalR em uma aplicação que NÃO seja um chat. 🙂

Importante: Se você não sabe o que é o SignalR, nunca ouviu falar, ou não tem conhecimento, aconselho a leitura dos meus artigos anteriores sobre o assunto antes de continuar.

Situação Atual

Realmente a maioria dos artigos, posts e exemplos encontrados pela web demonstram a utilização do SignalR em aplicações de chat, muito bacana, isto facilita muito as coisas para quem precisa implementar algo do tipo, porém, tem um lado muito negativo: a maioria do pessoal vê vantagem em utiliza-lo apenas em aplicações de chat, ou algo relativamente simples. Porém, o SignalR é uma biblioteca ALTAMENTE completa e robusta, podendo ser utilizadas em diversos tipos de situações e projetos.

Particulamente utilizo o SignalR regularmente nos projetos que trabalho, e até hoje, nunca foi para criar um chat!
Continue reading

Implementando um Extension Method para coleções utilizarem a expressão Soundex

Standard

Vou demostrar neste artigo como podemos criar um Extension Method para coleções (IEnumerable) poderem utilizar um recurso muito utilizado em Transact-SQL chamado Soundex.

Para quem não conhece [ou não sabe nem o que é], a expressão Soundex retorna um código de quatro caracteres utilizado para comparar a semelhança entre duas sequências de caracteres. Ou seja, foneticamente falando, “casa” seria o mesmo que “caza”, ou até mesmo “cazza”, pois o som ao reproduzi-las seria o mesmo.

O algoritmo para a geração dos quatro caracteres para a comparação fonética é realizado utilizando algumas regras e “quase todas” letras do alfabeto.

Básicamente, as seguintes regras são consideradas:

1- Guarda-se o primeiro caracter da sequência e ignora os demais que forem iguais a (a, e, i, o, u, y, h, w);
2- concatena-se os próximos caracteres com seu respectivo código:
b, f, p, v => 1 
c, g, j, k, q, s, x, z => 2 
d, t => 3 
l => 4 
m, n => 5 
r => 6 
3- Dois caracteres adjacentes com o mesmo número são codificados como um único número, assim como, dois caracteres iguais separados por ‘h’ ou ‘w’ são codificados como um número único.
4- Se houver letras duplicadas, a segunda letra é ignorada
5- Continue até que o resultado seja três números, ou, preencher com “0” até ficarem três números.

Vamos criar nossa rotina para geração do código Soundex:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/// <summary>
/// Gera código Soundex
/// </summary>
/// <param name="valor"/>Valor base a ser verificado
/// <returns>String com código Soundex</returns>
public static string GeraSoundex(this string valor)
{
    if (String.IsNullOrEmpty(valor))
        return null;

    StringBuilder resultado = new StringBuilder(valor.Length);

    string valorBase = valor.ToUpper().Replace(" ", string.Empty);

    resultado.Append(valorBase[0]);
    char valorAnterior = '0';
    for (int i = 1; i < valorBase.Length; i++)
    {
        char valorEquivalente = '0';
        char valorAtual = valorBase[i];

        if ("BFPV".Contains(valorAtual))
            valorEquivalente = '1';

        else if ("CGJKQSXZ".Contains(valorAtual))
            valorEquivalente = '2';

        else if ("DT".Contains(valorAtual))
            valorEquivalente = '3';

        else if ('L'.Equals(valorAtual))
            valorEquivalente = '4';

        else if ("MN".Contains(valorAtual))
            valorEquivalente = '5';

        else if ('R'.Equals(valorAtual))
            valorEquivalente = '6';

        if (valorEquivalente != valorAnterior && valorEquivalente != '0')
        {
            resultado.Append(valorEquivalente);
            valorAnterior = valorEquivalente;
        }
    }
    while (resultado.Length < 4)
        resultado.Append("0");

    return resultado.ToString(0, 4);
}

Continue reading

Iniciando com SignalR – Agora como membro do ASP.NET

Standard

Contava os dias para a integração do SignalR com o ASP.NET, pois a cada dia o mesmo se tornava mais estável, com mais conteúdo online, além de ser muito bem aceito e interpretado pelos desenvolvedores web ao redor do mundo.

Basicamente agora sob o ASP.NET além de contar com seus recursos para aplicações web em tempo real, podemos utilizar templates específicos no Visual Studio, além de contar com auxílio, dicas e tutoriais pelo próprio site do asp.net. Oficialmente o SignalR torna-se membro do ASP.NET.

Algumas coisas mudaram (para melhor é claro) em relação a forma de se trabalhar com o mesmo anteriormente, vejamos alguns itens importantes:
Continue reading

SignalR – Trocando mensagens e notificações entre Server/Client de forma global e individual

Standard

No post anterior sobre o SignalR, fiz uma introdução rápida sobre a biblioteca, onde conseguimos observar que realmente é muito fácil a utilização da lib, além de demonstrar como podemos realizar a troca de mensagens/notificações entre server/client em tempo real.
Neste artigo, vou demonstrar como podemos requisitar uma função em server-side, e após o término, notificar todos os usuários conectados (client-side), ou apenas algum(ns) usuário(s) específico(s).

Para todos os exemplos, estou considerando que a importação dos scripts e referências para o SignalR já tenham sido realizadas (No artigo anterior eu demonstro como definir as referências e scripts para o SignalR funcionar corretamente).

Notificação Global

Veja como é simples o envio de notificações em tempo real para todos os usuários conectados, primeiramente vamos criar nossa conexão no script do cliente (client-side):

<script language="javascript" type="text/javascript">

    $(function () {

	// Cria objeto de conexão
	var nomeHubClient = $.connection.nomeHub;

        // Função que envia mensagem para o servidor
        $("#btnEnviaMsg").click(function () {

	    var mensagem = $('#mensagem').val();
            nomeHubClient.enviaMensagem(mensagem);
            $('#mensagem').val("");

        });

        // Inicia a conexão
        $.connection.hub.start(function () {
            // Envia para o servidor o usuário que está criando a conexão
	    // O campo #nomeUsuario é apenas um campo presente na nossa página aspx que identifica o nome do usuário em questão (Não é obrigatório)
	    nomeHubClient.join($('#nomeUsuario').val(""));
        });

        // Função chamada em real-time pelo servidor
        nomeHubClient.novaMensagem = function (mensagem) {
            mensagem = $("#mensagens").html() + "<br />" + mensagem;
            $("#mensagens").html(mensagem);
        };
    });

</script>

Continue reading

Criando um repositório genérico para Entity Framework

Standard

Irei demonstrar aqui uma forma bem simples e rápida para implementarmos um repositório genérico com Entity Framework. A ideia de implementação será a mesma utilizada com Linq to SQL, ou seja, nosso repositório será responsável por realizar apenas quatro operações: Selecionar os dados, salvar, apagar e atualizar.

Vamos primeiramente criar uma interface para o repositório:

public interface IRepositorio
{
	void Atualiza();

	void Apaga<TEntidade>(TEntidade entidade) where TEntidade : class;

	void Salva<TEntidade>(TEntidade entidade) where TEntidade : class;

	IQueryable<TEntidade> Seleciona<TEntidade>() where TEntidade : class;
}

Continue reading

Dataflow Programming com C# – Criando Variáveis e Operações

Standard

Conhecemos muito bem a tradicional programação imperativa, onde o estado de nossas variáveis são mutáveis e existe uma sequência pré-definida de comandos para que sejam executados. Já o paradigma de Dataflow (Fluxo de Dados) Programming segue um raciocínio diferente, do tipo “faça apenas quando receber algo”, um exemplo bem simples de como isso funciona: Imagine uma fábrica de roupas com seus dez funcionários, porém, para que eles comecem a trabalhar, primeiro devem receber os tecidos, ou seja, na programação com fluxo de dados a execução do programa depende dos dados de entrada.

A partir do .NET framework 4.5 já é possível utilizar os recursos da programação com fluxo de dados nativamente, utilizando para tanto a biblioteca System.Threading.Tasks.Dataflow. Porém, meu objetivo neste post é outro Tongue out, irei demonstrar como podemos criar variáveis e realizar operações com fluxo de dados em versões anteriores do framework, para ser mais direto irei utilizar a versão 4.0 com um recurso chamado TPL (Task Parallel Library) para programação paralela. Continue reading

Cria suas próprias coleções utilizando Iteration Pattern em C#

Standard

Antes de iniciarmos este artigo, é altamente recomendado que você saiba o que é, e como funciona a interface IEnumerable, localizada no namespace System.Collection. Com uma rápida explicação retirada do MSDN, podemos considerar um IEnumerable como:

“Exposes the enumerator, which supports a simple iteration over a non-generic collection.”

Ou seja, é uma interface que expõe o enumerador, e suporta uma iteração simples sobre uma coleção não genérica.

Ok, e o que seria esse “Iteration Pattern” ?

Iteration Pattern é um padrão de desenvolvimento muito utilizado em loops de repetições. É um padrão que viabiliza o acesso sequencial aos elementos de uma dada coleção, sem que seja necessário o conhecimento dos elementos subsequentes. Continue reading

Yoda Conditions com C#

Standard

Acredito que a maioria dos “developers” escreveria uma simples condição como demonstrado abaixo:

int varInt = 1;
if (varInt == 2){
//...
}

bool varBool = false;
if (varBool == true){
//...
}

O que há de errado? Na verdade não existe erro algum nos snippets acima, porém, considere os seguintes erros na digitação do código:

int varInt = 1;
if (varInt = 2){
//...
}

bool varBool = false;
if (varBool = true){
//...
}

Continue reading

Implementando um Extension Method para IEnumerables utilizarem a expressão Soundex

Standard

Imagem 1

 

Vou demostrar neste artigo como podemos criar um Extension Method para coleções (IEnumerable) poderem utilizar um recurso muito utilizado em Transact-SQL chamado Soundex.

Para quem não conhece [ou não sabe nem o que é], a expressão Soundex retorna um código de quatro caracteres utilizado para comparar a semelhança entre duas sequências de caracteres. Ou seja, foneticamente falando, “casa” seria o mesmo que “caza”, ou até mesmo “cazza”, pois o som ao reproduzi-las seria o mesmo.

O algoritmo para a geração dos quatro caracteres para a comparação fonética é realizado utilizando algumas regras e “quase todas” letras do alfabeto. Onde básicamente, as seguintes regras são consideradas:

 

1 – Guarda-se o primeiro caracter da sequência e ignora os demais que forem iguais a (a, e, i, o, u, y, h, w);

2 – concatena-se os próximos caracteres com seu respectivo código:

  • b, f, p, v => 1
  • c, g, j, k, q, s, x, z => 2
  • d, t => 3
  • l => 4
  • m, n => 5
  • r => 6

3 – Dois caracteres adjacentes com o mesmo número são codificados como um único número, assim como, dois caracteres iguais separados por ‘h’ ou ‘w’ são codificados como um número único.

4 – Se houver letras duplicadas, a segunda letra é ignorada

5  – Continue até que o resultado seja três números, ou, preencher com “0” até ficarem três números. Continue reading

Dica Rápida – Default Values com Linq to SQL

Standard

Sabemos que no Sql Server podemos criar colunas de tabelas com valores padrão, ou seja, valores default que serão utilizados caso não passe valor algum para o campo.

Veja a tabela abaixo:

CREATE TABLE TabelaTeste
(
Cod INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
Nome VARCHAR(100) NOT NULL DEFAULT('Zaccanini'),
Valor DECIMAL(18,2) NOT NULL DEFAULT(100), 
Data DATETIME NOT NULL DEFAULT(GETDATE()),
Obs VARCHAR(MAX) NULL
)

Observe que as colunas Nome, Valor e Data possuem valores default. Para realizarmos um insert no próprio Sql Server, podemos fazer algo bem simples, como:

INSERT INTO TabelaTeste DEFAULT VALUES

Algora iremos realizar o mesmo insert, porém, com Linq to SQL.

Para tanto basta definir a propriedade “Auto Generated Value” como “True” nas colunas que possuem valores default, observe abaixo:

Imagem 1

E para o insert:

DB.TabelaTestes.InsertOnSubmit(new TabelaTeste());
DB.SubmitChanges();

Pronto, muito simples e rápido. (Acreditem se quiser, vi muitas dúvidas sobre isto! :P)

 

Abraços.