terça-feira, 30 de junho de 2009

Impressões da prova 70-536

Aproveitei um voucher que consegui de última hora com o antigo dono, que não teria tempo de utilizá-lo, e fiz hoje cedo a prova 70-536 - Microsoft Application Development Foundation (http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-536&locale=en-us).

Meu feedback da prova: não gostei. :-(

Eu sempre fui a favor de provas que façam o candidato pensar criticamente, resolver problemas complexos (como cenários) e explorar a estrutura/funcionamento mais do que a sintaxe, com o intuito de qualificar os candidatos que possuem uma boa bagagem na tecnologia.
A prova 70-536, composta de 40 perguntas, se mostrou exatamente o contrário. Foi uma prova que focou muito mais em decoreba do que explorar a inteligência do candidato, explorando muitas vezes uma série de classes que poucos vão usar, somente em casos bem específicos.

Qual a importância de alguém aqui saber qual o método para desenhar uma retângulo na tela preenchido com degrade? Ou então saber exatamente o formato do XML gerado pela serialização de uma classe (esse até que vai...)? E que tal ficar criando assemblies dinamicamente? Devo usar GetProcessesByName ou GetProcesses? Devo especificar a fonte de um eventLog antes de chamar o GetEventLogs ou usar um if depois?

Poxa! Em uma série de questões eu fiquei com dúvida na sintaxe/nome dos métodos, ordem dos parâmetros, tipo de retorno, etc. No dia a dia eu não decoro assinatura/tipo de retorno, eu simplesmente uso o intellisense para ajudar.
Além disso ainda havia questões em que o cabeçalho deixava espaço para dúvidas, então eu acabava indo na resposta que eu achava mais correta, mas afirmo que duas respostas poderiam ser utilizadas em sua aplicação. Acho que a MS está tentando diminuir o tamanho a pergunta - o que é bom - mas não pode deixar esse tipo de abertura.

Em contra-partida, não precisei saber nada sobre garbage collector, IL, funcionamento do CLR, programação OO (entenda-se praticamente tudo relacionado a classes), AppDomain, tratamento de exceção, generics, entre outros. Será que isso é menos importante do que a API de drawing?

No fim das contas eu acho que esse tipo de prova privilegia aqueles que pegam braindumps, testkings, etc. Ontem eu peguei os MOCs 2956 e 2957 para dar uma olhada e não entendia porque o material ficava listando todos os métodos/propriedades de uma classe, explicando um a um... que chatice. Agora eu entendo, ele é bem focado na prova, mas não acho que estudar somente por ele te garanta nessa provinha, não sem experiência prévia.

Bom, no fim das contas eu passei na prova e vou tentar tirar o atraso das provas de DEV nos próximos meses, pois na Microsoft eu acabei focando demais no SQL Server. Agora já são 17 provas da MS concluídas e, ainda bem, nunca reprovei em nenhuma, situação que sempre me pressiona quando sento na cadeira. :-) Vamos ver se consigo manter o bom histórico...

PS: não deixe parte da tarde e um pedaço da madrugada para estudar para as provas da MS. Menos de 6 horas de estudo para uma prova normalmente atrapalha...

[]s
Luciano Caixeta Moreira - {Luti}
Chief Innovation Officer
Sr. Nimbus Serviços em Tecnologia Ltda
E-mail: luciano.moreira@srnimbus.com.br

segunda-feira, 29 de junho de 2009

Outro geek está de volta...

Um grande amigo e excelente profissional está de volta a área técnica, voltando a blogar também: http://gilbertouchoa.spaces.live.com/blog/.
Eu espero que ele traga bastante conteúdo de qualidade e colabore para aumentar o nível dos profissionais que trabalham no nosso ramo, uma boa notícia para contrabalancear com as atrocidades que eu ando vendo por aí.

[]s
Luciano Caixeta Moreira - {Luti Nimbus}
Chief Innovation Officer
Sr. Nimbus Serviços em Tecnologia Ltda
E-mail: luciano.moreira@srnimbus.com.br

quinta-feira, 25 de junho de 2009

Gerar registros em forma de colunas? Peça ajuda ao XML!

Bom dia pessoal.
Já vi muita pergunta em fóruns onde o pessoal vive tentando arranjar um jeito de mostrar uma série de registros em uma só coluna, separado por vírgula ou sei lá. Aproveitei uma thread que estava rolando no MSDN para usar de base para esse pequeno artigo...
O problema era pegar a consulta abaixo e retornar o resultado em somente uma linha:

USE MSDB
go

SELECT TOP 2 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'backupset'

-- Consulta retorna:
backup_set_id
backup_set_uuid

-- Resultado desejado:
backup_set_id, backup_set_uuid


Você pode fazer isso com cursores ou inventar outra maluquice qualquer, mas não é nada elegante. Lendo um livro do Itzik Ben Gan eu vi uma abordagem bem elegante que ele propunha e passei a adotá-la em meus treinamentos e dicas.

A consulta que retorna o esperado pode ser escrita da seguinte forma:

SELECT STUFF(
(SELECT TOP 2
N',' + QUOTENAME(COLUMN_NAME) AS [text()]
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'backupset'
FOR XML PATH('')), 1, 1, N'')
go


Aqui você utiliza o FOR XML PATH('') para gerar um XML sem elemento por registro e usa a função text() para recuperar somente o texto do elemento, dispensando as tags que seriam o nome da coluna. Depois é só remover a primeira vírgula e pronto!

Gostou da solução? Eu sim... :-)
Aqui está a thread do MSDN para consulta: http://social.msdn.microsoft.com/Forums/pt-BR/transactsqlpt/thread/35db803c-44ce-4007-8cef-9b36801d86dc/?prof=required

[]s
Luciano Caixeta Moreira - {Luti Nimbus}
Chief Innovation Officer
Sr. Nimbus Serviços em Tecnologia Ltda
E-mail: luciano.moreira@srnimbus.com.br

quarta-feira, 24 de junho de 2009

Como ler os detalhes de um arquivo?

Bom dia pessoal, tudo bem?
O Windows oferece um recurso que eu gosto bastante, que é a possibilidade de adicionar informações extras sobre um arquivo, como mostra a figura 01.



(figura 01)

Mas e se você quiser criar uma aplicação em C# para ler essas informações, o que deve fazer? Se você pensou no namespace System.IO (com eu), vai quebrar a cara. Pelo menos eu não consegui ver uma maneira de conseguir ler essas informações usando os recursos do BCL.

Depois de pesquisar sobre o assunto, eu tinha duas abordagens para resolver meu problema, usar o shell32.dll ou dsofile.dll (DLL disponível para download – “OLE File Property Reader”). Como o shell32.dll vem junto com o sistema operacional (meu palpite), resolvi utilizá-lo mesmo tendo uma interface menos agradável que o dsofile.dll.

Como inicialmente eu não sabia que o nome da DLL era Shell32.dll, somente sabia que deveria utilizar a classe “Shell.Application”, eu tinha que descobrir o local da DLL. Então fui dar aquela tradicional navegada no registro do Windows.
> “HKEY_Classes_Root” > “Shell.Application” > CLSID = (figura 02)



(figura 02)

> “HKEY_Classes_Root” > “CLSID” > “{13709620-C279-11CE-A49E-444553540000}” > InProcServer32 > default = “%SystemRoot%\system32\shell32.dll” (figura 03).



(figura 03)

Confirmado o caminho da DLL, adicionei uma referência COM ao meu projeto, chamada “Microsoft Shell Controls e Automation” (foi mais fácil buscar pelo path). Aí foi só codificar o código abaixo (simplificado, claro!).

1 string caminhoArquivo = @"E:\Temp\01 Rehab.mp3";

2 Shell32.Shell objS = new Shell32.ShellClass();

3 Shell32.Folder pasta = objS.NameSpace(Path.GetDirectoryName(caminhoArquivo));

4

5 if (pasta != null)

6 {

7 Shell32.FolderItem arquivo = pasta.ParseName(Path.GetFileName(caminhoArquivo));

8

9 // No Windows Vista 268 é o número total de propriedades existentes.

10 for (int i = 0; i < 268; i++)

11 {

12 if (pasta.GetDetailsOf(arquivo, i) != "")

13 listBox1.Items.Add(pasta.GetDetailsOf(null, i) + " = " +

14 pasta.GetDetailsOf(arquivo, i));

15 }

16 }


No início eu fiquei estudando as propriedades por posição, mas depois descobri que passando null para o “GetDetailsOf” o nome da propriedade é retornado, claro que leva em conta o idioma do seu sistema operacional.
Sinceramente eu esperava ver isso na BCL do .NET, mas realmente não encontrei. Se alguém souber de outra maneira, compartilhe.

Para não perder o costume deixo aqui uma pergunta.
E se você quisesse criar uma forma de ter, para diferentes tipos de arquivo, uma lista com as propriedades que irá recuperar e com um nome diferente do retornado pelo GetDetailsOf? Por exemplo: MP3 – propriedades 4, 5, 10, 14, 15 e 16, WMV – propriedades 4, 5, 100, 105, 120 e 130. Como você implementaria esse código? Uma solução é encher o seu código de IFs, mas não é nada elegante...

O PDF e o projeto com o código acima estão aqui.



Até um próximo post!

[]s
Luciano Caixeta Moreira - {Luti}
Chief Innovation Officer
Sr. Nimbus Serviços em Tecnologia Ltda
E-mail: luciano.moreira@srnimbus.com.br

quarta-feira, 17 de junho de 2009

Arquivos do webcast - SQL Server 2008 ShowCase

Já faz alguns dias eu participei de um webcast da comunidade apoiado pelo MSDN Brasil, onde abordei o tema "Introdução a análise de desempenho de consultas". Esse webcast foi gravado e está disponível aqui: https://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?culture=pt-BR&EventID=1032414704&CountryCode=BR

Na descrição somente aparece o nome do Marcelo Sinic, mas como foi um evento 3 em 1, existe mais gente por detrás do webcast. Minha parte é a terceira, então você pode ir assistindo aos outros até chegar na minha vez, que começa por volta de 1h 54min. :-)

Os scripts que eu utilizei e o PPT estão disponíveis para download no meu skydrive.





[]s
Luciano Caixeta Moreira - {Luti}
Chief Innovation Officer
Sr. Nimbus Serviços em Tecnologia Ltda
E-mail: luciano.moreira@srnimbus.com.br