sexta-feira, 11 de junho de 2010

Quer ser um mentee na Sr. Nimbus?

Por definição mentee em inglês significa "a person who has a mentor", então podemos chamar essa pessoa de pupilo ou aprendiz. Dito isso, complemento...

As últimas semanas/meses têm sido um bom desafio para a Sr. Nimbus, estamos com novos projetos, tentando criar nosso ritmo de trabalho e acredito que tenho aprendido bastante desempenhando um duplo papel, o de profissional de TI e empresário.

Diferente de muitas empresas fizemos uma escolha clara na Sr. Nimbus que é nos preparar para um crescimento controlado e a passos pequenos, procurando nos consolidar através da excelência técnica ao invés da excelência comercial (sim, somos péssimos vendedores). Trabalhando nessa linha queremos que os processos internos sejam responsáveis e maduros, de forma a superar expectativa daqueles que trabalham na empresa e dos futuros integrantes desse time.

Dentro desse ensejo e para evitar fazer as coisas às pressas, estou iniciando uma busca por um profissional que deseje ser meu mentee na Sr. Nimbus e que no futuro possa compor o quadro da empresa. Trocando em miúdos:

A Sr. Nimbus procura um profissional com valores semelhantes aos da empresa e com potencial para crescer profissionalmente, sob orientação do Luti e eventualmente de outro consultor sênior.

Hoje nosso "foco" é a plataforma de desenvolvimento da Microsoft, que é uma gama muito ampla de possibilidades, então poderia restringir ao .NET Framework, Visual Studio, Sharepoint, Azure e, não podia ficar de fora, SQL Server. Muita coisa, impossível saber tudo e, claro, que sendo meu mentee e pela características das ofertas atuais da empresa, existe uma maior possibilidade de brincarmos por mais tempo com o SQL Server.

No fim é uma boa chance para todos aprendermos e, quem sabe, criarmos um futuro consultor e expert na Sr. Nimbus. Como toda empresa startup, temos caixa pequeno e muita vontade, então se você é um geek de carteirinha, quem sabe não se encontra na nossa empresa?

Interessado?
Mande seu CV para luciano.moreira@srnimbus.com.br.

[]s
Luciano Caixeta Moreira - {Luti}
Sr. Nimbus Serviços em Tecnologia Ltda
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm

quinta-feira, 27 de maio de 2010

Forward pointer do forward pointer?

Prefere o PDF? Baixe aqui.



(...)

Nova semana de internals, muitas dúvidas e discussões para lá de profundas, então vou dormir menos do que as parcas horas tradicionais para escrever um artigo rápido.

Básico: em uma tabela heap quando um registro é modificado e ele não cabe mais na página em que se encontra, o SQL Server move o registro para outra página e deixa na página original um ponteiro para a onde o registro foi levado. Esse registro é o forward pointer ou forward stub, e ajuda o SQL Server a evitar uma série de alterações mantendo o RID (fileId, PageId e SlotId) sem ser alterado.

Pergunta: Se eu tiver um forward pointer e o registro na nova página sofrer outra atualização que o faz crescer mais uma vez, novamente não cabendo na página atual, quando ele for colocado em outra página, teremos um forward pointer de um forward pointer?

Resposta de sala: a resposta by the book é não, seria extremamente ineficiente se o SQL Server mantivesse uma listagem encadeada de forward pointers para um único registro. Porém, nunca fiz esse teste (não que eu me lembre), então fica a resposta teórica.

Verificando se eu falei besteira dentro da sala de aula...

Para manter minha sanidade e conseguir publicar o post sem deixá-lo pela metade (como eu fiz com os últimos seis), vou tentar ser breve e usar comentário no próprio script, então qualquer dúvida grite!

/*
Forward pointer de Forward pointer?
*/
USE Inside
go

IF Exists (SELECT * FROM sys.tables WHERE [name] = 'RegistroGrande')
DROP TABLE RegistroGrande
go

CREATE TABLE RegistroGrande
( ColA int IDENTITY,
ColB varchar(1600),
ColC varchar(1600),
ColD varchar(1600));
GO

INSERT INTO RegistroGrande
VALUES (REPLICATE('a', 1600), '', '')
INSERT INTO RegistroGrande
VALUES (REPLICATE('b', 1600), '', '')
INSERT INTO RegistroGrande
VALUES (REPLICATE('c', 1600), '', '')
INSERT INTO RegistroGrande
VALUES (REPLICATE('d', 1600), '', '')
INSERT INTO RegistroGrande
VALUES (REPLICATE('e', 1600), '', '')
GO

INSERT INTO RegistroGrande
VALUES (REPLICATE('f', 1600), '', '')
INSERT INTO RegistroGrande
VALUES (REPLICATE('g', 1600), '', '')
GO

/*
Primeiro inserimos alguns registros e nesse momento temos duas páginas alocadas, uma praticamente cheia e outra parcialmente cheia.
*/

DBCC IND(Inside, RegistroGrande, -1)
/*
PageFID PagePID IAMFID IAMPID
1 173 NULL NULL
1 151 1 173
1 174 1 173
*/

-- Analisando as páginas de dados (não me importa a IAM), podemos ver os registros inseridos e
-- no cabeçalho a quantidade de espaço livre por página
DBCC TRACEON(3604)
DBCC PAGE(5, 1, 151, 3)
DBCC PAGE(5, 1, 174, 3)

-- Quando fazemos um update em um registro que está na página 151 (lotada) e ele não cabe mais na página atual,
-- temos um forward record.
UPDATE RegistroGrande
SET ColC = REPLICATE('X', 1200)
WHERE ColA = 3

-- Em qual página que esse registro vai parar?
DBCC PAGE(5, 1, 151, 3)

/*
Slot 2 Offset 0x1feb Length 9

Record Type = FORWARDING_STUB Record Attributes = Record Size = 9

Memory Dump @0x000000000E54BFEB

0000000000000000: 04ae0000 00010002 00†††††††††††††††††.®.......
Forwarding to = file 1 page 174 slot 2
*/

-- Muito bem SQL Server, viu que existe espaço na página 174 e mandou o registro grande para ela
-- E de quebra o modo de vizualização 3 do DBCC PAGE já mostra a página, nada fazer essa tarefa complicadíssima
-- de converter hexa para decimal.

-- Vamos ver se o registro apareceu por lá?
DBCC PAGE(5, 1, 174, 3)

-- Lindo, olhando o offset do slot 2 encontramos um registro cheio de CCCCCCCCs e XXXXXXs.
-- MAASSSS, como o m_freeCnt está com o valor 2031, quero inserir um registro para diminuir o espaço
-- livre nessa página.

INSERT INTO RegistroGrande
VALUES (REPLICATE('h', 1000), '', '')
GO

-- Beleza, o registro dos hhhhhhhhs está na página 174 e m_freeCnt em 1014.
DBCC PAGE(5, 1, 174, 3)

-- De quebra, olhando para o DBCC IND vemos que as mesmas páginas de dados originais 151 e 174
-- continuam alocadas, e mais nenhuma!
DBCC IND(Inside, RegistroGrande, -1)

-- O que acontecerá quando eu atualizar o registro novamente, de forma que ele não caiba mais na página atual?
-- Uma coisa é certa: O SQL Server vai precisar de uma nova página para esse registro!
-- Agora, OU ele atualiza o forward pointer para o novo RID OU ele mantém um ponteiro de ponteiro.

update RegistroGrande
set ColD = REPLICATE('Y', 1200)
where ColA = 3
go

-- Tem que aparecer uma nova página...
DBCC IND(Inside, RegistroGrande, -1)
/*
PageFID PagePID IAMFID IAMPID
1 173 NULL NULL
1 151 1 173
1 174 1 173
1 175 1 173
*/

-- Beleza, se essa página não aparecesse algo estaria muito errado... :-)

-- Primeiro, vamos verificar que o registro que está na nova página (a 175) é realmente o registro forwardado
-- (eu ia até substituir essa palavra, mas ela ficou tão ridícula que vou manter - FORWARDADO!)

-- Forwarded record??
DBCC PAGE(5, 1, 175, 3)

-- SIM! Um registro cheio de CCCCs, XXXXXs e YYYYYs em uma página só com o slot 0.

-- E agora a resposta da pergunta.... que toquem os tambores!!!!
DBCC PAGE(5, 1, 151, 3)
/*
Slot 2 Offset 0x199c Length 9

Record Type = FORWARDING_STUB Record Attributes = Record Size = 9

Memory Dump @0x000000000DF5B99C

0000000000000000: 04af0000 00010000 00†††††††††††††††††.¯.......
Forwarding to = file 1 page 175 slot 0
*/

/*
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊÊ!!!!!!
Uma salva de palmas para o SQL Server!

Ao invés de manter um forward pointer de um forward pointer, o que potencialmente poderia virar um "FP -> FP -> FP" ou
"FP -> FP -> FP -> FP -> FP -> FP -> FP ..." (entendeu, né?) o SQL Server atualizou o ponteiro na página de origem.

O que antes era um RID para 1:174:2 virou 1:175:0.
*/

-- Por curiosidade, o que ficou no antigo slot do registro?
DBCC PAGE(5, 1, 174, 3)

-- Com essa visualização, nada!
-- Mas com a visualização 2...
DBCC PAGE(5, 1, 174, 2)

-- Vemos que o conteúdo do antigo registro continua lá dentro da página, mas o espaço livre no cabeçalho é atualizado
-- e pelo slot array vemos que o slot 2 não está mais sendo utilizado.
/*
OFFSET TABLE:

Row - Offset
3 (0x3) - 6155 (0x180b)
2 (0x2) - 0 (0x0)
1 (0x1) - 1711 (0x6af)
0 (0x0) - 96 (0x60)
*/

/*
Por fim eu respondi certo a pergunta do aluno e agora está comprovado!
Curtiu, mano? (aproveitando que estou em SP)
*/

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

sexta-feira, 7 de maio de 2010

Internals em São Paulo - nova data

Depois de tanto tempo sem escrever eu até fico sem graça de voltar aqui sem um post técnico, mas não posso deixar de fazer esse anúncio. Curiosamente, esse é o post número 100 deste blog e fico orgulhoso de ser sobre uma grande paixão, internals do SQL Server.

Está confirmado o treinamento SQL03 - SQL Server 2008 Internals que ocorrerá em São Paulo, nos dias:

18/05 – De 14:00h a 18:00h
19/05 – De 8:30 a 18:00h (1:30h de parada para almoço)
20/05 – De 8:30 a 18:00h (1:30h de parada para almoço)
25/05 – De 14:00h a 18:00h
26/05 – De 8:30 a 18:00h (1:30h de parada para almoço)
27/05 – De 8:30 a 18:00h (1:30h de parada para almoço)

Dessa vez o treinamento será na Paulista, perto do Metrô, então deve facilitar a vida de muitos.
Ainda temos algumas vagas, se você é um profissional que ir além da média e procura por um treinamento profundo e diferenciado de SQL Server (nada de MOCs superficiais!), não pode deixar de participar.

[]s

Luciano Caixeta Moreira - {Luti}
Chief Innovation Officer
Sr. Nimbus Serviços em Tecnologia Ltda - www.srnimbus.com.br
luciano.moreira@srnimbus.com.br
www.twitter.com/luticm

terça-feira, 20 de abril de 2010

Impressões da prova 70-516

Ontem eu fiz a prova 71-516 Accessing Data with Microsoft .NET Framework 4 (71 pelo fato de ser beta, depois ela vira 70), que é a prova beta do ADO.NET 4.0.

Para quem nunca fez uma prova Beta, é um experiência super legal mas bem cansativa, pois são 85 questões e você têm até quatro horas para cumprir todas as etapas (efetivamente para as questões, são 175 minutos).

A prova da Microsoft normalmente possui 50 questões, mas na beta eles colocam uma série de questões (algumas bem repetidas) para uma análise mais detalhada do resultado. Não existe garantia de que as questões serão incluídas na prova definitiva e nem que uma questão contará para a pontuação da sua prova.

Não tive tempo de estudar para a prova, então somente dei uma olhada conteúdo da prova para ter uma noção do que esperar. Aqui estão os detalhes: http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-516&locale=en-us

Como era de se esperar, choveu Entity Framework na prova.
Se pudesse chutar aqui uma porcentagem seria:

5% outros - criptografia, configuração serviços e stopwatch class.
8% LINQ to SQL - Operações de carregamento, atualização dos dados no banco e gerenciamento de conflito.
5% XML - Achei que cairia mais de XML, mas no geral foi manipulação de documentos e Xpath.
15% WCF Data Services - criar suas próprias consultas, query interceptors, utilização do proxy, configuração do serviço de dados, escrever chamada por URL, escolher qual requisição HTTP está bem formada, etc.
10% ADO.NET Tradicional - Utilização de DataSets com merge, fill e suas opções, trabalhar com DataReader e dados binários, CommandBehavior, entre outros.
7% LINQ - Como escrever consultas com LINQ (alguma bem chatinhas), integração com objetos, datasets, etc.
50% Entity Framework- Muita manipulação de POCO, gerenciamento de contexto e carregamento dos dados, attach, add, MergeOption, consultas direto no banco, incluir procedures, criar tipos complexos, lazy loading, enfim, muita coisa mesmo do EF.

Tirando uma questão ou outra que estava bem estranha (não sei se por ser beta ou por desconhecimento), eu gostei bastante da prova. Algumas questões deixam em aberto a melhor opção e você têm que voltar no cabeçalho para ler aquela frase que te dá a dica da certa, outras exigem que você conheças efetivamente todas as opções e como funciona as tecnologias, sem ser uma decoreba pura de assinatura de métodos.

Classifico a dificuldade da prova como média. Alguém que já trabalhou com o ADO.NET nas versões anteriores e já está alguns meses trabalhando efetivamente com o EF4 em um projeto, não deve ter muita dificuldade na prova. O lado do WCF Data Services pode ser coberto com algumas sessões e um estudo pontual.

Realmente não sei a prova beta focou em novas questões e no fim das contas a versão definitiva terá um maior equilíbrio entre as tecnologias, mas acho natural que boa parte da prova seja voltada para o Entity Framework.

Como não consegui estudar para a prova não fiz ela com muita confiança, então não consigo avaliar com firmeza se passei ou não. O jeito vai ser esperar os tradicionais 3 meses pelo resultado. Só sei que não queria uma reprovação no currículo...

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

sexta-feira, 16 de abril de 2010

Evento em BSB e recursos para o SQL Server 2008 R2

Estou sumido, não é? Acontece…

Ontem em Brasília aconteceu um evento organizado pela Microsoft, o I Fórum Microsoft para Gerentes de Sistemas. Eu recebi o convite e tive o prazer de apresentar a sessão - "SQL Server 2008 R2: Manipulando dados em tempo real com o StreamInsight e ciclo de vida da informação com o Master Data Services". Incrivelmente minha sessão não tinha o maior título do evento.

O interessante foi o trabalho feito pela empresa na hora de convidar os participantes, encontrei um público de altíssimo nível, muitos rostos conhecidos e pessoas que realmente têm a chance de fazer acontecer e levar a mensagem para o alto escalão das empresas. Além disso, encontrei diversos profissionais que tenho profundo respeito pela capacidade técnica e visão de negócio, excelentes conversas de corredor e encontro com os antigos amigos da Microsoft.

Conversei sobre o Azure, VSTS 2010, SQL Server 2008 R2, SQLServerDF, e como alguns orgãos estão trabalhando com as novidades da Microsoft. Já sei até de cliente planejando implantar o SQL Server 2008 R2 no segundo semestre. Fantástico.

O evento também acontecerá no Rio de Janeiro e São Paulo, onde eu também estarei presente e espero encontra um excelente público. Ontem em Brasília tivemos mais de 150 pessoas ao longo do dia.

A Microsoft anunciou no evento que o SQL Server 2008 R2 será lançado na próxima semana! Agora é esperar para fazer o download.


Recursos

No SQL Server 2008 R2 estou dando uma atenção especial ao Master Data Services e StreamInsight.
Outros recursos já estão sendo demonstrados por aí, destaco o trabalho do Thiago Zavaschi com o PowerPivot (http://zavaschi.com/).

Se você quer entender o que o R2 está trazendo, aconselho partir da página do produto: http://www.microsoft.com/sqlserver/2008/en/us/r2.aspx. A partir daí, navegue pelas tecnologias e comece a entender qual solução ataca qual cenário, pois precisamos saber como o negócio ganha com o produto, e não somente olhar para a tecnologia sozinha.

Querendo ver mais detalhes sobre os recursos, vídeos e demos? Baixe o training kit do SQL Server 2008 R2: http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=fffaad6a-0153-4d41-b289-a3ed1d637c0d. Note que este está em constante manutenção e desde Março já tivemos 3 releases de atualização do mesmo, então fique monitorando por novidades.

Não pretendo escrever nesse post o que é cada uma das tecnologias, para isso estou escrevendo dois artigos (sobre MDS e SI) que serão publicados em revista.


StreamInsight

Gravei um webcast para o MSDN sobre o assunto:
https://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?culture=pt-BR&EventID=1032440208&CountryCode=BR
O whitepaper de introdução é este aqui: http://download.microsoft.com/download/F/D/5/FD5E855C-D895-45A8-9F3E-110AFADBE51A/Microsoft%20CEP%20Overview.docx
A documentação do CTP de novembro é bem pequena e você lê em uma tarde, merece o investimento de tempo.
Blog do time de produto: http://blogs.msdn.com/StreamInsight
Showcase: http://www.microsoft.com/showcase/en/US/details/06033f9a-dab6-4a40-b0cc-a08460419183


Master Data Services

Em Maio vou gravar um webcast para o MSDN sobre o assunto, aguarde mais informações nesse blog.
Whitepaper sobre MDM: http://msdn.microsoft.com/en-us/library/bb190163.aspx
Blog do time de produto: http://blogs.msdn.com/mds/
Showcase: http://www.microsoft.com/showcase/en/US/details/e28d124b-0493-494f-80ff-40ac10a8413f
Documentação ainda é pequena, também fácil de ler numa sentada e serve mais como referência da estrutura.

** UPDATE **
Já ia esquecendo de mais uma coisa, lançaram um e-book sobre o SQL Server 2008 R2 e, o melhor, digratis! http://blogs.msdn.com/microsoft_press/archive/2010/04/14/free-ebook-introducing-microsoft-sql-server-2008-r2.aspx

E só o início sobre MDS e StreamInsight... Boa leitura.

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