terça-feira, 29 de novembro de 2011

(re)gerando build.xml de um projeto Android

Pode ser que, ao pegar um projeto criado no Eclipse para o Android, o projeto gerado não tenha alguns arquivos necessários para trabalhar via CLI - seu professor pode não tê-los incluído, por exemplo ;). O build.xml e o local.properties são necessários para usar o "ant" no projeto. É possível, entretanto, gerá-los. Basta o comando:
android update project --path <caminho> --name <nome> --target <versão>
<caminho> é o path para o projeto. Os demais parâmetros podem ser conferidos no post Hello Android World

terça-feira, 16 de agosto de 2011

Usando o Log no Android

No meio do desenvolvimento, certamente você precisará de algumas informações pra descobrir o que está acontecendo de errado. O SDK do Android tem uma ferramenta de log que pode ser usada facilmente.

No código, só é necessário incluir, em pontos estratégicos, uma chamada para a classe estática "Log":

Log.d("MyTAG", "message");
Para "ouvir" o log, é necessário executar o seguinte comando:
$ adb logcat
Também é possível usar uma variável de ambiente para filtrar as mensagens pela TAG: ANDROID_LOG_TAGS
export ANDROID_LOG_TAGS="ActivityManager:I MyTAG:D *:S"
"ActivityManager" são os logs de atividades do Android. Serão mostradas mensagens de informação (o "I" indica isso).
"MyTAG" é a TAG que interessa, com mensagens de debug (o "D") ;)
O asterisco é para silenciar (S) todas as demais mensagens.

O valor dessa variável pode ser sobrescrito via linha de comando:
$ adb logcat MyTAG:D *:S
Com isso, a variável de ambiente é completamente ignorada.

Mais informações:
$ adb logcat --help
http://developer.android.com/reference/android/util/Log.html
http://developer.android.com/guide/developing/tools/logcat.html

terça-feira, 9 de agosto de 2011

Hello Android World

Depois de anos, reativando o blog com um post sobre o Android...

Comprei um Nexus S, da Samsung e pretendo criar algumas apps pro Android. O emulador do Android é muito (muito mesmo) lento. Então, a ideia é usar um dispositivo "real" pra testes e debug.

Instalando o SDK
Primeiro, as dependências: precisa instalar o Java (estou usando o OpenJDK 1.6.0_22 e o ant). Use o yum ou o apt, funciona! ;)
 
Depois, é necessário instalar o SDK do Android, que está disponível em http://developer.android.com/sdk/. No Linux, primeiro precisa baixar e descompactar em algum lugar.

Eu baixei e descompactei em /home/rodolfo/source/android/android-sdk-linux_x86.

Depois, é necessário instalar a versão da API que se quer usar. Para isso, executamos "android" que está na pasta "tools".



Seguindo a interface, acesse "Available Packages" e  marque a versão do Android no celular. Atualmente, a última para celulares (a 3.* é para trablets) é o "SDK Plataform Android 2.3.3, API 10, revision 1".

Atenção para o número 10 da API, será útil no futuro. Espere o download e era isso. :)

Tipos de Aplicações no Android
  • Activities => interface gráfica onde o usuário pode interagir
  • Services => parte/software que fica executando em segundo plano
  • Broadcast Receivers => aplicações que respondem a determinados eventos, como receber um SMS, por exemplo. 
No nosso "HelloWorld", vamos criar uma "Activity", com um texto "HelloWorld" na tela. Simples assim.

Ajustando o ambiente
Como não pretendo usar o eclipse, uma dica é configurar o shell para usar diretamente os comandos do SDK.

export PATH="$PATH:/home/rodolfo/source/android/android-sdk-linux_x86/tools:/home/rodolfo/source/android/android-sdk-linux_x86/platform-tools"
Lembre-se de ajustar o path para onde você descompactou o SDK. ;)


Criando o projeto

No shell:
android create project -t 10 -k meu.HelloWorld -a HelloWorld -n myHelloWorld --path ./myHelloWorld
Os parâmetros:
  • -t , onde o é o nro que está na API, quando instalamos
  • -k indica o nome do projeto, que sempre precisa ter 2 palavras, separadas por "." (deve ser culpa do Java).
  • -n indica o nome da atividade. Quando vc instalar a app no celular, é esse o nome que vai aparecer no menu do android.
  • --path é o local onde os arquivos do projeto serão criados
O projeto, obviamente, não faz nada. Vamos alterar só pra escrever o HelloWorld na tela.


O primeiro código

No "path" do projeto existe uma pasta "src" que - obviamente - contém os fontes. Lá dentro, edite o arquivo HelloWorld.java:

package meu.HelloWorld;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class HelloWorld extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        TextView tv = new TextView(this);
        tv.setText("Hello, Android!");
        setContentView(tv);
    }
}
Sem muitas explicações, vamos logo rodar isso...


Compilando...
Voltando ao path do projeto, execute:
ant debug
Sim, por enquanto, debug ativo. E só.
O ant já cria, no diretório "bin" do projeto, os arquivos .apk para serem instalados.


... configurar o celular...
É preciso habilitar o celular para rodar aplicações de fora do Android Market. Isso fica nos ajustes (settings) do celular.
E mais algumas configurações que podem ser encontradas em http://developer.android.com/guide/developing/device.html
 
... e rodar!
No projeto, é só executar
ant install
A aplicação será transferida para o celular. A partir de agora, só precisa clicar nela pra tudo sair funcionando..


Melhor que usar o eclipse, né!? ;)




Fontes:
http://developer.android.com/guide/developing/device.html
http://blogs.nitobi.com/joe/2010/03/26/android-without-eclips/

sábado, 30 de outubro de 2010

RailsRumble 2010

Já faz um bom tempo que terminou (foi no final de semana dos dias 16 e 17 de Outubro), mas os resultados ainda estão aí. Participei do RailsRumble convidado pelo @juliogreff. A meta: programar alguma coisa usando RoR em 48h. Detalhe: nem eu, nem ele tínhamos feito nada em Rails antes da equipe Nuby on Rails (que contava com o talento do @rafaelmarin e do @herminiotorres).

A aplicação também foi ideia do Júlio: http://choons.fm. É uma rede social para bons ouvintes (de boa música).


A experiência foi incrivelmente única. Eu não acreditava que a gente conseguiria terminar, mas conseguimos. A estratégia não foi das melhores: Extreme Go Horse (extreme). Talvez por isso o código precise ser refeito... e eu disse talvez... haha

Falando sério, passar 48h programando, dormindo pouco e sob pressão pode não parecer muito divertido, mas o aprendizado no processo foi grande. É muito bom colocar em prática o que foi lido no Caindo na Real (ou Getting Real) - que agora tem nova versão chamada Rework. Acaba dando muita energia para discutir nas reuniões e pra querer mudar o rumo das coisas...

E acontece de às vezes querer pedir demissão, né Júlio?!

Ah, só pra constar: ficamos em 3º lugar (atrás do BeerCheckIn e do Owe Me Cash) na classificação geral, de 180 equipes que conseguiram terminar em 48h, de 300 equipes que se inscreveram. Nada mal para marinheiros de primeira viajem, não?! :)


Então: recomendo pra todo mundo participar, mesmo que não saiba nada de RoR. E mesmo que não consiga terminar a app, o que se aprende vai muito além do código-fonte!

domingo, 3 de outubro de 2010

Primeiros passos com RoR

Comecei a ver RoR seguindo o Getting Started. Tive um problema logo no começo. Foi ao usar o console:

rodolfo@rodolfoNote:~/RoR/blog$ rails console/opt/RoR/ruby/lib/ruby/1.9.1/irb/completion.rb:9:in `require': no such file to load -- readline (LoadError)
from /opt/RoR/ruby/lib/ruby/1.9.1/irb/completion.rb:9:in `<top (required)>'
from /opt/RoR/ruby/lib/ruby/gems/1.9.1/gems/railties-3.0.0/lib/rails/commands/console.rb:3:in `require'
from /opt/RoR/ruby/lib/ruby/gems/1.9.1/gems/railties-3.0.0/lib/rails/commands/console.rb:3:in `<top (required)>'
from /opt/RoR/ruby/lib/ruby/gems/1.9.1/gems/railties-3.0.0/lib/rails/commands.rb:20:in `require'
from /opt/RoR/ruby/lib/ruby/gems/1.9.1/gems/railties-3.0.0/lib/rails/commands.rb:20:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'

A solução foi encontrada em http://snippets.aktagon.com/snippets/57-Solution-to-require-no-such-file-to-load-readline-LoadError-problem, mas a solução não foi suficiente:

root@rodolfoNote:/opt/RoR/src/ruby-1.9.2-p0/ext/readline# ruby extconf.rb 
checking for tgetnum() in -lncurses... yes
checking for readline/readline.h... no
checking for editline/readline.h... no

O script indica que não encontrou o "readline.h". A solução é instalar o pacote libreadline6-dev via apt e repetir o processo. Essa falha não acontecerá se essa lib estiver instalada no momento de compilar o ruby. :)

Depois, é só tocar ficha:

cd /ruby-1.9.2-p0/ext/readline
ruby extconf.rb
make
make install

Por hoje é só. Logo posto mais resultados... :)

terça-feira, 7 de setembro de 2010

...mas a Dell também acerta!

(essa é a parte 2 - a parte 1 é "A Dell também erra")
Finalmente!

Ontem - segunda-feira, véspera de feriado - 2 semanas depois de reportar o problema para a Dell, um técnico foi até o meu local de trabalho - já que eu estava trabalhando - e trocou a placa-mãe do notebook. Tudo funcionando: agora, depois de 2 notebooks e 5 placas-mãe, tenho um notebook que não aquece (chu*a HP!) e que também desliga!

O atendimento foi feito por uma empresa chamada Unisys e levou 1h e 15min, mais ou menos. O cara desmontou o notebook inteiro! (pena não ter uma câmera pra tirar fotos).

O notebook apresentou defeito, mas não fiquei nem um dia sem ele graças à garantia que a Dell oferece. Realmente muito bom e vale a pena, bem diferente dos notes HP comprados em lojas, que deixam o cliente sem por mais de 2 meses...

O único porém foi o técnico não ter os relatórios de atendimento e precisar usar uma impressora ali. Mas tudo bem, quando eu era técnico fazia dessas também...


Parabéns, Dell. Conseguiu um cliente e várias recomendações.

segunda-feira, 30 de agosto de 2010

A Dell também erra

Faz um tempo que meu notebook Dell tem um problema: ele não desliga. No Windows e no Linux, acontece a mesma coisa: ao desligar, ele faz um "desliguei-na-pegadinha-do-malandro" (créditos pra @vanemaster) e reinicia.

Liguei para a Dell, no 0800, passei todas as informações (incluindo o nro de série, pra não ter problema ao identificar o notebook). Como a garantia é no local (toma HP!), é o técnico da Dell que vem até o notebook, não o contrário. Isso foi na segunda-feira, dia 23. A solução dada pelo atendente: substituição da placa-mãe (de novo?! nããããããão!)

No dia seguinte, me ligam e agendam a visita. Ficou para quinta-feira, dia 26. Até aqui, nota 10 pro atendimento. O ideal seria notebook sem problema, mas o pós-venda está muito bom.

No dia 26 aparece o técnico. E adivinha? Sim, a Dell também erra: mandaram a placa-mãe de outro modelo. O técnico tentou uma atualização de BIOS e mais umas configurações, mas nada feito. Um novo atendimento será realizado.

Hoje, dia 30, uma semana depois do primeiro contato, fui no chat da Dell perguntar pq ainda não entraram em contato. Depois de espera - o atendente precisou pedir ajuda para o coordenador - veio a resposta:

Senhor, infelizmente não temos a peça para o seu equipamento no Brasil
O chamado esta aberto, mas será necessário aguardar a vinda de uma peça do exterior.

Perguntei quanto tempo ia levar... Sem esperanças, mas perguntei. A resposta:

Não tenho como lhe informar senhor.
Pois depende da fabricação.

No fim, mesmo com a espera, estou satisfeito com o atendimento. O notebook funciona e eu não preciso ficar sem ele até conseguirem as peças...

Só 1 coisa a declarar: HP nunca mais!