Nelson's profileDigital Northern WindsPhotosBlogLists Tools Help

Blog


    April 24

    Busto usa o Mapas

    O Busto usa os mapas do SAPO!
    E ainda nem sabe das novas imagens que estão para chegar! :)


     
    October 28

    Visitas Virtuais

    Hoje foram colocadas online mais de 150 visitas virtuais no Sapo Mapas (entre panoramas e visitas interactivas).

    virtual_tours

     

    A ideia destes conteúdos é permitir por exemplo ver o aspecto de um restaurante por dentro antes de decidir onde marcar um jantar, ou apenas "visitar" o interior de um monumento, como por exemplo o Mosteiro dos Jerónimos.

    Esperam-se novidades para breve, com mais visitas virtuais.

    October 13

    Scrum @ SAPO

    Na semana passada pediram à nossa equipa (Mapas/GIS) para filmar um Daily Scrum, de modo a divulgar esta metodologia de desenvolvimento ágil e sua  utilização no SAPO.

    Desta proposta resultaram dois vídeos: um em que explico em que consiste a reunião e outro com a reunião propriamente dita. Aqui estão eles:

     


     

    March 18

    Techdays 2008 - DAT07 resources

    No seguimento da apresentação que eu e o Hugo fizemos no Techdays (ver post anterior), deixo aqui os slides e as demos da mesma.

    Das demos faz parte uma aplicação que expõe um web service, que acede a uma base de dados SQL Server 2008 e retorna GeoRSS ou GML, consoante os parâmetros passados na query string. No html podem ver como é construído o url para aceder a este serviço.

    Para utilizarem esta aplicação com a vossa base de dados, terão de adaptar a aplicação com os nomes das vossas tabelas / colunas.

    Qualquer questão, não hesitem em colocar.

    March 07

    Techdays 2008: Sistemas de Informação Geográfica e o SQL Server 2008

    Aproxima-se o Techdays 2008 e muitos de vós andam já a ultimar o preenchimento das vossas agendas.

    Aproveito para informar que no dia 13, logo no primeiro slot (para ajudar a acordar), vou estar a fazer uma sessão, em conjunto com o Hugo Vilardouro (meu colega de trabalho e que será o orador principal), onde se vai introduzir o tema dos GIS (ou SIG - Sistemas de Informação Geográfica) e apresentar o caso prático da utilização do SQL Server 2008 nestes sistemas.

    A sessão é a DAT07 e tem o nome: "Sistemas de Informação Geográfica e o SQL Server 2008 - tipos de dados espaciais e indexação", um nome que indica na perfeição aquilo que vai ser abordado durante a sessão.

    Se têm curiosidade em saber o que é um GIS, ou para que serve, ou ainda como se constrói / utiliza na prática, apareçam!

    Como introdução, podem consultar o serviço de GIS, o serviço de mapas e os mapas do SAPO.

    February 17

    eScrum, TFS and RSS

    Há uns dias andei a fazer uma aplicação que gerasse um feed RSS com as actualizações dos projectos Scrum existentes no nosso servidor TFS.

    Como já disse há uns posts, nós utilizamos a ferramenta eScrum, que por sua vez utiliza a base de dados do TFS para guardar toda a informação que necessita. O facto desta ferramenta integrar com o TFS, o que à partida pode parecer uma grande vantagem, neste caso específico não sei se a vantagem será assim tão grande.

    A única vantagem que vejo é a integração com os bugs, podendo ser criados bugs no próprio VS, que depois se podem associar a tasks do eScrum. Mas isto já eu disse da primeira vez que falei aqui desta ferramente e desde essa altura que não encontrei mais nenhuma vantagem que advenha do facto de exisitir integração com o TFS.

    Não vou aqui falar das desvantagens / "non-documented features" do eScrum, mas o facto de integrar com o TFS impõe algumas restrições ao sistema de informação associado. Para melhor expôr o problema, pensemos nos constituintes do (e)Scrum: temos os projectos Scrum, que por sua vez têm produtos. Cada um destes produtos tem um Product Backlog, que por sua vez tem Backlog Items. Cada projecto tem também associados sprints e cada sprint contém alguns Backlog Items no Sprint Backlog e cada um destes contém as subtasks que irão ser realizadas durante esse sprint. Como é óbvio, para cada um destes itens que acabei de referir, existem vários detalhes associados, como por exemplo, nome , datas, descrição, nº de horas envolvidas, etc. Para além de todas estas coisas, existe o Product Owner, o Scrum Master, os membros da equipa e dentro destes, os que fazem parte de cada sprint.

    Posto isto, podem imaginar um sistema de informação bem organizado, em que os itens a bold (e talvez mais alguns, dependendo da implementação) se podem transformar em tabelas. Agora esqueçam aquilo em que acabaram de pensar: o eScrum guarda isto tudo na tabela WorkItem da base de dados do TFS, onde as linhas têm referências de umas para as outras e as colunas correspondentes a essas referências mudam consoante aquilo que se quer referir. Nuns casos são usados IDs, noutros o nome, noutros outras colunas textuais. What a mess...

    A meu ver, a suposta vantagem de integração com o TFS (pelo menos neste caso específico) é feita através de um "hack" que só complica o sistema, não trazendo vantagens significativas. Acho que tinha muito mais a ganhar, se o eScrum mantivesse os dados numa estrutura própria e bem organizada.

    Existem casos em que por questões de optimização, é útil ter uma base de dados não normalizada, mas este não me parece o caso.

    Depois de explicar a "complexa" organização do sistema de informação do eScrum, resta dizer que se torna um pouco complexo construir uma aplicação que leia a informação que lá está guardada. A certa altura já não se sabe se estamos a construir uma query que vai buscar o Product Backlog ou o Sprint Backlog...

    Nada que a velha máxima da engenharia não resolva: todos os problemas de engenharia se resolvem adicionando um nível de abstracção. Passemos então à resolução do problema, que se ainda se lembram, era gerar um feed RSS com as actualizações dos projectos Scrum.

    Esta aplicação usa WIQL (Work Item Query Language) para obter dados do TFS, que é uma linguagem de query semelhante a SQL.
    Exemplo para obter as tasks do Product Backlog de um dado projecto:

                         SELECT
                            [System.Id],
                            [System.State],
                            [System.AssignedTo],
                            [Microsoft.VSTS.Common.Priority],
                            [Microsoft.eScrum.Common.Order],
                            [System.Title],
                            [Microsoft.eScrum.Common.Category],
                            [Microsoft.VSTS.Scheduling.BaselineWork],
                            [System.AreaPath]
                        FROM WorkItems
                        WHERE [System.TeamProject] = '<ProjectName>'
                            AND [System.WorkItemType] = 'eScrum Product Backlog Item'
                            AND [System.State] <> 'Deleted'
                        ORDER BY [System.Title]

    Onde <ProjectName> é o nome do projecto. Para obtermos os sprints, temos a query:

                        SELECT
                            [System.Id],
                            [System.State],
                            [System.AssignedTo],
                            [System.IterationPath],
                            [Microsoft.eScrum.Sprint.StartDate],
                            [Microsoft.eScrum.Sprint.EndDate]
                        FROM WorkItems
                        WHERE [System.TeamProject] = '<ProjectName>'
                            AND [System.WorkItemType] = 'eScrum Sprint Details'
                            AND [System.State] <> 'Deleted'
                        ORDER BY [System.Id]

    Como podem ver, são duas queries bastante semelhantes, para obter coisas completamente diferentes. Estes são os caso simples do Product Backlog e dos sprints. Para as tasks e subtasks dos sprints, o caso torna-se um pouco mais confuso.

    Para executar a query, usa-se o método Query do objecto WorkItemStore:

    TeamFoundationServer tfs = new TeamFoundationServer(serverURI, new NetworkCredential(username, password, domain));
    tfs.Authenticate();
    WorkItemStore workItemStore = new WorkItemStore(tfs);
    string query = string.Format(sprintsQuery, project);
    WorkItemCollection sprints = workItemStore.Query(query);

    Identificadas as queries principais, a utilização das mesmas pode ser encapsulada em operações da aplicação, que tenham um nome mais user-friendly. Estas operações retornam colecções de objectos que depois facilmente se trabalham para construir o feed pretendido.

    Para contruir o feed utilizei a biblioteca RSS.NET, que evita que tenhamos de construir o código XML, trabalhando em vez disso com objectos .NET.
    A aplicação que construi, de cada vez que é executada, cria vários RSS, por projecto e com resumos de todos os projectos, ficheiros estes que são construidos totalmente de cada vez que o processo corre e não de uma forma incremental. Para isto utilizo a data associada a cada WorkItem, o campo ChangedDate. Usando o ID do WorkItem como GUID de cada item RSS e o campo ChangedDate do WorkItem como PudDate dos itens RSS, é possível detectar alterações em cada item.

    Finalmente, criar um ficheiro RSS com os sprints de um dado projecto é tão simples como:

               RssChannel channel = new RssChannel(
                    "Scrum Sprints - " + project,
                    "Scrum Sprint's Updates",
                    new Uri("http://myserver/escrum/"));
               channel.LastBuildDate = DateTime.Now;

                foreach (WorkItem sprint in sprints)
                {
                    RssItem item = GetSprintRssItem(project, sprint);
                    channel.Items.Add(item);
                }

                RssFeed feed = new RssFeed();
                feed.Encoding = Encoding.UTF8;
                feed.Version = RssVersion.RSS20;
                feed.Channels.Add(channel);
                feed.Write(filename);

    O resultado final, para o feed de resumo, é algo como:

    image

    January 29

    Estado dos serviços em Portugal...

    É ridículo demais...

    Parte 1

     

     

    Parte 2

     

     

    Parte 3

     
    January 27

    Get Nokia Software Updater (NSU) up and running

    Today I had several issues when I tried to do an update to my phone's firmware.  When I run the NSU application, it just get stucked in the initial startup screen and freezed for about 60 seconds, showing then an error message saying: "Missing Software Components - Some critical components were missing, please reinstall", or something like that.

    Let me just say that I'm running on Windows Vista, with the latest version of both Nokia PC Suite and Nokia Software Updater, and with a non-administrative account.

    After some trial-and-error with no results, I've unninstalled both apps, reboot, log-in as THE Administrator (not a regular administrative account) and installed first Nokia PC Suite and than Nokia Software Updater. Et voilá! It's working! Now it works even in my non-administrative account! :)

    Developers should get used to develop applications targeting non-administrative users. Although these apps need to install drivers, wich requires administrative privileges, installing them with a "run as" approach should be sufficient.

    January 10

    "The specified service has been marked for deletion"

    Se desenvolvem Windows Services, existe uma grande probabilidade de já terem apanhado este erro, quando instalam um serviço.

    Isto pode acontecer por exemplo se não pararmos o serviço antes de fazermos uninstall. Mas também pode acontecer se se verificarem algumas condições (lá estou eu e a mania do determinismo), as quais ainda não consegui descobrir.

    Segundo o KB existente no site da Microsoft, isto é resolvido reiniciando o computador antes de reinstalar o serviço... Uau! Isto para quem desenvolve serviços e os instala e desinstala com frequência é uma valente m£#*@!

    Felizmente, existe uma forma mais simples de resolver o problema. Parece que existe um problema qualquer com o facto de desinstalarmos o serviço tendo a janela services.msc aberta (mais uma vez, não sei que condições são precisas para isto se verificar, visto que não acontece sempre). Após fechar a janela, já conseguimos instalar o serviço novamente!

    Não sei se esta solução resulta em todos os casos, mas para mim tem funcionado.

    December 31

    WCF, bindings and message size

    Em WCF, quando definimos os bindings (quer declarativamente no ficheiro de configuração, ou programaticamente no código), existem muitas coisas que não especificamos, quer por estarmos satisfeitos com os valores que têm por omissão, quer por não estarmos preocupados com determinada definição, ou por outra razão qualquer.
     
    Uma das definições diz respeito ao tamanho das mensagens recebidas. De modo a limitar a exposição a ataques DoS, o runtime WCF impõe um limite ao tamanho das mensagens que são recebidas e que consequentemente limita a quantidade de memória alocada para a recepção de mensagens. Esta definição está disponível declarativamente através de <binding maxReceivedMessageSize="..." > ou programaticamente na propriedade binding.MaxReceivedMessageSize e tem por omissão o valor de 64k.
     
    Quando nos é enviada uma mensagem que excede este limite, a mensagem é rejeitada e o canal fica faulted, caso seja session-full. Mesmo quando utilizamos calbacks, caso este limite seja excedido o cliente é avisado recebendo uma CallbackException e sendo gerado o evento Faulted associado ao canal.
     
    Para alguns bindings existe também a propriedade MaxBufferSize. Esta propriedade, para bindings com buffer é sempre igual a MaxReceivedMessageSize (o runtime lança excepção se não for) e para bindings streamed este valor limita o tamanho do header da mensagem (apenas o header necessita de ser bufferizado).
     
    Caso estejamos a receber ou retornar XML em alguma operação exposta no contracto WCF, existe ainda outra propriedade à qual devemos ter atenção, MaxStringContentLength (disponível através de <binding> <readerQuotas maxStringContentLength="...">). Também por razões de segurança, esta propriedade limita o valor do buffer que é utilizado pelo XmlReader e por omissão o seu valor é de 8k. É preciso especial atenção a este valor, pois caso seja excedido, mas inferior a MaxReceivedMessageSize, o runtime não lança excepção, descartando a mensagem silenciosamente, sendo possível continuar a utilizar o mesmo canal.
    December 24

    Wordsong

    Na sexta-feira fui ao CCB ver um concerto dos Wordsong, grupo que já conhecia desde que editaram o segundo álbum, "Wordsong - Pessoa". Este grupo é um projecto que musicaliza obras de poetas portugueses, tendo já dois albúns, correspondentes aos poetas Al Berto e Fernando Pessoa, e é composto, entre outros, por membros dos Radio Macau.

    O concerto foi muito bom, tanto em termos sonoros, como em termos visuais. Foi um espectáculo multimédia completamente diferente de tudo o que já tinha visto e ouvido e, mesmo tendo gostado do dvd (de Pessoa, o de Al Berto não vi), achei muito melhor ao vivo!

    Quanto ao conteúdo em si, ainda não conhecia a parte respectiva ao poeta Al Berto e, apesar de ter gostado da sonoridade, achei a parte visual muito pobre comparando com a de Pessoa. A parte de Pessoa sim, está genial, tanto em vídeo como em som! Sugestão? Talvez... :)

    A primeira parte do concerto ficou a cargo de uma fadista (se é que assim se pode rotular) que não conhecia, a Lula Pena, que assegurou uma excelente primeira parte.

    Deixo aqui uns vídeos dos Wordsong e da Lula Pena.
    Só uma nota antes de ouvirem: esta música não é para todos... :)

       
     
       

    Podem ouvir mais músicas dos Wordsong no myspace deles.

    December 17

    Scrum - Sprint Burndown

    Um dos artefactos resultantes da aplicação de Scrum a um projecto é um gráfico com o Sprint Burndown. Este gráfico mostra o trabalho por fazer versus trabalho já feito. Assim, o espectável é acabar o sprint com um gráfico cuja linha do trabalho por fazer comece no máximo e acabe em zero e o inverso para o trabalho completo. Algo deste género:

    burndown2[1]

    Começamos o sprint com tudo por fazer e nada feito e a uma velocidade mais ou menos constante, caminhamos para o final do sprint, onde temos o trabalho todo feito e nada por fazer.

    Então e o que acontece quando no início do sprint não sabemos bem o que fazer (ou não o planeamos bem) e à medida que este decorre, vamos adicionando itens ao sprint backlog? Imaginemos que no início do dia adicionamos ao backlog aquilo que nos propomos a fazer durante esse dia e no final marcamos esse trabalho como completo. O que obtemos com esta abordagem é um gráfico deste género:

    burndown[2]

    Um pouco estranho... Parece que o tempo foi passando e nada de trabalho feito. O terror de qualquer gestor de projecto! Isto acontece, porque como á granularidade temporal deste gráfico é o dia, se fizermos como disse acima (adicionar itens de manhã e marcá-los como completos ao final do dia), obtemos um gráfico deste género, onde se vê o número de horas de trabalho a aumentar e o número de horas de trabalho por fazer sempre constante (devido a itens adicionados no início do sprint e que ainda não foram concluídos).

    Conclusão: sempre que possível façam um planeamento do sprint por inteiro. A adição de itens ao sprint backlog no decorrer do sprint, apesar de possível, deve ser evitado e encarado como uma excepção.

    MSW & GTA

    Este fim-de-semana realizou-se no Algarve o 'Microsoft Web & Gaming Technologies Algarve'. Neste evento, organizado por alunos da Universidade do Algarve, falou-se das tecnologias mais recentes da Microsoft, no que toca ao desenvolvimento para a web e de jogos.

    Eu fiz duas apresentações, uma sobre ASP.NET AJAX e outra sobre XNA, semelhante à que fiz no SAPO Codebits. Entre os outros temas que foram apresentados, encontram-se uma introdução a ASP.NET, as novidades da framework .NET 3.0 e 3.5, Silverlight e a apresentação do Windows Vista e do Office 2007.

    O feedback foi no geral muito positivo, ainda para mais vindo de público pro-open-source, que algumas vezes se confunde com anti-Microsoft. Embora de vez em quando se ouvissem as habituais discussões open-source versus Microsoft (não devia ser 'closed-source'?), mas sobretudo discutiu-se tecnologia!

    Balanço muito positivo do evento, onde imperou a já habitual boa-disposição, entre os roadies do costume. :)

    CIMG0309

    CIMG0326

    É giro ver o pessoal do open-source todo contente atrás de um painel publicitário da Microsoft, não é? :)

    Podem ver mais fotos aqui.

    December 11

    eScrum: bugs

    Recentemente comecei a utilizar Scrum no trabalho e, como usamos o Visual Studio Team System, optou-se por utilizar o eScrum, uma ferramenta web-based, que integra com o VSTS, permitindo uma gestão uniforme dos work items, enquanto se utiliza Scrum, tirando partido das vantagens tanto da metodologia (cof cof, framework, desculpem :), como da ferramenta de desenvolvimento.

    Não vou aqui falar de Scrum, para isso já existem muitas coisas publicadas. Já em relação ao eScrum não posso dizer o mesmo.
    Assim, à medida que for utilizando a ferramenta e a for descobrindo, publico o que achar que vale a pena.

    Uma coisa que não me pareceu intuitiva à primeira vista (apesar de estar na documentação, podia estar mais explícito), foi a associação de bugs a "tarefas" (ou sprint backlog items). No VSTS, quando encontramos um bug, que não pretendemos resolver de imediato, podemos criar um work item do tipo Bug. Mas como é que associamos este bug, criado no VSTS, a um item criado no eScrum?

    Na definição de produto, existe uma secção intitulada "Product Bug Settings", com o campo "Query". Neste campo pode-se colocar uma query do TFS, que devolva os bugs existentes no projecto. Para obter essa query, basta no VSTS, em Work Items, ver a query "All Bugs" e depois guardá-la num ficheiro .wiq. Este ficheiro contém a query que pretendemos. Basta copiá-la para o campo "Query" do eScrum, substituindo as variáveis (identificadas com @) pelo valor pretendido. Por exemplo, onde está @Project, coloca-se o nome do projecto do qual queremos obter os bugs.

    Já temos os bugs associados ao nosso produto do projecto Scrum. O passo seguinte é associá-los à tarefa que irá resolver o bug. Na definição do sprint, quando se cria uma tarefa (task), temos um botão "Bugs", que nos dá acesso aos bugs existentes. É só adicioná-los à task e assim que a demos por concluída, o bug fica automaticamente marcado como resolvido (pelo menos assim o espero... a ver vamos, no final do sprint :).

    EDIT: A Sónia Moreira acabou de colocar um post com um bom resumo sobre esta metodologia (ups.. framework). Leiam! :)

    PPUE @ EU/África

    Afinal... Havia outra! O meu último trabalho para a presidência foi neste último fim-de-semana, na cimeira EU/África. Esta cimeira apesar de ter sido a maior, foi a que menos problemas deu e uma das que mais gostei de fazer e pela interacção que tive com as mais variadas pessoas e culturas ao longo desta presidência, os africanos pareceram-me de longe os que melhor lidam com tecnologia (salvo raras excepções).

    08122007(008)

    08122007(009)

    08122007(013)

    08122007 

    08122007(023)

    08122007(033)

    08122007(036)

    08122007(010)

    December 06

    SMS

    Sempre que utilizo a "escrita inteligente" para escrever uma sms penso: "porra, mas porque é que esta porcaria não é inteligente?".

    Porque é que das palavras que introduzo, as que mais uso são aquelas que tenho de introduzir novamente mais vezes? Muito provavelmente não é isto que acontece, mas é a sensação que dá...

    Será que custa assim tanto manter um ranking das palavras mais utilizadas e remover as que são menos usadas? Isto nem precisava de ser feito "on-the-fly", aproveitando as alturas em que o telemóvel está em stand-by para reordenar as palavras no dicionário.

    December 05

    ISEL - 5 anos depois

    5 anos depois... Curso terminado, objectivos cumpridos e nova etapa pela frente.

    Pelo caminho ficam muitos bons momentos, muitas dores de cabeça e muitas noites sem dormir.

    Obrigado a todos aqueles que participaram nesta etapa! :)

    28092007

    20012006(025) DSC05653 Imagem 004 13092005(004) 24012006(002) 24012006(006) Fotografia 19 15112005(009)

    November 24

    SAPO Codebits

    image

    Nos dias 13, 14 e 15 deste mês realizou-se, na Gare Marítima de Lisboa (em Alcântara), o SAPO Codebits. Este evento foi inspirado no Yahoo! Hackday, o qual não conhecia.

    Adorei o formato do evento, desde o carácter informal, ao espírito do concurso, passando pelo Red Bull à pala! :) Tudo excelente!

    Não fui lá apenas como espectador, fui também como orador, fazer um workshop sobre XNA: "Framework XNA: Desenvolvimento de Jogos para a XBOX 360". A meu ver (e segundo o feedback do público) correu tudo bem, mas podia ter corrido um pouco melhor se fosse mais preparado para o formato do evento.

    O carácter informal convidava à participação do público e pedia-se uma maior interactividade durante as sessões. Ainda deu para mostrar umas quantas demos a correr directamente na Xbox, como por exemplo o XNA Racing Game, que é um Starter Kit em 3D e que já dá para ver bem o (grande) potencial do XNA.

    image

    De entre as restantes apresentações, consegui finalmente ver a do Mahesh sobre IronPython e realmente, dá mesmo vontade de ir logo mexer naquilo! Infelizmente não consegui ver as demos dele com XNA e Robotics Studio, porque a minha apresentação era logo a seguir, mas no dia seguinte à noite, andava por lá quando reparei que num dos "palcos" estava o Mahesh a repetir a apresentação para umas quantas pessoas e por lá fiquei a ver o que não tinha visto na anterior (embora nada de XNA ou Robotics).

    Em relação ao concurso propriamente dito, a princípio nem era para participar (já que estive a acabar um relatório até às 4 da manhã), mas entretanto, surgiu em conversa uma ideia daquelas dignas de quem precisa de umas horas de sono e menos Red Bull: e que tal fazer um programa que tire cafés? Costuma-se dizer tantas vezes em brincadeira coisas do género "Epá, isso faz mesmo tudo! Só lhe falta é tirar cafés!"... E porque não fazer algo que não faça nada, mas... Tire cafés?! Boa Mike! (refira-se que não sou o único culpado desta ideia, o Rodrigo, que apresentou o projecto, e o David também têm culpa!)

    Surge agora um problema... Que interface terá a máquina de cafés, que possamos usar? SNMP aqui podia dar jeito... Ou então se calhar desmontávamos a máquina e ligávamos um fio dos botões da máquina, à porta série dum PC! Hum... E que tal juntarmos um pouco de engenharia mecânica? Um PC encostado à máquina que, quando abre uma das drives, toca num botão para tirar café, chega perfeitamente! Depois é só disponibilizar via web service e já está!

    E assim foi, um PC com duas drives, uma para café curto e outra para café cheio e já só nos falta alguma coisa para distrair o público (e talvez até o juri!). Nada melhor do que fazer umas somas que (garantidamente) dão sempre um resultado errado e dar um nome fashion ao projecto: Advanced Algorithm Library for Precise and High Performance Error Estimation! 'Bora registar isto, que ainda nos conseguimos ir deitar nos puffs uma horita ou duas! Melhor do que ler, só mesmo ver o vídeo:

     

    Era o melhor que se podia fazer em 90 segundos. :)
    E pronto, não ganhámos nada, mas deu para nos divertirmos um pouco e pelos vistos, o público até achou piada a ideia (pelo que vi no site, fomos o 2º projecto mais votado).

    Podem ver o resto dos vídeos das apresentações aqui e, segundo o blog, os vídeos dos workshops e das palestras estão prestes a sair.

    E para o ano há mais! :)

    image

    November 09

    TechEd Developers 2007 @ Barcelona

    image

    Nesta última semana estive em Barcelona, numa conferência da Microsoft, o TechEd Developers.

    Em primeiro lugar tenho de dizer que é uma cidade simplesmente fantástica, tanto em termos culturais, como de infra-estruturas, entre outros. Já tinha ouvido e lido muita coisa sobre a cidade, mas estar lá supera todas as expectativas!

    Nos primeiros dois dias (Sábado e Domingo) tivémos a oportunidade de visitar a cidade e embora tenha sido muito pouco tempo para ver tanta coisa que lá existe, conseguimos visitar alguns dos sítios mais emblemáticos da cidade. Podem ver as fotos aqui e aqui.

    Em relação ao evento, assisti a muito boas sessões, entre outas (poucas) menos boas, mas no geral o balanço é bastante positivo. Fiquei fã do Roy Osherove (o tal que acaba as sessões a cantar), do qual vi 3 sessões, todas sobre metodologias ágeis. Para mim foi mesmo o melhor orador do evento!

    A seguir vou fazer uma retrospectiva e deixar uma pequena crítica a todas as sessões a que assisti:

    Dia 1 - 5 de Novembro


    No primeiro dia a parte da manhã era para efectuar o registo e apenas da parte da tarde é que começaram as sessões, com a Keynote do Somasegar a abrir as hostilidades.

    14:00: Keynote (Somasegar)

    O evento começou com a Keynote dada pelo vice-presidente da secção de desenvolvimento da Microsoft. Para além de não perceber nada do que o homem dizia, o assunto, que supostamente introduziria os temas do evento, não trouxe nada de novo, deixando a sensação que não se fez nada de novo nos últimos tempos. Salvou-se a participação do Dan Fernandez, com uma demo sobre programação para o jogo World of Warcraft.

    image

    16:00: TLA201 - A Tour of Visual Studio 2008 and the .NET Framework 3.5 (Daniel Moth)

    Nesta sessão introduziram-se as novidades das novas versões do IDE e da plataforma de desenvolvimento.

    O VS2008 parece apresentar mais novidades a nível do desenvolvimento para a web, como por exemplo o suporte de IntelliSense em Javascript; de organização e gestão dos estilos/classes CSS; ou a possibilidade de ter no mesmo ecrã o código HTML e um preview do mesmo (split view). Não se falou das novidades do Team System, nomeadamente a nível de Source Control, suporte para integração contínua, para unit testing (MSTest), etc. Também se evidenciou o facto de se poderem criar projectos com as diferentes versões da plataforma, o que limita as funcionalidades que depois estão disponíveis e coloca referências para os assemblies das versões respectivas. Tudo muito light.

    Quanto a .NET 3.5, falou-se das novidades a nível das novas versões das linguagens C# (3.0) e Visual Basic (9.0). C# tem agora suporte para expressões lambda, tipos anónimos, inferência de tipos e métodos de extensão, que permitem, entre outras coisas, dar suporte ao LINQ.

    Esperava mais desta sessão, pensei que fosse um pouco mais aprofundada e não tão superficial. Deixou muito a desejar...

    17:45: ARC202 - Agile Development with Team System (Roy Osherove)

    Esta era uma das sessões que não queria perder e não desiludiu, muito pelo contrário! O Roy começou por introduzir as metodologias ágeis, conceitos associados e seus componentes. Falou de Scrum, Extreme e Pair Programming, Unit Testing, Automated Builds, relatórios/gráficos gerados com base na informação presente no TFS, como por exemplo bugs detectados vs resolvidos, evolução do resultado dos testes, entre outros e deu exemplos do suporte do Team System para estas metodologias. Deu para ver que domina claramente o tema e deixava sempre um sorriso na plateia com as suas piadas sarcásticas. Para acabar em beleza, pegou na guitarra e tocou uma música de melodia conhecida e letra a condizer com o tema da sessão. Podem "ver" o vídeo aqui (com má qualidade).

    Embora a tarefa não fosse difícil, conseguiu, na minha opinião, fazer a melhor sessão até ao momento!

      image

     

    Dia 2 - 6 de Novembro


    09:00: TLA314 - Microsoft XNA Studio Express – Developing 2D-Games for Windows and Xbox 360 (Andreas Schabus, Maximilian Knor)

    Já cheguei um pouco atrasado a esta sessão e só apanhei o final. (O facto do hotel ser na outra ponta da cidade e demorar mais tempo no percurso hotel-evento do que de Lisboa a Barcelona, ajudou "um pouco"). Foi pena, porque era uma das sessões que mais queria ver, devido a ultimamente andar envolvido neste tema.

    Do que vi, a sessão foi feita com o objectivo de realizar uma demo jogável em 75 minutos, objectivo esse que foi conseguido (para isso muito ajudaram os snippets do VS). O jogo era o XNAKanoid, a versão XNA do Arkanoid, em 2D e durante a sua elaboração evidenciaram-se os aspectos mais importantes da framework. No final, o Andreas explicou como é que se pode fazer deploy de um jogo para a Xbox 360.

    image image image

    10:45: SEC202 - Threat Modeling (Michael Howard)

    Esta sessão tinha o objectivo de envidenciar as falhas de segurança existentes no software hoje em dia e mostrar como é que estas podem ser evitadas. Passa tudo por uma análise detalhada do projecto, incluindo um diagrama com as entidades (internas e externas) envolvidas, fluxos de dados e contentores de dados. Após a esquematização, identificam-se as ameaças existentes, como por exemplo possíveis alvos de spoofing, DoS, etc.  Finalmente, têm que ser encontradas soluções para as ameaças encontradas, que tipicamente seguem um padrão e para cada ameaça existe uma técnica específica para a eliminar (ex.: spoofing -> autenticação).

    No final, distribuiu um exercício pela plateia, que foi resolvido 2 a 2 (à excepção dos mais "anti-sociais"), mostrando depois a sua solução. Foi uma sessão interessante, que deu para pensar em certos pormenores do software que desenvolvo e nas possíveis formas de o melhorar em termos de segurança.

    12:15: LNC01 - Why Software Sucks (David Platt)

    Esta foi a primeira Lunch Session do evento e uma das melhores do evento! Excelente orador, com uma capacidade incrível para fazer a plateia rir às gargalhadas, para logo a seguir colocar no ar uma certa apreensão. O tema era sobre o facto de o software desenvolvido hoje em dia não ser feito com funcionalidades/usabilidade adequada ao seu utilizador final, mas ser sempre feito com uma perspectiva mais técnica, mais para quem o está a desenvolver do que para quem o vai utilizar - "Know thy user, for he is not thee". Deu exemplos de bom e de mau software e incentivou os presentes a verem o desenvolvimento de software com uma perspectiva de utilizador final, pondo-se no seu lugar.

    image image

    image image image 

    13:30: TLA323 - What’s New in Visual C++ 2008? (Kate Gregory)

    Depois de um almoço rápido e antes do encontro MSP (durante a qual não fui ver nenhuma sessão do calendário do TechEd), ainda tive tempo para ir espreitar mais uma sessão. Pensava que ía ver algo da nova especificação de C++, mas afinal apenas vi as novas funcionalidades do VS2008 para suporte a C++. Não era assunto que me interessasse muito e vim-me embora a meio.

    Encontro MSP

    Durante a tarde/noite de terça-feira houve um encontro dos MSPs de todo o mundo presentes no TechEd, onde se falou sobre o programa e já mais para o final, estiveram presentes alguns oradores (entre eles o Dan Fernandez, o David Platt, o David Chappell e o Mahesh), aos quais pudemos colocar questões.

    À noite fomos jogar bowling, onde fiquei na equipa da Suiça, juntamente com MSPs russos, ucranianos, romenos e um orador americano. Foi uma noite excelente e, embora não faça a mínima ideia se ganhámos à nossa adversária (a Austrália), diverti-me imenso e conheci muita gente interessante! :)

    image

    image

    image

     

    Dia 3 - 7 de Novembro


    09:00: SBP202 - Connections in the Cloud – BizTalk Services and  Windows Communication Foundation (WCF) (Justin Smith)

    Esta sessão (à qual cheguei um pouco atrasado - de manhã torna-se difícil chegar a horas) iniciou com a distinção entre BizTalk Server e BizTalk Services e respectiva caracterização deste último. O objectivo da sessão era mostrar como é que estes serviços podem ser utilizados em WCF e com que finalidades. A meu ver o orador tornou a apresentação demasiado entediante e antes que começasse a dormir, fui tomar o pequeno-almoço e assistir a outra sessão.

    09:00: TLA309 - LINQ to XML: Using the Language Integrated Query (LINQ) Framework with XML Data (Mike Taulty)

    Após ter saído da sala onde estava a decorrer a sessão anterior, ao passar pelo corredor, esta era uma das sessões que estava a ser transmitida nos LCDs e fiquei a ver enquanto comia qualquer coisa, acabando por ficar até ao final. Tal como o nome indica, a apresentação focava a utilização de LINQ para fontes de dados em XML, mostrando como é que se podem manipular e alterar documentos XML utilizando LINQ. Apesar de não trazer grandes novidades, como tenho andado a trabalhar com XML, quis ver de que forma o poderia passar a fazer em .NET 3.5.

    10:45: TLA10-IS - Unit Testing Tips and Techniques with Visual Studio 2008 and the .NET Framework (Roy Osherove)

    Mais uma sessão do Roy e mais uma vez mudei de ideias quanto à melhor sessão até ao momento (que tinha sido a primeira dele). Como sessão interactiva que era, começou por pedir a opinião ao público quanto aos temas que gostavam que fossem abordados. Apontou a opinião de alguns assistentes e depois houve uma votação de braço no ar, fazendo ele uma estimativa do nº de pessoas que o teriam levantado. Após a votação, os temas foram abordados por ordem, começando no que tinha tido maior número de votos.

    Os temas abordados foram (por ordem e com uma pequena conclusão):

    1. UI testing: não se deve fazer!
    2. Testing data layers: faz todo o sentido que se teste com a base de dados e não com mocks. Deve-se testar a DAL e a DBL como se fossem uma única camada, utilizando transacções para repor o estado anterior à execução do teste.
    3. Mock objects: devem ser utilizados quando se testam componentes com dependências de outros e quando se pretende fazer testes de interacção (verificar se são invocadas as operações esperadas no componente a que corresponde o mock).
    4. Multithreaded tests: dêem uma vista de olhos à biblioteca do Roy para suporte a este género de testes, aqui.
    5. NUnit vs MbUnit vs MSTest: MSTest é, aparentemente o que oferece menos funcionalidades, estando o MbUnit no lado oposto, sendo também o mais extensível.

    No final da discussão, houve tempo para mais uma música, que tal como a anterior, estava bastante engraçada!

    12:15: LNC02 - Communities? Can They Really Help My Business, My Day-to-Day Job, and My Career? (Bart Martens)

    Esta foi a segunda Lunch Session, onde o tema era as comunidades e como é que estas nos podem ajudar. Não gostei da forma como o orador estava a expor o tema, em tom monocórdico e nada entusiasta e vim-me embora a meio.

    13:30: DAT303 - Entity Framework: Application Patterns (Pablo Castro)

    Este tema era um dos que mais me interessava, pois refere-se a uma nova abordagem à interacção com dados, nas aplicações .NET. Já não é necessário trabalhar directamente com conexões nem com comandos SQL, já não é necessário recorrer a bibliotecas open source como o NHibernate, agora pode-se fazer desenvolvimento com maior abstracção do modelo relacional utilizado, utilizando "apenas" a framework .NET. (ou pelo menos, assim o espero!).

    O Pablo durante toda a sessão mostrou exemplos de utilização da Entity Framework, tanto em arquitecturas de 2 como de mais camadas, mostrou quando e como deve ser utilizada e evidenciou as suas vantagens e ainda houve tempo para falar sobre Web Data Services (Astoria). Fiquei com a sensação que a apresentação poderia ter sido muito melhor: nunca mostrou os ficheiros XML de suporte à Entity Framework (que ainda são de 3 tipos); mostrou demasiado código e código sem interesse, quando podia ter utilizado snippets... Acho que devia ter escolhido outra sessão sobre este tema...

    15:45: TLA305 - Continuous Integration With and Without Team System (Roy Osherove)

    Como não poderia deixar de ser, tive que ir assistir a outra sessão do Roy! Ao contrário das outras, esta não me surpreendeu por aí além, em parte porque a parte inicial toda já a tinha ouvido na primeira sessão que vi dele e até as piadas eram as mesmas...

    Quanto ao tema específico desta sessão, estava à espera de ver mais sobre o CruiseControl.NET, que pareceu reduzido a uma thread que verifica quando é que existem alterações em ficheiros (obviamente que estou a exagerar). Durante a apresentação, introduziu o NAnt e explicou porque é que não gostava dele (demasiado XML, sem ferramentas user-friendly: o NAnt-GUI foi ridicularizado por apenas colocar o código XML dentro de um Windows Form) e mostrou uma alternativa, o FinalBuilder; explicou os fundamentos da Integração Contínua e demonstrou como é que pode ser utilizada com o VSTS2008.

    Apesar de não a ter achado tão boa quanto as suas anteriores, gostei da apresentação, que no final teve mais um momento musical.

    17:30: MED301 - "Small is Beautiful" Building Solutions with the .NET Micro Framework (Dave Baker, Rob Miles)

    Como não podia sair do TechEd sem ver o Rob Miles e como tinha curiosidade para ver a Micro Framework, fui assistir a esta sessão. Durante 75m falou-se das características e limitações desta framework, mostrou-se como se utiliza o VS para desenvolver e fazer debug e demonstrou-se também como construir e trabalhar com o emulador, sempre com o humor britânico do Rob Miles. Na minha opinião faltaram mais exemplos práticos, com o hardware e mesmo os exemplos com o simulador foram muito pobres (apenas um quadrado a mudar de cor através do clique num botão, para simular a lanterna de um vigilante...).

    No final da sessão, o André Sousa, que foi ver a sessão comigo, fez a melhor pergunta do Q&A e levou para casa uma Embedded Fusion board.

    image

     

    Dia 4 - 8 de Novembro


    10:45: WEB310 - The Next Release of ASP.NET – Significant Features Available Soon… (really soon) (Matt Gibbs)

    O último dia em que estive no evento começou com uma sessão sobre as novidades de ASP.NET, como por exemplo em relação a AJAX, Silverlight e o suporte para MVC. Foi uma sessão meramente informativa, onde se mostraram alguns dos novos controlos e exemplos da sua utilização.

    13:30: TLA317 - Real World Unit Testing with Team System for Database Professionals (Brian Randel)

    Esta sessão era uma das que queria mesmo ver e não fiquei nada desiludido! O Brian mostrou que o novo VS apresenta um grande suporte para unit testing a bases de dados, trabalhando directamente com a BD e não através de uma camada de acesso e exemplificou como deve ser feito este tipo de testes. Uma coisa que está em falta é o suporte para outros DBMS, pois por agora apenas existe suporte para SQL Server.

    15:45: ARC305 - SOAP/WS-* and REST: Complementary Communication Styles (David Chappell)

    Grande apresentação do David Chappell, não pelo tema em si, que já não é novo, mas pela forma como o expôs e pelas suas qualidades enquanto orador. Fez um overview a cada um destes tipos de comunicação, apresentando as vantagens e desvantagens de cada um e quando é que deve ser utilizado cada um deles e explicou porque é que não se devem chamar "Web Services" aos serviços baseados em SOAP, classificando-os como uma evolução da comunicação por RPCs.

    17:30: TLA402 - Hardcore Production Debugging of .NET Applications (Ingo Rammer)

    Última sessão do evento (pelo menos para mim), o cansaço acumulado já era bastante e a vontade de dormir também. Ainda assim, fui assistir a uma sessão hardcore :) na qual me consegui manter acordado durante todo o tempo (yeah!). O Ingo começou por expôr uma situação em que temos de fazer debug a código de produção e estamos fisicamente longe e sem acesso a um PC com ferramentas de desenvolvimento. A partir daí, mostrou uma série de ferramentas que podem ser utilizadas para fazer debug remoto a aplicações .NET (sem ser necessário ter símbolos de debug), como por exemplo o WinDbg ou o Mdbg. Os exemplos utilizados vão ser disponibilizados no site dele.


    O balanço final foi bastante positivo, fiquei com a certeza de ter aproveitado ao máximo o tempo que tive e de ter aprendido e ganho bases para enfrentar novos desafios.

    Em relação a Barcelona... Ficou a vontade de lá voltar, com mais tempo para passear! :)

    image image image

    image image image

    October 14

    PPUE @ Funchal

    A minha última reunião com a presidência decorreu de 19 a 24 de Setembro, no Funchal, Madeira. Desta vez, para além da reunião ainda deu para conhecer um pouco o local, pelo que se traduziu numa viagem excelente! Aqui ficam algumas fotos para ilustrar:

    IMGP0878

    IMGP0906

    20092007(002)

    20092007(003)

    20092007(014)

    IMGP0889

    22092007(003)

    Pois é, como podem ver pelas fotos, isto foi só trabalho! ;)