segunda-feira, setembro 24, 2007

Gtalk: dicas de formatação

Dicas de formatação no Gtalk (Google Talk)

Para deixar negrito: *texto negrito*
Para deixar itálico: _texto itálico_
Para pular uma linha: shift+enter

É interessante que podemos "simular" uma conversa...suponha que seu amigo chame João. Envie a seguinte mensagem para ele (de uma vez só):
oi jao!
*João:* td bom?
*me:* td!
*João:* tenho q ir...
*me:* até...
Ficará assim:

me: oi jao!
João: td bom?
me: td!
João: tenho q ir...
me: até...

UPDATE (28/01/08): a formatação também funciona nos status do user.

Fotos nos servidores do Google

Hoje queria relaxar na hora do almoço e decidi fuçar no sistema de fotos do Orkut e Gtalk, e por enquanto descobri o seguinte:

ORKUT

A foto da pessoa é acessada por URLs como a seguinte:
http://img2.orkut.com/images/medium/0/85500000.jpg
Que tem a estrutura:
http://imgSERVIDOR.orkut.com/images/TAMANHO/BLA/ID.jpg
Onde:
  • SERVIDOR: número que varia de 1 a 4. Os pings mostram que realmente possuem IPs diferentes, exceto pelo 1 e 4, que são idênticos.
  • TAMANHO: informa qual o tamanho da foto. Pode ser small ou medium (se vc descobrir outro me fala!).
  • BLA: não sei pra que serve...ponha qualquer número.
  • ID: o id da foto, isto é, seu número identificador. O número 1 é a foto do próprio criador do orkut. Pq será? :P .....e no momento, o maior número que funciona, está próximo de 105 milhões! (104.900.000)

GTALK

A foto do usuário é acessada em URLs como a seguinte:
http://mail.google.com/mail/photos/email@gmail.com
Vale notar que é preciso estar logado para receber a foto. Além disso,
a pessoa deve ser estar cadastrada como amiga no seu Gtalk.

quarta-feira, setembro 19, 2007

LaTeX: adicionando pacotes

Estava tentando usar um modelinho da ACM para gerar um artigo no Kile e deu o seguinte erro:
../modelo/acm_proc_article-sp.cls:35:File `amssymb.sty' not found. \usepackage
Eu instalei o pacote "texlive" e tudo foi resolvido
$ sudo apt-get install texlive
obs1: ah, se mesmo assim algum pacote faltar, vá no site da CTAN e baixe manualmente. Basta deszipar o pacote, dar make e mover o arquivo .sty gerado para o diretório do .tex.

obs2: alguns pacotes não tem makefile, então vc precisará criar o .sty no braço. Para isso, baixe o .dtx e o .ins. Para criar o .sty, faça:
$ tex pacote.ins
obs3: se vc se irritar e cansar de ficar criando um por um, vc pode instalar o pacote texlive-full, que irá instalar MUITA coisa! São 326 MB de download, mas provavelmente irá parar de dar pau :
$ sudo apt-get install texlive-full

obs4: se der pacote não encontrado, coloque os repositórios que estão aqui.

É isso.

terça-feira, setembro 11, 2007

Snippet em Java: urlencode

import java.net.URL;
import java.net.URLEncoder;

/*
* codifica valores para serem passados pela url
*/
public static String _urlEncode(String valor) {

String retorno = "";

try {

retorno = URLEncoder.encode(valor, "UTF-8");

} catch (Exception e){}

return retorno;

}


Se foi útil, deixe um comentário vai!
(não precisa autenticar)

segunda-feira, setembro 10, 2007

Snippet em Java: lendo uma página web e colocando numa string

(obs: selecione o texto e dê copiar e colar, caso queira ler a parte cortada)

import
java.io.*;
import java.net.URL;
import java.io.DataInputStream;

/*
* Acessa uma URL e retorna uma string contendo a página
*/
public static String getURL(String endereco) {

String retorno = "";
String temp = "";

try {
URL url = new URL(endereco);
BufferedReader pagina = new BufferedReader(new InputStreamReader(url.openStream()));

while( (temp = pagina.readLine()) != null ) retorno = retorno + temp + "\n";

pagina.close();

} catch(IOException e) {
e.printStackTrace();
}
return retorno;
}

Snippet em Java: lendo a primeira linha de um arquivo

try {
BufferedReader in = new BufferedReader(new FileReader("arquivo.txt"));
String linha = in.readLine();
in.close();

} catch (IOException e) {
System.out.println("Erro!");

}

sexta-feira, setembro 07, 2007

Reinstalando apache e php no kubuntu 7.04

Bom, antes de tudo: é uma reinstalação que apaga todas as configurações que você fez. Serve pra quando vc quer voltar ao apache que "vem de fábrica".

Para remover:
$ sudo apt-get remove --purge apache2 apache2-common php5
$ sudo apt-get clean
(o --purge que irá apagar os arquivos de configuração)
Para colocar tudo de novo:
$ sudo apt-get install apache2 php5
Por fim, informamos o apache que ele deve processar os arquivos .php, ao invés de fazer a burrice de dar o nosso código-fonte php de bandeja pra quem visita o site, através do download de arquivos .phtml!
$ sudo ln /etc/apache2/mods-available/php5.* /etc/apache2/mods-enabled -s
$ sudo /etc/init.d/apache2 restart
Ah, não esqueça de limpar o cache do firefox ao fazer os testes....o reload irá continuar te enviado o .php caso o cache não seja limpo.

É isso.

Criando e matando um processo em background

Suponha que vc tenha um script que execute um programa e deixa-o em background, o que é muito comum quando se quer deixar um processo rodando eternamente em um servidor.

Para executar o programa, crie um arquivo texto assim:

1 meu_programa &
2 echo "$!" > pid.txt;
Bom, a primeira linha executa o programa chamado "meu_programa" e libera o terminal, indicado pelo caracter "&". Sem esse símbolo, assim que vc fechar o terminal (ou ssh) o processo também morrerá.

A segunda linha é mais interessante: o comando echo irá criar um arquivo chamado "pid.txt" e colocará dentro dele o pid do último processo que foi para o background. Isso é indicado pelos sinais "$!". Assim, temos armazenado qual o pid do processo que executamos na linha 1.

Bom, agora basta criar um segundo script, que irá matar aquele processo específico, caso esteja rodando. Abra um novo arquivo em um editor de texto e ponha isso:
1 if [ -f pid.txt ]; then
2 echo Matando processo com PID $(cat pid.txt)...
3 kill $(cat pid.txt)
4 rm pid.txt
5 fi
A linha 1 verifica se o arquivo "pid.txt" existe. Caso isso ocorra, significa que o processo deve estar rodando. O comando "$(cat pid.txt)" irá ler o conteúdo do arquivo, pelo comando cat. O resultado, que é o número do processo, é enviado para o "comando de fora", o kill, que irá encerrar o processo. Por fim, o rm apaga o arquivo, já que o processo foi encerrado.

É isso.

Bot para Gtalk, em java

Fala gente,

Estou pesquisando sobre bots e precisei implementar um em java. Este programa conecta-se em um servidor do google talk e fica on-line eternamente, aguardando mensagens dos usuários. Para fins didáticos, ele apenas retorna o número informado, multiplicado por 2.

O programa extra que vc precisa baixar pra tudo isso funcionar, é a API Smack (v. 3.0.4), que encontra-se aqui. (após descompactar, vamos precisar apenas do smack.jar e smackx.jar)

Ponha o código-fonte abaixo num arquivo chamado Botsd.java. Coloque os dois .jar e o .java na mesma pasta e compile e execute:
$ javac -cp '.:smack.jar:smackx.jar' *.java
$ java -cp '.:smack.jar:smackx.jar' Botsd

Pronto! Vc já tem seu bot! Ah, obviamente mude o email e a senha que estão dentro do arquivo.

Obs: se quer mais informações sobre como utilizar uma API que vem num .jar leia isso.

Código-fonte:

/*
* Mantém um bot para gtalk
*/

import org.jivesoftware.smack.*;
import
org.jivesoftware.smack.packet.Presence;
import
org.jivesoftware.smack.packet.Packet;
import
org.jivesoftware.smack.packet.Message;
import
org.jivesoftware.smack.PacketListener;
import
org.jivesoftware.smack.filter.PacketFilter;
import
org.jivesoftware.smack.filter.PacketTypeFilter;
import
org.jivesoftware.smack.Chat;
import
org.jivesoftware.smack.XMPPException;
import
org.jivesoftware.smack.ConnectionConfiguration;
import
org.jivesoftware.smack.XMPPConnection;

public class Botsd {

static XMPPConnection conexao;

public Botsd() {}

public static void main(String args[]) {


// strings
String servidor = "talk.google.com";
Integer porta = 5222;
String servico = "gmail.com";
String usuario = "meu_usuario_do_gmail_sem_arroba";
String senha =
"minha_senha";

// configs do gtalk
ConnectionConfiguration config =
new ConnectionConfiguration(servidor, porta, servico);
config.setSASLAuthenticationEnabled(
true);
config.setReconnectionAllowed(
true);
conexao =
new XMPPConnection(config);

// tentando conectar
System.out.println(
"[ .... ] Tentando conectar... ");

try {
conexao.connect();
System.out.println(
"[ OK ] Conectado.");

// tentando logar
System.out.println(
"[ .... ] Tentando logar...");

try {
conexao.login(usuario, senha);
System.out.println(
"[ OK ] Logado.");

// envia presenca
System.out.println(
"[ .... ] Atualizando presenca e status...");
Presence presenca =
new Presence(Presence.Type.available);
presenca.setStatus(
"Oi gente!");
conexao.sendPacket(presenca);
System.out.println(
"[ OK ] Atualizado.");

PacketFilter meuFiltro = new PacketTypeFilter(Message.class);

conexao.addPacketListener(criaListener(), meuFiltro);

try {

// loop infinito, aguardando mensagens...
System.out.println(
"[ .... ] Ouvindo...");

while(true) {
Thread.sleep(1000);
}

} catch (Exception e) {};

} catch (XMPPException e) {
System.out.println(
"[ ERRO ] Nao consegui logar!");
}

} catch (XMPPException e) {
System.out.println(
"[ ERRO ] Nao consegui conectar no servidor!");
}

}

/*
* Aqui esta definido o metodo que ira manipular as mensagens recebidas...
*/

public static PacketListener criaListener() {
PacketListener meuListener = new PacketListener() {
public
void processPacket(Packet pacote) {
// pega dados relevantes

String mensagem = ((Message)pacote).getBody();
String origem = pacote.getFrom();

Integer resultado = Integer.parseInt(mensagem) * 2;
String retorno = mensagem+" * 2 = "+resultado;

enviaMensagem(origem, retorno);
}};
return meuListener;
}


/*
* Envia mensagem para o destino especificado...
*/

public static void enviaMensagem(String destino, String mensagem) {
MessageListener meuMessageListener;
meuMessageListener =
new MessageListener() {public void processMessage(Chat chat, Message message) {}};
Chat chat = conexao.getChatManager().createChat(destino, meuMessageListener);
try {
chat.sendMessage(mensagem);
}
catch (XMPPException e) {
System.out.println(
"[ ERRO ] Nao consegui enviar mensagem para "+destino);
}
}

}



Obs: se lhe foi útil, deixe um comentário, por favor...
Obs2: tentei identar o código, mas o blogger tirou tudo...

quarta-feira, setembro 05, 2007

Instanciando uma classe que está num .jar

Mais uma dica que pode poupar-lhe algum tempo: suponha que vc tem um .jar, cheio de classes lá dentro e quer usá-las. O que fazer?

Primeiro vc precisa saber o caminho das classes, então digite isso, na pasta do arquivo.jar
$ jar -tvf arquivo.jar
(irá mostrar os caminhos para os .class)
Depois, vá no seu HelloWorld.java (seu código-fonte), e dê um import, tipo esse:
import org.jivesoftware.smack.*;
(coloque o caminho retornado pelo comando anterior, trocando as "/" por ".")
Como nem tudo é perfeito nesse mundo, e vc não pode simplesmente dar include, como quem usa php, então vc deve falar sobre o .jar na hora de compilar e na hora de executar...

Para isso compile, acrescentando o -cp (que sobrepõe o classpath atual)
$ javac -cp ".:arquivo.jar" HelloWorld.java
(neste caso, tudo deve estar na mesma pasta)
E para rodar, faça isso:
$ java -cp ".:arquivo.jar" HelloWorld
Importante notar: na hora do "-cp" não troque o ":" por ";"...vc perderá duas horas com os paths definidos de maneira errada...

Instalando java no Kubuntu

Ok, vc quer programar em java, dá o famoso comando javac e aparece comando não encontrado? Antes de tudo, verifique se comando não está em alguma pasta escondida:
$ sudo updatedb
(irá atualizar a lista de arquivos que existentes)

$ sudo locate javac | grep bin
(irá mostrar todos os arquivos chamados javac, que tenham "bin" no caminho)
Caso não exista, no kubuntu 7.04, basta digitar:
$ sudo apt-get install sun-java5-jre
(para executar os programas)

$ sudo apt-get install sun-java5-jdk
(para compilar os programas)
Ele irá baixar uns 50 MB e voa-lá! Tudo deve dar certo...

Mas se a lei de Murphy estiver a todo vapor, na hora de executar, com o comando java, dará um erro parecido com:
Exception in thread "main" java.lang.UnsupportedClassVersionError: Programinha (Unsupported major.minor version 49.0)
Eu não estou com tempo pra ver o que é isso....mas se vc digitar
$ sudo update-alternatives --config java
Irão aparecer várias alternativas...bom, no meu caso apareceram 4 "javas" para serem utilizados. Vc pode chutar um por um e ver quando dá certo...eu escolhi o
/usr/lib/jvm/java-1.5.0-sun/jre/bin/java
E agora funfa!

Obs1: se foi útil pra vc, me avise...
Obs2: se falei besteira, me avise tbm...java não é meu forte...

Aquele abraço!