terça-feira, 24 de agosto de 2010

Oracle pode ter uma arma secreta na mão?



Em Agosto a Oracle surpreendeu, processando a Google devido á plataforma Android e a Dalvik VM.

A gigante que englobou a SUN em 2009,  arrebatou no negocio o Java, OS Solaris e tambem muito Hardware junto.

Agora diz que a Google com o seu  SDK Android sua DalvikVM e os aparelhos que rodam o OS Mobile  quebram 7 clausulas da patente original do Java e ferindo assim a propriedade intelectual da Oracle .





A Oracle alega ter direitos financeiros  sobre o projeto e com isso ameaça a comunidade opensource Java, que se vê receosa em prosseguir com Java em projetos criticos, enfraquecendo toda filosofia legada da SUN que dava, superpoderes aos Java.

 A DalvikVM usa um fork do projeto Apache Harmony e compila parcialmente o  .class(bytecodes) para um formato intermediario chamado .dex (Dalvik Executable) que utiliza tambem instruções especiais para rodar na VM .

Inclusive o projeto tentou atraves de uma carta enviada a SUN, ganhar o Technology Compatibility  Kit Java SE, mas o esforço foi em vão.

Vale ressaltar que o AndroidSDK nao suporta Swing, AWT muito menos JavaME, o que mostra não ter nada a ver com desenvolvimento mobile até então feita pela Oracle/SUN.

È engraçado como as vezes ,oportunidades estão proximas e não nos damos conta. Dois dos muitos excelentes projetos do Sun Labs, mostraram potencial no mundo pervasivo/movel:
  • Squawk VM
  • SunSPOT

Squawk VM



Squawk é uma edição  movel da  máquina virtual Java para sistemas embarcados e dispositivos de pequeno porte. A maioria das máquinas virtuais para a plataforma Java são escritos em linguagens nativas de baixo nível, como C / C + + e assembler, o que faz Squawk diferente já que o seu  núcleo é na sua maioria escrito em Java. (interpretador meta-circular).

A aplicação Java fornece  facil  portabilidade, alem de uma perfeita integração da máquina virtual com recursos das aplicações, tais como objetos, threads, e as interfaces do sistema operacional.
A Squawk VM pode ser simplificada como:

  •      Escreva o máximo do Java VM possível
  •      Direcionamento de recursos focado em pequenos dispositivos limitados
  •      Permitir Java para o desenvolvimento de micro-embedded

O projeto de pesquisa foi inspirada pela VM do SmallTalk, Squeak. Squawk herda muita coisa do  Java ME e possui uma pequeno footprint de  memória. 


Ela foi desenvolvida para ser simples com o mínimo de dependências externas.  

A sua simplicidade á torna portátil , fácil de depurar e manter. Squawk também fornece um mecanismo isolado pela qual uma aplicação é representada como um objeto.  

Em Squawk, uma ou mais aplicações podem rodar em uma unica JVM. Conceitualmente, cada aplicação é completamente isolada de todas as outras aplicações.


SunSPOT 




Estes dispositivos podem ser usados em uma ampla gama de aplicações, incluindo a robótica, monitoramento ambiental, controle de ativos, cuidados de saúde pró-ativa e muitos outros.

Sun SPOT rodam em uma máquina virtual especialmente projetada para pequenos dipositivos com baixo footprint de memoria a chamada Squawk, que pode hospedar vários aplicativos simultaneamente, e não requer nenhum sistema operacional subjacente. 

Modulos empilháveis incluem sensores para aplicações específicas e atuadores, tais como acelerômetros, detectores de luz, sensores de temperatura, LEDs, botões e I / O pins. Os dispositivos podem ser utilizados por dias com uma única carga da sua bateria recarregável.





Com tudo isso nas mãos , a Oracle não só pode parar o avanço do  AndroidSDK como investir no mercado de forma agressiva , o que na minha humilde opinião ,não fugiria a estrategia da empresa. 

Projetos Opensource como Arduino tambem tem um gigante atrativo nesta area já que constituem dos mesmos requisitos alem de ter uma comunidade empolgada e criativa e ser mais customizavel em geral.




 A IBM mantem suas JVM's JikeVm e J9, assim como a RedHat tambem possuem a IceTea6 Vm , mais conhecida como OpenJDK6 que possui o Kit de Certificação dw Tecnologia da SUN e usa o GCJ para compilar seus bytecodes sendo assim uma tecnologia totalmente opensource.


Com isso seria possivel adicionar a VM no core do Fedora 9 dentre outras distros Linux .Existe ainda o projeto Shark , que cria um JITespecialmente projetado  para a IcedTea.







A RedHat possui a JBoss, divisão focada em  tecnologia Java, que costuma criar diversos projetos com grande força e penetração na comunidade como JBoss AS, Hibernate, JBPM, Drools e JBoss Seam.


Seria o proximo passo da Oracle processar à Red Hat/JBoss e tentar exercer o controle, tambem dessas tecnologias?



Agora é o momento da comunidade mostrar atitude e adaptar sua cultura ,para não "bater de frente" com os interesses da Oracle,  e mostrar que o  Java ainda é muito legal(como linguagem)  e ainda por cima de simbolo extremamente importante no cenario opensource/enterprise(como plataforma).






Referencias


http://mashable.com/2010/08/12/oracle-google-android-lawsuit/
http://harmony.apache.org/
http://en.wikipedia.org/wiki/Apache_Harmony
http://www.arduino.cc/

http://sunspotworld.com/
http://en.wikipedia.org/wiki/Sun_SPOT
http://en.wikipedia.org/wiki/Squawk_virtual_machine
http://pt.wikipedia.org/wiki/IcedTea 
http://openjdk.java.net/
http://pt.wikipedia.org/wiki/OpenJDK 
http://www.sunspotworld.com/docs/index.html
Tutorial SunSpot
Video com Eric Arsenau sobre a Squawk VM
 

Marcadores: , , , , , , , , , , , , ,

sábado, 21 de novembro de 2009

Framework Collections do Java ==Coleções ou Estruturas de Dados Reutilizaveis --Parte 1




Framework Collections

Uma coleção - às vezes chamada de container - é simplesmente um objeto que agrupa múltiplos elementos em uma única unidade. As coleções são utilizados para armazenar, recuperar, manipular e comunicar dados agregados. Normalmente, eles representam itens de dados que formam um grupo natural, como uma mão de poker (uma coleção de cartas), uma pasta de correio (uma coleção de cartas), ou uma lista telefônica (mapeamento de nomes para números de telefone).

Se você já usou a linguagem de programação Java - ou praticamente qualquer outra linguagem de programação - você já está familiarizado com coleções. Implementações de Collection em anteriores (pré-1,2) versões da plataforma Java incluído Vector, Hashtable, e arrays. No entanto, essas versões não contêm um quadro coleções.


Um o framework de coleções é uma arquitetura unificada para representação e manipulação de coleções. Todo framework de coleções deve conter o seguinte:

  • Interfaces: Estes são os tipos de dados abstratos que representam coleções. Interfaces permitem coleções a serem manipuladas independentemente dos detalhes de sua representação. Em linguagens orientadas a objeto, interfaces geralmente formam uma hierarquia.

  • Implementações: Estas são as implementações concretas da coleção de interfaces. Em essência, eles são estruturas de dados reutilizáveis.

  • Algoritmos: Estes são os métodos que executam computações úteis, tais como busca e ordenação nos objetos que implementam as interfaces de coleta. Os algoritmos devem ser polimórficos, ou seja, o mesmo método pode ser usado em muitas implementações diferentes da interface de coleta apropriado. Em essência, os algoritmos de funcionalidade são reutilizáveis.


O Java Collections Framework fornece os seguintes benefícios ao programador:

  • Reduz o esforço de programação: Ao fornecer estruturas de dados e algoritmos úteis, com o Framework Collections você esta livre para concentrar-se as partes importantes de seu programa e não na parte de baixo nível "infraestrutura" necessária para faze-lo funcionar. Ao facilitar a interoperabilidade entre APIs não relacionadas, o Java Collections Framework te deixa livre para de escrever objetos ou adaptador de conversão de código para conectar-se API.

  • Aumenta a performance do programa e da qualidade: Framework Collections oferece alto desempenho, com implementações de alta qualidade contando com estruturas de dados úteis e algoritmos. As várias implementações de cada interface são substituíveis, assim que os programas podem ser facilmente ajustado trocando implementações coleção. Porque você está livre da labuta de escrever suas próprias estruturas de dados, você terá mais tempo para se dedicar a programas de melhoria da qualidade e desempenho.

  • Permite a interoperabilidade entre APIs não relacionadas: As interfaces de coleta são o vernáculo pelo qual APIs passar coleções frente e para trás. Se a minha administração de rede API fornece uma coleção de nomes de nó e se o seu kit de ferramentas GUI espera uma coleção de títulos de coluna, nossas APIs irá interoperar, mesmo que eles foram escritos de forma independente.

  • Reduz o esforço para aprender e usar novas APIs: APIs Muitos, naturalmente, tomar coleções na entrada e fornecer-lhes a saída. No passado, cada uma API, como tinha um pequeno sub-API dedicada a manipular suas coleções. Houve pouca consistência entre estes ad hoc sub-coleções APIs, assim que você teve para aprender cada um a partir do zero, e era fácil cometer erros quando utilizá-los. Com o advento das interfaces de recolha normal, o problema foi embora.

  • Reduz o esforço para conceber novas APIs: Este é o outro lado da vantagem anterior. Designers e implementadores não tem que reinventar a roda a cada vez que criar uma API que conta com coleções, em vez disso, eles podem usar as interfaces padrão coleção.

  • Reutilização de software Fosters: Novas estruturas de dados que estejam em conformidade com as interfaces padrão coleção são, por natureza reutilizável. O mesmo vale para novos algoritmos que operam sobre os objetos que implementam essas interfaces.


Interfaces


As interfaces principais do framework collection encapsulam diferentes tipos de coleções. Estas interfaces permitem que coleções sejam manipuladas independentemente dos detalhes de sua implementação. Tais Interfaces são a base do Java Collections Framework. Como você pode ver na figura seguinte, as interfaces principais formam uma hierarquia.





Por exemplo, Set é um tipo de coleção, SortedSet é um tipo especial de Set e assim por diante.Temos que notar tambem, que a figura possui 2 hierarquias diferentes, ja que Map nao é de fato uma verdadeira Collection!



  • Set-uma coleção que não pode conter elementos duplicados. Este modelo de interface a abstração matemática definida são usados para representar conjuntos, tais como as cartas que compreendem uma mão de poker, os cursos que compõem a grade de um aluno, ou os processos em execução em uma máquina

  • List-uma coleção ordenada (algumas vezes chamado de seqüência). As listas podem conter elementos duplicados. O usuário de uma lista geral, tem um controle preciso sobre onde cada elemento é inserido na lista e pode acessar elementos pelo seu índice inteiro (posição). Se você já usou Vector, você está familiarizado com o sabor das listas em geral.

  • Queue-uma coleção usada para armazenar vários elementos, antes de serem processados, por exemplo. Além de operações básicas de Collection, uma fila provê operações especiais de uma fila como a inserção, extração e inspeção. As filas normalmente, mas não necessariamente, guardam seus elementos atraves da politica FIFO (first-in, first-out) As exceções são as filas de prioridade, onde os elementos sao ordenados de acordo com um comparador fornecido, ou sua "ordenação natural. Qualquer que seja a ordenação utilizada, o primeiro de fila é o elemento que ira ser removido por uma chamada paos metodos remove ou poll. Em uma fila FIFO, todos os novos elementos são inseridos na cauda da fila. Outros tipos de filas podem usar regras de posicionamento diferentes. Cada implementação da fila deve especificar as suas propriedades de ordenação.
  • Map-um objeto que mapeia chaves para valores. Um mapa não pode conter chaves duplicadas: cada chave pode mapear para, no máximo, um valor. Se você já usou Hashtable, você já está familiarizado com os princípios de um Mapa

Implementações




Existem três implementações de Set com proposito geral- HashSet, TreeSet, e LinkedHashSet. Para as três , a utilização é geralmente simples. HashSet é muito mais rápido do que TreeSet (constante de tempo em função de log-tempo para a maioria das operações), mas não oferece garantias de ordenação. Se você precisa usar as operações na interface SortedSet, ou se a ordenação dos elementos é necessária, use TreeSet caso contrário use HashSet . É uma aposta justa que você vai acabar usando HashSet na maior parte do tempo.


Existem duas implementações com finalidades gerais de List - ArrayList e LinkedList. Na maioria das vezes, você provavelmente vai usar ArrayList, que oferece tempo constante de acesso e de posicionamento sendo simplesmente rápido. Ele não tem que alocar um objeto nó para cada elemento da lista, e pode tirar vantagem de System.arraycopy quando tem que movimentar vários elementos ao mesmo tempo. Pense em ArrayList como um vetor sem a sobrecarga de sincronização.

Se você freqüentemente adiciona elementos no início da lista ou itera na lista para eliminar os elementos do seu interior, você deve considerar usar LinkedList. Essas operações exigem tempo constante em um LinkedList e tempo linear em um ArrayList. Mas você paga um preço grande no desempenho. Acesso posicional requer tempo linear em uma LinkedList e constante em um ArrayList. Além disso, o fator constante para LinkedList é muito pior. Se você acha que quer usar uma LinkedList, meça o desempenho de seu aplicativo tanto com LinkedList como com ArrayList antes de fazer sua escolha; ArrayList é geralmente bem mais rápido.

As implementações de finalidade geral de Map são HashMap, TreeMap e LinkedHashMap. Se você precisa de operações como as de SortedMap ou necessita de uma iteração Collection-view, utilize TreeMap , se você quiser velocidade máxima e não se preocupa com a ordem de iteração, HashMap é a sua escolha, se você quiser um desempenho próximo de HashMap e inserção-iteração com ordem, LinkedHashMap sera a escolha.

LinkedHashMap fornece duas capacidades que não estão disponíveis em um LinkedHashSet. Quando você cria um LinkedHashMap, você pode requisitá-lo com base na chave de acesso ao invés de inserção. Em outras palavras, apenas olhando para o valor associado com uma chave que traz a chave para o final do mapa. Além disso, LinkedHashMap fornece o método removeEldestEntry, que pode ser substituído para impor uma política de remoção de mapeamentos obsoletos automaticamente quando novos mapeamentos são adicionados ao mapa. Isto torna muito fácil de implementar um cache personalizado.



LinkedList implementa a interface Queue, fornecendo um fila FIFO com operações para adicionar, remover da fila e assim por diante.

A classe PriorityQueue é uma fila de prioridades com base na estrutura de dados Heap. Essa fila de elementos é ordenada de acordo com uma ordem especificada no momento da construção, que podem ser os elementos "naturais ordenação ou a ordem imposta por um comparador explícito.

Na fila existemas seguintes de operações de recuperação - poll, remove, peek, e element - para acessar o elemento na frente da fila. A cabeça da fila é o menor elemento que diz respeito à ordenação especificada. Se vários elementos estão ligados pelo valor, a cabeça é um desses elementos, os empates são resolvidos de forma arbitrária.

PriorityQueue e seu iterador implementam todos os métodos opcionais da coleção e Iterator interfaces. O iterador previsto no iterador método não é garantido para percorrer os elementos da PriorityQueue em qualquer ordem particular. Se você precisa de condenação na iteração, considere o uso Arrays.sort (pq.toArray ()).



O framework Collections do Java é um tema simples, porem extenso e existem ainda muito mais informações que eu gostaria de compartilhar , por isso não percam os proximos posts, mostrando como funcionam os algoritmos de ordenação, shuffle, e uma serie de algoritmos muito uteis para se trabalhar com coleções, alem de particularidades da API e como usar coleções concorrentes ou thread-safe e criaremos uma coleção Wrapper para uma matriz quadrada com operações basicas de algebra linear, como exemplo.Outro tema muito abordado em conjunto é Generics(Genericos) ao qual falarei tambem em uma outra oportunidade.


Referencias

Marcadores: , , , , ,