Quinta-feira, Outubro 01, 2009

Google Maps no metrô do Rio de Janeiro

Quando vinha para o trabalho hoje e passava pela Av. Republica do Chile, vi um "balão" sobre uma das saídas da estação Carioca do metrô e logo pensei que fosse uma propaganda do Google Maps (já tinha visto dentro da estação uns cartazes informando que o Google Maps agora tem informações sobre o transporte coletivo do Rio, etc.).

Na hora do almoço passei por ali e é mesmo uma propagada do Google Maps:


Google Maps in Rio's subway

Google Maps in Rio's subway



Meus álbuns no Flickr: http://www.flickr.com/photos/jeanjmichel/
Meu álbuns no Twitpic: http://twitpic.com/photos/jeanjmichel

Adicionar esta notícia no Linkk

Quinta-feira, Agosto 06, 2009

Twitter fora do ar

Para quem, como eu, usa frequentemente o serviço de micro-blogging Twitter, viu hoje que o serviço ficou indisponível.

No blog oficial do Twitter foi informado que o site foi atacado, blábláblá que eles trabalhavam para restaurar o serviço blábláblá acusaram os xiitas iranianos, não to brincando, não acusaram ninguém ;) e falaram que se tratava de um "denial-of-service attack" ("ataque de negação de serviço"), mas o site voltou a funcionar um pouco lento em menos de 1h, se não me engano.

Esse tipo de ataque é de força bruta, como visto nos links a cima, e conversando com amigos sobre o ocorrido com o Twitter mostrei como "fazer" o mesmo, congelando a máquina de um colega de trabalho. O comando é conhecido como ping da morte ;)

Hoje em dia muitos sistemas operacionais não sofrem mais desse mau, mesmo roteadores, switches e placas de rede já contam com mecanismos de defesa para esse tipo de ataque. Ainda existem empresas que vendem soluções para isso.

Assusta-me pensar que sites do tamanho do Twitter estejam vulneráveis a esse tipo de ataque, mas tratá-lo não é uma tarefa fácil (como diz um amigo "não é como peidar dormindo") e desafia muita gente por aí.

Não faltou gente comento a notícia no G1 falando que é um absurdo as pessoas darem importância para esse tipo de site assim como para o Orkut blábláblá. Uma coisa é fato, as redes sociais já estão fazendo parte do nosso cotidiano, seja para achar amigos nos sites de relacionamento seja postando um "tweet" dizendo "estou no banheiro".

E segue a vida com Twitter no ar novamente e um clientezinho novo para postar direto do iPhone chamado Tweetie ;)

Adicionar esta notícia no Linkk

Quarta-feira, Julho 15, 2009

Mas é bom esse iPhone!!! :)

Esses dias achei o Twitterrific que me permite postar no Twitter direto do iPhone me dando uma gama enorme de funcionalidades muito legais que encurtam, e muito, as mil voltas que as vezes se tem que dar para fazer algumas coisas no Twitter, como postar uma imagem, por exemplo.

Quando quero postar uma imagem eu posso abrir a minha galeria de imagens do iPhone para escolher a imagem que quero usar ou inicializar a câmera do iPhone para tirar uma foto. Depois da imagem escolhida ou da foto tirada, ele posta no Yfrog a imagem e anexa a URL da mesma na minha nova postagem. Tudo isso automáticamente e sem que eu tenha que me cadastrar no Yfrog previamente caso eu nunca tenha usado esse cara antes.


Também posso postar mensagens com a minha localização atual que aparecerá como um link para o Google Maps exibindo minha localização. O Twitterrific usa o aplicativo Google Maps do iPhone para obter a minha posição atual (já aviso que ele erra feio as vezes). Não sei se no iPhone 3G e 3GS ele usa o GPS ou não para obter a posição atual do telefone, o que, em tese, eliminaria o problema de errar a localização atual como ocorre com a triangulação de antenas feita pelo aplicativo do Google para o iPhone. Quem souber comenta ai dizendo, por favor.


Eis que hoje eu acho o BlogWriter em que eu posso postar direto aqui no Blogger (ele se integra com muitas ferramentas de blog como o WordPress) as minhas palavras mal escritas diretamente do iPhone também :)

Ainda agrega feeds, e deve ter mais algumas coisas que eu nāo explorei ainda.

Só que a versāo lite (free) tem umas limitações, mas já está pra lá de bueno poder atualizar o blog de qualquer lugar :)

Esse post foi escrito direeeeeetamente do BlogWriter hehehe.

Era isso p-pe-ssoal.

Adicionar esta notícia no Linkk

Terça-feira, Julho 14, 2009

Tirando as teias de aranha desse blog!

Tirando as teias de aranha desse blog!

Muito tempo, muito mesmo que eu não passo por aqui para escrever alguma coisa, mas nesse tempo todo que se passou muita coisa deu mudou: mudei para outra/outro cidade/estado, estou preparando meu casamento para logo mais, etc.

Algumas coisas nunca mudam: minha paixão por essa profissão desvalorizada, minha paixão pelo Internacional e claro pela minha noiva de pé quebrado (L).

Voltarei a postar mais seguido em breve.

Adicionar esta notícia no Linkk

Segunda-feira, Novembro 19, 2007

Framework Mentawai - Desenvolvimento Java para WEB.

Dae pessoal, to a tempos para postar aqui mas não consigo tempo para nada.

Estes dias ia iniciar um projeto e comecei pela escolha de um framework para utilizar. O pessoal da empresa em que eu trabalhava (a dois meses mudei de emprego, estado, cidade... e por isso de ter largado o blog um pouco) estava usando o Jboss SEAM para novas aplicações WEB. Eu gostei, fui em uma palestra sobre o Jboss Seam e tudo mais, mas no fim achei que ia usar uma bomba atômica para matar uma formiga. E depois, queria aprender algo realmente novo e que ninguém naquela sala tivesse trabalhado, por desafio mesmo. Então pensei em dar uma olhada nos frameworks brasileiros (não, não li a revista aquela com a matéria de capa sobre isso). De cara na home do site do primeiro candidato eu já vi o que mais me agradaria: sem XMLs e annotations!

Claro, estou falando do Mentawai. Projeto bem bacana que anda conquistando o mundo (ta isso foi por minha conta :) )!!!

Então como de costume, peguei o .jar do framework, criei um novo projeto no Eclipse e comecei a fuçar criando minha aplicação modelo, se eu conseguisse fazer ali meia dúzia de coisas que eu desejava na minha aplicação final ele seria o eleito.

Comecei pela lista:

  1. Não quero preencher beans na mão, o framework tem que pegar os formulários e popular objetos para mim.

  2. Tem que ter algum suporte a IoC sem que eu tenha que meter mais uma tonelada de .jars, como o do Spring e a penca de .jars que ele necessita, para isso e sem muito esforço também, não quero ter que ler mais uma documentação para aprender como usar um framework secundário.

  3. Bom, pela minha preguiça expressa acima eu também não quero ter que correr atrás de componentes como upload, envio de e-mail, etc... o eleito tinha que ter tudo isso.

  4. O Mentawai de cara já era um futuro eleito por não conter um só maldito XML e nem uma porcaria de annotation! Não, sério... na boa... aquela sopa de annotations ou aqueles duzentos arquivos XML não é prático.


Meu exemplo era o mais simples: uma tela de acesso ou cadastro. Ok, vamos complicar um pouco, mas nem tanto, tinha que ter suporte a internacionalização e salvar algumas coisas sobre o usuário em cookies.

Em 4 minutos (na verdade 3 e alguns segundos) eu tinha feito a primeira tela da minha aplicação seguindo a documentação no site do framework.

Toda a configuração da aplicação é feita em uma classe, ou seja, é em Java! Não tem como o cara colocar um caractere inválido, esquecer de fechar uma tag ou fazer qualquer barbeiragem neste arquivo pois o mesmo é compilado. Ótimo, gostei muito disso.

Depois da minha primeira página parti para a forma de pegar os dados do formulário de cadastro em um objeto já preenchido pelo framework. Moleza. Isso foi muito fácil de fazer também.

Login... tenho que criar a forma do cara entrar na minha aplicação e recuperar os dados dele da sessão. Também não foi difícil. Tive uns problemas aqui mas foram barbeiragens minhas :) o frame estava certo!

Comecei a achar que estava no mundo perfeito!

Passei para a internacionalização. Aqui eu tive que apelar para o fórum. Mas fui socorrido em minutos.

A única coisa que ainda falta eu implementar é usar mensagens parametrizadas na internacionalização. Exemplo: O usuário {0} deletou {1}. Mas, diz o inventor do monstro, que há como fazer e eu que não li a documentação corretamente. Devo tirar um tempinho essa semana para descobrir como fazer.

Então minha aplicação ficou assim:

Passos da aplicação:

  1. Ao acessar o endereço da aplicação no navegador o usuário é redirecionado para a action Preparesystem. Esta action tem a função de ler possíveis dados do usuário armazenados anteriormente, como o último login que acessou o sistema, idioma escolhido anteriormente pelo usuário, etc... Depois de feito isso o usuário é redirecionado para a página principal do sistema.

  2. Na página principal o usuário tem duas opções: fazer login ou cadastrar-se no sistema.

  3. Quando o usuário executa login ele é redirecionado para a action Login. Nesta action é injetado o objeto User pelo controle de IoC do Mentawai. Ou seja, é pego na requisição os dados do formulário e postos em um objeto sem a intervenção do desenvolvedor (magavilha!). Depois de aplicada a regra de acesso ao sistema o usuário é redirecionado para a home, caso o login tenha sido bem sucedido, ou para a primeira página do sistema novamente onde serão exibidas as mensagens de erro, caso o login não tenha sido bem sucedido. Note que quem faz a validação da requisição é uma classe externa a action, chamada LoginValidator. Talvez essa seja a grande jogada deste framework, poder separar muito bem as coisas em objetos com propósitos distintos.

  4. Quando o usuário vai se cadastrar no sistema ele é redirecionado para a página com o formulário de cadastro. Por trás desta página há a action Register que, assim como a action Login, recebe um objeto já preenchido com os dados do formulário. Também a exemplo da action Login, a validação está em uma classe externa chamada RegisterValidator. Se o cadastro for efetivado com sucesso o usuário é redirecionado para uma página de boas vindas de onde ele tem a opção de ir para a home do sistema.


E estamos aí, ela funciona mesmo! Olha a cara dela que espetáculo! :)


Tela inicial da aplicação

Assim começa a aplicação.



Tela inicial da aplicação em inglês

Versão em inglês.



Tela cadastro

Tela de cadastro.



Tela de boas-vindas

Boas-vindas para usuários que se cadastram.



Tela inicial para usuários logados

Home para usuários logados.


Quem quiser baixar os fontes e olhar como foi feito: http://www.mentaframework.org/files/. Enviei para o criador do framework minha app para que ela fique disponível como exemplo de uso.

Era isso pessoal. Encorajo-os a usar o framework, cadastrassem no fórum, e darem algum valor pelo o que é desenvolvido com tanto esforço pelos programadores tupiniquins!

Abraços a todos.

OBS.: Não postem comentários sobre perguntas referentes ao framework aqui, e sim no fórum deles! Postem comentários sobre a minha aplicação, erros de português, falando do blog... enfim.

Adicionar esta notícia no Linkk

Quarta-feira, Setembro 19, 2007

Wiki sobre MySQL em português!

Dae galera, quem visita o blog com frequência sabe que eu me dedico aqui a postar coisas sobre Java e sobre MySQL.


Sobre Java porque é o que eu faço profissionalmente e sobre MySQL porque é o SGBD que mais uso nos meus projetos particulares.


Depois de anos participando da lista MySQL-Br do Yahoo! Brasil o pessoal criou uma página de Wiki para facilitar buscas por conteúdos e artigos.


Bem, o site do Wiki começou hoje, e não tem nada ainda. Mas vale a pena ficar de olho e de vez em quando dar uma passadinha por lá.


Os endereços:


Da lista no Yahoo! Brasil: http://br.groups.yahoo.com/group/mysql-br/


Do Wiki: http://mysql-br.wikidot.com.


Colaborações serão sempre bem-vindas!

Marcadores: , , , ,

Adicionar esta notícia no Linkk

Quarta-feira, Setembro 05, 2007

Internacionalização em Java

Dae pessoal, não faz tanto tempo assim que postei algum “drop” de sabedoria aqui. Então vamos a mais um: internacionalização!

Diretamente das definições da Sun: “internacionalização é o processo de projetar uma aplicação, de modo que ela possa ser adaptada a varias linguagens e regiões sem mudanças de engenharia.” – leia-se mudanças no código.

Bom, você já deve ter ouvido ou lido em algum código o prefixo “i18n” ou “l10n”. i18n é a abreviação de internationalization, pois do primeiro i ao último n há 18 letras. O l10n é a abreviação de localization e segue a mesma regra do número de caracteres entre l e n.

Existem certas características em um programa internacionalizado, como:

• Dado uma localização (Locale), o mesmo binário do programa deve funcionar em qualquer lugar;
• Os dados textuais do programa (mensagens de erro, mensagens de tela, rótulos, etc...) não devem estar atribuídos de forma “hardcode” aos elementos dentro dos códigos do programa e sim externados em um arquivo apropriado;
• Suporte a outros idiomas não deve requerer nova compilação do programa;
• Dados dependentes de localização, como formatação de datas e campos monetários, devem ser apresentados de acordo com a região do usuário e seu idioma;

Bom, se você tiver sons e imagens que possam fazer sentido internacionalizar, é uma boa idéia!

Vamos cortar o nhe nhe nhe e partir para a ação.

Vamos a um simples exemplo. Uma classe que deva imprimir:

Nome: Jean Jorge Michel
Nome de usuário: jmichel
Senha: minhasenhaultrasecreta

Porém os rótulos (nome, nome de usuário e senha) devem ser impressos corretamente para cada idioma (tá, não exageremos, vamos testar com português e inglês apenas).

Então vamos começar pelos fatos primeiros (como diria o grande sábio), criando os arquivos com a tradução do nosso programa. Para isso, no pacote estudo.internacionalizacao criei dois arquivos:

• ResourceBundle_pt_BR.properties;
• ResourceBundle_en_US.properties.

E o conteúdo de cada um deles (na ordem de criação):

name=Nome
password=Senha
username=Nome de usuário

name=Name
password=Password
username=Username

Agora no mesmo pacote criei a classe Internacionalizada.java:

package estudo.internacionalizacao;

import java.util.Locale;
import java.util.ResourceBundle;

public class Internacionalizada {

    public static void main(String[] args) {

        final Locale defaultLocale = Locale.getDefault();
        final ResourceBundle rbDefault = ResourceBundle.getBundle("estudo.internacionalizacao.ResourceBundle", defaultLocale);

        System.out.println(new StringBuilder().append(rbDefault.getString("name")).append(": Jean Jorge Michel"));
        System.out.println(new StringBuilder().append(rbDefault.getString("username")).append(": jmichel"));
        System.out.println(new StringBuilder().append(rbDefault.getString("password")).append(": minhasenhaultrasecreta").append("\n\n"));

        final Locale otherLocale = new Locale("en", "GB");
        final ResourceBundle rb = ResourceBundle.getBundle("estudo.internacionalizacao.ResourceBundle", otherLocale);

        System.out.println(new StringBuilder().append(rb.getString("name")).append(": Jean Jorge Michel"));
        System.out.println(new StringBuilder().append(rb.getString("username")).append(": jmichel"));
        System.out.println(new StringBuilder().append(rb.getString("password")).append(": minhasenhaultrasecreta"));
    }
}

Agora é só rodar e ver o resultado das duas saídas que devem parecer com isso:

Nome: Jean Jorge Michel
Nome de usuário: jmichel
Senha: minhasenhaultrasecreta


Name: Jean Jorge Michel
Username: jmichel
Password: minhasenhaultrasecreta

Lembra daquela Enum do post anterior? Poderia ser internacionalizada não? :)

Até mais! Bons códigos

Marcadores: , , , , ,

Adicionar esta notícia no Linkk