Em 2009 foi criada a primeira versão da SAPO Developer Network, um desdobrável com alguns dos serviços do SAPO.
Recentemente repetimos o esforço e lançamos uma nova versão:
Para além da reorganização da rede foi também realizado um trabalho na área dos desdobráveis; a versão deste ano abre mais facilmente bastando apenas puxar duas pontas do folheto.
A SAPO Developer Network v2.0 foi distribuída no Codebits 2010, mas a versão em pdf já se encontra online aqui.
O Verbatim é um dos projectos nascidos num SAPO Lab.
Este projecto deverá agora receber alguma força e dinamização extra.
Com esta ideia em mente o Jorge Teixeira - um dos elementos que criou o projecto - veio passar uma semana em Lisboa, nas instalações do SAPO (mas deixámo-lo sempre sair para comer e dormir).
A semana começou com uma reunião de apresentação do projecto, por dentro e por fora.
Na sala, uma dúzia de pessoas com as mais variadas skills, incluindo as tecnologias e plataformas SAPO empregues no projecto e não só: Perl, JavaScript, MySQL, Usabilidade, Acessibilidade, Segurança, SAPO Broker, LibSAPO.js, etc.
Após esta sessão foram marcadas cinco outras reuniões com diferentes elementos desta task force.
Reunião 1: Perl e MySQL
Quatro pessoas numa sala com um único intuito: analisar o código do projecto (ou parte deste) para o conseguir optimizar.
Foram apontadas coisas simples como a diferença entre usar CGI ou FastCGI, foi feito benchmarking ao código para encontrar os bottlenecks, foram optimizadas queries de SQL (e inclusivé foi reduzido o número destas numa grande escala), etc.
O Jorge saiu da reunião com já algumas alterações no projecto e uma folha cheia de notas que ele teria que implementar mais tarde.
Reunião 2: JavaScript e Segurança
Quando a reunião começou a equipa de JavaScript já tinha realizado alguns testes à plataforma, pelo que já levavam uma lista de sugestões.
Havia código que podia ser optimizado e foram ainda apresentadas algumas soluções como o ySlow para análise do restante.
Também foram apresentadas algumas falhas de segurança que o site possuía; as mesmas foram explicadas em detalhe, bem como as medidas a tomar para as fechar.
No final da reunião havia mais uma folha com notas nas mãos do Jorge.
Reunião 3: Usabilidade e Acessibilidade
A equipa de QA do SAPO realizou uma avaliação heurística ao Verbatim e nesta reunião apresentou ao Jorge os resultados da mesma.
Saíram desta reunião uma série de sugestões e recomendações para tornar o serviço mais apelativo, usável e acessível.
Mais uma reunião, mais uma folha.
Reunião 4: Arquitectura e Serviços
Aqui foram analisadas a arquitectura actual e as possibilidades futuras da mesma.
Foi explorada em detalhe a interacção com o SAPO Broker e revistas algumas boas práticas de utilização do mesmo que poderão ajudar o projecto.
Foi analisado o que seria necessário para implementar determinadas funcionalidades que estão previstas (extracção de dados semânticos, etc).
Houve também uma discussão sobre LSP (léxico semântico do português) e no final o Jorge tinha agora quatro listas de coisas a fazer e a analisar.
Reunião 5: Web Services
Neste reunião foram abordadas as tecnologias base usadas para publicar diversos tipos de dados do Verbatim como um serviço.
Foram realçados vários aspectos importantes como a disponibilização dos dados a outros serviços e plataformas, tentando assim começar a tornar transversais a todo o SAPO alguns Web Services.
Avaliação final
No final desta semana perguntamos ao Jorge que avaliação fazia desta semana:
"A avaliação final que eu faço a esta semana de trabalho no SAPO é simplesmente excelente! Excelente por dois motivos, por um lado vim para o Porto com uma enorme lista de melhorias a implementar (é sempre bom saber que um projecto ainda tem muito por onde evoluir) e por outro por ter conhecido uma equipa de gente conhecedora e disposta a partilhar os conhecimentos e ajuda.
[…]
Para terminar, algumas das sugestões com que vim do Sapo já foram implementadas, e as melhorias foram muito boas. Só a nível de tempos de acesso, conseguimos uma diminuição da ordem dos 50% em relação aos valores anteriores."
Recentemente criámos a SAPO Developer Network, um desdobrável (890mm x 585mm) com alguns dos serviços do SAPO para melhor os dar a conhecer ao público do Codebits.
Para quem não esteve no Codebits, a versão em pdf já se encontra online (3M).
Segue-se agora um trabalho de análise para decidir quais os serviços a incluir (faltam muitos) e quais os que poderão ter que ser removidos por uma questão de espaço. A próxima versão deverá surgir num futuro próximo.
Update: este serviço deixou de estar disponível.
Uma área forte no SAPO é a área de GIS.
Em http://services.sapo.pt/Metadata/Service/G
Podemos, por exemplo, começar por aceder a uma lista de distritos ordenados por id, em http://services.sapo.pt/GIS/GetDistricts
<GetDistrictsSortedByIdResponse> <GetDistrictsSortedByIdResult> <District> <DistrictId>01</DistrictId> <DistrictName>Aveiro</DistrictName> <Latitude>40.64392</Latitude> <Longitude>-8.6422205</Longitude> <Municipalities/> </District> <District> <DistrictId>02</DistrictId> <DistrictName>Beja</DistrictName> <Latitude>38.0149956</Latitude> <Longitude>-7.86307573</Longitude> <Municipalities/> </District> ... </GetDistrictsSortedByIdResult> </GetDistrictsSortedByIdResponse>
Tendo o id do distrito desejado, podemos então aceder a mais informação sobre o mesmo, em http://services.sapo.pt/GIS/GetMunicipal
Podemos agora aceder, entre outra informação, a uma lista de POIs (Point Of Interest) do distrito em questão: http://services.sapo.pt/GIS/GetPOIByDist
Como exemplo de uma funcionalidade diferente, a recolha de informação através de um código postal: http://services.sapo.pt/GIS/GetLocationB
<GetLocationByZipCodeResponse> <GetLocationByZipCodeResult> <CountryId>PT</CountryId> <CountryName>Portugal</CountryName> <DistrictId>11</DistrictId> <DistrictName>Lisboa</DistrictName> <MunicipalityId>1106</MunicipalityId> <MunicipalityName>Lisboa</MunicipalityName> <ParishId>110644</ParishId> <ParishName>São Jorge de Arroios</ParishName> <Latitude>38.73112</Latitude> <Longitude>-9.137293</Longitude> <Metadata/> </GetLocationByZipCodeResult> </GetLocationByZipCodeResponse>
O serviço é bastante completo e possui imensa informação.
A descrição completa do serviço encontra-se disponível em http://services.sapo.pt/Metadata/Service/G
Update: este serviço deixou de estar disponível.
A plataforma de Vídeos do SAPO disponibiliza um Web Service em http://services.sapo.pt/Metadata/Service/V
Este serviço suporta operações como criação de novos utilizadores (CreateUser), gestão de vídeos, realizando operações como a adição (AddVideo) ou remoção (DeleteVideo) de conteúdo, navegação, etc.
Existem ainda operações relacionadas com categorias, playlists e outras funcionalidades.
A descrição completa do serviço encontra-se em http://services.sapo.pt/Metadata/Service/V
Para uma mais simples integração com os vários Web Services do SAPO, um dos serviços que disponibilizamos é o CodeGeneration.
Acedendo à página de um serviço SAPO com um contrato WSDL, encontramos à direita da página uma caixa com links para a geração de código em várias linguagens.
Tal permite acelerar uma integração com qualquer um destes serviços.
As linguagens suportadas são, actualmente, C#, Visual Basic, Java, PHP, Perl, Python, Ruby e JavaScript.
A título de exemplo, eis a geração de código PHP para o Web Service Holiday.
O serviço encontra-se disponível em http://services.sapo.pt/Metadata/Service/C
Update: este serviço deixou de estar disponível.
Em http://services.sapo.pt/Metadata/Service/E
Para consultar a lista das moedas suportadas basta aceder a http://services.sapo.pt/Exchange/Currenc
<Currencies xmlns="http://services.sapo.pt/Metadata/Exchange"> <Currency> <Code>AFA</Code> <Country>Afghanistan Afghani</Country> </Currency> <Currency> <Code>ALL</Code> <Country>Albanian Lek</Country> </Currency> ... </Currencies>
Para sabermos quantos dólares vale um euro podemos aceder a http://services.sapo.pt/Exchange/LastRat
Também podemos consultar o valor de uma determinada quantidade de moeda. Por exemplo, para consultar o câmbio de 1,000 dólares em euros acedemos a http://services.sapo.pt/Exchange/LastRat
<LastRate xmlns="http://services.sapo.pt/Metadata/Exchange"> <Code>USD</Code> <Amount>1000</Amount> <Date>29-03-2009 21:00:00</Date> <Days>1</Days> <To> <Currency> <Code>EUR</Code> <Ask>752.8000</Ask> <Bid>752.3000</Bid> </Currency> </To> </LastRate>
A descrição completa do serviço encontra-se disponível em http://services.sapo.pt/Metadata/Service/E
Update: este serviço deixou de estar disponível.
O SAPO sempre se prezou pela inovação e experimentação e esta semana lança um novo serviço: o Puny URL.
Apesar de à primeira vista o Puny URL parecer apenas um outro compactador de URLs, traz uma inovação excelente: Unicode.
O Puny URL compacta um URL de duas formas diferentes, retornando um URL compacto típico e um outro mais compacto ainda, fazendo uso de caracteres Unicode.
Para uma melhor compreensão do serviço colocamos algumas questões à equipa da Pesquisa do SAPO, que desenvolveu este sistema:
Q: Quantos URLs conseguem ter na plataforma?
R: Os que quiseres :) As PunyURLs em Unicode permitem ter aproximadamente 41,000 URLs únicas comprimidas num único caracter; com dois caracteres existem 1,7 mil milhões de combinações possíveis.
Q: Este serviço fornece alguma API para developers que queiram integrar este serviço nas suas aplicações?
R: Sim! Fornecemos uma API nos Web Services do SAPO em http://services.sapo.pt/Metadata/Service/P
Q: Que casos práticos de utilização prevêem?
R: O Twitter, o envio de URLs por SMS, dizer um endereço na internet que é complicado pelo telefone... as URLs no formato http://br3.sl.pt são bastante práticas para soletrar - não há maiúsculas nem minúsculas. Essencialmente situações em que a brevidade seja importante. No caso da PunyURL em Unicode poupamos *imenso* espaço, e pode ser útil em serviços como o Twitter, em que se clica na URL.
Q: Como é que isto funciona por baixo e que tecnologia está envolvida?
R: Os serviços de compressão existentes de URLs têm uma base de dados por detrás que mapeia a URL enviada para um número. A URL comprimida é o número convertido de base 10 - o nosso sistema de algarismos - para base 62 - 26 letras maíusculas + 26 letras minúsculas mais os dez algarismos.
O número 500,000 é assim convertido para '264w' em base 62.
No PunyURL funcionamos de forma ligeiramente diferente em *ambas* as URLs comprimidas que fornecemos.
Os browsers modernos permitem caracteres acentuados, como é o caso do domínio da Força Aérea Portuguesa, http://www.forçaaérea.pt/.
Na realidade, o domínio 'forçaaérea.pt' é convertido em 'xn--foraarea-u0aw.pt', através dum sistema de codificação chamado "Punycode", definido no RFC 3492.
Estas regras de conversão permitem que caracteres Unicode europeus, russos e asiáticos possam ser utilizados em domínios.
No PunyURL utilizamos os caracteres dos diversos planos asiáticos, o que nos permite definir o número 500,000 em apenas dois caracteres: 㐋촔.
Assim o serviço pode armazenar milhões de endereços dos nossos utilizadores e continuar a fornecer domínios curtos sem termos de reciclar endereços, o que significa que ficam sempre permanentes.
No caso dos endereços em ASCII, http://b.oi.sl.pt/, utilizamos um truque de DNS chamado "Wildcarding" que permite que endereços não criados vão parar a determinado site. É o que acontece há já alguns anos com o SAPO: http://perl.sapo.pt/ resulta numa pesquisa pela palavra 'perl', porque o domínio .sapo.pt aponta para a Pesquisa do SAPO quando não existe um hostname definido.
No caso do www.sapo.pt, este está definido e não vai à pesquisa do SAPO.
Q: Que protecções contra spam foram implementadas?
R: Verificamos quais os hosts de destino, não permitimos referências circulares e monitorizamos a sua utilização. No entanto, disponibilizamos o serviço de "preview"; se se acrescentar um '-' ao final de uma PunyURL consegue-se ver qual o destino da mesma sem ter de visitar o destino.
Por exemplo: http://b.kp.sl.pt/-.
Para gerar uma Puny URL a partir de qualquer página na Internet arraste o seguinte link para a sua barra de favoritos: PunyURL.
O SAPO disponibiliza um Web Service com a programação de TV (incluindo actualmente todos os canais da oferta MEO).
Para consultar a lista de canais incluidos no sistema basta invocar o serviço em http://services.sapo.pt/EPG/GetChannelLi
A resposta será semelhante a:
<GetChannelListResponse xmlns="http://services.sapo.pt/Metadata/EPG">
<GetChannelListResult>
<Channel>
<Name>RTP1</Name>
<Sigla>RTP1</Sigla>
</Channel>
<Channel>
<Name>RTP2</Name>
<Sigla>RTP2</Sigla>
</Channel>
...
</GetChannelListResult>
</GetChannelListResponse>
Após termos a lista de canais podemos aceder à programação para um canal específico dentro de um intervalo temporal.
Para acedermos à programação do canal RTP2, por exemplo, usamos o serviço em http://services.sapo.pt/EPG/GetChannelBy
O resultado será algo como:
<GetChannelByDateIntervalResponse xmlns="http://services.sapo.pt/Metadata/EPG">
<GetChannelByDateIntervalResult>
<Name>RTP2</Name>
<Sigla>RTP2</Sigla>
<Programs>
<Program>
<Id>1600303</Id>
<Title>Os Simpsons T17</Title>
<Description>Homer trabalha como inspector de segurança na fábrica nuclear local; Marge tenta manter a paz na família; Bart é um rapaz endiabrado de 10 anos; Lisa, com 8, é inteligente, toca saxofone e segue a dieta vegetariana; e a bebé Maggie manifesta as emoções sugando desesperadamente a chucha.</Description>
...
<StartTime>2009-03-08 20:00:00</StartTime>
<Duration>3600</Duration>
<EndTime>2009-03-08 21:00:00</EndTime>
</Program>
</Programs>
</GetChannelByDateIntervalResult>
</GetChannelByDateIntervalResponse>
Também podemos aceder a informação mais detalhada sobre um programa acedendo directamente ao mesmo (usando o identificador Id dentro de Program): http://services.sapo.pt/EPG/GetProgramBy
A descrição do serviço e dos seus métodos encontra-se disponível em http://services.sapo.pt/Metadata/Service/E
O SAPO disponibiliza um Web Service para consulta de feriados portugueses (nacionais, regionais e municipais).
Para consultar os feriados nacionais de 2009, por exemplo, basta invocar o serviço em http://services.sapo.pt/Holiday/GetNatio
A resposta do serviço é semelhante a (mas mais extensa):
<GetNationalHolidaysResponse xmlns="http://services.sapo.pt/Metadata/Holiday">
<GetNationalHolidaysResult>
<Holiday>
<Name>Ano Novo</Name>
<Date>2009-01-01T00:00:00</Date>
<Description>O Ano-Novo é um evento que acontece quando uma cultura celebra o fim dd
e um ano e o começo do próximo. Todas culturas que têm calendários anuais celebram o ""
Ano-Novo". A celebração do evento é também chamada réveillon, termo oriundo do verbo
réveiller, que em francês significa "despertar".</Description>
<Type>National</Type>
</Holiday>
<Holiday>
<Name>Carnaval</Name>
<Date>2009-02-24T00:00:00</Date>
<Description>Feriado facultativo, sendo rara a sua não utilização na prática. A
data tem origem na tradição pagã de celebrar o final do inverno e foi depois adaptada pp
ela Igreja Católica marcando agora o período de 40 dias antes da Semana Santa (Quaresma))
, ou 47 dias antes da Páscoa, sendo conhecido também por Entrudo</Description>
<Type>Optional</Type>
</Holiday>
...
</GetNationalHolidaysResult>
</GetNationalHolidaysResponse>
Mais exemplos de utilização deste método podem ser consultados em http://services.sapo.pt/Metadata/Service/H
Portugal possui 14 feriados:
Para estes últimos feriados móveis existem também métodos específicos (caso não desejemos uma lista exaustiva de feriados): GetEaster, GetCorpusChristi, GetGoodFriday e GetCarnival.
O serviço suporta o cálculo dos feriados para os anos entre 1582 e 2299.
A descrição do serviço e dos seus métodos encontra-se disponível em http://services.sapo.pt/Metadata/Service/H