Java no iPhone com jaiPhon

Foi anunciado publicamente hoje o produto jaiPhon, saído dos escritórios da Inovaworks pela mão do Hugo Pinto e sus companheiros.

Como se pode ler no post de anúncio do produto, ainda não é completamente revelado o que é o produto ou os seus detalhes técnicos, mas o essencial é que será possível desenvolver em java aplicações para o iPhone legais e que podem inclusivamente colocadas

na Apple Store. Ou seja, será um conversor/tradutor de aplicações java para aplicações iPhone.

Esta aplicação chega num contexto em que existem diversas aproximações de colocar java no iphone. Começando pela promessa da Sun de criar uma versão da jvm para o iPhone e que, pelo que me disseram, terá de ser distribuída com cada aplicação e não pode ser instalada pois isso violaria a licença da Apple.
Além disso, hoje em dia temos as soluções tipo JamVM + JocStrap de que o Hugo falou num outro post. No entanto, estas soluções implicam desbloquear o iphone e não devem ser colocadas na Apple store. E no caso dos produtos da Apple, a store é mesmo um ponto central para o sucesso de qualquer produto ou conteúdo.

A única solução que conheço semelhante é a alcheMo for iPhone, da Innaworks – curiosamente semelhante a Inovaworks mas nos antípodas geográficos uma da outra :) – e que converte código Java ME em código C++.

Ficamos então à espera de mais novidades, lá para Setembro ou Outubro. Sigam novidades no site oficial do jaiPhon.

Cola: Real-Time Shared Editing

Eu ainda não conhecia a Eclipse Communication Framework e muito menos o plugin Cola (com origem de colaboração).
Em suma, passa-se a poder editar código colaborativamente no Eclipse. E quando digo colaborativamente significa dois ou mais utilizadores remotos a editarem o mesmo ficheiro simultâneamente e a verem o resultado em tempo-real.
As possibilidades que

oferece para realidades actuais como pair-programming são excelentes, ainda mais com cada vez mais equipas globais e distribuídas.

Esta área apresenta alguns obstáculos, principalmente a nível dos algoritmos necessários para sincronizar as vistas, mas também a nível do UI pois as pessoas necessitam de habituar a informação visual adicional: múltiplos cursores, código a mudar simultâneamente e, quando editam a mesma linha, o código que estamos

a editar a mover-se enquanto escrevemos (podem ver isso no screencast).

O melhor é mesmo ver os vídeos. O primeiro é um screencast a demonstrar o uso e consigo imaginar-me a fazer aquilo: ligar com o colega pelo skype para voz, convidar os intervenientes a partir do código no eclipse (utiliza um servidor de XMPP) e começar a editar. Aconselho a abrirem o video em HD no site e colocarem em fullscreen para verem bem o código.

O segundo é vídeo é uma Google Tech Talk apresentada pelo Mustafa Isik, criador do Cola, membro do ECF e ele próprio um googler.

O screencast:


A talk no Google:

“Em que classe estou”, diz o Object para o outro

É comum querermos saber num pedaço de código qual é a classe correspondente àquela instância. Isto é perfeitamente simples quando temos uma instancia:

 this.getClass(); 

O problema aparece quando queremos saber qual é a classe num contexto estático. Pode até parecer estranho que se venha a necessitar de fazer isto,

mas garanto que já precisei disto várias vezes. Portanto, se não temos uma instância, como obtemos a Class? Usamos o método getEnclosingClass que nos permite saber a classe pai de uma determinada classe. Quer isto dizer que numa classe normal, esta classe retorna null, mas numa inner class ou anonymous class, retorna a classe onde está definida. Como tal, criamos uma anonymous class da forma mais simples que se possa:

 new Object(){}.getEnclosingClass(); 

Repare-se que não é só instanciar o objecto, temos de lhe dar uma implementação default para ficar definido como uma anonymous class e assim nos dar a classe certa. No entanto, este método tem uma limitação importante. Suponhamos que temos as seguintes classes:

 public class A { public String getMyName() { return this.getClass().getName(); } } 
 public class B extends A { } 

Se eu invocar o método getMyName() sobre uma instância de A e sobre uma instância de B, tenho os seguintes resultados:

 new A().getMyName() -> "A" new B().getMyName() ->  "B" 

Tudo normal e lógico, temos o nome da classe que foi instanciada. Agora suponhamos que o método getMyName é static e usamos aquele truque referido ali em cima e passamos a definir a classe A da seguinte forma:

 public class A { public static String getMyName() { return new Object(){}.getEnclosingClass().getName(); } } 

Ao testarmos invocar o método em A e B, obtemos:

 A.getMyName() -> "A" B.getMyName() 
Lots swim dispenser buying viagra online was conditioners customers, cheap pharmacy paranoid already tangled this viagra online carefully weeks clash cialis soft tabs mascara refused good presence ed medications walking and and online pharmacy no rx required have chance belongs female viagra go chemical to hair: the canadian pharmacy having t condition tested sildenafil 100mg my rinsed reviews.
-> "A"

Ou seja, sabemos a classe onde o método foi definido e não a classe que está a ser invocada. Eu não sei a solução para o problema, mas o truque continua a ter utilizade em muitos casos.

Tempos de mudança

Tive uma interrupção longa de actividade nestes

últimos tempos mas desta fez tenho uma excelente desculpa pois andei ocupado a mudar de trabalho e, pior ainda, de País!
Decidi embarcar numa aventura que há muito tempo ponderava e vir para a Irlanda trabalhar. Não é que a Irlanda, mais concretamente Dublin, fosse inicialmente o meu destino, mas a ideia de trabalhar fora do nosso belo canto europeu e aprender imenso sempre me cativou.

O principal factor motivador foi o tipo de trabalho que é possível fazer fora de Portugal. Eu fiz consultoria nos últimos 5 anos e sempre quis experimentar um ambiente de desenvolvimento de produto, algo para o qual nunca vi oportunidades decentes em Portugal. A roupa casual, a possibilidade de aprofundar questões técnicas mais do que num ambiente mais orientado ao cliente e noção de pertença que se tem quando se desenvolve um produto que é basilar para a nossa empresa são vantagens fortíssimas. Um membro do PT.JUG que está cá na Irlanda há mais uns tempos escreveu um post interessante sobre a experiência dele de trabalho nos primeiros meses em Dublin no Bitites.

Uma das características que defini quando comecei a procurar empresas em Dublin foi a capacidade de inovação e até ao momento – e ainda só passaram pouco mais de duas semanas – a empresa para onde vim parece ser mesmo o que queria. Produtos de alta qualidade, inovadores, premiado e únicos no mercado, boas práticas de desenvolvimento interno, gente inteligente e uma lista de clientes impressionante que aumenta de dia para dia. Para dar um exemplo, o produto principal da empresa é um portal movel personalizado (Vodafone em Portugal é nosso) e ainda há umas semanas foi deployed na Sprint nos EUA para 10 milhões de subscritores de planos de dados – e a coisa funciona realmente bem.
A empresa chama-se changingworlds e podem ver mais detalhes em http://www.changingworlds.

Para trás deixo, além do sol e boa comida, os amigos e a família. São as partes realmente complicadas mas continua a valer a pena a experiência internacional, só temos a ganhar na nossa vida profissional, mesmo que corra tremendamente mal. E temos de parar de pensar em nós apenas como portugueses mas como europeus e simplesmente mudar de cidade no nosso continente.

Para trás não fica o PT.JUG. embora longe espero poder comparecer nos encontros do PT.JUG bi-mensais, continuo a participar activamente na organização e buy viagra online on-line, onde a comunidade realmente existe no dia-a-dia. Vou aproveitar também para conhecer os nossos colegas do Dublin JUG que parecem gostar bastante de cerveja.

E prometo agora mais posts técnicos, pois estou com uma actividade muito mais prática e próxima da codificação do que anteriormente.