Rumo a Cuba

Não, não vou a Cuba.. se bem que deve ser porreiro! =)
 
Venho antes deixar um alerta para o caso do Luís, da Covilhã, que precisa de ir a Cuba para fazer exames/tratamentos. Actualmente anda numa cadeiras de rodas, depois de um incidente "diferente" do habitual; vejam a história aqui. Sei que é um caso entre muitos outros mas, por um lado a história chegou-me por um amigo MSP..por outro, mostra bem como às vezes o sistema de saúde português desiste facilmente das pessoas, quer porque falta de vontade, quer por falta de recursos. Não se perde nada em passar palavra..se puderem, façam isso 🙂
Advertisement

TechDays08 – Day 3

 
14/Março – 9h10 – CCL: terceiro e último dia de TechDays08. À entrada junto-me a alguns dos MSP e seguimos para a primeira sessão.
 
DEV03 – Parallel Extensions for .NET Framework 3.5
 
Nos último anos a evolução nos processadores deixou de ser vertical (aumento da velocidade de clock) e passou a ser maioritariamente horizontal (aumento do número de processadores/cores). Isto acontece porque começou a ser impossível aplicar a Lei de Moore (todos os anos duplicar o número de transistores que se conseguem colocar num dado circuito integrado). O Bart de Smet, orador desta sessão e que tinha um aspecto nerd ao extremo (=P), disse uma curiosidade um pouco inacreditável: actualmente, a densidade eléctrica num processador (Volt/cm2) já passou a de um reactor nuclear!! Com o crescimento horizontal passa a ser necessário desenvolver aplicações que tirem partido das novas possibilidades de paralelização. Contudo, explorar essas possibilidades pode não ser fácil devido aos problemas por ela acarretados (concorrência, coerência de cache, …), que tornam a programação multi-thread um pouco difícil. É muitas vezes necessário realizar sincronização manual através de mecanismos bastante pesados (ou de soluções mais complicadas, para os evitar). As parallel extensions têm por objectivo tirar partido dos múltiplos processadores mas reduzir as sincronizações manuais, abstraindo o programador de alguns problemas deste tipo de programação. Por outro lado, tornam alguns mecanismos mais light weight , sendo que algumas das funcionalidades deverão ter suporte directo nas próximas versões das "linguagens.NET".
 
As extensões são constutuídas por dois elementos: a Parallel Task Library (PTL) e PLINQ.
 
 
Na PTL, uma das coisas mais fáceis de começar a usar são os parallel loops. Tão simples como:
Using System.Threading.Parallel;
(…)
Parallel.For(int i = 0; i < X; ++i)
{
DoSomething(i);
}
Este modelo deve aplicar-se quando as iterações são independentes, porque se existir estado partilhado será necessária sincronização e não haverá tanta vantagem em paralelizar. Um pormenor importante (e secalhar óbvio) é que a instrução é síncrona, ou seja, o fio de execução só continua quando a instrução terminar. Pode terminar "normalmente" ou com excepção. No caso de excepção, há que ter em conta que podem existir outras iterações do ciclo já em execução paralela.
 
A PTL expõe ainda conceitos semelhantes aos do ThreadPool.QueueUserWorkItem e da interface IAsyncResult, mas com um nível de abstracção maior. As tarefas, agora representadas pela classe Task, deixam de ter uma relação tão próxima com as threads que as executam, sendo os resultados dados pela classe Future<T>, que representa um resultado futuro e permite sincronização (espera, polling). A classe TaskManager é responsável pela execução das tarefas e gere uma fila para cada processador disponível. A cada um destes está dedicada uma thread que vai consumindo items da fila, evitando assim possíveis problemas de starvation e o peso de comutação de threads. Como não se pode prever o número de tarefas que a fila de cada processador terá é utilizado um esquema mais dinâmico, designado work stealing, em que cada processador pode retirar tarefas da fila dos outros. Todas as classes utilizadas para implementar estes mecanismos são o mais lock-free possível, e algumas delas são públicas e podem ser utilizadas para outros fins. Estão disponíveis algumas colecções thread safe lock free, novos locks (spin lock) e outras estruturas de sincronização (barrier).
 
O outro componente das extensões, o PLINQ, é uma implementação do LINQ que permite paralelizar a execução de queries. Existe um query analyser que é responsável por determinar quais as partes de uma query que podem ser paralelizadas; por exemplo, num join o fetch das duas sources pode ser feito em paralelo, enquanto que um order by não é paralelizável. O PLINQ só é utilizado no LINQ to objects e LINQ to XML porque não faz sentido paralelizar queries a uma BD; o SGBD consegue fazer melhores optimizações se tiver uma "visão geral" da query.
 
 
 
 
Para o slot seguinte tinha previsto ir à sessão WEB10 – Aplicações web ricas com ASP.NET AJAX e web client software factory. A sala era pequena e estava a abarrotar. Como não havia mais nenhuma que me agradasse mesmo, acabei por ficar com alguns MSP na conversa e aproveitar para almoçar um pouco mais cedo. Ah e ir buscar o meu Vista Ultimate SP1 =P Entretanto, o stand da Microsoft parecia a cantina dos MSP…
 
Na primeira sessão da tarde fui a um hands on lab sobre LINQ. Mais um barrete! Devia ter aprendido da primeira vez. Se as formações da Rumos são como aqueles hands on..enfim.. Saí passado um pouco e fui para outra sessão:
 
WEB05 – ASP.NET Futures – Dynamic Data Controls and Astoria Services
 
 O auditório era enorme e estava praticamente cheio! Dei umas voltas e lá ao fundo encontrei um lugar. Não se via quase nada (!), mas ainda deu para apanhar algumas coisas. A sessão foi dada pelo Matt Gibbs, um dos gurus do ASP.NET, e já levava 20 minutos de avanço.. Falava-se de um novo "modelo" para aplicar a páginas "data oriented". A ideia é definir uma vez quais os controlos que representam cada tipo do modelo de dados subjacente (Field Templates). Depois, cada vez que é necessário apresentar um tipo de dados é usado o controlo definido, de forma automática. Por exemplo, a escolha de uma data pode ser feita através da escrita numa textbox. Se pretendermos mudar a forma como todas as datas são escolhidas, basta indicar que a data passa a ser representada por um novo controlo; um asp:calendar, por exemplo. Ah, isto tendo em conta que a associação também depende do "modo": consulta ou edição. É ainda possível definir Page Templates, ou seja, a forma como todas páginas correspondentes a uma dada acção são apresentadas. Claro que dépois podemos criar excepções. Resumindo, a ideia é associar os dados à forma como devem ser apresentados, tendo em conta a acção que está a ser realizada (leitura/escrita).
 
A segunda parte da sessão foi sobre ADO.NET Data Services ou, como são conhecidos, Astoria Data Services (project Astoria), que vêm responder à pergunta:
 
if you could provide a dead-simple way of programming against a relational data store that resides on the internet,
what should the programming model look like? Could it be simpler than SOAP-based data access programming?
 
Os serviços fornecem uma interface REST-based – ou seja, à base de URLs – para aceder a uma BD SQL Server. O mapeamento é directo! E não precisamos dos WSDL, tipos auxiliares, etc. Por exemplo, aproveitando os samples que a Microsoft colocou online:
 
 
É um URL? Sim! É uma query? Sim! O resultado é um bocado de xml com todos os produtos daquela categoria. Ainda podíamos, por exemplo, adicionar no fim "[1]" para obter apenas o primeiro produto. Fica bastante simples, podendo ser mais adequado a comunicações server-to-server.
 
 
 
Para o próximo slot não tinha escolhido nenhuma sessão. Decidi na hora, e acabei por ir a esta:
 
VST03 – Hardcore debugging e profiling de aplicações .NET
 
Produção vs desenvolvimento: como recriar carga nos servidores e concorrência? Muitos problemas surgem só na fase de produção e podem não ser fáceis de detectar. Por outro lado, os ambientes de desenvolvimento por si só podem não dar suporte de debug suficiente. Nesta sessão foram apresentadas algumas ferramentas para debug mais "aprofundado" de aplicações .NET, algumas das quais utilizadas pela equipa de suporte da Microsoft, à qual pertenciam os oradores. Pretende-se identificar memory leaks (existem sim! erros do programador? =P), ter um log de chamadas a APIs, detectar deadlocks, fazer dumps de memória, etc.

Das ferramentas referidas houve 3 que vale a pena referir:
 
  • WinDbg – ferramenta com interface tipo consola para debug "nativo" e que tem um módulo para debug "managed". Permite os habituais breakpoints, ver o stack das várias threads, qual a thread que lança excepção, …
  • SOS: interface mais user friendly para o WinDbg. Permite, por exemplo, ver todos os objectos no heap na forma de tree view.
  • Hawkeye: permite inspecção em tempo real de elementos de UI em .NET. É a versão managed do WinSpy.

Junto com o WinDbg é fornecida uma dll que pode ser integrada nas aplicações .NEt para gerar dumps de memória de forma simples, para depois serem enviados para o maild a empresa, por exemplo. Algo semelhante ao que acontece com aquelas janelas do Windows  que, quando há um erro, perguntam se queremos enviar informação.

Foi informação que pode não ser útil actualmente, mas que no futuro, no mundo do trabalho, vai dar bastante jeito. Valeu a pena!

 
 
 
Última sessão do dia; e do evento! Não quis perder a oportunidade de saber umas coisas sobre uma das partes que me faltava explorar no LINQ.
 
DEV08 – LINQ to Anything: Custom LINQ Providers
 
Acabei o dia com o mesmo orador que comecei, o Bart de Smet. Já tinha percebido que ele dominava, por isso a probabilidade de ser uma boa sessão era alta =P Fui um pouco mais cedo, e aproveitei para fazer 1 ou 2 perguntas que ficaram pendentes da sessão da manhã. Para perceber a sessão convinha saer algumas coisas novas do C# 3.0. Para as relembrar, o orador começou com um quiz de 5 perguntas sobre tipos anónimos, initializers, lambda expressions… Acertei 3 =\ mas a última era manhosa =P
 
O orador começou por referir dois projectos de implementação de providers disponíveis no codeplex: LINQ to Sharepoint e LINQ to Active Directory; este último, foi a base da sessão. Existem 2 tipos de queries, conforme o tipo sobre o qual são executadas:
 
  • IEnumerable<T> –> Enumerable: representa queries sobre dados em memória; as lambda expressions são substituídas por métodos anónimos (delegates).
  • IQueryable<T> –> queries sobre outras fontes de dados; em vez de delegates são utilizadas expression trees.

As expression trees são uma representação lógica das labda expressions que é depois avaliada em runtime para gerar a query sobre a fonte de dados alvo. E isto é o fundamental da implementação de providers LINQ! O processo tem início numa implementação de IQueryProvider que através do método CreateQuery(Expression s) permite devolver uma representação da query já construída (IQueryable).

Uma ferramenta que pode dar jeito não só neste cenário (alguém vai implementar providers..?), mas também em debug é o Expression Tree Viewer, que serve para aquilo que o próprio nome diz. É um sample que vem com  VS; basta compilar e adicionar aos visualisers

Para terminar, o orador deixou alguns tips & tricks para este processo:

  • Mapeamento de operadores – as queries podem ter chamadas a métodos não suportados na fonte de dados alvo.
  • Se queremos suportar operadores que não existem em C# ou VB, podemos definir novos extension methods.
  • Quando um operador não é suportado e lançamos uma excepção, não nos podemos referir à linha de código fonte porque as expression trees são independentes disso! Devemos usar um trace "posicional", ou seja, conforme a posição do elemento da expression tree.
  • Pode ser possível fazer normalização; por exemplo, agrupar chamdas consecutivas ao "where".

Mais uma boa sessão, com um orador muito prestável e seguro do que estava a dizer. E pronto..depois de mais umas fotos da praxe..lá se acabou o TechDays08.

 


 
 
Em jeito de balanço final, foi um evento 5 estrelas e acima de tudo uma óptima oportunidade; No geral as sessões foram muito boas (algumas assim..+/-..foram compensadas =P) e os oradores também. Fica o conhecimento sobre alguns temas bastante actuais – outros nem tanto..mas igualmente úteis –  e toda a experiência com os MSP e o pessoal da Microsoft. O student day foi também um sucesso: pelas opiniões que recolhi, o pessoal aproveitou bem e gostou. Sem dúvida, um evento a repetir. Os únicos pontos menos bons foram mesmo as filas para o almoço e alguns dos hands-on labs..
 
 
TechDays08 – Eu fui!
 
E finalmente acabo esta série de posts…ufa! Espero que possa por um lado transmitir a experiência e por outro um pouco do conhecimento.. Vejam também os blogs de outros MSP (na lista à esquerda) e alguns vídeos do evento.
 
 

TechDays08 – Day 2 – Student Day

 
Para este dia as expectativas estavam em alta. Previa-se uma multidão, devido aos 500 estudantes que se inscreveram. Mais vagas houvesse, e mais estudantes participavam..a lista de espera tinha quase 200 pessoas! A organização ficou impressionada com a mobilização que os MSP conseguiram. Mas será que todos os estudantes vêm? Será que vão gostar das sessões?
 
13/Março – 8h30 – CCL: Depois de apanhar 2 colegas meus do ISEL, lá chegámos à Junqueira. Alguns outros estudantes do ISEL já lá estavam (!), mas por esta hora ainda não havia a tal "multidão", pelo que o check-in foi rápido. Demos uma volta por lá, contei algumas partes do dia anterior, jogou-se um pouco de XBOX e chegou a hora de ir para a primeira sessão.

Eu acabei por não ir a nehuma sessão das previstas para os estudantes porque existiam outras mais interessantes em paralelo. Alguns dos meus colegas também trocaram sessões da academic track por outras e, felizmente, não houve problemas de mobilidade, permitindo que os estudantes aproveitassem melhor o dia. Com essa mobilidade, o dia foi passado ora com pessoal do ISEL ora com MSP, sempre a rodar, porque cada um andava por onde preferia.
 
WEB06 – ASP.NET AJAX – Optimizações e Extensibilidade da Framework
 
Esta foi a minha primeira sessão da manhã, dada pelo Pedro Lameiras e pelo Rui Estevão da Viatecla. A sessão não correspondeu totalmente às minhas expectativas, mas houve coisas interessantes. O Pedro Lameiras começou por falar nos modos de actualização do Update Panel, focando, claro, a actualização condicional. Esta permite definir as condições de actualização de cada painel, ao contrário do comportamento por omissão, em que todos os paineis são actualizados quando um deles causa um postback. Depois, falou na "classe" PageRequestManager, incluída na biblioteca de javascript, que permite interagir com o estado dos pedidos assíncronos no cliente. Disponibiliza métodos para saber se há pedidos AJAX em curso, por exemplo, e alguns eventos relativos ao estado do pedido. Por exemplo, o evento initialize_request, que será o sítio indicado para fazer validações de dados, evitando assim pedido que vão "falhar" no servidor; ou ainda o end_request, que permite saber se existiram excepções no servidor durante a resposta ao pedido.
 
A segunda parte da sessão ficou a cargo do Rui Estevão, um pouco mais dinâmico que o colega. Desta segunda parte saliento duas coisas. Em primeiro lugar, o método ScriptManager.RegisterDataItem, que permite associar a um controlo uma string JSON. Esses dados são depois enviados para o cliente juntamente com o resultado do render do UpdatePanel. No cliente é depois possível obter o objecto correspondente através do método get_dataItems presente no parâmetro args do evento PageLoading. Em segundo lugar, a existência de algumas "ajudas" para trazer o modelo OO para o javascript. A biblioteca de javascript permite registar namespaces, aos quais são adicionados objectos função que representam os tipos. Sobre o namespace, o método registerClass permite definir qual a classe base de uma outra classe. São ainda incluídos alguns métodos para realizar acções tipicas do modelo OO, como initialize_base e call_base_method.
 
 
No final da sessão, fui até à zona "terra" (pavilhão central onde estavam os expositores) e já se notava "a multidão"! Imaginei logo como seria a confusão  ao almoço…
 
 
INT02 – Utilização do Information Card Model e Windows CardSpace para Controlo de Acessos em ASP.NET e WCF
 
Esta sessão foi dada pelo Pedro Félix, professor do ISEL. O ambiente era quase o de uma aula de Segurança Informática, porque o pessoal do ISEL estava lá quase todo, incluindo outros professores. Estávamos "em casa" =P Já sabiamos com que contar relativamente à dinâmica e clareza da apresentação, e mais uma vez, não desiludiu. O assunto era novo para mim – apesar de alguns conceitos envolvidos não o serem, por causa das aulas de Segurança Informática – e a sessão permitiu ficar com bom conhecimento do modelo em causa.
 
Actualmente, a vertente mais comum no controlo de acesso a serviços ou aplicações web é um modelo baseado em passwords, que implica muitas vezes registos iguais em vários sítios. Por outro lado, é uma indentidade "auto-assertada", ou seja, o utilizador é totalmente responsável pela sua definição. Uma outra hipótese é termos identidades fornecidas por uma 3ª entidade, que afirma que um utilizador tem dadas características (claims). Cabe depois ao utilizador decidir qual a identidade que quer revelar em cada contexto (user centric identity). O Identity MetaSystem é um modelo abstracto que faz algumas definições para suporte a esse tipo de identidades:
 
  • Identidade = conjunto de claims
  • Claims: asserções de um sujeito; transportadas em tokens
  • Emissor: próprio utilizador ou terceiros – Fornecedores de identidades (IdP)
  • Consumidores de identidades aceitam claims de IdP

O Information Card Model é uma "especificação" do modelo anterior, adicionando-lhe o conceito de Identity Selector – elemento responsável pela autenticação do utilizador (importante para o acesso ao cartao não permitir automaticamente a obteção de tokens) e contacto com o IdP adequado para obter os tokens correspondentes às claims pretendidas.

Um Information Card é então uma relação entre  o user e o IdP: define a localização do IdP, metadados, e quais as claims que consegue emitir. O selector de identidades é responsável por perguntar ao utilizador qual o cartão que quer utilizar de entre aqueles que satisfazem as claims pedidas pelo consumidor, e contactar o IdP para obter os tokens respectivos. Note-se que o cartão é apenas uma associação e só por si não responde a nada. A obtenção dos tokens correspondentes às claims é feita "on-line".

O CardSpace é a implementação da Microsoft do selector de identidades e proporciona uma experiência de utilização sempre igual do ponto de vista da identidade. Essa é uma característica de um bom sistema de identidades. Pemite integração com o WCF e com o IE8, apresentando uma API para que qualquer aplicação possa utilizar este selector de indentidades (System.IdentityModel).

 

Depois desta sessão foi a esperada hora de almoço, e como já era de prever a confusão foi ainda maior que no dia anterior. Apesar de tudo, ainda me calhou uma massa vegetariana, que até estava boa. Por esta altura soube que 470 dos 500 estudantes de ensino superior que estavam inscritos tinham aparecido! Juntei-me ao resto do pessoal do ISEL e lá fomos almoçar com os pratos em cima dos blocos publicitários ao pé das XBOX.

Ainda não tinha a certeza a que sessão ia no primeiro slot da tarde. Acabei por ir a esta:

SRV05 – Virtualização e Alta Disponibilidade com Windows Sever 2008

 Máquinas virtuais? Clusters? As duas coisas em conjunto? O tema da sessão não era daqueles a que tenho estado mais atento mas valeu bem a pena! O foco principal foi o Hyper-V, uma componente do Windows Server 2008 para suporte a virtualização. Esta componente quase que transforma o próprio SO numa máquina virtual, inserindo uma camada de software – o Hypervisor – que comunica com os processores a memória. Sobre este podem ser montadas outras máquinas virtuais. O potencial deste componente pode ser bastante explorado, principalmente em termos de disponibilidade, quando utilizado sobre um cluster. A alta disponiblidade no Hyper-V tem por base o mecanismo de Quick Migration, que consiste em mudar uma máquina virtual de um nó do cluster para outro num tempo relativamente curto, aidna que proporcional à memória da VM e ao tamanho de storage, podendo ocorrer com manutenção de estado (downtime planeado) ou não (downtime não planeado).

O ponto forte da sessão foi mesmo uma demo dessas funcionalidades. O orador, Nuno Carvalho, levou duas máquinas com 2 processadores 4-core e 32 GB de RAM cada (!) que partilhavam por rede um sistema de aramazenamento persistente (storage). Em 2 ou 3 minutos configurou um cluster com esses dois nós e depois colocou duas máquinas virtuais em execução sobre o mesmo, inicialmente no primeiro nó. Uma das VM tinha o Ubuntu e o orador saiu-se com a frase: "sempre quis mostrar linux numa apresentação da Microsoft" =p Depois, ele desligou o cabo de corrente do nó onde as VM estavam a ser executadas e o sistema reiniciou-as de forma automática no outro nó do cluster! Muito simples de configurar e com muitas potencialidades.

O resto do dia foi passado um pouco "on the fly", porque tinha pensado ir às duas sessões de Silverlight 2 e acabei por não ir a nenhuma delas na totalidade. Optei pela sessão:

 

Pela descrição na agenda parecia que ia trazer alguma coisa de novo..mas foi mais do mesmo..pelo menos os primeiros 25 minutos, que foi o tempo que me aguentei lá… Os oradores até eram bons..dois alemães que não paravam quietos e passavam um à frente do outro enquanto este falava. Acabei por ir ver o resto da sessão sobre silverlight. Passaram umas demos porreiras, mas nada mais do que estava à espera. No final perguntei ao orador uma dívida que tinha em relação ao papel dos servidores (passam a ser apenas fontes de dados, através de serviços) e percebi que a segunda parte também não ia ser grande novidade. Espero que para a maioria dos estudantes tenha sido! Fui antes à sessão do pessoal do MLDC sobre tecnologia de fala.

DEV04 – "Are You Talking to Me?" – Como integrar tecnologia de fala em aplicações desktop e IVR.

Esta foi a sessão ideal para o fim da tarde! Descontraída e com uma dinâmica muito boa. Começou com o Pedro Silva Santos num diálogo com uma voz portuguesa no computador, ao qual se juntou depois a nova voz que estão a desenvolver. Foi uma forma engraçada de cativar o pessoal e mostrar o trabalho que têm vindo a desenvolver.

A primeira parte da apresentação não era novidade para mim, já que fiz uma apresentação sobre o tema no ImagineCup Road Show, no ISEL. Falou-se sobre síntese e reconhecimento de voz e das formas mais tipicas de implementação:

 

  • Síntese: concatenação de pequenas samples de fonemas
  • Reconhecimento: baseado em probabilidades atríbuídas ao reconhecimento dos vários fonemas identificados na fala; atribuição de propabilidade de ser um dos fonemas reconhecidos; cálculo da probabilidade/certeza total

Depois fizeram umas demos simples recorrendo à biblioteca SpeechFX do .NET 3.0 (vejam a apresentação que referi =P) e outra mais engraçada com o robotic studio: puseram um robot da lego a responder a comandos de fala, integrando um novo bloco de controlo no robotics studio, que identifica os comandos de voz e gera as saídas correspondentes. ainda deu para o robot jogar bowling com umas garrafas de plástico e uma bola anti-stress.

A segunda parte foi virada para as tecnologias de servidor, nomeadamente o Speech Server 2007. A ferramenta é baseada em Workflow Foundation e permite desenhar a base de um sistema mesmo a alguém que não saiba mais que um miúdo de 10 anos. É só arastar alguns blocos – início de chamada, opções que o utilizador deve dizer, … – e ligá-los coforme o "flow" pretendido. Para soluções mais complexas, podemos sempre pegar no código gerado e trabalhá-lo.

 

No fim das sessões o pessoal do ISEL foi-se embora (acho que gostaram do dia) e lá fora já havia autocarros para levar o pessoal que tinha vindo de mais longe. Eu fiquei mais um bocado com os MSP e fomos todos jantar, porque o TechDays não se faz só de sessões. Parece que depois ainda houve TechNights para alguns…

O ambiente no Student Day estava porreiro e acho que correspondeu às expectativas. Espero que o pessoal tenha aproveitado. Eu gostei de os ter por lá e de ser um pouco a ponte entre eles e o evento e outras pessoas (msp, por exemplo).

 

 

TechDays08 – Day 1

12/Março – 8h30 – Centro de Congressos de Lisboa – Depois de encontrar alguns dos MSP, fazer o check-in (sem filas…balcão à parte =P) e ter uma breve reunião com o grupo de MSP para algumas indicações gerais, estava na hora do keynote.
 
KEY02 – Keynote
 
O keynote foi dado pelo Miguel Caldas, da Microsoft, que fez um discurso bastante descontraido (até atirou a gravata ao chão..). Começou por apresentar o TechDays em números:
 
  • 3 dias
  • 2300 pessoas
  • incluindo 500 estudantes
  • 30 expositores
  • 6 auditórios e 3 labs em funcionamento paralelo

De seguida o orador convidou o Nuno Costa, também da Microsoft e que esteve na conferência MIX’08 em Las Vegas, a falar sobre as novidades que lá foram apresentadas, principalmente o IE8 e o Silverlight 2.0. Foram apresentados alguns "exemplos reais" – site português da Expo Saragoça, protótipo do NetViagens.com, Memorabilia do HardRock (vizualização parcial de imagens de alta resolução das peças de museu dos cafés; vale a pena ver..até se vê a dedada na guitarra!).

O Miguel Caldas retomou a apresentação, expressando a vontade da Microsoft de criar ferramentas que permitam ao developer proporcionar novas e melhores experiências de utilização. Essas ferramentas tendem a unificar-se sobre a plataforma .NET.

Para concluir foram dadas algumas informações mais práticas sobre o evento – localizações, actividades – mesmo na altura em que o computador do orador ficou sem corrente e faltaram os slides =P Correu bem na mesma.

Para este dia tinha planeado 4 sessões:

  • T-SQL – dicas e truques
  • Database design patterns
  • Hands-on lab Blend/WPF
  • Test driven development

O hands-on lab estava cheio quando cheguei, mas ainda fiquei a ouvir. Estavam a seguir um tutorial base do Blend, pelo que percebi..não me agradou e saí. Acabei por não ir a nehuma sessão nesse slot e aproveitar para por a conversa em dia com alguns MSP e pessoal da Microsoft. As outras 3 sessões eram dadas pelo mesmo orador: o Sephen Forte. Excelente orador! Penso que será dos melhores que vou encontrar no evento. Conseguiu manter uma dinâmica excelente em todas as sessões com piadas sobre ele, sobre os EUA e mesmo sobre Portugal, sempre com grande interacção com o público. Via-se que tinha uma grande experiência profissional; tinha sempre um caso real para exemplificar e algumas histórias para contar. No fim de umas das sessões ainda tive oportunidade de ter uma pequena conversa com ele, já de volta à zona dos oradores.. é muito acessível, prestável e descontraído.

 

DAT02 – T-SQL: Tips and tricks
 
Esta sessão, dada pelo Stephen Forte como já disse, tinha como objectivo a exploração de 3 ou 4 funcionalidades do SQL Server que podem ajudar a resolver alguns problemas. O Stephen começou por contar a história de como fez uma apresentação num país árabe tendo o tradutor ficado a dormir, e depois colocou um grande sinal de proíbido(ou evitar a todo o custo) nos cursores. Muitas vezes os cursores tendem a ser o vício "procedimental" dos programadores reflectido no SQL (foreach(line l in cursor){…}), o que vem contra o funcionamento "set-based" dos SGBD (uma instrução implica vários passos e pode ter vários efeitos sobre conjuntos de informação distintos).
 
 
O segundo ponto foram as common table expressions (CTE) que são uma espécie de vista temporária apenas no contexto de execução corrente. Concretamente, o Stephen mostrou como recorrer às CTE para implementar queries recursivas. Demasiado retorcido para mim, à primeira vista. Quando tiver tempo de perceber melhor o funcionamento, talvez escreva qualquer coisa sobre isso. Um exemplo de aplicação da "recursividade" é: 1) tabela de empregados em que cada um tem um id e o id do seu chefe (chava estrangeira para a própria tabela – "home key", na linguagem do stephen); 2) listar todos os suboordinados de um empregado.
 
Depois falou-se de uma coisa que eu desconhecia mesmo: suporte para manipulação directa de xml através do tipo "xml" que tém..métodos!..no sql server. Uma coluna de uma tabela pode ser do tipo xml, e sobre um valor deste tipo podemos, por exemplo, extrair texto de elementos pesquisados com xpath. Parece-me que a utilidade disto pode ser questionável.. mas ok..há suporte para isso, e posso vir a encontrar cenários em que dê mesmo jeito.  Mais info aqui.
SELECT xCol.value(
   '/livros//livro[1]/titulo', 'nvarchar(70)') 
FROM docs
 
Próximo ponto: Raking Functions. Suporte para atribuição de classificações a registos conforme uma dada ordenação definida numa cláusula "order by". Torna-se útil em cenários de elaboração de relatórios, sendo possível utilizar vários nível de rankings. Por exemplo, classificação dos melhores clientes a nível mundial e nacional.
 
Para terminar, falou-se de PIVOTs. Sem entrar em muito detalhe, esta funcionalidade é útil também para relatórios, e permite de forma simples coisas deste género:
Tabela com (id_cliente,ano,despesa)
Marcar o ano como pivot sobre os valores ano1, ano2, ano3 e dizer que queremos ver a despesa
Obter tabela com uma linha por cliente e com a estrutura (id_cliente, ano1, ano2, ano3) em que as colunas dos anos têm a despesa de cada ano
 
Depois desta sessão era hora de almoço. Finalmente! O almoço era servido no pavilhão dos expositores, com vários "pontos de distribuição" nas laterais, do tipo..pega o prato e leva para ires comer em algum sitio. Qual sítio? em primeiro lugar, como a sessão terminou um pouco depois da hora, grande parte da comida já estava a acabar, e nos pontos onde não estava..as filas eram enormes. Depois, não havia quase espaço nenhum para o pessoal estar a comer. Acabei a comer em pé com o prato na mão. Valeram as carnes frias e comida mais "buffet" que havia no seguimento das comidas quentes (que já não cheguei a ver). Foi um dos pontos em que a organização podia ter estado melhor.
 
ARC04 – Database design partterns
 
A minha primeira sessão da tarde, novamente dada pelo Stephen Forte, apresentava 3 padrões de desenho para BDs. Sim, também há padrões de desenho para BD; secalhar até já os usámos só que não lhes demos nome. O Stephen tinha dito que nestas conferências ficava sempre com a comida vegetariana porque a sessão antes de almoço se atrasava…desta vez ainda não tinha almoçado de todo..e lá foi ele para o primeiro padrão:
 
Transactional pattern
 
Amplamente usado: formas normais, relações com chaves estrangeiras..etc. Dispensa comentários.
 
Slowly-changing dimension pattern
 
Erro comum: queries complicadas sobre um conjunto vasto de dados normalizados (várias tabelas).
Problema: queries muito pesadas afectam o desempenho das actualizações (insert,update,delete) que é preciso realizar e que efectivamente são importantes para manter um estado coerente nas aplicações.
Solução: criação de uma base de dados mais "flat" (não normalizada), organizada de forma mais adequada às queries "complicadas", e que fica preferencialmente alojada noutra máquina. As queries "complicadas" passam a fazer parte de um processo de transformação que passa os dados para a nova base de dados. estas actualizações são feitas de forma periódica e incremental.
Vantagens: O modelo normalizado não é afectado por queries que trabalham sobre muita informação; as queries na base de dados "publicada" são mais simples, porque o peso está no processo de transformação; os chefes podem por o newbie a trabalhar nos relatórios sobre a nova base de dados, porque fica mais simples =P
 
Este modelo é bastante utilizado. Por exemplo, na Amazon: a compra de um livro apresenta um stock que tem de ser confirmado na fase final da transacção. Porquê? O catálogo e as consultas iniciais da compra são feitas num sistema com este padrão, em que a base de dados "read-only" é actualizada de 15 em 15 minutos.
 
Data Warehouse pattern
 
Extensão ao modelo anterior através de um modelo de estrutura em estrela. Neste modelo não consegui reter tudo..espero não meter água no que vou dizer. Exemplo: tabela que armazena o número de um cliente, o nome do produto que comprou, a data e valor da compra. Para realizar uma query para saber as compras de cada trimestre do ano estamos a afectar a introdução de novas compras. A ideia é criar uma tabela auxiliar (Dimension table) que representa datas de compra, atribuindo-lhes identificadores. A tabela principal, que regista as vendas, (Fact table) fica depois com o identificador da data. A tabela auxiliar pode até conter qual o trimestre da data, pré-determinado, e um índice nessa coluena, que não vai afectar a Fact table: data_de_venda(id, data, trimestre). As queries podem depois ser realizadas nas tabelas auxiliares e só quando temos os identificadores concretos é que consultamos a tabela principal, tendo assim menos impacto.
 
 
Para completar a sessão, falou-se ainda um pouco de partição horizontal e vertical de dados, tema com o qualjá estava mais familizarizado.
  • Partição horizontal: dividir registos de tabelas por várias bases de dados com tabelas semelhantes, de acordo com um critério (país, por exemplo).
  • Partição vertical: dividir conlunas da tabela conforme a necesidade de utilização das mesmas. O número de registos é igual nas várias BD, mas com conjuntos de colunas diferentes.

VST06 – Test-driven development

 Última sessão do dia; tema menos técnico, mas no qual estava interessado para aplicar num projecto no ISEL.

Esta metodologia consiste em realizar pequenas iterações no desenvolvimento, escrevendo primeiro o código de teste para as funcionalidades a implementar. O processo é descrito por RED-GREEN-REFACTOR:

 

  • Implementar código de teste
  • O novo teste falha (porque não há implementação da funcionalidade) – RED
  • Escrever código para passar o teste
  • O teste sucede – GREEN
  • Rever o código e melhorá-lo – REFACTORING
  • Repetir os passoa anteriores

Ese tipo de desenvolvimento encaixa nas metodologias ágeis já que se baseia em pequenos ciclos de desenvolvimento com alterações rápidas e que geram auto-documentação (os próprios testes).

Há que ter cuidado para não escrever código de teste demasiado grande e exaustivo (como este post talvez?) nem demasiado pequeno e fraco, testando apenas a componente sobre a qual estamos a trabalhar. O Stephen disse uma curiosidade engraçada (não para os lesados): o bug mais caro da história foi na Mars Explorer, em que muitos (muitos) dólares de hardware de "top" foram ao ar porque faltavam um ";" algures! upa upa…

No fim desta sessão ainda falei mais um pouco com o orador, juntamente com o Fábio e o André Gomes Sousa, e depois foi hora de voltar para casa, passando antes pela casa da namorada que não tem culpa da Microsoft me fechar um dia inteiro no CCL =P

Só consegui acabar de escrever esta review já no fim do 2º dia, que foi o Student Day e que foi "à maneira". Nos próximos dias deixo uma review desse dia e também do último dia de TechDays deste ano.

 
 
 

Links

Alguns links que podem ser do interesse de algumas pessoas em algum sítio =P