Milk News

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!

É ensinando que se aprende!

Arquivado em: Diarinho, Nerdices — Marcelo @ 12:38 am

Em algum lugar no passado, não sei aonde, li ou escutei que a maior taxa de retenção de conhecimento se dá quando se ensina algo. Se é assim, vou ensinar um monte de coisas que preciso fixar melhor na cabeça.  ;)

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);
	}
    }

}

25 Maio, 2008

Welcome to the my jungle…

Arquivado em: Sem Categoria — Marcelo @ 11:13 pm

Nerdices, programação-google, noitadas, coisas engraçadas, opiniões mesmo que ridículas, coisas que vi, que gosto e não gosto.

Sei lá o que vou escrever…mas nessa casa quem mandará sou eu! Mas comentários sempre serão bem vindos :)

« Página anterior

Blog no WordPress.com.