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, 5 de junho de 2010

Fabric


Em uma tarefa de deployment de uma aplicação em servidor LAMP no estágio, eu e meu g gerente tivemos a idéia de usar o Fabric, ferramenta de deployment escrita em Python, opensource e que seria em tese o equivalente ao Capistrano para o Rails.

Resumindo, o Fabric é uma biblioteca Python e uma ferramenta de linha de comando para o uso de SSH para a implantação do aplicativos ou administração de tarefas de sistemas.




Ele fornece um conjunto básico de operações para executar comandos shell localmente ou remotamente (normalmente ou via sudo) e fazer o upload / download de arquivos, bem como funcionalidades auxiliares, tais como prompt de usuário que está executando para a entrada, ou abortar a execução.

Porem, pesquisando sobre assunto, podemos ver poucos posts de blogs e informação disseminada sobre o assunto, em relação ao seu irmão do mundo Rails.

Vendo a documentação , podemos notar que o projeto ainda esta no começo(v0.9), e tem muito potencial, devido ao poder que o Python proporciona á ferramenta.

Basicamente você instala o Fabric no Ubuntu 9.10(Karmic)através do comando:


Automaticamente o Fabric já esta no seu $PYTHONPATH e com isso a proxima tarefa seria criar um arquivo fab da seguinte forma:


Dentro do fabfile.py você deve escrever suas tarefas em Python.Sendo assim dentro deste arquivo você pode mesclar ShellScript com codigo Python, solução matadora em ambiente Linux(Ubuntu).

Estando no mesmo diretorio do seu fabfile.py, você pode executar suas tarefas Fabric(metódos python) da seguinte forma:



No tutorial basico encontrado no site, existe um bom exemplo de um script simples para fazer um deployment e montar um pack com a aplicação alem de rodar os testes do Django.



Partindo desse script, a idéia era fazer o deployment de varios build's sucessivos, de forma incremental, baseado nos seguintes requesitos :
  • Tags do controle de versão , no caso, o Mercurial(HG)
  • Cobrir e rodar os testes da aplicação
  • package com timestamp, versionando assim os releases
  • Deployment em varios servidores(staging, production)
  • Restart do Apache e do Memcached.

Alem disso, uma boa estrategia no caso de ocorrer algo de errado no deployment de uma versão, ou até na versão atual, seria uma função de rollback, como acontece no Capistrano que resgataria o server para uma versão estavel da aplicação.

Ao meu ver, qualquer tarefa administrativa pode ser executada de forma automatica usando o Fabric, mas claro, não existe bala de prata, e por isso devemos sempre colocar na balança os motivos e desvantagens de usar alguma tecnica.

Algumas coisas como gerenciar o firewall, ou proteger de bruteforce attacks, seriam simples, bastando apenas a criação de uma fab_task que manipula o iptables,ou usa alguma ferramenta como o UFW Uncomplicated Firewall.

Em soluções onde ocorrem grandes e as vezes devastadoras mudanças de DBschema, o uso do SOUTH para criar migrations é interessante, tornando as modificações do DB transacionais ,consistentes e claro ,menos doloridas.

O Fabric tambem pode ser alternativa para o deployment de aplicações escritas em outras linguagens da plataforma LAMP, como:
  • Perl
  • PHP
  • Python
  • Erlang¹
Fanatismos á parte, deve se levar em conta o fato de que no Rails e para o mundo Ruby ,já existe uma otima ferramenta, o Capistrano.

Fabric ao meu ver tem potencial para atuar como peça importante na pilha LAMP, sendo tambem alternativa para automatização de tarefas em outras plataformas como Java² e PHP/MySQL.

Erlang¹: ver LYME stack, Linux/Yaws/Mnesia(CouchDB)/Erlang

Referencias:

Marcadores: , , , , , , , , ,

domingo, 23 de maio de 2010

Coisas legais do dia-a dia

Na ultima semana, em um projeto interno da empresa onde trabalho, mais uma vez me dei conta de como conceitos basicos e bem consolidados podem fazer realmente a diferença entre algo simples ou complexo e sobre uma solução ser boa ou ruim.

Conversando com a galera da empresa sobre frameworks web modernos, tecnologias atuais e o ciclo das tecnologias, tal como acontece nas artes, pude ver o quão a minha idéia realmente fazia sentido.

Principio da Localidade

Basicamente a localidade define o melhor aproveitamento da hierarquia de memória em um sistema definindo assim o conceito de cache.

O princípio da localidade de referência diz que o dado usado mais recentemente tem grande probabilidade de ser acessado novamente num futuro próximo (localidade temporal). Favorecendo-se o acesso a tais dados, aumenta-se o desempenho do sistema.

Já o principio da localidade espacial diz que um endereço em memoria , tende a ter endereços proximos acessados em um futuro proximo, devido a natureza dos loops(repetição) e das estruturas de dados de armazenamento sequencial(vetores).

Uma definição mais simples de cache poderia ser: uma área de armazenamento temporária onde os dados frequentemente acedidos são armazenados para acesso rápido.

O uso do Memcached se justifica devido a tudo isso, tornando aplicações que possuam muitos acessos ao banco de dados incrivelmente performaticas.Quando o assunto for alta disponibilidade do banco de dados, o Memcached tambem pode ser uma ótima pedida.


Estrutura de Dados

Saber implementar e entender as estruturas de dados faz grande diferença na hora de solucionar problemas.Saber onde e porque usar uma Stack, uma Queue, um Map, um Set ou uma Tree, suas politicas de uso e seus variados tipos de interface pode fazer você pensar Out-of-The-Box =).

Na hora de parsear texto, inverter strings, trabalhar com interpretação de linguagens, ou automatizar etapas , usar Stack/Pilha com politica LIFO é preciso!

Em um contexto de concorrencia, eventos do tipo Publish/Subscribe,caixa de email e computação distribuida em geral, vale a pena dar uma boa olha em Queue/Fila com politica FIFO.

Cache , Sessões, DNS entre outras aplicações ficam a cargo dos HashMaps.

Para Foruns , Conceitos de Memória, e Lógica em Geral vale a pena estudar sobre Arvores e Heaps.

Existem milhares de aplicações individuais e conjuntas destas estruturas de dados e um bom conhecimento sobre suas interfaces e aplicações pode fazer a diferença em muitos casos.


Teoria da Computação

Coisas como O(1), O(n),O(logn) podem ser horriveis se você não gosta de matematica ou não entende seus algoritmos e sua complexidade.Porem , se você olhar , mesmo que intuitivamente para seus algoritmos, poderá entender o que pode estar acontecendo e quem saber fazer isso acontecer mais rapido.

Em uma dada tarefa, eu e meu gerente percebemos que em um script de deploy automatizado com o Fabric, possuíamos um repositorio de estáticos, que devia ter sua consistencia preservada após varios redeploys.

O primeiro ataque ao problema foi copiar todo o repositorio para um repositorio auxiliar e posteriormente copia-los de volta. Basicamente um swap, que pra quem ja viu alguns algoritmos de ordenação, pode ser custoso, já que em principio,neste caso, quanto maior o numero de arquivos estaticos, o tempo da tarefa passa a ser quadrado O(n²).

O segundo ataque, em um passo de refatoração, foi de criar switch's com links simbolicos, de forma a manter a aplicação disponivel por maior tempo e tornar o tempo de consumo praticamente constante O(1) como num lookup feito em um hashmap .

Tal raciocinio, nao leva em conta calculos avançados, benchmarks ou falacias da rede como banda infinita e rede sempre disponivel, sendo apenas um leve esboço de logica.

LAMP/Web Frameworks

Podemos ver que Django, Rails dentre outros frameworks novos para desenvolvimento web, possuem comunidades fortes, principios notaveis como DRY E COC, arquitetura MVC, alem de manter suas raízes na pilha LAMP OpenSource, revolucionando ou reensinando a forma como se escreve para web nos dias de hoje.

Contudo,no mundo Java, que muitas vezes possui pensamentos megalomaniacos de contrução de foguetes(rsrsrs), podemos ver uma mudança de comportamento , dada a grande adoção de frameworks como VRaptor, Play e Scooter que aprenderam principalmente com o Rails como o desenvolvimento web pode ser produtivo, divertido e em Java.

Coisas como JSF, Wicket, GWT, Struts podem até fazer sentido em alguns contextos, mas se você parar e pensar, pra que você precisa de milhares de build's complexos, milhões de dependencias, e lógica de processamento rebuscada que "esconde" as coisas do programador?

Não é preciso reinventar rodas, nem criar engenhocas complexas para web, apenas usar o bom senso e conceitos já batidos como:
  • Client-side com JQuery, ExtJS, MooTools
  • WebFrameworks como Rails, Django
  • Linguagens Script como Python,Ruby
  • Linux como OS, geralmente Ubuntu
  • MySQL/PostgreSQL como banco de dados
  • ApacheHTTPD, Ngix ou Lighttpd como servidor web
Conhecimentos sólidos em computação distribuida,arquitetura de sistemas, shell script, sql, http, smtp, javascript, e linguagens dinamicas pode ser uma boa opção de "munição" para seus combates diários na web.


Obrigado pelo seu tempo.

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

domingo, 4 de abril de 2010

Ruby x Python


Nos últimos tempos tenho metido a cara no Python, e também aprendendo Django, para um projeto na Concrete e realmente gostei do que vi, como mostro aqui.Não é difícil se apaixonar pela linguagem devido a facilidade e simplicidade de suas libs.




No ultimo ano aprendi Ruby e Rails e consegui trabalhar em 2 projetos usando a tecnologia. Pra mim que era ( e sou ainda!) Javaholic, mas não Shiita, foi totalmente gratificante, ainda mais ver o projeto JRuby decolando, e facilidade e bom gosto no uso da versão para JVM e seu ecossistema.





Alem das vantagens e desvantagens de cada mundo, coisas como OpenSource e consequentemente comunidade forte e vibrante, composta por muitos bons programadores facilita a queda livre no ambiente dessas linguagens .




Meu conselho geral sobre a questão resume Python vs Ruby até perguntando "como é seu trabalho de cérebro?"
Porque, realmente, as duas linguagens são aproximadamente equivalentes para a maioria dos efeitos práticos (excepto Unicode, Ruby, mas que será fixa em breve).




A grande diferença está no idioma e nas convenções como por exemplo, os programadores de Ruby, tendem a ser muito mais dispostos a fazer coisas como a adição de novas funcionalidades para o built-in classes(Ferramentas perigosas como disse Martin Fowler), enquanto que programadores Python geralmente hesitam em fazer "monkeypatching" em qualquer lugar (e não pode fazê-lo para o built-ins, porque não são mutáveis).


Ruby tem muitos açucares sintaticos (alguns dos quais serão imediatamente familiares), mas é claro que vem com a sobrecarga de ter que aprender como eles funcionam. Python tem bem menos malabarismos, mas pode ser mais verboso as vezes.




De qualquer forma, independentemente de sua escolha você vai ter acesso à documentação boa (Dive Into Python é um grande livro, idem o livro PickAxe no lado Ruby), comunidades fortes e as pessoas motivadas a escrever montes de código, sólidos e reutilizáveis, dispostos a vencer de qualquer maneira esta "disputa".


Para web, tanto o Django quanto o Rails são frameworks MVC com principicos como DRY(Don't Repeat Yourself), COC(Convetion Over Configuration) alem de forte comunidade que geram muito codigo e documentação, o que facilita e tornam mais doce a vida de qualquer equipe de desenvolvinento.

Para deployment, a utilização do Google App Engine pode ser vantajosa e uma das primeiras linguagens que rodaram nessa plataforma de desenvolvimento foi o Python(Django), seguido pelo Java que tornou possivel o deployment de aplicações JRuby/Rails.









Eu diria que mergulhar seus dedos do pé em ambos os grupos, em seguida, seguir com o que você sente mais confortável dentro dos paradigmas de programação ajuda a se ambientar e ir sentindo o conhecimento aterrar no cérebro.


Pra quem ficou curioso e quer um teste drive com essas linguagens , referencias de Ruby(JRuby) e de Python.





Obrigado pelo seu tempo!

Marcadores:

segunda-feira, 22 de março de 2010

E a cobra fumou!!!!!

Apesar de ter ouvido falar muito do Python, como toda pessoa que vem do Java, e que conhece bem o ecossitema de bibliotecas e frameworks , olhava meio de "cara feia" para a linguagem.Usando Ubuntu, e fussando em blogs e artigos de desenvolvimento Web percebia que ele era muito usado e melhor, muito util.





Me apeguei a estudar o Jython, versao portada para gerar bytecodes e rodar na JVM. Como gosto de linguagens e ja tinha experimentado(e gostado demais por sinal!) Groovy, Ruby(JRuby) , Clojure, JavaFX, por puro preconceito e ignorancia apenas, tornei meu foco apenas para a integração, e as informações mais famosas e "hypes".






Eis que fui encubido de estudar Python/Django durante essa semana para um projeto no estagio. Recebi uma biblia(Learning Python da O'Reilly), e muita informação sobre comunidade, projetos na pratica e produtividade em uma conversa com meu gerente.




Fuçando a linguagem, revendo coisas que ja tinha lido por alto, e claro, buscando informação na comunidade, no Google e code snippets, em menos de uma semana alem de me viciar na linguagem, vi que ela é uma poderosissima arma no arsenal de qualquer desenvolvedor, desde a infraestrutura (redes, sistema de arquivos), parsers) até a web(otimos frameworks e api's).


Vindo do estudo e uso do Grails, Rails, VRaptor e sabendo dos prós e contras de cada mundo, olhei para o Django com admiração após brincar um pouco com o framework.




O Django desde o começo é simples e o tutorial no site do projeto te mostra o poder que ele tem. Alguns livros como Django Pratical Projects, tem projetos simples com requisitos usados no dia-a-dia da maioria dos projetos web. É a real historia do ver pra quer.


Pra quem vem do mundo OO, o Python tem todo o suporte ao paradigma, te dando um conjunto grande e robusto de libs integradas ( Redes, Threads, Arquivos, Strings, Coleções...) nas mais diversas areas de dominio.





Alem de uma linguagem que permite construções rapidas, curtas e mortais, temos diversas caracteristicas do mundo funcional como funções map(), reduce(), filter() alem de manipulação de listas como no LISP.


Para quem se aventura no mundo LISP, ou adora coisas como metaprogramação no Ruby e no Clojure, o Python possui ótimo suporte a reflexão alem de menor rigor no uso de ; e {}.


Me atreveria a dizer, com a minha pouca experiencia na linguagem, que ela seria um meio-termo entre o Java e o LISP.

Nas universidades Stanford(berço da Sun e da Google), Michigan(berço dos algoritmos geneticos) e muitas outras, o Python é a linguagem base nos cursos de Ciencia da Computação, pela sua expressividade( boa pra codar algoritmos de forma quase que em lingua natural), facil aprendizado e vasto conjunto de bibliotecas.




Empresas como a NASA, e a Google usam Python em muitos sistemas.A Google inclusive emprega o criador da linguagem, Guido Von Rossum e tem diversos projetos importantes codados na linguagem como Youtube, AppEngine, LLVM(Unladen Swallow) entre outros.


No mundo OpenSource o GIMP e o Blender , respectivamente, um editor de imagens completo com recursos equivalentes ao do Photoshop e um editor/modelador 3D poderoso, são aplicações escritas na linguagem e que possuem integração com plugins de terceiros tambem escritos em Python.


Fatores como produtividade na web(Django,Pylons), comunidade opensource(documentação/foruns/suporte) , facilidade no aprendizado e poder nas abstrações fazem valer a pena estudar e ter um contato mais intimo com essa linguagem.


Com certeza alem de te tornar um programador melhor e mais versatil , ele tambem sera uma fonte de inspiração e diversão na hora de programar.




OBRIGADO PELO SEU TEMPO!

Marcadores:

sábado, 20 de março de 2010

Conceitos de Memoria na JVM



Brincando a noite com Python, fui estudar a fundo a PVM, e a integração Java + Python =Jython!!

Logo, ja estava me aventurando no tema concorrencia, e recordando acerca do modelo de memoria compartilhada do Java, locks, semaforos , STM ,Actors...

Dai relembrei do conceito de Memoria Stack, Heap e onde a threads entram nessa historia.



STACK


Basicamente , na Memoria Stack cada thread(linha de execução) da máquina virtual Java(JVM) tem uma pilha privada da propria JVM, criada ao mesmo tempo que a thread.


Uma JVM(máquina virtual Java) armazena frames de memoria. Ele contém as variáveis locais e resultados parciais, e desempenha um papel na invocação de método e de retorno.

Ja que a JVM Stack não é manipulada diretamente, exceto por push e pop de quadros, quadros tambem podem ser alocados na heap. A memória para uma JVM Stack não precisa ser contígua.

A especificação Java máquina virtual permite que as pilhas da máquina virtual Java ou ter um tamanho fixo ou dinamicamente expandir o contrato de acordo com o exigido pela computação.

Se a JVM Stack tiverem um tamanho fixo, o tamanho de cada JVM Stack pode ser escolhido independentemente quando essa Stack é criada. A implementação da máquina virtual Java pode fornecer ao programador ou ao utilizador o controle do tamanho inicial das pilhas da máquina virtual Java, bem como, no caso de expansão dinamica ou contração das JVMS Stack's, modificando o controle sobre os tamanhos máximos e mínimos.

As seguintes condições excepcionais estão associados com as pilhas da máquina virtual Java:

  • Se o cálculo em um segmento exige um maior JVM Stack do que é permitido, a máquina virtual Java gera um StackOverflowError.
  • Se o tamanho das JVM Stack's pode ser expandido de forma dinâmica, a expansão pode ser feita, mas a memória insuficiente pode ser disponibilizada para o efeito da expansão, ou se a memória insuficiente for disponibilizada para criar a JVM Stack incial de uma thread, a JVM lança um OutOfMemoryError*¹


Heap

A máquina virtual Java tem uma pilha que é compartilhado entre todas as threads da máquina virtual Java. A pilha é a área de dados de tempo de execução a partir do qual a memória de todas as instâncias de classes e arrays são atribuídas.

A Heap(Tipo de Fila de Prioridade) é criada no start da JVM. Um Heap de armazenamento de objetos é recuperado por um sistema automático de gerenciamento de armazenamento (conhecido como um coletor de lixo(garbage collector); objetos nunca são explicitamente liberados*².



A máquina virtual Java não assume qualquer tipo específico de sistema automático de gerenciamento de armazenamento(garbage collector), e a técnica de gerenciamento de armazenamento pode ser escolhida de acordo com os requisitos do implementador do sistema*³.



A Heap pode ser de um tamanho fixo ou pode ser expandida conforme exigido pela computação e pode ser expandido se uma maior pilha torna-se desnecessário. A memória para a Heap não precisa ser contígua.

A pilha de objetos, armazena principalmente objetos ou variáveis de classe.

A seguinte condição excepcional está associado com a Heap:

  • Se um cálculo requer mais memoria Heap do que pode ser disponibilizado pelo sistema automático de gerenciamento de armazenamento, a máquina virtual Java gera um OutOfMemoryError
O tamanho da Heap da JVM pode ser aumentado ou diminuído, conforme necessário: O tamanho da velha geração presente na Heap padrão pode ser substituído usando o Xms-e-Xmx opções para especificar o tamanho inicial e máximo, respectivamente:

java-Xms -Xmx program"> -Xmx codigoQueFazAlgumaCoisa.class -Xmx program">

Por exemplo:

java-Xms64m
-Xmx program">codigoQueFazAlgumaCoisa -Xmx128m

Durante uma de suas palestras e no curso de RubyonRails pela , Fabio Kung deu a seguinte afirmativa baseada em suas analises de como funcionava realmente o modelo de memoria das JVM's : "95% de mortalidade infantil, dentre seus objetos criados", ou seja, a maioria não passa pela etapa de coleta de lixo e são descartados da memoria.

Existem gerações de objetos na Heap e eles são promovidos a areas especificas conforme sobrevivem a coleta de lixo e ganham "idade".


Uma Curiosidade

Assim como campos estaticos(static)são atributos de classe, e não de instancia, podemos usar inicializadores estaticos para definir referencias que necessitem estar presente na construção de objetos mais complexos, ou que são criadas apenas uma vez no ciclo de vidado objeto. Veja o codigo a seguir de tire algumas conclusões!


public class LoadingBlocks {

static{
System.out.println("Inside static");
}

{
System.out.println("Inside init");
}
public static void main(String args[]){
new LoadingBlocks();
new LoadingBlocks();
new LoadingBlocks();
}
}

Output:

Inside static
Inside init
Inside init
Inside init


Seguindo essa logica, poderiamos por exemplo setar um DAO em um objeto de negocios que necessitasse iniciar seu estado atraves do banco de dados na hora de sua construção e isso acontecesse uma unica vez.


public class MeuModeloDeNegocios{
private static MeuModeloDAO;
persistenciaDoMeuModelo;
private List modelos;

static {
persistenciaDoMeuModelo=new MeuModeloDAO();
}

public MeuModeloDeNegocios(){
this.modelos=persistenciaDoMeuModelo.listaTodos();
}
}

Com este codigo seguimos nossas especificações e assim que a classe é posta na memoria pelo ClassLoader nosso bloco de inicialização cria nosso DAO um unica vez, por mais que criemos milhoes de objetos!

Espero ter ajudado! Obirgado pelo seu tempo! []'s

Marcadores:

terça-feira, 16 de março de 2010

Mundo das Linguagens, o futuro da programação!



Introdução


Podemos ver uma tendencia de pequenas e grandes empresas na area de software e tecnologia ,a fazer pesquisas na área de produção de linguagens de programação , principalmente na area de web e concorrencia/paralelismo, atendendo as suas proprias estrategias especificas de mercado.



JRubyonRails


Um exemplo seria a "extinta" SUN que vendo o potencial do Ruby como linguagem e do Rails como framework Web para pilha LAMP, investiu pesadamente no projeto JRuby, um versão da linguagem que compila para bytecode e roda na JVM.

Para tanto ela contratou uma equipe de grandes desenvolvedores para ficar à frente do desenvolvimento e da comunidade, sendo eles: Charles Nutter, Ola Bini, Thomas Enebo e Nick Sieger, alem de dar a tarefa de tornar o Netbeans a melhor IDE para RubyonRails para Tor Norbye.


Charles Nutter e Thomas Enebo

Contudo a SUN ia mal das pernas e em 2009 Charles Nutter junto com o time do JRuby se juntou a Engine Yard, uma empresa de web hosting , especializada em JRuby/Rails, e que já possuia um projeto de um VM para Ruby mais performatica e moderna, com o nome de Rubinius. Alguns projeto em JRubyonRails.

  • Projeto Kenai mix de rede social, servidor de host de codigo, similar ao Sourceforge e Google Code, fechado pela Oracle, seŕa utilizado internamente.
  • MediaCast SUN, site de video para apresentação de palestras e tutoriais sobre tecnologias SUN
  • OracleMix rede social de desenvolvedores Oracle.



Python, Java

A gigante Google, que possui varios dos seus grandes projetos em Python, traz em 2001 Guido Von Rossum, criador da linguagem e chamado de "Ditador Benevolente" já que até hoje controla os rumos de sua obra. Alguns Projetos do Google em Python.



Alem dos esforços em Python a Google possui uma forte area de desenvolvimento para Java, com produtos como Guice, Google Collections, GWT para Web com AJAX . Não podemos esquecer, que Joshua Bloch, aquele mesmo do Effective Java( Que continua efetivo até hoje =D) trabalha na Google desde de 2004, tendo criado na SUN coisas como o framework Collections, Generics entre outras bibliotecas Java.




Groovy


A Spring Source , recentemente comprada pela VMWare, possui uma linguagem fortissima para o mundo enterprise, o Groovy. Empresas como IBM e a propria Spring investem pesadamente nessa linguagem, que roda nativamente na JVM, possuindo codigo sintaticamente valido que é reconhecido como codigo Java e compilado para bytecodes. Sua sintaxe aliada a sua tipagem dinamica faz do Groovy uma excelente linguagem para criação de DSL's, alem ser de facil aprendizado para quem já caminha bem pelo mundo Java. O Groovy possui o primo, para não dizer irmão do Rails, o tambem e nem tão famoso Grails, framework montado com varias tecnologias Java de ponta:

  • Hibernate para persistencia
  • GSP(Groovy Server Pages) para views
  • Spring na camada de controle e no container de injeção de dependencias.


Otimo framework que é montado sobre componentes já renomados do Java com Spring/Hibernate.



Clojure


Criada por Ritchie Hickey, tal linguagem tras o mundo funcional para dentro da JVM. Possuindo estruturas de dados imutaveis, memoria transacional, alem de todas as vantagens do LISP para metaprogramação e concorrencia.


A empresa Relevance , que atua amplamente no mercado de software em Ruby,JQuery ultimamente virou seus olhos para o Clojure, atraves da evangelização de Stuart Holloway que alem de contribuir/criar projetos em Clojure, ainda comanda sessões que ajudam rubistas e javanianos a conhecer esta poderosa ferramenta.

Projetos em Clojure




Breve historia sem fim, de qual sera a linguagem mainstream!

  • Sera o Java o novo COBOL?
  • Ou mesmo JRuby, Clojure , Groovy terão realmente um forte papel no futuro sendo cada vez mais e mais usadas?

No blog PureDanger de Alex Miller, ex-programador da Terracotta, existe um otimo post, onde ele analisa e compara as tendencias de mercado em relação as novas linguagens script que tem claramente duas grandes area:

  • Concorrencia/Paralelism (Clojure, Scala, Erlang, Haskell)
  • Web Agil 2.0 + AJAX ( Javascript, JavaFX, Ruby,Python)

Vale a pena conferir tais novidades no mundo da Computação!

Obrigado pelo seu tempo!

Marcadores:

Entendo a persistencia em Java I




JPA é uma especificação criada pela Sun, inspirada no Hibernate. Portanto o Hibernate é a implementação mais "famosa" do JPA. Sendo assim, JPA não é um substituto do Hibernate.
  • JPA é a especificação (Java Persistence API)
  • Hibernate é uma implementação da JPA
A confusão surge pois o Hibernate surgiu antes da especificação JPA, em uma epoca onde não exisitia uma solução padronizada para a camada de persistencia. A Sun se baseou no Hibernate para elaborar a especificação JSR220.

O Hibernate oferece algumas alternativas a mais, como por exemplo a API de Criteria, que não faz parte da especificação JPA 1.0, que seŕa incluida na JPA 2.0 , que sera lançada junto com o Java EE 6 .Contudo apesar de fazer parte da epsecificação EJB 3.0(JSR220), a JPA tambem pode ser usada para modelar Entidades que mapeiam suas classes para o banco em aplicações Desktop.

Você pode usar JPA utilizando em conjunto com qualquer biblioteca de persistencia, tanto o mais usado no mercado Hibernate, com suas perfeitas extensões de funcionalidades , como TopLink(Oracle) que tem a fama de ser a mais rapida(melhor performance) alem de funcionalidades especificas para bancos Oracle(10g/11g).

Uma otima referência é o livro Pro EJB 3: Java Persistence API da Apress que da uma otima passada , mostrando todas as caracteristicas de implementação.


REFERENCIAS


Compilações dos seguinte tópicos do GUJ(Grupo de Usuarios Java):

JPA, Como, Quando e Porque?
Hibernate e JPA
Tutorial JPA + Netbeans
É possivel usar JPA sem o Hibernate?


Links da Sun

Sessão sobre JPA no Java EE 6 Tutorial
Artigo em ingles, sobre como usar JPA em aplicações Desktop
Pagina da tecnologia JPA


Videos

Otimo video do Paulo Canedo sobre como criar uma aplicação Desktop ...

Tutorial e video da DevMedia empresa ligada a revista MundoJava

Otimo video feito por Fabio Kung, no blog da Caelum


Espero ter ajudado e em breve farei no blog um post mostrando algumas caracteristicas da JPA 2.0!

Participe do OSUM, rede social de estudantes da SUN, sua participação é muito importante!

Obrigado pelo seu tempo!