sábado, 3 de diciembre de 2011

Correos con formato incompatible MS Outlook

En los ambientes corporativos se suele usar Microsoft Outlook como solución de cliente para correo electrónico. Como es costumbre Microsoft trata de inducir el uso de formatos propietarios y cerrados, el mundo de correos electrónicos no se salvó de esta incómoda situación; por tal razón en algunas condiciones se usa un formato TNEF (Transport Neutral Encapsulation Format) para enviar correos electrónicos. Este formato no es compatible para algunos clientes de correo, especialmente con aquéllos OpenSource.

El cliente de correo electrónico Thunderbird ofrece una alternativa para soportar este formato por medio de un Complemento (AddOn) llamado LookOut.

Para instalar este complemento puede hacerse yendo al menú Herramientas -> Complementos, y escribiendo el nombre del complemento "LookOut" en el cuadro de texto para búsqueda de Complementos, una vez encontrado se puede instalar siguiendo las correspondientes instrucciones. Será necesario reiniciar la aplicación después de la instalación.


viernes, 7 de octubre de 2011

Windows XP Professional / instalando IIS

Para instalar Internet Information Server (IIS) es necesario tener a la mano el CD de instalación para Windows XP Professional, o una copia local del instalador.

Se debería instalar simplemente yendo al panel de control a la parte de Agregar o quitar programas, y se le da en el botón Agregar / quitar componentes de Windows, donde aparecerá una lista de programas instalables donde se puede sseleccionar IIS entre otros.

Al proceder con la isntalación te pide indicar la ruta del instalador de Windows XP para tomar los archivos e instalar, pero desafortunadamente tuve inconvenientes y me arrojaba el sigueinte error:

Setup cannot copy the file staxmem.dll ...insert Windows XP Professional Service Pack 3 CD

Con un CD de instalación para Windows XP Professional con el SP3 integrado debe ser suficiente, pero no se solucionaría hasta ejecutar la siguiente sentencia:

esentutl /p %windir%/security/database/secedit.sdb

Al parecer este archivo indicado en el comando anterior tenía algun tipo de problema, pero instaló de inmediato una vez reparado con el comando anterior.

Referencias

http://ilovett.com/blog/projects/dealing-with-staxmemdll

miércoles, 5 de octubre de 2011

JBoss 7 AS / Apache Tomcat ARP

Es probable que la instalación de JBoss al iniciar arroje el siguiente mensaje:

INFO  [org.apache.catalina.core.AprLifecycleListener] (MSC service thread 1-3) La biblioteca nativa de Apache Tomcat basada en ARP que permite un rendimiento óptimo en entornos de desarrollo no ha sido hallada en java.library.path: .:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java

La recomendación indicada en el mensaje es instalar Tomcat Nativo; para ello creé una entrada: http://x78527.blogspot.com/2011/10/instalando-tomcat-nativo-en-osx-snow.htm

Con esta instalación debería desaparecer el error al próximo reinicio del servidor de aplicaciones JBoss.

Instalando Tomcat nativo en OSX Snow Leopard

Prerequisitos
  • XCode 3.2.1
Descargar Tomcat Native en http://tomcat.apache.org/download-native.cgi, al momento de este artículo se usó la versión 1.1.22.

tar zxvf tomcat-native-1.1.22-src.tar.gz

cd tomcat-native-1.1.22-src/jni/native 

./configure --with-apr=/usr/bin/apr-1-config --with-java-home=/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/ 

make clean    

make 

sudo cp .libs/libtcnative-1.0.1.22.dylib /usr/lib/java
 

sudo ln -s /usr/lib/java/libtcnative-1.0.1.22.dylib /usr/lib/java/libtcnative-1.dylib

Referencias
  • http://blog.hgomez.net/2009/12/22/how-to-build-tomcat-native-on-snow-leopard/

jueves, 29 de septiembre de 2011

OSX modos para suspender (sleep)

OSX ofrece tres métodos para suspender, con los respectivos comandos asociados se muestran a continuación:


sudo pmset -a hibernatemode 0″ = suspend to RAM only (por defecto para escritorios)
sudo pmset -a hibernatemode 1″ = suspend to disk only
sudo pmset -a hibernatemode 3″ = suspend to disk + RAM (por defecto para portátiles)



En el orden anterior tienen ventajas y desventajas:


Modo 0: es el más rápido, sin embargo el menos seguro porque se corre el riesgo de que se agote la batería y se pierde la sesión.
Modo 1: no usa la memoria y simplemente maneja todo en disco, presenta el inconveniente de lentitud para volver del modo suspendido. Este método es el menos recomendado, porque es lento tanto para suspender como para volver del modo suspender. Solo debería usarse en circunstancias muy específicas.
Modo 3: con respecto al modo anterior, es igual de seguro pero tiene la ventaja de que es más rápido a la hora de volver del modo suspendido.


Referencias


http://etherealmind.com/osx-hibernate-mode/

martes, 27 de septiembre de 2011

OSX: estableciendo variables de entorno (Snow Leopard)

Las recomendaciones aquí indicadas se ensayaron usando Snow Leopard, sin embargo las cosas en OSX Lion deben funcionar muy seguramente de forma similar (o igual).

Aunque existen diferentes formas de establecer variables de entorno y muchas funcionan en diferentes niveles, la forma que se va a explicar es global y por lo tanto funciona para todo el entorno, es decir: entorno gráfico, terminal, otros shells, etc.

La forma de establecer variables globales recomendada para OSX es usando el comando launchctl, que recibe como parámetro una operación, el nombre de la variable y el valor de la variable, ejemplo:

launchctl setenv GLASSFISH_HOME /opt/glassfish3

El comando anterior se le indica la operación "setenv" (establecer variable de entorno), el nombre de la variable (GLASSFISH_HOME) y el valor (/opt/glassfish3, una ruta donde se encuentra la aplicación Glassfish OSE 3.1.1). La ejecución de este comando tiene efecto inmediato y solamente es necesario reiniciar las aplicaciones y/o shells (Terminales por ejemplo) donde se quiera tener acceso a la variable. Si se quiere hacer permanente la variable, debe agregarse una línea al archivo /etc/launchd.conf (Si no existe debe crearse). Continuando con el ejemplo anterior, la línea de configuración quedaría:

setenv GLASSFISH_HOME /opt/glassfish3

Para que los cambios tengan efecto, es necesario reiniciar el sistema; si no deseas reiniciar puedes ejecutar launchctl y dejar configurada la variable para el próximo reinicio.

La variable de enotorno PATH es un caso especial y debe establecerse de otra manera, la forma recomendada es crear un archivo en /etc/paths.d ó bien, usar /etc/paths con las asignaciones; tomando el ejemplo anterior, si quisieramos configurar los binarios de la aplicación en el PATH asumiendo que estén ubicados en $GLASSFISH_HOME/bin (como se puede notar se reutiliza la ruta establecida en la variable de entorno), crearíamos un archivo /etc/paths.d/glassfish3, este archivo tendría el siguiente contenido:

$GLASSFISH_HOME/bin

La configuración anterior tiene efecto inmediato y deben reiniciarse las aplicaciones donde se quiera tener acceso.

Otra forma de establecer la variable PATH es usando el archivo /etc/paths, pero no la recomendaría por razones de orden y mejor administración, sin embargo funciona perfectamente.

En OSX existen otras formas de establecer variables de entorno, pero presentan inconvenientes de una u otra forma, por ejemplo algunas solo funcionan para el entorno gráfico, otras solo funcionan para la línea de comandos; algunas funcionan bien pero no son filosóficamente apropiadas con respecto a OSX, por ejemplo /etc/profile, archivo que incluso viene de solo lectura.

Finalmente hay un caso especial cuando se requiere sobreescribir, o dar preferencia a algún directorio en el PATH; ejemplo: digamos que se tiene instalado Maven en /opt/apache-maven, sin embargo también existe una instalación previa en /usr/bin. Si configuramos en /etc/paths.d se ejecutará lo que esté en /usr/bin, si queremos que se ejecute los comandos de /opt/apache-maven/bin será necesario agregar esta ruta en /etc/paths encima de la ruta /usr/bin o cualquier otra donde se quiera sobreescribir un comando.

miércoles, 31 de agosto de 2011

Instalando Oracle 10g XE en Debian 6 amd64

Para el presente artículo se empleó la base de datos Oracle XE 10g Release 2 (10.2.0.1) y el sistema operativo Debian 6 ""Squeeze" (6.0.2.1) para arquitectura amd64.

El soporte de Oracle para sistemas operativos Linux está mucho más avanzado que en años anteriores y la instalación en general es realmente fácil.

1. INSTALADOR. Es necesario desde luego disponer del instalador de la base de datos, se descargó desde la siguiente dirección: http://www.oracle.com/technetwork/database/express-edition/downloads/102xelinsoft-102048.html. Se encuentran disponibles versiones de instalador RPM y DEB, para Debian usaremos DEB. Por otro lado, surge el inconveniente que solamente estará disponible para arquitecturas x86; sin embargo esto no es impedimento para instalarlo en una versión Debian para arquitectura amd64.

2. DEPENDIENCIAS. Es necesario algunas dependencias para que la base de datos instale.

ia32-libs para soporte de arquitectura i386.
libaio1 soporte para características AIO (asynchronous I/O system calls) en el núcleo.

La siguiente secuencia instala tales dependencias:

aptitude install ia32-libs
apt-get install libaio


3. INSTALACIÓN DE LA BD. Una vez instaladas las dependencias se puede ejecutar el instalador descargado previamente.

dpkg --force-architecture -i oracle-xe_10.2.0.1-1.0_i386.deb

El parámetro "--force-architecture" hace posible instalar el paquete en una arquitectura que no corresponde al sistema instalado.

4. CONFIGURACIÓN DE LA BD. Después de instalar es necesario una configuración básica inicial mínima que se puede realizar ejecutando la siguiente secuencia:

/etc/init.d/oracle-xe configure

A continuación preguntarán puertos por donde se conectará la base de datos (1521 por omisión), por donde estarán los servicios de administración (8080 por omisión), un usuario y contraseña para acceder al sistema.

Una vez configurada la base de datos se puede ingresar a la consola de administración en el puerto que se indicó, ejemplo: http://localhost:8080/apex.

5. INSTALACIÓN DEL CLIENTE. Más conocido como "Instant Client", nos permitirá usar clientes como el SQL*Plus.

Es necesario obtener el cliente, para este artículo se descargó la edición Basic Lite correspondiente al archivo basiclite-10.2.0.5.0-linux-x64.zip en
http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html.

Una vez descargado se puede descomprimir y ejecutar la siguiente secuencia:

cd instantclient_10_2
mkdir -p network/admin
cd network/admin
ln -sf /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/admin/tnsnames.ora .


La secuencia anterior crea un directorio "network/admin" dentro del directorio donde se descomprimió el Instant Client (instantclient_10_2 ) y crea un enlace con el archivo de configuración de conexión "tnsnames.ora".

Para el funcionamiento del cliente es necesario configurar algunas variables de entorno. Estas variables pueden ubicarse en el archivo .bachrc, o algún otro donde garantice la disponibilidad de las variables.

Las siguiente instrucciones funcionario para la instalación del presente artículo:

export ORACLE_SID=XE
export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
export XE=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
export LD_LIBRARY_PATH=~/lib:/lib:/usr/lib:/usr/local/lib:~/instantclient_10_2:$XE/lib
export PATH=~/bin:~/instantclient_10_2:$XE/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/bin/X11:/usr/games
export ORACLE_USERID='usuario/password'
export ORACLE_DSN='dbi:Oracle:XE'


Terminada la instalación y configuración debería ser posible conectarse con SQL*Plus con la siguiente secuencia:

sqlplus usuario/contraseña

El usuario y contraseña se indicaron anteriormente durante el proceso de configuración de la base de datos.

Referencias

jueves, 7 de julio de 2011

Bondades del SSH: acceso a Internet, transferencia de información, túneles,...

Si nos encontramos en alguna red privada, es probable que la configuración de red (entre proxy y firewalls) tenga restringido los servicios de acceso a redes externas, particularmente se va a tratar el servicio SSH en este artículo. El servicio SSH por defecto sale por el puerto 22, uno de los puertos que generalmente se encuentran bloqueados, precisamente por las libertades de acceso y funcionalidades que un servicio SSH ofrece, algunas de estas libertades resultan ser:
  1. Tengo acceso total a una máquina externa, la cual puedo controlar a mi antojo (asumiendo usuarios con permisos suficientes desde luego).
  2. A esta máquina externa le puedo enviar y recibir información de ella, una de las principales preocupaciones de las redes privadas, en especial las corporativas.
  3. Como si fuera poco lo anteriormente mencionado, puedo incluso crear un proxy que me permita salir a otra red por medio de esta máquina. Esta red puede ser cualquiera a la que la máquina externa tenga acceso, generalmente se aprovecha para acceder a la red de redes, Internet.
Teniendo en cuenta todas estas bondades (entre otras), uno se puede ver tentado a crear un acceso a este servicio para evitar restricciones y saltarse un poco las reglas. Una forma de lograrlo es creando un túnel (en inglés conocido como tunneling).

Como primera medida es posible cambiar el puerto de salida desde nuestro servidor, raramente encontraremos el puerto 22 abierto en una red restringida, pero es probable que algunos puertos de común uso no presente este tipo de restricciones, uno que muy probablemente se encontrará libre para acceso es el puerto 443, que generalmente se usa para conexiones HTTP seguras, más conocidas como HTTPS. Restringir este puerto implicaría limitar el acceso a sitios Web que usen esta configuración de acceso, por esta razón es un buen candidato para el túnel de acceso.

Existen diferentes formas de lograr este cambio de puerto, una de ellas es cambiando la configuración del mismo servicio SSH en el servidor para que salga por un puerto determinado, en Linux distribución Debian específicamente (por lo tanto debería funcionar con distribuciones de uso común como Ubuntu), esto puede lograrse configurando el archivo /etc/ssh/sshd_config. Para revisar el valor actualmente configurado puede usarse

cat /etc/ssh/sshd_config | grep Port
Port 22

(Azul el comando, negro la salida)

Esta configuración puede modificarse y reiniciar el servicio SSH

/etc/init.d/ssh restart
Restarting OpenBSD Secure Shell server: sshd.

Y con esa configuración es generalmente suficiente para tener un servicio SSH corriendo por ese puerto. Otra alternativa, mi preferida en comparación a esta, es la configuración por hardware que puede lograrse directamente en el router que realiza la conexión a internet (uno que generalmente proporciona tu ISP "Internet Service Provider"). Naturalmente es necesario que tengas acceso a dicho dispositivo el cual generalmente viene con acceso protegido con usuario y contraseña. Por medio de un router, es posible direccionar las peticiones con puertos y protocolos específicos, para el caso del presente artículo necesitaríamos redireccionar las conexiones recibidas por el puerto 443 a una máquina local con una IP específica, que tiene a su vez el servicio SSH saliendo por el puerto 22. Cada dispositivo dependiendo de su fabricante, marca y/o modelo, cuenta con su propia manera de configurarlo, en mi caso personal dispongo de un clásico D-Link DI-524, donde puede configurarlo por medio de una característica llamada Virtual Server que se puede acceder desde la pestaña Advanced, botón Virtual Server.
La configuración esencial consiste en darle una IP de la red local donde se encuentra el servidor, en la configuración de ejemplo tengo la 192.168.0.120; además debe indicarse un puerto público y uno privado, el privado será el puerto donde se encuentra publicado el servicio dentro de la red local, para el caso será el puerto 22 donde está el servicio SSH; el puerto público será el de acceso exterior, para el caso será el 443. En resúmen, todo lo que entre por el puerto 443 será redireccionado a la máquina con IP 192.168.0.120 por el puerto 22.

Con esta segunda alternativa de configuración el servicio SSH sigue disponible en el puerto 22, lo que nos da ventajas y comodidades, por ejemplo podemos ingresar a una sesión SSH sin indicar explícitamente puertos desde máquinas configuradas en la misma red local.

Para el uso del servicio SSH en redes externas, la red restringida para el caso, será necesario ingresar por el puerto 443; en el cliente SSH esto se indica por medio de la opción "-p", para probar el acceso simplemente podemos escribir

ssh ip-remota@usuario -p 443

Si logramos este acceso ya tenemos transferencia de información tanto envío y recepción, entre la máquina remota y la máquina local dentro de la red "restringida". Pero en algunos casos, y muy seguramente en una red restringida, no será tan sencillo, porque hay seguramente un proxy que requiere configurarse para tener acceso; pero hay solución al respecto.

Un aliado de SSH llamado Corkscrew, permite realizar conexiones SSH sobre conexiones HTTP y HTTPS, que son regularmente permitidas por servidores proxy. De otra manera sería necesario abrir un socket, lo cual seguramente estaría restringido por el proxy y no sería posible conectarse aún con el servicio activo en un puerto permitido, como el 443 mencionado anteriormente.

Es necesario por lo tanto tener instalado el Corkscrew, en Debian y familiares como Ubuntu, puede instalarse ejecutando como super usuario:

apt-get install corkscrew

La configuración puede hacerse de diferentes formas, pero una recomendada es creando dos archivos de configuración que tendrán los siguientes propósitos:
  1. Un archivo de autenticación con las credenciales necesarias para acceder al proxy
  2. Configuración proxy, donde se indicará un comando de proxy que ejecutará el Corkscrew con sus parámetros asociados.
El primer archivo con las credenciales lo llamé Credenciales, lo ubiqué en ${HOME}/.ssh, y le agregé el siguiente contenido:

usuario:password

Con esa simple línea indicamos el usuario de acceso al proxy, y la contraseña asociada. El segundo archivo con el comando para Corkscrew también tiene una sola línea, lo llamé ConexionProxy y lo ubiqué en ${HOME}/.ssh, pero al igual que el anterior, pueden ubicarse donde se deseé.

ProxyCommand /usr/bin/corkscrew proxy 8080 %h %p $HOME/.ssh/Credenciales

Puede notarse la siguiente información relevante:
  • Puerto donde está configurado el proxy (8080 en el ejemplo).
  • Ruta del archivo con las credenciales de acceso al proxy
Indicada la información anterior, se puede considerar listo el sistema para conectarse. Un acceso SSH por ejemplo, se podría hacer de la siguiente manera

ssh -p 443 -F ${HOME}.ssh/ConexionProxy usuario@ip-remota

La información relevante del comando anterior sería:
  • Puerto por donde saldrá la conexión SSH, 443 en el ejemplo.
  • Archivo con la configuración del comando para Corkscrew.
  • Usuario y dirección IP de la máquina remota donde se conectará al servicio SSH.
Otra tarea importante que quizá querramos realizar es definitivamente la transferencia de archivos, esto lo podemos hacer con el comando "scp", ejemplo:

scp -P 443 -F ${HOME}.ssh/ConexionProxy usuario@ip-remota:/home/usuario/ejemplo.zip .

La instrucción anterior descargaría el archivo /home/usuario/ejemplo.zip, ubicado en la máquina remota al directorio actual en el sistema local. Nótese que el puerto está indicado con "P" mayúscula, a diferencia de la "p" minúscula usada en el comando "ssh".

Finalmente, como si fuera poco ya tener transferencia de información y acceso a un equipo externo donde podremos realizar todo lo que nuestros conocimientos y alcance en materia de línea de comando nos permita; también podremos crear un segundo proxy propio, que nos permita salir a Internet u otra red a la que el equipo externo tenga acceso. Realizando esta configuración no tendremos las restricciones de la red privada, sino que estaremos limitados a lo que pueda acceder la máquina remota, que si es nuestro equipo casero muy seguramente serán ínfimas las restricciones. La instrucción para levantar este servicio de proxy sería algo como lo siguiente:

ssh -p 443 -F ${HOME}.ssh/ConexionProxy -N -D localhost:9999 -l usuario ip-remota

Este comando crea un proxy que estará configurado y disponible en la dirección localhost en el puerto 9999. Ahora podemos dirigirnos a las opciones de nuestro navegador preferido y configurar el acceso usando este proxy virtual, o la configuración global del sistema operativo.

La imágen anterior muestra la configuración en un Firefox para OSX.

En la siguiente ruta http://www.filesavr.com/EVLLBBHI382E6WH, subí un paquete con los archivos de configuración indicados en el ejemplo que fácilmente se pueden modificar para crear un túnel en cualquier red restringida.

Referencias y lecturas recomendadas asociadas al tema

Richfaces: verificación de errores de validación en el cliente

En algunas circunstancias es útil verificar en el cliente (generalmente un navegador) si ocurrieron errores de validación mientras se enviaba información al servidor. Un caso típico es un cuadro de diálogo modalPanel, donde probablemente se tiene un commandButton para ejecutar una acción que requiere validaciones en la información de un form; este tipo de validaciones generalmente son de tipo campos requeridos (required), formatos válidos para el tipo de dato y otros.  Se desea que el cuadro de diálogo no se cierre hasta que la operación sea exitosa o el usuario cancele el cuadro de diálogo


Para llevar a cabo esta verificación, se puede revisar los mensajes de error del contexto faces y dependiendo de los resultados obtenidos se pueden dar los siguientes casos:
  1. Si no hay mensajes de error en el contexto faces, se asume la información se ha enviado y la operación asociada se ha ejecutado satisfactoriamente.
  2. En caso contrario, se asume un error de validación, o de alguna regla de negocio que no permite ejecutar la operación requerida.
Lo anterior es sencillo y del lado del servidor puede verificarse de la siguiente manera:

FacesContext fc = FacesContext.getCurrentInstance();
boolean tieneMensajesError = fc.getMessages(null).hasNext();

if (tieneMensajesError) {
   // Realizar alguna acción si hay mensajes de error
} else {
   // Realizar alguna acción si no hay mensajes de error


¿Cómo hacer esta verificación en el cliente? JavaScript es el mecanísmo más común, usando la API de Richfaces la implementación quedaría de la siguiente forma:

<rich:modalpanel id="ejericioDlg">
 

<a4j:commandButton id="btnGuardar" action="#{algunBean.guardar}" value="Guardar" oncomplete="if (#{facesContext.maximumSeverity==null}) #{rich:component('ejercicioDlg')}.hide();"/>

<a4j:commandButton id="btnCancelar" value="Cancelar" immediate="true"> 

   <rich:componentControl for="ejercicioDlg" operation="hide" event="oncomplete" /> 
</a4j:commandButton>

</rich:modalpanel>

Con lo anterior logramos que el cuadro de diálogo solo se cierre en caso de no presentar errores de validación, que es un comportamiento comunmente deseado.

miércoles, 20 de abril de 2011

Reproducción de videos en la Mac: Quicktime/Perian

En la instalación por defecto, Quicktime tiene algunas limitaciones dentro de las que destaco:
  1. Soporte para archivos de subtítulos con formato SRT
  2. Soporte para formatos de video DivX
Como solución se puede instalar Perian que se hace llamar así misma como la Navaja suiza para Quicktime; además de cubrir las necesidades mencionadas anteriormente ofrece un rico conjunto adicional de funcionalidades para este reproductor de video.
A pesar de introducir soporte a muchos formatos reconocidos, faltarán algunos formatos que Quicktime no reproducirá a pesar de instalarle la Navaja suiza, por lo tanto es recomendable tener un reproductor guerrero a la mano, personalmente recomiendo VLC media player.

Referencias

domingo, 27 de marzo de 2011

Breaking Bad, tercera temporada ¡la mejor escena! [SPOILER]

La siguiente escena del video tiene lugar en la serie Breaking Bad temporada 3, episodio 7 "One Minute"


Hank recibe una llamada telefónica donde le dan una alerta de que en "un minuto" (como el mismo título del capítulo sugiere) será asesinado; Hank comienza a sentir angustia, duda de la veracidad de la información recibida y prefiere inicalmente pensar que es una broma de mal gusto, de todos modos algo le dice que es cierto así que intenta prepararse para la situación pero cae en la cuenta de que no tiene un arma a la mano, tendrá que defenderse desarmado de dos asesinos profesionales muy conocidos en capítulos anteriores de la serie donde han merecido una fama de ser efectivos y terribles.

Aunque no deja de ser un acto heróico defenderse de estos dos homicidas, y de paso asesinarlos, Hank no lo logrará sin antes pasar por serios aprietos y ser lástimado gravemente, llegando a experimentar incluso cercanías a la línea de la muerte.