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");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:
fishEyeForm.setLayout(new BoxLayout(BoxLayout.Y_AXIS));
try {
fishEyeForm.setBgImage(Image.createImage("/background.png"));
} catch (IOException e) {}
//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) {Download e código completo
//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);
}
Ola 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");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.
botao.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt) {
//chamada para um método qualquer...
}});
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.