tag:blogger.com,1999:blog-41292589864499247822024-02-21T23:39:09.367-06:00Programación CotidianaUnknownnoreply@blogger.comBlogger63125tag:blogger.com,1999:blog-4129258986449924782.post-91071155709526187122014-09-07T17:30:00.001-05:002014-09-07T17:32:03.913-05:00Cómo eliminé Java completamente de OS XA lo largo del tiempo y de las actualizaciones, he acumulado algunas máquinas virtuales de Java (JVM) en mi Mac con OS X. Desde el tiempo que Apple proporcionaba Java, he intentado mantener las instalaciones bajo control, pero de alguna manera terminé teniendo varias instaladas. Así que me puse a hacer limpieza.<br />
<br />
Sabía que el plugin de Java para applets se instalaba una ruta diferente que los kits de desarrollo (JDK) que había bajado, pero no sabía dónde. Así que me puse a buscarlos:<br />
<ol><li>Entré como un usuario administrador (normalmente uso un usuario estándar.)</li>
<li>Abrí una terminal, y abrí un <i>shell</i> como <code>root</code>:<br />
<script src="https://gist.github.com/arturotena/f18ebd13f4231ec89f85.js">shell -s</script></li>
<li>Busqué todos los archivos que tuvieran <kbd>java</kbd> en su nombre:<br />
<script src="https://gist.github.com/arturotena/07a13c7e402b88d6b2e3.js"></script></li>
<li>De los resultados, quité todos los que tenían que ver con directorios internos de NetBeans, Xcode, VirtualBox y archivos adjuntos de Mail y mis proyectos de desarrollo:<br />
<pre class="terminal">/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java ⇒ 1.8.0_20
/Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home/bin/java ⇒ 1.7.0_45
/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/bin/java ⇒ 1.7.0_51
/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/bin/java ⇒ 1.8.0
/Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/bin/java ⇒ 1.8.0_05
/System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java ⇒ 1.8.0_05
/usr/bin/java → /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
</pre>Después de las flechas dobles, incluyo la versión de Java que se muestra cuando se ejecuta <code>java -version</code> en cada ruta. La última ruta es una liga simbólica.<br />
La primera de las rutas, la que contiene <kbd>JavaAppletPlugin.plugin</kbd>, es el ambiente de ejecución (JRE) que se instala para ejecutar los applets y se actualiza automáticamente. Los JDK no se actualizan automáticamente.<br />
</li>
<li>Finalmente, borré tanto el plugin de Java como todos los JDK:<br />
<pre class="terminal">rm -rf /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin
rm -rf /Library/Java/JavaVirtualMachines/
rm -rf /Library/Application\ Support/Oracle/
rm -rf /Library/Java
</pre></li>
Después de eso, bajé e instalé el JDK más reciente, que en mi caso fue Java 8 update 20.</ol>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4129258986449924782.post-11080453209918842062014-06-18T10:55:00.000-05:002014-06-18T10:55:23.680-05:00Cómo aumentar la memoria a NetBeansPara aumentar la memoria que usa NetBeans 7.2, modifiqué el siguiente archivo:<br />
<br />
<tt>[NETBEANS_DIRECTORY]/etc/netbeans.conf</tt><br />
<br />
Agregué los siguientes valores a la propiedad "netbeans_default_options":<br />
<br />
<code>-J-Xms800m -J-Xmx800m -J-XX:+UseConcMarkSweepGC -J-XX:+CMSClassUnloadingEnabled -J-XX:+CMSPermGenSweepingEnabled</code><br />
<br />
No modifiqué el parámetro <code>-J-XX:PermSize=32m</code>.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4129258986449924782.post-82040583582918690932014-04-30T15:22:00.000-05:002014-04-30T15:26:58.103-05:00Cómo funcionan realmente los EJB de sesión (Stateful Session Beans, SFSB) en Java<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi91CVxOmDZxqFG7g0GAom_K8N8oEmClZ8QmVuvixqRhH-LtOYiPVoIybKICCsxvlNjsXGjP-01H-jcOlB5t156oN8UqKyrh5jilJNzJTrOvDB6aqjPaAH63_Run-vLO3vJ5bkmPyE0Bvs/s1600/BEANS.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi91CVxOmDZxqFG7g0GAom_K8N8oEmClZ8QmVuvixqRhH-LtOYiPVoIybKICCsxvlNjsXGjP-01H-jcOlB5t156oN8UqKyrh5jilJNzJTrOvDB6aqjPaAH63_Run-vLO3vJ5bkmPyE0Bvs/s1600/BEANS.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><a href="https://www.flickr.com/photos/bonjourwill/4528624762/"><span style="font-size: xx-small;">(CC) Lilian Wong</span></a></td></tr>
</tbody></table>
Los EJB de sesión (Stateful Session Beans, SFSB) no funcionan como yo pensaba.<br />
<br />
(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í.)<br />
<br />
<b><br /></b>
<b>Conclusiones</b><br />
<ul>
<li>El cliente de un SFSB debe guardar la referencia, para poder acceder a la misma instancia.</li>
<li>Una referencia a un SLSB no garantiza que se acceda a la misma instancia, pues el servidor típicamente tiene un pool.</li>
<li>Si el cliente es la capa web (un Servlet, una JSP), se recomienda guardar la referencia en la sesión web.</li>
<li>No es útil ejecutar un SFSB desde un SLSB, pues la instancia que usará será nueva.</li>
<li>No se debe inyectar (EJB 3) un SFSB en un SLSB, pues clientes diferentes accederan al SLSB pero estarán accediendo al mismo SFSB.</li>
</ul>
<b><br /></b>
<b>
Referencias</b><br />
<ul>
<li><a href="http://stackoverflow.com/a/11438304/264786">A: Java EE 6: How to call Stateful Session Bean from Stateless Session Bean?</a></li>
<li><a href="http://tomee.apache.org/examples-trunk/simple-stateful/README.html">Simple Stateful</a></li>
<li><a href="http://stackoverflow.com/a/10335380/264786">A: Issue with stateful EJB - keeps one session for all users</a></li>
<li><a href="http://www.datadisk.co.uk/html_docs/ejb/ejb3_session_beans.htm">Session Beans</a></li>
<li><a href="http://stackoverflow.com/questions/8887140/jsf-request-scoped-bean-keeps-recreating-new-stateful-session-beans-on-every-req/8889612#8889612">A: JSF request scoped bean keeps recreating new Stateful session beans on every request?</a></li>
<li><a href="http://docs.jboss.org/weld/reference/latest/en-US/html/beanscdi.html#d0e880">More about beans / Session beans</a></li>
</ul>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4129258986449924782.post-13013819485946601332014-03-05T23:00:00.000-06:002014-03-05T23:00:04.029-06:00Detecta conexiones perdidas (connection leak) a la base de datos en Glassfish 3.1En 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.<br />
<br />
1. Accede la consulta de Glassfish (normalmente en localhost:4848)<br />
<br />
2. Activa la detección de conexiones perdidas en el pool (Resources > JDBC > JDBC Connection Pools > pool > Advanced > Connection Settings > Connection Leak Timeout)<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEWLvtZ0PVzfRdqCvgs8KyBCncbTXP4150Ae48PaWg_BTQQquIqFnH1B30poNilg2i-gXheUxjpjcwzrTuDB6PlZUZvNdgowmYspMYiDq3PbPfk4F_6dbx8I0ZFTGlqp28HRCXflAdxoM/s1600/image001-759886.png"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEWLvtZ0PVzfRdqCvgs8KyBCncbTXP4150Ae48PaWg_BTQQquIqFnH1B30poNilg2i-gXheUxjpjcwzrTuDB6PlZUZvNdgowmYspMYiDq3PbPfk4F_6dbx8I0ZFTGlqp28HRCXflAdxoM/s400/image001-759886.png" /></a><br />
<br />
3. Activa el monitor del pool (Monitoring > Action > Configure Monitoring, JDBC Connection Pool > Monitoring Level=HIGH)<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQY94oMho2OWhhVFHNpCBUD7eJKTB7lEeSAB1t9LRMqz3fQF83R2OZOC1fhM7fVLcs1gvuVJqcEjz-B2RN-4wIvkI-0xjAHQxqpn9gMBkrBk6phawVB_REQxoDS8VuKtzlF8fqu7VYKbc/s1600/image005-762573.png"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQY94oMho2OWhhVFHNpCBUD7eJKTB7lEeSAB1t9LRMqz3fQF83R2OZOC1fhM7fVLcs1gvuVJqcEjz-B2RN-4wIvkI-0xjAHQxqpn9gMBkrBk6phawVB_REQxoDS8VuKtzlF8fqu7VYKbc/s400/image005-762573.png" /></a><br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2eRZIGeyZPA3hXzuGllztg3YYSpD1-rNVHEAvk23lzTGIz8OIrgo2OCC4UiuPBB38JS3GuHWnKv7KwrW-FARFVOv90oI_cS1T1_mVIBc-Sd9RGgyLvvU-YOEyeB4ojCNo263-0SatP-g/s1600/image006-764610.png"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2eRZIGeyZPA3hXzuGllztg3YYSpD1-rNVHEAvk23lzTGIz8OIrgo2OCC4UiuPBB38JS3GuHWnKv7KwrW-FARFVOv90oI_cS1T1_mVIBc-Sd9RGgyLvvU-YOEyeB4ojCNo263-0SatP-g/s400/image006-764610.png" /></a><br />
<br />
4. Accede al monitor del pool (Monitoring Data > View Monitoring Data > Resources)<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnOev0fNa4dLyBCbFl7Nb5K-28SMWjkC8GscGRd211QSu6MuSEqvzAecZiUDVLAYF-tMkAvJTxRRxlPN8hB1y-ekzzo72-OsH0lByiMkr8HXiuBS5Vo9_NGo7MqiHNPnj6dbRlb654sGc/s1600/image002-767205.png"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnOev0fNa4dLyBCbFl7Nb5K-28SMWjkC8GscGRd211QSu6MuSEqvzAecZiUDVLAYF-tMkAvJTxRRxlPN8hB1y-ekzzo72-OsH0lByiMkr8HXiuBS5Vo9_NGo7MqiHNPnj6dbRlb654sGc/s400/image002-767205.png" /></a><br />
<br />
5. Usa tu aplicación, y detecta cuando el parámetro NumPotentialConnLeak sea mayor a cero.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVcJ5iI_ZkM7Sajj1Vep63o6fJI_-Vur8pFQ4_JBmgdHQ98skH9RZQcJWA_i5lHC51zBOfpvq-bWk9PmmUYljzmTdR7Esji0sgs29BpaAayWhRCtFvxUnVSpjdX_eb6XgjdhfViXlZ83c/s1600/image003-769073.png"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVcJ5iI_ZkM7Sajj1Vep63o6fJI_-Vur8pFQ4_JBmgdHQ98skH9RZQcJWA_i5lHC51zBOfpvq-bWk9PmmUYljzmTdR7Esji0sgs29BpaAayWhRCtFvxUnVSpjdX_eb6XgjdhfViXlZ83c/s400/image003-769073.png" /></a><br />
<br />
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)<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBlcFbSDkA0KNmM6rI0SmwUqEdNy9EOGIo5iSxnA55iFfGoHUOrP3NqrwL89MBnQogCurZqELAZWfffWDPVEaVyWdihU7ECgnZ8SO7X_kMsxhpFvJQqSLT-EFkxjNVoLpHHYz1sC9yw6M/s1600/image004-771346.png"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBlcFbSDkA0KNmM6rI0SmwUqEdNy9EOGIo5iSxnA55iFfGoHUOrP3NqrwL89MBnQogCurZqELAZWfffWDPVEaVyWdihU7ECgnZ8SO7X_kMsxhpFvJQqSLT-EFkxjNVoLpHHYz1sC9yw6M/s400/image004-771346.png" /></a><br />
<br />
7. Arregla el error. :)
<!-- Blogger automated replacement: "https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F2.bp.blogspot.com%2F-ULAiBXw2D7s%2FUxddZMawKZI%2FAAAAAAAAE4I%2FVgLdG6ATHcM%2Fs400%2Fimage006-764610.png&container=blogger&gadget=a&rewriteMime=image%2F*" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2eRZIGeyZPA3hXzuGllztg3YYSpD1-rNVHEAvk23lzTGIz8OIrgo2OCC4UiuPBB38JS3GuHWnKv7KwrW-FARFVOv90oI_cS1T1_mVIBc-Sd9RGgyLvvU-YOEyeB4ojCNo263-0SatP-g/s400/image006-764610.png" --><!-- Blogger automated replacement: "https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F4.bp.blogspot.com%2F-G0aIv6y3Tj8%2FUxddZ7jDJVI%2FAAAAAAAAE4Q%2FyXV_m3lWFcY%2Fs400%2Fimage002-767205.png&container=blogger&gadget=a&rewriteMime=image%2F*" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnOev0fNa4dLyBCbFl7Nb5K-28SMWjkC8GscGRd211QSu6MuSEqvzAecZiUDVLAYF-tMkAvJTxRRxlPN8hB1y-ekzzo72-OsH0lByiMkr8HXiuBS5Vo9_NGo7MqiHNPnj6dbRlb654sGc/s400/image002-767205.png" --><!-- Blogger automated replacement: "https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F1.bp.blogspot.com%2F-qQQL-0PT6nE%2FUxddYlutObI%2FAAAAAAAAE38%2FIJkY19ELHKw%2Fs400%2Fimage005-762573.png&container=blogger&gadget=a&rewriteMime=image%2F*" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQY94oMho2OWhhVFHNpCBUD7eJKTB7lEeSAB1t9LRMqz3fQF83R2OZOC1fhM7fVLcs1gvuVJqcEjz-B2RN-4wIvkI-0xjAHQxqpn9gMBkrBk6phawVB_REQxoDS8VuKtzlF8fqu7VYKbc/s400/image005-762573.png" --><!-- Blogger automated replacement: "https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F3.bp.blogspot.com%2F-zM-y2blJqrk%2FUxddaxgGWtI%2FAAAAAAAAE4s%2FK7INe5RmC5Q%2Fs400%2Fimage004-771346.png&container=blogger&gadget=a&rewriteMime=image%2F*" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBlcFbSDkA0KNmM6rI0SmwUqEdNy9EOGIo5iSxnA55iFfGoHUOrP3NqrwL89MBnQogCurZqELAZWfffWDPVEaVyWdihU7ECgnZ8SO7X_kMsxhpFvJQqSLT-EFkxjNVoLpHHYz1sC9yw6M/s400/image004-771346.png" --><!-- Blogger automated replacement: "https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F4.bp.blogspot.com%2F-VzpIvtpWcOs%2FUxddaQztNFI%2FAAAAAAAAE4g%2FwzKPpmDQGg8%2Fs400%2Fimage003-769073.png&container=blogger&gadget=a&rewriteMime=image%2F*" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVcJ5iI_ZkM7Sajj1Vep63o6fJI_-Vur8pFQ4_JBmgdHQ98skH9RZQcJWA_i5lHC51zBOfpvq-bWk9PmmUYljzmTdR7Esji0sgs29BpaAayWhRCtFvxUnVSpjdX_eb6XgjdhfViXlZ83c/s400/image003-769073.png" --><!-- Blogger automated replacement: "https://images-blogger-opensocial.googleusercontent.com/gadgets/proxy?url=http%3A%2F%2F2.bp.blogspot.com%2F-UZpKODBR6iE%2FUxddYMTAhoI%2FAAAAAAAAE3w%2Fi16Ow6G-y_I%2Fs400%2Fimage001-759886.png&container=blogger&gadget=a&rewriteMime=image%2F*" with "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEWLvtZ0PVzfRdqCvgs8KyBCncbTXP4150Ae48PaWg_BTQQquIqFnH1B30poNilg2i-gXheUxjpjcwzrTuDB6PlZUZvNdgowmYspMYiDq3PbPfk4F_6dbx8I0ZFTGlqp28HRCXflAdxoM/s400/image001-759886.png" -->Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4129258986449924782.post-31082069172643872382014-02-26T12:22:00.000-06:002014-02-26T12:22:46.496-06:00Código fácil para cifrar y descifrar en Java ("encriptar" y "desencriptar")<br />
<script src="https://gist.github.com/arturotena/9235042.js"></script>Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-4129258986449924782.post-16748262265151889902013-09-18T20:30:00.000-05:002013-12-08T00:17:56.005-06:00Sybase, Unicode, y Java JDBCHoy necesité insertar un texto similar al siguiente en una base de datos Sybase ASE 15.x desde Java usando JDBC:<br />
<br />
<span style="font-size: x-large;">aaa aáa <span style="background-color: yellow;">‘</span>bbb’ aaa<span style="background-color: yellow;">…</span></span><br />
<br />
<div>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 <a href="http://es.wikipedia.org/wiki/Ap%C3%B3strofo">apóstrofo</a> (<a href="http://www.rae.es/dpd/?key=ap%C3%B3strofo">RAE</a>), sino <u>comillas simples de apertura</u> (<a href="http://www.rae.es/dpd/?key=comilla">RAE</a>). Además, al final los <u>puntos supensivos</u> (<a href="http://www.rae.es/dpd/?key=puntos%20suspensivos">RAE</a>) no son tres caracter de punto (<a href="http://www.rae.es/dpd/srv/search?id=PxrAnmVfND6FK0uGdT">RAE</a>), sino un solo caracter. Estos caracteres están definidos en el estándar <a href="http://es.wikipedia.org/wiki/Unicode">Unicode</a>.<br />
<br />
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 <b>codificación de los caracteres</b>.<br />
<br />
Encontré dos soluciones:<br />
<br />
<b>1. Especificar el código de caracteres</b><br />
<br />
Al conectarse desde Java usando JDBC, especificar la codificación que se usará [1][2].<br />
<pre class="brush:java">Properties props = new Properties();
<b>props.put("charset", "utf8");</b>
Connection conn = DriverManager.getConnection(JDBC_URL, props);</pre><br />
</div><div>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.</div><div><br />
<b>2. Eliminar los caracteres inválidos</b><br />
<br />
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 <a href="http://es.wikipedia.org/wiki/ISO_8859-1">ISO-8859-1</a>, 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.<br />
<br />
<pre>// 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);</pre><br />
Esto provoca que los caracteres que no se puedan convertir se sustituyan con un caracter de cierre interrogación.<br />
<br />
<span style="font-size: x-large;">aaa aáa ?bbb? aaa?</span><br />
<br />
Las letras acentuadas se convervan, pues la codificación ISO-8859-1 sí las contienen.<br />
<br />
<b>3. Una solución que no es solución</b><br />
<br />
En Sybase se puede especificar que la columna almacenará una cadena que estará codificada usando Unicode [3][4].<br />
<pre>CREATE TABLE Tabla (
Texto <b>UNIVARCHAR</b>(50)
)
</pre>Esto hace que Sybase ocupe dos bytes para almacenar cada caracter. Sin embargo, a mí no me funcionó esta solución.<br />
<div><br />
</div><b>Finalmente</b><br />
<br />
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.<br />
<br />
Referencias:</div><br />
[1]<br />
<a href="https://www.java.net//node/688046">https://www.java.net//node/688046</a><br />
[2]<br />
<a href="http://www.sybase.com/detail?id=1009812#MARKER-9-243">http://www.sybase.com/detail?id=1009812#MARKER-9-243</a><br />
[3]<br />
<a href="http://es.wikipedia.org/wiki/ISO_8859-1">http://es.wikipedia.org/wiki/ISO_8859-1</a><br />
[4]<br />
<a href="http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0.sag1/html/sag1/sag1417.htm">http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0.sag1/html/sag1/sag1417.htm</a><br />
<div><br />
</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4129258986449924782.post-85953021992219527152013-09-13T12:07:00.001-05:002013-09-13T12:54:02.630-05:00Cómo exportar e importar datos en Java DB (Apache Derby)<div class="separator" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;"><img border="0" height="77" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYK5ShAcBDPys4VL8lb8F1v50dV7JipImRj59-dwkq9R125qft_UwM4QROz1AZp5wyT77_ldPe6yeWxGsb21S6Qo928jHUrkoI310Oy-4EfBqFX260del5LMjrMzuHWphw_13SPVzNwWA/s200/apache-derby-logo.png" width="100" /></div><br />
Tengo una base que accedo de forma incrustada (embedded) en una aplicación Java 7. La base está hecha con Java DB (Apache Derby). Necesité respaldar y luego recuperar el respaldo de los datos. Para ello usé los siguientes comandos desde NetBeans.<br />
<br />
Para exportar:<br />
<br />
<pre class="brush:sql">CALL SYSCS_UTIL.SYSCS_EXPORT_TABLE (null,'TABLA','ARCHIVO',null,null,null);</pre><br />
Para importar:<br />
<br />
<pre class="brush:sql">CALL SYSCS_UTIL.SYSCS_IMPORT_TABLE (null,'TABLA','ARCHIVO',null,null,null,0);</pre><br />
Más información: <a href="http://docs.oracle.com/javadb/10.4.1.3/tools/rtoolsimport91458.html">http://docs.oracle.com/javadb/10.4.1.3/tools/rtoolsimport91458.html</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4129258986449924782.post-37400739851756804522013-08-20T12:38:00.003-05:002013-08-20T12:38:53.508-05:00Herramientas para analizar el desempeño de aplicaciones móviles para iOS y AndroidExisten herramientas para analizar el desempeño de aplicaciones móviles para iOS y Android<br />
<br />
El XCode para <b>iOS</b> tiene su <i>profiler</i>:<br />
<br />
<ul>
<li><a href="https://developer.apple.com/library/mac/documentation/Performance/Conceptual/PerformanceOverview/PerformanceTools/PerformanceTools.html">https://developer.apple.com/library/mac/documentation/Performance/Conceptual/PerformanceOverview/PerformanceTools/PerformanceTools.html</a></li>
</ul>
<br />
<b>Android</b> tiene algunas herramientas, aunque se ven laboriosas de usar:<br />
<br />
<ul>
<li><a href="http://developer.android.com/tools/debugging/debugging-tracing.html">http://developer.android.com/tools/debugging/debugging-tracing.html</a> </li>
<li><a href="http://developer.android.com/tools/debugging/systrace.html">http://developer.android.com/tools/debugging/systrace.html</a></li>
</ul>
<br />
También se puede usar Eclipse para monitorear la memoria con el DDMS:<br />
<br />
<ul>
<li><a href="http://developer.android.com/tools/debugging/ddms.html">http://developer.android.com/tools/debugging/ddms.html</a></li>
<li><a href="http://www.vogella.com/articles/AndroidTools/article.html">http://www.vogella.com/articles/AndroidTools/article.html</a></li>
<li><a href="https://docs.google.com/file/d/0B6tt5piUV3RWZGYxZTg1ZjQtY2E0ZS00NzlkLWJjMzUtZTYxYWE4YTVjZmQ2/edit?hl=en_GB">https://docs.google.com/file/d/0B6tt5piUV3RWZGYxZTg1ZjQtY2E0ZS00NzlkLWJjMzUtZTYxYWE4YTVjZmQ2/edit?hl=en_GB</a></li>
</ul>
<br />
También existe un producto comercial:<br />
<br />
<ul>
<li><a href="http://www.littleeye.co/">http://www.littleeye.co</a></li>
</ul>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4129258986449924782.post-78454449146970206492013-06-18T12:17:00.000-05:002013-06-18T12:17:42.056-05:00Tabla con esquinas redondeadas y que tenga una sombra incrustada dentro de ellaNecesité hacer una tabla HTML que se viera así:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA0Ctg-o6RQDEO7sEIYDDpbziZDgWwK8wRgDrLw4X910c3FyCVTt5pha-X6MxYOv7lBjEWgDti4g16z-EedilUMcja6vaz7suauHGP7Sp4NoO1ULy9Gy7dAWyEqPkAGGb8-z0HVD22paw/s1600/tabla-with-inset-shadow-and-round-corners.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgA0Ctg-o6RQDEO7sEIYDDpbziZDgWwK8wRgDrLw4X910c3FyCVTt5pha-X6MxYOv7lBjEWgDti4g16z-EedilUMcja6vaz7suauHGP7Sp4NoO1ULy9Gy7dAWyEqPkAGGb8-z0HVD22paw/s1600/tabla-with-inset-shadow-and-round-corners.png" /></a></div><br />
Para esto, usé CSS:<br />
<br />
<pre class="brush:html"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Table with inset shadow and round corners</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<style>
table.tabla {
width: 500px;
margin: 0 auto; /* centrado */
background: white;
/* sombra interior */
/* Ver http://css-tricks.com/snippets/css/css-box-shadow/ */
box-shadow: inset 1px 1px 1px 0px #999999;
/* esquinas redondeadas */
/* Ver http://border-radius.com/ */
border-radius: 10px;
}
table.tabla > tbody > tr:first-child > td:first-child { /* celda superior izquierda */
border-top-left-radius: 10px;
}
table.tabla > tbody > tr > td:first-child { /* celdas de la primera columna */
border-left: 1px solid #999999;
}
table.tabla > tbody > tr:last-child > td:first-child { /* celda inferior izquierda */
border-bottom-left-radius: 10px;
}
table.tabla > tbody > tr:last-child > td:last-child { /* celda inferior derecha */
border-bottom-right-radius: 10px;
}
table.tabla > tbody > tr:nth-child(even) { /* celdas de los renglones pares */
background: #e7e7e7;
}
</style>
</head>
<body>
<table cellpadding=0 cellspacing=0 class="tabla">
<tr>
<td>abc</td>
<td><table><tr><td>123</td><td>456</td></tr><tr><td>123</td><td>456</td></tr></table></td>
<td>ghi</td>
</tr>
<tr>
<td>abc</td>
<td><table><tr><td>123</td><td>456</td></tr><tr><td>123</td><td>456</td></tr></table></td>
<td>ghi</td>
</tr>
<tr>
<td>abc</td>
<td><table><tr><td>123</td><td>456</td></tr></table></td>
<td>ghi</td>
</tr>
<tr>
<td>abc</td>
<td><table><tr><td>123</td><td>456</td></tr></table></td>
<td>ghi</td>
</tr>
<tr>
<td>abc</td>
<td><table><tr><td>123</td><td>456</td></tr></table></td>
<td>ghi</td>
</tr>
</table>
</body>
</pre>He aquí este código ejecutándose en el navegador:<br />
<br />
<style>
table.tabla {
width: 500px;
margin: 0 auto; /* centrado */
background: white;
/* sombra interior */
/* Ver http://css-tricks.com/snippets/css/css-box-shadow/ */
box-shadow: inset 1px 1px 1px 0px #999999;
/* esquinas redondeadas */
/* Ver http://border-radius.com/ */
border-radius: 10px;
}
table.tabla > tbody > tr:first-child > td:first-child { /* celda superior izquierda */
border-top-left-radius: 10px;
}
table.tabla > tbody > tr > td:first-child { /* celdas de la primera columna */
border-left: 1px solid #999999;
}
table.tabla > tbody > tr:last-child > td:first-child { /* celda inferior izquierda */
border-bottom-left-radius: 10px;
}
table.tabla > tbody > tr:last-child > td:last-child { /* celda inferior derecha */
border-bottom-right-radius: 10px;
}
table.tabla > tbody > tr:nth-child(even) { /* celdas de los renglones pares */
background: #e7e7e7;
}
</style><table cellpadding="0" cellspacing="0" class="tabla"><tbody>
<tr> <td>abc</td> <td><table><tbody>
<tr><td>123</td><td>456</td></tr>
<tr><td>123</td><td>456</td></tr>
</tbody></table></td> <td>ghi</td> </tr>
<tr> <td>abc</td> <td><table><tbody>
<tr><td>123</td><td>456</td></tr>
<tr><td>123</td><td>456</td></tr>
</tbody></table></td> <td>ghi</td> </tr>
<tr> <td>abc</td> <td><table><tbody>
<tr><td>123</td><td>456</td></tr>
</tbody></table></td> <td>ghi</td> </tr>
<tr> <td>abc</td> <td><table><tbody>
<tr><td>123</td><td>456</td></tr>
</tbody></table></td> <td>ghi</td> </tr>
<tr> <td>abc</td> <td><table><tbody>
<tr><td>123</td><td>456</td></tr>
</tbody></table></td> <td>ghi</td> </tr>
</tbody></table>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4129258986449924782.post-20728656899575474242013-02-27T12:42:00.000-06:002013-06-11T13:13:11.938-05:00Parte de JavaFX para iOS y Android será como Open SourceRichard Bair <a href="http://fxexperience.com/2013/02/february-open-source-update/">anunció</a> 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 <a href="http://docs.oracle.com/javafx/2/architecture/jfxpub-architecture.htm">JavaFX Architecture and Framework</a>.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4129258986449924782.post-62123439522225049082013-02-06T15:04:00.000-06:002013-02-06T16:27:17.676-06:00Maven: Cómo mostrar la versión en la aplicación webSi necesitas mostrar el número de versión del sistema en una aplicación web construída con <a href="http://maven.apache.org/">Maven</a>, 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 <strong>maven-war-plugin</strong>. Un ejemplo:<br />
<br />
Archivo <tt>src/main/webapp/<strong>version.txt</strong></tt>:<br />
<pre class="brush:xml">${project.version}
</pre><br />
Archivo <tt>src/main/webapp/<strong>index.jsp</strong></tt>:<br />
<pre class="brush:xml">Versión: <jsp:include page="version.txt"></jsp:include>
</pre><br />
Archivo <tt><strong>pom.xml</strong></tt>:<br />
<pre class="brush: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>
</pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4129258986449924782.post-38262219059479684742013-01-30T14:24:00.000-06:002013-01-30T14:25:03.137-06:00Oracle: 'Debemos arreglar la seguridad en Java'<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirZAsoPFTu3kEf3GpizK-TcDRDCRPnwLv4N7Sf6nHruua0BeuoAmPsf7hcPRUojxXDttcWLyMD47Hi2AOv9YiqLOo_O83FVlGpvK9rIoyFzw9N3fPmQlks_n-g9L8iP4bXJDGtqjdA4WU/s1600/duke-please_help_me.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirZAsoPFTu3kEf3GpizK-TcDRDCRPnwLv4N7Sf6nHruua0BeuoAmPsf7hcPRUojxXDttcWLyMD47Hi2AOv9YiqLOo_O83FVlGpvK9rIoyFzw9N3fPmQlks_n-g9L8iP4bXJDGtqjdA4WU/s200/duke-please_help_me.jpg" width="161" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Imagen por <a href="http://mac-security.blogspot.mx/2012/09/java-unsafe-at-any-version-sandboxing.html">:-Derek</a></td></tr>
</tbody></table>
'<em>Debemos arreglar la seguridad en Java</em>', reconocen dos empleados de alto nivel de Oracle [1].<br />
<br />
<a href="http://www.linkedin.com/in/spoofzu">Milton Smith</a>, Lider de Seguridad de Java, y <a href="http://www.linkedin.com/pub/donald-smith/6/945/6A0">Donald Smith</a>, 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].<br />
<br />
Cuando se les cuestionó porqué el instalador de Java también instala la barra de herramientas de Internet del sitio Ask.com, comentaron: '<em>Esto es algo que Sun inició [...] No puedo discutir el asunto.</em>'<br />
<br />
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: "<em>No hay planes [...] podría ser</em>".<br />
<br />
Parafraseando la cancion de Carly Rae Jepsen: '<em>Hey, Java's broken, and this is crazy, but here’s my bytecode, so fix it, maybe?</em>'<br />
<br />
[1] Referencia: <a href="http://jaxenter.com/we-will-fix-java-security-pledge-oracle-devs-46079.html">JAXenter</a>.<br />
[2] Publicacón de Oracle con el audio: <a href="https://blogs.oracle.com/theaquarium/entry/oracle_speaks_up_on_java">Oracle Speaks up on Java Security</a>.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4129258986449924782.post-69146371780667964512012-12-13T19:58:00.001-06:002013-02-06T14:54:19.301-06:00Maven: directorio con JAR de dependenciasEn 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 <a href="http://maven.apache.org/">Apache Maven</a>, seguro te preguntaste cómo crearlo.<br />
<br />
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 <code>maven-dependency-plugin</code> en el archivo <code>pom.xml</code>. Además, para que el archivo <code>META-INF/MANIFEST.MF</code> contenga el classpath apuntando a dicho subdirectorio, es necesario configurar el <code>maven-jar-plugin</code>:<br />
<br />
<pre class="brush:xml"><code>
<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>
</code></pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4129258986449924782.post-3174817316606935552012-12-11T13:02:00.001-06:002012-12-11T13:02:42.636-06:00Sybase: permitir entrar sólo al dboEn 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 <kbd>dbo_use_only</kbd>:<br />
<br />
<kbd><br />
use master<br />
exec sp_dboption DBName, 'dbo_use_only', <strong>true</strong><br />
use BASEDEDATOS<br />
checkpoint<br />
</kbd><br />
<br />
y para regresar el atributo, poner su valor en <kbd><strong>false</strong></kbd>.<br />
<br />
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4129258986449924782.post-52755852578805879172012-12-06T09:33:00.001-06:002012-12-06T09:33:14.121-06:00El nuevo recolector de basura de Java 7En 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.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><img height="297" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTfFXQy-NPmet_YxCSOO0Bz-MRQTf-vYoNo8lkXLRZeEUBvECqOWdntXzL9PkYncchgT7AJR_OatoCuwvPt1k4yNG_0UVxATvblCftrUMc8T0NM1PNuhgaVsvuzHXGBlTMz1Jlb0NENUE/s400/2012_12_%25204_23_12.jpg" width="400" /></div><br />
<br />
Otra característica interesante del recolector G1 es que compacta la memoria usada en dichas regiones usando múltiples hilos de ejecución.<br />
<br />
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.<br />
<br />
Referencia: <a href="http://www.google.com/url?q=http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/G1GettingStarted/index.html&usg=AFQjCNEAAAAAUMBMMXRVj8hHy_PiqhdHovqA25SpPXQw">Getting started with the G1 Garbage Collector</a>.<br />
<br />
<br />
<br />
<br />
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4129258986449924782.post-26019534376517632442012-11-21T10:52:00.000-06:002012-11-21T10:52:13.101-06:00Maven: cómo excluir los archivos de firma usando el plugin shade<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD0l3_r1y5ZtaG5JkU_VsIbwcR-eIeVVwY-JeZNfW_VQchVFc7iBJLJs5fcaXIN7RP-Q7XahQ1wIImYCpFTYpZhHuWdBUwGlYFAbAxLpslzDA_odz6Nb5XRZulstbERjxf5lkoy4BqnmM/s1600/Maven-logo.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="57" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD0l3_r1y5ZtaG5JkU_VsIbwcR-eIeVVwY-JeZNfW_VQchVFc7iBJLJs5fcaXIN7RP-Q7XahQ1wIImYCpFTYpZhHuWdBUwGlYFAbAxLpslzDA_odz6Nb5XRZulstbERjxf5lkoy4BqnmM/s200/Maven-logo.jpg" width="200" /></a>Al usar el<a href="http://maven.apache.org/plugins/maven-shade-plugin/"> plugin Shade</a> de <a href="http://maven.apache.org/">Maven</a>, 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.</div>
<br />
Para excluir dichos archivos, se puede configurar el plugin de la siguiente forma:<br />
<br />
<pre><code class="language-xml"><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>
<strong> <exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude></strong>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</code></pre>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4129258986449924782.post-76277685800195750542012-11-09T22:00:00.000-06:002012-12-11T11:30:48.039-06:00Java en Sybase ASE 15En Sybase Adaptive Server Enterprise 15, se puede ejecutar Java 6, pues cuenta con una JVM.<br />
<br />
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.<br />
<br />
Para instalar las clases, se necesita que estén empaquetadas en <strong>un JAR que no esté comprimido</strong>.<br />
<br />
Por ejemplo, si se tiene la siguiente clase de Java:<br />
<code> </code><br />
<code>package com.arturotena.pruebas;<br />
public class Echo {<br />
public static String echo(String s) {<br />
return s + " (" + System.getProperty("java.version") + ")";<br />
}<br />
} </code><br />
<code></code><br />
En UNIX se puede compilar y empaqutar de la siguiente forma:<br />
<code> </code><code></code><br />
<code></code><br />
<code><pre>$ javac classes/com/arturotena/pruebas/Echo.java
$ jar cv0f Echo-1.0.0.jar -C classes .
</pre></code><br />
Después, para instalarla se usa la utilería <strong>installjava</strong> de Sybase ASE:<br />
<code></code><code> </code><br />
<code><pre>$ installjava -f Echo-1.0.0.jar -j Echo_1_0_0 -S <em>servidor</em> -U <em>usuario</em> -D <em>base</em>
</pre></code><br />
Si se instaló previamente la clase, agregar el parámetro <code>-update</code>.<br />
<br />
Y en SQL se puede usar el método estático público de la clase como una función definida por el usuario:<br />
<code> </code><code></code><br />
<code><pre>SELECT CONVERT(VARCHAR(20), com.arturotena.pruebas.Echo.echo("Hola, mundo"))
</pre></code><br />
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.<br />
<br />
<strong>Actualización</strong>: Para desinstalar un JAR de la base de datos, usar:<br />
<br />
<code>remove java jar Echo_1_0_0</code><br />
<br />
Y para descargar el JAR, usar:<br />
<br />
<code>$ extractjava –j Echo_1_0_0 -f Echo-1.0.0.jar</code><br />
<br />
Más información: <a href="http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc31652.1502/html/java/title.htm">Java in Adaptative Server Enterprise</a>.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4129258986449924782.post-23124446048779653762012-10-17T10:42:00.000-05:002012-10-17T10:42:14.733-05:00Apple liberó Java 6 update 37 para OS X<div class="separator" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;"><img border="0" height="109" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSsHmFvqD608JBBkzdmh08mHeCAb62ldVHb2zheBfP676s300mCHzqbT8_fncT-muOvDSkfoPur7f6n98qTyAuL2OB14rm7u5glw9NFAcZUUbVmmGV5gQ8Elk7Tqc6vhoC77vgfXZkO1A/s200/java-duke-os-x-mountain-lion.png" width="200" /></div>El día de ayer, Apple liberó la actualización de <a href="http://support.apple.com/kb/DL1572??">Java para OS X 2012-006</a>.<br />
<br />
Me parece relevante que, en esta versión, Apple decidió <b>desinstalar el plug-in de Java</b>, dando la opción al usuario final para descargar la versión de Oracle con un solo clic.<br />
<br />
Esta versión corresponde a <a href="http://support.apple.com/kb/HT5493">Java SE 6 1.6.0 update 37</a>, la cual dice Oracle que será <a href="http://www.oracle.com/technetwork/java/javase/documentation/autoupdate-1667051.html">la última liberación de Java 6</a>.<br />
<br />
El archivo DMG se puede <a href="https://developer.apple.com/downloads/">descargar en el sitio de desarrolladores de Apple</a>.<br />
<br />
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4129258986449924782.post-34743742213342389672012-07-23T18:28:00.000-05:002012-07-23T18:28:14.859-05:00Cómo guardar datos localmente en HTMLSegún observo, actualmente (julio 2012), las posibles APIs para almacenar localmente datos en HTML son las siguientes:<br />
<ol>
<li><strong>Storage</strong></li>
<ul>
<li>Lista simple de pares de valores de cadenas de texto.</li>
<li>Los valores, al ser cadenas de texto, deben serializarse y deserializarse.</li>
<li>Especificaciones:</li>
<ul>
<li><a href="http://dev.w3.org/html5/webstorage/">http://dev.w3.org/html5/webstorage/</a></li>
<li><a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/webstorage.html#webstorage">http://www.whatwg.org/specs/web-apps/current-work/multipage/webstorage.html#webstorage</a></li>
</ul>
<li>Ejemplos:</li>
<ul>
<li><a href="http://www.w3schools.com/html5/html5_webstorage.asp">http://www.w3schools.com/html5/html5_webstorage.asp</a></li>
</ul>
</ul>
<li><strong>SQL Database</strong></li>
<ul>
<li>base de datos SQL</li>
<li><strong><span style="color: red;">Quedó obsoleta y ya no se mejorará.</span></strong></li>
<li>Especificación:</li>
<ul>
<li><a href="http://dev.w3.org/html5/webdatabase/">http://dev.w3.org/html5/webdatabase/</a></li>
</ul>
</ul>
<li><strong>IndexedDB</strong></li>
<ul>
<li>Lista de pares de valores, con índices para mejorar desempeño.</li>
<li>Me parece que todavía no está implementada entre varios navegadores.</li>
<li>Especificación:</li>
<ul>
<li><a href="http://www.w3.org/TR/IndexedDB/">http://www.w3.org/TR/IndexedDB/</a></li>
</ul>
</ul>
</ol>
Un ejemplo del uso del Storage (con el objeto LocalStorage, que mantiene los valores incluso cuando se cierra el navegador) es el siguiente:<br />
<br />
<code></code><br />
<pre><!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>
</pre>
<br />
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í.)Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4129258986449924782.post-62389429839640479952012-06-18T12:56:00.001-05:002012-06-18T14:05:47.700-05:00Cómo califica Apache Lucene los resultados (scoring)Extracto traducido de la introducción oficial a la <a href="http://lucene.apache.org/core/3_6_0/scoring.html">calificación de resultados (scoring)</a>:<br />
<br />
<blockquote>La calificación en Lucene utiliza una combinación del <a href="http://en.wikipedia.org/wiki/Vector_Space_Model">Modelo de Espacio Vectorial</a> y el <a href="http://en.wikipedia.org/wiki/Standard_Boolean_model">Modelo Booleano</a> 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)</blockquote><br />
La <a href="http://lucene.apache.org/core/3_6_0/api/core/org/apache/lucene/search/Similarity.html">descripción formal de la fórmula para calificar</a> se encuentra en la documentación de la clase <tt>Similarity</tt>.<br />
<br />
Otras referencias:<br />
<ul><li><a href="http://lucene.apache.org/core/3_6_0/queryparsersyntax.html">Apache Lucene - Query Parser Syntax</a></li><br />
<li><a href="http://lucene.apache.org/core/3_6_0/api/core/org/apache/lucene/search/package-summary.html#search">Clases usadas en la búsqueda</a></li><br />
</ul><br />
<br />
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4129258986449924782.post-31135991361797271142012-04-24T22:21:00.000-05:002012-04-24T22:21:00.485-05:00Un bug re-moto...<blockquote>
Un <i>bug</i> re-moto... ¿fuma hierba en el servidor?<br />
<br />
—Arturo Tena</blockquote>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9sLyfU961jX5IdWWiYoorNbdbW9u4aMjibySozavxsk6oSUoNtbXOLtK8_2-CBPcHR5E97Cgdsezs6m5Z8nZ9r38y11Fz8WSF22sMT59jkNRwhdV7BZ4JhhC7aGS-HjZkK7luRtpcGL8/s1600/Bug_re-moto.png" imageanchor="1" style="clear: right; cssfloat: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" oda="true" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9sLyfU961jX5IdWWiYoorNbdbW9u4aMjibySozavxsk6oSUoNtbXOLtK8_2-CBPcHR5E97Cgdsezs6m5Z8nZ9r38y11Fz8WSF22sMT59jkNRwhdV7BZ4JhhC7aGS-HjZkK7luRtpcGL8/s1600/Bug_re-moto.png" /></a></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4129258986449924782.post-84485133578893534002012-04-03T23:15:00.000-05:002012-04-03T23:15:00.086-05:00El bug me escupió...El <em>bug </em>me escupió una excepción. —Arturo Tena. <br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://techsergioflores.wordpress.com/2012/03/07/error-falla-falencia-y-bug-de-software/" imageanchor="1" style="clear: left; cssfloat: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" dea="true" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0nhWijY4h9sVpvUwwGwuvzj7DX7xJYKgkTmvVjFgSc3v4zlQuSKI8NhAuFXFOikqVNwf8Un4ypgHMs_TWOlXAw4s9Wh1JXh_De9NmWUakoMox09MMB0kux0EuaSne4m0krix5petpWvw/s320/software_bug-vi1.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Imagen: <a href="http://techsergioflores.wordpress.com/2012/03/07/error-falla-falencia-y-bug-de-software/">Sergio A. Flores Q.</a></td></tr>
</tbody></table> <br />
<div style="text-align: right;"></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4129258986449924782.post-78296769677265711572012-03-28T22:28:00.000-06:002012-04-09T13:36:11.423-05:00Programar... ¿desde qué edad?No lo sabía:<br />
<blockquote class="tr_bq">
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. <a href="http://www.bbc.co.uk/mundo/noticias/2012/03/120307_tecnologia_programacion_aa.shtml">La programación de computadoras es "el latín del siglo XXI"</a>. BBC Mundo Tecnología. 2012-03-29. Accedido en 2012-03-29. (<a href="http://www.webcitation.org/66W7h525M">Archivado</a> por WebCite.)</blockquote>
<br />
<a href="http://www.flickr.com/photos/chadmiller/4418565987/" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxPo6knhPZ7pbgyj9h0mGHtfRjqGiEm2gLfF7W5SS6xjjaeyuIKoq7xq_FXZ_6BDW5QtxRNh1nHi0Ui4PdH4sZViiHGVbDxN50T-SGccD93fTc8udufCkqkYrh88_tWcUabKi22Z66sBk/s1600/computer-kid.jpg" /></a>En lo personal, recuerdo con cariño la primera vez que "programé" (o más bien copié un programa) en <a href="http://es.wikipedia.org/wiki/Logo_(lenguaje_de_programaci%C3%B3n)">Logo</a>, 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.<br />
<br />
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.<br />
<br />
¿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.<br />
<br />
<b>[Agregado]</b><br />
<br />
¿Cómo decidir a quiénes enseñar y a quienes no? Tal vez se puedan integrar a la currícula como materias optativas.<br />
<br />
Adicionalmente, antes de preguntarse cuál lenguaje de programación enseñar, opino que vale la pena preguntarse: ¿cuál <a href="http://en.wikipedia.org/wiki/Programming_paradigm">paradigma de programación</a> 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.<br />
<br />
Fotografía: (cc) <a href="http://www.flickr.com/photos/chadmiller/4418565987/">chadmiller</a>.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4129258986449924782.post-73687535430591744142012-03-23T23:30:00.000-06:002012-03-23T23:30:01.209-06:00Amor por la programación<div class="separator" style="clear: both; text-align: center;"><a href="http://upload.wikimedia.org/wikipedia/commons/thumb/4/48/C64_startup_animiert.gif/260px-C64_startup_animiert.gif" imageanchor="1" style="clear: right; cssfloat: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img aea="true" border="0" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/48/C64_startup_animiert.gif/260px-C64_startup_animiert.gif" /></a></div><div style="border-bottom: medium none; border-left: medium none; border-right: medium none; border-top: medium none;">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 "<span style="font-family: "Courier New", Courier, monospace;">R</span>", "<span style="font-family: "Courier New", Courier, monospace;">E</span>", "<span style="font-family: "Courier New", Courier, monospace;">A</span>", "<span style="font-family: "Courier New", Courier, monospace;">D</span>", e "<span style="font-family: "Courier New", Courier, monospace;">Y</span>" —en ese tiempo, no entendía el inglés— y vi un cuadrado blanco parpadeante. Escribí "<span style="font-family: "Courier New", Courier, monospace;">hola</span>", y presioné la tecla "<span style="font-family: "Courier New", Courier, monospace;">Enter</span>". Apareció un críptico mensaje: "<span style="font-family: "Courier New", Courier, monospace;">Syntax Error</span>"... y de nuevo el chistoso cuadrado. "<em>¡Oh! ¡Vaya!</em>", pensé, "<em>¡debe haber alguna forma de comunicarme con esta máquina!...</em>" Y así, nació mi amor por la programación.</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4129258986449924782.post-90954389973675941742012-03-11T19:44:00.000-06:002012-03-12T17:54:57.834-06:00Emoción y arte al diseñar las interfaces de usuario<blockquote class="tr_bq">
Incorpora emoción y arte al diseño de la interfaz de usuario.<br />
<br />
Sí importa cuidar la interfaz del usuario. Si la cuidas, puedes hacer del mundo un lugar mejor.<br />
<br />
En primer lugar, eres tu propio cliente: construye cosas [de forma] que te gusten [cómo queden].<br />
<br />
Ese es el planteamiento básico que aprendí: a trabajar desde el corazón, y verdaderamente cuidar [la interfaz del usuario].<br />
<br />
(<em>Bring emotion and art to computer [UI] design. [...] </em><em>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].</em>)<br />
<br />
—Andy Hertzfeld, co-diseñador original de la interfaz de usuario de las computadoras Macintosh de Apple. <a href="http://www.mercurynews.com/business/ci_20132893/apple-pioneer-brings-emotion-google-andy-hertzfeld">Citado</a> en el artículo <i>Apple pioneer brings emotion to Google+, de Mike Swift</i>, el 10 de marzo de 2012. (Accedido el 11 de marzo de 2012, <a href="http://www.webcitation.org/6663isFx1">archivado</a> por WebCite.)</blockquote>Unknownnoreply@blogger.com0