Nova versão do SAPO Mapas

Após alguns (bons) meses de desenvolvimento, aqui está o produto final!

mapas

Das novas funcionalidades e conteúdos, destaco as seguintes:

  • Novas imagens no modo Mapa, com mais informação e maior detalhe http://m.bg.sl.pt
  • Novas imagens no modo Híbrido, também com mais informação e detalhe, mas de forma muito menos intrusiva, realçando a imagem de satélite (que é o que realmente importa) http://m.bh.sl.pt
  • Imagens de satélite de alta resolução (chegando aos 25 cm por pixel em grande parte do terrítório), tendo em muitos casos mais e melhor resolução que outros serviços de mapas http://m.bj.sl.pt
  • Terreno: novo modo de visualização onde se podem ver as elevações de terreno, curvas de nível, marcos geodésicos, … http://m.bk.sl.pt
  • Itinerários com transportes públicos para a zona da Grande Lisboa http://m.bm.sl.pt
  • Menu de contexto com várias opções (experimentem clicar com o botão direito do rato no mapa)
  • Novas categorias de conteúdos: panoramas 360º, meteorologia, notícias, fotos, vídeos, artigos do SAPO Saber, hotspots wi-fi, bombas de gasolina e muito mais (vejam o menu Categorias)
  • Nova API que torna muito mais simples a inclusão do Mapas em qualquer site. Existe documentação online, incluindo exemplos e source code: http://mapas.sapo.pt/api/
  • Etc. etc. etc.

Esperam-se muito mais novidades para breve… Stay tunned!🙂

Posted in Mapas | 24 Comments

Busto usa o Mapas

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

Posted in SAPO | 1 Comment

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 in Uncategorized | 7 Comments

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 in SAPO | 10 Comments

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 in TechdaysPT08 | 8 Comments

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 in TechdaysPT08 | 23 Comments

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

Posted in Programming | 14 Comments