viernes, julio 28, 2006

Microsoft: .Net Beat Java, Who's Next? ...hmm yeah rigth!

Esto es lo último en noticias de Microsoft en una desesperación por levantar a .Net

Microsoft declares Java dead and now focusing on different systems to compete with other platforms like Ruby on Rails.

read more | digg story

miércoles, julio 26, 2006

Atención con altas y bajas en las tablas de MySQL

Tengo la 'mala' costumbre de trabajar en tres plataformas, Windows, Linux y OSX. Linux y OSX son muy parecidos y son mis favoritos, Windows es lo que usa el 98% de mis clientes por lo que tengo muchas veces que diseñar específicamente para esta plataforma y hacer pruebas.

Es la primera vez que me pasa que los nombres de las tablas en MySQL me causan problemas. Studio Creator en Windows hizo las ligas y los querys en minúsculas incluso para tablas que tienen altas y bajas. Cuando seguí el desarrollo en Linux, todo tronó, nada funcionaba. Mucho tiempo perdido corrigiendo los errores, creo que el mayor culpable aquí es Studio Creator, pues siendo un IDE multi-plataforma debería de considerar estos casos.

martes, julio 18, 2006

Enviando Correo con PHP

Una función muy popular en los sitios corporativos es la de Contáctenos. Voy a describir rápidamente cómo enviar una forma de contacto por email desde una forma de HTML.
Primero necesitamos la forma que va a contener los datos.

forma

OK, la forma puede variar pero el concepto es el mismo. Veamos ahora el HTML de esta forma

contacto.html (extracto)

<form name="contacto" method="post" action="doemail.php">
<table>
<tr>
<td>Nombre:</td>
<td> <input name="$form[de_nombre]" type="text" id="$form[nombre]"> </td>
</tr>
<tr>
<td>Email:</td>
<td><input name="$form[de_email]" type="text" id="$form[email]"></td>
</tr>
<tr>
<td>Mensaje:</td>
<td><textarea name="$form[dmensaje]" id="$form[mensaje]"></textarea></td>
</tr>
<tr>
<td><input type="submit" name="Submit" value="Enviar"></td>
<td>&nbsp;</td>
</tr>
</table>
</form>



Es una buena costumbre llenar el campo de id de los elementos de la forma aunque no es necesario. Observar cómo manejamos dentro del array form, todos los campos. Método Post a la páginadoemail.php.

doemail.php

<?php
/**
* doemail.php
* Autor: Juan Pablo Ramírez
* Fecha: 18 de julio 2006
* Sencilla forma para enviar un correo de contacto por email
*/

$para_email = "contacto@empresafictisio.com";
$de_nombre = $_POST["forma"]["de_nombre"];
$de_email = $_POST["forma"]["de_email"];
$titulo = "Desde forma de contacto";
$mensaje = $_POST["forma"]["mensaje"];

$headers = "MIME-Version: 1.0\r\n".
"Content-type: text/html; charset=iso-8859-1\r\n".
"X-Mailer: PHP/" . phpversion() . "\r\n" .
"From: \"".$de_nombre."\" <".$de_email.">\r\n".
"To: \"".$titulo."\" <".$para_email.">\r\n".
"Date: ".date("r")."\r\n".
"Subject: Desde forma de contacto\r\n";

// enviando correo
$mail($para_email, $titulo, $mensaje, $headers);

?>

Esta es la manera más sencilla de enviar un correo con PHP, pero es bastante vulnerable contra inyecciones y spam. Más adelante escribiré otro método usando librerías espcializadas.

sábado, julio 15, 2006

Java Studio Creator 2 y Tomcat 5.5

Uno de los mejores IDE para JSF es el nuevo Java Studio Creator 2 (JSC). Es muy fácil
crear aplicaciónes con una arquitectura muy similar a swing. JSC trae el Java
System Application Server 8.x Platform Edition para las pruebas durante el desarrollo.
Pero usualmente utilizo el Tomcat, pasé una tarde completa tratando de hace deploy
y me encontraba con este error.
Cannot create JDBC driver of class '' for connect URL 'null'
Seguí todas las instrucciones que mencionan en la página de Sun.
  1. Exportar el proyecto como War para JDK 1.4.1
  2. Incorporar las librerías jstl.jar y standard.jar JSTL 1.1
  3. Configurar el JNDI Datasource en Tomcat 5.5 (how-to)
  4. Si estamos usando MySQL u otro DBMS copiar su correspondiente jdbc driver o connector en /commons/lib
  5. Listo! es todo y ahora a probarlo en http://localhost:8080/app-name
Pues parece sencillo, pero el punto 3 tiene sus truquitos.

Imaginemos que tenemos una BD de nombre lamparas con un usuario lamparas y password lamparasdata. En el server.xml de tomcat el JDBC quedaría así:

<Resource name="jdbc/lamparas" auth="Container"
type="javax.sql.DataSource" username="lamparas" password="lamparasdata"
removeAbandoned="true" logAbandoned="true"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/lamparas?autoReconnect=true"
maxActive="8" maxIdle="4" />

Luego copiaríamos el WAR a al directorio /webapps
Tomcat lo descomprime y lo instala, nos aseguramos que en el web.xml (web descriptor) se encuentre la siguiente definición. El web.xml estará en
...
<resource-ref>
<description>Creator generated DataSource Reference</description>
<res-ref-name>jdbc/lamparas</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
...
Arrancamos la aplicación y funcionará normalmente hasta que algún componente que haga binding a un elemento de la BD se presente y entonces nos mostrará el error anterior.

Después de muchas horas de intentos fallidos, Saurondor me sugirió incluir en un Context la configuración del jdbc en server.xml yo le comenté que no me parecía la solución correcta pues entonces perdería toda practicidad hacer deploy con el WAR si de todas formas tengo que modificar el server.xml (que ya lo hice una vez, ¿no?). Para variar los errores con JSF son crípticos y en realidad no sabes lo que está pasando, pero parece ser que no encuentra la definicion del Datasource en server.xml por que le regresa valores nulos, con la configuración de arriba supuestamente la definición es global, pero no la lee.

Sin más que intentar y apunto del hartazgo le puse los tags de Context y sus parámetros. Lo intenté así y funcionó, respiré profundo y me dije que no volvería a desechar algo que parezca obvio.

La configuración final quedó así:

<Context path="/lamparasweb" docBase="lamparasweb" debug="5" reloadable="true"
crossContext="true">
<Resource name="jdbc/lamparas" auth="Container"
type="javax.sql.DataSource" username="lamparas" password="lamparasdata"
removeAbandoned="true" logAbandoned="true"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/lamparas?autoReconnect=true" maxActive="8" maxIdle="4" />
</Context>

*Actualización 5 mayo 2007
Vicente David comenta que podemos incluir esta información dentro de nuestro proyecto. Esto es muy útil cuando no tenemos acceso a los archivos de configuración del server logrando así una independencia en la configuración.

Con sólo incluir los datos dentro de un archivo llamado context.xml en META-INF. META-INF es un directorio con información de la aplicación que se lee cuando el WAR está siendo descomprimido. Es decir, sólo funcionará este método cuando estemos desplegando la applicación desde un WAR.

META-INF/context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name="jdbc/lamparas" auth="Container"
type="javax.sql.DataSource" username="lamparas"
password="lamparasdata" removeAbandoned="true" logAbandoned="true"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/lamparas?autoReconnect=true" maxActive="8"
maxIdle="4" />
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>META-INF/context.xml</WatchedResource>
</Context>

¿Puedo insertar código fuente sin perder formato en blogger?

Probando la inserción de código fuente en blogger

public static void loadConfig() {
boolean exists = (new File(configFile)).exists();
StringBuffer sb = new StringBuffer();

// si existe el archivo lo leo
if (exists) {
try {
BufferedReader in = new BufferedReader(new FileReader(
configFile));
String str;
while ((str = in.readLine()) != null) {
sb.append(str);
}
in.close();
// conviertiendo el xml al objeto
XStream xstream = new XStream();
cfg = (ConfigSettings)xstream.fromXML(sb.toString());
} catch (IOException e) {
}

}
// si no existe lo creo
else {
cfg = new ConfigSettings();
}
}

public static void saveConfig() {
XStream xstream = new XStream();
String configxml = xstream.toXML(cfg);
try {
BufferedWriter out = new BufferedWriter(new FileWriter(
configFile));
out.write(configxml);
out.close();
} catch (IOException e) {
}

}

La respuesta es SI, sólo entra a la edición directa en HTML y encierra en el código entre los tags de <pre></pre>

And here is the rest of it.

Knowledgebase de Programación Jupadev

Tengo más de 20 años programando (inicié con Basic en una Apple IIe cuando tenía 11 años) es muy fácil encontrarse con problemas que haz solucionado varias veces. Pienso recopilar algunos métodos para poder consultarlos después.

Actualmente estoy más interesado en Java y especialmente en Java Server Faces (JSF) con Hibernate, XStream, JDOM y por supuesto MySQL. Mi IDE favorito es Eclipse con el plugin de MyEclipseIDE, bastante competente. JBuilder es muy bueno, pero está muy caro por el momento. Para desarrollos 100% JSF, el nuevo Java Studio Creator 2 es la opción a seguir y aunque aún no tenga soporte nativo para Hibernate tiene herramientas gráficas que permiten la tarea de binding de componentes con datos facilmente.