Sábado sem eletricidade

Pois é... fomos premiados... a Eletropaulo vai "plantando" postes novos e trocando aquelas subestações que ficam no topo de cada um.

Só que isso tem um custo muito alto: ficamos sem eletricidade num dia letivo. Resultado: desmarcamos as aulas. Ainda bem que os nossos alunos são TODOS gente boa.

Sei que manutenção existe para qualquer coisa, mas eu fico puuuuuto irado quando vejo como esses sujeitos trabalham: dois trabalham e seis ou sete ficam olhando e "batendo papo". Por isso que eles começam 08:30h e terminam (raramente - sempre é depois) 14:30h.

Acho que eles deveriam contratar esses carinhas aqui, que resolveriam tudo... sem caminhão, sem talha, sem escada... tudo "na mão"... e seria bem mais rápido...

 
fala a verdade: você também não assiste essas competições? MUITO CHIQUE!!!

Outlook 2007: Como salvar anexos dos e-mails usando C#

Fiz um código para varrer todos os meus e-mails do outlook e achei coisas antigas, bem interessantes, até...

O código que usei foi:

Application myApp = new ApplicationClass();
foreach
(Folder f in myApp.GetNamespace("MAPI").Folders[1].Folders)
{
   
foreach (object in (f.Items))
   {
      MailItem mail 
as MailItem;

      if 
(mail != null)
         
if (mail.Attachments.Count > 0)
            
foreach (object in mail.Attachments)
            {
               Attachment anexo 
as Attachment;
               if 
(anexo != null)
               {
                  Console.Error.WriteLine(mail.Subject)
;
                  try
                  
{
                     anexo.SaveAsFile(
@"C:\atts\" 
                     
+ f.Name + "_" 
                     
+ mail.Subject.Replace('/'' ').Replace(@"\"" ")
                       
.Replace(':'' ').Replace('?'' ').Replace('*'' '
                     + 
"_" 
                     
+ mi.DisplayName.Replace('/'' ').Replace(@"\"" ")
                        .Replace(
':'' ').Replace('?'' ').Replace('*'' '));
                  
}
                  
catch { }
               }
            }
   }
}

Esse monte de Replace(char, char) foi resultado de cansaço... Poderia ter usado regex, que seria muito mais rápido... Mas já está valendo... 

E olhem o que eu encontrei (por favor, divulguem - ehehehe, claro que é piada... mas não muita):

Olha o que a falta de qualificação faz ao sujeito

De vez em quando vejo profissionais extremamente competentes na nossa área. São administradores de banco, programadores, gerentes, estagiários - tem cara fora do padrão em todo perfil. Não vou citá-los aqui para não cometer a injustiça de esquecer nomes. São pessoas fantásticas que estudam, pesquisam, estudam, pesquisam, estudam, pesquisam,  estu... bom, já entenderam, não?

Mas, em alguns momentos, eu vejo um outro tipo de profissional: aquele que só trabalha de 09:00h às 18:00h, de segunda a sexta e que NÃO GOSTA DE INFORMÁTICA absurdo. Reclama da falta de oportunidade, do azar, do "chefe". Não faz nada para se qualificar, para se tornar competitivo.

Para esses "profissionais" dou uma dica: não trabalhem no que não gostam... Trabalhar DEVE ser um prazer...

Abraços e não digam que não conhecem ninguém assim!!!

Preparando um webcast sobre LINQ

Devido aos feedbacks que recebi quanto ao webcast de sábado passado já planejei um novo. Terá um só tema e eu mesmo vou falar sobre eles. Serão seis tópicos de 40 minutos cada, totalizando 3 horas!!! 

Já convidei o amigo Alexandre Lopes para fazer uma palestra de abertura, onde fará a modelagem e criação do banco de dados (e seus objetos, claro) que usarei nos exemplos. 

Acho que será um blog. Como quem me conhece já sabe, farei "milhão" de exemplos.

Dessa vez, em C# e VB.Net.

Seguem os tópicos:

Acessando dados com LINQ

  • Falando sobre modelagem - Alexandre Lopes
  • O que é o LINQ
  • LINQ to Objects
  • LINQ to XML
  • LINQ to SQL
  • LINQ to DataSets
  • LINQ to Entities

Logo que eu definir a data e horário, aviso a todos.

Té+

Brincando com List<T> - como fazer uma ordenação customizada

O objetivo de criar a classe anterior é ler um arquivo texto com mais de 120.000 linhas (todas extraídas do meu Outlook), contendo e-mails que respondi ou que enviei. Lógico que existem n e-mails enviados para cada pessoa... Então criar uma List que não aceitasse repetições foi interessante.

Criei uma instância (objeto) da classe ListaUnica<String>, onde cada elemento tem um @ (garanti isso no aplicativo que extrai os dados do Outlook). Só que ao ordenar, com Sort(), o programa obedece a ordenação das strings - é o que chamamos ordem natural (alfabética para strings, do menor número para o maior, da menor data para a maior, e por aí vai). Eu preciso ordenar pelo domínio e não pelos nomes das pessoas (gmail com gmail, live com live, etc).

Preciso, ainda, exportar a ListaUnica<T> para arquivo. Para isso criei o método ToFile(String nomeArquivo)

O novo código da minha ListaUnica<T> ficou assim:

class ListaUnica<T> : List<T>
{
    
public new void Add(T item)
    {
        
if (!this.Contains(item))
            
base.Add(item);
    
}

    Func<T, T, 
int> Ordenar (x, y) 
=> x.ToString().Split('@')[1].CompareTo(y.ToString().Split('@')[1]);

    public new void 
Sort()
    {
        
base.Sort(new Comparison<T>(Ordenar))
    
}

    
public void ToFile(String nomeArquivo)
    {
        StreamWriter arq 
= null;

        
arq = new StreamWriter(nomeArquivo, true, Encoding.UTF8);

       foreach 
(var item in this)
            arq.WriteLine(item)
;

        arq.Close()
;
    
}
}

Para usar a exportação de dados da lista, para arquivo, basta fazer:
objListUnica.ToFile(@"c:\arquivoDestino.txt"); 

E, para ordenar, basta: objListUnica.Sort();

Brincando com List<T> - como evitar adição de conteúdo duplicado

Estava aqui no note brincando um pouco, enquanto esperava o horário do webcast, e tive uma idéia (boba, mas legalzinha): por que não criar uma coleção genérica que não aceite repetidos, como no java temos as classes derivadas da interface Set?

Então, vamos lá. O que eu preciso?

Criar uma classe que herde de List<T> (uma lista genérica) e que sobreponha o método Add(object item), que é o único que vou usar no meu programinha. Poderia criar uma classe que herde de um monte de interfaces, mas aí eu teria que implementar diversos métodos - NEM!!!

Primeiro devo ver se a classe não é sealed (aí ela não pode ser estendida). Não é: isso é bom porque posso herdar dela.

Segundo, devo descobrir se o método Add(object item) foi preparado para sobreposição usando virtual. Não foi: isso fará minha classe se comportar de modo diferente do esperado se eu usar polimorfismo - mas não vai ser o caso.

Então criei a classe:

class ListaUnica<T> : List<T>
{
    
public new void Add(T item)
    {
        
if (!this.Contains(item))
            
base.Add(item);
    
}
}

Para testar a classe e ter uma idéia da performance, fiz o programa abaixo:

class Program
{
    
static void Main(string[] args)
    {
        ListaUnica<String> lista 
= new ListaUnica<string>();
        
DateTime inicio DateTime.Now;
        int 
qtd 100000;

        for 
(int 1i <qtdi++)
        {
            lista.Add(
new Random(i).Next(1, qtd + 1).ToString());

            if 
(i % 100 == 0)
            {
                Console.Clear()
;
                
Console.WriteLine("completo: {0:n1} %", i * 100f / qtd);
                
Console.WriteLine("quantidade de elementos da lista: {0}", lista.Count());
            
}
        }

        DateTime fim 
DateTime.Now;

        
Console.WriteLine("início: {0}", inicio.ToString("dd/MM/yyyy HH:mm:ss.fff"));
        
Console.WriteLine("fim...: {0}", fim.ToString("dd/MM/yyyy HH:mm:ss.fff"));
        
Console.WriteLine("tempo.: {0}", fim - inicio);

        
//com seed no Random -> Random(i)
        //completo: 100,0 %
        //quantidade de elementos da lista: 88719
        //início: 18/01/2010 01:07:42.140
        //fim...: 18/01/2010 01:09:44.265
        //tempo.: 00:02:02.1250000

        //sem seed no Random -> Random()
        //completo: 100,0 %
        //quantidade de elementos da lista: 85
        //início: 18/01/2010 01:10:39.953
        //fim...: 18/01/2010 01:10:41.265
        //tempo.: 00:00:01.3125000

        //dois minutos para inserir 88719 elementos (e conferir se o novo existia)
        //um segundo para inserir 85 elementos (mesmo caso)
        
Console.ReadKey();
    
}
}

E não é que funciona?

SQL Server Saturday Night - 2ª edição >>> download da apresentação e demos em C# e VB.NET

Como tinha anunciado aqui, ontem falei sobre o LINQ no evento organizado pelo Alexandre Lopes. Foi uma palestra de nível 100 (básico), onde mostrei o que é e para que serve o LINQ, além de apresentar 56 exemplos em C#. Mostrei exemplos de LINQ to Objects, um pequenininho de LINQ to XML e vários de LINQ to SQL. Falta tempo para tanto assunto.

O webcast foi um sucesso. O seu término era previsto para 23:00, mas comecei a minha apresentação (era a última) às 22:40h. Lógico que não daria tempo... só que fui me empolgando e, quando vi já era mais de meia noite!!! Resumindo: falei por duas horas sem parar... terminei 00:40h. Ô gente que fala...

Uma análise do evento pode ser lida no blog do Alexandre.

Como prometido, já que todos os demos estavam em C#, estou reescrevendo em VB.Net nesse instante (mentira... nesse instante estou fazendo esse post)...

E, como todo programador que se preza, tenho em minha mesa: o note, o celular, uma PET de Coca-Cola, um pão italiano (pequeno, de 400g), presunto Sadia COM CAPA DE GORDURA e provolone... ainda vai demorar um pouquinho, cerca de meia hora, mais ou menos, para começar a escrever o novo código.

(UPDATE 20090118) A apresentação em PPT está em apresentacaoLINQ.zip (284,47 kb). Os demos em C# estão em exemplosLinqCSharp.zip (1,08 mb) e os de VB.Net logo mais estarão aqui.

(UPDATE 20090118) O download do webcast já está disponível e pode ser feito no site da Microsoft

Usei um add-in do Visual Studio (SQL Server Query Visualizer) para poder mostrar o código SQL gerado pelo LINQ to SQL, além de poder executar testes diretamente na ferramenta. O download e instruções de instalação estão no site.

 Bom estudo a todos...

 

Sorteio de livro: Microsoft SQL Server 2008 - Database Development

Pessoal,

Fiz um sorteio entre os leitores que acompanham o blog e o ganhador foi o dono do e-mail [zupp...o.com.br].

Abraços a todos.

O livro será entregue na casa do sorteado, sem custo.

Obs: para assinar o blog, basta clicar aqui.

Aguardem que, em breve, sortearemos o Microsoft SQL server 2008 - Implementation and Maintenance.