Archive for the ‘Geral’ Category.

Usando Timer em uma aplicação Windows Services.

Pessoal,

Hoje me perguntaram sobre a utilização do objeto Timer em uma aplicação Windows Services, questionando que ao adicionar o objeto direto da Toolbox ele não estava sendo executado no seu respectivo intervalo.

Bom Primeiro vamos esclarecer duas coisas para quem ainda não conhece. O que é Windows Services e o Objeto Timer?

  • Windows Services: Aplicação windows que fica sendo executada em background no S.O.
  • Objeto Timer: Objeto disponivel na plataforma .NET para executarmos funcionalidades em um determinado espaço de tempo.

Agora como faço para usar o Timer em um Windows Services? eu recomendo que seja feito de maneira dinâmica ao invés incluir o objeto via toolbox… Apenas por gosto :)

Para que o timer funcione de acordo com o proposto temos que adicionar ao nosso objeto Timer, um EventHandler(ElapsedEventHandler) ele executará as funcionalidades codificadas respeitando o intervalo informado ao objeto. Vamos ao exemplo:

Para iniciar, no seu projeto Windows Services, importe a referência das classe Timers:

using System.Timers;

Agora  em sua classe Inicialize o objeto Timer, isso se você estiver fazendo de forma dinâmica,se você escolheu adicionar o objeto direto do toolbox pule este passo.

namespace WindowsService3
{
    public partial class TimeSrv : ServiceBase
    {
        //Inicializando o objeto timer
        Timer timer = new Timer();

Como estamos falando de Windows Service, agora em nosso evento de inicialização do serviço (OnStart), o qual é executado sempre que o serviço é iniciado vamos habilitar o timer e definir um timer para sua execução.

protected override void OnStart(string[] args)
{
    //Escreve no Visualizador de Evento do Windows
    EventLog.WriteEntry(“Serviço Inicializado.”, EventLogEntryType.Information);

    //1: Adicionando o evento Elapsed ao objeto Timer
    timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);

    //2: Marcando o como intervalo 1 minuto (= 60,000 milliseconds)
    timer.Interval = 60000;

    //3: Habilitando o objeto timer para execução.
    timer.Enabled = true;
}


Sendo que definimos um evento Elapsed ao objeto timer chamado OnElapsedTime, temos que ter o método criado, nele teremos o código que será executado assim que o timer for habilitado, claro tudo isso dentro do intervalo definido acima. Em nosso exemplo eu apenas escrevo a data no Visualizador de Eventos do Windows, mas lembrando que o código ali executado fica a critério do desenvolvedor.

private void OnElapsedTime(object source, ElapsedEventArgs e)
{
    EventLog.WriteEntry(“Executando serviço: ” +
        DateTime.Now.ToShortTimeString(),EventLogEntryType.Information);
}


Agora para fecharmos mais esta dica basta usar o evento OnStop do seu serviço, evento que é executado quando seu Windows Services é parado, para desabilitar o timer.

protected override void OnStop()
{
    timer.Enabled = false;
    EventLog.WriteEntry(“Serviço Parado.”,EventLogEntryType.Information);
}

Bom espero ter resolvido a dúvida do pessoal da comunidade que estava me perguntando e claro passado mais uma dica a todos.

[]’s


Bookmark and Share

Visual Studio 2008 – Hotfix

Olá Pessoal,

Bom acho melhor já instalar… isso mesmo… Saiu o primeiro Hotfix para o Visual Studio 2008, dentre os problemas que corrige temos:

  • Coloração dos arquivos JavaScript
  • Melhor performance na construção de sites com muitos assemblies.
  • Melhora a performance do design view
  • etc.

Quem quiser pode baixar o hotfix no link http://go.microsoft.com/?linkid=8406367 .

Atenção aos detalhes para a instalação.

[]’s


Bookmark and Share

Universidade .NET

Ola Pessoal,

Ai vai mais uma dica maravilhosa para quem gosta de .NET… Durante minha “navegação”, pelo nossa internet achei um UNIVERSIDADE .NET… isso mesmo um site com cursos especificos para .NET.

Vale a pena dar uma olhada!

Ai vai o link http://www.dotnet-university.com/default.aspx

 

[]’s


Bookmark and Share

Criando imagens dinâmicamente no ASP.NET

A classe System.Drawing possui inúmeros recursos para criação e edição de imagens. Para iniciarmos mostrando um pouco do seu poder vamos mostrar como conseguimos criar dinâmicamente imagens do “zero”.

Para que usarmos de exemplo cria um novo projeto WEB em seu Visual Studio. Agora acesse o Codebehind de sua página ASPX, na qual criaremos a imagem dinâmicamente.

Inicialmente temos que importar a classe System.Drawing no topo da página.

using System.Drawing;

Para criarmos a imagem devemos usar o código abaixo em algum evento da sua aplicação, portanto podemos colocar no load da página ou até mesmo em um clique de botão. Abaixo mostramos o código comentado sendo executado diretamente no load da página, ou seja, ao abrir o página já visualizamos o resultado, a imagem criada na tela.

protected void Page_Load(object sender, EventArgs e)
{
    //Cria um objeto do tipo Bitmap
    Bitmap objBitmap = new Bitmap(120, 30);
    //Habilita o objeto bitmap criado para edição
    Graphics objGraphics = Graphics.FromImage(objBitmap);
    //Desenha um retangulo com cores e dimensões especificas
    objGraphics.FillRectangle(new SolidBrush(Color.LightBlue),
           0, 0, 120, 30);
    //Desenha um circulo com cores e dimensões especificas
    objGraphics.FillEllipse(new SolidBrush(Color.Blue), 3, 9, 10, 10);
    objGraphics.FillEllipse(new SolidBrush(Color.Yellow), 4, 10, 8, 8);
    //Adiciona um texto na imagem
    objGraphics.DrawString(“Bertucci Soluções”, new Font(“Tahoma”, 8),
        new SolidBrush(Color.Green), 16, 8);
    //Cria a salva a imagem para exibição na tela
    Response.Clear();
    Response.ContentType = “image/jpeg”;
    objBitmap.Save(Response.OutputStream,
        System.Drawing.Imaging.ImageFormat.Jpeg);
    objGraphics.Dispose();
    objBitmap.Dispose();
}  

Resultado
tela01-ImagemDinamica


Bookmark and Share

Adicionando um CSS Link dinâmicamente em ASP.NET

Ola Pessoal,

Para adicionar um CSS Link dinâmicamente em sua página ASP.NET podemos utilizar o código abaixo:

protected void Page_Load(object sender, EventArgs e)
{
    //Capturando o "Header" da pagina
    HtmlHead header = (HtmlHead)Page.Header;
    //Setendo o CSS Link
    HtmlLink link = new HtmlLink();
    link.Attributes.Add("href", Page.ResolveClientUrl("~/Estilo.css"));
    link.Attributes.Add("type", "text/css");
    link.Attributes.Add("rel", "stylesheet");
    //Adicionando CSS Link no Hearder da página
    header.Controls.Add(link);
}  

Reparem que para registrar o CSS como estilo da página capturamos o Header da página e criamos um objeto do tipo HTMLLink, o qual definimos como type "text/css". Assim passando os parâmetros corretos basta adicionar o objeto Link no Header capturado.

A mais para que o Header se encontrado, precisamos colocar no HTML da página a seguinte tag:

<head runat="server">

Pronto já podemos criar vários css de personilização a nossa aplicação ASP.NET, e dinâmicamente informar qual será usado.

 

[]’s


Bookmark and Share

Evitando Cache em páginas ASP.NET

As vezes temos a necessidade de evitar que nossas página ASP.NET fiquem armazenadas em cache, evitando assim a exibição de dados errados ou desatualizados.
Para isso podemos setar em nossa página comandos para expirar e desabilitar a cache da página.

protected void Page_Load(object sender, EventArgs e)
{
    //Faz com que a session expire
    Response.Cache.SetExpires(DateTime.Now.Subtract(new TimeSpan(24, 0, 0)));
    //Desabilita a cache para a página
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
}

Dois comandos que podem evitar grande problemas em determinados momentos. Com eles evitamos o cache de suas páginas ASP.NET.

[]’s


Bookmark and Share

Web 3.0 – Mas já?

Ola Pessoal,

Hoje recebi de um colega de trabalho um e-mail apontando para um ferramenta, e com o termo WEB 3.0!

Mas como assim Web 3.0… A febre Web 2.0 mau começou e já estamos falando de Web 3.0? Isso mesmo.. este é o mundo de tecnologia.

Ok… mas o que seria Web 3.0? Bom para sabermos é legal sabermos primeiro o que foi Web 1.0 e o que é a Web 2.0.

  • Web 1.0 – Nada mais foi do que o período de popularização da rede em si.
  • Web 2.0 – É a nossa vida hoje, centrada em mecanismos de busca(Googgle, MSN Search), sites de colaboração na internet(Youtube,Wikipedia), e sites de relacionamento social como o Orkut.

E a Web 3.0? Ela vem com a idéia de organizar e usar de maneira mais inteligente todas as informações e todo conhecimento disponibilizado até então. Porque se persarmos bem daqui a um tempo a web vai ficar um gigantesco Banco de Dados, mas e se não tivermos isso de forma mais organizada e inteligente?? Imagina a bugunça.

:)

 

Bom a Web vem ai para organizar e deixar mais inteligente as informações. E hoje eu tive a oportunidade de ver uma ferramente já pensada para isso. Esta ferramenta desenvolvida pela empresa Cortex Intelligence, busca organizar e deixar mais inteligente as informações de uma noticia. Para quem quiser conferir acesse: http://www.cortex-intelligence.com/engine/ 

Incrível né?

Deixe seu comentário!

[’]s


Bookmark and Share

Compactando e Descompactando arquivos em ASP.NET

Ola Pessoal,

Bom poucos sabem mas o próprio .NET Framework possui classes para efetuar compactação e descompactação de arquivos.
Para isso usaremos a classe GZipStream, que representa o formata de dados o GZip, o qual utiliza algoritmo padrão de compactação da indústria. Para que quiser acessar mais informações sobre o padão GZip acesse http://www.ietf.org/rfc/rfc1951.txt?number=1951 .

Temos que ter atenção a dois detalhes:

  1. A classe GZipStream, não pode ser usada para compactar arquivos maiores que 4 GB.
  2. A funcionalidade de compactação desta classe é efetuada com a leitura de byte-a-byte, portanto sendo melhor usada em fontes não compactadas. Sendo assim se você utilizar esta classe para compactar arquivos já compactados corre-se o risco de aumentar o tamanho do mesmo.

Para exemplificar  criei duas funções, uma para compactação(CompactarArquivo) e outra para descompactação(DescompactarArquivo). Funções que poderam ser invocadas a qualquer momento.As mesmas estão devidamente comentadas.

Antes de codificar as funções devemos importar os seguintes Namespaces:

using System.IO;
using System.IO.Compression;

Agora é só codificar as funções abaixo:

 private void CompactarArquivo(string ArquivoOrigem, string ArquivoDestino)
{
    //Cria uma entrada stream do arquivo de origem para compactação
    FileStream Origem = new FileStream(ArquivoOrigem, FileMode.Open, FileAccess.Read);

    //Cria a saida do arquivo stream, sendo criado um arquivo “.gz”, por exemplo
    FileStream Destino = new FileStream(ArquivoDestino, FileMode.Create, FileAccess.Write);

    //Os bytes serão processados por um compressor de streams(GZipStream)
    GZipStream Compactado = new GZipStream(Destino, CompressionMode.Compress, true);

    //efetua a leitura dos bytes de um arquivo para o outro.
    const int tamanhoBloco = 4096;
    byte[] buffer = new byte[tamanhoBloco];
    int bytesLidos;

    do
    {
        bytesLidos = Origem.Read(buffer, 0, tamanhoBloco);

        if ((bytesLidos == 0))
            break;

        Compactado.Write(buffer, 0, bytesLidos);
    }
    while (true);

    //Fecha todos os streams
    Origem.Close();
    Compactado.Close();
    Destino.Close();
}

private void DescompactarArquivo(string ArquivoOrigem, string ArquivoDestino)
{
    //Cria uma entrada stream do arquivo de origem para descompactação
    FileStream Origem = new FileStream(ArquivoOrigem,FileMode.Open,FileAccess.Read);

    //Cria a saida do arquivo stream, aqui é o arquivo de destino
    FileStream Destino = new FileStream(ArquivoDestino,FileMode.Create,FileAccess.Write);

    //Os bytes serão processados através de um decompressor de stream(GZipStream)
    GZipStream Descompactado = new GZipStream(Origem,CompressionMode.Decompress,true);

    //efetua a leitura dos bytes de um arquivo para o outro.
    const int tamanhoBloco = 4096;
    byte[] buffer = new byte[tamanhoBloco];
    int bytesLidos;
    do
    {
        bytesLidos = Descompactado.Read(buffer, 0, tamanhoBloco);

        if ((bytesLidos == 0))
            break;

        Destino.Write(buffer, 0, bytesLidos);
    }
    while (true);

    //Fecha todos os streams
    Origem.Close();
    Descompactado.Close();
    Destino.Close();
}
 
Só para não esquecer… A classe GZipStream está disponível à partir do .NET Framework 2.0.
Pessoal agora é só usar!
Deixem seus comentários.
[]’s


Bookmark and Share

Casa Nova!

Ola Pessoal,

É este final de semana de carnaval, eu vou pular demais!! rs
Hoje posso me considerar o mais novo paulistano… Eu e minha esposa mudamos ontem para SP… portanto agora é arrumar as coisas e se acostumar com a nova vida!

[]’s


Bookmark and Share

Criando um Appointment no Outlook via ASP.NET

Ola Pessoal,

Mais uma dica…. Quer adicionar recursos a seu aplicativo ASP.NET como, por exemplo, criar um agendamento no calendário do usuário sobre um determinado evento do seu site?

Podemos fazer isso criando um Appointment do Outlook. Para isso podemos usar o código explicado abaixo:

namespace Appointment
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //Criando StringBuilder para criação do arquivo vcs
            System.Text.StringBuilder outlookvcs = new System.Text.StringBuilder();

            //Variaveis com os dados do evento
            string Titulo = “AB Company”;
            string Descricao = “Criando um Appointment no Outlook.”;
            string Local = “Av. Paulista 11111 - São Paulo - SP”;
            DateTime DataInicio = new DateTime(2007, 12, 25, 12, 0, 0); ;
            DateTime DataTermino = new DateTime(2007, 12, 25, 19, 30, 0);

            //Criação do evento. Iniciando uma entrada no calendário
            outlookvcs.Append(“BEGIN:VCALENDAR” + “\n”);
            //Definindo a versão do Appointment
            outlookvcs.Append(“PRODID:-//Microsoft Corporation//Outlook 10.0 MIMEDIR//EN” + “\n”);
            outlookvcs.Append(“VERSION:1.0″ + “\n”);
            //Iniciando um evento no calendário
            outlookvcs.Append(“BEGIN:VEVENT” + “\n”);
            //Definindo valores(Local,Data(formato yyyyMMdd),Hora(formato HHmmss),Descricao,titulo
            outlookvcs.Append(“LOCATION:” + Local + “\n”);
            //Informando a data e hora de inicio
            outlookvcs.Append(“DTSTART:” + DataInicio.ToString(“yyyyMMdd”) + “T”
                + DataInicio.ToString(“HHmmss”) + “Z” + “\n”);
            //Informando a data e hora de termino
            outlookvcs.Append(“DTEND:” + DataTermino.ToString(“yyyyMMdd”) + “T”
                + DataTermino.ToString(“HHmmss”) + “Z” + “\n”);
            outlookvcs.Append(“UID:1″ + “\n”);
            outlookvcs.Append(“DESCRIPTION;ENCODING=QUOTED-PRINTABLE:” + Descricao + “=0A” + “\n”);
            outlookvcs.Append(“SUMMARY;ENCODING=QUOTED-PRINTABLE:” + Titulo + “\n”);
            outlookvcs.Append(“PRIORITY:3″ + “\n”);
            //Encerrando o evento e o calendário
            outlookvcs.Append(“END:VEVENT” + “\n”);
            outlookvcs.Append(“END:VCALENDAR” + “\n”);
            //Definindo e escrevendo o HttpResponse do tipo “text/calendar”
            Response.Clear();
            Response.ContentType = “text/calendar”;
            Response.AddHeader(“content-disposition”, “attachment; filename=appointment.vcs”);
            Response.Write(outlookvcs);
            Response.End();
        }
    }
}


Bom pessoal mais uma dica… para deixar nossas aplicações mais ricas e sofisticadas!

[]’s


Bookmark and Share