13 de diciembre de 2012

Maven: directorio con JAR de dependencias

En Java, si a tí te gusta como a mí tener en un subdirectorio los JARs de los que depende un ejecutable, pero también usas Apache Maven, seguro te preguntaste cómo crearlo.

Como sabes, Maven se usa para administrar las dependencias de un projecto en Java. Sin embargo, cuando se construye el proyecto sólo crea el JAR del mismo. Para que cree un subdirectorio que contenga los JARs de las dependencias, es necesario configurar el maven-dependency-plugin en el archivo pom.xml. Además, para que el archivo META-INF/MANIFEST.MF contenga el classpath apuntando a dicho subdirectorio, es necesario configurar el maven-jar-plugin:


<build>
   <plugins>
      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-jar-plugin</artifactId>
         <version>2.4</version>
         <configuration>
            <archive>
               <manifest>
                  <!-- agrega el classpath al archivo MANIFEST.MF-->
                  <addClasspath>true</addClasspath>
                  <classpathPrefix>lib-${project.version}/</classpathPrefix>
               </manifest>
            </archive>
         </configuration>
      </plugin>

      <plugin>
         <!-- crea un directorio que contenga los JARs de las dependencias -->
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-dependency-plugin</artifactId>
         <version>2.6</version>
         <executions>
            <execution>
               <id>copy-dependencies</id>
               <phase>package</phase>
               <goals>
                  <goal>copy-dependencies</goal>
               </goals>
               <configuration>
                  <outputDirectory>${project.build.directory}/lib-${project.version}</outputDirectory>
                  <includeScope>compile</includeScope>
                  <!-- en particular, no incluir las dependencias con scope test -->
               </configuration>
            </execution>
         </executions>
      </plugin>
   </plugins>
</build>

11 de diciembre de 2012

Sybase: permitir entrar sólo al dbo

En Sybase ASE 15, se puede modificar una base de datos para que sólo pueda entrar el usuario dbo. Para ello, activar el parámetro dbo_use_only:


use master
exec sp_dboption DBName, 'dbo_use_only', true
use BASEDEDATOS
checkpoint


y para regresar el atributo, poner su valor en false.

6 de diciembre de 2012

El nuevo recolector de basura de Java 7

En la Java Virtual Machine, el recolector de basura (garbage collector) libera espacios de memoria que ya no se usan. En Java 6 y anteriores, la memoria se divide en tres espacios contiguos. En Java 7, el nuevo recolector G1 divide la memoria en múltiples regiones contiguas de memoria.



Otra característica interesante del recolector G1 es que compacta la memoria usada en dichas regiones usando múltiples hilos de ejecución.

Se recomienda el uso cuando se tiene 6 Gb o más de heap, y se requiere que el recolector provoque pausas predecibles menores a medio segundo. En cambio, se recomienda seguir usando los recolectores de Java 6 y anteriores si estos no provocan pausas prolongadas en la JVM.

Referencia: Getting started with the G1 Garbage Collector.




21 de noviembre de 2012

Maven: cómo excluir los archivos de firma usando el plugin shade

Al usar el plugin Shade de Maven, crea un solo JAR que incluye todos los archivos de las dependencias. El problema es que también incluye la firma digital de los JARs, lo cual causará el problema al usar el nuevo JAR.

Para excluir dichos archivos, se puede configurar el plugin de la siguiente forma:

<build>
   <plugins>
      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-shade-plugin</artifactId>
         <version>2.0</version>
         <executions>
            <execution>
               <phase>package</phase>
               <goals>
                  <goal>shade</goal>
               </goals>
               <configuration>
                  <filters>
                     <filter>
                        <artifact>*:*</artifact>
                        <excludes>
                           <exclude>META-INF/*.SF</exclude>
                           <exclude>META-INF/*.DSA</exclude>
                           <exclude>META-INF/*.RSA</exclude>
                        </excludes>
                     </filter>
                  </filters>
               </configuration>
            </execution>
         </executions>
      </plugin>
   </plugins>
</build>

9 de noviembre de 2012

Java en Sybase ASE 15

En Sybase Adaptive Server Enterprise 15, se puede ejecutar Java 6, pues cuenta con una JVM.

No están implementadas todas las clases de Java SE, pero tiene las suficientes para ser útil. Para acceder la base de datos, se puede usar JDBC; está optimizado y no se conecta mediante la red.

Para instalar las clases, se necesita que estén empaquetadas en un JAR que no esté comprimido.

Por ejemplo, si se tiene la siguiente clase de Java:
 
package com.arturotena.pruebas;
public class Echo {
   public static String echo(String s) {
     return s + " (" + System.getProperty("java.version") + ")";
   }
}


En UNIX se puede compilar y empaqutar de la siguiente forma:
 

$ javac classes/com/arturotena/pruebas/Echo.java
$ jar cv0f Echo-1.0.0.jar -C classes .

Después, para instalarla se usa la utilería installjava de Sybase ASE:
 
$ installjava -f Echo-1.0.0.jar -j Echo_1_0_0 -S servidor -U usuario -D base

Si se instaló previamente la clase, agregar el parámetro -update.

Y en SQL se puede usar el método estático público de la clase como una función definida por el usuario:
 
SELECT CONVERT(VARCHAR(20), com.arturotena.pruebas.Echo.echo("Hola, mundo"))

La JVM de Sybase ASE incluye varias clases del paquete java.net.*, de forma que es posible acceder la red para, por ejemplo, enviar correo.

Actualización: Para desinstalar un JAR de la base de datos, usar:

remove java jar Echo_1_0_0

Y para descargar el JAR, usar:

$ extractjava –j Echo_1_0_0 -f Echo-1.0.0.jar

Más información: Java in Adaptative Server Enterprise.

17 de octubre de 2012

Apple liberó Java 6 update 37 para OS X

El día de ayer, Apple liberó la actualización de Java para OS X 2012-006.

Me parece relevante que, en esta versión, Apple decidió desinstalar el plug-in de Java, dando la opción al usuario final para descargar la versión de Oracle con un solo clic.

Esta versión corresponde a Java SE 6 1.6.0 update 37, la cual dice Oracle que será la última liberación de Java 6.

El archivo DMG se puede descargar en el sitio de desarrolladores de Apple.

23 de julio de 2012

Cómo guardar datos localmente en HTML

Según observo, actualmente (julio 2012), las posibles APIs para almacenar localmente datos en HTML son las siguientes:
  1. Storage
  2. SQL Database
  3. IndexedDB
    • Lista de pares de valores, con índices para mejorar desempeño.
    • Me parece que todavía no está implementada entre varios navegadores.
    • Especificación:
Un ejemplo del uso del Storage (con el objeto LocalStorage, que mantiene los valores incluso cuando se cierra el navegador) es el siguiente:


<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8"/>
    <title>LocalStorage Example</title>
  </head>
  <body>
    <h1>Storage Example</h1>

    <script type="text/javascript" charset="utf-8">
      if(typeof(Storage)!="undefined" && typeof(localStorage)!="undefined") {

        var value1 = window.localStorage.getItem("key1");
        var value2 = window.localStorage.getItem("key2");
        alert("value1="+value1);
        alert("value2="+value2);
        window.localStorage.setItem("key1", "aaa");
        window.localStorage.setItem("key2", "bbb");
        value1 = window.localStorage.getItem("key1");
        value2 = window.localStorage.getItem("key2");
        alert("value1="+value1);
        alert("value2="+value2);

      }
    </script>

  </body>
</html>

Este ejemplo lo probé en Apple Safari 5.1.2, Mozilla Firefox 13.0.1, y Google Chrome 20.0.1132, todos en Microsoft Windows 7. Y no, no corre en Internet Explorer 8.0.7601 (no cuento con Windows 9 para probarlo ahí.)

18 de junio de 2012

Cómo califica Apache Lucene los resultados (scoring)

Extracto traducido de la introducción oficial a la calificación de resultados (scoring):

La calificación en Lucene utiliza una combinación del Modelo de Espacio Vectorial y el Modelo Booleano de recuperación de información para determinar cuán relevante es un Documento en la búsqueda del Usuario. Utiliza el modelo Booleano para limitar el número de documentos que necesitan ser puntuados. Aunque Lucene agrega funcionalidad para poder buscar utilizando operadores booleanos y lógica difusa, esencialmente es un sistema basado en el Modelo de Espacio Vectorial. […] En Lucene, los objetos que son calificados son los Documentos. Un Documento es una colección de Campos. Cada Campo incluye cómo fue creado y almacenado (por ejemplo, si fue dividido en palabras, o varias palabras fueron unidas en una frase)

La descripción formal de la fórmula para calificar se encuentra en la documentación de la clase Similarity.

Otras referencias:


24 de abril de 2012

Un bug re-moto...

Un bug re-moto... ¿fuma hierba en el servidor?

      —Arturo Tena

3 de abril de 2012

El bug me escupió...

El bug me escupió una excepción. —Arturo Tena. 


Imagen: Sergio A. Flores Q.
 


28 de marzo de 2012

Programar... ¿desde qué edad?

No lo sabía:
Costa Rica es un país que ya desde los años 80 apostó por introducir la programación en las escuelas. [...] La tecnología supuso el 41% de las exportaciones totales de 2009. [...] "Casi 500.000 estudiantes de todo el país trabajan semanalmente durante dos periodos lectivos en ejercicios de programación como el diseño y elaboración de juegos, desde los primeros años escolares, en un enfoque más bien lúdico." —Anahi Aradas. La programación de computadoras es "el latín del siglo XXI". BBC Mundo Tecnología. 2012-03-29. Accedido en 2012-03-29. (Archivado por WebCite.)

En lo personal, recuerdo con cariño la primera vez que "programé" (o más bien copié un programa) en Logo, en una exposición de tecnología hace algunos ayeres. Compartíamos la computadora tres niños que, deseosos de acercarse a ese mundo, nos turnábamos para teclear unas pocas letras del listado impreso que previamente nos habían proporcionado.

Más tarde, en la Preparatoria y luego la Licenciatura, noté que se les dificultaba las asignaturas de programación a algunos compañeros que no habían tenido contacto previo con dichos menesteres.

¿Sería provechoso, como sociedad, comenzar a exponer a los niños a un ambiente de programación computacional? Opino que sí, pues este les ayudaría a fortalecer su capacidad de abstracción y racionamiento lógico.

[Agregado]

¿Cómo decidir a quiénes enseñar y a quienes no? Tal vez se puedan integrar a la currícula como materias optativas.

Adicionalmente, antes de preguntarse cuál lenguaje de programación enseñar, opino que vale la pena preguntarse: ¿cuál paradigma de programación enseñar? Tal vez el paradigma declarativo (incluyendo los lenguajes lógicos y funcionales) y el dirigido por eventos sean mucho más fácil de aprender que los imperativos. En mi opinión, el usar lenguajes específicos de dominio sería una introducción más amigable para muchas personas.

Fotografía: (cc) chadmiller.

23 de marzo de 2012

Amor por la programación

Recuerdo cuando, teniendo yo 11 años, encendí mi primera computadora (mi viejita y amada Commodore 16). Leí en la pantalla de la televisión las misteriosas letras "R", "E", "A", "D", e "Y" —en ese tiempo, no entendía el inglés— y vi un cuadrado blanco parpadeante. Escribí "hola", y presioné la tecla "Enter". Apareció un críptico mensaje: "Syntax Error"... y de nuevo el chistoso cuadrado. "¡Oh! ¡Vaya!", pensé, "¡debe haber alguna forma de comunicarme con esta máquina!..." Y así, nació mi amor por la programación.

11 de marzo de 2012

Emoción y arte al diseñar las interfaces de usuario

Incorpora emoción y arte al diseño de la interfaz de usuario.

Sí importa cuidar la interfaz del usuario. Si la cuidas, puedes hacer del mundo un lugar mejor.

En primer lugar, eres tu propio cliente: construye cosas [de forma] que te gusten [cómo queden].

Ese es el planteamiento básico que aprendí: a trabajar desde el corazón, y verdaderamente cuidar [la interfaz del usuario].

(Bring emotion and art to computer [UI] design. [...] First and foremost, you are your own customer: You build stuff that you love yourself. [...] That's the basic approach I learned, to work from your heart, and to really, really care [about the UI].)

—Andy Hertzfeld, co-diseñador original de la interfaz de usuario de las computadoras Macintosh de Apple. Citado en el artículo Apple pioneer brings emotion to Google+, de Mike Swift, el 10 de marzo de 2012. (Accedido el 11 de marzo de 2012, archivado por WebCite.)

22 de febrero de 2012

No reutilices código a la fuerza


Opino que:
Es mucho peor forzar la reutilización de código que no reutilizar en absoluto.
Porque:
El número de veces que se reutiliza código sin haber razón alguna, aumenta exponencialmente el número de saltos condicionales en el mismo.
Por tanto:
No reutilices código a la fuerza.
— Arturo Tena