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!

sexta-feira, 5 de março de 2010

MapReduce é o que há!




DESCRIÇÂO

MapReduce é um framework patenteado, introduzido pelo Google para computação distribuída em grandes conjuntos de dados e em clusters(grids) de computadores.







Inspirado pelas funções map() e reduce() comumente usadas na programação funcional [embora os seus efeitos no âmbito do framework MapReduce não é o mesmo nas suas formas originais Bibliotecas MapReduce tem sido escritas em diversas linguagens de programação como C + +, C #, Erlang, Java, Python, Ruby, F #, Haskell,Clojure.

MapReduce é uma estrutura para processamento de grandes conjuntos de dados sobre determinados tipos de problemas distribuiveis utilizando um grande número de computadores (nós), referidos coletivamente como um cluster. Processamento computacional pode ocorrer tanto em dados armazenados em um sistema de arquivos (não estruturadas) ou dentro de um banco de dados (estruturados).


  1. "Map" : O nó mestre(master) recebe os dados de entrada, divide esses dados em pequenos sub-problemas, e os distribui para nós trabalhadores(workers). Um nó trabalhador pode fazer isso de novo, por sua vez, levando a uma estrutura multi-level da árvore de tarefas.A tecnica usada é a Divisão/Conquista amplamente usada em soluções de problemas top-down, utilizando recursão.Os nós trabalhadores processam as pequenas partes do problema, e passa a resposta de volta ao seu nó mestre.
  2. "Reduce": O nó mestre toma então as respostas para todas as sub-problemas e os combina de modo a obter os dados de saída - a resposta para o problema que originalmente o algoritmo tentava resolver. A vantagem de MapReduce é que ele permite o processamento distribuído da função map e das operações reduce. Já que cada operação de mapeamento é independente da outra, todos os map's podem ser executadas em paralelo - embora na prática seja limitado pela fonte de dados e / ou o número de CPUs para esses dados.


Da mesma forma, um conjunto de "reduces" podem executar a fase de redução - tudo o que é necessário é que todas as saídas da operação de map que compartilhem a mesma chave sejam apresentadas ao mesmo redutor, ao mesmo tempo. Embora este processo muitas vezes possa parecer ineficiente em relação aos algoritmos que são mais seqüenciais, MapReduce pode ser aplicada a conjuntos de dados significativamente maior do que aqueles algoritmos usados no mercado de servidores - um grande "farm" de servidores pode usar MapReduce para classificar um petabyte de dados em apenas alguns horas.

A partes cruciais do algoritmos MapReduce podem ser resumidas em:

  • an input reader(Leitor de Dados de Entrada)
  • a Map function(Função de Mapeamento)
  • a partition function(Função de Particionamento de Dados)
  • a compare function(Função de Comparação de Dados)
  • a Reduce function(Função de Redução para achar Resultado Final)
  • an output writer(Escritor de Dados)


O paralelismo também oferece possibilidade de recuperação de falha parcial de servidores e armazenamento durante a operação: se um mapeador ou redutor der falha, o trabalho pode ser remarcado - considerando que os dados de entrada ainda estejam disponíveis.

MapReduce é útil em uma ampla gama de aplicações e arquiteturas , incluindo: "grep distribuido, ordenação distribuida, reversão link web-grafo, vetor de termos por host, estatísticas web de log de acesso, construção de índice invertido, o agrupamento de documentos, aprendizado de máquina ,mineração de dados, tradução de maquina estatística ... "Mais significativamente, quando MapReduce estava terminado, ele foi usado para regenerar completamente índices do Google da World Wide Web, e substituiu o antigos programas que atualizavam o índice e funcionavam com várias análises .

Os inputs e outputs estaveis do algoritmo MapReduce são normalmente armazenados em um sistema de arquivos distribuídos. Os dados intermediarios são normalmente armazenados em um disco local e são pegos remotamente pelo redutor.









Marcadores: