quarta-feira, 30 de junho de 2010

Introdução a NCL e Lua: Desenvolvendo Aplicações Interativas para TV Digital

Escrito por Ramon Rosa e Vagner Oliveira


Resumo. A televisão é um dos maiores meios de comunicação do mundo, como também é uma grande fonte de informação, entretenimento e cultura. Além dos benefícios trazidos com a qualidade de som e imagem, a TV possibilita inúmeras facilidades e oportunidades para os programas de televisão. Os telespectadores poderão ter acesso a jogos e programas interativos, ou seja, o usuário deixará de ser um mero espectador e passará a interagir com a programação, moldando o conteúdo de acordo com a sua escolha. Este artigo traz um estudo sobre o as linguagens NCL (Nested Context Language) e Lua e um estudo de caso com a implementação de uma aplicação interativa para TV Digital.
Palavras-chave: televisão digital interativa, NCL, Lua.
1. Introdução
A televisão é um dos maiores meios de comunicação do mundo, como também é uma grande fonte de informação, entretenimento e cultura. Em 2006, o governo brasileiro criou o SBTVD (Sistema Brasileiro de Televisão Digital), baseado no padrão japonês. O SBTVD inovou no seu middleware, o Ginga, que consiste de máquinas de execução das linguagens oferecidas, e bibliotecas de funções, que permitem o desenvolvimento rápido e fácil de aplicações.
    O Ginga é fruto do desenvolvimento de projetos coordenados pelos laboratórios Telemídia da PUC-Rio (Pontifícia Universidade Católica do Rio de Janeiro) e LAViD da UFPB (Universidade Federal da Paraíba). O nome Ginga foi escolhido em reconhecimento à cultura, arte e contínua luta por liberdade e igualdade do povo brasileiro.
    Uma aplicação de TV Digital pode ser declarativa, procedural ou híbrida. A seguir esses conceitos são apresentados:
Linguagens Declarativas – são mais intuitivas (de mais alto nível), mais fáceis de usar e, normalmente, não exigem um perito em programação. Enfatiza a declaração descritiva de um problema, sem se preocupar como realmente implementará essas tarefas.
Linguagens Procedurais – são mais complexas e usualmente requer um perito em programação. O programador deve informar ao computador cada passo a ser executada, ou seja, deve implementar uma solução algorítmica. No entanto, o programador possui um maior controle do código.
Aplicações Híbridas – conjunto de entidades possui tanto conteúdo do tipo declarativo quanto procedural. Frequentemente fazem uso de scripts, cujo conteúdo é de natureza procedural.
    A seção a seguir descreve a linguagem Lua que pode ser inserida em documentos NCL, trazendo poder computacional adicional às aplicações declarativas.
2. Linguagem Lua
Lua é uma linguagem de programação em script criada em 1993, em um laboratório de pesquisa da PUC-Rio. É muito parecida com outras linguagens como Python, PHP, Ruby, ShellScript.
    Lua destaca-se pelo seu tamanho pequeno, seu núcleo é inferior a 200k, sua rapidez na execução, analistas informam que é a linguagem mais rápida das interpretadas com tipagem dinâmica, simplicidade, tem a programação simples em conformidade com as demais linguagens, portabilidade, Lua é feita com a junção de C ANSI com C++ ANSI.
    Lua é a única linguagem a ser utilizada em todo mundo, que foi desenvolvida fora dos EUA, Europa e Japão.
    Atualmente a linguagem Lua está sendo utilizada principalmente para o desenvolvimento de jogos como World of Warcraft, The Sims e Sim City, e  aplicações para TV digital interativa.
2.1 Executando lua
Um trecho de código lua pode ser entrado no modo interativo (diretamente no console lua), pode ser escrito em  um arquivo com extensão “lua” e executado pelo interpretador ou compilado e depois executado pelo interpretador.
2.1.1 Modo interativo
Para executar trechos de código do lua em modo interativo deve-se primeiro chamar o interpretador da linguagem com o comando lua no terminal, exemplo:
    $ lua
    Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio

    >
Com o interpretador lua em execução você pode entrar com comandos de acordo com a sintaxe da linguagem, e após teclar “enter” serão executados pelo interpretador lua, exemplo:
    $ lua
    Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio

    > varA = 'Hello'

    > varB = 'World'

    > print(varA .. ' ' .. varB)

    Hello World

    >

    Como podemos constatar o interpretador define dinamicamente o tipo das variáveis (varA e varB) , e ao chamar o método print ele o interpretador executa e informa a saída no console.
2.1.2 Executando arquivo pelo interpretador
Podemos executar trechos de código lua através de arquivos para isto basta criar um arquivo contendo o código e depois chamar o interpretador com o nome do arquivo como parâmetro, por exemplo:
    $ nano hello.lua
    varA='Hello '

    varB='World'

    print(varA .. varB)
    $ lua hello.lua
    Hello World

    $
    Neste caso o arquivo é compilado e depois executado.
2.1.3 Compilando e executando
Uma maneira mais eficaz de se executar trechos lua é compilando e depois executando o arquivo que contem o trecho, por exemplo:
    $ nano hello.lua
    varA='Hello '

    varB='World'

    print(varA .. varB)
    $ luac hello.lua
    $ ls *.out

    luac.out

    $ lua luac.out

    Hello World

    $
    Neste caso sua execução é mais eficaz pois o arquivo já está compilado pele luac quando o arquivo é executado não existe a necessidade de um pre compilamento.   
3. Linguagem NCL
NCL (Nested Context Languagem), Linguagem de Contextos Aninhados, é uma linguagem baseada em XML, destinada à criação de documentos hipermídia e utilizada para reunir objetos de mídia em uma apresentação multimídia. Estes objetos de mídia podem ser de qualquer tipo, aúdio, vídeo, documento HTML ou mesmo um objeto procedural.
3.1 Estrutura de um documento NCL
Todo o conteúdo de um documento NCL é definido dentro do elemento <ncl> sendo sua estrutura dividida em duas grandes partes, o cabeçalho e o corpo do documento. A figura 1 demonstra a estrutura de um documento NCL.

Figura 1


Figura 1. Estrutura de um documento NCL
    No cabeçalho são definidas as características de apresentação do documento, através das regiões e descritores, os relacionamentos que serão utilizados para a sincronização dos nós, através dos conectores, entre outras facilidades.
    No corpo definimos os elementos e a sincronização entre eles. Além da definição dos nós e elos, o corpo de um documento NCL pode também definir composições para melhorar sua estrutura e organização.
4. Integração NCL-Lua
O ambiente Ginga-NCL permite o uso de Lua dentro de aplicações NCL. Dessa forma, o poder de uma linguagem declarativa é elevado quando integrada com uma linguagem procedural. A aplicação passa a ter acesso a recursos computacionais genéricos, ou seja,  qualquer tipo de recurso que necessite estrutura de dados e algorítmicos, tais como cálculos, interação com a interface gráfica, entrada de dados por parte do telespectador,  etc.
    Esta seção descreve como é feita essa integração, a qual permite um aumento do potencial dos programas para a televisão digital.
4.1. Scripts NCLua
Os scripts NCLua usam a mesma abstração para objetos de mídia utilizada para imagens, vídeos e outras mídias. Esses scripts seguem sintaxe idêntica à de Lua e possuem um conjunto de biblioteca similar. Ou seja, a linguagem Lua possui adaptações para funcionar embutida em documentos NCL.
    O arquivo Lua deve ser escrito em uma arquivo (com extensão .lua) separado do documento NCL, que apenas o referencia como qualquer outro nó de mídia. O ciclo de vida do script é controlado pelo documento NCL que o referencia, ou seja, o NCL determina quando o programa Lua inicia.
    As bibliotecas disponíveis são divididas em quatro módulos essenciais:
Módulo event – permite a comunicação do NCLua com o formatador NCL através de eventos.
Módulo canvas – oferece uma API para desenhar primitivas gráficas e imagens.
Módulo settings – exporta a tabela settings com variáveis definidas pelo autor do documento NCL e variáveis de ambiente reservadas.
Módulo persistent – oferece uma API para exportar a tabela persistent com variáveis definidas em uma área reservada, restrita do middleware.
    A seção a seguir  propõe um estudo de caso com a implementação de uma aplicação interativa para TV Digital.
5. Aplicação proposta
A aplicação proposta informa o valor do salário líquido após o usuário fornecer o salário bruto através do controle remoto. A aplicação desconta a porcentagem de INSS conforme o valor informado.
    O objetivo é demonstrar um pouco da capacidade e interatividade das aplicações de TV Digital. A seguir é descrito o comportamento esperado:
Um campo de entrada e outro de saída são exibidos na tela.
O usuário preenche o campo de entrada.
Quando o usuário aperta a tecla ENTER, o valor do salário líquido é exibido no campo de saída.

5.1 Principais trechos da aplicação
Para execução correta da aplicação, alguns comandos são necessários, como o mapeamento do controle remoto da televisão:
    local MAP = {
['1'] = { '1', '.', ',' }

    ,['2']={'a','b','c','2'}
,['3']= 'd','e','f','3'}

    ,['4']={'g','h','i','4'}
,['5']={'j','k','l','5'}

    ,['6']={'m','n','o','6'}    ,['7']={'p','q','r','s','7'}

    ,['8']={'t','u','v','8'}    ,['9']={'w','x','y','z','9'}

    , ['0'] = { '0' }
}

    Função que calcula o salário:
    function calcula_salario(var)

        if var <= 1024.97 then

            return var - (var * 0.08)

        elseif var >= 1024.98 and var <= 1708.27 then

            return var - (var * 0.09)

        else

            return var - (var * 0.11)

        end   

    end

    Corpo da arquivo NCL da apresentação:

<body>

<port id="entryPoint" component="input"/>

<media type="application/x-ginga-settings" id="programSettings">

<property name="service.currentKeyMaster" value="inputIdx"/>
</media>

<media id="input" src="input.lua"  descriptor="dsInput">

<area id="select"/>

<property name="text"/>

</media>


<media id="output2" src="output.lua" descriptor="dsOutput2">

<property name="text"/>

</media>


<link xconnector="onBeginStart">

<bind role="onBegin" component="input"/>

<bind role="start"   component="output2"/>

</link>


<link xconnector="onBeginSet">

<bind role="onBegin" component="input" interface="select"/>

<bind role="set" component="output2" interface="text">

<bindParam name="var" value="$get"/>

</bind>

<bind role="get" component="input" interface="text"/>

</link>

</body>


Referências

http://www.lua.org/
http://www.ncl.org.br/
http://www.ginga.org.br/
http://www.gingancl.org.br/
http://www.gingadf.com/blogGinga/?tag=ginga-ncl
http://www.peta5.com.br/
http://www.telemidia.puc-rio.br/~francisco/nclua/

segunda-feira, 21 de junho de 2010

Exemplo processo BPMN Pedido de Férias (Com jbpm)



<?xml version="1.0" encoding="UTF-8"?>
<definitions id="Pedido de Férias-id"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schema.omg.org/spec/BPMN/2.0 ../../../../../../../../../../bpmn/src/main/resources/BPMN20.xsd" xmlns="http://schema.omg.org/spec/BPMN/2.0" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://jbpm.org/example/bpmn2/vacation_request" xmlns:jbpm="http://jbpm.org/bpmn2">  <process id="Pedido de Férias" name="Pedido de Férias">
<startEvent id="startNode" />
<userTask id="Formulário  de Pedido de Férias" name="Formulário  de Pedido de Férias" implementation="other"> <potentialOwner resourceRef="user">
<resourceAssignmentExpression>
<formalExpression>Usuario.Usuario</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
<rendering id="pedido-ferias.html-form">
<jbpm:form>pedido-ferias.html</jbpm:form>
</rendering>
</userTask>
<userTask id="Verificar Pedido de Férias" name="Verificar Pedido de Férias" implementation="other">
<potentialOwner resourceRef="user">
<resourceAssignmentExpression>
<formalExpression>Usuario.Usuario</formalExpression>
</resourceAssignmentExpression>
</potentialOwner>
<rendering id="verifica-pedido-ferias.html-form">
<jbpm:form>verifica-pedido-ferias.html</jbpm:form>
</rendering>
</userTask>
<endEvent id="node-aceitar-ferias-id" name="node-aceitar-ferias-name" />
<endEvent id="node-recusar-ferias-id" name="node-aceitar-ferias-id" />
<sequenceFlow id="startFlow" name="startToFistNode"
    sourceRef="startNode" targetRef="Formulário  de Pedido de Férias" />
<sequenceFlow id="Pedir Férias" name="Pedir Férias"
    sourceRef="Formulário  de Pedido de Férias" targetRef="Verificar Pedido de Férias" >
<conditionExpression xsi:type="tFormalExpression">${jbpm_outcome == 'Pedir Férias'}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="Aceitar Férias" name="Aceitar Férias"
    sourceRef="Verificar Pedido de Férias" targetRef="node-aceitar-ferias-id" >
<conditionExpression xsi:type="tFormalExpression">${jbpm_outcome == 'Aceitar Férias'}</conditionExpression>
</sequenceFlow>
<sequenceFlow id="Recusar Férias" name="Recusar Férias"
    sourceRef="Verificar Pedido de Férias" targetRef="node-recusar-ferias-id" >
<conditionExpression xsi:type="tFormalExpression">${jbpm_outcome == 'Recusar Férias'}</conditionExpression>
</sequenceFlow>
</process>
</definitions>


Formulários:

Formulário de Pedido de Férias

<h1>Pedido de férias</h1>
<h2>Aqui você faz seu pedido de férias</h2>
<table border="0">
<tbody>
<tr><td>Usuário Pedido de Férias: </td>
<td><input id="usuarioPedidoFerias" name="usuarioPedidoFerias" type="hidden" value="#{userLogin}" />
    #{userLogin}
</td></tr>
<tr><td>Dias de férias: </td>
<td><input id="diasFerias" name="diasFerias" type="text" value="${diasFerias}" /></td>
</tr>
</tbody>
</table>


Formulário de Verificação de Férias

<h1>Verificação de pedido de férias</h1>
<h2>Dados do pedido de férias:</h2>
<table border="0">
<tbody><tr><td>Usuário: : </td>
<td><input id="usuarioPedidoFerias" name="usuarioPedidoFerias" type="hidden" value="${usuarioPedidoFerias}" />
${usuarioPedidoFerias}</td>
</tr><tr><td>Quantidade de  dias: </td><td><input id="diasFerias" name="diasFerias" type="hidden" value="${diasFerias}" />${diasFerias}</td></tr>
</tbody>
</table>

terça-feira, 8 de dezembro de 2009

Web Services, computação descentralizada para sistemas distribuídos, por Ramon Rosa da Silva

Resumo. O crescimento dos serviços disponibilizados na internet tornou necessário uma padronização de protocolos para troca de informações.

Para a interoperabilidade dos serviços desenvolvidos em diferentes arquiteturas, sistemas operacionais e linguagens, mais do que nunca é ressaltada a importância de padrões como XML (eXtensible Markup Language) e HTTP (Hypertext Transfer Protocol).

Com ajuda destes padrões Web Services podem resolver problemas de comunicação entre diferentes aplicações, e disponibilizar serviços que podem ser utilizados por vários clientes sem necessidade de reconfiguração do servidor, isto é reutilização de serviços.

1.Introdução

Na década de 60 a computação era baseada em grandes mainframes e terminais burros, isto é computação centralizada, existia pouca ou nenhuma preocupação com padronização de protocolos de comunicação, cada fabricante propunha sua própria especificação de seus produtos que não eram compatíveis com os produtos concorrentes. Muito rápido isso se tornou um problema para os clientes, que passava a ser também um problema aos fabricantes, foi neste contexto que sugiu a ISO, que propôs um modelo de arquitetura dividido em 7 camadas (famosa até hoje, arquitetura OSI).

Conforme foi sendo popularizado os computadores desktop e com a abertura da internet (por HTTP), a computação centralizada foi perdendo espaço, um novo modelo de computadores pessoais que operam sem necessidade de mainframes, que se comunicam pelo protocolo TCP/IP baseado no modelo OSI, assim iniciou a computação descentralizada.

A descentralização possibilitou o surgimento de serviços disponibilizados na web, os Web Services, e novos padrões foram criados para o desenvolvimento de aplicações distribuídas, como CORBA (Commom Object Request Broker Architeture), DCOM da Microsoft entre outros. Em meados da década de 90 existiam vários padrões que criavam um forte acoplamento entre os sistemas, e se tornava complicado diferentes sistemas interagirem entre si.

Mais uma vez foi necessário uma reformulação do modo de diferentes serviços se comunicarem, para este fim foi criada a XML, linguagem/padrão de troca de informações.

Atualmente as empresas se esforçam para aperfeiçoamento de padrões como XML e HTTP, com linguagens como Java e PHP, que permitem a criação de sistemas independentes de arquiteturas e plataformas. Essas tecnologias são utilizadas tanto com os novos padrões quanto antigos em sistemas legados.

2.Padrão Web Service

O padrão do Web Service é padronizado pela W3C, com: “um sistema de software projectado para suportar a interoperabilidade entre máquinas sobre rede”.

Essas interoperabilidade é garantida pelo seu padrão de comunicação baseado em XML encapsulado em SOAP.

3.XML

Atualmente de facto XML é a linguagem padrão para comunicação entre serviços com serviços, e serviços com clientes.


Fig. 1: Comunicação entre os serviços.

A linguagem XML é muito similar a HTML (Hyper Text Model Linguage), é escrita com tags com uma identificação e dados dentro das tags, podem existir tags dentro de tags. Por exemplo:

Fig. 2: Exemplo XML

O XML trafega pela rede dentro de um pacote HTTP ou HTTPS para conexões seguras, que é desempacotado pelo servidor.

4.SOAP

Simple Object Access Protocol, trás a mesma ideia do RPC (Remote Procedure Call) para XML, atualmente é um especificação da W3C.

É um protocolo baseado em XML para comunicação entre aplicações HTTP.

RCP não é recomendado para internet pois teria problemas com segurança e com firewalls ou proxyes.

Mensagens SOAP, são dividas em 3 partes:

SOAP envelope: Define o conteúdo da mensagem.

SOAP header: Contém a autenticação, transação e contabilização, é opcional.

SOAP body: informações dos métodos e parâmetros que serão utilizados.



Fig. 3: Exemplo mensagem SOAP

5.Web Services

Web Services são aplicações publicadas na web, desde simples processos como cálculos até complexas transações de empresariais, depois de publicados permitem obtenção e submissão de dados.

São acessados de forma independente de plataforma ou linguagem de programação, utilizando padrões como HTTP, XML e SOAP. Seus serviços são conhecidos através de uma mensagem padrão XML.

Um Web Service é feito para suportar 3 categorias: provedor do serviço, provedor de registro e o cliente do serviço. Com operações de procura (find), publicação (publish) e acoplamento (bind).

O cliente procura o serviço, e obtém a descrição do serviço e do provedor de registro, com essas informações ele pode acessar e interagir (bind) com o provedor do serviço.



Fig. 3: Ciclo de vida de um Web Service


5.1.WSDL

Web Services Description Language, linguagem XML, desenvolvida para descrever o Web Services, o que o serviços faz, como utiliza-lo e onde ele está localizado.


Contém o elemento "definition" dividido em:
"message" e "portType" : define quais operações o serviço fornece.
"type" : este elemento opcional serve para definir tipos de dados estruturados .
"binding" : designa como as operações são invocadas.
"service" : explicita onde o serviço está localizado.


5.2.UDDI

Universal Description Discovery and Integration, é um conjunto de registros baseados na web que provem informações a respeito de uma entidade ou organização, podem ser utilizadas por qualquer um que queira tornar disponível ou queira obter informações a respeito de negócios ou entidades.

São encontrados 4 tipos de UDDI:

BusinessService: pode conter informações sobre uma ou mais organizações.

BusinessEntity: informações técnicas e de descrições de serviços.

BindingTemplate : contem referencias a um ou mais tModels

tModel: definições de especificações técnicas de serviços.

Uma UDDI é similar a uma lista telefônica. Páginas brancas (white pages), contém informações como nome da organização, contato e identificadores. As páginas amarelas (yellow pages) um índice de serviços e produtos e as páginas verdes (green pages) contém informações a respeito de transações, descrições de serviço e invocação de aplicações.

6.Segurança

Atualmente a segurança é uma das questões mais criticas em um Web Service, não existe falta de tecnologia para segurança, mas um falta de consenso para escolha desta tecnologia.

Existe uma grande preocupação de separar bancos de dados importantes das empresas com os Web Services para maior segurança.

Principais mecanismos de segurança são: SSL, XML signature, XML encryption, WS-security e SAML.

6.1.SSL

Secure Socket Layer, desenvolvido para pequenos dispositivos, oferece autenticação, integridade e privacidade. Trabalha em cima de HTTP, com a desvantagem de ser mais lento que HTTP puro.

6.2.XML signature

Iniciado pela IETF (Internet Engineering Task Force) e W3C, como uma especificação de XML com assinatura digital. Com vantagem de ser independente de linguagem de desenvolvimento, ao contrario de outras assinaturas digitais.

6.3.XML encryption

Também iniciado pela IETF e W3C, define um processo de encriptação e decriptamento de dados no formato XML, onde o XML pode ser acessado por qualquer um, mas apenas o proprietário da chave pode entender os dados.

6.4.WS-security

Web Service seguro, iniciativa da Microsoft, IBM e Verisign, para XML signature e XML encryption, fornecer segurança para SOAP.

6.5.SAML

Security Assertion Markup Language, ainda pouco utilizada, é desenvolvida para prover autenticação e autorização em diferentes Web Services com níveis de direitos de acesso, permitindo que trabalhem como se fosse apenas um apicação.


7.Implementação

Um Web Service pode ser implementado de diferentes linguagens de programação. Linguagens como PHP, ASP, Java, possuem servidores que provem bibliotecas para facilitar a implementação.

No caso do PHP existe o Apache, um dos servidores mais populares para internet, para ASP a Microsoft desenvolve seu próprio servidor e para Java a Sun Microsystens definiu uma arquitetura que é implementada por diferentes empresas como IBM com WebSphere, Oracle, Apache.org com Tomcat entre outras.

8.Conclusões

Os Web Services tem se tornados cada vez mais importantes para as empresas, já substituíram o paradigma de computação centralizada, estão atualmente substituindo servidores que usam protocolos fortemente acoplados como CORBA.

A tendencia é que cada vez mais as empresas passem a disponibilizar seus serviços por Web Services.

Na medida que grandes empresas desenvolvedoras de software estão se dedicando no aperfeiçoamento de arquiteturas como J2EE, plataforma .Net, e também comunidade por trás do PHP, tem ficado cada vez mais simples para as empresas terem seus próprio Web Services.


9.Referencias

W3C

w3schools

www.ws-i.org

segunda-feira, 7 de dezembro de 2009

TI Verde Por Ramon Rosa da Silva

A pratica da TI verde se da escolhendo fornecedores que assumam sua responsabilidade ecológica, utilização materiais renováveis, descartamento de correto de materiais, virtualização, economia de energia entre outros atos que venham em favor sustentabilidade da computação. De forma geral essa pratica procura diminuir o desperdício e aumentar a eficiência.
Muitas pessoas não sabem mas uma forma simples de diminuir o gasto de energia é desligar o monitor quando não está sendo utilizado, principalmente quando é CRT, que pode consumir até 80% da energia do computador. Ainda bem estamos caminhando para monitores mais econômicos como LCDs e de LEDs, que consomem muito menos que os CRT.
Hoje em dia a TI verde está saindo da teoria e entrando em pratica nas grandes empresas, muitas por economia e consciência, outros por publicidades, como concursos como “Top Green 500”, com a escolha dos 500 computadores mais eficientes energeticamente, mas em fim o que importa é a adesão das empresas na TI verde.
Vale lembrar que além do hardware o software também tem grande importância na TI verde, imagine que quanto menor o processamento, menor aquecimento, que se relaciona com refrigeração interna do equipamento e do ambiente. No desenvolvimento o software também pode ser feito de forma sustentável, em forma colaborativa, criando módulos que possam ser melhorados, procurando a reutilização de formas comprovadas de eficiência.
Estive semana passada em uma empresa a ViaFlow de consultoria que em parceria com a IBM, trabalha com implantação de um sistema de GED (Gerenciamento Eletrônico de Documentos), o sistema se trata da digitalização de documentos, visando facilitar o gerenciamento deste documento, e o que eu achei mais interessante, permite anular todos documentos em papel, mantendo-os apenas no sistema, com a mesma validade jurídica, um sistema que elimina papéis é importante não somente para empresas de TI, e sim para todas empresas que trabalhem com um volume considerável de documentos em papel.
Eu trabalhei em um hospital de tamanho médio, e vi um grande volume de documentos gerados em papel apenas para fins jurídicos, pois o sistema podia abranger todas as atividades sem a necessidade de papel.
Sistemas como GED, ou simplesmente gerar em PDF e utilizar e-mail ao invés de imprimir relatórios, ou de desligar os monitores, ou virtualização, entre outros métodos, não são utilizados por estrar intrinsecamente no subconsciente¹ a desconfiança da segurança do software ou hardware.
Acredito que quando as empresas e pessoas tiverem maior consciência do desperdício que fazem, trocarão a cultura atual, por outra com maior confiança em tecnologias com um consciência ecológica.

¹ Nota: Lembra as aulas de psicologia, talvez um psicologo possa ajudar nesse processo de mudanças. Se não me der bem no área de tecnologia vou cursar psicologia...

Memória flash, por Ramon Rosa da Silva

A memória flash é a mais indicada para substituir a do disco rígida (HDs), por sua velocidade superior, com uma única operação é capas de escrever em vários blocos, com acesso aleatório, porém atualmente sua durabilidade é inferior a do disco rígido, são limitadas a uma quantidade finita de leitura e escrita. Seu custo atual é maior que a do disco rígido, quando seu custo baratear são vendida em massa nos desktops e em servidores, atualmente já são encontradas em alguns NetBooks.
São do tipo EEPROM (Electrically-Erasable Programmable Read-Only Memory) . Muito parecidas com a memória RAM (Random Access Memory) com a diferença que não são voláteis (não se apaga quando é desligada).
Encontradas em dispositivos como pen drives, mp3 players, câmeras digitais, celulares, principalmente por sua economia de energia e um tamanho pequeno.