TCC Ginga Social
TCC Ginga Social
TCC Ginga Social
GINGA SOCIAL:
FIODOR CASTRO
FLORIANÓPOLIS - SC
2012/2
UNIVERSIDADE FEDERAL DE SANTA CATARINA
GINGA SOCIAL:
FIODOR CASTRO
FLORIANÓPOLIS - SC
2012/2
FIODOR CASTRO
GINGA SOCIAL:
Trabalho de conclusão de curso apresentado como parte dos requisitos para obtenção do grau
de Bacharel em Sistemas de Informação.
Orientador
Banca Examinadora
Fiodor Castro
indiretamente, para a realização deste trabalho. Em especial agradeço aos meus pais,
Terezinha e Santiago, que me ensinarem a ler e valorizar os estudos, ao professor Frank pela
acolhida e sua dedicação e ao colega e amigo Gustavo que decidiu prontamente encarar este
Agradeço em especial a minha mãe Glacy e meu pai Arion por todo o amor, carinho e
À minha namorada Dani pelo seu amor, carinho, dedicação e incentivo durante toda a
minha graduação, ao meu irmão Ramiro por ter inspirado-me a entrar na área da tecnologia e
à minha tia Caren por ter oferecido a oportunidade de viver essa experiência em Florianópolis.
Agradeço também a minha avó Noeli pelo seu carinho e ajuda nos momentos precisos.
demais pessoas envolvidas que estiverem presentes até o fim desse projeto.
Por último, mas não menos importante, agradeço ao meu amigo e colega Fiodor pela
oportunidade que me deu para trabalhar ao seu lado nesse projeto. Agradeço também ao nosso
1.4 Justificativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2. FUNDAMENTAÇÃO TEÓRICA . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.2 TV Digital . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.2.3 Middlewares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.2.3.2 MHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
2.2.3.3 ARIB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
2.2.3.4 GEM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
2.3.1.2 Ginga-CC . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
2.3.1.3 Ginga-NCL . . . . . . . . . . . . . . . . . . . . . . . . . . .64
5 BIBLIOGRAFIA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Figura 41 - Página para criação de conta no Ginga Social a partir da conta existente no
Figura 42 - Tela de solicitação dos dados do usuário (fazer login com o Facebook)
BD - Banco de Dados
GS - Ginga Social
JS - JavaScript
MVC - Model-view-controller
TV - Televisão
presenciamos, também, a ascensão da chamada Web 2.0 e com ela as Redes Sociais. A
relação entre redes sociais e TV Digital tem-se intensificado abrindo novas oportunidades de
estudos. Após uma abordagem sobre a TV Digital e seus diferentes padrões, bem como as
1 INTRODUÇÃO
1.1 Contextualização
de 15 anos, compreendendo os anos de 1991 a 2006. Somente neste último ano, após
inúmeros debates sobre qual dos modelos já existentes adotar, o governo brasileiro,
(SBTVD) teria como base o padrão de sinais do ISDB-T - Integrated Services Digital
Definido os rumos da TV digital no Brasil, deu-se início por parte das emissoras, ao
muito destaque está sendo dado ao sinal de alta definição em detrimento das demais
(canal), entretanto o governo federal editou a norma 001/2009 1 que deixa dúvidas
1
Norma 001/2009 publicada através da Portaria do Ministério das Comunicações nº 24 de
11/02/2009.
2
Ginga: http://www.ginga.org.br
17
dispositivos que não o controle remoto. O canal de retorno é um meio que permitirá os
interatividade.
presenciamos, também, a ascensão da chamada Web 2.0. A Web 2.0 é um termo que
passou a ser usado após o estouro da bolha da Internet em 2001. Depois de muitas
discussões sobre sua definição Tim O’Reilly a definiu como algo de fronteiras não bem
definidas, num contexto onde a Internet é uma plataforma de serviços dos quais os
destacam as redes sociais, como o Youtube3, Facebook4 e Twitter5. Estas redes sociais
são serviços que conectam indivíduos e seu conteúdo consiste somente em informações
sociais, bem como o alto nível de interação entre seus usuários, fez com que estas se
seus programas e, por outro lado, os conteúdos televisivos são os principais e mais
3
Youtube: https://www.youtube.com
4
Facebook: http://www.facebook.com
5
Twitter: https://twitter.com
18
foi o uso do Twitter durante a transmissão do evento esportivo Super Bowl nos Estados
Unidos, onde 50% da atividade nesta rede social foi relacionada ao evento (GHISI;
programa BBB10. A audiência não foi recorde, pelo contrário foi a mais baixa de todas
as edições, mas de longe foi a edição com o maior número de votos e rentabilidade.
Durante o programa era impossível acessar o Twitter ou Orkut 6 sem deparar-se com
medida que o padrão SBTVD vai se concretizando já que, podemos observar, ambos
possuem grande aceitação por parte dos brasileiros. Fala-se em uma convergência entre
estas duas plataformas e esta nova realidade torna-se um interessante tema a ser
estudado.
6
Orkut: http://www.orkut.com.br
19
execução;
ao tema proposto;
1.4 Justificativa
lado tem-se a TV Digital ainda incipiente e no outro as redes sociais em alta, com
milhões de usuários ao redor do mundo. Através de leituras dos mais variados temas e
das próprias experiências pessoais, os autores estão do lado daqueles que entendem que
caminha-se para uma convergência entre mídias. Trazer funcionalidades de uma rede
1.5 Metodologia
decorrer do texto.
2. FUNDAMENTAÇÃO TEÓRICA
obsoletas e caem em desuso. O aparelho televisor, pelo menos por enquanto, tem
evoluído ao longo da história passando por diversas transformações até atingir a forma
como o conhecemos hoje. Juntamente com sua evolução tecnológica ocorre, também, o
condutividade elétrica variava dependendo da quantidade de luz. Dois anos depois outro
imagens por meio de circuitos elétricos. Estas descobertas foram as precursoras de todas
as demais que fizeram com que a televisão chegasse aos dias atuais.
décadas de 50 e 60, que deram origem a outros. (Montez; Becker, 2005) os descrevem
2005).
BECKER, 2005).
novas perspectivas para maior interação entre as mídias que compõem as novas
2.2 TV Digital
grandeza física - seja acústica, ótica ou elétrica - que veicula algum tipo de informação.
Um sinal de TV, por exemplo, corresponde a uma onda eletromagnética que veicula
informações sobre áudio, vídeo e dados de sincronização, usadas pelo aparelho receptor.
(MONTEZ; BECKER, 2005) definem ainda que um sinal analógico é qualquer tipo de
quantização e codificação. (FOROUZAN, 2006) por sua vez comenta que um sinal
analógico possui infinitos níveis de tensão num certo período de tempo. Quando uma
onda evolui do valor A para o valor B, ela passa através de um número infinito de
(Figura 1-b).
vídeo, um fluxo de dados. A transmissão de dados adicionais junto com fluxos de áudio
fracamente acoplado é aquele em que os dados se relacionam com o áudio e vídeo mas
um fluxo de transporte (Transport Stream - TS) como mostra a Figura 2. Com o envio
Todos os tipos de arquivos, tais como páginas web, imagens JPEG, músicas em
para o set-top box são os exemplos mais citados de uso para essa tecnologia. A
protocolo DSM-CC (Digital Storage Media Command and Control Protocol). O DSM-
CC foi criado originalmente visando uma forma de suportar a entrega de vídeos sob
da figura. O áudio e vídeo dos programas passam por um codificador digital para gerar
novos dados que podem ser adquiridos através do canal de interatividade (canal de
retorno). Este canal pode servir também como um canal de comunicação entre a
emissora e o telespectador.
2007).
camada superior e usar os serviços oferecidos pela inferior. Dessa forma, as aplicações
toda a comunicação entre a aplicação e os demais serviços são oferecidos pelas camadas
MONTEZ; BECKER,2005):
ritmo e o estilo;
● Mídias frias: São as que permitem a interatividade, que deixam lugar livre onde
mundial de informação).
tipos de mídias, se considerarmos o seu estado mais rudimentar até aquele em que é
conter dados adicionais além do áudio e vídeo. O fluxo de dados (datacasting) pode ser
utilizado para transportar músicas, imagens, páginas web, aplicações etc. Somente com
possibilitam novos usos para o objeto televisão, podendo agora também ver
tem o controle total sobre a programação. Ele apenas reage a impulsos e caminhos pré-
definidos pelo transmissor o que vai contra uma característica da interatividade que é a
não padronização. Sendo assim estes autores propõem mais três níveis:
● Nível 5: o telespectador pode ter uma presença mais efetiva no conteúdo, saindo
que pode ser originado por intermédio de uma webcam ou filmadora analógica.
ao que acontece na internet hoje, onde qualquer pessoa pode publicar um site,
estudiosos tentam definir ao menos o seu alcance. Apesar de uma ampla abrangência, é
vídeo e elementos gráficos, como fotos e animações. Na sua forma mais simples,
resolução do monitor deixa de ser na proporção 4:3 para ser 16:9, igual à
horário.
que se pode fazer, o que tem disponível e serve como um canal de entrada para
essas aplicações.
Aos sete grupos propostos podem ser acrescentados mais dois grupos levando
pelo guia com o uso do próprio controle remoto. Semelhante ao Walled Garden
padrão brasileiro, são eles: DVB, o europeu, ATSC, o estadunidense e ISDB (Integrated
Services Digital Broadcasting), o japonês. A adoção destes padrões nos países ao redor
do globo pode ser vista na Figura 4. A região da america do sul aparece como ISBD,
pois, o padrão brasileiro teve como base o padrão japonês e foi expandido para os
diferentes camadas e cada um dos sistemas possui a sua implementação para elas. A
Figura 5 mostra as tecnologias utilizadas nas diferentes camadas dos três padrões:
7
Disponível em: http://en.wikipedia.org/wiki/Broadcast_television_systems#cite_note-5. Acesso
em: Agosto de 2012
35
Foi o primeiro dos três a ser desenvolvido, começa em 1990 e termina em 1995,
definindo diferentes esquemas de modulação para transmissão terrestre, via cabo e via
recepção por antenas internas e não permite a recepção móvel. Para as redes de
televisão a cabo e as transmissões via satélite, da mesma forma que o padrão DVB, o
SILVEIRA, 2004).
37
Vídeo (ISO, 1996b) com qualidade HDTV. Na camada de transporte, da mesma forma
1996a).
nome DVB (DVB, 2011). Este padrão é formado por um conjunto de normas que
terrestre por radiodifusão); DVB-C (transmissão via cabo); DVB-S (transmissão via
transmissão pode variar entre 5 e 31,7 Mbps, dependendo dos parâmetros utilizados na
codificação e modulação do sinal. Este padrão utiliza seis modos de transmissão que
abrangem desde sistemas de alta definição (HDTV – High Definition Television) até
SILVEIRA, 2004).
Para as redes de televisão a cabo, o DVB-C (ETSI, 1998) adota a modulação 64-
QAM ou QAM. Para a difusão via satélite, o DVB-S (ETSI, 1997a) recomenda a
O padrão ISDB teve sua especificação lançada no ano de 1999 no Japão pelo
grupo DiBEG - Digital Broadcasting Experts Group (DiBEG, 2011). Assim como os
demais padrões o ISDB é formado por diversos documentos que definem os diversos
camadas.
40
O ISDB utiliza a modulação COFDM, com algumas variações; possui uma taxa
de transferência que varia entre 3,65 a 23,23 Mbps, e uma largura de banda de 6, 7 ou 8
podendo ser usado, por exemplo, para prover simultaneamente recepção de baixa taxa
(SDTV) para recepção estática e alta taxa de dados (HDTV) para boas condições de
2.2.3 Middlewares
designar camadas de software que não constituem diretamente aplicações, mas que
2.2.3.1 DASE
definidos abaixo:
Agent).
Aplicações DASE podem ser híbridas, ou seja, uma mescla entre aplicações
(Personal Java, Java Media Framework, e Java TV), realizando tarefas complexas
procedural é o Xlet Java em conjunto com outros conteúdos multimídia como gráfico,
vídeo e áudio (DASE, 2003 apud SASAKE, 2007). As aplicações declarativas são
Entretanto, o DASE System pode consumir recursos de cache para reter recursos de um
de um DASE System. Uma vez que a aplicação deixa este estado ela só retorna através
de um evento terminate, que pode ser gerado pela própria aplicação ou pelo DASE
System.
45
ambiente, porém, ainda não está sendo executada. Ao passar para o estado Active uma
aplicação pode consumir qualquer recurso do ambiente, sendo que apenas uma
aplicação pode estar neste estado. Ao passar para o estado Suspended, uma aplicação
libera todos os recursos dos quais estava fazendo uso e bloqueia todas as suas threads.
atenção por este padrão. Além dos objetivos citados, o MHP é um padrão aberto,
podendo assim ser usado por empresas, países e fundações sem o pagamento de
2005)
HAVi e DVB API) sobre uma camada de interface baseada em máquina virtual Java e
denominada como DVB-J API. No contexto dos padrões DVB, uma aplicação
interpretada pelo user agent é chamada de aplicação DVB-HTML. Um user agent pode
aplicação DVB-HTML.
MHP. O user agent utiliza a API genérica definida pelo middleware procedural, ou seja,
um user agent tem acesso aos recursos do terminal de acesso ou mesmo da máquina
(SASAKE, 2007).
O ciclo de vida das aplicações DVB-J corresponde ao próprio ciclo de vida dos
do sistema inclusive aqueles que dizem respeito à aplicação. Neste estado o espectador
ainda não visualiza a aplicação. Já no estado Active assume-se que se tem disponível
Quando há perda de todos os recursos a aplicação passa para o estado Destroyed mas,
ARIB (Association of Radio Industries and Businesses) (ARIB, 2002), definindo uma
49
dos canais interativos da rede, tanto fixas quanto móveis. Este middleware suporta três
vídeo, áudio e legendas – ou ainda naqueles que precisam ser sincronizados com
ANTONIAZZI, 2005).
navegador BML do padrão japonês e seguem um ciclo de vida simples já que somente
uma instância do browser é ativada. Seus estados são: Ativo, Inicializado, Suspenso e
Destruído.
compatível com os demais, ou seja, aplicações somente serão executadas no padrão para
51
novos componentes.
Por ser o padrão de middleware mais maduro, o MHP foi escolhido como
simples não é adequada em sistemas de outros países que adotam, por exemplo, ATSC
ou ARIB. Por conseguinte, o GEM (Globally Executable MHP) (ETSI, 2005) foi criado
Segundo (LEITE et al. 2005) formalmente, o GEM por si só não pode ser
considerado uma especificação completa para terminais de acesso. O correto é dizer que
existentes devem se adaptar para obter uma conformidade que garante a execução
do MHP e sinaliza aquelas que devem ser substituídas de acordo com a infraestrutura da
plataforma a ser considerada. Uma solução será considerada compatível com o GEM se
o consórcio DVB entender que as alternativas funcionais desta são equivalentes àquelas
ANTONIAZZI, 2005)
Pode-se dizer que o início, por parte do governo, dos estudos sobre TV Digital
no Brasil foi em 1991 com a criação da Comissão Assessora para Assuntos de Televisão
54
modelos ATSC e DVB que se encontravam em fase de implantação nos Estados Unidos
e Reino Unido, respectivamente. Em 1999 o padrão japonês foi concluído e passou a ser
testado também.
exclusão social, sendo que esta é uma das características que o distingue dos demais
língua
democratização da informação;
receptores no Brasil; e
2006 foi instituído um novo decreto, o de número nº 5.820, onde foi definido que o
56
SBTVD teria como base o ISDB e seria possível incorporar inovações tecnológicas com
O sistema brasileiro passou por alterações e de fato não se pode dizer que
H.264, também conhecido como MPEG-4 Part 10 ou AVC (Advanced Video Coding),
no lugar do padrão MPEG-2 utilizado nos outros sistemas de TV Digital, pois o H.264
permite obter a mesma qualidade do MPEG-2 com a metade da taxa de bits. Assim, o
seu uso permite transmitir uma quantidade duas vezes maior de vídeos por um mesmo
Coding), também conhecido como MPEG-2 Part 7 ou MPEG-4 Part 3. Este formato é
adiciona aos fluxos elementares de áudio principal e vídeo principal informações para
Frequency Division Multiplex) o qual utiliza sub portadoras ortogonais para modular os
middleware brasileiro para o presente trabalho, o mesmo será descrito na próxima seção
(MORRIS, 2005 apud KULESZA et al. 2010). O Ginga, da mesma forma, possui estes
e a linguagem imperativa é o Java bem como a linguagem Lua de script, esta ultima
O Ginga foi construído a partir da junção dos middlewares FlexTV (LEITE et al.
2005) e Maestro (SOARES, 2006), desenvolvidos por consórcios liderados pela UFPB e
KULESZA, 2012).
59
comuns tais como Bluetooth, USB, Wi-Fi, outros. Existe, também, a possibilidade de
LACERDA, 2008).
e o procedural, no qual uma aplicação pode alterar e/ou executar uma aplicação de outro
pois o professor poderá salvar uma aplicação para ser executada com os alunos em um
horário mais conveniente, ou simplesmente poder aplicar quantas vezes desejar, sem a
funcionalidade foi desenvolvida para atender uma das exigências da inclusão digital
estado do software. Sua função inclui a gerência de todo o ciclo de vida da aplicação,
representação lógica da tela da televisão, sendo esta composta por cinco camadas:
planos:
característica nativa do receptor. Restam, portanto, quatro planos sobre os quais uma
aplicação pode operar. Para cada um destes planos, é possível obter suas características
e efetuar operações gráficas sobre eles. São eles de acordo com (ABNT 15606-4):
da tela o plano de imagens estáticas será exibido sobre o plano de vídeo, ou vice-
versa.
● Plano de Imagens Estáticas: Este é o plano sobre o qual a aplicação pode exibir
plano de seleção vídeo/imagem, ele pode ser usado para exibir imagens JPEG
2.3.1.2 Ginga-CC
plataforma e hardware para as outras camadas acima. Como suas principais funções,
conteúdo como PNG, JPEG, MPEG e outros formatos. O Ginga-CC é composto pelos
físico e um dos fluxos de transporte que estão sendo enviados neste canal. É
sendo veículado.
64
apresentados ao usuário.
● Exibidor de Mídia: Necessário para exibir as diversas mídias que podem ser
entre set-top box (dispositivo utilizado pelo expectador) deve ser feita através do
caso seja detectado uma ameaça uma restrição é gerada. Determina também os
2.3.1.3 Ginga-NCL
65
que processa documentos NCL. Entre seus módulos chave está o Formatador NCL, que
respeitadas.
temporal. Como tal, NCL não define nenhum objeto de mídia, mas apenas a “cola” que
o oferecido pela linguagem XHTML. NCL visa não apenas o suporte declarativo à
interação do usuário, mas o sincronismo espacial e temporal em sua forma mais ampla,
tratando a interação do usuário como um caso particular. NCL visa também o suporte
APIs da ponte com o Ginga-J podem ser usadas acionando o suporte imperativo
Como dito anteriormente esta linguagem não define nenhum tipo de mídia,
podendo trabalhar com imagens, vídeo, áudio, texto e código imperativo. Os objetos de
mídia suportados são aqueles cujo os exibidores estão acoplados ao Formatador NCL.
66
estender aplicações. Lua combina sintaxe simples para programação procedural com
memória com coleta de lixo incremental. Essas características fazem de Lua uma
2011).
2.3.1.4 Ginga-J
do padrão japonês (ARIB B.23), pela especificação Java DTV (que inclui a API
entretanto, devido a uma incerteza quanto ao modelo royalties para uso das API’s do
GEM (Globally Executable MHP), tais como DAVIC (Digital Audio Video Council) e
HAVi (Home Audio Video Interoperability). O objetivo é prover uma solução livre de
e Personal Basis Profile (PBP) como mostrado na Figura 21. Dentre as principais
O conjunto de APIs que compõem o módulo verde são aquelas compatíveis com o
JavaDTV (substituto do GEM). As APIs do módulo amarelo, por sua vez, são extensões
propostas para suprir as necessidades brasileiras e que podem ser implementadas através
de uma adaptação das APIs que compõem o módulo verde. Já as APIs que compõem o
módulo vermelho são aquelas que não são compatíveis, em software, com as APIs do
mínimos para a execução de aplicações, disponibilizando uma série de APIs que podem
ser divididas em sete partes. As mesmas são assim definidas por (JUNIOR SARAIVA,
2010):
Basis Profile);
71
criptografia;
2.3.1.4.1 Xlet
ciclo de vida da Xlet então começa e é caracterizado como não carregada. A partir deste
ponto, o gerenciador da aplicação, que está no receptor, deve detectar a classe principal
e criar uma instância dela. Feito isso, o estado passa a ser caracterizado como carregada.
Uma aplicação que já foi carregada está apta a ser inicializada pelo método initXlet, que
executa suas tarefas e deixa a aplicação no estado pausada. Neste ponto, a Xlet já está
pronta para ser executada, pois já carregou e inicializou todos os elementos que eram
fato começa a funcionar. O método destroyXlet é chamado toda vez que a aplicação
termina suas tarefas (MONTEZ; BECKER; FILHO, 2005). A interface Xlet é mostrada
no Anexo A.
Todo Xlet deve possuir um objeto que implementa a interface XletContext que
de uma maneira geral serve para isolar a aplicação do resto da máquina virtual. Um
objeto XletContext é passado a uma Xlet quando ele é inicializado. É através desta
Uma aplicação Ginga-J, em geral, além da classe Xlet, que é o ponto de partida,
2.3.1.4.2 Eventos
1.3:2009.
EDT (Event Dipatch Thread), dando à plataforma toda a ciência dos eventos e
para cada tela e nela encapsular tanto a confecção da interface quanto o tratamento dos
UserInputEventManager.addUserInputEventListener(com.sun.dtv.ui.event.UserInputEv
janelas não é aplicável nesse caso e as formas são colocadas usando um DTVContainer
que são usados para determinar o posicionamento dos componentes, containers podem
são simples e desenhados pelo UIManager o que permite tematizar tudo usando estilos.
JavaDTV:
8
Padrão de projeto em que a implementação deve garantir uma única instância de uma
determinada classe na aplicação.
76
de layout plugável. Containers podem ser aninhados uns dentro dos outros para
● Form: componente de nível mais alto que serve como a entidade mais visível no
● TextArea: Uma região editável com opção de possuir múltiplas linhas que pode
nessa abordagem é que a edição não pode suportar recursos como o T9 e pode
original.
lista.
● ComboBox: Um combo Box é uma lista que permite apenas uma seleção por
vez, quando um usuário clica no combo box, um botão popup com a lista
guiada pelo modelo de lista que também permite todas as funções exibidoras da
Lista.
79
2006). Uma rede social é composta por dois elementos: os atores (ou seja, as pessoas,
instituições ou grupos, que constituem os nós da rede) e suas conexões (ou seja, as
Desde o início, sites de redes sociais (SRS), tais como Facebook, Orkut,
MySpace, LinkedIn e outros tem atraído milhões de usuários, integrando estas redes em
consistentes, as culturas que emergem em torno dos SRS são variadas (BOYD;
ELLISON, 2007). A maioria dos sites dão suporte na manutenção dos grupos de amigos
vídeos/fotos.
interação e trocas sociais. Na Internet, por exemplo, é possível “assinar” uma lista de
discussão, ou seja, participar de um grupo social sem interagir diretamente com seus
2007).
80
Sites de redes sociais podem ser definidos como serviços baseados na web que
sistema limitado, (2) articular uma lista de outros usuários com os quais compartilham
uma conexão, e (3) ver e pesquisar sua lista de conexões e aquelas feitas por outros
técnicas, seu principal pilar é composto de perfis visíveis que exibem uma lista de
amigos, os quais também são usuários do sistema e possuem sua lista de amigos
(BOYD; ELLISON, 2007). Os perfis são páginas exclusivas onde podem ser editadas
usando as respostas a estas questões, que geralmente incluem descritores tais como
localização, idade, interesses, e um "quem sou eu". A maioria desses sites também
incentivam os usuários a fazer o upload de uma foto de perfil para que seja facilmente
em outros, tal qual o Facebook, é possível instalar aplicativos (apps) associados ao seu
usuário que permitem executar inúmeras ações dentro e fora da rede social.
9
O perfil semi-público é aquele em que o usuário restringe o acesso de terceiros a
determinadas seções do seu perfil. Exemplo: restringir o acesso ao albúm de fotos apenas aos
seus amigos daquela rede social.
81
partir de 1998, a possibilidade de navegar nessa lista. Cada uma dessas características
existia de alguma forma antes de SixDegrees ser lançado. Os perfis existiam na maioria
(acrônimo para AOL Instant Messenger) e o ICQ continham listas de amigos, embora
tais listas não fossem visíveis para outros. Classmates.com permitiu pessoas autorizadas
social e a visualização dos que também foram filiados, mas os usuários não podiam
ELLISON, 2007).
Anos depois do pioneiro site de redes sociais, muitos outros foram criados, com
serviços até o ano de 2006. Pode ser acrescentado também a criação do Google Wave e
10
SixDegrees: http://www.sixdegrees.com
82
Figura 25 - Data de Lançamento dos maiores sites de redes sociais. Fonte: (BOYD;
ELLISON, 2007)
pesquisas IBOPE Nielsen Online12, o Orkut que esteve na liderança de acessos diários
durante 7 anos, perdeu seu posto em meados de agosto de 2011 (GALO, 2011). A partir
dessa data, o Facebook ocupa a primeira colocação, assim como o faz em todo o
11
Rian Novosti: http://en.rian.ru/
12
IBOPE Nielsen: http://br.nielsennetpanel.com/pnl/br/home
84
Alto, Califórnia.
Facebook:
grupos e eventos
aplicação traduções
representa as pessoas e suas conexões com seus interesses. Quando as pessoas usam a
86
rede social, elas compartilham suas histórias, as quais aproximam outras pessoas e
dispositivos móveis, eles criam ainda mais histórias: as músicas que ouvem, os filmes
que eles assistem, os programas de televisão que assistem e assim por diante. Os
Tudo isso forma o gráfico social, o qual pode ser acessado através da Facebook
Platform de inúmeras maneiras (APIs). Por se tratar de um assunto muito amplo, não
matemática através da Teoria dos Grafos. Não trata-se apenas de uma simples tabela de
gráfico social, permitindo ler e gravar dados no Facebook. A API apresenta uma visão
Ela é uma API de baixo nível com base no protocolo HTTP ( Hypertext Transfer
Protocol) através da qual o usuário pode consultar dados, postar novas histórias, fazer
check-in (registrar a sua presença em um local) ou qualquer uma das outras tarefas que
87
um aplicativo possa precisar. O Open Graph do Facebook permite que você defina
Javascript.
mencionados na tabela 2.
local.
mensagens (threads)
gráfico API.
Developers tem identificador 19292868552, então, para que você possa acessar todos os
acessadas usando seu nome de usuário como um ID. Uma vez que
ao grupo.
90
maneira:
Santos)
Garage Austin)
Facebook)
do status de Bret)
Cola)
Coca-Cola)
Graph API)
pizzaria)
91
concedidas e também possui dados sobre quando ele irá expirar e qual aplicação gerou
esse token. Por causa das verificações de privacidade, a maioria das chamadas de API
do Facebook precisa estar assinada com um token. Todos os access tokens são gerados
com o protocolo padrão de autorização OAuth 2.0, o qual permite aos usuários
compartilhar seus recursos privados armazenados em uma base de dados com um outro
site.
Todos os objetos no gráfico social estão ligados uns aos outros através de
Gustavo e Fiodor Castro são amigos. Essas relações são chamadas de “conexões” na
https://graph.facebook.com/ID/TIPO_CONEXAO.
A API fornece vários tipos de conexões para acesso aos dados, entretanto, todas
necessitam do access token válido e de autorização para isso. A url base para acesso
Amigos https://graph.facebook.com/me/friends?access_token=...
92
Curtir https://graph.facebook.com/me/like?access_token=...
Filmes https://graph.facebook.com/me/movies?access_token=...
Música https://graph.facebook.com/me/music?access_token=...
Livros https://graph.facebook.com/me/books?access_token=...
Notas https://graph.facebook.com/me/notes?access_token=...
Permissões https://graph.facebook.com/me/permissions?access_token=...
Eventos https://graph.facebook.com/me/events?access_token=...
Grupos https://graph.facebook.com/me/groups?access_token=...
Checkins https://graph.facebook.com/me/checkins?access_token=...
Object, record, struct, dicionário, hash table, keyed list ou arrays associativos.
Por sua vez, um array é uma coleção de valores ordenados com a sintaxe a
seguir:
13
JSON: http://www.json.org/
94
As duas estruturas de dados contém valores, e os valores podem ser uma cadeia
2.4.2.6 REST
Uma das maneiras que o Facebook utiliza para fornecer seus serviços é através
estilos que deram origem ao REST são Cliente com Cache-Servidor sem Estados e
Interface Uniforme. No primeiro estilo, o servidor não guarda estados, ou seja, todos os
dados referentes a estados devem ser enviados pelo cliente e as respostas podem ser
necessita ser movida do local onde é armazenada para o local onde ela será processada.
95
onde é possível - e geralmente mais eficiente - mover "o processamento" (em forma de
mesmo formato que os dados brutos ou derivadas destes, isto permanece transparente
(TOBALDINI, 2007).
recurso, ou seja, tudo aquilo que pode ser referenciado é um recurso. Uma maneira de se
(TOBALDINI, 2007).
Digital contendo o Ginga. À solução proposta pelos autores para tanto deu-se o nome de
implementação, bem como justificativa das alternativas adotadas são expostas a seguir.
Facebook, trata-se do servidor web do Ginga Social, intitulado como Ginga Social
Web (GSW). O servidor Ginga Social atua como um gateway entre a aplicação de TV,
protocolo HTTP com pacotes em formato JSON (Javascript Object Notation) por tratar-
se de um padrão definido pelo próprio Facebook. Para a troca dos dados entre o GSW e
99
o GSTV, um formato foi escolhido pelos autores e possui explicação detalhada na seção
3.2.5.
Servidor GSW. Para tanto o usuário acessa a página do servidor “index.jsp” e autoriza
explicitamente à aplicação Ginga Social obter seus dados junto ao Facebook. Após a
100
autorização, são gerados automaticamente login e senha a esse usuário de forma que os
GSW que possui o access token do usuário persistido no Banco de Dados. Uma vez que
usuário junto ao Facebook para que seja possível a Exibição do Facebook Home do
critério do usuário, atualizar seu home com os posts mais recentes ou mais antigos.
Estas etapas podem ser observadas no diagrama de visão geral de interação, contido na
Figura 31.
101
3.2.1 Tecnologia
elimina uma dependência direta da aplicação com relação ao Facebook, bem como torna
autores.
listados em sequência:
FOUNDATION, 2012)
Java e seus registros como instâncias das classes correspondentes. Utilizou-se essa
técnica para não haver preocupação com comandos em linguagem SQL, pois a interface
conhecimento entre os autores. Na construção das páginas client-side foi definido - por
para a aplicação e sim possibilitar o acesso do usuário, foi decidido o uso do Bootstrap.
fácil e rápido.
cross-browser (que funciona na grande maioria dos navegadores atuais) jQuery atuando
3.2.2 Implementação
concebida ao gerar um projeto web dinâmico na IDE Eclipse para facilitar a criação da
tv.gingasocial.util
105
serviços 15. Isso foi definido levando em consideração que o servidor GSW possui a
camada de interface com o usuário (visão) representado pelas páginas HTML geradas
14
Model-View-Controller - MVC: Padrão arquitetônico de software em que a
implementação separa os dados do aplicativo (model), componentes gráficos (view) e
controle de processamento de entrada (Controller).
15
Service-Oriented Architecture - SOA: Padrão arquitetônico de software em que as
funcionalidades de uma aplicação devem ser providas através de serviços.
107
pelo registro e atualização dos dados do usuário GS, bem como interface entre a
supracitados, ele atua como ponto de acesso aos dados do usuário no servidor do
Facebook.
do restante do sistema.
funcionamento do framework.
108
Sendo este um sistema com fins acadêmicos, a senha de acesso ao MySQL não
foi alterada, mantendo-a como o padrão “root”. Caso fosse uma aplicação voltada para
uso comercial seria extremamente importante para a segurança dos dados dos usuários
que fosse modificada para uma senha mais segura. Outra particularidade não realizada
aplicação.
apenas uma tabela (ou classe) para representar o usuário do sistema, intitulado aqui de
GSUser. Nessa tabela estão todos os dados necessários para a autenticação e validação
desse usuário, tanto para o Facebook como para o aplicativo instalado na televisão.
aplicativo do Ginga Social TV. A Figura 38 mostra a listagem dos arquivos .jar.
seus serviços para a arquitetura REST, tais como Google e Facebook, optou-se pela
utilização dessa arquitetura em nosso trabalho. Para otimizar essa arquitetura e pela
Para finalizar optou-se pelo uso da biblioteca Java RestFB, mais precisamente
Podemos considerar esse caso de uso como sendo o ponto de entrada do usuário
que deseja utilizar o Ginga Social em sua TV. É através dele que o Ginga Social Web
consegue autorização para acessar dados do usuário no Facebook e por sua vez criar
Para tal propósito, de acordo com os termos e políticas do Facebook, foi criado
Todo esse processo tem início quando um usuário acessa pela primeira vez o
navegador (figura 36) solicita ao usuário para usar sua conta do Facebook para
Figura 36 - Página para criação de conta no Ginga Social a partir da conta existente no
Facebook.
Novamente aqui apresenta-se mais uma justificativa do motivo pelo qual optou-
acesso de seus dados contidos na rede social a outro aplicativo através de um navegador
web ou de forma nativa em celulares que possuam sistema operacional Android ou iOS.
Após o clique realizado pelo indivíduo no botão azul, aparecerá a tela padrão do
Figura 37 - Tela de solicitação dos dados do usuário (fazer login com o Facebook)
API em Javascript do FB com o access token (nada mais que um simples texto plano
seguida, essa mesma página chama - usando a tecnologia AJAX - o login.jsp passando o
De acordo com a documentação, esse código inicial contém de uma a duas horas
atualizar código de acesso aos dados e posterior login ao aplicativo na TV, foi utilizada
mais uma chamada à API para obter nova chave. Esse código é conhecido por long-
atual usuário. A atualização dos dados ocorre quando o sistema identifica que essa
Caso não exista, um usuário é gerado a partir dos dados oriundos da rede social e é
este um trabalho com propósito acadêmico, optamos por utilizar apenas números na
senha do usuário e não lhe possibilitando alterá-la. Caso fosse para fins comercias,
obviamente que isso deveria ser modificado para fornecer uma melhor experiência a
(index.jsp) passando seus dados. Os dados são exibidos na tela para que o usuário possa
GSW, este acaba gerenciando todos os logins e senhas dos usuários. Sendo assim, o
servidor do Ginga Social incorpora mais uma importante função, atuando como o web
usuário, conforme citado na etapa de implementação, optou-se pelo uso da API Restlet a
por fim a ação desejada, no caso de uso atual, login. Essa URL é submetida ao GSW
http://www.gingasocial.tv/GingaSocialTV/facebook/login?login=ID&pass=SE
NHA
autenticação for chamado pelo Ginga Social TV, o gerenciador dos serviços irá passar o
tratamento dos parâmetros e retornar um erro caso estejam nulos ou vazios. Quando
forem válidos, eles são repassados à classe Controller que, por sua vez, solicita à
verifica se existe usuário registrado com aquele identificador (login) na base de dados e
Este é um caso de uso que contempla dois serviços abertos pelo GSW para obter
diferentes dados do usuário a serem consumidos pelo GSTV. Sem sombra de dúvidas
este caso de uso, juntamente com a exibição do Facebook home, são os elementos
dos autores tanto no Ginga Social Web quanto no Ginga Social TV.
http://www.gingasocial.tv/GingaSocialWeb/facebook/user?ginga_user_id=ID, sendo
Social.
Assim que uma requisição chegar nessa URL, o gerenciador dos serviços Rest -
fará uma checagem inicial dos parâmetros. Caso o ginga_user_id seja nulo ou diferente
de um número inteiro, o web service retornará um erro 400 para indicar uma bad
o Facebook solicitando dados mais recentes e, assim que os obtém, os registra na base
de dados. Isso é realizado para que os dados do usuário estejam sempre atualizados e
http://www.gingasocial.tv/facebook/home?ginga_user_id=ID&direction=DIRE
CTION&quant_items=ITEMS
116
login, o Ginga Social TV não enviará esse parâmetro preenchido. Ele somente
será usado quando o usuário efetuar uma ação na televisão que necessite da
atualização de seu home. Dessa forma ele possui dois valores válidos, top e
a quantidade de 25 itens.
Quando uma requisição http chega nessa URL, o fluxo de execução segue de
chamará diferentes métodos da FacebookController, que por sua vez solicita o home à
API do Facebook passando o access token que está associado ao usuário, localizado no
banco de dados. Para esses dois serviços descritos, os autores definiram um formato
símbolo “|” e a informação relevante encontra-se entre apóstrofos e são separados por
vírgula.
limitados. Sendo assim, um protocolo simples e enxuto é o mais recomendado por não
dos dados.
http://www.gingasocial.tv/GingaSocialWeb/facebook/like?ginga_user_id=ID&facebook
118
por share:
http://www.gingasocial.tv/GingaSocialWeb/facebook/share?ginga_user_id=ID&facebo
ok_id=FBID
Assim como todos os outros serviços descritos, tudo passa inicialmente pela
execução. Este, por sua vez, chama o FacebookController para que ele registre a
linguagem Java, sendo este o fator preponderante que motivou o uso da máquina de
execução para o trabalho. Ademais, contribuiu para a escolha deste ambiente o fato de
a linguagem Java possuir uma grande comunidade e estar consolidada no mercado. Esta
16
Neste trabalho entende-se por evento uma mensagem, foto, vídeo, link, check-in e pergunta
adicionados por um usuário
119
aplicação poderia ser difundida juntamente com o áudio e vídeo (um programa
ambiente de TV Digital é caracterizado pela limitação dos recursos, como por exemplo,
aplicações. Tendo esta premissa em mente, optou-se por desenvolver uma aplicação
demasia.
3.3.1 Tecnologias
desenvolvimento uma máquina virtual denominada Astro Box (TOTVS, 2012a). Esta
plataforma está disponível a todos os membros da rede Astro DevNet (TOTVS, 2012b).
A rede Astro DevNet foi planejada pela TOTVS e, de acordo com a mesma, visa
Java DTV)
120
Além disso, AstroBox pode ser usado para desenvolver Stickers, que são
com Linux Ubuntu 10.04 e é executado através de uma máquina virtual, Virtual Box, a
3.3.2 Implementação
pacotes disponíveis no próprio Ginga-J, ou seja, nenhuma biblioteca externa foi incluída
A aplicação como um todo encontra-se dentro do pacote gingasocial que não é possível
visualizar por questões de espaço e, este por sua vez, contém os seguintes componentes:
mesmo.
necessários à aplicação são obtidos, bem como dados da aplicação também são
enviados.
gerência de imagens.
Ao iniciar a aplicação é solicitado ao usuário que este informe seu login e senha
gerados pelo Ginga Social Web no momento da autorização da aplicação. Estes dados
nele presente. A chamada é feita através das classes presentes em um dos pacotes
Com a requisição efetuada, o servidor tem a posse dos dados e verifica se estes
Ginga Social TV retorna true ou false. Cabe ressaltar, novamente, de que sendo esta
transporte dos dados de forma segura, como por exemplo, aplicando algoritmos de
A inserção dos dados de login e senha foi projetada para ser efetuada através das
teclas númericas do controle remoto. Nesta etapa também são utilizadas as teclas
coloridas do controle remoto, cada uma desencadeando uma ação de acordo com a
Figura 40.
125
após ser instanciada por um objeto da classe Controle, esta classe providencia a reserva
das teclas coloridas e numéricas bem como sinaliza ao gerenciador de eventos que ela
dados correspondem aos atributos da classe User e são obtidos em mais duas etapas,
A primeira etapa ocorre através de uma outra requisição HTTP para o serviço de
obtenção dos dados do usuário disponível no Ginga Social Web e que faz uso do padrão
Dados Usuário. A comunicação entre o Ginga Social TV e o Ginga Social Web, ocorre
de forma semelhante àquela descrita anteriormente, com a diferença de que este serviço
está disponível em outro endereço. A execução deste serviço retorna os demais atributos
do usuário com exceção do home, que será obtido em seguida. Nesta etapa, então, tem-
O atributo home, na verdade, trata-se de um vetor de objetos Post que, por sua
vez, representam posts presentes no Facebook Home do usuário. Por ser um atributo
mais complexo, optou-se por obtê-lo separadamente através de um novo serviço, como
evento;
127
● type: o tipo do evento gerado, podendo ser uma plublicação de foto, comentário,
compartilhamento, etc.
XML ou JSON, foi necessário desenvolver um parser para que os dados fossem
Após estas etapas a aplicação libera os recursos por ela consumidos, imagens e
teclas coloridas por exemplo, para que a próxima etapa possa ser iniciada.
Basicamente esta interface é composta por avatares, fotos e textos. O Ginga Social TV,
na verdade, possui nesta etapa somente a URL correspondente a cada imagem, que são
128
através do uso de um objeto da classe java.net.URL, abre uma conexão com o servidor
indicado na URL da imagem e recebe um inputstream que será utilizado para criar a
disponíveis.
respectivo nome. Utilizou-se para tanto objetos da classe Label contendo a informação,
também, o atributo User pois, através dele, serão obtidos todos os dados necessários.
Cada item de uma List corresponde a um objeto incluído explicitamente. Por padrão, o
usuário este renderizador não seria adequado, pois ele simplesmente chama o método
toString() do objeto sendo adicionado para desenhar cada um dos itens da lista.
que a mesma possa ser apresentada. Este novo renderizador desenha cada item da List
parâmetros possui um Object que irá corresponder ao elemento chave para tanto. No
selecionado (com foco), que pode ser expandido através de um objeto DialogGS que
130
TV se comunicar com o Ginga Social Web, visto que todos os dados necessários já
(imagens).
provenientes das teclas coloridas podem gerar. Todos estes eventos inicialmente são
Home são acionadas através das teclas coloridas do controle remoto. Necessariamente, a
execução de uma delas implica numa interação com o GSW (caso de uso Ações do
Toda a comunicação entre GSTV e GSW apresentada até agora ocorre através
de requisições HTTP para a URL onde o serviço está sendo disponibilizado. Nestes
casos de uso ocorre situação semelhante, ou seja, faz-se uso dos objetos java.net.URL e
atualizado no GSTV.
necessita saber qual post o usuário deseja compartilhar. Os atributos selecionados são os
mesmos do like, entretanto, estes são submetidos ao método share da classe Connector
descrito, no caso de uso Obter Dados Usuário, porém, desta vez, é utilizado o parâmetro
automaticamente busca por posts mais antigos e os inclui na lista para que o usuário
possa visualizá-los. Para obter posts mais recentes aciona-se a tecla colorida
formato já descrito, passando pelo parser, e os novos objetos Post obtidos serão
4.1 Conclusão
para o desenvolvimento das aplicações Ginga-J. Para tanto, seria necessário dispor de
middleware Ginga pois, como vimos, a máquina de execução depende das camadas
exemplos muito simples que não se aprofundavam muito nas APIs do Ginga-J.
Inúmeras vezes recorremos às normas ABNT que regem o nosso sistema de TV Digital,
tanto quanto complexa e suas definições não raro são vagas ou fora de contexto,
Notamos que esta comunidade ultimamente está meio inerte e a maioria de suas
questões dizem respeito ao Ginga-NCL. A própria TOTVS, uma das maiores empresas
atuantes neste setor, mantém um fórum voltado a discussões sobre TV Digital em que
comunicação do país. Com este cenário em mente, somos levados a pensar que, sem
fabricantes de TV, esteja inserido dentro deste contexto favorável, o fato é que observa-
se muito pouco avanço quando o assunto é interatividade. Por outro lado, não se pode
olvidar de que este padrão, o SBTVD, é um padrão brasileiro, ou seja, não se deve
atribuir toda a responsabilidade ao mercado para que este padrão seja consolidado de
uma vez por todas. Sendo fruto de esforços do governo brasileiro, entendemos que os
Este trabalho pode ser encarado, também, como uma forma de disseminação da
novidades. Por ser uma rede muito ativa e concentrar muitas pessoas, inúmeras
Facebook são desenvolvidos a cada dia, gerando uma demanda por documentação e
desenvolvimento de aplicações que de certa forma fazem uso de seus serviços, como é o
Por fim, acreditamos que o objetivo principal desta empreitada foi alcançado,
sistema Ginga Social, proporcionamos o contato entre estas duas diferentes mídias,
estudos referentes aos dois temas também foram satisfatórios à medida que deram
integração entre TV digital interativa e redes sociais. Alguns pontos aqui citados foram
● Adicionar serviços no GSW para obtenção da sua própria linha do tempo, bem
sendo assistida.
135
● Retenção dos dados dos usuários sobre programação assistida para posterior
padrão brasileiro.
5 BIBLIOGRAFIA
ARIB. ARIB STD B24 - ARIB Standard: Data Coding and Transmission.Revision 3.2,
2002
ARIB. ARIB STD-B23 Version 1.1: Application Execution Engine Platform for Digital
Broadcasting (English Translation). ARIB Standard, 2004.
ATSC A-53. Advanced Television Systems Committee A/53: ATSC Digital Television
Standard, Parts 1-6, 2007.
BOYD, d.; ELLISON, N. Social network sites: Definition, history, and scholarship.
Journal of Computer-Mediated Communication, n. 13, v. 1, art. 11. 2007. Disponível
em <http://jcmc.indiana.edu/vol13/issue1/boyd.ellison.html>. Acesso Novembro, 2011.
DVB. Digital Video Broadcasting Project. Disponível em: www.dvb.org. Acesso em:
Dezembro, 2011.
ETSI. ETSI EN 300 744 - Digital Video Broadcasting (DVB): Framing Structure,
Channel Coding and Modulation for Digital Terrestrial Television, Edition 1.4.1. 2001.
ETSI. ETSI EN 300 421 - Digital Video Broadcasting (DVB): Framing Structure,
Channel Coding and Modulation for 11/12 GHz Satellite Services, Edition 1.1.2. 1997a.
ETSI. ETSI EN 300 748, “Digital Video Broadcasting (DVB): Multipoint Video
Distribution Systems (MVDS) at 10 GHZ and above, Edition 1.1.2. 1997b.
ETSI. ETSI EN 300 749 - Digital Video Broadcasting (DVB): Microwave Multipoint
Distribution Systems (MMDS) below 10 GHz, Edition 1.1.2.1997c.
ETSI. ETSI EN 300 429 - Digital Video Broadcasting (DVB): Framing Structure,
Channel Coding and Modulation for Cable Systems, Edition 1.2.1. 1998.
ETSI. ETSI ES 201 812 - Digital Video Broadcasting (DVB); Multimedia Home
Platform (MHP) Specification 1.0.3. 2006.
ETSI. ETSI TS 102 819 V1.2.1 - GEM – Globally Executable MHP: A Guide to
Platform Harmonisation, DVB Project Office White Paper on iTV Platform
Harmonisation. 2005.
GALO, Bruno. Você pode ganhar muito dinheiro no Facebook. Istoé Dinheiro. 2011.
Disponível em:
http://www.istoedinheiro.com.br/noticias/65157_VOCE+PODE+GANHAR+MUITO+
DINHEIRO+NO+FACEBOOK. Acesso em: Setembro, 2012.
GLIFFY. Online Diagram Software and Flowchart Software - Gliffy. Disponível em:
<http://www.gliffy.com/>. Acesso em: Agosto, 2012.
MACLIN, Bem. What Every Marketer Needs to Know about iTV. Nova Iorque,
eMarketer Analyst Brief, 2001 apud MONTEZ, Carlos; BECKER, Valdecir. TV Digital
Interativa: conceitos, desafios e perspectivas para o Brasil. Florianópolis: Ed. da UFSC,
2ª edição, 2005.
MELLO, Ronaldo dos Santos. Sistema Gerenciador de Banco de Dados. Disponível em:
<http://www.inf.ufsc.br/~ronaldo/ine5613/2-sgbd.pdf>. Acesso em: 17 de fevereiro de
2012
erativa%20-%20BECKER,%20PICCIONI,%20MONTEZ,%20HERWEG.pdf>. Acesso
em: Julho, 2012.
NIELSENWIRE. Americans Using TV and Internet Together 35% More Than A Year
Ago. 2010 Disponível em: <http://blog.nielsen.com/nielsenwire/online_mobile/three-
screen-report-q409/>. Acesso em: Novembro, 2011.
OLIVEIRA, Antônio Carlos Albuquerque de; LACERDA, João Paulo Lopes de. A TV
digital no Brasil e o desenvolvimento de aplicações interativas para o middleware
Ginga. 2008. Trabalho de Conlusão de Curso (Graduação em Ciência da Computação).
Universidade Federal de Sergipe. Aracaju. 2008.
http://gingacdn.lavid.ufpb.br/projects/openginga/wiki/Hist%C3%B3rico_Ginga-J.
Acesso em: Julho, 2012.
RIAN NOVOSTI. The world map of social networks. Rian Novosti. 2011. Disponível
em:
<http://en.rian.ru/infographics/20110228/162792394.html>. Acesso em: Dezembro,
2011.
SILVA, Rodrigo. Redes Sociais, Televisão e a Relação que está Fortalecendo Ambas,
2011. Disponível: <http://www.bravaitv.com.br/blog/index.php/category/pesquisas/>.
Acesso em: Novembro, 2011.
SILVA, Lincoln David Nery. 2008. Uma Proposta de API para Desenvolvimento de
Aplicações Multiusuário e Multidispositivo para TV Digital Utilizando o Middleware
Ginga. Departamento de Informática, Universidade Federal da Paraíba. 2008. p. 77,
Dissertação (mestrado).
SILVA, Jones Q. TV Digital Interativa. Universidade do Vale do Rio dos Sinos. São
Leopoldo, 2003.
SOARES, Luiz Fernando Gomes. TV Interativa se Faz com Ginga. Disponível em:
<http://www.telemidia.puc-rio.br/sites/telemidia.puc-rio.br/files/2009_06_soares.pdf>.
2009. Acesso em: Novembro, 2011.
}
146
FacebookController.java
package tv.gingasocial.controller.facebook;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.hibernate.envers.tools.StringTools;
import com.restfb.Connection;
import com.restfb.DefaultFacebookClient;
import com.restfb.FacebookClient;
import com.restfb.Parameter;
import com.restfb.types.FacebookType;
import com.restfb.types.Post;
import com.restfb.types.User;
import com.restfb.util.StringUtils;
/**
* @author Gustavo Rupp Santos
* @author Fiodor Castro
*/
public class FacebookController {
return map;
}
return map;
}
sb.append("https://graph.facebook.com/oauth/access_token");
sb.append("?client_id=" + APP_ID);
sb.append("&client_secret=" + APP_SECRET);
sb.append("&grant_type=fb_exchange_token");
sb.append("&fb_exchange_token=" + accessToken);
String inputLine;
while ((inputLine = in.readLine()) != null) {
longLivedAT = inputLine;
}
longLivedAT =
longLivedAT.split("&")[0].replaceAll("access_token=", "");
in.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return longLivedAT;
}
Parameter[] listParams = {
Parameter.with("link", link),
Parameter.with("message", message),
Parameter.with("picture", picture),
Parameter.with("name", name),
Parameter.with("caption", caption),
Parameter.with("description", desc)
153
};
FacebookType publish =
facebookClient.publish(facebookUserId + "/links", FacebookType.class,
listParams);
return !StringTools.isEmpty(publish.getId());
}
Parameter[] listParams = {
Parameter.with("link", link),
Parameter.with("message", message),
Parameter.with("picture", picture),
Parameter.with("name", name),
Parameter.with("caption", caption),
Parameter.with("description", desc)
};
FacebookType publish =
facebookClient.publish(facebookUserId + "/links", FacebookType.class,
listParams);
return !StringTools.isEmpty(publish.getId());
}
return post;
}
}
FqlPagePicture.java
package tv.gingasocial.controller.facebook;
import com.restfb.Facebook;
/**
* @author Gustavo Rupp Santos
154
@Facebook("page_id")
private String pageId;
@Facebook("pic_square")
private String picSquare;
import com.restfb.Facebook;
/**
* @author Gustavo Rupp Santos and Fiodor Castro
* @author Fiodor Castro
*/
public class FqlUserPicture {
@Facebook
private String uid;
@Facebook
private String pic_square;
PostGS.java
package tv.gingasocial.controller.facebook;
import com.restfb.Facebook;
import com.restfb.types.Post;
/**
* @author Gustavo Rupp Santos and Fiodor Castro
* @author Fiodor Castro
*/
public class PostGS extends Post {
@Facebook
private String story;
@Facebook("status_type")
private String statusType;
}
156
StatusType.java
package tv.gingasocial.controller.facebook;
/**
* @author Gustavo Rupp Santos
* @author Fiodor Castro
*/
public enum StatusType {
SHARED_STORY,
TAGGED_IN_PHOTO,
ADDED_PHOTOS,
MOBILE_STATUS_UPDATE;
}
Controller.java
package tv.gingasocial.controller;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Random;
import org.hibernate.envers.tools.StringTools;
import tv.gingasocial.controller.facebook.FacebookController;
import tv.gingasocial.controller.facebook.PostGS;
import tv.gingasocial.model.HibernateUtil;
import tv.gingasocial.model.Model;
import tv.gingasocial.model.entity.GSUser;
import tv.gingasocial.service.restful.dto.HomeDTO;
import tv.gingasocial.service.restful.dto.UserDTO;
import tv.gingasocial.util.EncodeUtil;
import com.restfb.Connection;
import com.restfb.types.Post;
import com.restfb.types.User;
import com.restfb.util.StringUtils;
/**
* @author Gustavo Rupp Santos
* @author Fiodor Castro
*/
public class Controller {
gingaUser.setUpdateAccessTokenDate(System.currentTimeMillis());
HibernateUtil.update(gingaUser);
} else {
//generate a random password
Random random = new Random();
String password = String.format(FORMAT,
random.nextInt(MAX));
gingaUser.setUpdateAccessTokenDate(System.currentTimeMillis());
HibernateUtil.insert(gingaUser);
}
return gingaUser;
}
if(StringTools.isEmpty(direction) || quantItems == 0) {
homeConnection =
FacebookController.getUserHome(accessToken, facebookUserId);
} else if(direction.equals("top")) {
homeConnection =
FacebookController.getUserHomeSince(accessToken, facebookUserId,
gingaUser.getTopUpdatedTime());
} else if(direction.equals("bottom")) {
homeConnection =
FacebookController.getUserHomeUntil(accessToken, facebookUserId,
gingaUser.getBottomUpdatedTime());
}
if(StringUtils.isBlank(post.getFrom().getCategory())) {
listFacebookUserIds.add(fbId);
} else {
listFacebookPagesIds.add(fbId);
}
}
if(type.equals("photo")) {
message = setPhotoMessage(post, statusType,
message, userName);
photoURL = post.getPicture();
} else if(type.equalsIgnoreCase("video")) {
message = setVideoMessage(post, message,
userName);
} else if(type.equalsIgnoreCase("status")) {
message = setStatusMessage(post, statusType,
message, userName);
} else if(type.equalsIgnoreCase("link")) {
continue;
} else if(type.equalsIgnoreCase("checkin")) {
message = "[CHECKIN] " + post.getCaption();
}
if(dataPosts != null) {
long topUpdatedTime =
dataPosts.get(0).getUpdatedTime().getTime();
long bottomUpdatedTime =
dataPosts.get(dataPosts.size()-1).getUpdatedTime().getTime();
gingaUser.setTopUpdatedTime(topUpdatedTime);
gingaUser.setBottomUpdatedTime(bottomUpdatedTime);
gingaUser.setQuantItems(quantItems);
HibernateUtil.update(gingaUser);
}
return postsList;
160
if(message == null) {
message = story;
} else {
message = story + "\n\n" + message;
}
return message;
}
if(statusType == null) {
message = story;
} else if(statusType.equals("shared_story")) {
message = story + caption;
} else if(statusType.equals("tagged_in_photo")) {
message = story + description;
} else if(statusType.equals("added_photos")) {
message = userName + msgAux;
}
return message;
}
return message;
}
161
registerOrUpdateUser(facebookUserId,
gingaUser.getAccessToken());
return
FacebookController.doLikePost(gingaUser.getAccessToken(), facebookId);
}
return
FacebookController.doSharePost(gingaUser.getFacebookUserId(),
gingaUser.getAccessToken(), facebookId);
}
GSUser.java
package tv.gingasocial.model.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
162
/**
* @author Gustavo Rupp Santos and Fiodor Castro
* @author Fiodor Castro
*/
@Entity
@Table(name="GSUSER")
public class GSUser {
@Id
@Column
@GeneratedValue
private Long id;
private String facebookUserId;
private String name;
private String password;
private String accessToken;
private String email;
private long updateAccessTokenDate;
private long topUpdatedTime;
private long bottomUpdatedTime;
private int quantItems;
return facebookUserId;
}
}
164
HibernateUtil.java
package tv.gingasocial.model;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.hibernate.tool.hbm2ddl.SchemaUpdate;
import tv.gingasocial.model.entity.GSUser;
/**
* @author Gustavo Rupp Santos
* @author Fiodor Castro
*/
public class HibernateUtil {
static {
try {
hibernateConfig = new Configuration();
hibernateConfig.configure();
serviceRegistry = new
ServiceRegistryBuilder().applySettings(hibernateConfig.getProperties()
).buildServiceRegistry();
sessionFactory =
hibernateConfig.buildSessionFactory(serviceRegistry);
try {
session = getSession();
transaction = session.beginTransaction();
object = session.get(objClass, id);
} catch (HibernateException e) {
transaction.rollback();
System.err.println(e.fillInStackTrace());
} finally {
session.close();
}
return object;
}
public static void updateDB(){
try {
SchemaUpdate su = new SchemaUpdate(hibernateConfig);
su.execute(true, true);
} catch (Exception e) { }
}
return true;
}
} finally {
session.close();
}
return true;
}
return true;
}
Model.java
package tv.gingasocial.model;
import java.util.List;
import org.hibernate.Query;
import tv.gingasocial.model.entity.GSUser;
/**
* @author Gustavo Rupp Santos
* @author Fiodor Castro
*/
public class Model {
public static boolean hasUserRegistered(String facebookUserId) {
167
@SuppressWarnings("unchecked")
public static GSUser getGingaUser(String facebookUserId) {
String hql = "FROM " + GSUser.class.getSimpleName() + "
WHERE facebookUserId = :fbUserId";
Query query = HibernateUtil.getSession().createQuery(hql);
query.setParameter("fbUserId", facebookUserId);
return user;
}
gingaUser.setTopUpdatedTime(0);
gingaUser.setBottomUpdatedTime(0);
gingaUser.setQuantItems(0);
HibernateUtil.update(gingaUser);
}
return result;
}
HomeResource.java
package tv.gingasocial.service.restful.common;
import org.restlet.resource.Get;
/**
* @author Gustavo Rupp Santos
* @author Fiodor Castro
*/
public interface HomeResource {
@Get("txt")
168
LikeResource.java
package tv.gingasocial.service.restful.common;
import org.restlet.resource.Get;
/**
* @author Gustavo Rupp Santos
* @author Fiodor Castro
*/
public interface LikeResource {
@Get
public boolean doLike();
LoginResource.java
package tv.gingasocial.service.restful.common;
import org.restlet.resource.Get;
/**
* @author Gustavo Rupp Santos
* @author Fiodor Castro
*/
public interface LoginResource {
@Get
public boolean doLogin();
ShareResource.java
package tv.gingasocial.service.restful.common;
import org.restlet.resource.Get;
/**
* @author Gustavo Rupp Santos
* @author Fiodor Castro
*/
public interface ShareResource {
@Get
169
UserResource.java
package tv.gingasocial.service.restful.common;
import org.restlet.resource.Get;
/**
* @author Gustavo Rupp Santos
* @author Fiodor Castro
*/
public interface UserResource {
@Get("txt")
public String getGingaUser();
HomeDTO.java
package tv.gingasocial.service.restful.dto;
/**
* @author Gustavo Rupp Santos
* @author Fiodor Castro
*/
public class HomeDTO {
private String facebookId;
private String userFacebookId;
private String userName;
private String userAvatarURL;
private String message;
private String type;
private String photoURL;
private String updatedTime;
private long likes;
private long comments;
setMessage(message);
setType(type);
setPhotoURL(photoURL);
setUpdatedTime(updatedTime);
setLikes(likes);
setComments(comments);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("|");
sb.append("'"+facebookId+"',");
sb.append("'"+userFacebookId+"',");
sb.append("'"+userName+"',");
sb.append("'"+userAvatarURL+"',");
sb.append("'"+message+"',");
sb.append("'"+type+"',");
sb.append("'"+photoURL+"',");
sb.append("'"+updatedTime+"',");
sb.append("'"+likes+"',");
sb.append("'"+comments+"'");
172
sb.append("|");
return sb.toString();
}
UserDTO.java
package tv.gingasocial.service.restful.dto;
/**
* @author Gustavo Rupp Santos
* @author Fiodor Castro
*/
public class UserDTO {
this.name = name;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("|");
sb.append("'"+gingaId+"',");
sb.append("'"+facebookUserId+"',");
sb.append("'"+name+"',");
sb.append("'"+avatarURL+"'");
sb.append("|");
return sb.toString();
}
JacksonConverter4GingaSocial.java
package tv.gingasocial.service.restful.parser;
import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
import org.restlet.ext.jackson.JacksonConverter;
public JacksonConverter4GingaSocial() {
super();
getObjectMapper().getSerializationConfig().setSerializationInclu
sion(Inclusion.NON_DEFAULT);
}
HomeServerResource.java
package tv.gingasocial.service.restful.server;
import java.util.List;
import org.hibernate.envers.tools.StringTools;
174
import org.restlet.data.Form;
import org.restlet.resource.ResourceException;
import org.restlet.resource.ServerResource;
import tv.gingasocial.controller.Controller;
import tv.gingasocial.service.restful.common.HomeResource;
import tv.gingasocial.service.restful.dto.HomeDTO;
/**
* @author Gustavo Rupp Santos
* @author Fiodor Castro
*/
public class HomeServerResource extends ServerResource implements
HomeResource {
@Override
public String getFacebookHome() {
Form query = getReference().getQueryAsForm();
String gingaUserStr =
query.getFirstValue("ginga_user_id");
String direction = query.getFirstValue("direction");
String quantItemsStr = query.getFirstValue("quant_items");
//quant items that TV wants
int quantItems = 0;
if(!StringTools.isEmpty(quantItemsStr)) {
try {
quantItems = Integer.parseInt(quantItemsStr);
} catch (Exception e) { }
}
List<HomeDTO> facebookUserHome =
Controller.getFacebookUserHomeDTO(gingaUserId, direction, quantItems);
return sb.toString();
}
175
LikeServerResource.java
package tv.gingasocial.service.restful.server;
import java.net.URLDecoder;
import org.restlet.data.Form;
import org.restlet.resource.ResourceException;
import org.restlet.resource.ServerResource;
import tv.gingasocial.controller.Controller;
import tv.gingasocial.service.restful.common.LikeResource;
/**
* @author Gustavo Rupp Santos
* @author Fiodor Castro
*/
public class LikeServerResource extends ServerResource implements
LikeResource {
String gingaUserId;
String facebookId;
try {
gingaUserId =
URLDecoder.decode(query.getFirstValue("ginga_user_id"), "UTF-8");
facebookId =
URLDecoder.decode(query.getFirstValue("facebook_id"), "UTF-8");
} catch (Exception e) {
throw new ResourceException(400);
}
LoginServerResource.java
package tv.gingasocial.service.restful.server;
import java.net.URLDecoder;
import org.restlet.data.Form;
import org.restlet.resource.ResourceException;
import org.restlet.resource.ServerResource;
176
import tv.gingasocial.controller.Controller;
import tv.gingasocial.service.restful.common.LoginResource;
/**
* @author Gustavo Rupp Santos
* @author Fiodor Castro
*/
public class LoginServerResource extends ServerResource implements
LoginResource {
@Override
public boolean doLogin() {
Form query = getReference().getQueryAsForm();
String login;
String pass;
try {
login =
URLDecoder.decode(query.getFirstValue("login"), "UTF-8");
pass =
URLDecoder.decode(query.getFirstValue("pass"), "UTF-8");
} catch (Exception e) {
throw new ResourceException(404);
}
ShareServerResource.java
package tv.gingasocial.service.restful.server;
import java.net.URLDecoder;
import org.restlet.data.Form;
import org.restlet.resource.ResourceException;
import org.restlet.resource.ServerResource;
import tv.gingasocial.controller.Controller;
import tv.gingasocial.service.restful.common.ShareResource;
/**
* @author Gustavo Rupp Santos
* @author Fiodor Castro
177
*/
public class ShareServerResource extends ServerResource implements
ShareResource {
@Override
public boolean doShare() {
Form query = getReference().getQueryAsForm();
String gingaUserId;
String facebookId; //represent the event on Facebook
try {
gingaUserId =
URLDecoder.decode(query.getFirstValue("ginga_user_id"), "UTF-8");
facebookId =
URLDecoder.decode(query.getFirstValue("facebook_id"), "UTF-8");
} catch (Exception e) {
throw new ResourceException(400);
}
UserServerResource.java
package tv.gingasocial.service.restful.server;
import org.restlet.data.Form;
import org.restlet.resource.ResourceException;
import org.restlet.resource.ServerResource;
import tv.gingasocial.controller.Controller;
import tv.gingasocial.service.restful.common.UserResource;
/**
* @author Gustavo Rupp Santos
* @author Fiodor Castro
*/
public class UserServerResource extends ServerResource implements
UserResource {
@Override
public String getGingaUser() {
Form query = getReference().getQueryAsForm();
String gingaUserStr =
query.getFirstValue("ginga_user_id");
178
return Controller.getGingaUserDTO(gingaUserId).toString();
}
RestletController.java
package tv.gingasocial.service.restful;
import org.restlet.Application;
import org.restlet.Restlet;
import org.restlet.engine.Engine;
import org.restlet.routing.Router;
import
tv.gingasocial.service.restful.parser.JacksonConverter4GingaSocial;
import tv.gingasocial.service.restful.server.HomeServerResource;
import tv.gingasocial.service.restful.server.LikeServerResource;
import tv.gingasocial.service.restful.server.LoginServerResource;
import tv.gingasocial.service.restful.server.ShareServerResource;
import tv.gingasocial.service.restful.server.UserServerResource;
@Override
public synchronized Restlet createInboundRoot() {
Engine engine = Engine.getInstance();
engine.getRegisteredConverters().add(new
JacksonConverter4GingaSocial());
router.attach("/user", UserServerResource.class);
router.attach("/login", LoginServerResource.class);
router.attach("/home", HomeServerResource.class);
router.attach("/like", LikeServerResource.class);
router.attach("/share", ShareServerResource.class);
return router;
}
}
179
EncodeUtil.java
package tv.gingasocial.util;
import java.util.HashMap;
import java.util.Map;
/**
* @author Gustavo Rupp Santos
* @author Fiodor Castro
*/
public class EncodeUtil {
static {
mapChars.put("À", "u00C0");
mapChars.put("Á", "u00C1");
mapChars.put("Â", "u00C2");
mapChars.put("Ã", "u00C3");
mapChars.put("Ä", "u00C4");
mapChars.put("Å", "u00C5");
mapChars.put("Æ", "u00C6");
mapChars.put("Ç", "u00C7");
mapChars.put("È", "u00C8");
mapChars.put("É", "u00C9");
mapChars.put("Ê", "u00CA");
mapChars.put("Ë", "u00CB");
mapChars.put("Ì", "u00CC");
mapChars.put("Í", "u00CD");
mapChars.put("Î", "u00CE");
mapChars.put("Ï", "u00CF");
mapChars.put("Ð", "u00D0");
mapChars.put("Ñ", "u00D1");
mapChars.put("Ò", "u00D2");
mapChars.put("Ó", "u00D3");
mapChars.put("Ô", "u00D4");
mapChars.put("Õ", "u00D5");
mapChars.put("Ö", "u00D6");
mapChars.put("×", "u00D7");
mapChars.put("Ø", "u00D8");
mapChars.put("Ù", "u00D9");
mapChars.put("Ú", "u00DA");
mapChars.put("Û", "u00DB");
mapChars.put("Ü", "u00DC");
mapChars.put("Ý", "u00DD");
mapChars.put("Þ", "u00DE");
mapChars.put("ß", "u00DF");
mapChars.put("à", "u00E0");
180
mapChars.put("á", "u00E1");
mapChars.put("â", "u00E2");
mapChars.put("ã", "u00E3");
mapChars.put("ä", "u00E4");
mapChars.put("å", "u00E5");
mapChars.put("æ", "u00E6");
mapChars.put("ç", "u00E7");
mapChars.put("è", "u00E8");
mapChars.put("é", "u00E9");
mapChars.put("ê", "u00EA");
mapChars.put("ë", "u00EB");
mapChars.put("ì", "u00EC");
mapChars.put("í", "u00ED");
mapChars.put("î", "u00EE");
mapChars.put("ï", "u00EF");
mapChars.put("ð", "u00F0");
mapChars.put("ñ", "u00F1");
mapChars.put("ò", "u00F2");
mapChars.put("ó", "u00F3");
mapChars.put("ô", "u00F4");
mapChars.put("õ", "u00F5");
mapChars.put("ö", "u00F6");
mapChars.put("÷", "u00F7");
mapChars.put("ø", "u00F8");
mapChars.put("ù", "u00F9");
mapChars.put("ú", "u00FA");
mapChars.put("û", "u00FB");
mapChars.put("ü", "u00FC");
mapChars.put("ý", "u00FD");
mapChars.put("þ", "u00FE");
mapChars.put("ÿ", "u00FF");
mapChars.put("\n", "u00GS");
mapChars.put("\r", "u00GS");
mapChars.put("\t", "u00GF");
}
if(mapChars.containsKey(s)) {
s = mapChars.get(s);
}
sb.append(s);
}
181
return sb.toString();
}
hibernate.cfg
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate
Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-
configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property
name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</proper
ty>
<property
name="hibernate.connection.url">jdbc:mysql://localhost/gingasocial?aut
oReconnect=true</property>
<property
name="hibernate.connection.username">root</property>
<property
name="hibernate.connection.password">root</property>
<property
name="hibernate.connection.pool_size">10</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<property
name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<property
name="hibernate.current_session_context_class">thread</property>
</session-factory>
</hibernate-configuration>
index.jsp
<%@page
import="tv.gingasocial.controller.facebook.FacebookController"%>
<%@page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-
8859-1">
182
<title>Ginga Social</title>
<meta name="viewport" content="width=device-width, initial-
scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
.img-facebook {
width: 22px;
margin: -3px 8px 0 -5px;
}
#auth-username {
font-weight: bold;
}
.info-label {
font-weight: bold;
}
</style>
<link href="css/bootstrap-responsive.css" rel="stylesheet">
<body>
<div id="fb-root"></div>
<script>
// Load the SDK Asynchronously
(function(d){
var js, id = 'facebook-jssdk', ref =
d.getElementsByTagName('script')[0];
if (d.getElementById(id)) {return;}
js = d.createElement('script'); js.id = id; js.async =
true;
js.src = "//connect.facebook.net/en_US/all.js";
ref.parentNode.insertBefore(js, ref);
}(document));
183
function doLogin() {
FB.login(function(response) {
if(response.authResponse) {
//getting user's info
var uid = response.authResponse.userID;
var accessToken =
response.authResponse.accessToken;
<div class="container">
<hr>
<footer>
<p>© Rupp & Castro Corporation 2012</p>
</footer>
</div>
</body>
</html>
login.jsp
<%@page import="org.codehaus.jackson.map.ObjectMapper"%>
<%@page import="tv.gingasocial.model.entity.GSUser"%>
<%@page import="tv.gingasocial.controller.Controller"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%
String accessToken = request.getParameter("access_token");
String facebookUserId = request.getParameter("fb_user_id");
GSUser gingaUser =
Controller.registerOrUpdateUser(facebookUserId, accessToken);
ObjectMapper mapper = new ObjectMapper(); // can reuse, share
globally
186
%>
<%=json%>
187
Control.java
package gingasocial;
import gingasocial.model.User;
import gingasocial.view.GSStyle;
import gingasocial.view.HomeIconGS;
import gingasocial.view.LoginGS;
import gingasocial.view.UserHome;
import javax.tv.xlet.XletContext;
import com.sun.dtv.lwuit.Form;
((LoginGS) currentForm).loadImage();
((LoginGS) currentForm).init();
}
GingaSocialXlet.java
package gingasocial;
import javax.tv.xlet.Xlet;
import javax.tv.xlet.XletContext;
188
import javax.tv.xlet.XletStateChangeException;
import com.sun.dtv.lwuit.plaf.UIManager;
Post.java
package gingasocial.model;
import gingasocial.util.EncodeUtil;
import gingasocial.util.ResourceComponents;
import java.util.Vector;
/**
* @author Gustavo Rupp Santos
* @author Fiodor Castro
*/
public class Post {
if (!photoURL.equals("null")) {
String temp = photoURL.substring(photoURL.length() - 5);
temp = temp.replace('s', 'q');
photoURL = photoURL.substring(0, photoURL.length() - 5) +
temp;
}
this.photoURL = photoURL;
191
indexStart = indexEnd + 3;
if (i == 8) {
indexEnd = json.indexOf("'|", indexStart);
} else if (i != 9) {
indexEnd = json.indexOf("','", indexStart);
}
}
return vector;
}
192
User.java
package gingasocial.model;
import gingasocial.util.ResourceComponents;
import java.io.UnsupportedEncodingException;
import java.util.Vector;
indexStart = indexEnd + 3;
if(i == 2) {
indexEnd = data.indexOf("'|", indexStart);
} else if(i != 3) {
indexEnd = data.indexOf("','", indexStart);
}
}
Connector.java
package gingasocial.net;
import gingasocial.model.Post;
import gingasocial.model.User;
import gingasocial.util.EncodeUtil;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Vector;
return result.equals("true");
}
return Post.parseHomeDTO(result);
}
User.parseUser(user, result);
}
return result.equals("true");
}
return result.equals("true");
}
DTVUtil.java
package gingasocial.util;
import com.sun.dtv.lwuit.geom.Dimension;
import com.sun.dtv.ui.DTVContainer;
import com.sun.dtv.ui.Screen;
import com.sun.dtv.ui.event.KeyEvent;
import com.sun.dtv.ui.event.RemoteControlEvent;
import com.sun.dtv.ui.event.UserInputEventListener;
import com.sun.dtv.ui.event.UserInputEventManager;
inputManager.addUserInputEventListener(listener, event_0);
inputManager.addUserInputEventListener(listener, event_1);
inputManager.addUserInputEventListener(listener, event_2);
inputManager.addUserInputEventListener(listener, event_3);
inputManager.addUserInputEventListener(listener, event_4);
inputManager.addUserInputEventListener(listener, event_5);
inputManager.addUserInputEventListener(listener, event_6);
inputManager.addUserInputEventListener(listener, event_7);
inputManager.addUserInputEventListener(listener, event_8);
inputManager.addUserInputEventListener(listener, event_9);
numericKeysTaken = true;
inputManager.addUserInputEventListener(listener, redKey);
inputManager.addUserInputEventListener(listener, greenKey);
inputManager.addUserInputEventListener(listener, yellowKey);
inputManager.addUserInputEventListener(listener, blueKey);
coloredKeys = true;
}
return;
}
inputManager.removeUserInputEventListener(listener);
coloredKeys = false;
}
EncodeUtil.java
package gingasocial.util;
import java.util.HashMap;
import java.util.Map;
mapChars.put("u00D7", "\u00D7");
mapChars.put("u00D8", "\u00D8");
mapChars.put("u00D9", "\u00D9");
mapChars.put("u00DA", "\u00DA");
mapChars.put("u00DB", "\u00DB");
mapChars.put("u00DC", "\u00DC");
mapChars.put("u00DD", "\u00DD");
mapChars.put("u00DE", "\u00DE");
mapChars.put("u00DF", "\u00DF");
mapChars.put("u00E0", "\u00E0");
mapChars.put("u00E1", "\u00E1");
mapChars.put("u00E2", "\u00E2");
mapChars.put("u00E3", "\u00E3");
mapChars.put("u00E4", "\u00E4");
mapChars.put("u00E5", "\u00E5");
mapChars.put("u00E6", "\u00E6");
mapChars.put("u00E7", "\u00E7");
mapChars.put("u00E8", "\u00E8");
mapChars.put("u00E9", "\u00E9");
mapChars.put("u00EA", "\u00EA");
mapChars.put("u00EB", "\u00EB");
mapChars.put("u00EC", "\u00EC");
mapChars.put("u00ED", "\u00ED");
mapChars.put("u00EE", "\u00EE");
mapChars.put("u00EF", "\u00EF");
mapChars.put("u00F0", "\u00F0");
mapChars.put("u00F1", "\u00F1");
mapChars.put("u00F2", "\u00F2");
mapChars.put("u00F3", "\u00F3");
mapChars.put("u00F4", "\u00F4");
mapChars.put("u00F5", "\u00F5");
mapChars.put("u00F6", "\u00F6");
mapChars.put("u00F7", "\u00F7");
mapChars.put("u00F8", "\u00F8");
mapChars.put("u00F9", "\u00F9");
mapChars.put("u00FA", "\u00FA");
mapChars.put("u00FB", "\u00FB");
mapChars.put("u00FC", "\u00FC");
mapChars.put("u00FD", "\u00FD");
mapChars.put("u00FE", "\u00FE");
mapChars.put("u00FF", "\u00FF");
mapChars.put("u00GS", "\n");
mapChars.put("u00GF", "\t");
}
while(indexOf != -1) {
201
indexOf = str.indexOf("u00");
}
return str;
}
ResourceComponentes.java
package gingasocial.util;
import gingasocial.net.Connector;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import com.sun.dtv.lwuit.Image;
return image;
}
if (image != null) {
resources.put(id, image);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
DialogGS.java
package gingasocial.view;
import gingasocial.model.Post;
import gingasocial.util.DTVUtil;
import gingasocial.util.EncodeUtil;
import gingasocial.util.ResourceComponents;
import com.sun.dtv.lwuit.Dialog;
import com.sun.dtv.lwuit.Image;
import com.sun.dtv.lwuit.Label;
import com.sun.dtv.lwuit.layouts.BorderLayout;
import com.sun.dtv.ui.event.KeyEvent;
import com.sun.dtv.ui.event.RemoteControlEvent;
import com.sun.dtv.ui.event.UserInputEvent;
import com.sun.dtv.ui.event.UserInputEventListener;
setLayout(new BorderLayout());
Label avatarLabel = new Label();
likeCommentLabel = new Label();
GingaSocialPostContainer rightContainer = new
GingaSocialPostContainer();
avatarLabel.setWidth(40);
rightContainer.setWidth(50);
addComponent(BorderLayout.WEST, avatarLabel);
addComponent(BorderLayout.CENTER, rightContainer);
ResourceComponents.loadImageByURL(post.getFacebookId(),
post.getPhotoURL());
avatarLabel.setIcon(ResourceComponents.getImage(post.getUserFacebookId
()));
avatarLabel.getStyle().setMargin(1, 1, 1, 0);
String msg = post.getMessage() != null ? post.getMessage() :
"";
rightContainer.getNorthTextAreaPost().setFocusable(false);
rightContainer.getNorthTextAreaPost().setText(msg);
rightContainer.getNorthTextAreaPost().setFocusable(true);
rightContainer.getNorthTextAreaPost().setWidth(100);
if (post.getType().equals("photo")) {
Label centerImage = new
Label(ResourceComponents.getImage(post.getFacebookId()));
rightContainer.setCenterLabelImagePost(centerImage);
rightContainer.setWidth(200);
rightContainer.setHeight(200);
}
likeCommentLabel.setIcon(ResourceComponents.getImage(GingaSocialModern
ListCellRenderer.IMAGE_LIKE_COMMENT));
204
likeCommentLabel.getStyle().setBgColor(GSStyle.LIKE_COMMENT_CELL);
rightContainer.setSouthContainerLikeCommentPost(likeCommentLabel);
addComponent(BorderLayout.SOUTH, acoesUsuario);
if (code == RemoteControlEvent.VK_BACK) {
DTVUtil.releaseColoredKeys(DialogGS.this);
DTVUtil.releaseNumericKeys(DialogGS.this);
DTVUtil.releaseBackKey(this);
DTVUtil.reserveColoredKeys(home);
DTVUtil.reserveNumericKeys(home);
dispose();
}
}
GingaSocialModernListCellRenderer.java
package gingasocial.view;
205
import gingasocial.model.Post;
import gingasocial.util.EncodeUtil;
import gingasocial.util.ResourceComponents;
import java.awt.Color;
import com.sun.dtv.lwuit.Component;
import com.sun.dtv.lwuit.Container;
import com.sun.dtv.lwuit.Label;
import com.sun.dtv.lwuit.List;
import com.sun.dtv.lwuit.geom.Dimension;
import com.sun.dtv.lwuit.layouts.BorderLayout;
import com.sun.dtv.lwuit.list.ListCellRenderer;
import com.sun.dtv.lwuit.plaf.Style;
getStyle().setBgColor(Color.WHITE);
}
avatarLabel.setWidth(40);
rightContainer.setWidth(200);
addComponent(BorderLayout.WEST, avatarLabel);
addComponent(BorderLayout.CENTER, rightContainer);
avatarLabel.setIcon(ResourceComponents.getImage(home.getUserFacebookId
()));
avatarLabel.getStyle().setMargin(1, 1, 1, 0); //south, north,
west, east
String msg = home.getMessage() != null ? home.getMessage() :
"";
rightContainer.getNorthTextAreaPost().setText(msg);
setFocus(isSelected);
avatarLabel.setFocus(isSelected);
rightContainer.setFocus(isSelected);
rightContainer.getNorthTextAreaPost().setFocus(isSelected);
likeCommentLabel.setIcon(ResourceComponents.getImage(IMAGE_LIKE_COMMEN
T));
likeCommentLabel.setText(home.getLikes() + " pessoas curtiram
isso\n" + home.getComments() + " coment" + EncodeUtil.a_ACUTE +
"rios");
likeCommentLabel.getStyle().setMargin(1, 0, 2, 1);
likeCommentLabel.getStyle().setBgColor(GSStyle.LIKE_COMMENT_CELL);
rightContainer.setSouthContainerLikeCommentPost(likeCommentLabel);
if(isSelected) {
style.setBgTransparency(255);
style.setBgSelectionColor(GSStyle.BLUE_FB);
if(home.getFacebookId() ==
userHome.getBottomItem().getFacebookId()) {
userHome.updateBottomCentralPane();
}
} else {
setFocus(false);
style.setBgTransparency(255);
style.setBgColor(GSStyle.LINE_BORDER);
}
return this;
}
GingaSocialPostContainer.java
package gingasocial.view;
import com.sun.dtv.lwuit.Container;
import com.sun.dtv.lwuit.Label;
import com.sun.dtv.lwuit.TextArea;
import com.sun.dtv.lwuit.layouts.BorderLayout;
public GingaSocialPostContainer() {
setLayout(new BorderLayout());
northTextAreaPost = new TextArea(2, 30);
southContainerLikeCommentPost = new Label();
northTextAreaPost.getStyle().setMargin(1, 0, 0, 1);
addComponent(BorderLayout.NORTH, northTextAreaPost);
}
this.southContainerLikeCommentPost =
southContainerLikeCommentPost;
addComponent(BorderLayout.SOUTH,
southContainerLikeCommentPost);
}
GSStyle.java
package gingasocial.view;
import java.awt.Color;
import com.sun.dtv.lwuit.plaf.Style;
import com.sun.dtv.lwuit.plaf.UIManager;
public static final Color BLUE_FB = new Color(59, 89, 152); // dark
blue
public static final Color LIKE_COMMENT_CELL = new Color(237, 239,
244); //
public static final Color USER_DATA_FONT = new Color(242, 244, 248);
public static final Color LINE_BORDER = new Color(204, 204, 204);
public static final Color SELECTED_ITEM = new Color(242, 244, 249);
manager.setComponentStyle("Label", getLabelStyle());
manager.setComponentStyle("TextField",
getTextFieldAreaStyle());
manager.setComponentStyle("TextArea", getTextFieldAreaStyle());
manager.setComponentStyle("Dialog", getDialogSytle());
}
labelStyle.setBgColor(Color.WHITE);
labelStyle.setBgSelectionColor(SELECTED_ITEM);
labelStyle.setFgColor(Color.BLACK);
labelStyle.setBgTransparency(255);
return labelStyle;
}
textStyle.setBgColor(Color.WHITE);
textStyle.setBgSelectionColor(SELECTED_ITEM);
textStyle.setFgColor(Color.BLACK);
textStyle.setBgTransparency(255);
return textStyle;
}
return dialogStyle;
}
HomeIconGS.java
package gingasocial.view;
import gingasocial.Control;
import gingasocial.util.DTVUtil;
import gingasocial.util.ResourceComponents;
import com.sun.dtv.lwuit.Button;
import com.sun.dtv.lwuit.Form;
import com.sun.dtv.lwuit.Image;
import com.sun.dtv.lwuit.events.ActionEvent;
import com.sun.dtv.lwuit.events.ActionListener;
import com.sun.dtv.lwuit.geom.Dimension;
import com.sun.dtv.lwuit.layouts.CoordinateLayout;
import com.sun.dtv.ui.event.RemoteControlEvent;
setLayout(new CoordinateLayout(dimension.getWidth(),
dimension.getHeight()));
getStyle().setBgTransparency(0);
homeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent inputEvent) {
control.showMainForm();
}
});
addKeyListener(RemoteControlEvent.VK_ESCAPE, new
ActionListener() {
public void actionPerformed(ActionEvent ae) {
close();
}
});
show();
}
LoginGS.java
package gingasocial.view;
import gingasocial.Control;
import gingasocial.model.User;
import gingasocial.net.Connector;
import gingasocial.util.DTVUtil;
import gingasocial.util.ResourceComponents;
import java.awt.Color;
import java.io.IOException;
211
import com.sun.dtv.lwuit.Container;
import com.sun.dtv.lwuit.Form;
import com.sun.dtv.lwuit.Image;
import com.sun.dtv.lwuit.Label;
import com.sun.dtv.lwuit.TextField;
import com.sun.dtv.lwuit.events.ActionEvent;
import com.sun.dtv.lwuit.events.ActionListener;
import com.sun.dtv.lwuit.geom.Dimension;
import com.sun.dtv.lwuit.layouts.CoordinateLayout;
import com.sun.dtv.ui.event.KeyEvent;
import com.sun.dtv.ui.event.RemoteControlEvent;
import com.sun.dtv.ui.event.UserInputEvent;
import com.sun.dtv.ui.event.UserInputEventListener;
getStyle().setBgTransparency(0);
getStyle().setMargin(0, 0, 0, 0);
212
getStyle().setPadding(0, 0, 0, 0);
initComponents();
container.addComponent(labelGS);
container.addComponent(fieldLogin);
container.addComponent(fieldSenha);
DTVUtil.reserveNumericKeys(this);
DTVUtil.reserveColoredKeys(this);
addKeyListener(RemoteControlEvent.VK_ESCAPE, new
ActionListener() {
public void actionPerformed(ActionEvent ae) {
close();
}
});
show();
}
if (code == RemoteControlEvent.VK_COLORED_KEY_1) {
String login = fieldLogin.getText();
String pass = fieldSenha.getText();
if (login.equals("") || pass.equals("")) {
labelMsg = createLabelMsg(INVALID_USER_MSG,
Color.RED);
container.addComponent(labelMsg);
repaint();
return;
}
User user = new User(login, pass);
try {
boolean canLogin = Connector.doLogin(user);
if (canLogin) {
labelMsg = createLabelMsg(SUCCESS_LOGIN_MSG,
new Color(11, 114, 7));
container.addComponent(labelMsg);
repaint();
Connector.getUserInfo(user); // all
attributes setted
user.setHome(Connector.getUserHome(user,
null));
close();
controle.showUserHome(user);
} else {
214
labelMsg = createLabelMsg(INVALID_USER_MSG,
Color.RED);
container.addComponent(labelMsg);
repaint();
}
return label;
}
UserHome.java
package gingasocial.view;
import gingasocial.Control;
import gingasocial.model.Post;
import gingasocial.model.User;
import gingasocial.net.Connector;
import gingasocial.util.DTVUtil;
import gingasocial.util.ResourceComponents;
import java.awt.Color;
import java.io.IOException;
import java.util.Iterator;
import java.util.Vector;
import com.sun.dtv.lwuit.Container;
import com.sun.dtv.lwuit.Form;
import com.sun.dtv.lwuit.Image;
import com.sun.dtv.lwuit.Label;
import com.sun.dtv.lwuit.List;
import com.sun.dtv.lwuit.events.ActionEvent;
import com.sun.dtv.lwuit.events.ActionListener;
import com.sun.dtv.lwuit.geom.Dimension;
import com.sun.dtv.lwuit.layouts.BorderLayout;
import com.sun.dtv.lwuit.layouts.CoordinateLayout;
import com.sun.dtv.lwuit.plaf.Style;
import com.sun.dtv.ui.event.KeyEvent;
import com.sun.dtv.ui.event.RemoteControlEvent;
import com.sun.dtv.ui.event.UserInputEvent;
import com.sun.dtv.ui.event.UserInputEventListener;
container.setLayout(new BorderLayout());
container.setX((int) (screenDimension.getWidth() * 0.03F));
container.setY((int) (screenDimension.getHeight() * 0.01F));
container.getStyle().setBgTransparency(255);
container.getStyle().setBgColor(Color.WHITE);
container.getStyle().setMargin(0, 0, 0, 0);
container.getStyle().setPadding(0, 0, 0, 0);
container.getStyle().setPadding(0, 0, 0, 0);
addComponent(container);
createTopPanel();
container.addComponent(BorderLayout.NORTH, topPanel);
createCentralPane();
container.addComponent(BorderLayout.CENTER, centralPanel);
createSouthPanel();
container.addComponent(BorderLayout.SOUTH, southPanel);
DTVUtil.reserveColoredKeys(this);
DTVUtil.reserveNumericKeys(this);
addKeyListener(RemoteControlEvent.VK_ESCAPE, new
ActionListener() {
public void actionPerformed(ActionEvent ae) {
close();
}
});
show();
}
userLabel.setIcon(ResourceComponents.getImage(user.getFacebookUserId()
));
userLabel.setTextPosition(Label.RIGHT);
217
style.setBgColor(GSStyle.BLUE_FB);
style.setFgColor(GSStyle.USER_DATA_FONT);
topPanel.addComponent(BorderLayout.CENTER, userLabel);
}
centralPanel.addComponent(BorderLayout.CENTER, posts);
}
DTVUtil.releaseColoredKeys(this);
DTVUtil.releaseNumericKeys(this);
DialogGS dialog = new DialogGS(post, this);
DTVUtil.reserveColoredKeys(dialog);
DTVUtil.reserveNumericKeys(dialog);
dialog.init();
dialog.show(100, 50, 200, 200, false);
try {
boolean resposta = Connector.like(user.getGingaId(),
post.getFacebookId());
if (resposta) {
post.setLikes(post.getLikes() + 1);
}
} catch (IOException e) {
e.printStackTrace();
}
}
1. Introdução
O processo de definição do padrão para teledifusão digital no Brasil durou cerca de 15
anos, compreendendo os anos de 1991 a 2006. Neste processo, ainda em andamento,
muito destaque está sendo dado ao sinal de alta definição em detrimento das demais
características da televisão digital, praticamente ainda desconhecidas, como por
exemplo, multiprogramação e interatividade.
No Brasil a interatividade será possível graças ao Ginga e a um canal de retorno. O
Ginga é uma camada de software intermediário (middleware) que permite o
desenvolvimento de aplicações interativas para a TV Digital de forma independente da
plataforma de hardware dos fabricantes de terminais de acesso (set-top boxes).
Aplicações interativas podem integrar serviços Web, complementar o conteúdo de
programas sendo veiculados, jogos, aplicações para o governo (T-Gov), bancárias (T-
Banking), comércio eletrônico (T-Commerce) e aplicações que permitam a integração
com outros dispositivos que não o controle remoto. O canal de retorno é um meio que
permitirá os televisores enviarem dados às emissoras de TV e, assim, de fato propiciar a
interatividade.
Paralelamente deu-se a ascensão do Facebook, a qual trata-se de um serviço que
conectam indivíduos e seu conteúdo consiste somente em informações disponibilizados
por estes indivíduos. O grande número de pessoas adeptas à essa rede social, bem como
o alto nível de interação entre seus usuários, fez com que esta se tornasse uma
importante fonte de informação, combinando qualidade de informação com celeridade
para disseminá-las.
As redes sociais passaram a influenciar fortemente as emissoras de televisão e os seus
programas e, por outro lado, os conteúdos televisivos são os principais e mais
frequentes temas repercutidos nas redes. Um caso interessante foi o uso do Twitter
durante a transmissão do evento esportivo Super Bowl nos Estados Unidos, onde 50%
da atividade nesta rede social foi relacionada ao evento. No Brasil aconteceu algo
parecido durante a exibição do programa BBB10.
221
Esta interação entre redes sociais e TV Digital tende a se intensificar no Brasil a medida
que o padrão SBTVD vai se concretizando já que, podemos observar, ambos possuem
grande aceitação por parte dos brasileiros. Fala-se em uma convergência entre estas
duas plataformas e esta nova realidade torna-se um interessante tema a ser estudado.
2. TV Digital no Brasil
Em 2003, com as discussões sobre TV Digital cada vez mais presentes, o governo,
através do Decreto nº 4.901 (BRASIL, 2003), instituiu o Sistema Brasileiro de
Televisão Digital - SBTVD. Além de inovação tecnológica o governo pretendia utilizar-
se do SBTVD como uma ferramenta de combate à exclusão digital e consequentemente
exclusão social, sendo que esta é uma das características que o distingue dos demais
sistemas.
Após diversas discussões, em 2006 foi instituído um novo decreto, o de número nº
5.820, onde foi definido que o SBTVD teria como base o ISDB e seria possível
incorporar inovações tecnológicas com o intuito de uma melhor adequação à realidade
brasileira. O sistema brasileiro passou por alterações e de fato não se pode dizer que
SBTVD e ISDB são equivalentes. A figura 1 ilustra a arquitetura do padrão brasileiro.
4.1. Ginga-J
O Ginga-J é obrigatório em dispositivos fixos e composto por um conjunto de APIs
definidas para atender todas as funcionalidades necessárias para a implementação de
aplicativos para TV Digital, desde a manipulação de dados multimídia até protocolos de
acesso. Sua especificação é formada por uma adaptação da API de acesso a informação
de serviço do padrão japonês (ARIB B.23), pela especificação Java DTV (que inclui a
API JavaTV), além de um conjunto de APIs adicionais de extensão ou inovação
(PAULINELLI; KULESZA, 2012). Atualmente a arquitetura do Ginga-J está
consolidada e é mostrada na Figura 3.
3. Redes Sociais
Em linhas gerais, o estudo das redes sociais é o estudo dos “agrupamentos sociais
estabelecidos através da interação mediada pelo computador” (RECUERO, 2006). Uma
rede social é composta por dois elementos: os atores (ou seja, as pessoas, instituições ou
grupos, que constituem os nós da rede) e suas conexões (ou seja, as relações que se
estabelecem entre os indivíduos) (RECUERO, 2006).
Atualmente, quando falamos de redes sociais no mundo vem a cabeça o mais utilizado,
o Facebook. O infográfico da Figura 4 divulgado pelo portal de notícias russo Rian
Novosti 17 demonstra o domínio desse website principalmente na América, Europa,
África e Oceania. Mudando o foco para o Brasil, de acordo com a medição do Instituto
de pesquisas IBOPE Nielsen Online 18 , o Orkut que esteve na liderança de acessos
diários durante 7 anos, perdeu seu posto em meados de agosto de 2011 (GALO, 2011).
A partir dessa data, o Facebook ocupa a primeira colocação, assim como o faz em todo
o restante do mundo, verificado na Figura 4.
17
Rian Novosti: http://en.rian.ru/
18
IBOPE Nielsen: http://br.nielsennetpanel.com/pnl/br/home
224
Na figura pode ser observado que há um ponto central de conexão entre TV e Facebook,
trata-se do servidor web do Ginga Social, intitulado como Ginga Social Web (GSW).
O servidor Ginga Social atua como um gateway entre a aplicação de TV, doravante
chamada Ginga Social TV (GSTV), e o Facebook comunicando-se bidirecionalmente
com ambos através da Internet.
Antes da execução da aplicação na TV o usuário deve permitir que seus dados,
residentes no Facebook, sejam fornecidos à terceiros. O caso de uso
Autorização/Autenticação Facebook contempla esta etapa, que é realizada através do
Servidor GSW. Para tanto o usuário acessa a página do servidor “index.jsp” e autoriza
explicitamente à aplicação Ginga Social obter seus dados junto ao Facebook. Após a
autorização, são gerados automaticamente login e senha a esse usuário de forma que os
demais casos de uso possam ser utilizados na TV.
Ao executar a aplicação na TV, uma autenticação se faz necessária junto ao GSW que
possui o access token do usuário persistido no BD. Uma vez que o usuário autentique-se
junto ao sistema, o Ginga Social Web obtém os dados do usuário junto ao Facebook
para que seja possível a Exibição do Facebook Home do usuário. Com o home
disponível em tela, pode-se curtir ou compartilhar um post e, a critério do usuário,
atualizar seu home com os posts mais recentes ou mais antigos.
dependência direta da aplicação com relação ao Facebook, bem como torna o ambiente
mais amigável para possíveis extensões do conjunto de funcionalidades.
Para comunicação entre o GSW e o GSTV foi implementado no servidor um web
service REST para que a aplicação cliente possa consultar dados e/ou enviar ações do
telespectador. Os serviços disponibilizados são os seguintes: obtenção do dados do
usuário cadastrado no Ginga Social, obtenção dos home do usuário no Facebook,
autenticação do telespectador na aplicação cliente, envio da ação ‘curtir’ e
‘compartilhar’ advinda da TV.
5. Conclusão
O primeiro grande desafio deste trabalho foi encontrar um ambiente apropriado para o
desenvolvimento das aplicações Ginga-J. Para tanto, seria necessário dispor de uma
plataforma que contivesse a implementação, ao menos de grande parte, do middleware
Ginga pois, como vimos, a máquina de execução depende das camadas inferiores do
middleware.
Apesar das dificuldades enfrentadas, devemos lembrar que praticamente todos os lares
brasileiros possuem um televisor, fazendo deste um dos principais meios de
comunicação do país. Com este cenário em mente, somos levados a pensar que, sem
dúvidas, a TV Digital no Brasil possui um grande potencial considerando o perfil sócio-
econômico de sua população. Embora o mercado da televisão, com emissoras e
fabricantes de TV, esteja inserido dentro deste contexto favorável, o fato é que observa-
se muito pouco avanço quando o assunto é interatividade.
Este trabalho pode ser encarado, também, como uma forma de disseminação da TV
Digital e suas capacidades, já que, aliando-a às redes sociais, mais especificamente ao
Facebook, há muito mais chances das pessoas tomarem conhecimento das
potencialidades dessa tecnologia.
Por fim, acreditamos que o objetivo principal desta empreitada foi alcançado, qual seja,
a integração entre redes sociais e TV Digital. Através do desenvolvimento do sistema
Ginga Social, proporcionamos o contato entre estas duas diferentes mídias,
considerando as limitações de ambas, principalmente no lado da TV. Outrossim, os
estudos referentes aos dois temas também foram satisfatórios à medida que deram
suporte para que o trabalho fosse concluído.
Referências
ABNT - ASSOCIAÇÃO BRASILEIRA DE NORMAS TÉCNICAS. NBR 15606-1.
Televisão digital terrestre - Codificação de dados e especificações de transmissão para
radiofusão digital. Parte 1: Codificação de dados. 2011.
BRASIL. Decreto nº 4.901, 26 de novembro de 2003. Institui o Sistema Brasileiro de
Televisão Digital - SBTVD, e dá outras providências. Diário Oficial da União, 27 nov.
2003, p7.
BRASIL. Decreto nº 5.820 - 29 de junho de 2006. Dispõe sobre a implantação do
SBTVD-T, estabelece diretrizes para a transição do sistema de transmissão analógica
para o sistema de transmissão digital do serviço de radiodifusão de sons e imagens e do
serviço de retransmissão de televisão, e dá outras providências. Diário Oficial da União,
30 jun. 2006, p51
FACEBOOK. ESTATÍSTICAS FACEBOOK. Disponível em:
<http://www.facebook.com/press/info.php?statistics>. Acesso em: Outubro, 2012a.
FACEBOOK. Open Graph Overview. Disponível em:
<https://developers.facebook.com/docs/concepts/opengraph/overview/>. Acesso em:
Outubro, 2012b
FACEBOOK. Getting Started: The Graph API. Disponível em:
<http://developers.facebook.com/docs/getting-started/graphapi/>. Acesso em: Outubro,
2012c.
228