Java es mi color favorito actual. Durante la semana, huelo HTTP/HTML/JS/CSS y otras iniciales. — Arturo Tena.
26 de noviembre de 2011
Colores y olores
23 de noviembre de 2011
Cuando se equivoca...
12 de noviembre de 2011
Engrane gira para mostrar las opciones
11 de noviembre de 2011
Una prueba inconclusa causó estragos en mercados financieros
[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.Todo esto ocurre mientras los funcionarios europeos lanzan una ofensiva contra el comportamiento y el poder de las agencias calificadoras.
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).
Cómo cambiar el idioma de la JVM para un Applet
- Antes de agregarlo, se mostraba el aviso en en Español, pero yo lo quería en Inglés.
- En el Panel de control de Windows, busqué el Panel de control de Java.
- Seleccioné la pestaña Java, donde está la Configuración del Java Runtime Enviroment, y oprimí el botón Ver.
- En la pestaña de Usuario, la tabla muestra los ambientes de ejecución de Java que están registrados.
- En la columna Parámetros del entorno de ejecución, agregué el parámetro user.language=en.
- 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
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.
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)
¿Cuántas de las aplicaciones que usan EJBs cumplen con al menos uno de estos los requisitos?
- 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.
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
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?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.
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)
Espero te sirvan los siguientes libros (lista automática):
5 de octubre de 2011
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.
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
Microsoft Internet Explorer |
Mozilla Firefox |
Sitios web de Google |
3 de octubre de 2011
Java: Cómo leer un atributo privado usando introspección
15 de septiembre de 2011
¿Cuánta memoria usa cada clase en Java?
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 & analysishttp://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 |
16 de julio de 2011
Sombras usando sólo CCS3
7 de julio de 2011
¿Por qué String es final en Java?
1 de julio de 2011
Firmar con un keystore propio en NetBeans
7 de abril de 2011
Cookies de sesión con el mismo nombre y mismo servidor GlassFish 2.1
2 de abril de 2011
Off-topic: Costo de la suscripción: NaN
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:
Así las cosas, creo que por lo pronto me quedaré leyendo blogs gratuitos.
11 de marzo de 2011
Espacio libre de una base de datos Sybase
sp_helpdb
, y no sp_spaceused
.20 de febrero de 2011
Tutorial: Cómo acceder Sybase desde PHP en Java EE, usando GlassFish y Quercus
- Instalé Sybase.
- Descargué e instalé la versión de desarrollo de Sybase Adaptive Server Enterprise 15.5 (enlace directo). La instalación me tomó bastante tiempo.
- Inicié la base de datos: inicié el servicio de Windows llamado Sybase SQLServer.
- 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).
- Descargué e instalé la versión de desarrollo de Sybase Adaptive Server Enterprise 15.5 (enlace directo). La instalación me tomó bastante tiempo.
- Creé una base de prueba.
- En el prompt de isql, ejecuté:
create database base_prueba
go
- 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
- En el prompt de isql, ejecuté:
- Creé una tabla de prueba.
- Me conecté como dbo:
%SYBASE%\%SYBASE_OCS%\bin\isql -Udbo_base_prueba -Ppassword
- Creé la tabla:
create table Tabla1 (valor int)
insert into Tabla1 values (12345)
go
- Me conecté como dbo:
- 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.
- 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
- 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>
- 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>" ?>
- Finalmente, accedí http://localhost:8080/HolaSybasePHP/hola.php:
Libros que espero te sean útiles (lista automática):
11 de febrero de 2011
10 de febrero de 2011
Tutorial: Cómo ejecutar PHP en Java EE usando GlassFish y Quercus
implementación 100% Java de PHP 5 liberada bajo la licencia Open Source GPL.
- Instalé Java.
Tengo Java 6 (1.6.0_18-b07). - Instalé GlassFish.
Para ello, existe documentación de ayuda. Instalé GlassFish 2.1 (2.1-b60) para Windows. - 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. ☺ - Creé una aplicación web.
Simplemente, creé la siguiente estructura de directorio:
- HolaMundoPHP.war
- WEB-INF
- lib
- 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
- 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:
Lo coloqué en el directorio WEB-INF de mi aplicación Web:<?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>
- HolaMundoPHP.war
- WEB-INF
- web.xml
- lib
- resin.jar
- Creé un archivo PHP.
El ejemplo clásico, ahora en PHP, llamado hola.php:
Lo coloqué en mi aplicación Web, en donde normalmente se colocan los archivos JSP:<?php echo "Hola mundo PHP"; ?>
- HolaMundoPHP.war
- hola.php
- WEB-INF
- web.xml
- lib
- resin.jar
- Inicié GlassFish.
Mediante el comando asadmin start-domain. - 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
- autodeploy
- domain1
- domains
- glassfish
- Accedí mi aplicación Web.
Accedí http://localhost:8080/HolaMundoPHP/hola.php y voliá.
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)
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).
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.
10 de enero de 2011
Cómo usar Log4J en un EJB en WebLogic 10.3.2
- Copiar el archivo xml4j.jar en el directorio APP-INF\lib dentro de tu archivo .ear.
- Copiar el archivo de configuración de Log4J (yo usé log4j.xml) en el directorio APP-INF\classes dentro de tu archivo .ear.
- Aplicación.ear
- APP-INF
- classes
- xml4j.xml
- lib
- xml4j.jar
- classes
- AplicaciónWeb.war
- APP-INF
<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.