Páginas

Monday, May 30, 2011

Programando para Android com Racket

Numa possível "série" de posts que acaba de começar agora, vou mostrar as várias possibilidades de uso de Racket, a linguagem para criar linguagens.

Uma das coisas fantásticas de Racket é a documentação. Esta pode ser consultada online ou offline quando você instala o ambiente na sua máquina (existem instaladores para Windows, Linux e Mac OS X).

A instalação é fácil veja meu post para mais detalhes. Para escrever nosso programa para Android ou browser vamos usar o Moby, um compilador da linguagem Advanced Student Language (uma das linguagens do Racket) para Javascript/mobile.

Não precisa se preocupar com a instalação do Moby. Ele está disponível no PLaneT, o sistema de distribuição de pacotes do Racket. Isto quer dizer que o DrRacket (uma IDE que vem incluída) vai instalar o Moby pra você no primeiro uso e deixar tudo prontinho...

Ok, então você instalou o Racket, abriu o DrRacket, e agora?
Como sempre, muito fácil.

Para começar, vamos verificar que seu ambiente está funcionando corretamente.
Cole o código abaixo na área de definições:

  #lang planet dyoo/moby:3:10
  "hello world"
  true
  (define (f x) (* x x))
  
  (check-expect (f 42) 1764)
  
  (check-expect (map f '(1 2 3 4 5))
                (list 1 4 9 16 25))

Clique em "Run" (ou use o atalho CTRL+T) e veja o resultado:
Welcome to DrRacket, version 5.1.1 [3m].
Language: planet dyoo/moby:3:9; memory limit: 256 MB.
"hello world"
#t
Running tests...
Both tests passed!
>

A primeira vez pode ser um pouco mais lenta pois o DrRacket vai baixar e instalar o Moby. As outras execuções não precisam de Internet e serão rápidas.

Agora vamos criar dois arquivos:
  • counter.rkt
  #lang planet dyoo/moby:3:10
  (define initial-world 0)
  (big-bang initial-world (on-tick add1))

  • run-counter.rkt
  #lang racket
  (require (planet dyoo/moby:3:10))
  (run-in-browser "counter.rkt")

Agora basta executar o run-counter.rkt clicando no botão "Run".


Pronto, sua primeira aplicação está criada.
Veja como ficou:

Ela é bem simples, só um contador. Mas que funciona no browser e.... e no seu Android!! Se você não tiver um, funciona no do seu amigo...

Para instalar a aplicacão no Android precisamos gerar um pacote. Para isto criamos um outro arquivo, o "build-counter.rkt", com o seguinte conteúdo:

#lang racket
(require (planet dyoo/moby:3:10))
(create-android-phone-package "counter.rkt" "counter.apk")

Este programa vai transformar nosso "counter.rkt" em um pacote para Android "counter.apk".
Pronto!

Sim, pronto! Instale a aplicação no seu Android e divirta-se!

Como ficou no Android?
Como eu não tenho um telefone com Android, baixei a SDK com um emulador e criei um dispositivo virtual para testar.

Baixei o Android SDK pra Linux e extraí num diretório qualquer.
Basta executar o utilitário em tools/android para criar um AVD (dispositivo a ser emulado). Para criar um
AVD é preciso instalar alguma versão da API, na área "Avaiable Packages" eu escolhi "SDK Platform Android 3.1, API 12, revision 2".

Em resumo:

Inicie o dispositivo clicando em "Start".


Para desbloquer a tela use "Page Up" do seu teclado.


Para instalar o nosso aplicativo "counter" no Android, execute este comando num terminal:

rodolfo@lisa:~/Downloads/android-sdk-linux_x86/platform-tools$ ./adb install ~/projects/racket-for-smartphones/counter.apk
1348 KB/s (203114 bytes in 0.147s)
 pkg: /data/local/tmp/counter.apk
Success

Instalado! Clique no menu de aplicações, aquele ícone com vários quadradinhos entre o globo e o fone.


E lá está nossa aplicação counter!!! Clique no ícone para executar.



Minha conclusão é que este procedimento é mais fácil do que o Hello World em Java proposto pelo Android SDK... e já temos algo melhor que um Hello World.

Você tem um Android aí na sua mão? Quer testar? Baixe e instale o pacote counter.apk (200 kB) e me mande uma foto!

[editado 2011/05/30 12:11]
O meu amigo Juan Lopes testou num Android, vejam:


Se você acha que um contador não é tão legal, então pode tentar outros exemplos, e pode também criar sua própria aplicação. O Moby dá acesso a GPS, sensor de movimento, acelerômetro, Internet, e tudo que não tiver lá pode ser estendido.

Para mais informações, veja a documentação oficial do Moby e a página do projeto com slides, material em áudio e vídeo (em inglês).

Futuro
O Danny Yoo está trabalhando em um compilador de Racket para Javascript, o Whalesong, que deve ser integrado ao Moby, substituindo a camada atual de compilação. Feito isto, ele pretende focar novamente em melhorar o Moby.

Agradecimentos
Obrigado ao Danny por ter atualizado o Moby para funcionar corretamente com a versão mais recente do Racket (5.1.1), à equipe PLT por criar o Racket, e à comunidade pelo entusiasmo e prestatividade.

2 comments:

Davi Orempüller said...

Bacana, vou criar uma VM para começar a me aventurar no racket.
Parabéns pelo post

Rodolfo said...

O Racket é mesmo bastante viciante.
A comunidade é muito ativa e receptiva.
Estamos começando mais um canal de comunicação, específico para quem quer se comunicar em Português, seja por dificuldades com o inglês ou para manter a proximidade com os falantes de nossa língua.
Confira:
http://groups.google.com/group/racket-br