26 de noviembre de 2011

Colores y olores

Java es mi color favorito actual. Durante la semana, huelo HTTP/HTML/JS/CSS y otras iniciales. — Arturo Tena.

23 de noviembre de 2011

Cuando se equivoca...

Cuando un Cirujano se equivoca, entierran al paciente y lo demandan. Cuando un Arquitecto se equivoca, se cae el edificio y lo demandan. Cuando un Ingeniero en Sistemas se equivoca... le compran la siguiente versión del sistema. —Arturo Tena

12 de noviembre de 2011

Engrane gira para mostrar las opciones

Recientemente descubrí que un engrane gira para mostrar las opciones en un juego. Este juego también usa un engrane como icono para mostrar las opciones.

En mi opinión, esto mejora la usabilidad, pues hay una reacción a una acción, en éste caso de hacer clic en el engrane. El que se conserve la dualidad acción-reacción es un punto importante al diseñar interfaces de usuario.

A tí, ¿qué te parece? Déjame tu comentario


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

11 de noviembre de 2011

Una prueba inconclusa causó estragos en mercados financieros

Por un error [al no terminar una prueba] en una antigua página web, la calificadora Standard & Poor's envió algunos correos electrónicos avisando que bajaba la categoría de la deuda de Francia, causando breves estragos en los mercados y el enojo de los responsables de las políticas de la Unión Europea. El detalle técnico es:
[La empresa] dice que en Diciembre de 2010, mostró la Evaluación de Riesgos del Sector Bancario Nacional (BICRA por sus siglas en inglés) para Francia en el Portal de Crédito Global de la compañía.

Hicieron esto como una prueba, pero al final no mostraron en el portal la clasificación BICRA [correcta] del país.

El Jueves, cuando S&P hicieron pública una revisión de la clasificación BICRA, la página para Francia del portal mostró automáticamente "N/A", o "no disponible" ("not available" en Inglés).

Esto envió correos electrónicos a los suscriptores notificándoles que [la compañía] bajaba la categoría de la deuda de Francia, la cual tiene una categoria prestigiosa de AAA, provocando breves estragos en los mercados antes que S&P enviara una corrección.

S&P: Year-old web change caused France rating error. Accedido el 2011-11-11. (Archivado por WebCite® en http://www.webcitation.org/6386h9wPG).
Todo esto ocurre mientras los funcionarios europeos lanzan una ofensiva contra el comportamiento y el poder de las agencias calificadoras.

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):

5 de octubre de 2011

Java Duke: modelos en 3D

http://www.brussels-jug.be/?p=813

Java Duke: imágenes en 2D

http://duke.kenai.com/

Peor que no escribir comentarios


Peor que no escribir comentarios en el código fuente, es dejar un comentario erróneo. —Autor desconocido.

Lo peor de un bug aleatorio


Lo peor de un bug aleatorio, es que nunca sabes si ya lo arreglaste. —Arturo Tena.

La última falacia del programador


La última falacia del programador: Ya acabé. —Arturo Tena.

Code talks


Code talks. —Arturo Tena.

El bug no está donde tú crees


El bug no está en donde tú crees. —Arturo Tena.

¡Hi-Ho, Hi-Ho, vamos a debuggear!


¡Hi-Ho, Hi-Ho, vamos a debugear! (con música de fondo: la canción que cantan los enanitos en la película Blancanieves y los Siete Enanitos) —Arturo Tena.

Barriga llena, programador contento

Barriga llena, programador contento. —Arturo Tena

Dí que es fácil

Cuando vayas a explicar algo difícil de entender, antes menciona que es fácil de entender. Así, la gente estará más dispuesta a escucharte. —Autor desconocido.

Un icono de engrane para la configuración y las opciones

El icono de un engrane es usado por los navegadores de Internet para significar la configuración y las opciones, lo que me parece muy acertado:

Microsoft Internet Explorer

Mozilla Firefox
Google lo usa en sus sitios web:

Sitios web de Google
Aunque Chrome no lo usa (todavía). En cambio, utiliza una llave inglesa, algo que me parece menos intuitivo que un engrane:


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.

15 de septiembre de 2011

¿Cuánta memoria usa cada clase en Java?

Las siguientes herramientas nos ayudarán a diagnosticar en qué se consume la memoria heap en la máquina virtual de Java: jmap y jhat, las cuales están incluidas en el JDK.

Heap histogram

The jmap command will help you get a heap histogram that shows the per-class statistics, including the total number of instances and the total number of bytes occupied by the instances of each class.

http://java.sun.com/developer/technicalArticles/J2SE/monitoring/#Heap_Histogram

$ <JDK>/bin/jmap -histo:live <pid>
num   #instances    #bytes  class name
--------------------------------------
  1:    100000    41600000  [LMemLeak$LeakingClass;
  2:    100000     2400000  MemLeak$LeakingClass
  3:     12726     1337184  <constMethodKlass>
  4:     12726     1021872  <methodKlass>
  5:       694      915336  [Ljava.lang.Object;
  6:     19443      781536  <symbolKlass>
  7:      1177      591128  <constantPoolKlass>
  8:      1177      456152  <instanceKlassKlass>
  9:      1117      393744  <constantPoolCacheKlass>
 10:      1360      246632  [B
 11:      3799      238040  [C
 12:     10042      160672  MemLeak$FinalizableObject
 13:      1321      126816  java.lang.Class
 14:      1740       98832  [S
 15:      4004       96096  java.lang.String
 < more .....>

Heap dump & analysis

http://java.sun.com/developer/technicalArticles/J2SE/monitoring/#Heap_Dump
http://java.sun.com/developer/technicalArticles/J2SE/monitoring/#Heap_Analysis

You can use the jmap command to get a heap dump with this command line:

$ <JDK>/bin/jmap -dump:live,file=heap.dump.out,format=b <pid>

You can use the jhat command to do the heap analysis and determine which references are keeping the leak suspect alive:

$ <JDK>/bin/jhat heap.dump.out

This tool supports a number of queries including the following:
  • Show all reference paths from the root set to a given object. This is particularly useful for finding memory leaks. 
  • Show the instance counts for all classes. 
  • Show the heap histogram including the instance counts and sizes for all classes. 
  • Show the finalizer summary.

21 de julio de 2011

PasteHTML: Web hosting gratuito, sin publicidad y anónimo

Imagen: (c) PasteHTML.com
Necesitaba un servicio de web hosting gratuito que no agregara ningún aviso de publicidad. Mejor dicho, que no modificara la página de ninguna manera, pues necesitaba arreglar una página HTML que contiene CSS y Javascript para que se viera y funcionara mejor en una iPad. Por supuesto, he usado Zymic anteriormente, pero por alguna razón no podía accederlo hoy. Como alternativa, encontré PasteHTML, un curioso servicio en el que simplemente escribes —o pegas— el código HTML, y lo publicas.

16 de julio de 2011

Sombras usando sólo CCS3

Para lograr el efecto de sombra en el siguiente texto, usando únicamente CSS3, usé el siguiente código:

1 de julio de 2011

Firmar con un keystore propio en NetBeans

(cc) Steven Depolo
Necesitaba firmar un Java Applet con un keystore propio, y no el que genera automáticamente NetBeans.

7 de abril de 2011

Cookies de sesión con el mismo nombre y mismo servidor GlassFish 2.1

¿Ocurre un error cuando se utilizan dos cookies de sesión que tienen el mismo nombre y provienen del mismo servidor? La respuesta es: depende. No ocurrirá error si tienen diferente ruta (path).

2 de abril de 2011

Off-topic: Costo de la suscripción: NaN

Mientras navegaba en el sitio recientemente renovado Java.net, ví un enlace en la parte izquierda que dice "Online Books", el cual lleva a una versión modificada de Safari Books Online, el servicio de O'Reilly para venta y arrendamiento de libros electrónicos.

Lo curioso es que el costo de la suscripción es... NaN.


Después de dudar si mi tarjeta sería cargada con algo que... no es un número, acepté la oferta y me registré. Pero creo que al sistema no le gustó esta promoción:


Me pregunto si O'Reilly mandará a sus contadores para cobrarme... lo que no es un número.

Tal vez O'Reilly está indicándoles a los inteligentísimos programadores de Java.net que el costo de la suscripción es... el valor de NaN, es decir:

0x7ff8000000000000 = $9,221,120,237,041,090,560USD ≫ lo que pienso gastarme en comprar libros durante el resto de mi vida.

Así las cosas, creo que por lo pronto me quedaré leyendo blogs gratuitos.

11 de marzo de 2011

20 de febrero de 2011

Tutorial: Cómo acceder Sybase desde PHP en Java EE, usando GlassFish y Quercus

Image of Duke and PHP togetherEn mi tutorial anterior, ejecuté PHP en Java EE usando GlassFish y Quercus. Hoy, accedí una base de datos Sybase ASE desde PHP en un servidor Java EE.
  1. Instalé Sybase.
    1. Descargué e instalé la versión de desarrollo de Sybase Adaptive Server Enterprise 15.5 (enlace directo). La instalación me tomó bastante tiempo.
    2. Inicié la base de datos: inicié el servicio de Windows llamado Sybase SQLServer.
    3. Verifiqué la conexión a Sybase. En la línea de comandos de Windows, ejecuté:
      %SYBASE%\%SYBASE_OCS%\bin\isql -Usa -P
      Estando en el prompt de isql, ejecuté:
      select @@version
      go

      (A propósito, el usuario administrador es sa e inicialmente no tiene contraseña).
  2. Creé una base de prueba.
    1. En el prompt de isql, ejecuté:
      create database base_prueba
      go

    2. Creé su database owner:
      sp_addlogin dbo_base_prueba, password
      use base_prueba
      sp_changedbowner dbo_base_prueba
      sp_modifylogin dbo_base_prueba, defdb, base_prueba
      go
      exit
  3. Creé una tabla de prueba.
    1. Me conecté como dbo:
      %SYBASE%\%SYBASE_OCS%\bin\isql -Udbo_base_prueba -Ppassword
    2. Creé la tabla:
      create table Tabla1 (valor int)
      insert into Tabla1 values (12345)
      go
  4. Creé el DataSource en GlassFish.
    • Copié el driver JDBC de Sybase: copié el archivo Sybase\jConnect-6_0\classes\jconn3.jar al directorio glassfish\domains\domain1\lib\ext, y reinicié GlassFish.
    • Creé el connection pool, especificando la clase del driver como com.sybase.jdbc3.jdbc.SybDataSource.
    • Creé el DataSource y como nombre JNDI escribí jdbc/base.
  5. Creé una aplicación para ejecutar PHP en Java EE.
    • Usando mi tutorial anterior, creé una aplicación llamada HolaSybasePHP:
      • HolaSybasePHP.war
        • hola.php
        • WEB-INF
          • web.xml
          • lib
            • resin.jar
  6. Especifiqué el DataSource en la aplicación.
    • Agregué las siguientes líneas antes del tag final del archivo web.xml de mi aplicación:
      <resource-ref>
        <res-ref-name>jdbc/base</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
      </resource-ref>
  7. Modifiqué la página PHP.
    • Usé PDO (portable database object) de PHP 5:
      <p>Hola Sybase desde PHP.</p>
      <?php
      $pdo = new PDO("java:comp/env/jdbc/base");
      echo "<table border=1>"
      $sql = "SELECT valor FROM Tabla1";
      foreach ($pdo->query($sql) as $renglon) {
         echo "<tr><td>$renglon[valor]</td></tr>";
      }
      echo "</table>"
      ?>
  8. Finalmente, accedí http://localhost:8080/HolaSybasePHP/hola.php:
Una imagen del navegador de Internet mostrando en su interior Hola Sybase desde PHP 12345

Libros que espero te sean útiles (lista automática):

10 de febrero de 2011

Tutorial: Cómo ejecutar PHP en Java EE usando GlassFish y Quercus

Image of Duke and PHP togetherHoy ejecuté una página PHP en un servidor de aplicaciones Java EE llamado GlassFish. Esto es posible usando un intérprete llamado Quercus, que es una implementación 100% Java de PHP 5 liberada bajo la licencia Open Source GPL.
  1. Instalé Java.
    Tengo Java 6 (1.6.0_18-b07).
  2. Instalé GlassFish.
    Para ello, existe documentación de ayuda. Instalé GlassFish 2.1 (2.1-b60) para Windows.
  3. Descargé Quercus y lo descomprimí.
    Descargué el archivo .war de Quercus 4.0.11 de la página de Quercus. También hurgé en el contenido. ☺
  4. Creé una aplicación web.
    Simplemente, creé la siguiente estructura de directorio:
    • HolaMundoPHP.war
      • WEB-INF
        • lib
  5. Copié la biblioteca de Quercus.
    Copié el archivo resin.jar del directorio WEB-INF/lib del WAR de Quercus a mi aplicación Web:
    • HolaMundoPHP.war
      • WEB-INF
        • lib
          • resin.jar
  6. Creé el archivo web.xml
    Creé el archivo web.xml de mi aplicación Web, indicando que el Servlet de Quercus atendiera las peticiones a las páginas PHP:

    <?xml version="1.0" encoding="UTF-8"?>
     <web-app xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
     version="2.5">
     <description>Tutorial para ejecutar PHP en Java EE usando GlassFish y Quercus</description>
      <servlet>
       <servlet-name>QuercusServlet</servlet-name>
       <servlet-class>com.caucho.quercus.servlet.QuercusServlet</servlet-class>
      </servlet>
     <servlet-mapping>
      <servlet-name>QuercusServlet</servlet-name>
      <url-pattern>*.php</url-pattern>
     </servlet-mapping>
    </web-app>
    Lo coloqué en el directorio WEB-INF de mi aplicación Web:
    • HolaMundoPHP.war
      • WEB-INF
        • web.xml
        • lib
          • resin.jar
  7. Creé un archivo PHP.
    El ejemplo clásico, ahora en PHP, llamado hola.php:
    <?php
    echo "Hola mundo PHP";
    ?>
    Lo coloqué en mi aplicación Web, en donde normalmente se colocan los archivos JSP:
    • HolaMundoPHP.war
      • hola.php
      • WEB-INF
        • web.xml
        • lib
          • resin.jar
  8. Inicié GlassFish.
    Mediante el comando asadmin start-domain.
  9. Instalé mi aplicación usando autodeploy
    Copié el directorio de mi aplicación (HolaMundoPHP.war) al área de autodeploy del dominio de GlassFish. En mi caso, lo copie en glassfish\domains\domain1\autodeploy:
    • glassfish
      • domains
        • domain1
          • autodeploy
            • HolaMundoPHP.war
  10. Accedí mi aplicación Web.
    Accedí http://localhost:8080/HolaMundoPHP/hola.php y voliá.

Imagen del navegador con el texto Hola mundo PHP

Libros que espero te sean útiles (lista automática):

28 de enero de 2011

Respaldar en Windows con XCOPY

Necesité ejecutar un respaldo en una Tarea programada de Windows, usando XCOPY. He aquí el script.

@echo off

REM http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/xcopy.mspx?mfr=true
REM /y Do not ask about overwritting
REM /q quit
REM /s copy subdirectories
REM /i create source directory
REM /e copy empty directories
REM /k retain read only attribute
REM /r copy read only files
REM /h copy hidden and system files
REM /exclude:filename1[+[filename2]][+[filename3]] : Specifies a list of files containing strings.

set SOURCEDIR=%1

set DATETIME=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%

xcopy %SOURCEDIR% %SOURCEDIR%-%DATETIME% /i /s /e /k /r /h >> %SOURCEDIR%-%DATETIME%.log 2>&1

if errorlevel 5 goto diskerror
if errorlevel 4 goto lowmemory
if errorlevel 2 goto abort
if errorlevel 0 goto exit

:lowmemory
echo Insufficient memory to copy files or invalid drive or command-line syntax. >> %SOURCEDIR%-%DATETIME%.log
goto exit

:abort
echo You pressed CTRL+C to end the copy operation. >> %SOURCEDIR%-%DATETIME%.log
goto exit

:diskerror
echo Disk error. >> %SOURCEDIR%-%DATETIME%.log
goto exit

:exit

13 de enero de 2011

Checkbox de tres estados sin imágenes en HTML (estado indeterminado)

Necesitábamos un checkbox de tres estados para una sección de nuestro sitio de Internet. El checkbox debería iniciar en el tercer estado al cargar la página. También, debería poderse regresar al tercer estado usando Javascript. Además, quería que se usara el control nativo de la plataforma en la que se consultara, por lo que no podía usar imágenes. Encontré el atributo indeterminate.
Al parecer, sólo se puede acceder a este atributo mediante Javascript.

<form>
   <input id="c" type="checkbox" checked="checked"/>
</form>
<script>
   document.getElementById('c').indeterminate = true;
</script>

En la página 614 del libro Dynamic HTML: The Definitive Reference se menciona que este atributo lo reconoce Microsoft Internet Explorer versión 4 en adelante (Danny Goodman, O'Reilly Media, Third Edition edition, ISBN-10: 0596527403, ISBN-13: 978-0596527402.)


El sitio MSDN de Microsoft dice:
The indeterminate property can be used to indicate whether the user has acted on a control. For example, setting the indeterminate to true causes the check box to appear checked and dimmed, indicating an indeterminate state. The value of the indeterminate property acts independently of the values of the checked and status properties. Creating an indeterminate state is different from disabling the control. Consequently, a check box in the indeterminate state can still receive the focus. When the user clicks an indeterminate control, the indeterminate state turns off and the checked state of the check box toggles. (http://msdn.microsoft.com/en-us/library/ms533894.aspx)
El Working Draft de HTML5 más reciente hasta el día de hoy dice:
If the element's indeterminate IDL attribute is set to true, then the control's selection should be obscured as if the control was in a third, indeterminate, state. The control is never a true tri-state control, even if the element's indeterminate IDL attribute is set to true. The indeterminate IDL attribute only gives the appearance of a third state (HTML5, A vocabulary and associated APIs for HTML and XHTML, W3C Working Draft 13 January 2011).
Libros que, espero, encuentres útiles (lista automática):

11 de enero de 2011

Monitorando WebLogic 10.3.2 con JMX y JConsole

Se puede usar JMX para monitorear el uso de memoria, del CPU y qué está haciendo cada hilo de ejecución (thread) en un servidor WebLogic.


Para habilitar JMX agregué, al script de inicio de mi instancia de desarrollo, los siguientes parámetros, descritos en PerformanceEngineer.com:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8888
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

Después ejecuté JConsole, que se distribuye como parte del JDK, agregando el siguiente parámetro:

service:jmx:rmi:///jndi/rmi://127.0.0.1:8888/jmxrmi

JConsole también permite monitorear el uso de los distintos tipos de memoria, condiciones de bloqueo mutuo entre threads (deadlocks), y desplegar información de los MBeans.

Por supuesto, también existe VisualVM que es un proyecto más completo para monitorear aplicaciones hechas en Java.

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

10 de enero de 2011

Cómo usar Log4J en un EJB en WebLogic 10.3.2

Para usar Log4J dentro de un EJB en WebLogic versión 10.3.2, necesitas:
  1. Copiar el archivo xml4j.jar en el directorio APP-INF\lib dentro de tu archivo .ear.
  2. Copiar el archivo de configuración de Log4J (yo usé log4j.xml) en el directorio APP-INF\classes dentro de tu archivo .ear.
Quedará una estructura como la siguiente:
  • Aplicación.ear
    • APP-INF
      • classes
        • xml4j.xml
      • lib
        • xml4j.jar
    • AplicaciónWeb.war
El directorio APP-INF\lib es propietario de WebLogic. En su lugar, en GlassFish puedes usar el tag <library-directory> del estandar Java EE 5.

Log4J es una biblioteca de Java para escribir un registro o bitácora de las actividades de un sistema de cómputo.

Libros que espero te sean útiles:

4 de enero de 2011

Cuidado con for...var en ActionScript (es diferente que en Java)

Una aplicación que hicimos con Flex, usando ActionScript 3, tenía un error. La causa fue que el ámbito (scope) de las variables en ActionScript es diferente que en Java. Al ser programadores que provenimos de Java, dimos por sentado que eran iguales.

El código en cuestión era semejante a lo siguiente:

function f () {
   for (...; ...; ...) {
      for (var j:int; ...; ...) {
         // Creíamos que j tenía un valor de cero cada vez
         // que se ejecutaba el ciclo anidado.
      }
   }
}

El compilador de ActionScript declara e inicializa sólo una vez la variable j dentro de la función f. Esto implica que, la segunda vez que se ejecuta el ciclo anidado, conserva el valor con el que terminó la ejecución anterior.

El error lo arreglamos inicializando explícitamente la variable.

function f () {
   for (...; ...; ...) {
      for (var j:int = 0; ...; ...) {
         // Ahora, j siempre inicia con un valor de cero.
      }
   }
}

Este comportamiento está descrito claramente en la documentación de ActionScript 3:

ActionScript 3.0, variables are always assigned the scope of the function or class in which they are declared. [...] ActionScript variables, unlike variables in C++ and Java, do not have block-level scope. [...] If you declare a variable inside a block of code, that variable will be available not only in that block of code, but also in any other parts of the function to which the code block belongs. —Adobe. Programming ActionScript 3.0 / ActionScript language and syntax / Variables. URL: http://livedocs.adobe.com/flex/3/html/03_Language_and_Syntax_07.html#118946. Accedido: 2011-01-04. (Archivado por WebCite®)

De hecho, el compilador mueve las declaraciones de variables el inicio de la función (a esto se le llama hoisting —subimiento, levantamiento o alzamiento), haciéndolas disponibles para todo el cuerpo de la función.

Creo que seré más cuidadoso en no presuponer cómo funciona el lenguaje en el que estoy programando.