Paquetes genéricos en jPOS

No Comments

jPOSPackage

El empaquetado es una de las glorias de jPOS a mi parecer, hace un tiempo escribí como jPOS creaba el mapa de bits primario y sencudario.  Mucha gente que inicia con jPOS cree (me incluyo yo en mis inicios) que nosotros debemos setear el campo primario y el campo secundario, pero que quede claro, esto no es necesario con jPOS. Por eso vamos hablar hoy del empaquetado y el desempaquetado en jPOS, los diferentes tipos de empaquetados que el frameworks nos ofrece y el Empaquetado Genérico, para crear el empaquetado a la medida.

Existen 2 maneras de crear un empaquetador, primero implementando el Interfaz ISOPackager que se encuentra en el paquete org.jpos.iso y heredando los métodos de ISOBasePackager que trae int unpack y byte[] pack. Existen muchas clases empaquetadoras en esta ubicación /org/jpos/iso/packager para diferentes tipos de protocolos de comunicación.

public interface ISOPackager extends LogSource {
     public byte[] pack (ISOComponent m) throws ISOException;
     public int unpack (ISOComponent m, byte[] b) throws ISOException;
     public void unpack (ISOComponent m, InputStream in) throws IOException, ISOException;
     public String getFieldDescription(ISOComponent m, int fldNumber);
     public ISOMsg createISOMsg ();
}

La otra manera es crear un empaquetado genérico, que no es mas que crear una estructura en XML donde indicamos, el id, el largo del mensaje, el nombre, y el tipo de dato, en ese campo vamos agregar la clase del tipo de dato que nos ofrece jPOS.

<!DOCTYPE isopackager SYSTEM "genericpackager.dtd">
<!-- ISO 8583:1993 (BINARY) field descriptions for GenericPackager -->
<isopackager>
  <isofield
      id="0"
      length="4"
      name="Message Type Indicator"
      pad="false"
      class="org.jpos.iso.IFB_NUMERIC"/>
  <isofield
      id="1"
      length="16"
      name="Bitmap"
      class="org.jpos.iso.IFB_BITMAP"/>
    ...
    ...
    ...
  <isofield
        id="128"
        length="8"
        name="Message authentication code field"
       class="org.jpos.iso.IFB_BINARY"/>
 </isopackager>

Si descargas jPOS, podrás encontrar listos y para su uso algunos ejemplos en la ubicación cfg/packager.

Nota: Debes tener en cuenta que el genericpackager.dtd y el generic-validating-packager.dtd deben estar en el mismo directorio y tener permisos de lectura (linux) para que el paquete genérico pueda leer la configuración creada por vos.

Una vez listo tenemos nuestro xml para el empaquetador genérico, que se adapte a nuestras necesidades solo agregamos el PATH como parametro del constructor de la clase GenericPackager y listo para usarse como en el siguiente ejemplo.

GenericPackager packager = new GenericPackager("miPaquetePersonalizado.xml");

Una vez cargada la configuración, ya podemos empaquetar y tendremos lista nuestra trama para enviarla por el socket. o si desempaquetamos, el canal que usemos se encargará de converir la trama en un objeto ISOMsg.

//Para reempaquetar
iso.recalcBitMap();
//o usar los métodos para empaquetar
iso.pack();
//o
// Para desempaquetar
iso.unpack();

Cómo trabajar en ambientes de desarrollo y colaboración?

No Comments

amcolaboracion

En muchas ocasiones, sea en una empresa, como freelance o entre amigos el desarrollo de sistemas vamos a encontrarnos con ambientes de colaboración en el desarrollo de un sistema, un programador, por lo general, tiene un papel específico en un proyecto, sea cual sea la forma en la que trabaje, se necesita un control y un orden en todo el proceso de desarrollo.

Cuando el proyecto sea mediano o  grande, o si estas pensando en un proyecto open source vas a necesitar una manera de controlar a tus empleados o compañeros de trabajo, y existen algunas herramientas open source para este tipo de ambientes, para que el proceso de desarrollo no se vuelva un caos y se acabe el problema de andar con la memoria flash compartiendo los cambios que hiciste el dia de hoy, pues en muchas empresas, aún no conocen herramientas tan básicas como es las herramientas de control de revisiones, manejadores de bugs o sigue usando el extinto Microsoft SourceSafe.

Control de Versiones

No voy a entrar a definir que son cada una de estas herramientas, y solo mencionar cuales son las más usadas y el porque de usarlas. Hace unos pocos años el CVS era el rey, todos los proyectos Open Source más importantes lo usaron como Control de Versiones, actualmente sustituido por completo por el famoso y sencillo de usar SVN (Subversion),  la mayoria de los proyectos en internet lo usan, asi que es una seria alternativa, donde existen sinumero de IDE’s compatibles con este control de versiones centralizado. Existen otros llamados Git y Mercurial pero no tienen tanto público. Todos estos sistemas de control de versiones nos permiten la gestión de los diversos cambios que ocurren en nuestro codigo fuente.

Seguimiento de Errores

Pero todo proyecto necesita mantenimiento, en la fase de pruebas del proyecto no aparecerán todos los errores, seguramente la mayoria aparecerán ya habiendo liberado el primer prototipo o incluso el primer sistema estable, asi que necesitamos una herramienta para el control y seguimiento de errores, tenemos 2 buenas alternativas famosas y bastante potentes pero algo diferentes. La primera es TRAC, un sistema de seguimiento de errores programado en Python y tiene unas interesante caracteristicas, tiene un Wiki integrado y es multi proyectos. El segundo es BugZilla, este programado en Perl, todos corren bajo el Servidor Web Apache2, pero tambien son compatibles con ISS y otros servidores. TRAC y Bugzilla son compatibles con muchos sistemas de control de versiones asi que no habrá problema para integrarlos con estas herramientas.

Integración Continua

Para esta fase necesitamos un software, este se puede intregar facilmente con TRAC, se llama Hudson, es un proyecto en Java, arropado por el Proyecto Sun. Este herramienta de Integración Continua (CI) tiene la idea de rebajar los costes provocados por la gestión de proceso de compilación, interación y empaquetado del software.

IDE’s de Desarrollo

Pero falta la herramienta más importante, el entorno de desarrollo es el software que utilizan los programadores para el desarrollo del sistema, y tambien necesita integración con las herramientas anteriores, existen dos gratuitas y otras de pago, pero las dos primeras son las más usadas y con mejor soporte en internet, Eclipse es la primera, tiene integración desde su instalación básica con CVS, y con SVN con el plugin Subeclipse. Existen plugins para integrar Eclipse con diversos lenguajes de programación que por defecto es para desarrollo en Java, pero también PHP, Python, Perl y Ruby, y seguramente muchas mas. Eclipse es patrocinado por IBM y es un proyecto completamente open source. El segundo es NetBeans, con soporte para SVN y CVS, los lenguajes anteriormente mencionados y un gran soporte por parte de Sun.


Al final, todas estas herramientas ayudan al mejor control del rumbo de un proyecto, ahorra costos, se evitan errores en muchas de las fases del sistema, permiten un entorno de colaboración donde cada tarea es controlada, que partes del código han sido modificadas y por quien. Son integrables entre sí y con muchos otros software open source y lo mejor de todo, completamente gratis.


Tabla de Referencia de RichFaces

No Comments

richTabla

Esta tarjeta ofrecida por DZone.com , es muy útil para recordar todas las etiquetas de RichFaces, los imprimes y listo, a tu lado siempre cuando estes programando con RichFaces y te ahorraras mucho tiempo que consume estar viendo la documentación, puedes descargarlo directamente registrandote en DZone o en el siguiente enlace.

Tarjeta de Referencia RichFaces

Que tipo de servidor necesito?

2 Comments

server_software_solutions_663x403

Cuando decides dar el paso y te quieres comprar un servidor, pero las preguntas son muchas, puedo tirar con una PC normal o ya mi sitio web necesita algo más,  todos buscamos potencia, eficacia, calidad y sobre todo un buen precio. Hoy en dia en páginas como DELL, podemos elegir servidores a la medida, pero el precio cambia muchisimo, entonces?

Que necesito?

Cuanta potencia necesito?

Construyo uno propio? o lo compro ya armado?

Este excelente artículo nos responde todas nuestras preguntas.

Crea tu propia comunidad de microblogging con laconi.ca

No Comments

laconica3

Si sos fanático de Twitter y deseas montar tu propia comunidad, laconi.ca es una de las mejores opciones, este proyecto es usado en http://identi.ca/, es un proyecto similar a Twitter en la que destacan las siguientes caracteristicas.

  • Shorten URLs
  • OPEN ID
  • Avatares
  • Facebook Connect
  • RSS 2.0
  • Crop Image (Herramienta para acortar el avatar)

Una definición más perfecta de este Microbloggin Open Source.

“Laconica es una plataforma de microblogging de código abierto que ayuda a comunidades, compañías y/o grupos a intercambiar mensajes cortos de máximo 140 caracteres en la web, permitiendo a los usuarios suscribirse al flujo de mensajes de sus colegas o amigos. Laconica provee un servicio similar a de Twitter, Jaiku y Plurk.” (Información traducida del archivo About).

Instalarlo no es nada del otro mundo, dispone de un interfaz de instalación, necesitas las librerias php5-curl, MySQL como bases de datos y el modulo rewrite. Aquí un manual para instalarlo si se te dificulta.

Cambiando Contraseña de usuarios Virtuales en Roundcube 0.2.2

7 Comments

pass

Hace unos días hablaba de un cliente de correo imap llamado RoundCube,  pero le face falta una opción que aún no trae por defecto, es el cambiar la contraseña, el problema que cuando instalamos un servidor de correo con direcciones virtuales en Linux con MySQL generalmente se usa SALS por medio de PAM para los inicios de sesión, eso deja a Roundcube con un problema, donde la contraseña queda fuera de su control. Pero existe una forma de integrar esta funcionalidad en en RoundCube, yo he visto algunos tutoriales que hablan de versiones inferiores, yo he probado esta en la 0.2.2 y funciona perfectamente incluso con el skin de OutLook para RoundCube.

(more…)

Primeros Pasos con Namespaces en PHP

5 Comments

php-namespaces

Voy a traducir al español este artículo de Craig Buckler que me parecio una buena introducción a los namespaces de php.

Porqué debo usar Namespaces?

El tamaño de las librerias de PHP crece dia a dia, y tambíen incrementa el riesgo accidental de definir una clase o una función que hubiese sido declarado antes. El problema  se complica cuando tu intentas agregar componentes de terceros o plugins y en cualquiera de los dos tengan una clase “Base de Datos” o una clase “Usuario”.

Hasta ahora la única solución habia sido tener nombres clase/función. Es decir, WordPress utiliza prefijos para cada nombre “WP_”. Zend Framework usa nombres descriptivos que resultan largos nombres para clases como por ejemplo Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive.

El problema de colisión de nombres es resuelto con los Namespaces. Las constantes de PHP, clases y funciones pueden ser agrupadas como librerias namespaces.

Cómo se definen los Namespaces?

Por defecto, todas las constantes, clases y funciones son ubicadas en un espacio global,  asi se hacia antes del soporte para namespaces.

El código namespaces es definido usando la palabra clave namespaces en el inicio del archivo PHP. Debe ser el primer comando (con la excepción de declare) y un código que no sea PHP, HTML o espacios en blanco pueden preceder el comando.

<?php
// define this code in the 'MyProject' namespace
namespace MyProject;
 
// ... code ...

El código que sigue asigna como namespaces “MyProject”. No es posible  definir mas namespaces en el mismo bloque de código ( solo el último se reconocerá). Como sea, tu puedes definir diferentes namespaces en el mismo archivo.

<?php
namespace MyProject1;
// PHP code for the MyProject1 namespace
 
namespace MyProject2;
// PHP code for the MyProject2 namespace
 
// Alternative syntax
namespace MyProject3 {
	// PHP code for the MyProject3 namespace
}
?>

Aunque esto es posible, se aconseja no hacerlo, para mantener el orden en la definición de un único namespaces por cada archivo.

Sub-namespaces

PHP permite definitir jerarquicamente  namespaces que pueden ser subdivididas. Los Sub-namespaces pueden ser separados con la barra () por ejemplo.

  • MiProyectoSubNombre
  • MiProyectoBaseDatosMySQL
  • NombreCompañiaMiProyectoLibreriaCommonWidget1

Llamados a código Namespaces

En este archivo llamada lib1.php,  vamos a definir, una constante, una función  y una clase como AppLib1 namespace:

lib1.php

<?php
// application library 1
namespace AppLib1;
 
const MYCONST = 'AppLib1MYCONST';
 
function MyFunction() {
	return __FUNCTION__;
}
 
class MyClass {
	static function WhoAmI() {
		return __METHOD__;
	}
}
?>

Nosotros podemos ahora uncluir el código en otro archivo PHP, como sigue.

myapp.php

<?php
header('Content-type: text/plain');
require_once('lib1.php');
 
echo AppLib1MYCONST . "n";
echo AppLib1MyFunction() . "n";
echo AppLib1MyClass::WhoAmI() . "n";
?>

No se han definido namespaces en myapp.php, entonces el código existe en el espacio global. Cualquier referencia directa a MY CONST, MyFunction o MyClass fallarán porque existen en el namespaces AppLib1. Para llamar el código lib1.php, puede agregar el prefijo AppLib1 para definir nombres debidamente cualificados. El siguiente resultado es la salida que cargamos en myapp.php.

AppLib1MYCONST
AppLib1MyFunction
AppLib1MyClass::WhoAmI

Nombres debidamente cualificados pueden ser algo largos, pero son obvio los beneficios en contra de definir nombres largos para clases App-Lib1-MyClass.

Artículo en Inglés

jPOS y el Echo Test 0800

4 Comments

credit_cards

Continuando y aprendiendo mas sobre el Standard ISO8583 y jPOS, del cual hemos hablado anteriormente en otras entradas, hemos hablado de la mensajeria utilizada para el intercambio de transacciones entre sistemas por medio de un flujo de comunicacion. Hoy le toca el turno a otro tipo de mensaje que viene en este paquete del Standard como es el de manejo de red e intercambio de claves.

Este tipo de Mensaje, mejor conocido como 0800 es utilizado para mensajeria de Manejo de Red, siendo uno de los mas utilizados la mensajeria para enviar un Echo Test.

Una  vez que vez la terminal u origen de la transaccion basada en una tarjeta establezca comunicación con el emisor o procesador de la misma , es necesario cuidar esta linea que une ambos sistemas, siendo esto uno de  los puntos centrales e importantes, se requiere  que esta comunicación  siempre este disponible.

Y como hacemos esto cuando ambos sistemas se comunican por medio de mensajes y un standard?

Facil tambien se pensó en esto, y es por eso que existe la mensajeria 0800 en la cual podemos enviar constamente cada cierto periodo de tiempo un mensaje pequeño pero no menos importante cuya principal funcion es que ese canal que se ha abierto se mantenga asi las 24 horas y los 375 dias del año, que este habil y disponible para cuando una transaccion se desee realizar, y de esta manera nos evitariamos un sin numero de problemas.

Un ejemplo de un mensaje echo test seria lo siguiente:

ISOMsg msgiso = new ISOMsg();
//Importante el encabezado 800,
String mti = "0800";
//Si tu  mensaje lleva header aqui se pone la cadena de texto
String header = "tuHeader";
msgiso.setMTI(mti);
 
//Agregamos el Header del mensaje si lo necesitamos, el header se tiene que guardar en bytes
BaseHeader db = new BaseHeader(header .getBytes());
msgiso.setHeader(db);
 
//Campo 7, con ISODate obtenemos la fecha en formato ISO8583
msgiso.set(new ISOField(7, ISODate.getDateTime(new Date())));
 
//Campo 11, con ISOUtil.zeropad, rellenamos de ceros
msgiso.set(new ISOField(11, ISOUtil.zeropad(new Integer("555555").toString(), 6)));
 
//Campo 70, el 301 por defecto
msgiso.set(new ISOField(70, "301"));
 
//Lo empaquetamos, generico o echo a la medida, tu eliges.
GenericPackager packager = new GenericPackager("miPaquetePersonalizado.xml");
 
//Empaquetamos el mensake
msgiso.setPackager(packager);
 
//Construimos el BitMap
msgiso.recalcBitMap();

El Echo test utiliza 3 campos fundamentales del ISO 8583

  • Campo 7: Formato: MMDDhhmmss, MM para el Mes, DD para los Dias, hh las horas, mm minutos y ss segundos.
  • Campo 11: Número único generado por el sistema que envía el mensaje y es utilizado para hacer corresponder las respuestas con los mensajes originales
  • Campo 70: Este campo es por defecto 301. Tambíen se usa el 001 para Logon, y el 002 para Logoff, pero en nuestro caso es 301.

Conclusión, como pudiste ver, es bien sencillo construir un echo test, es un mensaje muy sencillo, que generalmente se envia cada cierto tiempo, suele ser una vez cada 30 o 45 minutos, depende la procesadora de tarjetas de crédito lo requiera, se puede usar un ciclo en el Q2 o construir tu propia interfaz externa que se comunique con el Q2 para canalizar los echo test.

Symfony, el Struts e Hibernate del PHP

2 Comments

symfony-logo

Después de un tiempo escribiendo sobre Frameworks de Java, voy a regresar un poco a mis inicios, a PHP, yo he sido un programador de los que decian, los Frameworks atrasan (al menos en mi tiempo), pero debido a mi reciente experiencia con Spring Framework me di cuenta de las grandes ventajas de un Framework y decidí buscar el mejor para PHP.

Symfony es un completo framework diseñado para optimizar, gracias a sus características, el
desarrollo de las aplicaciones web

Symfony es un completo framework diseñado para optimizar, gracias a sus características, el desarrollo de las aplicaciones web, está desarrollado completamente con PHP 5. Ha sido probado en numerosos proyectos reales y se utiliza en sitios web de comercio electrónico de primer nivel. Symfony es compatible con la mayoría de gestores de bases de datos, como MySQL, PostgreSQL, Oracle y SQL Server de Microsoft.

Estas son algunas de sus caracteristicas:

sfACTION, Capa de Presentación

Toma lo mejor de la arquitectura MVC y la implementa de forma que el desarrollo de aplicaciones sea rápido y sencillo, en el siguiente gráfico se puede apreciar como es el flujo de trabajo, y aqui es donde hago a similitud con Struts, donde los ActionServlet y los sfAction tienen caracteristicas parecidas a la hora de manejar las peticiones en la capa de presentación.

mvcsymfony

El flujo de trabajo de Symfony

PROPEL, Acceso a Datos

La lógica de negocio de las aplicaciones web depende casi siempre en su modelo de datos. El componente que se encarga por defecto de gestionar el modelo en Symfony es una capa de tipo ORM realizada mediante el proyecto Propel. En las aplicaciones Symfony, el acceso y la modificación de los datos almacenados en la base de datos se realiza mediante objetos; de esta forma nunca se accede de forma explícita a la base de datos. Este comportamiento permite un alto nivel de abstracción y permite una fácil portabilidad. Practicamente es el Hibernate del PHP, creo que quedó mas que claro.

YALM, Configuración del Sistema

YAML (“YAML Ain’t Markup Language”) es un lenguaje muy sencillo que permite describir los datos como en XML, pero con una sintaxis mucho más sencilla. YAML es un formato especialmente útil para describir datos que pueden ser transformados en arrays simples y asociativos.  Symfony utiliza el formato YAML como el lenguaje preferido para almacenar su configuración.

http://www.symfony-project.org/

http://www.symfony.es/