SlideShare uma empresa Scribd logo
1 de 36
Baixar para ler offline
codebits ‘07




               RSS
BIO




                                                 eep@co.sapo.pt




Eduardo Pinto
Developer SAPO desde 2000
DTP: Direcção de Tecnologia de Produto - Devel
45m   Parte 1 (10 min)
          Intro
          O Bus e outros brinquedos
          RSS no SAPO. O que há?
      Parte 2 (10 min)
          RSS
          GeoRSS
          Ferramentas úteis
      Parte 3 (25 min)
          Do jornal ao Coverflow
          Sugestões para o concurso
Porque é que o utilizador comum ainda não sabe o
que é o RSS?
 Pela mesma razão que não sabe o que é HTML. É irrelevante
 enquanto não for “renderizado” de forma prática.

 RSS é um instrumento. Uma ferramenta. Não é um serviço.

 O RSS por si só não significa nada.
 Ser informado sobre novos posts num blog, já tem significado palpável

 Desistam de tentar evangelizar os utilizadores para o RSS.

 Insistam em evangelizar os programadores para o uso do RSS como
 forma simples de manipular dados ubíquos.

 Insistam em convencer os arquitectos a esconder o RSS e
 transformá-lo um instrumento de magia.
 Os browsers recentes parecem ter aprendido essa lição.
E no SAPO? Fazem alguma coisa nesse sentido?
                       1996          1998          2000          2002          2004        2006




                                                                                              2007
                                                                                    2005
                1995          1997          1999          2001          2003




O SAPO mudou
                                                                                          Bus de Serviços SAPO
Service centric
                                                                                               goes Public!
APIS abertas                                            mashups de
OpenSource JSLib e Broker                              novos serviços

Distribuir e transformar conteúdo

                                                          BUS de
          BUS      Broker
                                                          Serviços
          RSS          JSLib
         Fast                               serviços        serviços           serviços
RSS no SAPO
Exemplos em produção




                                                                           RSS / XML / JSON
                                      Local e Notícias
                                      Blogs,Video, Pesquisa, Fotos
                                      Accuweather, Mapas, Lusa, SIC
                                                                                              Spot
                                      Podcasts, TeK, Jornais Regionais                               Blogs, Fotos,Videos, Messenger
   Fotos   Desktop App: Uploader      etc...                                                         FlickR, etc




              SOAP / Rest                                                php, perl, python, c#, delphi, erlang, c++




                                                                                                                         Flash
                                                                                                             Tempo       Accuweather
                                                    Mail, Messenger, Astrologia
                                   Homepage
  Farmácias   SAPO Mapas                            Trânsito, Tempo, Fotos, Blogs, Tags
developer.sapo.pt
           trac.softwarelivre.sapo.pt
P2

RSS, GeoRSS e Tools
RSS: real simple syndication?




                                                0.92
                                      0.91      0.93                         2.0
                       RDF

                   0.90                         0.94                Real Simple Syndication
                  Rich Site Summary




                                                  1.0
                                              RDF Site Summary




                                             Spin-off da Userland
Geo RSS
                                Permite detalhar um ponto, linha, polígono, rectângulo,
                                elevação, raio, etc.

                                As aplicações de Mapas já são capazes de interpretar o
                                formato via RSS e apresentar graficamente a
                                informação.




 <geo:lat>38.7376</geo:lat>
<geo:long>-9.12403</geo:long>
Geo RSS
 Existem pelo menos 3 standards, alguns com variações.


 Simple                                        GML                                         W3C Geo
                                                <georss:where>                              <geo:Point>
  <georss:point>45.256 -71.92</georss:point>
                                                     <gml:Point>                             <geo:lat>55.701</geo:lat>
                                                        <gml:pos>45.256 -71.92</gml:pos>     <geo:long>12.552</geo:long>
                                                     </gml:Point>                           </geo:Point>

                                                </georss:where>                             <geo:lat>26.58</geo:lat>
                                                                                            <geo:long>-97.83</geo:long>
RSS Tools
   Há dezenas de classes e toolkits para fazer parsing de RSS
   Ninguém precisa de mais uma!           Assegurem-se que tem suporte
                                                      para RSS 2.0 e 0.92.

                                                      e talvez mesmo Atom
<?php
require 'magpie/rss_fetch.inc';
                                                      #!/usr/bin/env python
$bancaRSS = ‘http://umUrlqualquer’;
$banca = fetch_rss($bancaRSS);                        import feedparser
$bancaItems = $banca->items;                          d = feedparser.parse(quot;http://Urlquot;)
                                                      d['feed']['title']
foreach($bancaItems as $b => $i) {
                                                                http://feedparser.org/index.html
  $titulo = $i[‘title’]
  bla bla...
                                                              using System;
       http://magpierss.sourceforge.net/                      using System.Runtime.InteropServices;
                                                              using Microsoft.Feeds.Interop;
                                                               
                                                              namespace RSSClient
                                                              {
                                                                  class Program
                                                                {
                                                                      static void Main(string[] args)
      #!/usr/bin/perl                                             {
      use XML::RSS::Parser::Lite;                                         IFeedsManager manager = new
      use LWP::Simple;                                        FeedsManagerClass();
                                                                          IFeed feed = (IFeed)
                                                              manager.GetFeedByUrl(quot;http://services.sapo.pt/
      my $xml = get(quot;http://url.to.rssquot;);                     Metadata/RSS/quot;);
                                                               
      my $rp = new                                                        foreach (IFeedItem item in
      XML::RSS::Parser::Lite;                                 (IFeedsEnum)feed.Items)
      $rp->parse($xml);                                             {
                                                                              Console.WriteLine(item.Title);
                                                                    }
      print $rp->get('title');                                            Console.ReadLine();
                                                                  }
                                                                }
                                                              }
    http://search.cpan.org/~ebosrup/RSS-Parser-Lite-0.10/
Ferramentas para Mashups
  Há imensas ferramentas de mashups na web
  feedity.com - criar RSS a partir de páginas Web
  plagger.org - criar RSS a partir de outros RSS
...
Demo
Do jornal ao Coverflow
Objectivo:
Tools




        XML
KISS mode. Um script e dois outputs
                                                                      Aceder ao link do
                                                                           jornal




              hack it:                    Banca de Jornais               RSS auto
          Scrape para RSS              (sem feed, dumb page)             discovery




           Página de Jornal
                                                                           .pt | .br
     (tem imagem e link do jornal)




      Sacar imagem da primeira                                           TEXT-TO-
                                                               TEXT
               página                                                    SPEECH
                                       XML Flash




                                                                            AIFF
                                         XML
                                        Podcast


                                                                            MP3
                                        iTunes


                                                                       Tag + Embed
                                                                           APIC
                           Flash Web    iTouch
                           Coverflow    Coverflow
1. Se não tens RSS, “arranja-o”
     http://www.feedity.com/?http://noticias.sapo.pt/banca2



                    hack it:                        Banca de Jornais
                Scrape para RSS                  (sem feed, dumb page)




                 Página de Jornal
          Gerador de link do para
           (tem imagem e RSS jornal)páginas web sem feeds
          Encontra padrões nas páginas e produz items de RSS.
          Actualização em tempo real
          Ajuste imagem da primeira
            Sacar manual dos resultados produzidos.
                                                                         TEXT
                    página                      XML Flash




                                                  XML
                                                 Podcast




                                                  iTunes




                              Flash Web           iTouch
                              Coverflow           Coverflow
Output: RSS 2.0 Feed
<?xml version=quot;1.0quot; encoding=quot;utf-8quot;?>
<rss version=quot;2.0quot;>
  <channel>
    <title>SAPO Notícias - Banca de Jornais</title>
    <link>http://noticias.sapo.pt/banca2</link>
    <description>RSS Web Feed for SAPO Notícias - Banca de Jornais (Generated by Feedity.com)
</description>
    <generator>Feedity/1.6 (+http://www.feedity.com)</generator>
    <pubDate>Sun, 11 Nov 2007 18:39:25 GMT</pubDate>

    <lastBuildDate>Sun, 11 Nov 2007 18:39:25 GMT</lastBuildDate>
    <image>
      <title>Generated by Feedity.com</title>
      <url>http://www.feedity.com/images/feedity_feed_logo-small.gif</url>
      <link>http://noticias.sapo.pt/banca2</link>
    </image>
    <ttl>30</ttl>
    <item>
      <title>Jornal de Notícias</title>
      <link>http://noticias.sapo.pt/banca2/jornal/?jornal=Jornal+de+Not%C3%ADcias++++</link>
      <guid>http://noticias.sapo.pt/banca2/jornal/?jornal=Jornal+de+Not%C3%ADcias++++</guid>
      <description>Jornal de Notícias</description>
    </item>

    <item>
      <title>24 Horas</title>
      <link>http://noticias.sapo.pt/banca2/jornal/?jornal=24+Horas</link>
      <guid>http://noticias.sapo.pt/banca2/jornal/?jornal=24+Horas</guid>
      <description>24 Horas</description>
    </item>
2. Obter imagem da capa e URL do jornal

   <link>http://noticias.sapo.pt/banca2/jornal/?jornal=Jornal+de+Not%C3%ADcias++++</link>


                                                    JPEG da imagem




                                                  Expressão regular para encontrar
                                                  // Extract newspaper URL and cover

                                                  preg_match('/href=quot;(S+)quot;
                                                  target=quot;_newquot;>s+<img src=quot;(.+)quot;/',
                                                  $s,$matches);

                                                  $url = $matches[1];
                                                  $coverUrl = $matches[2];




URL do Jornal
3. Obter feed de RSS do jornal.
   Os feeds são declarados na secção HEAD das páginas
   O formato da declaração é simples:
   <link rel=quot;alternatequot; type=quot;application/rss+xmlquot;
   title=quot;RSSquot; href=”http://umURL”>


   Obtemos as primeiras linhas (<20 deve ser suficiente) e procuramos por
   ocorrências de alternate e rss.
   Depois, usamos uma expressão regular para obter o URL do feed

   if(stristr($o, 'alternate') && stristr($o,'rss')) {
     preg_match('/href=quot;(S+)quot;/i',$o,$matches);
     $rssFeed = $matches[1];


                         <head>
                         <meta http-equiv=quot;Content-Typequot; content=quot;text/html; charset=utf-8quot;>
                         <meta name=quot;datequot; content=quot;2007-11-11 01:00:00quot;>
                         <title>Jornal de Not&iacute;cias - Capa JN Domingo, 11 de Novembro
                         de 2007</title>
                         <link rel=quot;alternatequot; type=quot;application/rss+xmlquot; title=quot;JN:
                         &Uacute;ltima Hora em RSSquot; href=quot;http://services.sapo.pt/RSS/Feed/
                         noticias/sapo_noticias/jornal_de_noticiasquot; />
                         <link href=quot;http://jn.sapo.pt/css/lusomundo/jn/jn.cssquot;
                         rel=quot;stylesheetquot; type=quot;text/cssquot;>
                         <base href=quot;http://jn.sapo.pt/quot;>
                         <link rel=quot;stylesheetquot; type=quot;text/cssquot; href=quot;http://imgs.sapo.pt/
                         css/lusomundo/jn/sp_menu.cssquot;>
                         </head>
4. Parse do feed de RSS do jornal
   Queremos o <description> dos items de notícias. 3 items chegam para o exemplo.
   Atenção ao encoding. Nem todos seguem as boas práticas. Há feeds declarados
   como UTF-8 que na realidade chegam em Latin-1 e cheios de HTML entities.

   $tts = html_entity_decode($tts,ENT_QUOTES);
   $tts = strip_tags($tts);

   // Paranoid
   $tts = utf8_encode($tts);




   O Text-to-Speech que vamos usar usa a língua portuguesa.
   Verificar o TLD (.pt | .br). Um serviço de detecção com base no conteúdo seria
   muito bom :)

   preg_match('/.pt|blogspot.com|.com.br|cabra|uniao|alentejo/',$url)
5. Text-To-Speech (TTS)
  Utilizadores de Mac OSX
  InfoVox iVox
  http://assistiveware.com/infovox_ivox.php

  Boa implementação do português de Portugal.
  A versão de trial dura bastante tempo e integra muito bem
  com o sistema operativo.


  $cmdline = '/usr/bin/say -o '.$audioStore. '/' . $audio .' -f '.
  $textStore . '/' . $text;



                         “Este conversor de texto para voz, funciona bastante
                         bem. É mesmo catita!”


  Gera um ficheiro no formato AIFF
5. Text-To-Speech (TTS)
  Utilizadores de Mac OSX
  InfoVox iVox
  http://assistiveware.com/infovox_ivox.php

  Boa implementação do português de Portugal.
  A versão de trial dura bastante tempo e integra muito bem
  com o sistema operativo.


  $cmdline = '/usr/bin/say -o '.$audioStore. '/' . $audio .' -f '.
  $textStore . '/' . $text;



                         “Este conversor de texto para voz, funciona bastante
                         bem. É mesmo catita!”


  Gera um ficheiro no formato AIFF
6. Converter em MP3
  No brainer.

  LAME MP3 encoder


  $cmdline = quot;/opt/local/bin/lame --add-id3v2 --tt quot;$titlequot; --ta
  quot;SAPOquot; --ignore-tag-errors --silent $audioStore/$audio $audioStore/
  $audio.mp3quot;;
7. Embedded tag: APIC
  O XML de definição do podcast apenas permite uma imagem
  por feed.

  O iTunes, no entanto, reconhece a tag APIC aplicada
  individualmente a cada MP3 do podcast. É o que
  habitualmente identificamos como artwork de uma música.

  APIC (attached picture): faz parte da norma ID3v2.
  A imagem é embebida no ficheiro de áudio.

  http://www.id3.org/id3v2.4.0-frames




               $cmdline = quot;/usr/local/bin/eyeD3 --no-color --add-image=
               $coverStore/$cover:FRONT_COVER $audioStore/$audio.mp3quot;;
8. Formato de Podcast do iTunes
       É simplesmente um formato RSS 2.0 com extensões próprias
       do iTunes (categoria, imagens, subtítulo, etc)
<?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
<rss xmlns:itunes=quot;http://www.itunes.com/dtds/podcast-1.0.dtdquot; version=quot;2.0quot;>
 
<channel>
<title>All About Everything</title>
<link>http://www.example.com/podcasts/everything/index.html</link>
<language>en-us</language>
<copyright>&#x2117; &amp; &#xA9; 2005 John Doe &amp; Family</copyright>
<itunes:subtitle>A show about everything</itunes:subtitle>
<itunes:author>John Doe</itunes:author>
<itunes:summary>All About Everything is blabla</itunes:summary>
<description>All About Everything is blabla</description>
<itunes:owner>
<itunes:name>John Doe</itunes:name>
<itunes:email>john.doe@example.com</itunes:email>
</itunes:owner>
<itunes:image href=quot;http://example.com/podcasts/everything/AllAboutEverything.jpgquot; />
<itunes:category text=quot;Technologyquot;>
<itunes:category text=quot;Gadgetsquot;/>
</itunes:category>
<itunes:category text=quot;TV &amp; Filmquot;/>
 
<item>
<title>Shake Shake Shake Your Spices</title>
<itunes:author>John Doe</itunes:author>
<itunes:subtitle>A short primer on table spices</itunes:subtitle>
<itunes:summary>This week we talk about bla bla</itunes:summary>
<enclosure url=quot;http://example.com/podcasts/everything/AllAboutEverythingEpisode3.m4aquot; length=quot;8727310quot;
type=quot;audio/x-m4aquot; />
<guid>http://example.com/podcasts/archive/aae20050615.m4a</guid>
<pubDate>Wed, 15 Jun 2005 19:00:00 GMT</pubDate>
<itunes:duration>7:04</itunes:duration>
<itunes:keywords>salt, pepper, shaker, exciting</itunes:keywords>
</item>
Usámos RSS certo?
  Ao gerar um feed de uma página que não tinha
  Para informar o iTunes que havia novos podcasts

  e no entanto...

  Em nenhum momento o utilizador leu a palavra RSS ou teve
  de lidar com o conceito.
9. Subscribe, Sync, Play!


Live Demo
...
10. XML Flash Coverflow




                   Live Demo
Sugestões
para projectos no codebits
microformats
(Operator toolbar Firefox)

                                                                     customer care
                                                                  ouvir os utilizadores
                                                                  e interagir com eles
         mapas
          tags


                             Extracção de informação geográfica
                                                                   passionate users
                                    a partir de um texto




         cam API
        um jogo ?
codebits ‘07




                        exit()
               Samples e referências online na intra

Mais conteúdo relacionado

Semelhante a RSS no SAPO: Ferramentas e Exemplos

Geo on Rails - Um guia para manter o seu cabelo.
Geo on Rails - Um guia para manter o seu cabelo.Geo on Rails - Um guia para manter o seu cabelo.
Geo on Rails - Um guia para manter o seu cabelo.Guilherme Vinicius Moreira
 
Ruby on Rails 100% na cloud com heroku e outros serviços
Ruby on Rails 100% na cloud com heroku e outros serviçosRuby on Rails 100% na cloud com heroku e outros serviços
Ruby on Rails 100% na cloud com heroku e outros serviçosBruno Ghisi
 
Revolução RSS Bibliotecas Apresentacao
Revolução RSS Bibliotecas ApresentacaoRevolução RSS Bibliotecas Apresentacao
Revolução RSS Bibliotecas ApresentacaoPaulo Leitao
 
Você não deveria escrever uma API para isso
Você não deveria escrever uma API para issoVocê não deveria escrever uma API para isso
Você não deveria escrever uma API para issoJunior Conte
 
De Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações MashupDe Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações MashupWagner Roberto dos Santos
 
Instalando arquitetura Lambda com Graphx e Elasticsearch 2.0 em uma aplicação...
Instalando arquitetura Lambda com Graphx e Elasticsearch 2.0 em uma aplicação...Instalando arquitetura Lambda com Graphx e Elasticsearch 2.0 em uma aplicação...
Instalando arquitetura Lambda com Graphx e Elasticsearch 2.0 em uma aplicação...tdc-globalcode
 
Instanciando a Arquitetura Lambda com GraphX e Elasticsearch 2.0 em uma apl...
Instanciando a Arquitetura Lambda com  GraphX e Elasticsearch 2.0  em uma apl...Instanciando a Arquitetura Lambda com  GraphX e Elasticsearch 2.0  em uma apl...
Instanciando a Arquitetura Lambda com GraphX e Elasticsearch 2.0 em uma apl...Luiz Henrique Zambom Santana
 
Uso do SEER - Curso XV ENEC - ABEC - Costão do Santinho, Florianópolis, 24nov...
Uso do SEER - Curso XV ENEC - ABEC - Costão do Santinho, Florianópolis, 24nov...Uso do SEER - Curso XV ENEC - ABEC - Costão do Santinho, Florianópolis, 24nov...
Uso do SEER - Curso XV ENEC - ABEC - Costão do Santinho, Florianópolis, 24nov...Suelybcs .
 
SAPO Broker
SAPO BrokerSAPO Broker
SAPO Brokercodebits
 
Apresentação CEJS - Do nada para a nuvem
Apresentação CEJS - Do nada para a nuvemApresentação CEJS - Do nada para a nuvem
Apresentação CEJS - Do nada para a nuvemRodrigo Valerio
 
Usabilidade em RSS (por Bruno Maranhão)
Usabilidade em RSS (por Bruno Maranhão)Usabilidade em RSS (por Bruno Maranhão)
Usabilidade em RSS (por Bruno Maranhão)Bruno Maranhão
 
Feeds (RSS)
Feeds (RSS)Feeds (RSS)
Feeds (RSS)marinawr
 
Ecossistema Ruby e Rails (Serpro BH)
Ecossistema Ruby e Rails (Serpro BH)Ecossistema Ruby e Rails (Serpro BH)
Ecossistema Ruby e Rails (Serpro BH)Daniel Lopes
 
Arquitetura executável: Documentando e automatizando a comunicação da equipe ...
Arquitetura executável: Documentando e automatizando a comunicação da equipe ...Arquitetura executável: Documentando e automatizando a comunicação da equipe ...
Arquitetura executável: Documentando e automatizando a comunicação da equipe ...WeOp - The Operations Summit
 

Semelhante a RSS no SAPO: Ferramentas e Exemplos (20)

Geo on Rails - Um guia para manter o seu cabelo.
Geo on Rails - Um guia para manter o seu cabelo.Geo on Rails - Um guia para manter o seu cabelo.
Geo on Rails - Um guia para manter o seu cabelo.
 
Rails asservice
Rails asserviceRails asservice
Rails asservice
 
Ruby on Rails 100% na cloud com heroku e outros serviços
Ruby on Rails 100% na cloud com heroku e outros serviçosRuby on Rails 100% na cloud com heroku e outros serviços
Ruby on Rails 100% na cloud com heroku e outros serviços
 
Revolução RSS Bibliotecas Apresentacao
Revolução RSS Bibliotecas ApresentacaoRevolução RSS Bibliotecas Apresentacao
Revolução RSS Bibliotecas Apresentacao
 
Você não deveria escrever uma API para isso
Você não deveria escrever uma API para issoVocê não deveria escrever uma API para isso
Você não deveria escrever uma API para isso
 
TCC - Comparativo de ORMs e Acesso Nativo
TCC - Comparativo de ORMs e Acesso NativoTCC - Comparativo de ORMs e Acesso Nativo
TCC - Comparativo de ORMs e Acesso Nativo
 
Web app
Web appWeb app
Web app
 
De Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações MashupDe Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações Mashup
 
Instalando arquitetura Lambda com Graphx e Elasticsearch 2.0 em uma aplicação...
Instalando arquitetura Lambda com Graphx e Elasticsearch 2.0 em uma aplicação...Instalando arquitetura Lambda com Graphx e Elasticsearch 2.0 em uma aplicação...
Instalando arquitetura Lambda com Graphx e Elasticsearch 2.0 em uma aplicação...
 
Instanciando a Arquitetura Lambda com GraphX e Elasticsearch 2.0 em uma apl...
Instanciando a Arquitetura Lambda com  GraphX e Elasticsearch 2.0  em uma apl...Instanciando a Arquitetura Lambda com  GraphX e Elasticsearch 2.0  em uma apl...
Instanciando a Arquitetura Lambda com GraphX e Elasticsearch 2.0 em uma apl...
 
Uso do SEER - Curso XV ENEC - ABEC - Costão do Santinho, Florianópolis, 24nov...
Uso do SEER - Curso XV ENEC - ABEC - Costão do Santinho, Florianópolis, 24nov...Uso do SEER - Curso XV ENEC - ABEC - Costão do Santinho, Florianópolis, 24nov...
Uso do SEER - Curso XV ENEC - ABEC - Costão do Santinho, Florianópolis, 24nov...
 
Bigadata casese opotunidades
Bigadata casese opotunidadesBigadata casese opotunidades
Bigadata casese opotunidades
 
SAPO Broker
SAPO BrokerSAPO Broker
SAPO Broker
 
Apresentação CEJS - Do nada para a nuvem
Apresentação CEJS - Do nada para a nuvemApresentação CEJS - Do nada para a nuvem
Apresentação CEJS - Do nada para a nuvem
 
Grupo j feed
Grupo j feedGrupo j feed
Grupo j feed
 
Usabilidade em RSS (por Bruno Maranhão)
Usabilidade em RSS (por Bruno Maranhão)Usabilidade em RSS (por Bruno Maranhão)
Usabilidade em RSS (por Bruno Maranhão)
 
Feeds (RSS)
Feeds (RSS)Feeds (RSS)
Feeds (RSS)
 
Big data e ecossistema hadoop
Big data e ecossistema hadoopBig data e ecossistema hadoop
Big data e ecossistema hadoop
 
Ecossistema Ruby e Rails (Serpro BH)
Ecossistema Ruby e Rails (Serpro BH)Ecossistema Ruby e Rails (Serpro BH)
Ecossistema Ruby e Rails (Serpro BH)
 
Arquitetura executável: Documentando e automatizando a comunicação da equipe ...
Arquitetura executável: Documentando e automatizando a comunicação da equipe ...Arquitetura executável: Documentando e automatizando a comunicação da equipe ...
Arquitetura executável: Documentando e automatizando a comunicação da equipe ...
 

Mais de codebits

Gis SAPO Hands On
Gis SAPO Hands OnGis SAPO Hands On
Gis SAPO Hands Oncodebits
 
Aplicações Web TV no Meo
Aplicações Web TV no MeoAplicações Web TV no Meo
Aplicações Web TV no Meocodebits
 
Forms Usability 101
Forms Usability 101Forms Usability 101
Forms Usability 101codebits
 
Speak up: como criar Speech-based apps
Speak up: como criar Speech-based appsSpeak up: como criar Speech-based apps
Speak up: como criar Speech-based appscodebits
 
XMPP Hands-On
XMPP Hands-OnXMPP Hands-On
XMPP Hands-Oncodebits
 
Mitos da Acessibilidade Web
Mitos da Acessibilidade WebMitos da Acessibilidade Web
Mitos da Acessibilidade Webcodebits
 
Getting started with mobile devices development - Openmoko Freerunner
Getting started with mobile devices development - Openmoko FreerunnerGetting started with mobile devices development - Openmoko Freerunner
Getting started with mobile devices development - Openmoko Freerunnercodebits
 
Hardware Hacking area: Make Cool Things with Microcontrollers (and learn to s...
Hardware Hacking area: Make Cool Things with Microcontrollers (and learn to s...Hardware Hacking area: Make Cool Things with Microcontrollers (and learn to s...
Hardware Hacking area: Make Cool Things with Microcontrollers (and learn to s...codebits
 
Getting started with mobile devices development - Openmoko Freerunner
Getting started with mobile devices development - Openmoko FreerunnerGetting started with mobile devices development - Openmoko Freerunner
Getting started with mobile devices development - Openmoko Freerunnercodebits
 
Exploring XMPP
Exploring XMPPExploring XMPP
Exploring XMPPcodebits
 
Sapo BUS Hands-On
Sapo BUS Hands-OnSapo BUS Hands-On
Sapo BUS Hands-Oncodebits
 
Qtractor - An Audio/MIDI multi-track sequencer
Qtractor - An Audio/MIDI multi-track sequencerQtractor - An Audio/MIDI multi-track sequencer
Qtractor - An Audio/MIDI multi-track sequencercodebits
 
Making the Chumby
Making the ChumbyMaking the Chumby
Making the Chumbycodebits
 
Globs - Gestão de Glossários
Globs - Gestão de GlossáriosGlobs - Gestão de Glossários
Globs - Gestão de Glossárioscodebits
 
ATrad - Sistema de Garantia de Qualidade de Traduções
ATrad - Sistema de Garantia de Qualidade de TraduçõesATrad - Sistema de Garantia de Qualidade de Traduções
ATrad - Sistema de Garantia de Qualidade de Traduçõescodebits
 
Alto Desempenho com Java
Alto Desempenho com JavaAlto Desempenho com Java
Alto Desempenho com Javacodebits
 
Sapo GIS Hands-On
Sapo GIS Hands-OnSapo GIS Hands-On
Sapo GIS Hands-Oncodebits
 
Practical Thin Server Architecture With Dojo Sapo Codebits 2008
Practical Thin Server Architecture With Dojo Sapo Codebits 2008Practical Thin Server Architecture With Dojo Sapo Codebits 2008
Practical Thin Server Architecture With Dojo Sapo Codebits 2008codebits
 

Mais de codebits (20)

Gis SAPO Hands On
Gis SAPO Hands OnGis SAPO Hands On
Gis SAPO Hands On
 
Aplicações Web TV no Meo
Aplicações Web TV no MeoAplicações Web TV no Meo
Aplicações Web TV no Meo
 
Forms Usability 101
Forms Usability 101Forms Usability 101
Forms Usability 101
 
Speak up: como criar Speech-based apps
Speak up: como criar Speech-based appsSpeak up: como criar Speech-based apps
Speak up: como criar Speech-based apps
 
XMPP Hands-On
XMPP Hands-OnXMPP Hands-On
XMPP Hands-On
 
Mitos da Acessibilidade Web
Mitos da Acessibilidade WebMitos da Acessibilidade Web
Mitos da Acessibilidade Web
 
Getting started with mobile devices development - Openmoko Freerunner
Getting started with mobile devices development - Openmoko FreerunnerGetting started with mobile devices development - Openmoko Freerunner
Getting started with mobile devices development - Openmoko Freerunner
 
Hardware Hacking area: Make Cool Things with Microcontrollers (and learn to s...
Hardware Hacking area: Make Cool Things with Microcontrollers (and learn to s...Hardware Hacking area: Make Cool Things with Microcontrollers (and learn to s...
Hardware Hacking area: Make Cool Things with Microcontrollers (and learn to s...
 
CouchDB
CouchDBCouchDB
CouchDB
 
Getting started with mobile devices development - Openmoko Freerunner
Getting started with mobile devices development - Openmoko FreerunnerGetting started with mobile devices development - Openmoko Freerunner
Getting started with mobile devices development - Openmoko Freerunner
 
Exploring XMPP
Exploring XMPPExploring XMPP
Exploring XMPP
 
Sapo BUS Hands-On
Sapo BUS Hands-OnSapo BUS Hands-On
Sapo BUS Hands-On
 
Qtractor - An Audio/MIDI multi-track sequencer
Qtractor - An Audio/MIDI multi-track sequencerQtractor - An Audio/MIDI multi-track sequencer
Qtractor - An Audio/MIDI multi-track sequencer
 
Making the Chumby
Making the ChumbyMaking the Chumby
Making the Chumby
 
Globs - Gestão de Glossários
Globs - Gestão de GlossáriosGlobs - Gestão de Glossários
Globs - Gestão de Glossários
 
ATrad - Sistema de Garantia de Qualidade de Traduções
ATrad - Sistema de Garantia de Qualidade de TraduçõesATrad - Sistema de Garantia de Qualidade de Traduções
ATrad - Sistema de Garantia de Qualidade de Traduções
 
Alto Desempenho com Java
Alto Desempenho com JavaAlto Desempenho com Java
Alto Desempenho com Java
 
Sapo GIS Hands-On
Sapo GIS Hands-OnSapo GIS Hands-On
Sapo GIS Hands-On
 
Gis@sapo
Gis@sapoGis@sapo
Gis@sapo
 
Practical Thin Server Architecture With Dojo Sapo Codebits 2008
Practical Thin Server Architecture With Dojo Sapo Codebits 2008Practical Thin Server Architecture With Dojo Sapo Codebits 2008
Practical Thin Server Architecture With Dojo Sapo Codebits 2008
 

RSS no SAPO: Ferramentas e Exemplos

  • 2. BIO eep@co.sapo.pt Eduardo Pinto Developer SAPO desde 2000 DTP: Direcção de Tecnologia de Produto - Devel
  • 3. 45m Parte 1 (10 min) Intro O Bus e outros brinquedos RSS no SAPO. O que há? Parte 2 (10 min) RSS GeoRSS Ferramentas úteis Parte 3 (25 min) Do jornal ao Coverflow Sugestões para o concurso
  • 4. Porque é que o utilizador comum ainda não sabe o que é o RSS? Pela mesma razão que não sabe o que é HTML. É irrelevante enquanto não for “renderizado” de forma prática. RSS é um instrumento. Uma ferramenta. Não é um serviço. O RSS por si só não significa nada. Ser informado sobre novos posts num blog, já tem significado palpável Desistam de tentar evangelizar os utilizadores para o RSS. Insistam em evangelizar os programadores para o uso do RSS como forma simples de manipular dados ubíquos. Insistam em convencer os arquitectos a esconder o RSS e transformá-lo um instrumento de magia. Os browsers recentes parecem ter aprendido essa lição.
  • 5. E no SAPO? Fazem alguma coisa nesse sentido? 1996 1998 2000 2002 2004 2006 2007 2005 1995 1997 1999 2001 2003 O SAPO mudou Bus de Serviços SAPO Service centric goes Public! APIS abertas mashups de OpenSource JSLib e Broker novos serviços Distribuir e transformar conteúdo BUS de BUS Broker Serviços RSS JSLib Fast serviços serviços serviços
  • 7. Exemplos em produção RSS / XML / JSON Local e Notícias Blogs,Video, Pesquisa, Fotos Accuweather, Mapas, Lusa, SIC Spot Podcasts, TeK, Jornais Regionais Blogs, Fotos,Videos, Messenger Fotos Desktop App: Uploader etc... FlickR, etc SOAP / Rest php, perl, python, c#, delphi, erlang, c++ Flash Tempo Accuweather Mail, Messenger, Astrologia Homepage Farmácias SAPO Mapas Trânsito, Tempo, Fotos, Blogs, Tags
  • 8. developer.sapo.pt trac.softwarelivre.sapo.pt
  • 10. RSS: real simple syndication? 0.92 0.91 0.93 2.0 RDF 0.90 0.94 Real Simple Syndication Rich Site Summary 1.0 RDF Site Summary Spin-off da Userland
  • 11. Geo RSS Permite detalhar um ponto, linha, polígono, rectângulo, elevação, raio, etc. As aplicações de Mapas já são capazes de interpretar o formato via RSS e apresentar graficamente a informação. <geo:lat>38.7376</geo:lat> <geo:long>-9.12403</geo:long>
  • 12. Geo RSS Existem pelo menos 3 standards, alguns com variações. Simple GML W3C Geo <georss:where> <geo:Point> <georss:point>45.256 -71.92</georss:point> <gml:Point> <geo:lat>55.701</geo:lat> <gml:pos>45.256 -71.92</gml:pos> <geo:long>12.552</geo:long> </gml:Point> </geo:Point> </georss:where> <geo:lat>26.58</geo:lat> <geo:long>-97.83</geo:long>
  • 13. RSS Tools Há dezenas de classes e toolkits para fazer parsing de RSS Ninguém precisa de mais uma! Assegurem-se que tem suporte para RSS 2.0 e 0.92. e talvez mesmo Atom <?php require 'magpie/rss_fetch.inc'; #!/usr/bin/env python $bancaRSS = ‘http://umUrlqualquer’; $banca = fetch_rss($bancaRSS); import feedparser $bancaItems = $banca->items; d = feedparser.parse(quot;http://Urlquot;) d['feed']['title'] foreach($bancaItems as $b => $i) { http://feedparser.org/index.html $titulo = $i[‘title’] bla bla... using System; http://magpierss.sourceforge.net/ using System.Runtime.InteropServices; using Microsoft.Feeds.Interop;   namespace RSSClient {     class Program   {         static void Main(string[] args) #!/usr/bin/perl     { use XML::RSS::Parser::Lite;             IFeedsManager manager = new use LWP::Simple; FeedsManagerClass();             IFeed feed = (IFeed) manager.GetFeedByUrl(quot;http://services.sapo.pt/ my $xml = get(quot;http://url.to.rssquot;); Metadata/RSS/quot;);   my $rp = new             foreach (IFeedItem item in XML::RSS::Parser::Lite; (IFeedsEnum)feed.Items) $rp->parse($xml);       {                 Console.WriteLine(item.Title);       } print $rp->get('title');             Console.ReadLine();     }   } } http://search.cpan.org/~ebosrup/RSS-Parser-Lite-0.10/
  • 14. Ferramentas para Mashups Há imensas ferramentas de mashups na web feedity.com - criar RSS a partir de páginas Web plagger.org - criar RSS a partir de outros RSS
  • 15. ...
  • 16. Demo Do jornal ao Coverflow
  • 18. Tools XML
  • 19. KISS mode. Um script e dois outputs Aceder ao link do jornal hack it: Banca de Jornais RSS auto Scrape para RSS (sem feed, dumb page) discovery Página de Jornal .pt | .br (tem imagem e link do jornal) Sacar imagem da primeira TEXT-TO- TEXT página SPEECH XML Flash AIFF XML Podcast MP3 iTunes Tag + Embed APIC Flash Web iTouch Coverflow Coverflow
  • 20. 1. Se não tens RSS, “arranja-o” http://www.feedity.com/?http://noticias.sapo.pt/banca2 hack it: Banca de Jornais Scrape para RSS (sem feed, dumb page) Página de Jornal Gerador de link do para (tem imagem e RSS jornal)páginas web sem feeds Encontra padrões nas páginas e produz items de RSS. Actualização em tempo real Ajuste imagem da primeira Sacar manual dos resultados produzidos. TEXT página XML Flash XML Podcast iTunes Flash Web iTouch Coverflow Coverflow
  • 21. Output: RSS 2.0 Feed <?xml version=quot;1.0quot; encoding=quot;utf-8quot;?> <rss version=quot;2.0quot;> <channel> <title>SAPO Notícias - Banca de Jornais</title> <link>http://noticias.sapo.pt/banca2</link> <description>RSS Web Feed for SAPO Notícias - Banca de Jornais (Generated by Feedity.com) </description> <generator>Feedity/1.6 (+http://www.feedity.com)</generator> <pubDate>Sun, 11 Nov 2007 18:39:25 GMT</pubDate> <lastBuildDate>Sun, 11 Nov 2007 18:39:25 GMT</lastBuildDate> <image> <title>Generated by Feedity.com</title> <url>http://www.feedity.com/images/feedity_feed_logo-small.gif</url> <link>http://noticias.sapo.pt/banca2</link> </image> <ttl>30</ttl> <item> <title>Jornal de Notícias</title> <link>http://noticias.sapo.pt/banca2/jornal/?jornal=Jornal+de+Not%C3%ADcias++++</link> <guid>http://noticias.sapo.pt/banca2/jornal/?jornal=Jornal+de+Not%C3%ADcias++++</guid> <description>Jornal de Notícias</description> </item> <item> <title>24 Horas</title> <link>http://noticias.sapo.pt/banca2/jornal/?jornal=24+Horas</link> <guid>http://noticias.sapo.pt/banca2/jornal/?jornal=24+Horas</guid> <description>24 Horas</description> </item>
  • 22. 2. Obter imagem da capa e URL do jornal <link>http://noticias.sapo.pt/banca2/jornal/?jornal=Jornal+de+Not%C3%ADcias++++</link> JPEG da imagem Expressão regular para encontrar // Extract newspaper URL and cover preg_match('/href=quot;(S+)quot; target=quot;_newquot;>s+<img src=quot;(.+)quot;/', $s,$matches); $url = $matches[1]; $coverUrl = $matches[2]; URL do Jornal
  • 23. 3. Obter feed de RSS do jornal. Os feeds são declarados na secção HEAD das páginas O formato da declaração é simples: <link rel=quot;alternatequot; type=quot;application/rss+xmlquot; title=quot;RSSquot; href=”http://umURL”> Obtemos as primeiras linhas (<20 deve ser suficiente) e procuramos por ocorrências de alternate e rss. Depois, usamos uma expressão regular para obter o URL do feed if(stristr($o, 'alternate') && stristr($o,'rss')) { preg_match('/href=quot;(S+)quot;/i',$o,$matches); $rssFeed = $matches[1]; <head> <meta http-equiv=quot;Content-Typequot; content=quot;text/html; charset=utf-8quot;> <meta name=quot;datequot; content=quot;2007-11-11 01:00:00quot;> <title>Jornal de Not&iacute;cias - Capa JN Domingo, 11 de Novembro de 2007</title> <link rel=quot;alternatequot; type=quot;application/rss+xmlquot; title=quot;JN: &Uacute;ltima Hora em RSSquot; href=quot;http://services.sapo.pt/RSS/Feed/ noticias/sapo_noticias/jornal_de_noticiasquot; /> <link href=quot;http://jn.sapo.pt/css/lusomundo/jn/jn.cssquot; rel=quot;stylesheetquot; type=quot;text/cssquot;> <base href=quot;http://jn.sapo.pt/quot;> <link rel=quot;stylesheetquot; type=quot;text/cssquot; href=quot;http://imgs.sapo.pt/ css/lusomundo/jn/sp_menu.cssquot;> </head>
  • 24. 4. Parse do feed de RSS do jornal Queremos o <description> dos items de notícias. 3 items chegam para o exemplo. Atenção ao encoding. Nem todos seguem as boas práticas. Há feeds declarados como UTF-8 que na realidade chegam em Latin-1 e cheios de HTML entities. $tts = html_entity_decode($tts,ENT_QUOTES); $tts = strip_tags($tts); // Paranoid $tts = utf8_encode($tts); O Text-to-Speech que vamos usar usa a língua portuguesa. Verificar o TLD (.pt | .br). Um serviço de detecção com base no conteúdo seria muito bom :) preg_match('/.pt|blogspot.com|.com.br|cabra|uniao|alentejo/',$url)
  • 25. 5. Text-To-Speech (TTS) Utilizadores de Mac OSX InfoVox iVox http://assistiveware.com/infovox_ivox.php Boa implementação do português de Portugal. A versão de trial dura bastante tempo e integra muito bem com o sistema operativo. $cmdline = '/usr/bin/say -o '.$audioStore. '/' . $audio .' -f '. $textStore . '/' . $text; “Este conversor de texto para voz, funciona bastante bem. É mesmo catita!” Gera um ficheiro no formato AIFF
  • 26. 5. Text-To-Speech (TTS) Utilizadores de Mac OSX InfoVox iVox http://assistiveware.com/infovox_ivox.php Boa implementação do português de Portugal. A versão de trial dura bastante tempo e integra muito bem com o sistema operativo. $cmdline = '/usr/bin/say -o '.$audioStore. '/' . $audio .' -f '. $textStore . '/' . $text; “Este conversor de texto para voz, funciona bastante bem. É mesmo catita!” Gera um ficheiro no formato AIFF
  • 27. 6. Converter em MP3 No brainer. LAME MP3 encoder $cmdline = quot;/opt/local/bin/lame --add-id3v2 --tt quot;$titlequot; --ta quot;SAPOquot; --ignore-tag-errors --silent $audioStore/$audio $audioStore/ $audio.mp3quot;;
  • 28. 7. Embedded tag: APIC O XML de definição do podcast apenas permite uma imagem por feed. O iTunes, no entanto, reconhece a tag APIC aplicada individualmente a cada MP3 do podcast. É o que habitualmente identificamos como artwork de uma música. APIC (attached picture): faz parte da norma ID3v2. A imagem é embebida no ficheiro de áudio. http://www.id3.org/id3v2.4.0-frames $cmdline = quot;/usr/local/bin/eyeD3 --no-color --add-image= $coverStore/$cover:FRONT_COVER $audioStore/$audio.mp3quot;;
  • 29. 8. Formato de Podcast do iTunes É simplesmente um formato RSS 2.0 com extensões próprias do iTunes (categoria, imagens, subtítulo, etc) <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <rss xmlns:itunes=quot;http://www.itunes.com/dtds/podcast-1.0.dtdquot; version=quot;2.0quot;>   <channel> <title>All About Everything</title> <link>http://www.example.com/podcasts/everything/index.html</link> <language>en-us</language> <copyright>&#x2117; &amp; &#xA9; 2005 John Doe &amp; Family</copyright> <itunes:subtitle>A show about everything</itunes:subtitle> <itunes:author>John Doe</itunes:author> <itunes:summary>All About Everything is blabla</itunes:summary> <description>All About Everything is blabla</description> <itunes:owner> <itunes:name>John Doe</itunes:name> <itunes:email>john.doe@example.com</itunes:email> </itunes:owner> <itunes:image href=quot;http://example.com/podcasts/everything/AllAboutEverything.jpgquot; /> <itunes:category text=quot;Technologyquot;> <itunes:category text=quot;Gadgetsquot;/> </itunes:category> <itunes:category text=quot;TV &amp; Filmquot;/>   <item> <title>Shake Shake Shake Your Spices</title> <itunes:author>John Doe</itunes:author> <itunes:subtitle>A short primer on table spices</itunes:subtitle> <itunes:summary>This week we talk about bla bla</itunes:summary> <enclosure url=quot;http://example.com/podcasts/everything/AllAboutEverythingEpisode3.m4aquot; length=quot;8727310quot; type=quot;audio/x-m4aquot; /> <guid>http://example.com/podcasts/archive/aae20050615.m4a</guid> <pubDate>Wed, 15 Jun 2005 19:00:00 GMT</pubDate> <itunes:duration>7:04</itunes:duration> <itunes:keywords>salt, pepper, shaker, exciting</itunes:keywords> </item>
  • 30. Usámos RSS certo? Ao gerar um feed de uma página que não tinha Para informar o iTunes que havia novos podcasts e no entanto... Em nenhum momento o utilizador leu a palavra RSS ou teve de lidar com o conceito.
  • 31. 9. Subscribe, Sync, Play! Live Demo
  • 32. ...
  • 33. 10. XML Flash Coverflow Live Demo
  • 35. microformats (Operator toolbar Firefox) customer care ouvir os utilizadores e interagir com eles mapas tags Extracção de informação geográfica passionate users a partir de um texto cam API um jogo ?
  • 36. codebits ‘07 exit() Samples e referências online na intra