Mostrando las entradas con la etiqueta § Lenguajes. Mostrar todas las entradas
Mostrando las entradas con la etiqueta § Lenguajes. Mostrar todas las entradas

18 de junio de 2014

Cómo aumentar la memoria a NetBeans

Para aumentar la memoria que usa NetBeans 7.2, modifiqué el siguiente archivo:

[NETBEANS_DIRECTORY]/etc/netbeans.conf

Agregué los siguientes valores a la propiedad "netbeans_default_options":

-J-Xms800m -J-Xmx800m -J-XX:+UseConcMarkSweepGC -J-XX:+CMSClassUnloadingEnabled -J-XX:+CMSPermGenSweepingEnabled

No modifiqué el parámetro -J-XX:PermSize=32m.

30 de abril de 2014

Cómo funcionan realmente los EJB de sesión (Stateful Session Beans, SFSB) en Java

(CC) Lilian Wong
Los EJB de sesión (Stateful Session Beans, SFSB) no funcionan como yo pensaba.

(Pensaba que podían llamarse desde un Servlet o desde un EJB Stateless (Stateless Session Bean, SLSB) y que automágicamente diferenciaran entre los navegadores que están accediendo la aplicación Web. Pero no es así.)


Conclusiones
  • El cliente de un SFSB debe guardar la referencia, para poder acceder a la misma instancia.
  • Una referencia a un SLSB no garantiza que se acceda a la misma instancia, pues el servidor típicamente tiene un pool.
  • Si el cliente es la capa web (un Servlet, una JSP), se recomienda guardar la referencia en la sesión web.
  • No es útil ejecutar un SFSB desde un SLSB, pues la instancia que usará será nueva.
  • No se debe inyectar (EJB 3) un SFSB en un SLSB, pues clientes diferentes accederan al SLSB pero estarán accediendo al mismo SFSB.

Referencias

5 de marzo de 2014

Detecta conexiones perdidas (connection leak) a la base de datos en Glassfish 3.1

En ocasiones, una aplicación web deja abiertas conexiones a la base de datos que ya no usará (conexiones perdidas, “connection leak” en inglés). Este error se puede detectar usando las herramientas que tiene Glassfish (lo probé en Glassfish 3.1.2.2). Los pasos son los siguientes.

1. Accede la consulta de Glassfish (normalmente en localhost:4848)

2. Activa la detección de conexiones perdidas en el pool (Resources > JDBC > JDBC Connection Pools > pool > Advanced > Connection Settings > Connection Leak Timeout)



3. Activa el monitor del pool (Monitoring > Action > Configure Monitoring, JDBC Connection Pool > Monitoring Level=HIGH)





4. Accede al monitor del pool (Monitoring Data > View Monitoring Data > Resources)



5. Usa tu aplicación, y detecta cuando el parámetro NumPotentialConnLeak sea mayor a cero.



6. Busca la clase y el número de línea donde ocurrió la pérdida de la conexión (leak) en el stacktrace del hilo de ejecución (thread) en la bitácora del servidor (server > General > View Log Files > Log Viewer Results > Message > details > Complete Message)



7. Arregla el error. :)

18 de septiembre de 2013

Sybase, Unicode, y Java JDBC

Hoy necesité insertar un texto similar al siguiente en una base de datos Sybase ASE 15.x desde Java usando JDBC:

aaa aáa bbb’ aaa

El texto tenía tanto acentos como otros caracteres usuales en español, así como algunos otros no tan usuales. En la cadena de ejemplo, el noveno caracter no es un apóstrofo (RAE), sino comillas simples de apertura (RAE). Además, al final los puntos supensivos (RAE) no son tres caracter de punto (RAE), sino un solo caracter. Estos caracteres están definidos en el estándar Unicode.

Al intentar insertarla, el driver JDBC JConnect para Sybase lanzaba una excepción, diciendo que se había intentado insertar un registro con una columna con un valor de nulo. El problema no era que estuviera vacía la cadena, sino tenía que ver con la codificación de los caracteres.

Encontré dos soluciones:

1. Especificar el código de caracteres

Al conectarse desde Java usando JDBC, especificar la codificación que se usará [1][2].
Properties props = new Properties();
props.put("charset", "utf8");
Connection conn = DriverManager.getConnection(JDBC_URL, props);

Esto quizá implicará que se deberá cuidar cuáles funciones de texto en Sybase se ocupan. En Java, JDBC se encarga de hacer la conversión transparente.

2. Eliminar los caracteres inválidos

Hacer que Java no envíe caracteres que sean inválidos en la codificación que utiliza el servidor Sybase. En mi caso, estaba usando la codificación ISO-8859-1, así que en Java yo tenia que quitar o convertir los caracteres que no tenían representación en esa codificación. Para lo que yo necesitaba, no me importaba sustituirlos todos por algún caracter que no fuera una letra.

// texto es un String con la cadena "aaa aáa ‘bbb’ aaa…"
byte[] bytes = texto.getBytes(StandardCharsets.ISO_8859_1);
texto = new String(bytes, StandardCharsets.ISO_8859_1);

Esto provoca que los caracteres que no se puedan convertir se sustituyan con un caracter de cierre interrogación.

aaa aáa ?bbb? aaa?

Las letras acentuadas se convervan, pues la codificación ISO-8859-1 sí las contienen.

3. Una solución que no es solución

En Sybase se puede especificar que la columna almacenará una cadena que estará codificada usando Unicode [3][4].
CREATE TABLE Tabla (
   Texto UNIVARCHAR(50)
)
Esto hace que Sybase ocupe dos bytes para almacenar cada caracter. Sin embargo, a mí no me funcionó esta solución.

Finalmente

Existen otros detalles de este asunto: Java utiliza internamente Unicode, y específicamente UTF-16 para codificar las cadenas de caracteres, y que bajo esa codificación existen caracteres que ocupan 4 bytes, lo cual implica que en JDBC y Sybase su manejo deberá ser un poco diferente. Sin embargo, eso no lo necesito por hoy.

Referencias:

[1]
https://www.java.net//node/688046
[2]
http://www.sybase.com/detail?id=1009812#MARKER-9-243
[3]
http://es.wikipedia.org/wiki/ISO_8859-1
[4]
http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0.sag1/html/sag1/sag1417.htm

27 de febrero de 2013

Parte de JavaFX para iOS y Android será como Open Source

Richard Bair anunció que Oracle liberará como Open Source la implementación de JavaFX para iOS y Android de JavaFX en un par de meses. Sin embargo, en una actualización matizó que sólo se liberará el sistema gráfico y de ventanas (Prism y Glass), para que la comunidad pueda experimentar. Para saber más de Prism y Glass, consultar JavaFX Architecture and Framework.

6 de febrero de 2013

Maven: Cómo mostrar la versión en la aplicación web

Si necesitas mostrar el número de versión del sistema en una aplicación web construída con Maven, puedes hacer que Maven la escriba en un archivo al momento de construir el WAR, y luego puedes usar una JSP para mostrar el contenido de dicho archivo. Para ello, necesitas configurar el filtrado de los recursos de la aplicación web en el maven-war-plugin. Un ejemplo:

Archivo src/main/webapp/version.txt:
${project.version}

Archivo src/main/webapp/index.jsp:
Versión: 

Archivo pom.xml:
<plugin>
  <groupid>org.apache.maven.plugins</groupid>
  <artifactid>maven-war-plugin</artifactid>
  <version>2.3</version>
  <configuration>
    <webresources>
      <resource>
        <!-- sustituye propiedades de Maven en el contenido de los archivos -->
        <filtering>true</filtering>
        <directory>src/main/webapp</directory>
        <includes>
          <include>**/version.txt</include>
        </includes>
      </resource>
    </webresources>
  </configuration>
</plugin>

30 de enero de 2013

Oracle: 'Debemos arreglar la seguridad en Java'

Imagen por :-Derek
'Debemos arreglar la seguridad en Java', reconocen dos empleados de alto nivel de Oracle [1].

Milton Smith, Lider de Seguridad de Java, y Donald Smith, Director de Desarrollo de Producto en OpenJDK, tuvieron una conferencia telefónica con varios líderes de los grupos de usuarios de Java (JUGs) [2].

Cuando se les cuestionó porqué el instalador de Java también instala la barra de herramientas de Internet del sitio Ask.com, comentaron: 'Esto es algo que Sun inició [...] No puedo discutir el asunto.'

También, ante la pregunta si Java se podría actualizar automáticamente como ya lo hace el navegador Google Chrome y el plugin de Adobe Flash, respondieron: "No hay planes [...] podría ser".

Parafraseando la cancion de Carly Rae Jepsen: 'Hey, Java's broken, and this is crazy, but here’s my bytecode, so fix it, maybe?'

[1] Referencia: JAXenter.
[2] Publicacón de Oracle con el audio: Oracle Speaks up on Java Security.

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>

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.

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.

11 de noviembre de 2011

Cómo cambiar el idioma de la JVM para un Applet

Alguna vez, necesité cambiar el idioma en el cual se mostraba un aviso de seguridad al ejecutar un Applet. Para ello, cambié el idioma preestablecido de la Java Virtual Machine, mediante agregar el parámetro de entorno user.language=en en la JVM.
  1. Antes de agregarlo, se mostraba el aviso en en Español, pero yo lo quería en Inglés.


  2. En el Panel de control de Windows, busqué el Panel de control de Java.


  3. Seleccioné la pestaña Java, donde está la Configuración del Java Runtime Enviroment, y oprimí el botón Ver.


  4. En la pestaña de Usuario, la tabla muestra los ambientes de ejecución de Java que están registrados.


  5. En la columna Parámetros del entorno de ejecución, agregué el parámetro user.language=en.


  6. Después de eso, el aviso ya se mostró en Inglés.


30 de octubre de 2011

Bugs en la JVM HotSpot con Java 7

Hasta hoy me enteré que, cuando se liberó Java 7, la JVM HotSpot tenía algunos bugs, los cuales fueron rápidamente publicitados en Internet. Hasta donde entiendo, también Java 6 está afectado pero, creo, sólo si se habilitan las optimizaciones más agresivas de la máquina virtual.

Me enteré de esto leyendo el PDF de la presentación "Java 7 and Lucene: the story behind the story", presentada en el Apache Lucene Eurocon Barcelona 2011. Al parecer son tres bugs relacionados con la optimización de ciclos.

El problema ya quedó resuelto con la versión Java 7u1 y Java 6u29, según el autor de la presentación. Sin embargo, agrega una recomendación final:
Of course, there is still the recommendation not to use -XX:+AggressiveOpts on any JVM in production!
Espero los siguientes libros te sean útiles (lista automática):

23 de octubre de 2011

Cuándo usar Enterprise Java Beans (EJBs)

No hay duda que existen muchas aplicaciones de Java que utilizan los EJBs (Enterprise Java Beans) sin realmente necesitarlos. Oracle/Sun recomienda usar los EJBs cuando:
La aplicación necesita ser ESCALABLE.
Para atender a un número creciente de usuarios, puede ser necesario distribuir los componentes de la aplicación en múltiples máquinas. No sólo los enterprise beans de una aplicación pueden ejecutarse en diferentes máquinas, sino que también su localización permanecerá transparente a los clientes.
La aplicación debe asegurar la INTEGRIDAD DE LOS DATOS.
Los enterprise beans soportan transacciones, el mecanismo que administra el acceso concurrente a los objetos compartidos.
La aplicación atenderá DIVERSOS CLIENTES.
Con sólo unas pocas líneas de código, los clientes remotos pueden localizar fácilmente los enterprise beans. Estos clientes pueden ser ligeros, diferentes y numerosos.
¿Cuántas de las aplicaciones que usan EJBs cumplen con al menos uno de estos los requisitos?

Referencia: The Java EE 6 Tutorial > Part IV Enterprise Beans > Chapter 14 Enterprise Beans > What Is an Enterprise Bean? > When to Use Enterprise Beans, Oracle Corporation, 2010. (Archived by WebCite® at http://www.webcitation.org/62YhPq2TY)

21 de octubre de 2011

¿GlassFish con Java 7? Todavía no, según Oracle

Actualización: Ahora sé que había un bug en la JVM HotSpot de Java 7.

Alguien quería poner en producción un servidor GlassFish 3.1.1 usando Java 7. Sin embargo, se sorprendió al saber que Java 7 todavía no está disponible para los usuarios finales. En el sitio sitio oficial Java.com aparece el siguiente texto: 
¿Por qué no está todavía disponible Java SE 7 en java.com/es?

La nueva versión de Java estará disponible en primer lugar para los desarrolladores a fin de garantizar que no existen problemas importantes. Posteriormente, la descarga de la versión más reciente estará disponible para los usuarios finales en el sitio web www.java.com/es.

Novedades de Java SE 7. Oracle Corporation. (Archivado el 2011-10-21 por WebCite® en http://www.webcitation.org/62bsWw6lP)
Me llama la atención la frase "a fin de garantizar que no existen problemas importantes". Es decir que, a pesar de que la comunidad que desarrolla GlassFish liberó la versión 3.1.1 específicamente para poder usar Java 7, Oracle considera que éste último todavía no está listo.

Espero te sirvan los siguientes libros (lista automática):

3 de octubre de 2011

Java: Cómo leer un atributo privado usando introspección

Hoy, necesité leer el valor de un atributo de instancia privado en un sistema Java EE. Mediante introspección, es fácil. La parte interesante está en jugar con el Security Manager.