bloqueado.jpgAté hoje eu era assinante fiel do Speedy da Telefônica. Porém, o serviço de atendimento somado ao alto custo do Speedy Business de 2Mb me fizeram migrar para o Virtua 6Mb mega-flash.

O único problema da migração se deu quando eu descobri que a porta 80 estava bloqueada. Eu usava a minha conexão apra hospedar sites de demonstração e para outras finalidades, como para oferecer builds diários do meu projeto open-source: o JFileHelpers.

Depois de buscar muito uma solução, inclusive em fóruns e sites como o Stackoverflow, nenhuma solução foi satisfatória. Todas elas envolviam um redirecionamento para outras portas, como 8080, o que eu não queria.

Enfim, acredito ter achado a solução ideal: eu já havia usado o Apache anteriormente para servir de um proxy transparente. Ou seja, você faz a requisição para um servidor, ele internamente redireciona este request para outro servidor web, e retorna o conteúdo ao usuário. Tudo isso de forma transparente. É uma espécie de façade ou plugging server. Para isso, precisava ter um servidor Apache em um local cuja porta 80 fosse acessível.

Veja o que eu fiz...
em-pe.jpgOs adeptos da metodologia XP já devem estar familiarizados com o termo Stand-up Meeting, que é aquela reunião rápida onde todos trocam suas experiências sobre tarefas, problemas encontrados e etc.

Eu trabalho em regime de Home Office e uma coisa que eu notei recentemente e que está fazendo toda a diferença prá mim é fazer reuniões via telefone em pé. 

Parece coisa de maluco (e se tiver alguém vendo é esta a impressão que eles vão ter mesmo), mas eu explico. 

Quando uma reunião é feita por telefone e você está na frente do computador, o assunto as vezes começa a ficar entediante e você acaba lendo seu e-mail ou um blog qualquer. Agora, quando você está de pé, você acaba obrigado a ouvir o que todos estão falando e digerir toda aquela informação. Além disso, parece que você fica mais entrosado com os outros.

Isso se aplica também a hora que você tem que falar. Devo confessar que falando de pé, andando de lá prá cá e podendo mexer as mãos (não, eu não sou descendente de italiano!) consigo ficar mais articulado. Como meu time todo é americano, tem horas que o inglês dá aquela enroscada. Notei que isso diminui bastante quando você está de pé.

Fora todos estes motivos, ainda tem a grande vantagem de você sair da posição que você fica o dia inteiro e mexer um pouco o corpo. Pode parecer besteira, mas não é.

Fica então a dica. Se algum de vocês experimentar esta idéia, compartilhem a experiência nos comentários.

Até a próxima!

agile1.gifSemana passada tive a sorte de participar de um curso de Agile Development, patrocinado pela IBM - que é meu empregador. O curso ministrado por um dos papas do assunto na IBM, Jim Brisson.

Devo confessar que, tendo algum background em XP, era um pouco cético sobre o assunto. Hoje meu time usa uma pequena parte da gama oferecida pela metodologia Agile: apenas usamos as ferramentas de Sprints (ou Iterations) e Scrums. Devo confessar que fui surpreendido: o Agile, além de ser conceitualmente bem mais light que o XP, tem outros apelos bem interessantes. Se tiver mais interesse sobre o assunto me mande comentários que eu escrevo sobre a metodologia, mas em outra hora :-)

Retomando o assunto principal deste post, neste curso, uma das grandes dúvidas dos PMs presentes era a respeito do controverso Pair Programming. Uma destas dúvidas era da possibilidade de utilizar esta técnica em times distribuídos.

Descobri um screencast que mostra uma ferramenta exatamente com este propósito. Trata-se de um plugin para o Eclipse chamado Cola. Então, chega de papo e segue o screencast abaixo:



Cola: Real-Time Shared Editing from Mustafa K. Isik on Vimeo.


Via DZone
jfilehelpers.png
Depois de um bom tempo só promovendo o uso da biblioteca JFileHelpers através de um post neste blog, decidi fazer o website do projeto.

Embora ainda esteja no seu começo, pelo menos é um lugar comum para os usuários poderem ter uma referência de como usar a biblioteca. A outra grande vantagem é ter um versão em inglês. Assim, os gringos também podem conferir e quem sabe consigo algum novo colaborador.

jfilehelpers-website.png

Se você tem vontade de participar de um projeto Open Source em Java, que faz uso de tecnologias interessantes como Refactoring, Annotations e muito mais, visite a página de contatos do projeto e me mande seus dados!

Mesmo se você acredita que não pode ajudar com o código, você pode fazer testes, ajudar no website ou mesmo sugerindo novas funcionalidades. Não deixe de deixar seu comentário se você testar a biblioteca! Este é aquele tipo de projeto "movido a comentários" :-).





Links:
sequence.jpg Desenhar diagramas de seqüência, mesmo com as novas ferramentas do mercado hoje, é um trabalho quase artístico. Clica aqui, arrasta uma classe, cria uma relação entre elas, clica de novo, coloca o nome do método, e por aí vai.

Outro dia, lendo alguns artigos em blogs por aí, me deparei com uma maneira absolutamente fantástica de criar estes diagramas. Trata-se do website WebSequenceDiagrams.

O apelo é ainda maior para programadores sem uma veia artística como eu. Basicamente o que você faz para criar o diagrama de sequência é passar um roteiro, no formato texto mesmo. Por exemplo:

HttpListener->Delegate: atende o request
Delegate->DAO: grava a requisição
note right of DAO: Este DAO é abstrato, podendo utilizar qualquer servidor para persistência.
Delegate->BusinessLogic: executa a regra de negócios
Delegate->HttpListener: responde o request

Este roteiro em formato texto gera o seguinte diagrama:

samplediagram.png Além disso, o site também disponibiliza templates para tornar o diagrama mais elaborado visualmente, como por exemplo:

samplediagram-modernblue.png
Exemplo de diagrama usando o tema Modern Blue


samplediagram-green.png
Exemplo de diagrama usando o tema Green Earth


Além disso, é possível salvar como PDF e dividir em várias páginas para impressão. Como diria o pessoal do MTV Rock Gol, totalmente excelente! :-)

E você, o que você usa no seu dia-a-dia para criar diagramas UML em geral? Deixe comentários com suas dicas!



Links:
criatividade.jpgNo mundo de hoje, a palavra concorrência ganhou um novo sentido.

Em uma realidade onde seu principal concorrente não está mais necessariamente na mesma cidade, estado ou sequer no mesmo país, ela se tornou um fator decisivo entre o sucesso e o fracasso: a criatividade.

A sua presença hoje pode resolver disputas difíceis. Imagine competir, por exemplo, com a mão de obra chinesa, fruto de um país que por muitos não é considerado nem uma economia de mercado.

Uma das nossas maiores armas, que nos permite competir mesmo em condições adversas é uma das características mais marcantes do nosso povo, que desenvolveu a criatividade como uma forma de subsistir.

Já se tornou um jargão aquela frase que diz que sucesso é 10% inspiração e 90% transpiração.

Então, aplicando esta frase ao nosso caso, a parte da inspiração diz que você deve ter fé que você é sim uma pessoa criativa. Mas só isso não basta: você tem que exercitar constantemente sua criatividade. E esta, você adivinhou, é a parte da transpiração.

Baseado em um artigo de John Hoff, para o blog americano Cultive Greatness, enumero abaixo oito dicas de como ser mais criativo.


Escute

É muito importante saber ser um bom ouvinte. E por ser um bom ouvinte eu quero dizer ouvir sem julgar, sem tirar nenhuma conclusão precipitada. Esta característica é vital se você vai criar um produto para encher os olhos dos clientes e de seu empregador. Lembre-se: escutar não é a mesma coisa que apenas ouvir.

Uma dica: tente ouvir uma rádio ou um canal novo. Tente descobrir qual é a audiência alvo. Quem seriam fiéis ouvintes e quem ouviria esta rádio ocasionalmente? Que pessoas influentes poderiam ouvir esta rádio? Qual é o seu mercado potencial?


Faça Brainstorm

Brainstorm é uma maneira clássica de gerar idéias criativas. Mas antes, tente aquecer sua criatividade.

Aquecendo a criatividade

Pegue um lápis e um pedaço de papel em branco e comece a escrever. Se nada vier a sua mente, escreva isso, e depois escreva o que vier a sua mente, independente do que for. Então, a partir disso, elabore.

Um outro exemplo, pegue seu papel e lápis, tente criar algo novo e descreva o que você está pensando, mesmo se parecer absurdo. Tente criar uma nova forma de vida. De onde ela vem? Quais são seus objetivos? Ou então, tente criar uma pessoa. Quem é ela? Elabore a idéia.

Estes são bons exemplos de como deixar sua mente em um estado favorável a "pensar fora da caixa".


Complemente os pontos negativos com pontos positivos

Este talvez seja um dos pontos mais importantes.

As vezes, quando você quer fazer algo, sua cabeça continua dizendo que é impossível, que você não consegue. Escreva este pensamento e, logo ao seu lado, escreva também 2 ou 3 motivos que provam que você pode fazer.

Faça isso de forma rápida e de forma rotineira. Você logo vai perceber que você treinou sua mente para reagir de forma automática a um ponto negativo, apresentando um pensamento positivo, que pode até viabilizar sua idéia.


Esteja preparado

Se você estiver procurando idéias criativas, mantenha sempre um bloco e uma caneta ao seu alcance. Nunca se sabe quando um pensamento crítico pode aparecer. As vezes um pensamento ou uma idéia alheia, ou algo que você ouve de alguém pode ser a faísca para uma nova idéia.


Aprenda

É claro que quanto mais você conhecimento você adquire, mais o ambiente fica propício para novas idéias criativas.

Você não saberia como física e paisagismo podem interagir, a não ser que você saiba ao menos um pouco de cada uma. A idéia aqui é simples: quanto mais você sabe, mais você pode criar.

Idéias para expandir os horizontes:

  • leia blogs;
  • faça cursos;
  • leia livros;
  • tente uma coisa nova, que você nunca fez;
  • ensine algo a alguém;
  • participe de um grupo de discussão ou uma comunidade onlline;
  • fale com pessoas que você não falaria normalmente;
Continue esta lista com suas próprias idéias.


Faça críticas

Quando você estiver sem idéias criativas, pare e faça uma crítica.

Revistas

Se você está estagnado, tente folhear uma revista e criticar as propagandas. Quais prendem sua atenção e porque? Qual é o público alvo? O que você faria diferente se você tivesse feito a propaganda? Naqueles que chamaram sua atenção, como você os mudaria?

Seus concorrentes

Visite páginas de seus concorrentes. Veja se o que eles fazem servem como inspiração de idéias a seu favor. Existe algo que eles não fizeram, mas que você poderia fazer? Ou fazer melhor, de forma diferenciada?

Auto-análise

Pegue novamente um papel e desenhe uma linha no centro. No lado esquerdo escreva "Meus pontos fracos" e, do lado direito "Meus pontos fortes". Tente listar todas suas fraquezas, sempre compensando com pontos fortes do lado direito.

Agora você tem um mapa do que você precisa fazer.

Pergunte, pergunte, pergunte

Quando você estiver empacado em uma tentativa de ser criativo, faça uma série de perguntas para tentar obter uma nova perspectiva de um produto ou idéia.

  • O que eu posso substituir?
  • O que eu posso adicionar para fazer isto um pouco melhor?
  • O que é desnecessário?
  • O que é o oposto disso?
  • De onde isso veio?
  • Como isso vem sendo usado?
  • Para o que mais isso pode ser usado?

... e por aí vai. Continue as perguntas e faça sua própria lista.


Exercite o seu processo criativo

Tente uma dessas atividades de tempos em tempos:

  • Todo dia, escolha um tópico e anote; então crie um diagrama para ver aonde esta idéia te leva.
  • Pense em um produto. Como ele poderia ter sido inventado de uma forma diferente, produzindo o mesmo resultado?
  • Depois de ler metade de um livro, feche e pense como você terminaria a história
  • Leia livros verídicos, e tente resolver os problemas antes que eles sejam resolvidos na história.
  • Faça palavras-cruzadas, porque elas te fazem pensar amplamente, em todo tipo de assunto.

Viaje

Uma das melhores formas de gerar idéias criativas é indo a lugares novos ou simplesmente sair e andar. Não tem dinheiro para viajar? Não tem problema. Vá aonde você tem que ir, mas faça um caminho diferente.

Novas experiências e novos destinos são uma ótima forma de gerar novas perspectivas e gerar criatividade.


E estas são as 8 idéias para ajudá-lo a ser mais criativo.

E você, se considera uma pessoa criativa? Quais são suas técnicas?
mouse-alttab.jpgA única frase que me vem à cabeça é: Como não pensei nisso antes?.

Um pequeno executável automatiza o Alt+Tab, tornando possível que você mude de janela apenas com o mouse. Sem instalação, sem um monte de arquivos, sem raízes brancas (exagerei!).

Para utilizar, você simplesmente segura o botão da esquerda e, sem soltar, pressiona o da direita. Cada vez que você aperta o da direita, é um Alt+Tab. Fantástico!

alttab-mouse.jpg

Ele vem em dois "sabores": AltTab e CtrlAltTab que no Windows Vista mantém a janela aberta se você soltar o botão. Eu prefiro a primeira versão, mas gosto é gosto.

via Lifehacker [via CyberNet]



Links:

phun-physics-fun.jpgNão, não é o que você está pensando. Não se trata de um software chato para Nerds que calcula a correlação entre pontos.

Estou falando do Phun (para os desligados é uma brincadeira com as palavras Fun e Physics), um engine que, a todos os elementos que você desenha são aplicadas as leis da física que regem o nosso universo. O vídeo vale mais que mil palavras:




Se você gostou e começar a criar cenas divertidas, mande para mim. Ah! E deixe comentários também!



Links:

log5j

| | Comentários(0) | TrackBacks (1)
log5j-picture.jpgNuma das minhas andanças atrás de novidades, me deparei com o log5j. Primeiramente, pensei que fosse uma atualização do famoso framework para logging ou algum novo framework que trouxesse novidades em relação ao já famigerado log4j.

Na verdade, não é nada disso. Trata-se apenas de um face-lift para o log4j, trazendo uma implementação mais atual. Esta biblioteca - que, diga-se de passagem, só tem uma classe - tem dois principais objetivos:

Permitir logs no estilo do comando printf:

Antes:
log.error(
   "Houve um erro: " + foo + 
   " por causa disso: " + bar + 
   " nisso: " + car );
Depois:
log.error(
   "Houve um erro: %s por causa disso: %s nisso: %s", 
   foo, bar, car);
Além de prováveis ganhos de performance, acredito que o código fique bem mais limpo.

Acabar com o inconveniente Logger.getLogger(NomeDaClasse.class):

Antes:
private static final Logger log = 
   Logger.getLogger(NomeDaClasse.class);
Depois:
private static final Logger log = new Logger();
E é isso, simples assim... Eu gostei bastante porque é extremamente simples e despretensioso, mas agrega duas funcionalidades que há tempos eu gostaria de ver no Log4J.

Vocês acham que vale a pena usar essa lib? Porque? Mandem comentários!



Links:
lightweight-1.jpg Poucas pessoas sabem, mas a versão 6 do JDK da Sun vem com um HttpServer light nativo. Não é necessário mais escrever http sobre socket ou utilizar alguma biblioteca externa. Mas atenção: esta classe está em um pacote da sun e não há garantias que outras implementações java terão estas classes.

De qualquer forma, é muito fácil utilizar a classe para resolver problemas onde seja necessário um HttpServer out-of-the-box.

Tudo o que deve ser feito é criar uma nova instância da classe HttpServer (pacote com.sun.net.httpserver) através do método estático create, passando o IP e a porta aos quais o servidor irá ouvir, além do backlog, que é o tamanho da fila que o servidor irá armazenar com requests que estão esperando para serem atendidos.
HttpServer server = 
	HttpServer.create(new InetSocketAddress(8088), 0);
Depois disso, você deve criar uma classe que implemente a interface HttpHandler para atender suas requisições. Nela é colocada a regra de negócio do que deve ser feito e o que deve ser respondido ao cliente.

A cada novo request, o método handle é chamado, tendo um HttpExchange como parâmetro. Esta classe tem uma série de propriedades que facilitam a interação com o servidor.

Por fim, você deve criar um contexto no qual este handler irá ser utilizado. O contexto nada mais é do que uma espécie de virtual folder para sua URL. Por exemplo, se você utilizar o contexto "/exemplo", o handler irá responder quaisquer requisições para http://seuservidor:8088/exemplo (incluindo arquivos dentro desta pasta, parâmetros e sub-pastas). Veja este exemplo:
public static void main(String[] args) throws IOException {
	// cria um novo servidor que vai ouvir a porta 8088 local
	HttpServer server = 
		HttpServer.create(new InetSocketAddress(8088), 0);

	// cria um contexto com um HttpHandler dinâmico
	server.createContext("/exemplo", new HttpHandler() {

		@Override
		public void handle(HttpExchange xchg) 
			throws IOException {

			// corpo da resposta
			StringBuffer response = new StringBuffer();

			// o corpo da resposta será apenas uma indicação
			// de qual foi o método do request (GET / POST)
			response.append("<html><body>");
			response.append("Request method: ");
			response.append(xchg.getRequestMethod());
			response.append("</body></html>");

			// envia uma resposta de código 200 (OK) para 
			// o cliente e com o Content-Length, que é o 
			// tamanho da resposta
			xchg.sendResponseHeaders(200, response.length());
			
			// recupera o stream de saída
			OutputStream os = xchg.getResponseBody();
			// imprime nele a resposta
			os.write(response.toString().getBytes());
			// e fecha o stream (com try..finally talvez?)
			os.close();
		}
		
	});
	
	// por fim inicializamos o servidor
	server.start();
}
Se você rodar esta classe e apontar seu servidor para o endereço mencionado, você vai ver a mensagem conforme abaixo:

httpserver-screenshot.jpg Porém se você for mais além, e tentar abrir várias requisições em paralelo, verá que a aplicação começará a responder de forma bem lenta. Para resolver o problema, precisamos criar uma thread para cada requisição. No meu caso criei uma classe que estende thread para atender cada uma das requisições:
public class HandleThread extends Thread {
    public HttpExchange xchg;
    
    public HandleThread(HttpExchange xchg) {
        this.xchg = xchg;
    }
    
    @Override
    public void run() {            
        try {
            // corpo da resposta
            StringBuffer response = new StringBuffer();

            // o corpo da resposta será apenas uma indicação
            // de qual foi o método do request (GET / POST)
            response.append("<html><body>");
            response.append("Request thread: ");
            response.append(Thread.currentThread().getId());
            response.append("</body></html>");

	    // o resto continua igual (...)
        }
        catch (Throwable t) {
            t.printStackTrace();
        }
    }
}
Finalmente, alteramos a classe principal para criar uma thread a cada nova requisição:
// (...)
// cria um contexto com um HttpHandler dinâmico
server.createContext("/echo", new HttpHandler() {

    @Override
    public void handle(HttpExchange xchg) throws IOException {
        HandleThread ht = new HandleThread(xchg);
        ht.start();
    }
    
});
// (...)
Vale a pena salientar que existe suporte nas APIs também a HTTPS (veja Javadoc nos links abaixo).

Estes exemplos têm apenas um caráter didático. Em uma aplicação séria, não seriam criadas threads a esmo: usaríamos um pool de threads e técnicas mais apuradas para controle de requisições.

Mas acho que a idéia era esta: dar um apanhado geral de como usar estas novas classes, oferecidas pelo JDK 6.

Aguardo seus comentários sobre o que você pensa destas idéias.



Links:
Clicky Web Analytics