Nelson Correia

.NET Thinking Machine

My Links

News

Search



Blog Stats

Archives

Post Categories

.NET

Links

Login
    u:
    p:
    Remember Me:
     

Tuesday, October 28, 2008 #

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.

posted @ 8:02 AM | Feedback (1)

Tuesday, October 14, 2008 #

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:


posted @ 7:14 AM | Feedback (1)

Tuesday, March 18, 2008 #

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.

posted @ 7:05 PM | Feedback (0)

Friday, March 07, 2008 #

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.

posted @ 6:54 PM | Feedback (2)

Monday, February 18, 2008 #

Visual Studio 2008 COMException when loading a web project from source control

Today I had an issue loading a web project from source control: when I open the solution file, I get an error about a System.Runtime.InteropServices.COMException:

COMException1

And when I try to reload the project:

COMException2

These errors occured somewhere in the communication between Visual Studio and IIS (By the way, I'm using Visual Studio 2008 and IIS 7, in a Windows Vista machine).

I could remove this error by simply editing the .csproj file, specifying that I don't want to use IIS:

<Project ...>
<ProjectExtensions>
<VisualStudio>
<FlavorProperties GUID="{...}">
<WebProjectProperties>
<UseIIS>False</UseIIS>
...

But although on this machine I optionally could not use IIS, in my other development machine, I want to use it.

This error was occuring because I don't have the website configured on this machine. This is most likely to occur when we are first downloading a source controlled web project and don't have IIS configured yet.
So, I've configured IIS for having the URL specified in the .csproj pointing to my project directory. And now, everything should work ok!

Wrong! I get the same error...
Apparently I have to run VS2008 with administrative privileges for it to access IIS metadata. I don't like it, but at least until find a better solution, everything works as expected! :)

posted @ 10:05 PM | Feedback (3)

eScrum, TFS and RSS

Em português.

A few days ago I was building an application that generates an RSS feed with the Scrum projects updates from our TFS server.

As I've said a few posts ago, we use the eScrum tool, that in turn uses the TFS database to store all data it needs. The fact that this tool integrates with TFS seems to be (a priori) a great advantage, but in this specific case, I don't know if this is realy an advantage.

The only advantage that I see is the bug database integration, that allows us to create bug reports in VS itself and then associate them with eScrum tasks. But... That's it! And this, I've already said the first time I talked about this tool and since then I've never found any new advantage from TFS integration.

I'm not going to talk about the disadvantages / "non-documented features" of eScrum, but this integration impose some restrictions to the associated information system. For better expose the problem, think about the (e)Scrum components: we have the Scrum projects, that in turn have products. Each of these products has a Product Backlog, that in turn has Backlog Items. Each project has sprints too and each sprint contains some Backlog Items in the Sprint Backlog with the associated subtasks. Obviously, for each of these items there are several information associated with them, as for example, name, dates, description, number of hours, etc. And besides all these things, we have the Product Owner, the Scrum Master, the team members and from these, those that are part of a specific sprint.

After saying this, you could imagine an information system well organized, where the items in bold (and maybe some other, depending on the implementation) could be transformed in entities / tables. Now, forget everything you though about: eScrum stores all this stuff in the WorkItem table from the TFS database, where the records have references ones to the others and the columns correspondent to that references change depending on what they refer to. In some cases IDs are used, in others the name or other textual columns. What a mess...

For me, the supposed advantage of having TFS integration (at least in this specific case) is made through a "hack" that only complicates the system. I think that eScrum has much more to gain if it stored data in an internal and well organized structure.

There are cases that for optimization purposes it's usefull to have an unnormalized database, but this doesn't seem to be the case.

Given the "complex" organization of eScrum information system, it is a little bit complex to build an application that reads that information. At a certain time, I don't know anymore if I'm building a query that returns the Product Backlog or the Sprint Backlog...

Nothing that the old engineering maxim doesn't solve: all engineering problems are solved by adding an aditional abstraction level (or something). Let's pass to the problem resolution that, if you still remember, was generating an RSS feed with the Scrum projects updates.

This application uses WIQL (Work Item Query Language) to obtain data from TFS, that is a query language similar to SQL.
Here is an example for getting the Product Backlog tasks of a given project:

                     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]

Where <ProjectName> is the project name. To obtain all sprints, we have:

                    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]

As you see, these two queries are too similar and return completely different things. These are the simple cases os the Product Backlog and sprints. For the sprint tasks and subtasks, it gets a little more confuse.

To execute one of these queries, we use the WorkItemStore Query method:

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);

Having identified the most significant queries, those can be encapsulated in app's operations, that have a more user-friendly name. These operations return objects collections that then are used to make the desired feed.

To build the feed, I've used the RSS.NET library, that allows us to work with .NET objects instead of XML code, which I think that's much more error prone.
The application that I've built, each time it executes, it makes several RSS files per project and with all projects summary. Those files are integrally constructed each time the process runs and not in an incremental way. For this, I use the date associated with each WorkItem, the ChangedDate field. Using the WorkItem ID as GUID of an RSS item and the WorkItem ChangedDate field as PubDate, it's possible do detect changes in every item.

Finally, to create an RSS file with the sprints of a given project, it's as simple as:

           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);

The final result, for the summary feed, is something like:

image

posted @ 6:58 AM | Feedback (0)

Monday, January 28, 2008 #

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.

posted @ 7:12 AM | Feedback (0)

Friday, January 11, 2008 #

"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.

posted @ 8:00 AM | Feedback (2)

Monday, December 31, 2007 #

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.

posted @ 6:55 PM | Feedback (0)

Tuesday, December 18, 2007 #

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.

posted @ 6:23 AM | Feedback (0)

Wednesday, December 12, 2007 #

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! :)

posted @ 7:39 AM | Feedback (0)

Saturday, November 10, 2007 #

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

posted @ 1:29 AM | Feedback (2)

Friday, August 10, 2007 #

Configure SQL Server 2005 Reporting Services (by Benjamim)

O Benjamim colocou um post no site do Laboratório .NET do ISEL, o qual transcrevo na íntegra, onde fala dos SQL Server 2005 Reporting Services e de alguns problemas que se podem ter, nomeadamente quando se utilizam contas não administrativas:

Na sequência da realização do meu projecto final, deparei-me com mais um tema/tecnologia a estudar - Reporting Services.

Numa breve introdução, os Reporting Services (ferramenta integrante do SQL Server 2005) servem para realizar relatórios sobre os dados numa determinada base de dados. Tanto podem ser definidos relatórios estáticos, em que o utilizador apenas pode consultar bem como é possível disponibilizar uma ferramenta (o Report Manager) para que o utilizador, recorrendo a data sources previamente disponibilizados, consiga criar de forma dinâmica e "click once" os seus próprios relatórios.

Neste post descrevo apenas o processo para colocar os Reporting Services operacionais na máquina. Mais tarde explicarei como fazer os relatórios e tudo o resto acima descrito.

A instalação própriamente dita, nada tem de mais, a não ser, durante a instalação do SQL Server 2005, seleccionar também a instalação dos "Reporting Services". Mais adiante na instalação, é perguntado se pretendemos uma configuração dos reporting services default ou sem qualquer tipo de configuração - aqui devem colocar a opção para ter a configuração default.

Terminada a instalação, podem já constatar alguns aspectos referentes aos Reporting Services:

- na instância default do SQL Server 2005 (pode ser a instância default caso a tenham instalada ou outra instância que esteja como instância default), navegando até ás bases de dados, existem duas criadas para os reporting Services: ReportServer e ReportServerTempDB. A primeira será onde irão ficar alojados todos os dados, tanto sobre os relatórios, como modelos para relatórios, dados sobre os data sources, etc. A segunda, é uma base de dados temporária que neste momento ainda desconheço qual a sua funcionalidade.

- no IIS (utilizando o IIS 7) sob o default web site existem duas novas aplicações: Reports e ReportServer. O Reports refere-se à aplicação web que permite fazer a gestão dos reporting services e o qual eu referi anteriormente como sendo o Report Manager. É nesta aplicação que irá ser efectuado todo o trabalho sobre relatórios e é esta a aplicação disponibilizada aos utilizadores para a criação dos seus próprios relatórios. O ReportServer é a aplicação servidora dos reporting services.

- em menu iniciar -> programas -> SQL Server 2005 -> configuration tools pode ainda encontrar-se o Reporting Services Configuration Manager. Este utilitário serve para editar as configurações dos reporting services.

Começando com a configuração no Reporting Services Configuration Manager, a maior parte das configurações por default estão correctas, sendo necessário no separador Database Setup configurar os dados sobre a base de dados. A base de dados a usar pode ser a criada por omissão (ReportServer), no entanto é necessário configurar as credênciais de acesso à mesma.

Para testar o servidor, num browser colocar o endereço http://<domain>/ReportServer (ex: http://localhost/ReportServer para configiuração na máquina local ou então colocar o endereço da máquina remota em domain). Se não surgir nenhuma mensagem de erro, o servidor está operacional e podemos ir testar o Report Manager.

Para testar o Report Manager, novamente no browser colocar o endereço http://<domain>/Reports (ex: http://localhost/Reports para aceder ao Report Manager na máquina local). Se surgir uma interface com possibilidade de criar novas pastas e novos data sources, então também o Report Manager está operacional e termina aqui o processo de configuração dos reporting services. Segue-se o desenvolvimento de relatórios (reports) e templates para criação dos relatórios por parte dos utilizadores (models).

PROBLEMAS:

Ao testar o servidor, é possível que surja o seguinte erro:

"The permissions granted to user '<domain>\<user>' are insufficient for performing this operation. (rsAccessDenied)"

Isto significa que o utilizador usado para aceder ao servidor não possui permissões para tal e é necessário atribuir-lhe tais permissões. Para resolver este problema, deve abrir-se o Microsoft SQL Server Management Studio (correr como administrador), clicar sobre Connect na janela de Object Explorer (à esquerda) e escolher Reporting Services na dropdown list. Depois de conectado, clicar com o botão direito do rato sobre a pasta Home e escolher Properties. Na janela que surge deve ser adicionado o utilizador com o qual se pretende aceder ao servidor dos reporting services.

Um outro erro que surge, desta vez quando se tenta aceder tanto ao servidor como ao report manager:

"The report server cannot decrypt the symmetric key used to access sensitive or encrypted data in a report server database. You must either restore a backup key or delete all encrypted content. Check the documentation for more information. (rsReportServerDisabled) (rsRPCError) Get Online Help For more information about this error navigate to the report server on the local server machine, or enable remote errors"

Este erro resolve-se abrindo o Reporting Services Configuration Manager e no separador "Encryptation Keys" fazer Delete para que as chaves geradas sejam apagadas. Depois disto, o erro em questão deixa de ocorrer e é possível aceder sem problemas tanto ao servidor como ao Report Manager.

posted @ 5:56 AM | Feedback (2)

Friday, June 01, 2007 #

Robotics Studio e Windows Vista

Ontem estava a instalar o Robotics Studio no Windows Vista e no final  instalação (que aparentemente tinha decorrido com sucesso), reparei que nem tinha sido adicionado qualquer grupo aos Programas do Menu Iniciar, nem havia nenhum novo project template no Visual Studio. Tentei instalar novamente, para ver se me tinha escapado alguma coisa e o resultado foi o mesmo.

Como eu uso uma conta não administrativa, para fazer a instalação tive de executar o programa de setup com uma conta com mais privilégios. Então, fui ver se tinha sido instalada alguma coisa para essa conta. Et voilá! Lá estava o sub-menu "Robotics Studio" no menu Programas do Menu Iniciar e lá estavam os templates do Visual Studio.

Quanto ao sub-menu no Menu Iniciar, é simples criar um para a minha conta de utilizador. Já quanto aos templates do Visual Studio, não consegui encontrar forma de os copiar de uma conta para a outra. Existem umas 4 localizações onde se encontra o zip dos templates, nomeadamente nos Documentos e na AppData do utilizador e nas ProjectTemplates e ProjectTemplatesCache da directoria de instalação do Visual Studio. Não consegui perceber se basta fazer cópia do zip para alguma directoria da minha conta de utilizador, mas aparentemente não.

Work-around: executar o Visual Studio com a conta com a qual instalei o Robotics Studio. Não é grande coisa, mas foi o que se arranjou em tempo útil. Se alguém souber outra forma de "dar a volta" a isto, agradecia imenso que a colocasse aqui.

posted @ 6:48 PM | Feedback (0)

Visual Studio 2005 & Windows Vista

Se utilizam o Visual Studio 2005 no Windows Vista (com UAC e uma conta não administrativa), para web development, certamente já devem ter reparado que não conseguem fazer debug a uma aplicação web. O que acontece é que quando iniciamos a sessão de debug, a aplicação web é lançada, mas a sessão de debug termina logo a seguir.

Podemos contornar este problema de duas formas:
- Depois de iniciar a aplicação web fazer "attach to process" ao processo do web server;
- Iniciar o Visual Studio como administrador e iniciar o debug normalmente.

Se o primeiro "hack" é muito incómodo, o segundo é muito mau do ponto de vista da segurança.

Para resolver este problema de uma vez por todas, basta fazer uma coisa muito simples, mas (a meu ver) nada intuitiva:
- Adicionar o site http://localhost aos "trusted sites" no Internet Explorer. Isto é feito da seguinte forma: Tools -> Internet Options -> Security -> Trusted Sites -> Sites -> adicionar o site pretendido.

Boas sessões de debug! ;)

posted @ 7:03 AM | Feedback (2)