SELECT CAST (power(CrazyIdeas, Curiosity) * (RealLifeExperience + MyMistakes)) / FreeTime) AS VARCHAR(MAX)) FROM MyBrain WITH (NOLOCK, INDEX('idx_Neuron')) WHERE ThingsIThinkIKnow in ('SQL Server', 'DB2', '.NET', 'Cloud')
terça-feira, 30 de junho de 2009
Impressões da prova 70-536
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...
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!
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?
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.
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)
> “HKEY_Classes_Root” > “CLSID” > “{13709620-C279-11CE-A49E-444553540000}” > InProcServer32 > default = “%SystemRoot%\system32\shell32.dll” (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
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
Arquivos do último webcast para download
Como o assunto é bem detalhado, o webcast nunca sai igual a uma apresentação presencial, mas acho que o resultado final foi interessante. Como houveram poucas perguntas, no fim fiquei com a sensação de que alguns ouvintes estavam um pouco perdidos... espero que eu esteja errado. :-)
Quer baixar o PPT juntamente com o script que eu utilizei na apresentação? Faça o download através do meu skydrive.
[]s
Luciano Caixeta Moreira - {Luti}
Chief Innovation Officer
Sr. Nimbus Serviços em Tecnologia Ltda
E-mail: luciano.moreira@srnimbus.com.br
terça-feira, 16 de junho de 2009
Por que este plano de execução?
Hoje eu vou trazer um ponto de interrogação para vocês, pois de vez em quando eu também esbarro em alguns detalhes que me deixam muito curioso para entender melhor como o SQL Server funciona. Quer ver?
Durante o treinamento de SQL Server 2008 Internals que eu estava ministrando, nós esbarramos em um plano de execução que se mostrou ligeiramente pior que o outro, em um momento onde eu esperava planos iguais. Teste aí...
USE AdventureWorks2008
go
select *
from sales.salesorderheader
where orderdate < '20010710'
go
select *
from sales.salesorderheader with(index(1))
where orderdate < '20010710'
go
Analisando os planos de execução eu obtive o seguinte resultado:
Notem que a primeira consulta é um pouco mais cara que a segunda (51% vs. 49%) e a diferença está no local onde o filtro (orderdate < ‘20071001’) é aplicado. Na primeira consulta o filtro é aplicado após a varredura as páginas do índice cluster (figura 02), gerando vTables maiores entres os passos do plano, enquanto na segunda consulta o SQL Server aplica o filtro no momento em que as páginas de dados (nível folha) são percorridas (figura 03).
A diferença entre os custos de execução já foi entendida, mas deixo aqui algumas perguntas...
1) Se com a hint eu forcei o SQL Server a usar o mesmo índice que ele escolheu para a primeira consulta, o plano de execução deveria ser o mesmo, não?
2) Porque no primeiro caso o SQL Server optou por fazer o filtro somente no fim? Sempre que penso no otimizador de consultas, imagino ele aplicando os filtros o quanto antes, para evitar vTables maiores e operações de maior custo no decorrer da execução.
Só para te poupar o trabalho, é claro que as estatísticas estão atualizadas e o custo de I/O é o mesmo para ambas as consultas, o tempo é obviamente diferente por conta do tamanho da vTables geradas e do filtro. Quando estiver fazendo os seus testes, recomendo usar o DBCC FREEPROCCACHE para não ficar caindo no mesmo plano de execução que está em cache (e foi parametrizado pelo SQL Server - note o “@1” na figura 01).
E aí, conhece o SQL Server? Então conte para todo mundo o que está acontecendo...
Em um próximo post eu detalho um pouco o comportamento do SQL Server para este caso e tento desvendar parte do mistério.
Nota: reproduzi o comportamento no SQL Server 2008 RTM e SP1. Quem testar em outras versões me conte.
Prefere ler o PDF? Baixe aqui.
[]s
Luciano Caixeta Moreira - {Luti}
Chief Innovation Officer
Sr. Nimbus Serviços em Tecnologia Ltda
E-mail: luciano.moreira@srnimbus.com.br
terça-feira, 2 de junho de 2009
Mais um Webcast no MSDN... Amanhã!
Amanhã eu estou de volta com mais webcast porreta! O tema? "Procedimentos, planos de execução, cache e compilação."
Aqui está o link para o evento: http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032417228&EventCategory=4&culture=pt-BR&CountryCode=BR
Mais informações sobre o webcast:
Produto(s): | Microsoft SQL Server 2008. |
Público(s): | Desenvolvedores e DBAs. |
Apresentador(es): | |
Moderador: | Fabiano Neves Amorim |
Duração: | 60 Minutos |
Data de Início: | quarta-feira, 3 de junho de 2009 12:00 Brasília |
Visão Geral do Evento | |
Muitos programadores trabalham com procedimentos armazenados com o intuito de melhorar o desempenho do seu ambiente, mas sem um entendimento do funcionamento dos planos de execução, da cache de planos e compilação/recompilação no SQL Server, pode ser que esse recurso se vire contra o seu criador. Nessa sessão entenderemos como o SQL Server reutiliza os planos de execução que estão em cache, como o desenvolvedor pode evitar alguns problemas comuns, o que é parameter sniffing, recompilação e como trabalhar com plan guides no SQL Server 2008, sempre destacando melhores práticas na utilização do produto. |
Eu não encontrei o webcast no calendário do MSDN, então infelizmente não sei se alguém está sabendo dele. Portanto, divulguem! Eu também incluí o Fabiano Amorim (http://fabianosqlserver.spaces.live.com/default.aspx) como moderador, para me ajudar com as pergutas de vocês.
Nos vemos amanhã.
[]s
Luciano Caixeta Moreira
luciano.moreira@srnimbus.com.br
luticm79@hotmail.com
segunda-feira, 1 de junho de 2009
Novos treinamentos - SQL Server 2008
Depois de muito trabalho nos últimos dois meses, na semana passada eu acabei de ministrar dois novos treinamentos de SQL Server 2008 que eu mesmo montei. Ainda estamos formalizando um portal de treinamentos da Sr. Nimbus para termos tudo organizado para você, mas fica aqui um gostinho do que estamos preparando para você. Veja as ementas abaixo...
Curso SQL01 - SQL Server 2008: Consultas e modificação de dados utilizando o T-SQL
• Módulo 01: Apresentação do curso
• Módulo 02: Visão geral do processamento lógico e físico de consultas
• Módulo 03: Consultas básicas
• Módulo 04: Subconsultas e Joins
• Módulo 05: Agrupamentos
• Módulo 06: Funções de Ranking e CTEs (Common Table Expressions)
• Módulo 07: Outras operações de conjuntos
• Módulo 08: Modificação de dados
• Módulo 09: Full Text Search
• Módulo 10: Tipo hierárquico
Curso SQL02 - SQL Server 2008: Programação utilizando o T-SQL
• Módulo 01: Apresentação do curso
• Módulo 02: Conceitos básicos de otimização e execução de consultas
• Módulo 03: Visões (Views)
• Módulo 04: Bloqueios, isolamento e transações
• Módulo 05: Tratamento de exceção
• Módulo 06: Objetos temporários e cursores
• Módulo 07: SQL dinâmico
• Módulo 08: Funções definidas pelo usuário (UDFs)
• Módulo 09: Procedimentos armazenados (stored procedures)
• Módulo 10: Disparadores (triggers)
• Módulo 11: Programando com o XML
• Módulo 12: Programando para o CLR
• Módulo 13: Introdução ao Service Broker
• Módulo 14: Programando com o tipo espacial e Filestream
Muita gente pensa que treinamento é tudo igual, não é? Bom, eu acho que não, já ministrei praticamente vinte diferentes treinamentos MOCs (Microsoft Official Curriculum) - N vezes cada um, treinamentos pela Microsoft e participei de outros X como aluno, isto é, acumulei um pouco de experiência. Então tentei embutir nos treinamentos algumas coisas que gosto de ver quando estou na condição de aprendiz.
- Os tópicos não devem somente tocar elementos básicos como sintaxe e construções simples, mas sim explorar em detalhes o assunto.
- Demonstrações, muitas demonstrações. Normalmente passo dois terços de uma aula explanatória com demos, pois assim consigo tornar tangível os conceitos explorados superficialmente com PPTs.
- Laboratórios que não seguem o estilo passo-a-passo for dummies, adicionando a complexidade de problemas encontrados diariamente pelo profissional, sem deixar o laboratório como algo inatingível. O tempo em sala normalmente é insuficiente, então peço que o aluno brinque em casa também.
Apesar de cobrir elementos básicos, quem participou do treinamento sabe que entro a fundo nos assuntos, então quando falamos - por exemplo - de consultas T-SQL, acredito que até aqueles que já conhecem bem o T-SQL podem se surpreender com algumas coisas apresentadas.
Se você nunca brincou com o T-SQL e vai participar do treinamento, aconselho deixar um tempo maior para estudar os temas, pois recomendo que o público já tenha um contato básico com a linguagem para acompanhar alguns detalhes apresentados.
No fim de cada treinamento temos por objetivo que a pessoa não saia de sala com aquele sentimento de que "na vida real isso é muito diferente" e possa utilizar todos os scripts disponibilizados.
Depois trago mais novidades.
[]s
Luciano Caixeta Moreira
luciano.moreira@srnimbus.com.br
luticm79@hotmail.com