quinta-feira, 30 de abril de 2009

Spam e Pulhas virtuais


Olá povo,

Quem me conhece pessoalmente sabe que eu sou um cara bem chato e que me irrito facilmente. Uma das coisas que me deixam irritado são pessoas que enviam aquelas mensagens do tipo: "Passem isso para o maior número de pessoas que você puder".

Hoje mesmo, um ex-aluno me mandou um desses, dei fiz uma pesquisa e... Bingo! Lá estava mais uma pulha virtual repassada para dezenas de pessoas.

Para ajudar aqueles que adoram enviar esse tipo mensagem, segue abaixo o link de um site que tem uma enorme coleção desses tipos de e-mail. E, por favor, não mandem pra mim :)

http://www.quatrocantos.com/

4br4ç05,
nglauber

sexta-feira, 24 de abril de 2009

Instalando uma aplicação Android no G1 - A revanche

Olá povo,

Depois que escreví o post anterior, descobri uma maneira um pouco mais fácil de instalar aplicações Android no G1.

Após conectar o celular na USB do computador e instalar os drivers, basta clicar com o botão direito no seu projeto do Eclipse, Run as Android Application e... Pronto! Se o emulador estiver fechado, a aplicação será executada no aparelho.

Simples não? Palmas para o Google mais uma vez...

4br4ç05,
nglauber

quarta-feira, 15 de abril de 2009

Instalando uma aplicação Android no G1


Olá povo,

Nesse post, vou mostrar como instalar uma aplicação Android no G1 da HTC.
Partam das seguintes premissas:
- Estou usando Eclipse com o plugin do Android
- O Android SDK está instalado e seu caminho está no PATH do Windos
- JAVA_HOME está configurado e pasta bin também está no PATH do windows.

Vamos lá.

1) Baixar os drivers do G1
Faça o download dos drivers do aparelho em:
http://dl.google.com/android/android_usb_windows.zip
Descompacte o arquivo em algum lugar da sua máquina.

2) Conecte o aparelho ao PC
O windows detectará o aparelho, selecione o local onde você extraiu os drivers para instalar o telefone no PC.

3) Gerar o APK
No Eclipse, clique com o botão direito no projeto, selecione "Android Tools | Export Unsigned Application Package".
Selecione o local onde deseja salvar o arquivo APK

4) Gerar a chave (esse passo só é preciso fazer uma vez)
No prompt de comando, digite o seguinte comando:

keytool -genkey -v -keystore "C:\Documents and Settings\[seu usuário]\Local Settings\Application Data\Android\debug.keystore" -alias meuAlias -keyalg RSA -validity 10000

Se for solicitado, uma senha, digite: android.

Ele vai fazer várias perguntas para gerar a chave. Responda cada uma delas.
keytool é uma ferramenta do Java SDK (está na pasta bin).

5) Assinar a aplicação
jarsigner -verbose -keystore "C:\Documents and Settings\[seu usuário]\Local Settings\Application Data\Android\debug.keystore" MinhaApp.apk meuAlias

jarsigner é uma ferramenta do Java SDK (está na pasta bin).

6) Instalar a aplicação
Se você não estiver com o emulador aberto, digite:
adb install -r MinhaApp.apk

Caso esteja com o emulador aberto, você precisará saber o serial de qual dos dispositivos você quer instalar (emulador ou aparelho). Digite o seguinte comando para listar os seriais:
adb devices

E depois só é adicionar o serial no comando:
adb install -s SERIAL -r MinhaApp.apk

adb é uma ferramenta do Android SDK (está na pasta tools).

Espero que vocês tenham conseguido :)

4br4ç05,
nglauber

quinta-feira, 2 de abril de 2009

Aprendendo a tocar flauta

Olá povo,

Segue abaixo um vídeo mostrando uma maneira alternativa de aprender a tocar flauta.
Palmas pra Steve Jobs e seu IPhone.



4br4ç05,
nglauber

segunda-feira, 23 de março de 2009

Inovação Pura

Olá povo,

Recebi esse link, e resolvi compatilhar com vocês. A palavra é realmente essa: Inovação.



4br4ç05,
nglauber

P.S.: Créditos de Jorge Fonseca que enviou o link pra mim. Valeu Jorjão.

sábado, 14 de março de 2009

Associando um JPopupMenu em uma JTable

Olá povo,

Esse vai ser um post curto só pra mostrar como associar um menu popup a uma JTable. Eu precisava alterar e excluir um registro selecionado de uma JTable. Vamos ver como fazer isso.

Primeiro crie um objeto JPopupMenu e adicione dois JMenuItem.

JPopupMenu jPopupMenu = new JPopupMenu();
JMenuItem jMenuItemAlterar = new JMenuItem();
jMenuItemAlterar.setText("Alterar");

jMenuItemAlterar.addActionListener(
new java.awt.event.ActionListener() {
// Importe a classe java.awt.event.ActionEvent
public void actionPerformed(ActionEvent e) {
int index = getJTable().getSelectedRow();
// Faça alguma coisa com o item selecionado
}
});

JMenuItem jMenuItemExcluir = new JMenuItem();
jMenuItemExcluir.setText("Excluir");
jMenuItemExcluir.addActionListener(
new java.awt.event.ActionListener() {
// Importe a classe java.awt.event.ActionEvent
public void actionPerformed(ActionEvent e) {
int index = getJTable().getSelectedRow();
// Faça alguma coisa com o item selecionado
}
});

jPopupMenu.add(jMenuItemAlterar);
jPopupMenu.add(jMenuItemExcluir);

Depois só é exibir o menu popup quando o usuário clicar com o botão direito do mouse.


jTable.addMouseListener(
new java.awt.event.MouseAdapter() {
//Importe a classe java.awt.event.MouseEvent
public void mouseClicked(MouseEvent e) {
// Se o botão direito do mouse foi pressionado
if (e.getButton() == MouseEvent.BUTTON3){
// Exibe o popup menu na posição do mouse.
jPopupMenu.show(jTable, e.getX(), e.getY())
}
}
});

E é só isso!

4br4ç05,
nglauber

sábado, 14 de fevereiro de 2009

J2ME e Bluetooth

Olá povo,

Uma das coisas mais legais de se desenvolver aplicações e jogos para celulares é a mobilidade que eles nos proporcionam. Uma tecnologia que está cada vez mais presente nos celulares mais populares no Brasil é o Bluetooth. Por isso, hoje vou falar um pouquinho sobre como desenvolver aplicações com essa tecnologia em Java ME.

Bluetooth é uma tecnologia utilizada para criar pequenas redes sem fio, também chamadas de WPANs (Wireless Personal Area Network). O alcance das redes Bluetooth normalmente é de 10 metros. Não vou filosofar muito sobre a pilha de protocolos, potências, etc. Informações mais detalhadas acesse o site oficial da tecnologia Bluetooth.

Antes de qualquer coisa precisaremos saber se o dispositivo para qual iremos desenvolver suporta a JSR-082. É ela que define o uso da tecnologia Bluetooth com Java ME. Consulte o site do fabricante para obter essa informação. Caso seu telefone não implemente essa JSR, você poderá testar esse exemplo no WTK.

O esquema abaixo demonstra como é estabelecida uma conexão entre dispositivos Bluetooth.



Note que primeiramente devemos estabelecer quem é o servidor. Ele ficará visível para que outros dispositivos o encontrem, aguardará por clientes e os proverá um serviço. O cliente por sua vez terá mais trabalho. Ele primeiro procurará por dispositivos (inquiry) disponíveis em sua área de alcance. Esses podem ser mouses, teclados, antenas ou qualquer outro dispositivo Bluetooth. Após obter essa lista de dispositivos, escolheremos um e verificaremos se ele está disponibilizando o serviço que nos interessa. Se estiver, a conexão entre os dois será estabelecida.

Agora, mãos à obra! Vamos listar agora as classes mais importantes do pacote javax.microedition.bluetooth.*:



LocalDevice - Representa o dispositivo Bluetooth local. É um singleton que pode ser obtido pelo método getLocalDevice(). Com ele podemos, entre outras coisas, dizer se o nosso aparelho será visível para os outros dispositivos, obter o endereço ou o nome do seu dispositivo Bluetooth entre outras.

LocalDevice myPhone = LocalDevice.getLocalDevice();
System.out.println(myPhone.getFriendlyName());

DiscoveryListener - Interface que é notificada quando os eventos de busca de dispositivos e serviços acontecem. Ela tem quatro métodos:

/*
Método chamado quando um dispositivo é econtrado.
Devemos armazenar (em um Vector por exemplo) o
remoteDevice para podermos buscar pelo serviço.
*/
void deviceDiscovered(RemoteDevice remoteDevice,
DeviceClass deviceClass);

/*
Método que é chamado quando a busca de dispositivos
termina.
discType - indica o resultado da busca:
INQUIRY_COMPLETED - Busca terminada com sucesso.
INQUIRY_TERMINATED - Busca cancelada.
INQUIRY_ERROR - Erro na busca.
*/
void inquiryCompleted(int discType);

/*
Método chamado quando a busca do serviço termina.
transID - Id da transação de busca pelo serviço
respCode - indica o resultado da busca:
SERVICE_SEARCH_TERMINATED - Busca cancelada.
SERVICE_SEARCH_ERROR - Erro na busca.
SERVICE_SEARCH_NO_RECORD - Dispositivo não tem o
serviço solicitado.
SERVICE_SEARCH_DEVICE_NOT_REACHABLE - Dispositivo
remoto está fora do alcance.
SERVICE_SEARCH_COMPLETED - Serviço encontrado com
sucesso.
*/
void serviceSearchCompleted(int transID, int respCode);

/*
Método chamando quando o serviço procurado é encontrado.
transID - Id da transação de busca pelo serviço
serviceRecord - informações do serviço encontrado.
*/
void servicesDiscovered(int transID, ServiceRecord[] serviceRecord);

DiscoveryAgent - Obtido através da instância do LocalDevice é o responsável por realizar a busca de dispositivos remotos na área de alcance do dispositivo local e de localizar o serviço no dispositivo remoto.

DiscoveryAgent agent = myPhone.getDiscoveryAgent();
agent.startInquiry(DiscoveryAgent.GIAC,
classeQueImplementeDiscoveryListener);

Com a chamada do startInquiry, cada vez que um dispositivo for encontrado a classe que implementa DiscoveryListener será notificada através do método deviceDiscovered. E quando o inquiry terminar o método inquiryCompleted será chamado.

RemoteDevices - representa um dispositivo Bluetooth remoto. Objetos dessa classe são retornados quando se realiza um inquiry (busca por dispositivos). Então devemos armazena-los em memória para que possamos fazer a busca de serviços com esse objeto através do objeto discoveryAgent.

agent.searchServices(null, uuidSet, remoteDevice,
classeQueImplementeDiscoveryListene);

Com a chamada desse método, quando o serviço procurado for encontrado a classe que implementa DiscoveryListener será notificada através do método servicesDiscovered, e quando a busca por serviços terminar o método serviceSearchCompleted será chamado.

Abrindo uma conexão (Servidor)
Lembrando que toda conexão utilizando GCF (Generic Connection Framework) deve ser feita em uma Thread separada, segue abaixo um trecho de código que abre uma conexão servidora e fica aguardando por conexões de clientes.

localDevice = LocalDevice.getLocalDevice();
int initialDiscoveredMode =
localDevice.getDiscoverable();
localDevice.setDiscoverable(DiscoveryAgent.GIAC);

StreamConnectionNotifier notifier =
(StreamConnectionNotifier) Connector.open(
"btspp://localhost:0000000000000000000BE3125CDAE");
connection = notifier.acceptAndOpen();
execute(connection);

Antes de abrir a conexão, o dispositivo é colocado em modo de descoberta para que outros possam encontra-lo. Depois é aberta a conexão servidora (localhost) utilizando "btspp" que é o protocolo de comunicação (BlueTooth Serial Port Profile). O número gigante :) após os ":" é o identificador do serviço UUID. O método execute trata os dados vindos do outro dispositivo. Segue abaixo o seu código:

protected void execute(StreamConnection conn){
try {
os = connection.openDataOutputStream();
is = connection.openDataInputStream();
String message;
while (true){
message = is.readUTF();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//closeStreams();
}
}

"os" e "is" são atributos da classe e devem ser um DataOutputStream e um DataInputStream.
Por último, o método que envia as mensagens:

public void send(String message){
try {
os.writeUTF(message);
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
}

Bem pessoal, esse é só um aperitivo. Quem quiser saber mais, postem suas dúvidas.

[Editado]
Atendendo aos comentários, um exemplo bem simples pode ser baixado aqui.

[Editado 2]
E neste link vocês podem baixar um exemplo mais simplificado e comentado (mas precisando de algumas melhorias) do exemplo anterior.

4br4ç05,
nglauber