O crivo de Eratóstenes – Um método para encontrar números primos.

janeiro 13, 2011

O Problema:

Um inteiro primo é qualquer inteiro que só pode ser dividido exatamente por si mesmo e por 1. O Crivo de Eratóstenes é um métodos de encontar números primos. Ele funciona da seguinte maneira:

a) Crie um array com todos os elementos inicializados com 1 (verdadeiro). Os elementos do array com subscritos primos permanecerão 1. Todos os outros elementos do array serão definidos  como zero.

b) Começando com o subscrito 2 do array (o subscrito 1 deve ser primo), sempre que for encontrado um elemento do array cujo valor seja 1, faça um laço pelo restante do array e defina como zero todos os outros elementos cujo subscrito seja múltiplo do subscrito com valor 1. Para o subscrito 2 do array, todos os elementos além de 2 que forem múltiplos de 2 serão definidos como zero (subscritos 4, 6, 8, 10 etc.). Para o subscrito 3 do array, todos os elementos além de 3 que forem múltiplos de 3 serão definidos como zero (subscrito 6, 9, 12, 15 etc.).

Quando esse processo for concluído, os elementos do array que ainda estiverem definidos como 1 indicam que o subscrito é um número primo. Esses subscritos podem ser impressos.

A Solução:

Esse problema possui uma solução muito fácil de ser implementada. Um algoritmo para resolver esse problema pode ser assim:

{Objetivo: usar o método do Crivo de Eratóstenes para achar números primos}
Algoritmo Crivo_de_Eratóstenes
{cria um vetor de inteiros de tamanho max}
    Inteiro[max] primos;
    
    {Inicializa todos os elementos com 1}
    Para i = 1 até max
        primos[i] = 1;
        i = i + 1;
    {Anula os elementos do array que não são primos}
    Para i = 2 até max
        Se primos[i] == 1
            {Função para anular os múltiplos de i}
            AnulaMultiplos(i);
    {Função para imprimir o subscrito do array quando o elemento do array naquele subscrito é igual a 1}
    ImprimePrimos();
}

Como dá pra perceber o algoritmo é bastante simples, vamos implementar em linguagem C++ esse algoritmo:

#include iostream.h
#include stdlib.h
void imprimePrimos(int primo[], int max);
void anulaMultiplos(int primo[], int max, int subscrito);
int main()
{
    const int max = 10000;
    int primo[max];
    for (int i = 1; i < max; i++)
        primo[i] = 1;
    for (int i = 2; i < max; i++)
        if (primo[i] == 1)
            anulaMultiplos(primo, max, i);
        imprimePrimos(primo, max);
    system("PAUSE");
    return 0;
}
void anulaMultiplos(int primo[], int max, int subscrito)
{
    for (int i = subscrito; i = max)
            break;
        else
            primo[i * subscrito] = 0;
}
void imprimePrimos(int * primo, int max)
{
    for (int i = 0; i < max; i++)
        if (*(primo + i) == 1)
            cout << i << "\t";
        cout << "\n";
}

Nesse caso esse programa gera os números primos até 10000, já que este é o valor de max. Para gerar mais números primos basta mudar esse valor.

Modelo de propagação para cobertura outdoor baseado em medidas na Malásia

novembro 22, 2010

Esse post é um comentário sobre o artigo Path Loss Model Development for Urban Outdoor Coverage of Code Division Multiple Access (CDMA) System in Malaysia. Esse artigo foi publicado no International Conference on Microwave and Millimeter Wave Technology (ICMMT), 2010.

Inicialmente será feito um resumo sobre o artigo. Em seguida, alguns comentários pessoais. Este artigo foi escolhido para ser estudado aqui por ser bem recente e ser de uma de minhas áreas de estudo. Apenas isso.

Introdução

Nesse artigo, os autores propõe um novo modelo para o cálculo do path loss para propagação outdoor em ambiente urbano. O modelo foi baseado em medidas de campo realizadas na cidade de Kuala Lampur (KL), Malásia, em uma rede CDMA.

Além disso, o modelo foi comparado com métodos clássicos, como o modelo espaço livre, Okumura, Hata e Egli.

Modelos de propagação

Modelo do espaço livre

Este modelo considera que a propagação da onda eletromagnética é feita em espaço livre, ou seja, sem qualquer obstrução. A potência recebida é dada por:

P_L(dB) = -10 log_{10} (\frac{G_T G_R \lambda^2}{(4 \pi)^2 d^2})

em que:

G_T, G_R, \lambda, d são, respectivamente, o ganho da antena transmissora, o ganho da antena receptora, o comprimento de onda e a distância entre o receptor e o transmissor.

Modelo de Okumura

O modelo de Okumura é um modelo empírico baseado em medidas feitas no Japão em várias frequências na faixa de 150 a 1290 MH, e é válido para distâncias entre 1 e 100 km. A altura da antena transmissora deve estar no intervalo de 30 a 1000 m. Além disso, o modelo considera vários parâmetros do ambiente.

A partir de medições, foram geradas várias curvas de perda de propagação que devem ser consultadas pelo projetista.

Modelo de Hata

O modelo de Hata é, na verdade, uma formulação empírica a partir das curvas de Okumura, ou seja, é uma espécie de interpolação das curvas fornecidas pelo modelo de Okumura.

Este modelo é muito utilizado como modelo de previsão em redes celulares, e inclui efeitos de difração, reflexão e espalhamento causados pelas estruturas presentes no ambiente.

Para área urbana, o path loss é dado por:

L_{urbano}(dB) = 69.55 + 26.16log_{10}(f_c) - 13.82log_{10}(h_r) - a(h_r) + (44.9 - log_{10}(h_t))log_{10}(d)

em que:

f_c, h_r, h_t são, respectivamente, a frequência da portadora, a altura da antena receptora e a altura da antena transmissora. a(h_r) é um fator de correção,  dado por a(h_r) = 3.2 (log_{10}(11.75 h_r))^2 - 4.97 dB , para f_c > 300 MHz

Modelo de Egli

O modelo de Egli é um modelo de propagação usado para estimar o path loss para links comunicações ponto a ponto (visada direta). É usado tipicamente em cenários onde uma antena está fixa e outra é móvel. O terreno entre as duas antenas é irregular, e o modelo não considera obstruções por vegetação. O path loss é dado por:

P_L(dB) = G_R G_T (\frac{h_T h_R}{d^2})^2 (\frac{40}{f})^2

Modelo proposto e conclusão

Após realizar medidas em KL, os autores compararam o path loss medido com o path loss estimado pelos modelos acima. A partir disso, verificaram que o modelo que mais se adequou as medidas foi o modelo de Okumura.

A partir desse ponto, os autores interpolaram as medidas e sugeriram um novo modelo, baseado no modelo de Okumura e concluiram que o novo modelo é mais preciso do que os outros modelos utilizados na comparação. A conclusão é de que esse modelo pode ser utilizado na Malásia, com melhores resultados do que outros modelos já consagrados.

Meus comentários:

Não concordo com a conclusão do autor de que o modelo proposto é suficiente para estimar o path loss na Malásia. De acordo com o artigo original, foram feitas medidas em KL utilizando 4 células, sendo que foram utilizadas 6 rotas por célula. Não foi informado, por exemplo, se, nas medições, a altura da antena transmissora/receptora foi alterada, ou se houve variação significativa de ambiente. Como nada disso foi informado, não é possível dizer que esse modelo seria melhor do que o Okumura se aplicada na Malásia. Apenas é possível afirmar que esse modelo (que é uma interpolação de medidas realizadas em KL) descreve melhor o path loss nas condições medidas (lembrando que o ambiente não foi descrito, tampouco dados de altura das antenas).  De qualquer forma, sempre acho interessante artigos mostrando medidas de propagação em localidades diferentes.

A possibilidade de prever decisões e o livre-arbítrio

agosto 30, 2010

Tirei esse texto do livro “A longa marcha dos grilos canibais“, de Fernando Reinach e publicado pela Companhia das Letras (muito bom o livro!).

Há milhares de anos a humanidade se preocupa em saber se afinal possuímos ou não livre-arbítrio. Será que quando decidimos conscientemente praticar um ato essa decisão é fruto tão só da nossa vontade? Ou será que as leis da natureza e os fatos que ocorreram no passado determinam cada um de nossos atos, e a impressão de absoluta vontade própria não passa de ilusão? Há alguns anos o neurologista Benjamin Libet realizou um experimento que coloca mais lenha na fogueira do debate sobre o livre-arbítrio.

Libet pediu que voluntários se sentassem e colocassem a mão sobre uma mesa. Depois, pediu que em algum momento (eles poderiam decidir quando) movessem a mão. Nenhuma indicação externa sinalizava quando a mão deveria ser movida. A decisão de movimentar a mão deveria ser totalmente involuntária. Além disso, Libet colocou diante dos voluntários um relógio em que o ponteiro de segundos ficava girando constantemente. No momento em que o voluntário decidisse mover a mão, deveria observar onde estava o ponteiro do relógio e informar essa posição aos pesquisadores. Além disso, Libet instalou sensores na mão dos voluntários, que permitiam saber exatamente quando a mão se mexia, e eletrodos na cabeça, que mediam a atividade cerebral. Feito tudo isso, as pessoas simplesmentes ficavam ali, mexendo a mão quando quisessem.

O que Libet observou foi que era possível detectar atividade cerebral quase um segundo antes de a mão se mexer. Isso era esperado, pois o comando vindo do cérebro demora um tempo para chegar aos músculos da mão. O inesperado foi a constatação de que o momento em que a pessoa conscientemente decidia mexer a mão (determinada pela posição do ponteiro do relágio que ela informava ao pesquisador) ocorria sempre 0,3 segundo antes de a mão se mexer, mas 0,7 segundo depois da atividade cerebral. Em todos os voluntários a sequência de eventos era a seguinte: primeiro se detectava a atividade cerebral, 0,7 segundo depois a pessoa decidia mover a mão e 0,3 segundo depois do ato consciente de mover a mão é que ela realmente movia. O fato de a atividade cerebral ocorrer antes de a decisão surgir na consciência indica que a primeira parte da decisão de mover a mão ocorre de maneira inconsciente (durante o primeiro 0,7 segundo); somente depois a consciência toma “conhecimento” de que vai mover a mão.

Durante os últimos anos, uma série enorme de testes foi feita para verifcar possíveis fontes de erro nesse experimento, porém nada foi detectado. Tudo indica que realmente cada uma de nossas decisões se inicia de forma inconsciente. Mas se isso é verdade, então existe um intervalo de 0,7 segundo no qual um observador que esteja monitorando nossa atividade cerebral já sabe o que vamos decidir antes de nossa consciência ter acesso a essa decisão. Em outras palavras: medindo a atividade cerebral, um observador pode saber o que uma pessoa vai decidir antes de ela ter conscientemente decidido.

Esse resultado não exclui a possibilidade de o lívre-arbítrio existir, mas sua interpretação tem provocado muita discussão entre filósofos e cientistas, que tentam compreender como se forma a consciência e se o livre-arbítrio de fato existe. Por outro lado, esse experimento demosntra claramente que a consciência é o resultado da atividade cerebral, tornando improvável a hipótese, ainda defendida por muitos, de que cérebro e mente são entidades distintas.

Mais informações: “Do we have free will?”. J. Consc. Studies, vol. 6, p. 47, 1999.

A origem do Sol

junho 2, 2010

Retirei esse texto do livro Criação Imperfeita, do Marcelo Gleiser.

O universo tinha cerca de nove bilhões de anos, quase tão velha quanto o próprio cosmo. Uma profusão de estrelas nasciam e morriam. No meio da confusão, uma nuvem de gás gigantesca, consistindo principalmente em hidrogênio e hélio, flutuava pelo vazio do espaço, girando em torno de si mesma. De repente, uma estrela vizinha chegou ao fim da sua vida normal. Nos seus estertores, passou a fundir os elementos químicos mais pesados da tabela periódica a um ritmo frenético. Pulsou dramaticamente algumas vezes até finalmente explidir com enorme violência, uma supernova, jorrando suas entranhas pelas distâncias siderais. A onda de choque colidiu com a nuvem de hidrogênio, semeando-a com a química da vida – carbono, nitrogênio, oxigênio, sódio, ferro… e causando o seu colapso. A própria gravidade da nuvem forçou-a a contrair-se, enquanto continuava a girar em torno de si mesma. Aos poucos, foi alongando-se no equador e achatando-se nos polos, tomando a forma de um disco, enquanto a maior parte do material foi concentrando-se no centro. Com o acúmulo de matéria na região central, o hidrogênio lá foi espremido e sua temperatura e pressão aumentaram. Quando a temperatura atingiu 15 milhões de graus, a fusão nuclear de hidrogênio em hélio começou, liberando uma enorme quantidade de energia em radiação e neutrinos. Essa energia contrabalançou a implosão gravitacional da massa: desse equilíbrio entre implosão e explosão nasceu uma estrela, o nosso Sol.

Como escrever números por extenso

julho 30, 2009

Precisei escrever uma rotina para escrever números por extenso de até R$ 999.999,99 por extenso. Fiz um programinha em Java e depois converti para VBA, para ser usado no Excel. A rotina não está otimizada e nem muito genérica. Mas se alguém precisar de algo mais genérico (para números maiores), é só pegar o código e estender, está bem simples.

Código em Java:

extenso java

Saída:

extenso saida
Código em VBA:

extenso vba

Como usar no Excel:

extenso vba uso 1

extenso vba uso 2

[Resenha] Faraday & Maxwell – Luz sobre os campos

maio 16, 2009

faraday e maxwell Como o próprio nome diz, esse livro fala sobre Michael Faraday e James Clerk Maxwell, dois grandes nomes do Eletromagnetismo.

O autor, Frederico Firmo de Souza Cruz, usou o gênero ficcional para contar a história desses 2 físicos. A história se passa numa cidadezinha no interior do Brasil, onde alguns alunos estão empenhados em montar um rádio. Depois de montado, ficaram curiosos para saber como ele funcionava: afinal de contas, como uma voz muito distante chegava ali, sem nenhum fio? Quem ajuda os alunos a resolver esse mistério é o Sr. Rocha, que resolve fazer algumas palestras para explicar o funcionamento do rádio. As palestras começam sobre o início dos estudos da eletrecidade e do magnetismo, chega na vida e obra de Faraday e Maxwell, explicando como foi junção dessas 2 ciências e finaliza com a explicação do rádio.

É um livro bem interessante de se ler, barato, com leitura fácil e rápida, cerca de 230 páginas. Vale a pena a leitura.

As leis de Newton da dinâmica

maio 13, 2009

O objetivo desse post é apenas mostrar algumas formas que grandes autores escreveram as 3 leis de Newton. Não tem objetivo de explicá-las, apenas deixar aqui gravado, para consulta histórica.

Inicialmente, nada mais justo do que mostrar as 3 leis escritas pelo próprio Newton. Nesse caso as leis foram retiradas do livro Principia da editora USP. Uma cópia das leis escritas em latim, no Principia original são encontradas no final desse post.

Lei I – Todo corpo continua em seu estado de repouso, ou de movimento uniforme em linha reta, a menos que seja forçado a mudar aquele estado por forças imprimidas a ele.

Lei II – A variação do movimento é proporcional à força motora imprimida, é e produzida na direção da linha reta na qual aquela força é imprimida.

Lei III – A toda ação há sempre oposta uma reação igual ou, as ações mútuas de dois corpos um sobre o outro são sempre iguais e dirigidas a partes opostas.

Fonte: Isaac Newton, “Principia”, EDUSP

Outra tradução para o português das 3 leis é encontrada no livro “Newton: textos, antecedentes e comentários”, publicado pela editora UERJ. Nessa tradução, as leis foram escritas como:

Lei I – Todo corpo continua em seu estado de repouso, ou de movimento uniforme em linha reta, a menos que seja compelido a modificar esse estado por forças imprimidas a ele.

Lei II – A variação do movimento é proporcional à força motriz imprimida, e ocorre na direção da linha reta em que essa força é imprimida.

Lei III – Para cada ação existe sempre uma reação igual e contrária: ou as ações recíprocas de dois corpos um sobre o outro são sempre iguais e dirigidas para partes contrárias.

Fonte: Textos escolhidos e organizados por Bernard Cohen e Richard S. Westfall, “Newton: textos, antecedentes e comentários”, Contraponto, EDUERJ

Já o livro de física do Halliday, muito utilizado durante o ciclo básico na área de ciências exatas, escreve as 3 leis como:

Lei I – Considere um corpo no qual não atue nenhuma força resultante. Se o corpo estiver em repouso, ele permanecerá em repouso; se o corpo estiver em movimento com velocidade constante, ele continuará neste estado de movimento.

Lei II – Somatorio de \sum_{}^{}\mathbf{F} = m\mathbf{a}

Lei III – A toda ação corresponde uma reação igual e de sentido oposto.

Fonte: Resnick, Halliday, Krane, “Física 1”, 4ª Edição, LTC

No livro Matter and Motion, de James Clerk Maxwell, as 3 leis estão escritas como:

Law I – Every body perseveres in its state of rest or of moving uniformly in a straight line, except in so far as it is made to change that state by external forces.

Law II – Change of motion is proportional to the impressed force, and takes place in the direction in which the force is impressed.

Law III – Reaction is always equal and opposite to action, that is to say, the actions of two bodies upon each other are always equal and in opposite directions.

Fonte: James Clerk Maxwell, “Matter and Motion”, Dover Publications

As 3 leis foram originalmente escritas, em latim, da seguinte forma:

Lex I* – Corpus omne persevarare in statu suo quiescendi vel movendi uniformiter in directum, nisi quatenus a viribus impressis cogitur statum illum mutare.

Lex I** – Corpus omne perseverare in statu suo quiescendi vel movendi uniformiter in directum, nisi quatenus illud a viribus impressis cogitur statum suum mutare.

Lex II – Mutationem motis proportionalem esse vi motrici impressae, et fieri secundum lineam retam qua vis illa imprimitur.

Lex III – Actioni contrariam semper et aequalem esse reactionem: sive corporum duorum in se mutuo semper aequales et in partes contrarias dirigi.

Fonte: Isaac Newton, “Principia”, EDUSP

* edição de 1687 e 1713

** edição de 1726

Uma breve história do eletromagnetismo

maio 5, 2009

Os momentos mais dramáticos no desenvolvimento da Física são aqueles quando grandes sínteses acontecem, onde fenômenos que previamente pareciam er distintos são subitamente revelados como sendo apenas diferentes aspectos da mesma coisa. A história da Física é a história de tais sínteses, e o sucesso da ciência física baseia-se principalmente no fato de que somos capazes de sintetizar.

Talvez o momento mais dramático no desenvolvimento da Física durante o século XIX ocorreu para J. C. Maxwell um dia na década de 1860 quando combinou as leis da eletricidade e magnetismo com as leis do comportamento da luz. Como resultado, as propriedades da luz pforam parcialmente desvendadas – essa antiga e sutil coisa que de tão importante e misteriosa foi necessária uma criação especial para ela quando o Gênesis foi escrito. Maxwell poderia ter dito, quando terminou sua descoberta, “Faça-se a eletricidade e o magnetismo, e se fará a luz!”.

Para esse momento culminante foi necessária uma longa preparação apra a descoberta gradual e a revelação das leis da eletricidade e do magnetismo. Essa história é, em suma, a seguinte. Descobertas gradualmente, as propriedades da eletricidade e magnetismo, das forças elétricas de atração e repulsão e das forças magnéticas mostraram que, embora essas forças sejam um tanto complexas, elas diminuem com o quadrado da distância. Sabemos, por exemplo, que a simples lei de Coulomb para cargas estascionárias diz que o campo da força elétrica varia inversamente com o quadrado da distância. Como consequência, para distâncias suficientemente grades, a influência de um sistema de cargas sobre outro é muito pequena. Maxwell notou que as equações ou leis que tinham sido descobertas até aquele tempo eram mutuamente inconsistentes quando ele tentou juntá0las, e para tornar consistente o sistema completo, ele teve que adicionar mais um termo às suas equações. Esse novo termo trouxe uma previsão surpreendente, que uma parte dos campos elétrico e magnético decairia bem mais devagar com a distânci do que a lei do inverso do quadrado, a saber, inversamente com a primeira potência da distância! E assim ele percebeu que correntes elétricas são capazes de afetar cargas distantes do seu local, predizendo então os efeitos básicos com os quais estamos familiarizados hoje em dia – transmissão de rádio, radar e assim por diante.

Parece um milagre que alguém falando na Europa, com meras influências elétricas, possa ser escutado a milhares de milhas de distância em Los Angeles. Como isso é possível? É porque os campos não variam com o inverso do quadrado, mas apenas inversamente com a primeira potência da distância. Finalmente, então até a própria luz foi reconhecida como influências elétrica e magnética estendendo-se sobre grandes distâncias, geradas por uma oscilação incrivelmente rápida dos elétrons nos átomos. Todos esses fonômenos são resumidos na palavra radiação, ou mais especificamente, radiação eletromagnética, pois existem um ou dois outros tipos de radiação também. Quase sempre, radiação quer dizer radiação eletromagnética.

E assim é tecido o universo. Os movimentos atômicos de uma estrela longínqua ainda têm influência suficiente, mesmo nessas grandes distâncias, para mover os elétrons do nosso olho, e assim podemos entender as estrelas. Caso essa lei não existisse, estaríamos literalmente no escuro com relação ao mundo exterior! E as ondas elétricas em uma galáxia distante cinco bilhões de anos-luz – que é o objeto mais longínquo que descobrimos até o presente – pode ainda influenciar de maneira significante e detectável as correntes no “grande prato” de um rádio telescópio. E dessa maneira somos capazes de ver as estrelas e galáxias.Vamos descrever a situação da Física no final do século XIX. Tudo o que era conhecido na época sobre as leis fundamentais é resumido a seguir.

Primeiramente, existiam as leis de força: uma força era a lei da gravitação;  a força em um objeto de massa m devido a outro de massa M , é dada por

\mathbf{F} = \frac{GmM\mathbf{e_r}}{r^2}

onde \mathbf{e_r} é um vetor unitário direcionado de m a M , onde r é a distância entre elas.

Em seguida, as leis de eletricidade e magnetismo, como eram conhecidas no final do século XIX, são: as forças elétricas agindo em uma carga q podem ser descritas por dois campos, chamados \mathbf{E} e \mathbf{B} , e a velocidade \mathbf{v} da carga q , pela equação

\mathbf{F} = q\left (\mathbf{E} + \mathbf{v}\times\mathbf{B} \right )

Para completar essa lei, temos que fornecer as fórmulas para \mathbf{E} e \mathbf{B} para uma dada circunstância: se um número de cargas está presente, \mathbf{E} e \mathbf{B} são a soma de contribuições das cargas individuais. Portanto, se pudermos determinar \mathbf{E} e \mathbf{B} produzidos por uma única carga, precisamos apenas somar todos os efeitos de todas as cargas do universo para obter \mathbf{E} e \mathbf{B } total! Esse é o princípio da superposição.

Qual é a fórmula para o campo elétrico e magnético produzido por uma carga individual? Acontece que isso é muiot coplicado, e é preciso muito estudo e sofisticação para apreciá-la. Mas isso não é o que interessa. Escrevemos a lei agora apenas para impressionar o leitor com a beleza da natureza, por assim dizer, ou seja, que é possível resumir todo conhecimento fundamental em uma única página, com a notação que já é familiar. A lei para os campos de uma carga individual é completa e precisa até onde sabemos (exceto pela mecânica quântica), mas parece um tanto complicada. Não estudaremos todas as partes agora; apenas a escrevemos para causar impressão, para mostrar que pode ser escrita, e para que possamos  ver de antemão aproximadamente como se parece. Na realidade, a maneira mais útil de escrever as leis corretas da eletricidade e magnetismo não é da maneira que agora as relatamos, mas envolve o que achamos de equações de campo. Porém a notação matemática para elas é diferente e nova e, portanto, escrevemos a lei em uma forma conveniente para os cálculos, mas na notação que já conhecemos.

O campo elétrico, \mathbf{E} , é dado por

eq

Já o campo magnético é dado por:

\mathbf{B} = -\mathbf{{e}_{r'}}\times \frac{\mathbf{E}}{c}

Escrevemos essas expressões apenas pelo propósito de mostrar a beleza da natureza, ou de um certo modo, o poder de síntese da matemática. Não pretendemos enterdor porquê é possível escrever tanto em tão pouco tempo, mas as equações acima contêm o mecanismo através do qual geradores elétricos funcionam, como a luz opera, e de todos os fenômenos de eletricidade e magnetismo. É claro que para completar a história, também precisamos conhecer alguma coisa sobre o comportament dos materiais envolvidos – as propriedades da matéria – que não são descritas apropriadamente por estas equações.

O que foi acrescentado no século XX é que as leis dinâmicas de Newton estavam todas erradas, sendo preciso introduzir a mecânica quântica para corrigí-las. As leis de Newton são válidas de uma maneira aproximada quando a escala das coisas é suficientemente grande. As leis da mecânica quântica, juntamente com as leis da eletricidade, foram apenas recentemente combinadas para formar um conjunto de leis denominados eletrodinâmica quântica. Além disso foram descobertos diversos novos fenômenos, entre eles o primeiro foi a radioatividade, descoberta por Becquerel em 1989 – que por pouco conseguiu encaixá-lo dentro do século XIX. O fenômeno da radioatividade resultou na produção do nosso conhecimento de núcleos e novos tipos de forças que não são gravitacional ou elétrica, mas novas partículas com diferentes interações, um assunto que ainda não foi totalmente esclarecido.

Para aqueles puristas que sabem mais (os professores universitários que por acaso estejam lendo isso), devemos acrescentar que quando dizemos que a equação do campo elétrico é uma expressão completa do conhecimento da eletrodinâmica, não estamos sendo completamente precisos. Existia ump roblema que não foi totalmente resolvido no final do século XIX. Quando tentamos calcular o campo devido a todas as cargas, incluindo a própria carga de prova sobre qual o campo atual, nos complicamos tentando encontrar a distância, por exemplo, da carga de si mesma, e dividir algo por essa distância, que é zero. O problema de como lidar com a parte do campo que é gerado por essa mesma carga na qual queremos que o campo atue ainda não foi resolvido até hoje. Portanto, deixemos como está; ainda não temos uma colução para o problema.

Fonte: O texto aqui reproduzido faz parte do livro Lições de Física, Volume I, capítulo 28 de Richard Feynman. Pequenas modificações foram realizadas.

Antenas inteligentes

fevereiro 20, 2009

Os sistemas de comunicações móveis convencionais funcionam com uma antena transmissora radiando o sinal em todas as direções, Figura 1. Uma das desvantagens desse sistema é o desperdício de potência: o sinal é transmitido mesmo para aquelas direções onde não existe nenhum terminal móvel para recebê-lo. Além disso, como o sinal é radiado para todas as direções, ainda pode causar interferências em outros terminais móveis.

figura1

A idéia principal do uso de antenas inteligentes é radiar o sinal somente nas direções desejadas, Figura 2. Assim, ocorre redução na potência transmitida, quando comparado ao sistema convencional. Antenas inteligentes permitem também o cancelamento de sinais indesejados e a redução dos efeitos multipercurso. Por outro lado, nessa configuração, o sistema poderá conhecer com maior precisão a localização do usuário, além de ser mais seguro, porque, para que seja violado, o intruso deverá estar localizado na mesma posição angular que o usuário.

figura2

Entre as desvantagens do uso de antenas inteligentes, pode-se citar a maior complexidade dos transceptores e o grande esforço computacional necessário para o cálculo das correntes de excitação de cada elemento do conjunto, o que onera o valor de uma estação base. O tamanho físico do conjunto de antenas também é uma desvantagem, visto que, quanto maior for o ganho desejado, maior será o número de elementos do conjunto.

Referência: Aplicações de antenas adaptativas em sistemas de comunicações móveis , Dissertação de mestrado

TV Digital Interativa

janeiro 1, 2009

Introdução

O objetivo deste documento é discorrer um pouco sobre a TV Digital Interativa (TVDI), falando sobre o estado da arte, estado atual, aplicações típicas da TVDI, middlewares, API para construção do software para TVDI entre outros.

O estado da arte em mídias interativas

O mais alto nível de interatividade é aquele em que o usuário (telespectador) se sente dentro da aplicação ao qual ele está submetido, por exemplo, vendo um filme sobre o reino animal marinho, o telespectador se sente dentro do mar, vendo a paisagem marinha e peixes a sua volta. É nesse nível de interatividade que estamos interessados neste documento, na interatividade em que o telespectador se sente dentro do mundo virtual.

A primeira características desses mundos virtuais é a noção de 3 dimensões. A noção de profundidade é originada a partir de algumas características da imagem, como a tonalização e o sombreamento.

Uma das formas de se obter imagens 3D é combinar duas imagens 2D (estereopsia). Atualmente já existem alguns dispositivos óptico-eletrônicos capazes de introduzir essa noção de 3D. Esses sistemas podem ser classificados em 3 grupos:

  1. Sistemas auto estereoscópicos: São sistemas em que o usuário não precisa de dispositivos especiais para obter o efeito de estereopsia.
  2. Sistemas estereoscópicos multiplexados em tempo: Sistemas em que um dispositivo realiza a separação do par de imagens estereoscópicas para cada olho do usuário.
  3. Sistemas estereoscópicos paralelos no tempo: São aqueles em que o par de imagens estereoscópicas são apresentados simultaneamente ao usuário que faz uso de óculos polarizadores para realizar a separação de imagens.

Uma outra forma de se obter imagens 3D é através da utilização de tecnologias de projeção de imagens.

Outra característica para se sentir imerso no mundo virtual é a interação táctil, ou seja, sentir o mundo virtual através do tato. Para fornecer o sentido do tato, os dispositivos atuais usam motores elétricos, pistões hidráulicos e bolsas pneumáticas, conseguindo sensação de toque e de força. Um avanço da pesquisa atual nessa área permite simular também a força de retorno entre a interação entre o objeto virtual e o usuário. Hoje já existem dispositivos que fazem isso, como o Phanton Desktop, um sistema utilizado para treinamento de transplante de medula óssea.

O estado da arte na TVDI

A TVDI foi concebida para ser interativa, mas o que significa essa interatividade?

A TV Digital não é uma simples televisão e muito menos um computador, ela é “algo” entre esses 2 termos. Ela é como se fosse uma televisão onde pequenos programas de computador possam rodar sobre ela. Esses programas rodam num sistema com poucos recursos, diferentemente do PC. A interatividade na TVDI significa simplesmente o retorno de pequenas informações por parte do usuário.

O que existe de mais avançado hoje em termos de interatividade na TV Digital é o uso de um canal de retorno permanente de alta velocidade, um teclado, um mouse e um controle remoto.

O canal de retorno é utilizado no envio de informações pelo usuário para o seu provedor de serviço, emissora, enfim, entre o usuário e o resto do mundo. Esse canal de retorno pode ser de qualquer tipo, um modem PSTN, cable modem, ADSL, Ethernet, qualquer coisa. O que importa é que a conexão deva suportar o protocolo TCP/IP.

Atualmente a entrada de informações pelo o usuário pode ser feita através de um controle remoto, teclado e mouse, porém nada impede que no futuro também sejam utilizados dispositivos táctis e óculos de visualização 3D (veja seção anterior).

O formato de vídeo utilizado é o MPEG-4.

O estado atual da TVDI

O canal de retorno nem sempre possui conexão 24 horas por dia e por isso a interatividade da TVDI pode ser classificada em 3 níveis:

  • Nível 1: Interatividade Local: A emissora transmite vários programas ou opções adicionais e o usuário pode escolher entre uma programação e outra ou habilitar/desabilitar as opções;
  • Nível 2: Retorno solicitado pelo provedor: Neste nível de interatividade o usuário pode apenas responder aos aplicativos enviados pelo provedor;
  • Nível 3: Acesso livro a Internet: O usuário pode navegar pela Internet e ter acesso a seus recursos.

Aplicações diferentes podem ser construídas baseadas nesses 3 níveis de interatividade.

Na seção anterior foi dito que a entrada de informações pelo usuário é feita através de controle remoto, teclado e mouse. Na prática quase não existe teclado e mouse e podemos contar somente com a existência do controle remoto. Aplicações diferentes também são construídas com base na presença ou ausência de cada um desses dispositivos.

O formato de vídeo utilizado é o MPEG-4 e a API JavaTV é utilizada na construção de softwares para a TVDI.

Aplicações

As aplicações para TVDI podem ser classificadas em três grupos básicos sendo estes o grupo de Entretenimento, TV-Comércio e Comunicação sendo os limites de definição destes três grupos bastante flexíveis pois uma mesma aplicação pode ser classificada em um ou mais destes grupos.

Dentre as aplicações para a área de entretenimento podem ser citadas o EPG (Electronic Program Guide), vídeo sob demanda (VOD), jogos em ambiente multiusuário, programas de auditório com jogos interativos, programas de esportes com participações do usuário, e outros.

Dentre as aplicações para a área de TV-comércio podem ser citados o sistema de compras, controle bancário, comerciais interativos e distribuição de música.

Dentre as aplicações para a área de comunicação podem ser citados o sistema de email, Internet e chat.

TV-Comércio

A TV interativa oferece grandes possibilidades no que se refere a área de marketing de forma a personalizar o conteúdo a ser oferecido combinando o mesmo com o perfil do usuário. Desta forma, os anúncios podem ser melhor direcionados a seu público alvo trazendo como feedback a  resposta dos usuários a estes anúncios.

De uma forma geral, anúncios para TV interativa encorajam os expectadores a acessarem conteúdos personalizados dispostos em pontos estratégicos na tela, de forma que quando acionados direcionam o usuário a um site, exibido em parte da tela da TV enquanto o comercial continua a ser executado em segundo plano. O site acionado traz informações adicionais sobre o produto que não estão disponíveis no comercial e podem oferecer aos consumidores a possibilidade de efetuar uma compra acionando o controle remoto.

EPG

EPG é um serviço básico da TVDI que inclui informações de conteúdo e horários para a programação disponível para TV, ou seja, é um Guia de Programação Eletrônico.

Tipicamente os EPGs são controlados e preparados por um provedor de serviços que faz a listagem e controla um canal dedicado de EPG que normalmente exibe a listagem de programação dos canais afiliados ao proprietário do canal EPG.

EPGs normalmente oferecem um mínimo de funcionalidade como sistema de busca e navegação dentre as opções disponíveis, exibição de informações detalhadas do programa selecionado,  filtragem de conteúdo com base  no gênero, etc.

Uma modalidade mais simplificada do EPG é a representada por mini-guias que correspondem a outra poderosa ferramenta de busca. Os mini-guias minimizam a interrupção da programação corrente enquanto oferece a funcionalidade de busca. Tipicamente um mini-guia é exibido na parte inferior da tela.

Video-sob-Demanda (VOD)

Com os serviços de vídeo sob demanda, os usuários podem escolher os programas que desejam assistir em qualquer momento. O sistema de VOD converte o receptor de TV interativa em um sistema de aluguel de vídeos. Com a disponibilidade de centenas de vídeos para seleção, a aplicação VOD está relacionada ao processo de busca, navegação e seleção dos vídeos as quais são realizadas através dos guias de VOD que se assemelham em linhas gerais ao EPG. O processo de seleção de um vídeo normalmente passa por quatro estágios:

  1. Procura: o usuário aciona uma página de pesquisa contendo um formulário que permite a especificação dos atributos do filme desejado. Uma forma comum é a utilização de palavras chaves onde as mais utilizadas podem inclusive estar pré-programadas através da combinação de teclas do controle remoto ou teclado.
  2. Pré-visualização: O usuário seleciona um filme e solicita a exibição da descrição e trailer do mesmo.
  3. Seleção: O usuário tem a opção de selecionar o vídeo pré-visualizado ou voltar para a tela anterior de busca. Se o vídeo é selecionado para exibição, uma sessão VOD é inicializada possivelmente seguida por uma tela de confirmação de transação, e o processo continua para o passo quatro.
  4. Exibição do vídeo: Finalmente o vídeo é exibido através de uma sessão VOD.

Guias VOD podem ser implementados via broadcast como através da Internet via provedor de serviços Internet sendo que esta última alternativa normalmente trará respostas mais lentas, mas por outro lado terá um custo reduzido em comparação com a primeira alternativa.

Jogos

O usuário acessa um canal dedicado de jogos onde é requisitado a entrar com um nome que identifica o perfil do usuário para jogos. Em seguida uma lista de jogos é apresentada onde os jogos são classificados como multiusuário ou um jogador somente. No índice de jogos, cada jogo pode possuir uma breve apresentação em forma de animação e texto. Quando for o caso, ao selecionar o jogo, pode ser dada ao usuário a possibilidade de retomar a um último estágio gravado do jogo. Da mesma forma, durante o jogo pode ser oferecida a opção de salvar o estágio atual.

Na finalização do jogo, o placar pode ser comparado com as maiores pontuações publicadas semanalmente. Em determinados casos, o usuário pode se juntar a um grupo de jogadores que competem com outro grupo. Caso a pontuação seja suficientemente alta, podem ser oferecidas ao usuário algumas bonificações, como por exemplo milhagens em programas de empresas aéreas, ou ainda a opção de salvar o estágio atual por uma pequena taxa.

Programas de auditório com jogos interativos

Shows com jogos interativos possuem inúmeras variações. Os mais desafiadores são aqueles que apresentam cenário de competições em tempo real entre os expectadores de um show. Por exemplo, no início de um show, o usuário seleciona a opção de participar do jogo sendo que se esta opção não for acionada, o show é exibido sem interatividade. Caso a opção de participação tenha sido acionada, em determinados momentos do show as perguntas serão apresentadas ao usuário participante o qual terá a opção de respondê-las o que, por sua vez, fará com que sua pontuação  aumente caso as respostas tenham sido escolhidas corretamente. Caso a pontuação do usuário seja suficiente, ele poderá ser recompensado com algum tipo de premiação. Dependendo das regras do jogo, quando aplicável, uma resposta incorreta pode suprimir questões subseqüentes até que uma nova sessão seja inicializada.

Programas musicais interativos

De forma geral, as aplicações interativas deste grupo serão realizadas offline através do uso de material armazenado onde o usuário pode, dentre outros, selecionar para exibição vídeos a partir de uma coleção de componentes de vídeos sincronizados, selecionar, a partir de determinados pontos estrategicamente posicionados na tela, outras câmeras que resultarão em novos ângulos de visão do show, apresentação de informações adicionais sobre o show e seus participantes, download de músicas ou amostras de músicas, etc. Em caso de shows musicais realizados ao vivo, a interação com o usuário não pode ser implementada de forma satisfatória.

Programas educacionais interativos

A área educacional abre inúmeras possibilidades em termos de interatividade com o usuário. As aplicações deste grupo oferecem várias possibilidades de intervenção do usuário que vai desde a escolha da linguagem de áudio dentre as disponíveis até o acionamento de opções dispostas como ícones ou texto em posições estratégicas na tela que quando selecionadas complementam o conteúdo exibido a partir de outros vídeos, textos, páginas web, etc.

Como exemplos de aplicações nesta área podemos citar documentários interativos, cursos on-line, testes de conhecimento on-line e tira-dúvidas on-line em forma de chat.

Canais de notícias interativos

Abaixo da tela de exibição do vídeo de notícia há a apresentação de texto adicional em forma de barra de texto rolante na qual, após ser clicada, abre uma ou mais telas sobrepostas ao vídeo, então em segundo plano, apresentando informações adicionais, vídeos, imagens, etc, a fim de complementar a notícia principal e/ou explicar o texto inicialmente apresentado abaixo do vídeo principal de notícias.

Canais de esportes interativos

Assim como nos programas de música interativos, o usuário tem acesso as opções dispostas na tela que depois de selecionadas permitem a escolha de exibição através de outras câmeras, informações adicionais sobre os jogadores, times e outros assuntos relacionados.

É possível ainda o processo de comercialização de produtos dos times relacionados através do acionamento das opções correspondentes.

Canais com informações de transportes

As aplicações deste grupo basicamente se encaixam em monitoração de horário de chegada e partida de vôos no aeroporto local ou outros aeroportos e serviços de apresentação de mapas e direções a partir de um endereço digitado ou de critérios especificados em uma página de busca.

Canais de comércio

As aplicações deste grupo podem ser usadas em conjunto com outros tipos de aplicação, como, por exemplo, a possibilidade de adquirir determinado produto a partir de um anúncio ou da exibição de um jogo em um canal de esporte interativo, bem como pode haver canais dedicados à comercialização de produtos de determinada empresa ou conjunto de empresas.

As aplicações para TV-comércio devem oferecer opções através do acionamento das quais o usuário possa obter informações adicionais sobre o produto em questão, informações sobre produtos similares de outras marcas e produtos correlacionados ao produto exibido.

Middlewares

Atualmente existem basicamente 3 padrões de TV Digital no mundo, o europeu (DVB), americano (ATSC) e japonês (ISDB). Cada um desses modeles especifica um middleware, que pode ser imaginado como sendo o contexto onde a aplicação é executada. Assim como existem 3 padrões, existem também basicamente 3 tipos de middleware: MHP (europeu), DASE (americano) e ARIB (japonês).

Para a criação de software para a TV Digital é utilizada a API JavaTV, que nada mais é que um conjunto de API da linguagem Java. Dessa forma, utilizar somente a API JavaTV para o desenvolvimento da aplicação garante que ela será portável entre todos os tipos de middleware. Entretanto, existem bibliotecas de terceiros que também são utilizadas, como por exemplo a biblioteca do pacote org.dvb.*, que são utilizadas para construção de aplicações exclusivas para o middleware MHP.

Na próxima seção falaremos um pouco de algumas APIs utilizadas para a construção de aplicações para a TV Digital, utilizando a API JavaTV e a API do pacote org.dvb.* e seus subpacotes. Lembre-se de que a aplicação que só utiliza a primeira dessas é portável entre todos os middlewares e as aplicações que utilizam a segunda só é executada no middleware MHP.

Programando para a TVDI – A API JAVATV

Na seção “Aplicações” descrevemos um conjunto de aplicações de exemplo para a TVDI. Nesta seção mostraremos pequenos trechos de códigos que podem ser utilizados para a construção de uma dessas aplicações.

Gerenciar o ciclo de vida da aplicação

Existem 2 tipos de aplicações MHP: DVB-HTML e DVB-J. A primeira é baseada em HTML e a segunda em Java. Aplicações DVD-HTML são ramentes utilizadas e por isso o foco nesse trabalho será nas aplicações DVB-J, que também são chamadas de Xlets.

O conceito dos Xlets é semelhante aos dos Applets, Servlets ou Midlets, ou seja, possui um ciclo de vida, gerenciado pelo container. Assim como o browser gerencia o ciclo de vida de um applet e um container web gerencia o ciclo de vida de um servlet, o middelware gerencia o ciclo de vida do Xlet. A partir desse momento, serão discutidos algumas tópicos relacionados a Java, caso o leitor não esteja familiarizado com essa linguagem, uma ótima referência é o livro Thinking in Java, disponível para download no site http://www.bruceeckel.com.

Em Java, um Xlet é todo objeto que implementa a interface javax.tv.xlet.Xlet. Essa interface define quatro métodos, exibidos na listagem 1. Cada método nessa interface tem um papel importante no gerenciamente do ciclo de vida do Xlet.

listagem1

Listagem 1 – javax.tv.xlet.Xlet

O clico de vida dos Xlets passa pelo seguinte fluxo:

  1. O Xlet é carregado (através do comando Class.forName()) e uma instância sua é criada usando o construtor default. Nesse ponto ele está no estado Loaded;
  2. Quando o usuário resolve iniciar a aplicação, o método initXlet() é chamado naquela instância carregada. O Xlet vai para o estado Paused. É passado para o método initXlet uma instância representa o contexto do Xlet, do tipo javax.tv.xlet.XletContext;
  3. Quando initXlet() retorna, o gerenciador de aplicações chama o método startXlet(). O Xlet move para o estado Started. É nesse estado que a interação com o usuário é realizada;
  4. Durante a execução da aplicação, o gerenciador de aplicativos pode chamar o método pauseXlet(), movendo a aplicação novamente para o estado Paused;
  5. Os passos 3 e 4 podem ser executados inúmeras vezes;
  6. O gerenciador de aplicativos pode chamar o método destroyXlet() movendo o Xlet para o estado Destroyed e liberando todos os seus recursos;

Esse é o ciclo de vida do Xlet, e todas as aplicações baseadas DVB-J seguem esse ciclo. Uma figura importante é o contexto do Xlet passado como parâmetro para o método XletContext. XletContext representa o contexto do Xlet (alguma semelhança com ServletContext?), e sua interface aparece na listagem 2.

listagem2Listagem 2 – javax.tv.xlet.XletContext

XletContext é utilizado pelo Xlet para obter informações sobre o seu ambiente e informar algumas coisas a respeito do seu ciclo de vida. Os métodos notifyDestroyed(), notifyPaused() permite ao Xlet notificar que ele está mudando para o estado Destroyed/Paused. O método resumeRequest() envia uma requisição pedindo que o Xlet volte para o estado Started. O método getXletProperty() é utilizado para obter algumas informações do ambiente, como por exemplo os parâmetros passados para a aplicação, ou o ID da organização da aplicação.

Embora seja uma forma de acessar propriedades do contexto do Xlet, XletContext não é a única forma de objter informações. O comando System.getProperties() ou System.getProperty() também pode ser utilizado, porém somente algumas propriedades são suportadas de acordo com a especificação:

  • file.separator;
  • path.separator;
  • line.separator;
  • dvb.persistent.root;

Nesse ponto deve ter ficado claro para o leitor os estados do ciclo de vida de um Xlet, quando o Xlet muda de estado e os métodos chamados no Xlet a cada mudança de estado.

Gerenciar recursos

Por mais simples que seja a aplicação, vários recursos podem ser utilizados, a quantidade de recursos de um middelware é baixa e por isso é necessário um esquema de gerenciamento de recursos. Algumas API’s da MHP são baseadas na API de notificação de recurso DAVIC contidas no pacote org.davic.resources. Essa API foi criada para ser utilizada com outras API’s.

A interface ResourceServer é implementada por uma classe na API. Ela é reponsável por gerenciar acessos a recursos escassos e gerenciar como esses recursos são alocados. Essa interface permite que uma aplicação se registre como um listener para eventos indicando mudança no status do recurso. Sua assinatura está na listagem 3.

listagem3Listagem 3 – org.davic.resources.ResourceServer

Assim como existe a interface ResourceServer, existe também a versão cliente, ResourceClient. Essa interface é implementada por uma classe da aplicação MHP, ela gerencia o uso do recurso pela aplicação. Por exemplo, quando o middelware precisa do recurso, ele notifica a aplicação através dessa classe. Sua listagem pode ser visualizada na listagem 4.

listagem4Listagem 4 – org.davic.resources.ResourceClient

Os três métodos dessa interface possuem a mesma utilidade, indicam uma requisição ao recurso, um pedido para que ele seja liberado pela aplicação:

  • requestRelease: O middelware pede o recurso a aplicação. Caso a aplicação libere o recurso, true é retornado, caso a aplicação não libere, é retornado false; A aplicação não é obrigada a liberar o recurso;
  • release: Se a aplicação resolve não liberar o recurso, o middleware pode exigir que o recurso seja liberado, chamando o método release;
  • notifyRelease: Caso o método release não retorne, como por exemplo, num loop infinito (código malicioso), o recurso é tomado da aplicação e notifyRelease é chamado, informando à aplicação que aquele recurso está sendo tomado.

Como podemos observar na listagem 4, ResourceProxy é passado como parâmetro para os métodos da interface. Um objeto do tipo ResourceProxy representa o acesso ao recurso. Por questões de segurança, um recurso não é acessado diretamente pela aplicação, e sim através de um proxy. O proxy é que tem acesso ao recurso.

Deve estar claro ao leitor a necessidade do middelware implementar um esquema de gerenciamento de recursos, afinal o middelware não é um PC e seus recursos são escassos.

Interface gráfica

Independente da aplicação, uma aplicação pra TV Digital deve no mínimo exibir alguma coisa na tela e por isso vamos descrever algumas partes sobre como a especificação MHP trata interfaces gráficas. A especificação MHP usa parte da AWT (API para desenhar interface gráfica de Java) e da API GUI da especificação HAVi.

Algumas considerações fazem da parte gráfica uma das partes mais complicadas da especificação MHP. Para desenhar na tela, várias coisas devem ser levadas em consideração, entre elas:

  1. Aspect Ratio: A TV pode ter relação de aspecto de 4:3, ou 16:9, e isso muda a forma como as coisas são desenhadas na tela;
  2. Transparência;
  3. Espaço de cores. Java usa RGB e o sinal de TV é baseado em crominância e luminância.
  4. Como converter entre um e outro?
  5. Não existe gerenciador de janelas;

A API para interface gráfica com usuário (GUI) da HAVi foi adotada pela DVB para o uso no MHP.

O display da TV digital pode ser dividido em 3 camadas:

  1. Camada de fundo (Background Layer): Exibe um fundo fixo, com uma cor ou uma imagem estática;
  2. Camada de vídeo (Video Layer): Camada onde o vídeo é exibido. É exibido em cima da camada de fundo;
  3. Camada de gráficos (Graphics Layer): É a última camada, onde as aplicações gráficas em MHP trabalham.

A API para manipulação gráfica da HAVi define uma classe HScreen para representar o dispositivo gráfico. Existe somente uma instância dessa classe pra cada dispositivo gráfico.Cada HScreen tem um conjunto de HScreenDevice, que representa as camadas do display. Como existem 3 camadas, existem também 3 subclasses de HScreenDevice:

  1. HBackgroundDevice: Representa a camada de fundo;
  2. HVideoDevice: Representa a camada de video;
  3. HGraphicsDevice: Representa a camada de gráficos.

Para obter informações a respeito dessas camadas, é necessário o uso de uma outra classe, HScreen, definida na listagem 5. HScreen representa o dispositivo físico, a tela, e só existe uma instância de HScreen por dispositivo.

Como podemos observar, a classe HScreen fornece métodos getter para a camada padrão de fundo, vídeo e de gráficos. Além disso, HScreen fornece métodos getter também para as outras possíveis classes do tipo HScreen que possam existir (caso tenha mais de um dispositivo de tela).

Ainda na listagem 5, podemos observar a existência de métodos getter para HVideoDevice e HGraphicsDevice onde o retorno é um array desses objetos. Isso é porque, diferentemente de HBackgroundDevice, podem existir vários devices desses outros tipos. Por exemplo, durante um jogo de futebol podemos ter um HVideoDevice principal mostrando o jogo e um HVideoDevice secundário mostrando o jogo sob um outro ângulo, no canto da tela. Nesse caso, teríamos 2 HVideoDevice. Em relação a HGraphicsDevice, pode existir um HGraphicsDevice para cada camada (se isso for suportado), e nesse caso também podem existem inúmeras instâncias de HGraphicsDevice.

listagem5Listagem 5 – org.havi.ui.Hscreen

Cada camada pode ser configurada separadamente, usando a própria classe HBackgroundDevice, HGraphicsDevice e HVideoDevice. Para isso, é definido uma outra classe HScreenConfiguration. É claro que HScreenConfiguration possui subclasses personalizadas para cada tipo de device (background: HBackgroundConfiguration, video: HVideoConfiguration, graphics: HGraphicsConfiguration).

Quando se faz um programa desktop para PC e usamos AWT, a classe de janela extende a classe Frame. Em aplicações MHP isso não é mais possível, pois no set-top-box não podemos contar com o mesmo gerenciador de janelas implementado é igual ao do PC, principalmente pela quantidade de recursos disponíveis. Sendo assim, é necessário definir outra forma de criar janelas, e por isso foi definida a classe HScense.

Como não podemos contar com um gerenciador de janelas, não podemos criar uma aplicação com mais de um HScense (janela) por dispositivo (HScreen). Outra diferença para o Frame é o mode de criar o HScense. Para criar um HScense, é usada uma factory, HScenseFactory. Para isso, é passado como parâmetro para a factory um objeto do tipo HScenseTemplate, que representa a configuração da tela que o usuário deseja. A listagem 6 e 7 exibe a assinatura das classes HScenseFactory e HScenseTemplate.

Como podemos observar na listagem 6, HsceneFactory também é um Singleton, e por isso não pode ser instanciado diretamente. Para ter acesso ao objeto é necessário chamar o método  HSceneFactory.getInstance().

listagem6Listagem 6 – org.havi.ui.HSceneFactory

listagem7Listagem 7 – org.havi.ui.HSceneTemplate

Player MPEG (Áudio e Vídeo)

A parte mais importante para um TV Digital é o player MPEG, pois sem ele não é possível exibir áudio e vídeo. O Framework escolhido para tocar mídia foi o Java Media Framework (JMF) versão 1.1. Logo, para entender como o MHP trabalha com mídias, é necessário entender o Java Media Framework. JMP possui os conceitos de Player, Control e DataSources:

  • Player: Faz a decodificação da mídia e toca;
  • Control: Adiciona funcionalidades a Player (design pattern Decorator),como por exemplo congelar a imagem.
  • DataSources: Representa a mídia. Um Player não pode ser criado sem um DataSource;

O ponto de partida para a criação de uma aplicação que usa JMF é o uso da classe Manager, definida na listagem 8.

listagem8Listagem 8 –  javax.media.Manager

Como podemos observar na listagem 8, existem  métodos estáticos na classe Manager que possibilita a criação de DataSource (createDataSource()) e Player (createPlayer()). A idéia é criar um DataSource, que aponta para os dados, e aí sim criar o Player, que está vinculado àquele DataSource. Por serem classes importantes, DataSource aparece na listagem 9 e Player aparece na listagem 10.

listagem9Listagem 9 – javax.media.DataSource

A classe DataSource é bem simples, basicamente ela fornece métodos para conectar o DataSource a sua fonte de dados (connect()), saber que tipo de dados é aquela fonte (getContentType()), iniciar (start()) e parar (stop()) a transferência daqueles dados, e, quando não for mais necessário o uso do DataSource, se desconectar da fonte (disconnect()).

A interface Player já é mais complicada, a listagem 10 mostra parte da interface. Como podemos observar nessa listagem, a implementação de Player perrmite alterar a fonte de dados (setSource() – Obs.: Na implementação MHP, não se usa esse método para trocar a fonte de dados).

Um objeto do tipo Player possui estados. Quando o Player é criado, ele está no estado Unrealized. Se o método realized() é chamados, o Player vai para o estado Realized. Isso dá ao Player a possibilidade de carregar todos os recursos que ele necessita para efetivamente tocar a mídia. O método prefetch() move o Player para o estado Prefetch. Nesse estado, é garantido que todos os recursos foram carregados e que o Player já pode tocar a mídia. O último estado de Player é Started, que é quando o método start() é chamado. Nesse estado, a mídia é tocada. No estado Started, Player pode voltar para o estado Prefetch ou Realized se for chamado o método stop(). Qual o estado será chamado dependerá do tipo de mídia que está sendo tocada. O método deallocate() desaloca recursos escassos e volta o estado para Realized, caso o estado seja Realized, Prefetch ou Started, ou volta para o estado Unrealized, caso ele ainda esteja na transição de Unrealized para Realized.

O método  addControllerListener() permite que eventos sejam registrados na classe Player. Dessa forma, quando houver alguma mudança no estado de Player, a aplicação será notificada através desses eventos. Existem eventos para notificar mudanças no estado de Player, notificar problemas com a conexão com o DataSource, saber da situação dos recursos escassos, entre outros.

listagem10Listagem 10 –  javax.media.Player

É importante observar que fazer uma aplicação que utiliza JMF no desktop é diferente do que fazer uma aplicação que utiliza JMF na TV Digital. Apesar da similaridade no modo de programar, existem várias diferenças, pois o que funciona de um jeito no aplicativo desktop, pode não funcionar num ambiente de broadcast. Algumas vezes o problema pode ser resolvido com a classe Control, que adiciona funcionalidades ao Player.

No MHP, o vídeo é recebido no formato MPEG, que nada mais é do que uma sequência de quadros comprimidos. MHP decodifica essa sequência de quadros e exibe o filme na camada de vídeo ou na camada de gráficos (veja seção 2.3). Para isso, existem 2 tipo de Players na JMF, uma para exibição do vídeo na camada de vídeo e outro que exibe um vídeo num compoente AWT na camada de gráficos. A primeira opção deve sempre ser suportado, a última não. A figura 1 mostra como fica o esquema das camadas nesse caso. As 3 camadas (Background, Video e Graphics) continuam normalmente, e um componente AWT é criado em cima da camada Graphics, com um vídeo rodando dentro desse componente. Quando o componente é movido, ao tem seu tamanho alterado, o vídeo também é movido ou tem o seu tamanho alterado.

figura11Figura 1 – Componente AWT rodando vídeo MPEG

Canal de retorno

Como já foi dito na seção “O estado da arte na TVDI”, o canal de retorno é a forma utilizada para a aplicação se comunicar com o mundo externo. Essa comunicação pode ser feita através de um modem, ADSL, ou qualquer outra forma, a única exigência é que ela suporte TCP/IP.

Para o programador, conectar com o mundo significa usar a API java.net, que assim como a AWT e JMF, tem algumas restrições no seu uso quando utilizada junto com MHP. A principal diferença é que java.net supõe que exista uma conexão permanente com a Internet, o que não é verdade no caso da TV Digital. Para suprir essa diferença, é necessário o uso de uma outra API, definida no pacote org.dvb.net.rc.

O canal de retorno é representado pela classe RCInterface (note que apesar da existência da palavra interface no nome, RCInterface é uma classe!), que possui uma subclasse, ConnectionRCInterface, que representa um canal de retorno que não está permanentemente conectado. A classe ConnectionRCInterface aparece na listagem 11.

Como podemos observar na listagem 11, ConnectionRCInterface possui métodos para controlar a conexão do canal de retorno (isConnected(), connect(), disconnect(), getConnectedTime()), setar os parâmetros de inicialização da conexão (setTarget()), controlar os eventos que ocorrem na conexão através de notificações (addConnectionListener(), removeConnectionListener()) entre outros métodos.

Ainda pela listagem 11, podemos observar que ele implementa a interface ResourceProxy, ou seja, ConnectionRCInterface representa também um recurso escasso, e toda a discussão da seção 2.2 se aplica também a ConnectionRCInterface. Por ser um recurso escasso, o acesso a ele é gerenciado através de uma outra classe, RCInterfaceManager. A listagem 12 mostra um exemplo de como obter o canal de retorno.

listagem11Listagem 11 –  org.dvb.net.rc.ConnectionRCInterface

listagem12Listagem 12 – Obtendo o canal de retorno

A listagem 12 mostrou como obter o canal de retorno. Além disso, é necessário fazer a conexão com o canal de retorno (lembre que a conexão não é permante!). Para isso é necessário informar onde o canal de retorno deve conectar (método setTarget()) e depois chamar o método connect(). A listagem 13 exemplifica o processo.

listagem13Listagem 13 – Estabelecendo uma conexão com o canal de retorno

É importante resaltar que a listagem 13 deve estar envolvida num bloco try-catch, pois a exceção PermissionDeniedException pode ser lançada na tentativa de conexão.

Múltiplos serviços

A primeira questão a ser tratada aqui é que agora o middleware possui duas aplicações. Como passar de uma para a outra? Aqui entra em cena a API de seleção de serviços da JavaTV. Nesse caso, selecionar um serviço pra ser executado pode matar a execução do outro serviço que estava rodando. Na terminologia da API JavaTV, um serviço é um conjunto de áudio e/ou vídeo e/ou aplicações que agrupadas formam uma entidade (que juntas fazem algum sentido).

A idéia de uma aplicação matar a outra é a seguinte. Podem existir vários contextos de serviços rodando, mas em cada um deles só pode ser rodado um serviço de cada vez. Quando a aplicação vai ser executada, ela deve rodar em cima de algum contexto. Se já existir uma aplicação rodando nesse contexto, ela será destruída para que a outra possa ser executada.

Deve ser ressaltado aqui que a API de seleção de serviços deve ser utilizada quando estamos em um serviço e queremos carregar um outro. No nosso exemplo de aplicações, estávamos no serviço Fale Conosco. Nesse serviço, poderia existir um botão que abriria um novo serviço (uma espécie de hyperlink), a declaração de isento do imposto de renda. Nesse caso, estamos abrindo uma nova aplicação, e a API de seleção de serviços deve ser utilizada. Se o que tivesse que ser feito fosse na verdade trocar o vídeo que estava sendo exibido na aplicação, isso poderia ser feito com a JMF, e não seria necessário usar a API de seleção de serviços.

listagem14Listagem 14 – Selecionando um novo serviço

A API possui duas interfaces principais, Service e ServiceContext. Com uma instância de ServiceContext, podemos rodar uma aplicação (Service). Para obter um ServiceContext ou criar um novo, é utilizada a classe ServletContextFactory, que como o próprio nome diz, é um fábrica de objetos do tipo ServletContext. Além de implementar o design pattern Factory, ServletContextFactory também implementa o design pattern Singleton.

A listagem 14 mostra passo a passo como obter um ServletContext e adicionar um serviço a ele.

Observação

Esse trabalho foi feito já tem um tempo (entre 3 e 4 anos). Muita coisa aqui pode estar defasada (e provavelmente está), mas é um ponto de partida para um estudo sobre o assunto. Todas as informações disponíveis aqui foram coletadas na Internet.