Archive for the ‘java’ Category

  • Mejores Practicas Para JDBC

    0

    En el día de hoy vamos a ver algunos tips o mejroes prácticas para JDBC.

    1. Usar drivers tipo 4

    Siempre que se pueda es mejor utilizar drivers tipo 4 ya que ésta arquitectura encapsula enteramente la implementacion de la API de JDBC incluyendo la lógica de comunicación directa con la base de datos utilizando solo 1 driver. Permite que el driver sea pequeño y conciso además de ser 100% java.

    2. Utilizar un pool de conexiones

    Hoy en día cualquier aplicación seria debe utilizar un pool de conexiones a base de datos. Esta reduce el tiempo de creación y la utilización de recursos de la máquina. Apache DBCP es una utilidad muy popular para poder hacer pooling.

    3. Utilizar un pool de statements

    Si es por optimizar también podemos optimizar la creación de PreparedStatement en java alojandolos en un pool de statements el cual está diponible recien en JDBC 3.0

    4. Quitar el autocommit

    connection.setAutoCommit(false);
    

    Por default Java deja autocommit encendido, lo cual genera una transacción por cada SQL o DDL que viaja a la base de datos. En cada transacción hay una utilización de recursos del sistema en la base de datos mucho mayor a que si no la hubiese. Evaluando tu aplicación podrías hacer delay de el commit de una transacción lo más posible para optimizar recursos.

    5. Utilizar addBatch()

    La utilización de addBatch() ayuda a ejecutar varias operaciones similares reduciendo el tráfico por la red enviando solo 1 paquete en vez de tantos como inserts quieras hacer.

    6. Select Column1

    Siempre pero siempre utilizar SELECT column1, column2, etc, nunca Select * porque esto va a hacer 2 lecturas en la base de datos, 1 para ver que columnas tiene la tabla X y otro el mismo SELECT. Además tambien evitaríamos traer datos innecesarios que lo único que van a hacer es generar más tráfico de red.

  • Como Borrar Directorios En Java

    0

    Bastante simple este snippet para algo que no es nativo de Java. Java no permite borrar un directorio que contenga archivos adentro. Lo primero que hay que hacer para eliminar el directorio es simplemente eliminar los archivos interiores. Aca un snippet que se llama recursivamente.

    public boolean deleteDirectory(File directory) {
      File[] files = directory.listFiles();
        for(int i = 0; i < files.length; i++) {
          if(files[i].isDirectory()) {
    	this.deleteDirectory(files[i]);
          } else {
    	files[i].delete();
          }
       }
       return path.delete();
    }
    
    
     
    						
  • Como Parsear un Email en Java

    0

    Estoy trabajando en un sistema que recibe emails en un Sendmail y este mediante CURL redirecciona a un Tomcat Server para ejecutar comandos. Todo esto es porque lso sres clientes no puden hacer un miserable webservice. Como la verdad shell script no es mi fuerte, opté por redireccionar mediante sendmail alias a un script el cual nuevamente redirecciona usando CURL a una URL.

    El shell

    #!/bin/sh
    
    TEMP_FILE=$(date +%k%M%S%N)
    URL=http://someserver/somefile
    
    #writes to disk the email file
    while read line; do
      echo $line >> $TEMP_FILE
    done
    
    curl -F "file=@$TEMP_FILE" $URL
    
    #wipes out the temp file
    rm -rf $TEMP_FILE
    

    A mi aplicación Java viene como si fuera un FileUpload común y corriente dentro de un servlet o simil. Utilizo apache file upload.

    
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      FileItemFactory factory = new DiskFileItemFactory();
      ServletFileUpload upload = new ServletFileUpload(factory);
      List items = upload.parseRequest(request);
      Iterator iter = items.iterator();
      while (iter.hasNext()) {
        FileItem item = (FileItem) iter.next();
        if (!item.isFormField()) { // here is the file!
          myFile = item;
        }
      }
    
      // now process the file
    

    Entonces tenemos con el código de arriba solucionado el recibir el archivo proveniente del CURL request. Ese archivo es plain text y contiene toda la info que contiene un email, header y body.

    From root@myserver.com Thu May 13 14:21:16 2010
    Received: from myserver.com (localhost.localdomain [127.0.0.1])
    by myserver.com (8.13.8/8.13.8) with ESMTP id o4DILgiri383703
    for ; Thu, 13 May 2010 14:21:16 -0400
    Received: (from root@localhost)
    by myserver.com (8.13.8/8.13.8/Submit) id o4DIGIUR89844
    for some@otherserver.com; Thu, 13 May 2010 14:21:16 -0400
    Date: Thu, 13 May 2010 14:21:16 -0400
    From: root 
    To: some@otherserver.com
    Subject: some subject
    Message-ID: <20100513182116.GA873@myserver.com>
    Mime-Version: 1.0
    Content-Type: text/plain; charset=us-ascii
    Content-Disposition: inline
    User-Agent: Mutt/1.4.2.2i
    
    here the body of the message
    

    Y aca viene la gran utilidad, para evitar parsear el mensaje y estar luchando con el reply-to, from , y el body construimos un MimeMessage en java el cual nos permite acceder a todos los campos del email sin mayores dolores de cabeza.

    Creamos un property y un session para poder pasarlos como parametros al MimeMessage

    Properties properties = System.getProperties();
    //properties.put("mail.transport.protocol", "smtp"); NO SE SI ES NECESARIO
    //properties.put("mail.smtp.host", "localhost");  NO SE SI ES NECESARIO
    Session session = Session.getDefaultInstance(properties, null);
    

    Y ahora parseamos el mensaje :D

    StringBufferInputStream stream = new StringBufferInputStream(email);
    MimeMessage message = new MimeMessage(session, stream);
    

    Y podemos acceder a todos los campos del email

    message.getSubject();
    message.getSender();
    message.getSenderDate();
    message.getContent();
    //blablabla
    

    Utilizo la API de Java Mail. También quiero agradecer a Pedro Prez de Keetup por la ayuda con CURL.

  • Java 7 – Project Coin

    0

    Como en las versiones anteriores, Java 7 va a traer una serie de agregados al lenguage para hacer más fácil su escritura y lectura. Éstos cambios apuntan a las tareas de mayor uso para reducir su complejidad innecesaria.

    Strings en switch statements

    Hasta hoy solo se puede hacer switch con valores numéricos, pero a partir de esta nueva versión, se intruducen los strings también como un valor correcto para hacer un switch. Es un gran avance ya que solo se podía hacer un simil switch con valores String utilizando sentencias if-else.

    switch("something") {
      case: "something": //do blabla
        break;
      case: "other" // do blabla 2
        break;
    }
    

    Inicialización de Generics mejorada

    En Java 5 se introdujo el concepto de Generics, lo cual permite parametrizar una colección para evitar posteriores casteos. Siempre fue muy engorroso hacer una nueva instancia de esa collección ya que hay que utilizar algo asi:

    Map map = new HashMap();
    

    Java 7 infiere el tipo para evitar ese código engorroso.

    Map map = new HashMap();
    

    Inicialización de Collections simplificada

    Otro feature interesante es la inicialización de collections la cual se asemeja a la inicialización de los arrays en Java.

    // asi se incializa un array
    String[] array = new String[] {"a", "b", "c"};
    
    // asi se va a inicializar una collection
    List list = ["a", "b", "c"];
    

    Manejo de recursos automatizado

    Este es un feature que me da bastante dudas, quiero tenerlo en frente para poder probarlo y pronto. Existe un nuevo tipo de try statement. Dentro de este try se declaran recursos que deben ser cerrados manualmente como por ejemplo algun Input o Output stream. Una vez que el statement try termina, cierra automáticamente todos los recursos abiertos. Como lo hace ? ni idea, debe tener un set de clases a cerrar supongo.

    try {
      FileInputStream input = new FileInputStream("myfile.txt");
      // read your file
    }
    // the input was closed automatically
    

    Por ahora eso es lo que tenemos con lo que respecta al Project Coin, acá les dejo algunos recursos:

    Project coin: http://openjdk.java.net/projects/coin/
    Java 7: https://jdk7.dev.java.net/

  • Una Buena Razon Para No Usar Siempre La Misma Password

    0

    Días atrás twitter puso en alerta a algunos usuarios para que cambien las passwords porque estaban siendo victimas de prishing. Pasa y pasa que muchos developers hacen herramientas open source, como por ejemplo foros open source PHP los cuales tienen exploits. Trackean sus instalaciones y cuando el foro se hace un poco popular ingresan con un master password (por ejemplo) y se roban todas las passwords y emails. Este es el típico caso donde te chorean la password. Viste que facil es que sepan tu password ? Bueno, ahora perfectamente saben que no deben poner la misma password para todos los sites.

    Ahora, es muy molesto estar acordandose passwords y demas, para eso, hoy les acerco una tecnica para aquellos Java Boys que quieran tener un poco de complicacion en sus vidas.

    La técnica se basa en 1 password master y un 1 string random que puede perfectamente ser el nombre del servicio.

    Por ejemplo, yo elijo como password master “rodrigo” y por ejemplo el servicio de email de yahoo es simplemente “yahoo”. Entonces tenemos “rodrigo”+”yahoo”, en el caso de gmail seria, “rodrigo” +”google” and so on.

    Ahora, como combinar estas palabras para generar una password ? Usamos un algoritmo MD5 bien casero en Java. El código.

    public class MD5Generator() {
    private MessageDigest messageDigest;
    
    private MessageDigest getMessageDigestMD5() throws NoSuchAlgorithmException {
    	if (this.messageDigest == null) {
    		this.messageDigest = MessageDigest.getInstance("MD5");
    	}
    	return this.messageDigest;
    }
    
    public String generate(String key) throws Exception {
    	// start fresh
    	this.getMessageDigestMD5().reset();
    	this.getMessageDigestMD5().update(key.getBytes());
    	byte[] bytes = this.getMessageDigestMD5().digest();
    	// buffer to write the md5 hash to
    	StringBuffer buff = new StringBuffer();
    	for (int l = 0; l < bytes.length; l++) {
    		String hx = Integer.toHexString(0xFF & bytes[l]);
    		// make sure the hex string is correct if 1 character
    		if (hx.length() == 1) buff.append("0");
    		buff.append(hx);
    	}
    	return buff.toString().trim();
    }
    }
    

    Ahora, el uso seria algo asi:

    String master = "rodrigo";
    String service = "yahoo";
    String longMD5 = new MD5Generator().generate(master+service);
    

    La variable longMD5 va a ser un choclo como esto: “37b0227d88adcf07ddb469fa45ad2938″ per pueden hacer un substring para acortarla a por ejemplo 8 caracteres.

    String pass = new MD5Generator().generate(master+service).substring(0,8);
    

    Que lo disfruten.

Page 1 of 41234»