jueves, 24 de abril de 2008

Derribando árboles caídos

Me doy un tiempecito así en fa porque me traen en friega, para compartir con ustedes una nota que me llamó mucho la atención.

El día de ayer creo que todos en el DF sentimos los vientos, la lluvia y etc. Adicionalmente el siempre hábil servicio de Telcel se puso pacheco un rato. Amablemente informan que solo en el Sur, pero yo estaba en Santa Fé y me pasó, y supe de personas de Neza que también tenían ese problema. En fin. Lo gracioso no es eso.

Imaginen la escena siguiente: Llegas de un día cansadísimo, un poco harto, con miedo porque muchísima información se perdió. Triste y enojado por haberte pasado de lanza con la personita más importante para tí. Hablas para pedir perdón, más o menos se arreglan las cosas, estás por dormir y te pones a leer el universal en el Blackberry, y encuentras esta nota (clic para ver más grande):

O sea, están de acuerdo en que no es para menos que cagarse de la risa? En cuanto la leí dije: Esto se bloggea mañana. Encontrarlo en la versión de PC no fué fácil, pero aquí está.

¿Cómo chingao se derriba un árbol caído? Si ya está caído, ¿cómo lo derribas? ¿Le pegas cuando está en el piso? ¿Lo re-tiras? ¿Lo levantas y lo avientas? ¿O qué carajo? Mi intelecto no alcanza para entender lo profundo del pensamiento creativo-informativo del redactor de esta nota, que dejaría pendejo a Cortázar con su surrealismo!!

Jajajaja, saludos :P .

jueves, 17 de abril de 2008

Sistema de Descargas Movistar

Hola,

Sólo para recomendarles a los clientes de Movistar Mexico visitar la nueva versión del Servicio de Descargas.

Ahí podrán bajarse tonos, imágenes, vídeos, juegos java y un buen de monadas más para su celular.

La dirección es http://descargas.movistar.com.mx . Registrense, jueguen con el, vean que onda... Y si algo está medio de la gaver pos me avisan XD .

Saludos,

Enviado desde mi oficina móvil BlackBerry® de Telcel

martes, 15 de abril de 2008

QBitTorrent

Hola a todos,

Con mucha alegría (y un poco en chinga), les anuncio de la reciente liberación oficial de qBitTorrent. Un cliente GPL en QT para torrents (te cae :|???) optimizado para Linux pero disponible para múltiples plataformas.

El equipo de desarrollo, pruebas y traducción hemos trabajado duro por ya algunos años, para poder tener la versión oficial 1.0 al punto en todos los sentidos.

Pueden bajar el programa de aquí:

http://www.qbittorrent.org


Saludos,

domingo, 13 de abril de 2008

Agregando el jsessionid a un HTML estático


Entre las múltiples razones para odiar Internet Explorer 7 está que por defecto deshabilita las cookies, así que mantener una sesión en Java requiere que siempre hagamos encodeURL o metamos en tags de c:url o html:link todos los vínculos.

Esto está chido cuando usamos servlets o jsp's pero, ¿qué pasa con los HTML's estáticos? Por ejemplo en OpenCms, en un artículo o un contenido tipo news.

La solución más sencilla que encontré es tomar un archivo de fuente javascript generado mediante JSP o bien embeder en la página principal del template, una variable javascript que almacene el sessionId. Por ejemplo:


<script type="text/javascript">
var jsess="<%=session.getId()%>";
</script>

Y después metemos esto con JavaScript a nuestros links, ejemplo:

<a href="http://www.blogger.com/shalala/" id="coso">Ir a shalala</a>
<script type="text/javascript">
var miLink = document.getElementById('coso');
miLink.href = miLink.href + ';jsessionid=' + jsess;
</script>


Obviamente se puede jugar con esto, por ejemplo:

<script type="text/javascript">

var links = document.getElementsByTagName("a");

for(i = 0; i < links.length; i++)

links[i].href = links[i].href + ";jsessionid=" + jsess;

</script>


Aunque esto no lo recomiendo mucho porque nunca sabemos si se pondrán links externos, y en ese caso poner un jsessionid puede causarle problemas a otros sistemas.

Espero que encuentren esta información de utilidad. Saludos,

Usando Commons Email para Gmail y OpenCms

Este es un ejemplo sencillo de cómo usar la librería Commons Email para Gmail o Google Apps, y OpenCms.

Primero, para usar Commons Email con Gmail en general basta con concer los parámetros del SMTP de Gmail. El ejemplo que pongo a continuación es un fragmento de una aplicación en JSE-Swing que hice para una peque especial ^_^ . Lo que hace la aplicación es mandar un correo desde una cuenta de Sitio Libre (con Google Apps) a otra cuenta de Sitio Libre que a su vez está sincronizada con mi Blackberry, así que es una manera, veámoslo así, de enviar "SMS's gratuitos" colgándonos de la funcionalidad del Blackberry.

Previamente se carga un archivo properties con el nombre de usuario, el password y la cuenta de destino del email. El textArea donde viene el mensaje lleva por nombre jTextArea1. Las partes principales del envío del correo son:

SimpleEmail se = new SimpleEmail();

se.setTLS(true); //Gmail requiere TLS para el login

se.setSmtpPort(587);

se.setHostName("smtp.gmail.com");

se.setAuthentication(p.getProperty("remitente.usuario"), p.getProperty("remitente.password"));

se.setMsg(jTextArea1.getText());

InternetAddress ia = new InternetAddress();

ia.setAddress(p.getProperty("destino.direccion"));

Collection c = new ArrayList();

c.add(ia);

se.setTo(c);

se.setSubject("El subject va aqui...");

se.send();


Y yap. Como siempre disculpen el formato pero es culpa del pinche blogger. Si algo truena, nos mandará una EmailException así que tenemos que capturarla o aventarla y manejarla. ¿Por qué el InternetAddress y la Colección? El método setTo de Email/SimpleEmail solo acepta una colección, que debe contener elementos tipo InternetAddress.

Es importante destacar que en este caso, el Commons Email que utilizamos para poder ponerle TLS es la versión 1.1 . La 1.0 no tiene esta funcionalidad y eso puede hacernos ruido cuando queremos enviar un mail mediante OpenCms (que al menos en la versión 7.0.3, usaba el 1.0 para crear los CmsSimpleEmail y CmsHtmlEmail). A eso iré en un rato, no sin antes recordarles que para que Commons Email funcione bien, es necesario tener en nuestro classpath el mail.jar de Sun y el Java Activation Framework si nuestra JDK es menor a 1.6 .

Las personas observadoras podrán constatar que el portal de Polo Polo Online usa Google Apps también, es algo que queremos dejar de hacer pero por el momento seguimos haciéndolo. Al principio estuve en un gran problema al ver que la versión de OpenCms 7.0.3 no usaba Commons Email 1.1 y por ende no existía una forma rápida de usar el setTLS. Sin embargo si actualizamos todas las librerías anteriores, podemos jugar con el mecanismo de herencia y polimorfismo de Java para lograrlo.

Ok entonces, si el método por cualquier razón no es visible desde la subclase, sino solo desde la superclase, ¿qué hacemos? Sencillo. Iniciamos el objeto declarando el tipo de la superclase, y lo instanciamos como la subclase. De esta forma no necesitaremos la autenticación ni el host (ya que éstos están provistos por el archivo de configuración de OpenCms, que carga si no me equivoco el constructor de Cms****Mail), únicamente el puerto SMTP y el TLS deberán ser llamados a mano. Ejemplo:


SimpleEmail csm = new CmsSimpleMail();

csm.setTLS(true);

csm.setSmtpPort(587);

csm.addTo(cmsuser.getEmail());

csm.setSubject("Polo Polo Online - Activa tu cuenta!");

csm.setMsg("Mensaje de activacion de cuenta");

csm.send();


Y ya. Chequen también otra cosa: dado que el método addTo del CmsSimpleEmail no requiere forzosamente una colección, sino que también puede trabajar con direcciones en String, no es necesario crear una nueva colección al mandarlo llamar. ¿Vieron que no puse ni host, ni autenticación? Estos datos son cargados automáticamente del archivo de configuración de OpenCms a menos que los pongamos de forma literal para, por ejemplo, distribuír la carga en los correos que se envían haciéndolo desde diferentes cuentas - recuerden que Google Apps por defecto solo deja enviar 500 correos al día - .

Espero que a alguien le sean de utilidad estos datos. Cualquier duda pueden poner un comment.

Saludos,

miércoles, 9 de abril de 2008

Leer desde la consola con Java

Jerry está aprendiendo Java, y me pidió que le explicara cómo leer datos desde la consola.

Primero que nada debo decir que no le veo ningún caso a leer datos desde la consola. En general cuando es una aplicación de consola y necesito variables introducidas por el usuario, lo que hago es pasarlas con -D mediante un bash script con read o bien en vez del -D con parámetros en la llamada al jar o a la clase. En el peor de los casos si son persistentes guardarlos en un properties. De entrada pocas veces uso Java para consola y cuando lo hago puedo contar con los dedos de la mano las veces que he necesitado leer directamente desde consola en una clase. Aunque claro, me tocó hacerlo cuando estaba aprendiendo.

No existe (o no conozco, no sé si en las últimas versiones de Java ya exista y yo ni me enteré) una función predefinida (tipo cin, scanf, read, etc...). Lo que se tiene que hacer es crear una función tal que, en este caso, lea un String en base a un BufferedReader, un InputStreamReader, y el System.in . Una función estática en una clase usada para pura utilería (o bien, que también incluya métodos de conveniencia para parseo a tipos de datos primitivos) tal vez sea lo más recomendable. La función que le hice a Jerry fué la siguiente:

public static String leerLinea() {
String x = "";
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
try {
x = br.readLine();
} catch (IOException ex) {
System.err.println("No se pudo leer por alguna razon pacheca...");
}finally{
try {
br.close();
} catch (IOException ex) {
System.err.println("No se pudo cerrar el br");
}finally{
try {
isr.close();
} catch (IOException ex) {
System.err.println("No se pudo cerrar el isr");
}
}
}
return x;
}


Pinche formato feo de esta cosa... En fin... Y se tienen que importar las clases:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
Yaaaaaaaa seeeeeeeee yaaaaaaaa seeeeeeee que esos mensajes tan "descriptivos" de las excepciones como que no van (menos el de la razón pacheca xD )... Pero bueno, si es algo formal lo de menos es cambiarlo.

Espero que sea de utilidad para alguien... Que lo dudo, pero ojalá.

Saludos,

Posts relacionados