Milk News

30 Junho, 2008

Sobre o “Google Developer Day”

Arquivado em: Google, Java, Nerdices — Marcelo @ 11:31 pm

- 800 e tantos participantes e no que eu contei, somente QUATRO participantes do sexo feminino. Por onde andam todas aquelas meninas da faculdade craques em cálculo e álgebra e que eu apostava todos meus centavos que seriam excelentes desenvolvedoras de software ?!?

- Ainda sobre a participação feminina, das 4 que eu vi, duas estavam com um cão-de-guarda ao lado (namorado, marido, peguete, sei lá!), uma eu não sei dizer e uma desacompanhada.  Até a hora do almoço, tinha sido o primeiro a puxar papo com esta última !!!

- A Google, com todas as letras, diz para os programadores do mundo: Eu preciso de vocês!

Tio Sam Google says: Developers, I want you!

- Ou se presta atenção na palestra ou se faz post ao vivo no blogger, twitter e coisas do tipo. Tem muita gente que prefere a segunda opção….

- Programadores que falam/lêem/compreendem Inglês é minoria.
Acho isso MUITO grave!

- Dick Wall:  Queira Deus que dia eu chegue no nível dele. O cara é muito, MUITO bom!

- Stephanie Liu: Uma nipo-americana simpática, que fez uma API fantástica, mas para mim, sem utlidade.

- Android: Cobro barato para desenvolver qualquer coisa nele, só pela diversão!

- TV Digital: Porque a Google ainda ignora um canal tão fantástico para distribuição de conteúdo ?

Em resumo: A Google deve ser um lugar muito divertido para trabalhar e se aposentar.
Se der, 2009 estarei lá novamente!

27 Maio, 2008

Meus Padrões de Projeto

Arquivado em: Design Patterns, Java — Marcelo @ 1:40 am
Seus problemas acabaram! Se você é um programador que gosta de fazer as coisas do jeito certo e tem gosto por fazer os códigos mais belos de toda a equpe, já deve ter por alguma vez caído na seguinte questão d’alma:- O que estou escrevendo é a melhor solução?

Ou ainda, no meio de um problema que está difícil encontrar a solução que te agrade:

- Caramba, mas será que ninguém já passou por esse problema ?

Situação pior ainda, quando por algum motivo, você tem que fazer manutenção naquele código que escreveu anos atrás quando ainda era um menino juvenil na arte de escrever um bom codigo:

- P#$%!@! Porque escrevi essa m#%$@ desse jeito! Agora vai dar maior trabalhão alterar isso.

Se respondeu “SIM” a alguma dessas questões, seus problemas acabaram! Design Patters é o produto que vai solucionar todos os seus problemas! :)

Brincadeiras a parte, pense:

- A não ser que você esteja prestes a solucionar o teorema de Gödel, alguém já passou pelo seu problema e ver a solução do outro no mínimo te trará uma margem de comparação para dizer se a sua solução é a ideal;

- Todo o código (eu disse, TODO) é passível de no futuro ser alterado. Mesmo aquela “cosinha rápida”, “que vai sair do ar mês que vem”, pode apostar: um dia você ou outra pessoa terá que mexer.

É aí que aparece a necessidade para, problemas parecidos se tenham soluções parecidas.

As vantagens a primeira vista são facilidade de manutenção (já se conhecendo a lógica e estas serem flexíveis, as alterações se tornam mais rápidas) e a diminuição do tempo de aprendizagem de um sistema para manutenção (se o código é todo padronizado, basta que o mantenedor da aplicação conheça os padrões aplicados para começar a produzir) . Mas, acredite, as vantagens são maiores do que essas duas que citei.

Mas nem tudo são flores.

Aplicar algum Design Pattern a uma solução é algo que sempre tem de ser elogiado, mas tome cuidado! Exagerar no seu uso pode ser um tiro no pé: a manutenção ficar complicada demais, o nível de abstração para o entendimento tornar o código ilegível, enfim…bom senso sempre!

Design Paterns é um assunto que quanto mais se estuda, mais aparece um padrão novo, em contraposição a um existente. Cada um tem suas vantagens e desvantagens, cabe a cada a um a inteligência para usá-los na situação correta.

Eu pretendo aqui apresentar os que conheco e mais utlizo (acho que uns 20 no total).

and…be welcome!

26 Maio, 2008

Como fazer uma chamada HTTPS

Arquivado em: Google, Java, Nerdices — Marcelo @ 1:27 am

Coisa mais comum em programação é ter que consultar algum sistema legado em uma interface HTTP. Não estou falando de Webservices ou qualquer coisa mais moderininha, mas simplemente fazer uma chamada HTTP a seja lá o que for. Desde a JDK 1.4 (se não me engano), temos a classe java.net.URL, que facilitou um bocado as coisas.

Mas…e quando se tratar de uma chamada a um servidor seguro (https) ?

Aí a coisa complica mais para quem é leigo e nunca estudou a fundo o protocolo HTTP.
Importar certificados, checar se o mesmo é válido e outras coisinhas que para explicar direito, teria que falar sobre alguns conceitos de como funciona o HTTPS. Mas, se você não está interessado em nada disso (se está aqui, eu acredito que não esteja) e confia no endereço que está chamando, sem checar certificados e validade das chaves, copie a classe Java abaixo.

Eu aceito postais como pagamento :)

package com.milknews.examples;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.apache.log4j.Logger;

/**
 * Makes a HTTPS call and returns the content as string
 *
 * @author milknews.wordpress.com
 *
 */
public class HTTPSCaller {

    private static final Logger log = Logger.getLogger("com.milknews.examples.HTTPSCaller");

    /**
     * @param args
     */
    public static void main(String[] args) {
	String url = "https://example-to-https-site:8080";

	System.out.println(httpsCaller(url, "put the postdata here", 1000));
    }

    /**
     * httpsCaller
     *
     * @param URL
     * @param data
     * @param timeout
     */
    private static String httpsCaller(String URL, String data, int timeout) {
	log.info("[httpsCaller] called, URL: " + URL + " data: " + data
	        + " timeout " + timeout);
	String httpResponse = "";
	try {
	    URLConnection conn;
	    URL url = new URL(URL);
	    acceptSSL();
	    conn = url.openConnection();
	    conn.setReadTimeout(timeout);
	    conn.setDoOutput(true);
	    OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
	    wr.write(data);
	    wr.flush();
	    BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
	    String line;
	    while ((line = rd.readLine()) != null) {
		httpResponse = httpResponse + "\n" + line;
	    }
	    wr.close();
	    rd.close();
	} catch (IOException e) {
	    log.fatal("[httpsCaller] IOException", e);
	    e.printStackTrace();
	}
	httpResponse.replace("\n", "");
	httpResponse = httpResponse.trim();

	log.info("[httpsCaller] response is: " + httpResponse);
	return httpResponse;
    }

    /**
     * acceptSSL
     */
    private static void acceptSSL() {
	// Create a trust manager that does not validate certificate chains
	TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
	    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
		return null;
	    }

	    public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {

	    }

	    public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {

	    }
	}

	};

	// Install the all-trusting trust manager
	try {
	    SSLContext sc = SSLContext.getInstance("SSL");
	    sc.init(null, trustAllCerts, new java.security.SecureRandom());
	    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
	} catch (Exception e) {
	    log.fatal("[Exception]", e);
	}
    }

}

Blog no WordPress.com.