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.
 
 

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s