Inscreva-se no RSS do [MVP] Adriano Bertucci
Newsletter
Siga-me no Twitter.
Facebook
LinkedIn
Flickr

Professores e Educadores!!??

Ola pessoal,

Recebi um pequeno conto em meu email e gostaria de compartilhar com todos e ao mesmo tempo ver o que cada um acha sobre o assunto…

MARCAS DE BATOM NO BANHEIRO
Numa escola pública estava ocorrendo uma situação inusitada:

Uma turma de meninas de 12 anos, que usava batom todos os dias, beijavam o espelho para remover o excesso de batom. O diretor andava bastante aborrecido, porque o zelador tinha um trabalho enorme para limpar o espelho ao final do dia. Mas, como sempre, na tarde seguinte, lá estavam as mesmas marcas de batom…


Um dia, o diretor juntou o bando de meninas no banheiro, explicou pacientemente que era muito complicado limpar o espelho com todas aquelas marcas que elas faziam. Fez uma palestra de uma hora. No dia seguinte as marcas de batom no banheiro reapareceram.


No outro dia o diretor juntou o bando de meninas e o Zelador no banheiro, e pediu ao zelador para demonstrar a dificuldade do trabalho.


O zelador imediatamente pegou um pano, molhou no vaso sanitário e passou no espelho. Nunca mais apareceram marcas no espelho!

Há professores e há educadores…”

Aguardo a opinião de todos…

Twitter Acompanhe…

Ola Pessoal,

Há alguns dias atrás, tive um problema com minha conta no Twitter… ela foi “invadida” .

Graças a esta falha de segurança da ferramenta, tive que entrar em contato com o suporte nos EUA e tentar recuperar minha conta. A boa notícia é que consegui recuperá-la… a mal é que tive que excluir todos os meus seguidores… Portanto gostaria de pedir para quem seguia o Bertucci que se recadastre… Assim tudo voltará como era antes! :)

Obrigado a todos!

Certificação MS com 50% de desconto para estudantes

Atenção Estudantes,

A Microsoft lançou uma promoção para incentivar no processo de certificação, ela estará fornecendo descontos nas provas que podem chegar a 55%, o Brasil obtve um dos maiores valores 50%.

Para quem quiser mais informações, e claro prestar as provas basta acessar o site do programa e efutuar o cadastro.

Mas atenção que no dia da prova o fiscal da Prometric irá exigir o docmuento que comprove a situação de estudante para o candidato… então sejamos todos honestos!


Bookmark and Share

Limpando LOG no SQL Server 2005

Ola Pessoal,

Para que possamos limpar os logs dos bancos de dados no SQL Server 2005, evitando assim que seu espaço em disco termine, faça o seguinte:

Acesse as propriedades do seu Banco de Dados, selecione “Options”, e em “Recovery Model” troque de Full para Simple.

Logo em seguida execute o comando abaixo:

USE BANCO
go
DBCC SHRINKFILE (nome_arquivo_log, tamanho)
go


Sendo que no lugar de BANCO você irá informar o nome do Banco de Dados, e em nome_arquivo_log você informa o nome do arquivo de Log seguido do tamanho que você deseja deletar, por exemplo, 1000=1GB, etc.

[]’s


Bookmark and Share

Icones para sua aplicação ASP.NET

Ola Pessoal,

Para aqueles que sofrem com layout segue uma dica: Icones para sua aplicação ASP.NET.

http://www.aspneticons.com/

[]’s


Bookmark and Share

Editando arquivos MSI

Já precisou editor arquivos de instalação MSI, como eu?? Então tente o Orcas MSI Editor.
Um bom programa para edição de arquivos MSI, incluisive temos um tutorial no próprio site da Microsoft em http://support.microsoft.com/kb/255905

Quem precisar ai vai uma boa dica!

[]’s


Bookmark and Share

C# 3.0 – Novidades – Extension Methods

Dando continuidade a nossa série, vamos falar de um dos novos recursos com maior expressão na linguagem e no .NET 3.5, a possibilidade de criar métodos de extensão (extension methods).

Extension Methods, são métodos estáticos que podemos utilizar para estender funcionalidades de classes especificas do .NET.

Declarando um Extension Method

Para declararmos novos métodos de extensão, primeiro precisamos saber que o funcionamento dos métodos é semelhante aos métodos estáticos, portanto, você só pode declará-los em classes estáticas. Segundo, sempre que formos declarar um extension method, vamos especificar a palavra-chave this como primeiro parâmetro do método. Vamos ver um exemplo:

 

namespace ExtensionMethods
{

    public static class ExtMethods
    {
        //Static Method - Maneira tradicional
        public static int ConvertInt32Static(string s)
        {
            return Int32.Parse(s);
        }

        //Extension Method - Nova funcionalidade
        public static int ConvertInt32Ext(this string s)
        {
            return Int32.Parse(s);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            //Valor
            string Valor = “9″;
            //Executando um extension method
            int ExtMethod = Valor.ConvertInt32Ext();

            //Excutando um Static Method
            int StaticMethod = ExtMethods.ConvertInt32Static(Valor);

            //Exibe os valores
            Console.WriteLine(“Extension Method: ” + ExtMethod);
            Console.WriteLine(“Static Method: ” + StaticMethod);
            Console.ReadLine();
        }
    }
}

 

Podemos notar no exemplo a diferença de comportamento entre um método estático e o novo extension method. Repare que devido a declaração da palavra this antes do parâmetro do método de extensão, o .NET Framework “incorporou” o método à classe string. Podemos notar a presença mais exata do método extensivo na classe através IntelliSense, com mostrado abaixo:

01

 

Agora vamos enumerar as diferenças entre os métodos estáticos (Static Methods) e os métodos de extensão (Extension Methods):

  • Para declaração de métodos de extensão (Extension Methods) precisamos declarar antes do primeiro parâmetro a palavra-chave this. Já para os métodos estáticos (Static Methods) não temos a palavra.
  • Quando consumimos um método de extensão, o parâmetro declarado no método é omitido, como podemos notar no primeiro exemplo. No método estático precisamos especificar o valor como parâmetro.
  • Métodos de Extensão só podem ser declarados em classes estáticas, o que não é exigência para métodos estáticos.

Trabalhando por dentro do IL

Se formos olhar e analisar o IL gerado pela aplicação mostrada no exemplo 1 temos a seguinte informação:

02

 
Abaixo temos o código IL do método de extensão o ConvertInt32Ext.

.method public hidebysig static int32  ConvertInt32Ext(string s) cil managed
{
  .custom instance void 
  [System.Core]System.Runtime.CompilerServices.ExtensionAttribute::.ctor() = ( 01 00 00 00 )
  // Code size       12 (0xc)
  .maxstack  1
  .locals init ([0] int32 CS$1$0000)
  IL_0000:  nop
  IL_0001:  ldarg.0
  IL_0002:  call       int32 [mscorlib]System.Int32::Parse(string)
  IL_0007:  stloc.0
  IL_0008:  br.s       IL_000a
  IL_000a:  ldloc.0
  IL_000b:  ret
} // end of method ExtMethods::ConvertInt32Ext

Podemos notar no código grifado de vermelho a presença do atributo no método declarando-o como extension method.

E agora o código IL do método estático ConvertInt32Static.

.method public hidebysig static int32  ConvertInt32Static(string s) cil managed
{
  // Code size       12 (0xc)
  .maxstack  1
  .locals init ([0] int32 CS$1$0000)
  IL_0000:  nop
  IL_0001:  ldarg.0
  IL_0002:  call       int32 [mscorlib]System.Int32::Parse(string)
  IL_0007:  stloc.0
  IL_0008:  br.s       IL_000a
  IL_000a:  ldloc.0
  IL_000b:  ret
} // end of method ExtMethods::ConvertInt32Static
 

Porque usar Extension Methods?

Bom, depois de tudo isso você pode estar se perguntando… Porque usar os métodos de extensão?

Simples, por absoluta conveniência.

Vamos explicar melhor , suponha que você tenha passado anos desenvolvendo um Framework com funções usuais no dia a dia e que você quis disponibilizar a classe para uso externo. Quando alguém quiser consumir alguma função dela o desenvolvedor necessitará conhecer o nome da classe completo para poder executar o método estático desejado, algo como no exemplo abaixo:

Varivel = MeuFramework.

Neste ponto teremos o IntelliSense que lhe fornecerá todas as funções disponíveis, bastando você escolher a sua e fornecer os parâmetros necessários.

Varivel = MeuFramework.FuncaoDesejada(Valor);
 

Conclusão

Os extension methods nasce como um novo mecanismo para invocar métodos estáticos em objetos instanciados.

Até o próximo.

 


Bookmark and Share

Novo artigo… Linha de Código!

Ola Pessoal,

Gostaria de informar a todos que publiquei mais um artigo em um grande site de tecnologia no Brasil… o Linha de Código…

O artigo é sobre propriedades automática no C# 3.0… quem quiser conferir http://www.linhadecodigo.com.br/Artigo.aspx?id=1716

Há! Se quiserem conferir mais publicações acesse http://www.adrianobertucci.com/?page_id=63

[]’s


Bookmark and Share

Passando parêmetros para Relatórios Reporting Services em ASP.NET

Ola Pessoal,

Vamos para mais uma dica? Estamos desenvolvendo nossas aplicações ASP.NET e chegamos no módulo de relatórios, e para faze-los de maneira rápida e prática escolhemos SQL Reporting Services. Mas como fazemos para que nossa aplicação ASP.NET converse com o relatório passando os parâmetros certo para a criação do relatório com valores exatos?

Bom fácil….

Vamos adicionar primeiro nosso Report Viewer para visualização dos relatórios em sua página ASP.NET:

Agora basta configurar o Report Viewer para exibir o relatório escolhido, passando os parâmetros solicitados por ele. Abaixo segue o código comentado para exeutar a tarefa:

//Informa o modo de execução do relatório (Local ou Remoto)
Relatorios.ProcessingMode = ProcessingMode.Remote;
//Informar respectivamente as URLs do Servidor Report Service e do Relatório a ser executado
Relatorios.ServerReport.ReportServerUrl = newUri(“http://mzsql/reportserver”);
Relatorios.ServerReport.ReportPath = “/Empresa/Sistema/Relatorio”;
//Vamos criar a atribuir valores para os parametros
ReportParameter[] reportParams = newReportParameter[2];
reportParams[0] = newMicrosoft.Reporting.WebForms.ReportParameter(“Parametro1″, “valor1″);
reportParams[1] = newMicrosoft.Reporting.WebForms.ReportParameter(“Parametro2″, “valor2″);
//Atribumos os parametros criados para o relatorio
Relatorios.ServerReport.SetParameters(reportParams);
//Desabilita o barra de parametros do Report viewer
Relatorios.ShowParameterPrompts = false;
//Atualiza o relatorio para exibição
Relatorios.ServerReport.Refresh();

Bom pessoal mais uma para todos!

[]’s


Bookmark and Share

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