Archive for the ‘beyondjava’ Category

Programar em Ruby te faz odiar linguagens estáticas

Thursday, January 26th, 2006

Papo interessante que estava tendo com o Fabrício ainda agora…

fabrício diz:
hehehhe
vc tb ta estudando ruby ?
Phillip Calçado - All that’s sacred..comes from youth! diz:
sim

fabrício diz:
pq ?

Phillip Calçado - All that’s sacred..comes from youth! diz:
por que eh uma linguagem *muito* boa
produtiva e de qualidade

fabrício diz:
rapaz..
hehe
sacanagem, mas eu quero saber o q eh q vcs acharam tao extraordinario nessa linguagem
eu vi aquele videozinho

Phillip Calçado - All that’s sacred..comes from youth! diz:
closures, dinamismo, DSLs

fabrício diz:
realmente me surprendi

Phillip Calçado - All that’s sacred..comes from youth! diz:
hoje eu estava com um problema interessante em java

fabrício diz:
qual ?

Phillip Calçado - All that’s sacred..comes from youth! diz:
tem uma classe qualquer que cria um objeto que pode ser considerado uma sessão com o banco de dados
só que numa jvm só podem existir duas sessões ao mesmo tempo, em threads diferentes
e me foi pedido para toda vez que se tenta abrir uma dessas, logar num arquivo antes quantas existem em memoria
para saber se estavamos tendo muito problema com isso ou se quase nunca duas sessoes ficam abertas
o jeito mais simples seria colocar uma variavel de classes (estatica) na classe que cria a conexão para saber quantas ela criou, certo?

fabrício diz:
é, a principio sim
e aii ?

Phillip Calçado - All that’s sacred..comes from youth! diz:
mas o problema eh que a classe que pede para essa outra criar uma sessão é quem fecha a sessão
então nós poderíamos saber quantas ssessões foram criadas, mas não quando uma for fechada
e essa classe sessão é do fornecedor do banco de dados, ou seja não pode ser alterada
como resolver isso em java?

fabrício diz:
unh … sem alterar a classe do fornecedor do bd, acho q tem q queimar um pouco os neuronios hehe
pq essa classe na pior das solucoes poderia notificar a todos que tem um comunicacao com ela, de que a sessao foi finalizada
sim, e ai?
vc fez o q?

Phillip Calçado - All that’s sacred..comes from youth! diz:
basicamente o que eu fiz rpa contornar a situação foi pegar todas as threads do sistema, ver quais delas possuem sessões abertas e logar, e como isso é bem lento deve ser melhor usar um adapter nesta classe
mas se fosse em uma linguagem como ruby, ao criar a instancia de sessao eu poderia alterar o metodo commit() desta instancia, fazendo ele avisar a classe fabrica que foi fechada antes de chamar o metodo original

Não entendeu a solução? Em Ruby uma classe é dinâmica, você pode alterá-la em runtime. Vamos a um exemplo (você pode testá-lo neste site) . Então supomos que nossa classe Session seja assim:


class Session
    def commit
        puts ‘COMMITED’
    end
end

E que quem crie sessions seja esta fabrica:


class Factory
    def create
        return Session.new
    end
end

Agora vamos modificar a fabrica para que guarde o numero de Sessions abertas e altere o método Session#commit


class Factory
#vamos guardar a quantidade de sessoes aqui
    @count
    

    #cria um ‘getter’ para o count

    attr_reader :count

    

    #construtor
    def initialize
        @count=0
    end
    

    #metodo usado para informar que uma sessao foi finalizada
    def session_ended
        @count=@count-1
    end
    

    def create
        s=Session.new
    

    #muda o metodo do objeto criado e cria variavel de instancia para localizar a factory
    class <<s
    

        #onde vamos guardar uma referencia para nossa factory
        @factory
    

        #cria um ’setter’ para factory
        attr_writer :factory
    

        #Muda o nome do metodo commit real
        alias original_commit commit
    

        def commit
            @factory.session_ended
            #chama o metodo antigo
            return original_commit
        end
    end
    

    #diz à sessao modificada que esta eh sua factory
    s.factory=self
    

    @count=@count+1
    

    return s
    end
end

Ficou bem maior que o método original, mas muito do que foi adicionado são getters, setters e construtores. No fim do post está o texto do teste completo, basta salvar num arquivo e rodar no interpretador ruby.

Note que o código não é thread-safe, teríamos que colocar uns monitores ali. Também é bom notar que não são todas as instâncias de Session que são afetadas mas apenas aquelas criadas pela Factory. Caso fosse necessário, poderíamos fazer com que todas as instâncias d Session fossem alteradas.

É assim que coisas como o Rails são implementadas e por isso é tão complexo criar ‘um Rails em Java’.

Se pudesse fazer isso em Java não estaria quebrando minha cabeça amanhã para otimizar uma ferramenta de diagnóstico… Minhas opções são: (a) empacotar a classe Session num Adapter ou (b) continuar buscando todas as threads e vendo se elas possuem sessões abertas

Provavelmente vou criar um adapter ou se não puder uma subclasse. WrappedSession implements Session e implemento o método commit() fazendo o necessário antes de delegar à Session real. O fato de criar uma classe nova na hierarquia apenas para adicionar um conceito ortognal (ou um cross cutting concern, algo importante para o sistema mas não importante do ponto de vista do usuário) não me faz muito bem. E se eu tiver que acrescentar esta funcionalidade a uma outra subclasse de Session criada por alguma das outras factories? Com wrapper tudo bem, mas se não usar subclasse eu crio outra com a mesma finalidade? E se eu quiser que todas as Sessions, não importa onde foram criadas, tenham esta funcionalidade? Find “Session”/Replace with “WrapperSession”?

Ps: estou tendo problemas com o WYSIWYG do WrodPress, a formatação tem ficado meio bagunçada devido a isso - Com ajuda do Diego isso foi meio que resolvido :P

Exemplo completo:

class Session
    def commit
        puts 'COMMITED'
    end
end
    
class Factory
    
    #vamos guardar a quantidade de sessoes aqui
    @count
    
    #cria um ‘getter’ para o count
    attr_reader :count
    
    #construtor
    def initialize
        @count=0
    end
    

#metodo usado para informar que uma sessao foi finalizada
def session_ended
    @count=@count-1
end
    
    def create
        s=Session.new
        
        #muda o metodo dentro do objeto criado e cria variavel de instancia para localizar a factory
        class <<s
        
            #onde vamos guardar uma referencia para nossa factory
            @factory
            
            #cria um ’setter’ para factory
            attr_writer :factory
        
            #Muda o nome do metodo commit real
            alias original_commit commit
                
    

            def commit
                @factory.session_ended
                #chama o metodo antigo
                return original_commit    

            end
        end
    

    
    #diz à sessao modificada que esta eh sua factory
    
    s.factory=self
    

        @count=@count+1
        

        return s
    end
end
    
f = Factory.new
s = f.create
puts f.count
s.commit
puts f.count

UPDATE: O taq deu uma limpada no código, ficou menor mas se for sua primeira vez vendo algo em Ruby pode ser mais confuso::

class Session
    def commit
        puts "COMMITED"
    end
end

class Factory
    attr_reader :count # pode usar o attr_reader direto que ele cria a @count
    def initialize
        @count = 0 # aqui tem que 'setar' o valor default né, inclusive se você não
    end # tivesse usado o attr_reader, a @count poderia ser criada aqui sem problemas
    def session_ended
        @count -= 1 # olha o -= ao invés do @count = @count - 1
    end
    def create
        s = Session.new
        class << s
        attr_writer :factory # mesmo esquema acima - não precisa explicitar @factory
        alias original_commit commit
        def commit
            @factory.session_ended
            original_commit
        end
    end
        s.factory = self
        @count += 1 # olha o += ao invés do @count = @count + 1
        s # não precisa do return, apesar de ficar mais legível com ele
    end
end

f = Factory.new
s = f.create
puts f.count
s.commit
puts f.count

2005: Java, Ruby, o Universo e Tudo Mais

Sunday, January 1st, 2006
Um título ridículo para um post sobre o que se passou no ano de 2005 na esfera tecnológica aos olhos do GUJ. Nada muito completo, apenas umas coisas que consiga lembrar…Caso você sinta falta de algo aqui, coloque nos comentários. Certamente deixei muito para trás, apenas segui a lista de notícias atrás de fatos que chamavam minha atenção.

Para iniciar o evento mais importante de tecnologia aqui do Rio aconteceu em Fevereiro, o Rio Java Summit 2005. O evento contou com a presença de Gavin King, líder e criador do Hibernate, que falou sobre persistência em vários aspectos, incluindo EJB3.0.

Gain King RJS2005

Mais uma vez o Sun Tech Days foi o evento da Sun para a Comunidade local.

Também tivemos este ano o clássico ConexãoJava, com ampla divulgação da mídia.

Em Novembro foi realizado o Rio Java Developers Day, compresença d vários palestrantes da Sun.

A Sun anunciou uma nova certificação: Sun Certified Java Associate. Pra que serve? Para nada na prática (além de engordar os curriculums como qualquer outra), mas muita gente se candidatou para obter o exame na fase de beta. Para os certificados da Sun (e de muitas outras entidades), certificados Beta são gratuitos. Um fato interessante é que esta prova em específico teve uma procura muito grande, o que mostra que foi bem divulgada pelos Portais, JUGs, Sites e mecanismos de informação em geral. A Comunidade Java está muito preocupada com certificação, seja lá qual o real fim dela.

A certificação Java 5 final saiu, mas ainda não tem o famoso livro da Kathy o que impediu muitos e muitos de tentarem a prova e continuarem a fazer a prova de certificação para Java 1.4. Também saiu a Java Language Specification 3rd Edition, guia (e bookmark) indispensável pra quem se diz programador Java.

No mesmo mês tivemos o lançamento do livro em Hibernate em Ação, uma tradução da obra de Christian Bauer e Gavin King. Além de defasado pela idade (não trata do Hibernate 3), o livro cumpre a tradição de livros técnicos porcamente traduzidos, comentários interessantes aqui. Apesar de um fiasco de tradução, esse livro é mais uma mostra que o mercado está precisando de material em português. Na mesma onda, os ótimos livros de Kathy Sierra foram traduzidos.Sou contra a tradução e o uso de versões traduzidas de livros não-básicos por profissionais, mas é mais uma prova que precisamos de material nacional de qualidade. Isso será tema de um post em breve.

No mês, seguinte, um anúncio que há muito era esperado: o framework Struts tem destino incerto. Quem acompanha o mercado de tecnologia sabia que algo ia acontecer neste sentido, mas quem insiste em tapar o Sol com a peneira tomou um golpe no estômago. Até hoje não dá pra entender direito qual vai ser do Struts, o framework antigo (que primeiro foi rebatizado para Struts Classic depois rebatizado novamente para Struts Action para não parecer tão antigo) não parece estar indo a lugar nenhum.

Em terras tupiniquins surgiu o Mentawai, um framework MVC sem XML que fez bastante sucesso considerando a concorrência extensa..

Uma notícia interessante para a comunidade brasileira de maneira geral é o SOUJAVA se tornar membro do JCP. Ainda sobre o SOUJAVA, a organização não repetiu o vexame do ano anterior e fez um chamado de trabalhos de verdade para o JustJava2005. Numa manobra estranha, começou a agregar JUGs de outras regiões querendo marcar presença nacionalmente. Isso não foi muito bem recebido por alguns que esperavam que a maior associação de usuários da tecnologia buscasse união e não concorrência com JUGs locais. No fim das contas os ânimos se acalmaram com uma conversa entre as partes.

A divulgação da estratégia de migração do WallMart fez com que muitas pessoas se interessassem em fazer o processo mais rapidamente, o que é uma forte tendência em 2006.
Falando em Software Livre, a IBM adquiriu a GlueCode, cujos funcionários produziram o Apache Geronimo. De repente, começaram a surgir iniciativas de Marketing como um prêmio para quem instalasse e rodasse o Geronimo. Sem supresa a Big Blue lançou uma versão de Geronimo sob o infame nome de WebSphere Community Edition.

Ainda na esfera FOSS, A Apache lançou um projeto de JVM livre chamado Harmony. O projeto causou algum burburinho quando anunciado mas desde então não trouxe nenhum avanço significativo seja em produto usável seja em qualquer coisa.
A guerra Mono/.Net/Java sofre um baque quando a MSFT anunciou que não ia lberar componentes importantíssimos do .Net para serem implementados por terceiros (i.e. Mono). A Microsoft também trocou o nome do seu novo sistema operacional. Este mesmo sistema já sofreu problemas de segurança no primeiro beta lançado, que resultou em alguns componentes sendo removidos do projeto inicial.

Sobre licenças, a Sun trabalhou arduamente para aliviar o peso das lincenças sobre seu código Java e diminuir as críticas e projetos de JVM livres. No fim do ano a emrpesa anunciou sua nova estratégia: liberar quase todos os seus produtos como Software Livre.

Dentro dos produtos liberados pela Sun está a família creator, uma IDE construída sobre o Netbeans. Netbeans que causou muita discussão com seu novo designer chamado Matisse que proporcionaria a produtividade de um VB/Delphi (ou seja: sem layout managers pentelhos) a uma aplicação Java. O Netbeans também lançou uma plataforma de colaboração (mais tarde a Borland e outros anunciaram coisas parecidas) que deve se tornar uma tendência. A Sun investiu *muito* para divulgar o Netbeans este ano, o produto cresceu bstante.
Ainda falando sobre IDEs, o Eclipse ganhou várias empresas novas em seu consórcio como Macromedia (agora Adobe) e Nokia também lançou o Eclipse 3.1 final e versões de diversos plugins. 2005 foi apra dar uma reorganizada geral no Eclipse e tirar cada vez mais o sel IBM do produto. Erich Gamma explicou bastante sobre o ciclo de desenvolvimento da plataforma. Para o mal ou para o bem, a IBM também doou ao Eclipse partes do seu ciclo de desenvolvimento proprietário, o RUP.

Com a concorrência desleal de ferramentas superiores gratuitas, a Oracle fez o JDeveloper ser gratuito. Apenas IDEs de verdade como IntelliJ (que lançou versão nova este ano)se deram ao luxo de continuar como produto pago desvinculado de um grande Application Server.

Sobre grandes Application Servers a Bea anunciou o WebLogic 9 com diversas novas funcionalidades entre elas integração com Jython/Python para scripting. A Bea também anunciou forte suporte ao Spring, coisa meio óbvia visto que Rod Johnson declara seu amor ao WebLogic a todo instante.

No JavaOne dos dez anos de Java a Sun anuncionou que não existirá mais Java 2.
Até o MINIX teve nova versão, certamente a ser discutida no novo livro do Professor Tanenbaum.

O Ruby on Rails fez uma entrada grandiosa no mainstream Java com um artigo na DeveloperWorks. A mídia toda explodiu e o novo livro de Bruce Tate, Beyond Java, veio abrir com uma polêmica: qual o futuro da plataforma e da linguagem Java?

O Livro ganha meu prêmio pessoal de mais importante do ano. Não por ser bem escrito, também não mostra tecnologias revolucionárias e nem consegue ser muito informativo sobre as tendências que aponta. Beyond Java poderia ser uma séria de artigos numa revista. O livro leva o prêmio por levantar uma questão importante e conseguir chamar atenção de todos os lados para a polêmica.

Ho-ho-ho: Artigo Noel

Friday, December 23rd, 2005

Como presente de Natal passei um artigo que já tinha alguns meses no fundo do meu HD para o Wiki. Como está meio antiguinho, me avisem de qualquer problema e se divirtam com Groovy: Linguagem de Script para Java

Bruce Eckel: Visão estreita!

Tuesday, December 20th, 2005

Sobre o artigo de Bruce Eckel 9que é um cara que eu gosto abstante aliás no Artima falando um monte de bobeira sobre Ruby e (o livro) Beyond Java, vou deixar para vocês o comentário do cadafalso: Visão estreita!

Introdução a Ruby (sem Rails) para Programadores Java

Monday, December 19th, 2005

Artiguinho bacana no developerworks com uma introdução da linguagem Ruby para programadores java, vale uma lida.

Detalhe: o artigo está com data de 20/12/2005(!)

James Gosling Fala Sobre Linguagens Especialistas: FUD?

Sunday, December 18th, 2005

James Gosling, pai do Java para a comunidade, fala sobre linguagens de script e linguagens especialistas em sua última entrada. Segundo Gosling, estas linguagens são bem legais, mas limitadas demais.

Na minha opinião, ele perde totalmente o ponto. Se a questão era levantar um debate sobre tipagem estática vs. dinâmica, o que ficou foi FUD em cima das mini linguagens.

Não dá pora saber ao certo o que ele tenta argumentar. Primeiro linguagens dinâmicas/de script não seriam rápidas o suficiente… bem Java já foi taxada de lenta tantas e tantas vezes que é engraçadoi ver o baluarte da tecnologia falando isso de outra.

Depois um ponto seria que as linguagens se prendem demais a um tópico específico, como geração de PDF ou manipulação de texto. Aqui o texto fica estranho… é óbvio que as linguagens são especializadas, este é o ponto inicial!

Um ponto que eu deixo claro na minha palestra sobre novas tendências em Java é que tecnologia nenhuma vai substituir Java completamente em curto/médio prazos. Java is everywhere, pro mal ou pro bem, e o que surgem são especialistas.

Hoje temos especialistas para web, para manipulaçãod e texto, manipulação de dados, processamento de XML… em breve teremos especialistas por seguimento de negócios.

Eu esperava ansioso pelo que o Gosling ia falar da onda “Beyond Java”. Deve ser estranho ser um visionário por 10 anos e acordar como um dinossauro, mas como Obie falou: eu esperava mais.

O problema é que mesmo que Gosling não tenha atacado mais fundo as novas tendências (talvez ele realmente não queira fazê-lo, ou talvez não queira se expôr, sei lá), um post por James Gsoling é sempre um post pelo Pai do Java, e isso causa reações. Um exemplo típico é esta entrada por Simon Brocklehurst.

Apesar de não conehcer Obie Fernandez eu conheço um pouco do seu trabalho, acompanho seu blog e conheço pessoas que o conhecem. Tentar desmerecer um argumento por que a pessoa “não tem credenciais” ao invés de atacar o argumento em si é o tipo de coisa deprimente que me faz ficar fora do mundo acadêmico, onde isso é muito comum. A respsota do Obie está aqui.

Ataques pessoais à parte (isso é tão comum que não merece tanta atenção), pensar fora da caixa é difícil para muitas pessoas. Como falei nesta entrada e em outros lugares, Ruby não vai substituir Java. Rails pode influenciar o desenvolvimento web a um ponto inacreditável (além de roubar uma fatia de mercado grande nos próximos meses) e definitivamente Java não é mais a única linguagem da JVM. Qual vai ser o papel da linguagem Java, da linguagem Ruby, das outras linguagens e novas tendências é o que venho estudando nos últimos meses, mas ainda é muito cedo para fazer previsões concretas.

Quando se fala em substituir Java, as pessoas acham que tudo que se faz em Java irá ser feito em Ruby, e isso é o ponto onde a cegueira do “Java R0X” atrapalha. Nenhuma outra linguagem conseguiu ser tão everywhere e dificilmente outra conseguirá. Não é o objetivo. Não existe linguagem tamanho único e Java é a prova disso.

Os trabalhos recentes em VMs portabilidade tendem para um ambiente cada vez mais neutro em relação a linguagem, você pega a ferramenta mais indicada para o trabalho.

Provavelmente a infra-estrutura (pense em Hibernate, Spring, Driver JDBC…) de um sistema vai ser feita numa linguagem tipada e que use o compilador para achar erros, como Java ou C#.

Para as regras de negócio em creio que DSLs, linguagens específicas para domínios, vão deixar seus programadores realmente se preocuparem muito menos com bits e mais com processos de negócio.

Para o resto as linguagens mais simples podem servir como gluecode utilizando os componentes criados pela Camada de Negócios ou pela infra-estrutura e fazendo todo o trabalho que hoje é dos XMLs e configuração espalhada por todo canto. Se for para apostar num cenário, neste momento aposto neste.

Caucho Resin Suporta PHP

Thursday, December 15th, 2005

Por enquanto foi no blog do Cameron Purdy (que não é relacionado com a Caucho AFAIK) mas a coisa parece grande:

Parece que o Caucho Resin, uma solução bem mais famosa para Container Web há alguns anos atrás do que hoje (naquela época que o Tomcat era piada) agora suporta PHP. E seis vezes mais rápido do que o mod_php do Apache.

Claro que não existme dados ainda, mas considerando que a JSR 223 (Scripting for the Java Platform que eu tanto cito aqui, trazendo PHP como implementação de referência) já está quase final, é algo esperado.

Eu acabo de ler um livro sobre PERL 6 e Parrot que apesar de meio velinho me trouxe algumas idéias que devo estar escrevendo aqui em breve. Uma coisa é certa: preparem-se. Já começou.

Update: O Dion fala mais sobre o assunto

Ruby on Rails 1.0

Tuesday, December 13th, 2005

O Diego tinha me avisado hoje cedo e o GUJ sai na frente com a notícia do lançamento do Ruby on Rails 1.0.

Para quem não usa um software antes de sair uma versão final (sim, eu conheço pessoas que fazem isso mesmo com software livre) é só fazer o download. Para quem já tem Ruby instalado basta fazer um:

$ gem install rails --include-dependencies

O anúncio no Blog oficial dá mais detalhes e informa uma coisa muito legal sobre este lançamento:

The only thing you need to do to upgrade from 0.14.x is update your Javascripts using “rake update_javascripts”. You’ll be rocking along with Scriptaculous 1.5 and Prototype 1.4.

The Panacea Programming Language

Wednesday, November 23rd, 2005

Ultimamente o que não faltam são pessoas irritadas com os rumos que Java anda tomando. Desta vez o editor de sites do Eclipse e autor de um livro sobre o tema Ed Brunette fala sobre como está irritado com todas estas mudanças em Java 5 no EclipseZone.

Recebi uma newsletter do JavaLobby com a notícia hoje pela manhã e, claro, já tinha thread no GUJ sobre o tema.

Reescrevendo o que postei na thread, a questão toda na minha opnião é que Java (linguagem) está sendo esticada de todas as maneiras possíveis para atender a todo tipo de problema. Como ainda não surgiu nesta terra nenhuma ferramenta útil para todas as situações, não vai ser isso que vai ajudar.

Além de açúcar sintático quase inútil, Java 5 traz melhorias como metadados (e seu surpreendente manipulador, o APT) que são necessárias para a plataforma Java atingir um novo nível. Estas facilitam e muito o que já vem sendo feito com “gambiarras” em cima de AOP, Proxies, Classloaders, JavaDoc e XML (uma discussão na página de uma palestra recente minha).

Num futuro breve 9menos de 12 meses, creio) teremos pelo menos quatro linguagens para a JVM oficiais: Groovy, BeanShell, PHP e JavaScript. Sendo que PHP é apenas a implementação de referência de uma plataforma de scripts. Além destas, temos Jython e JRuby como linguagens ganhando grande atenção ultimamente e as mais antigas como JSTL, Velocity e Ant.

A tendência é que ao invés de esticar Java para todos os cenários, foquemos nas linguagens certas para o cenário certo. Existem problemas (e muitos!) que Java não resovle bem. Existem casos (e muitos!) que Java é muito complexo.

Ao contrário do que a Microsoft fez na prática, não é apenas uma questãod e manter programadores de aplicação em algumas linguagens (VB.Net) e de ifnra-estrutura ou sistemas maiores em outra (C#), mas ter uma gama de linguagens com finalidades específicas. linguagens dinãmicas, funcionais, procedurais, de domínio… estamos entrando num mundo de muitas linguagens de programação e a plataforma deve seguir a tendência.

Aliás, pausa para pergunta: alguém conhece alguém de .Net que não programe em C#, ASP.Net ou VB.Net?

Futuro de Java EE

Tuesday, November 22nd, 2005

Ainda na onda “o que vem por aí?” Floyd Marinescu fez uma apresentação no Java in Action 2005 sobre o futuro da plataforma. Os handouts de slides você obtêm aqui.

A palestra é bem abrangente, Floyd falou sobre AOP, SOA, AJAX, JSR 170, Harmony… incluindo alguns slides sobre o Brasil como estudo de caso na adoção de Open Source.

Uma das coisas que não pode faltar neste tipo de apresentação hoje em dia são linguagens alternativas e estas são mencionadas em 3 slides. O foco é Groovy mas Marinescu menciona também a JSR 223 (Scripting for the JavaTM Platform, que vai implementar PHP para Java como referência).

Vale uma olhada.