Ola a todos!

Because WE are mobile!!
Ola a todos!

Ola pessoal,
Quando fui ao Forum Nokia Tech Days em São Paulo, o Python me surpreendeu e foi realmente uma boa surpresa. Porém, ficou uma dúvida de quando utilizar, já que trabalho em uma empresa onde quando fazemos um produto não podemos focar em nenhuma plataforma especifica e aí ficou aquele gostinho de frustração.
Mas, a alguns dias a lista de Java ME do SouJava começou a ser "palco" de diversas de threads
com o assunto relacionado as diversas plataformas disponíveis para o mundo móvel. Isso me fez pensar que na verdade, devemos estar preparado para criar softwares móveis independentes da plataforma. Pois a "melhor" plataforma é aquela que te atende naquele projeto e que irá trazer o melhor resultado considerando: qualidade, desempenho e custo.
E então, para "juntar" tudo, estou tendo que fazer uma pesquisa sobre uma solução para ser apresentada para um cliente e a melhor solução está parecendo ser usar aparelhos da S60 com o aplicativo feito em Python ou C++. Por isso comecei a fazer várias pesquisas e testes com diversas soluções.
Por isso, resolvi mudar o nome desse blog que era "Neto Marin JME Blog" para "Neto Marin Mobility Blog" onde irei também colocar relatos de experiências que estou fazendo com Python e outras linguagens. Espero que gostem dessa mudança também! :)
[]s
Neto
Ajude a sustentar a Wikipédia e outros projetos, sem colocar a mão no bolso, e concorra a um Eee PC!
…e também a pen drives, card drives, camisetas geeks, livros e mais! O BR-Linux e o Efetividade lançaram uma campanha para ajudar a Wikimedia Foundation e outros mantenedores de projetos que usamos no dia-a-dia on-line. Se você puder doar diretamente, ou contribuir de outra forma, são sempre melhores opções. Mas se não puder, veja as regras da promoção e participe - quanto mais divulgação, maior será a doação do BR-Linux e do Efetividade, e você ainda concorre a diversos brindes!
É pessoal, para aqueles quem vinham apostando no Android e falando empolgantemente que o Google iria dominar também a área de dispositivos móveis, eles jogaram um grande e cheio balde de água fria!
Ontem foi anunciado que o lançamento do Android foi atrasado do segundo para o quarto quarto do ano. Ou seja, o pessoal vai ter que continuar "brincando" com o emulador do Android. É, digo brincar porque na minha opinião é para isso que serve o Android por enquanto.
Sei que vários vão querer me jogar pedra por falar isso, mas por enquanto não é possível testar uma aplicação Android, é impossível saber o seu real desempenho (que na minha opinião não deve ser nada bom), portabilidade. Enfim, para aqueles que estão no mercado sabem que esses são aspectos determinantes para o sucesso de uma aplicação móvel. Nada adianta ela ser bonitinha (como o Android aparenta ser) se ela não for fácil de usar e não tiver um desempenho razoável.
Não que eu torça contra, mas eu acho que se o Android não "pertencesse" ao Google, já teria nascido morto!!! ;-)
Para mais detalhes, visite: http://mobhappy.com/blog1/2008/06/24/check-mate-for-googles-android/
[]s
Neto
Ola pessoal,
Apenas para comentar a noticia que acabo de encontrar no G1 Tecnologia, que diz que em maio o número de assinantes foi de 130,5 milhões. E além disso, o mês apresentou o incrível número de 2,8 milhões de novas assinaturas. Grande parte impulsionadas pelo dia das mães. Outro dado que chama atenção é a grande proporção de telefone pré-pagos, que representam um total de 80,9% do total das habilitações no Brasil.
Claro que essa quantidade de celulares pré-pagos diminui em muito a empolgação daqueles que sonham em fazer aplicações e serviços para a rede e tal. Mas, não se pode desprezar os outros 19% que representam um total de aproximadamente 24,7 milhões !! Bom, mas isso seria conversa pra pelo menos uns 2 ou 3 posts seguidos! ;-)
Quem quiser mais informações, veja a matéria completa em: http://g1.globo.com/Noticias/Tecnologia/0,,MUL605604-6174,00-NUMERO+DE+CELULARES+NO+PAIS+SUPERA+OS+MILHOES+EM+MAIO.html
[]s
Neto
Ola pessoal,
De volta a Campinas, resolvi fazer um resumo de como foi o code camp e sobre o tema desse code camp: Widgets!!
O Code Camp:
O dia começou com o pessoal chegando cedo, principalmente pra achar uma tomada e pegar uma vaguinha na rede ;-) e além disso, estava todo mundo querendo achar uma grande idéia para conseguir ganhar um N95 com 8 GB :D
No inicio a idéia era fazer algo utilizando a API do GoogleCalendar ou algum tipo de rede "social". Mas ai, surgiu uma idéia que parecia boa: um "navegador" pelos bookmarks do del.icio.us, exibindo os links salvos, as tags e etc. Acabamos tendo alguns problemas com a integração XML + JavaScript + CSS e ai no final conseguimos fazer apenas a listagem dos links salvos e ai abrir o navegador ao clicar no link.
Várias aplicações interessantes foram mostradas, mas a vencedora foi uma onde o pessoal executava um comando no widget (notepad, calc, cmd, etc) e o pc que era o servidor executava o comando, tirava uma "foto" (screenshot) e então enviava para o celular.
Widgets
No site do Forum Nokia há bastante material sobre como criar os widgets. Mas, resumindo é uma página HTML onde você pode utilizar JavaScript e CSS para fazer as interações e executar ações com o usuário. Nada que você já não tenha visto em páginas de internet comum. E alem disso, para ajudar, a Nokia oferece um kit básico que contém elementos que facilitam sua interação, como por exemplo: TextField, UIManager, Label, ListSelections e outros.
Para saber mais sobre widgets acesse http://www.forum.nokia.com/main/resources/technologies/browsing/widgets.html e tenha acesso a "getting started", exemplos, APIs e muito mais.
E o futuro?
Olha pessoal, eu não sou fã de HTML e muito menos (mas muito menos mesmo) fã de JavaScript. Porém, não tem como não dizer que os widgets são a forma mais simples para se criar uma pequena aplicação móvel. Ele pode servir como a porta de entrada para um serviço qualquer da web, ou até para difundir mais facilmente um serviço que você queira oferecer.
Além disso, a Nokia parece estar apostando muito nessa nova "leva" de aplicativos móveis e inclusive através do site Mosh (http://mosh.nokia.com) você pode publicar seu widget e assim ter muitos usuários acessando seus serviços.
Logo que acertar o que ficou errado no meu widget eu posto pra vocês aqui.
[]s
Neto
Bom dia pessoal,
Estamos começando o segundo dia e no momento estamos ouvindo Ravi e Daniel falando sobre a criação de widgets para a S60, na verdade está primeiro mostrando o site do Forum Nokia. É bem interessante pois se trata de um novo conceito de "aplicativo" móvel e forma de interação com o usuário.
Na parte da tarde haverá um code camp e o melhor widget dará a dupla vencedora um device N95 para cada um. Ainda estou sem idéias, mas até a hora do almoço alguma irá aparecer =)
Material do evento
Para aqueles que querem material do Nokia Forum Tech Days e saber mais sobre o que está acontecendo pode visitar a página do evento em: http://wiki.forum.nokia.com/index.php/Tech_Days_Brasil_08
Quando acabar o meu widget e tiver mais detalhes faço um novo post contado como se faz e etc.
[]s
Neto
Ola pessoal,
Já tivemos hoje uma palestra sobre desenvolvimento em C++ com o Ravi Belwal e depois uma outra palestra muito interessante com o Daniel Rocha falando sobre o desenvolvimento com Python e inclusive com alguns exemplos. E até o exemplo de um player de música onde é possível trocar de faixa "balançando" o celular.
Desenvolvimento com C++
O que podemos resumir da programação com C++ é que, não é tão complexo quanto se acha que é, porém ainda possui suas particularidades. Mas, sempre vai ser possível ter acesso as mais novas bibliotecas disponíveis até porque é a linguagem nativa do SO.
Python e Symbian S60
É indiscutível que a produtividade e simplicidade de se programar em Python é muito melhor em relação ao C++ ou ao próprio JME, pois inclusive é possível ter acesso a "trechos" do sistema que não são alcançados pelo Java porém, na minha humilde opinião, é mais um passo em direção a segmentação!!!
Afinal, se você tem uma empresa e cria um produto com certeza irá querer que esse produto alcance o maior número de dispositivos possíveis, mas, programando com Python você verá a quantidade de dispositivos "alvos" diminuirem muito.
Então não vale a pena usar Python ?!?!
Eu diria que tudo DEPENDE. Vamos supor a sequinte situação: Você possui um escopo fechado e um alvo bem definido. E além disso você precisa de recursos que te permitam acessar funcionalidades especificas de algum dispositivo, então, use Pyton e seja feliz!!
Agora, você quer desenvolver um produto corporativo onde você não possui muita influência sobre o que seus clientes vão usar, então prefira Java ME ! :D
Mais tarde volto com mais "flashes" aqui do evento.
[]s
Neto
Ola pessoal,
Estou aqui no hotel Gran Meliá em São Paulo participando do primeiro dia do Forum Nokia Tech Days. A primeira vista parece ser bem empolgante, principalmente por mais uma vez a Nokia estar mostrando que realmente se preocupa com a comunidade de desenvolvedores e além de tudo, ajudar a gerar negócios com isso.
Uma coisa que me chamou bastante atenção foi o portal "OVI" (http://www.ovi.com) que busca trazer diversos serviços e formar de integrar os serviços que a Nokia oferece a sua plataforma. E como os próprios palestrantes disseram, a Nokia está se reformulando e oferencedo diversas novas oportunidades!
Bom, vou indo porque minha bateria está se acabando e ainda não consegui achar uma tomada!! =( Mas logo, volto com mais alguns detalhes e dicas para aqueles que estão curiosos sobre esse evento!!
[]s
Neto
Ola pessoal,
Esses dias tive que armazenar e trafegar algumas configurações de aplicações móveis. E ai, pra facilitar minha vida resolvi usar o esquema de properties. Ou seja, uma chave = valor.
E você pode pensar que estou ficando louco né!!! Afinal nem a implementação da classe Properties existe e além disso o dispositivo deve implementar a JSR 75 para que seja possível salvar esse properties em "formato" de arquivo.
Mas utilizando properties eu tenho algumas vantagens:
Ola pessoal,
Continuando com minhas experiências com a biblioteca LWUIT, fiz agora um outro tipo de menu: um FishEyeList !!
Ou seja, conforme você alterna entre os itens da lista, o ícone correspondente fica maior, dando um destaque e indicando que item está selecionado. Esse tipo de lista ficou muito conhecida com o uso de Ajax e também com iPhone. E agora, você vai poder ter essa lista, fácil... fácil... na sua aplicação Java ME! ;-)

A lista
Esse tipo de menu em relação ao apresentado antes tem uma vantagem, usar menos imagem. Isso porque para dar o efeito de que a imagem está maior que a "normal" não é necessário gerar outra, mas sim utilizar o método image.sclaed(nova_larga, nova_altura).
O exemplo
Esse exemplo também foi todo feito em uma única classe MIDlet, FishEyeListMIDlet, e que tem o método montaFishEyeList que é chamado no startApp para que seja exibido o Form com o menu. E as ações dos botões são tratadas no actionPerformed, como vc já está se acostumando a ver aqui nesse blog! ;-)
montaFishEyeList( )
É o método que monta o menu com a FishEyeList. Para que ele faça a montagem, o método recebe 2 parametros:
Form fishEyeForm = new Form("FishEye List");
fishEyeForm.setLayout(new BoxLayout(BoxLayout.Y_AXIS));
try {
fishEyeForm.setBgImage(Image.createImage("/background.png"));
} catch (IOException e) {}Depois disso, é a hora de adicionar os botões e definir o comportamento de cada um. Isso será feito dentro de um loop que irá percorrer cada item dos arrays recebidos e em cada iteração serão executadas as seguintes ações://criando os botõesTratando o uso do botão
Button b = null;
for ( int i = 0; i < icone.length; i++ ) {
b = new Button(label[i], icone[i]);
b.getStyle().setBgTransparency(0);
b.addActionListener(this);
b.setRolloverIcon(icone[i].scaled((int)(icone[i].getWidth()*1.3),
(int)(icone[i].getHeight()*1.3)));
b.setPressedIcon(icone[i].scaled((int)(icone[i].getWidth()*0.8),
(int)(icone[i].getHeight()*0.8)));
b.setBorderPainted(false);
fishEyeForm.addComponent(b);
}
Ola pessoal,
Continuando no assunto da biblioteca LWUIT, resolvi fazer um menu e assim comparar também com o menu em canvas que fiz a um tempo aqui e que é o post mais acessado... disparado!!! :)
O menu também será bem simples, como foi o seu antecessor. Seu comportamento será da seguinte forma: na navegação há mudança na imagem indicando que o item está selecionado e quando clicado é disparado alguma ação, no nosso exemplo um Alert ("convencional"). Abaixo, imagens de como ficou:

As imagens do menu
Para deixar o menu com uma visualização melhor, para cada opção eu escolhi um icone e criei uma outra imagem com uma iluminação para dar impressão de que está apagado. Então, a cada vez que um icone é selecionado a imagem que foi indicada na criação do botão é trocada pela imagem que parece "acesa".
O único cuidado com essa prática é a questão de desempenho, pois se você escolher muitos ícones e icones muito grandes o desempenho pode cair muito e ao invés de ajudar, apenas piorar.
O exemplo
Para ilustrar, o exemplo consiste em apenas um MIDlet que contém um método chamado montaMenuForm( ) e que é chamado no startApp para retornar o Form que será exibido para o usuário. As imagens são carregadas no construtor.
montaMenuForm( )
É o método responsável por montar o Form com o menu e retornar para que ele seja exibido. Esse método recebe três parametros:
//Criando formDepois de montado o layout, é hora de adicionar os botões e definir o comportamento de cada botão. Para isso será feito um loop pelo array de imagens e em cada interação serão executadas as seguintes ações:
//Criação do Form
Form menu = new Form("Menu LWUIT");
try {
//definindo background
menu.setBgImage(Image.createImage("/background.jpg"));
} catch (IOException e) {}
//Montagem do layout
//4 colunas
int cols = 4;
//Calculando quantidade de linhas
int rows = (int)Math.floor(icones.length/4);
//Layout de exibição em grids
menu.setLayout(new GridLayout(rows,cols));
//Criando botões e adicionando ao gridTratando o uso do botão
for ( int i = 0; i < icones.length; i++ ) {
b = new Button(label[i], iconesOff[i]);
//imagem para exibir ao selecionar botão
b.setRolloverIcon(icones[i]);
//imagem para exibir ao clicar no botão
b.setPressedIcon(icones[i]);
//Removendo o fundo de seleção do botão
b.getStyle().setBgTransparency(0);
//alinhamento e posição do texto do botão
b.setAlignment(Button.CENTER);
b.setTextPosition(Button.BOTTOM);
//não desenhar borda no botão
b.setBorderPainted(false);
//indicando o listener do botão
b.addActionListener(this);
//adicionando o botão ao form
menu.addComponent(b);
}
public void actionPerformed(ActionEvent evt) {
//Obtendo botão que disparou o evento
Button b = (Button) evt.getSource();
//Verificando pelo titulo qual botão é
if ( b.getText().equals("Bluetooth")) {
Alert a = new Alert("Selecionado", "Bluetooth", null, AlertType.INFO);
javax.microedition.lcdui.Display.getDisplay(this).setCurrent(a);
} else if ( b.getText().equals("Pesquisar")) {
Alert a = new Alert("Selecionado", "Pesquisar", null, AlertType.INFO);
javax.microedition.lcdui.Display.getDisplay(this).setCurrent(a);
}
//Continua comparações
//definindo focus
menu.setFocused(b);
}Download e código completoOla pessoal!!
Essa semana eu tive a oportunidade de escrever um artigo sobre essa interessante biblioteca e para ilustrar o artigo acabei montando uma aplicação de exemplo e então consegui tirar algumas conclusões e vou dar algumas opiniões aqui para vocês! :)
Nova forma de programar
Como os próprios autores declararam no site do projeto, a LWUIT foi feita pensada no Swing, então a forma de utilizar alguns componentes é bem parecida com seus "similares" no Swing, como por exemplo um Button. Abaixo, um exemplo onde se cria um botão e define a chamada de um método estático qualquer quando um botão é clicado:
Button botao = new Button("Processar");
botao.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt) {
//chamada para um método qualquer...
}});Para alguns que não possuem muita vivência com Swing (como é o meu caso), algumas coisas podem soar estranhas, mas considero ser apenas questão de costume pois apesar de diferente são bem simples.Ola pessoal,
Algumas vezes queremos fazer algumas listagens em nossos Forms, ou mesclar conteúdo e permitir uma navegação pelos itens e a sua seleção e o uso da lista compromete a usabilidade ou simplesmente não funciona!
Por exemplo, aqueles que já tiveram a oportunidade de usar o JustJava mobile no ano passado (com a grade horária) ou já deu uma olhada no CoSMo (que "nasceu" do JustJava Mobile), viram que na listagem das palestras do dia é possível clicar em uma determinada palestra e ver o detalhe dessa palestra, como nas figura abaixo:
O problema nesse caso é que os nomes dos locais e o título das palestras poderia ser grande, e como eu não confio muito no comportamento do List em diferentes dispositivos, a solução intuitiva era usar StringItem !!
Mas ai eu tinha um problema: Como "descobrir" em qual palestra o usuário clicou para exibir o detalhe corretamente?
No List (ou ChoiceGroup) seria fácil, já que eu tenho o indice selecionado. Então, o mais fácil era ter um indice próprio para que eu pudesse recuperar o registro certo no RMS, nesse caso o próprio ID no RMS.
Criando um novo "StringItem"
Bom, nesse caso então a minha idéia foi criar um novo componente que extendia de um StringItem, portanto eu tinha todo o comportamento já conhecido, e adicionar um atributo de código "escondido", para poder armazenar o ID e depois usar. E a nova classe que criei ficou assim:
public class HiddenIdStringItem extends StringItem {
private int hiddenId;
public HiddenIdStringItem(String label, String text) {
//Uso normal como se fosse um simples StringItem...
super(label, text);
}
public HiddenIdStringItem(int toHiddenId, String label,
String text) {
//construtor da superclasse
super(label, text);
//salvando o ID que se deseja "esconder"
this.hiddenId = toHiddenId;
}
public HiddenIdStringItem(String label, String text,
int appearanceMode) {
//Uso normal como se fosse um simples StringItem...
super(label, text, appearanceMode);
}
public int getHiddenId() {
return hiddenId;
}
public void setHiddenId(int sessionId) {
this.hiddenId = sessionId;
}
}
Ola pessoal,
Eu já tinha lido uma prévia do projeto LWUIT no blog do Terrence na "Mobile & Embedded Community" e já tinha me deixado empolgado, pois até o título do post era promissor: "Em Breve: Swing para mobile, mas melhor" (em tradução livre). E não era para menos, deem uma olhada nos screenshots que divulgaram:

E hoje, durante o JavaOne, o pessoal do projeto apresentou o primeiro release dessa biblioteca que promete melhorar e muito o visual dos aplicativos em Java ME. Além disso, é um projeto apoiado pela Sun (interno) e que está sob a licença GPL, porém com o classpath exception, ou seja, você pode usá-lo tranquilamente em aplicações fechadas.
Tem algumas features interessantes:
Ola pessoal,
Seguindo a idéia de apresentar alguns problemas que encontrei no desenvolvimento JME e soluções que utilizei, segue uma funcionalidade que pode ser incorporada a listas e ajudar o seu usuário durante a utilização da sua aplicação. Trata-se de um "tooltip" que é exibido quando o usuário fica um determinado tempo parado "em cima" de um determinado item da lista.
A idéia
A idéia era que quando o usuário ficasse um tempo parado em um item da lista fosse exibido algo onde pudesse ser exibida alguma explicação para o usuário sobre esse item que ele esta "selecionando". Alguns celulares Nokia possuem esse recurso e quando bem utilizado pode trazer um alto grau de usabilidade!
O Exemplo
No exemplo que vou mostrar aqui (e que o código está disponivel), eu optei por utilizar um Alert. Mas, fica ao gosto do fregues! =) E se achar que fica melhor utilizar um Ticker, ou um CustomItem e mostrar um aviso no meio da tela, fique a vontade, eu mostrarei o trecho que você deve alterar! ;-)
A aplicação está dividida em 3 classes (ListTooltipMIDlet, ListSelectionListener e TooltipTimer) que terão o seu funcionamento básico explicado abaixo.
ListSelectionListener
Essa classe, que implementa a interface Runnable, recebe como parametro para seu construtor a instância do Display atual da aplicação e a lista que terá suas ações "controladas" e o tooltip exibido. Essa classe é feita como uma thread pois ela tem que ficar o tempo todo verificando a mudança de seleção da lista.
Sua tarefa consiste básicamente em um loop (eterno) dentro do corpo do método run, que a cada interação é verificado se o indice de seleção da lista foi alterado desde a ultima execução. Caso o indice tenha sido alterado (o usuário mudou de opção dentro da lista), a variável de controle é atualizada, o schedule antigo de exibição é cancelado e uma nova instância da classe TooltipTimer é criada e schedulada para 2 mil milisegundos, ou seja, 2 segundos. Em seguida, a thread recebe o comando de sleep de 500 milisegundos (meio segundo).
TooltipTimer
Essa classe, que extende de uma TimerTask, assim como a ListSelecionListener recebe como parametro do seu construtor a instância do Display e da lista. Essa classe será executada 2 segundos após ela ter sido schedulada na classe ListSelectionListener e caso não tenha seu timer cancelado.
Sua tarefa a ser executada está dentro do método run e, nesse caso, é mostrar um alert com um texto. É justamente esse ponto que você deve alterar caso deseje que ele faça uma ação diferente, como por exemplo atualizar um ticker da sua List, chamar um novo form ou o que você achar interessante! =)
ListTooltipMIDlet
Bom, essa midlet nada mais é que apenas uma simples classe para poder fazer o exemplo funcionar. Aqui eu somente criei uma lista com alguns itens (que chamei de itens), exibi e depois fiz a utilização das classes que criei aqui, através da seguinte linha:
Thread t = new Thread(new ListSelectionListener(Display.getDisplay(this),
itens));
t.start();
Fiquem a vontade para usar o código, modificar ou até ignorar !! =)
Downloads
Projeto completo (Eclipse) com código fonte, clique aqui!
Aplicação exemplo (.jar), clique aqui!
[]s
Neto
Ola pessoal,
Depois de um "longo e tenebroso inverno", consegui um tempinho para voltar a escrever algumas coisas que acho interessante sobre o desenvolvimento de aplicativos para dispositivos móveis, e principalmente utilizando Java ME! :)
E já que o espirito desse blog é passar para vocês algumas das minhas experiências e também soluções que encontro para algumas situações, vou mostrar hoje como resolvi um "problema" de internacionalização para aplicativos em Java ME.