PHP 5.3 Liberado !!

1 Comment

php53

Mañana es el dia, en el que PHP se hace mayor, la mejor actualización desde hace años, esperada por muchos desarrolladores, ya tiene fecha de salida.

PHP 5.3.0 incluye importantísimas novedades, como por ejemplo:

Anonymous functions

Funciones Anónimas , también conocido known o closures, permite la creación de funciones que no tienen nombre especifico. Son muy útiles como el valor de los parámetros de llamada, pero tienen muchos otros usos.

<?php
$greet = function($name)
{
    printf("Hello %srn", $name);
};
 
$greet('World');
$greet('PHP');
?>

Driver nativo de MySQL

El Driver nativo MySQL es el sustituto para la libreria de MySQL (libmysql). El Driver nativo de MySQL es ya oficial de PHP 5.3 y PHP 6, está escrito en C como una extensión de PHP.

archivos Phar

El concepto de Phar archivos proceden de la tecnología Java ™ de archivos JAR, que le permite tener todas sus clases en un solo archivo empaquetado.

Phar puede no solo ser utilizado como un contenedor de clases, sino tambien para ejecutar aplicaciones enteras. Los JAR actualmente contiene archivos para ejecutar o crear una aplicación y pueden ser ofuscados por medidas de seguridad, Phar está basado en un concepto similar, pero diseñado más para ambientes web.

Las extensiones Phar, no son totalmente nuevas. Inicialmente se escribieron como PHP_Archive, en el repositorio PEAR en 2005.

//Creando un Phar
<?php
$p = new Phar('/path/to/my.phar', CURRENT_AS_FILEINFO | KEY_AS_FILENAME, 'my.phar');
$p->startBuffering();
$p = $p->convertToExecutable(Phar::ZIP);
?>

Operador Goto

El operador puede ir a ser usado para saltar a otra sección del programa o sistema.

<?php
goto a;
echo 'Foo';
 
a:
echo 'Bar';
?>

Namespaces

Un namespace o espacio de nombres es un medio para organizar/encapsular clases, funciones, constantes… dentro de un entorno, agrupándolas de un modo más lógico y jerárquico, de la misma forma que los directorios agrupan a los archivos dentro de un sistema de ficheros.

Ésta es una característica bastante esperada por los desarrolladores de PHP y llega con el objetivo de ayudar a que no necesitemos prefijar el nombre de nuestras clases con el nombre del paquete al que pertenecen y, por tanto, que podamos tener nombres más cortos. También nos ofrece la posibilidad de declarar varias clases con el mismo nombre y/o que un grupo de desarrolladores pueda trabajar en varios componentes de un mismo proyecto sin que se produzcan colisiones durante la integración.

Los namespaces están especialmente indicados cuando trabajamos en proyectos de gran envergadura, como por ejemplo, un Framework PHP. En algunos Frameworks podemos llegar a encontrar nombres realmente complejos, por no decir imposibles.

<?php
namespace MiEspacioMiSubnivel1MiSubnivel2;
const CONSTANTE = 1;
class mi_clase { /* ... */ }
function mi_funcion() { echo &quot;Mi Funcion&quot;; }
?>

Detector de Rostros en PHP

6 Comments

Un código interesante para reconocimiento facial en fotografias, la verdad todo una maravilla,  yo lo he probado como puedes ver en la imagen de abajo y funciona a las mil maravillas, ademas de 1 clase necesitas un archivo .dat, necesitas las extensión GD2 activada en PHP.

test.php

< ?php
include 'Face_Detector.php';
$detector = new Face_Detector('detection.dat');
$detector->face_detect('m(01-32)_gr.jpg');
$detector->toJpeg();
?>

(more…)

RoundCube, una buena alternativa a SquirrelMail

1 Comment

roundcube

RoundCube es un cliente de correo IMAP para navegadores con una potente interfaz gráfica. Provee todas las funcionalidades que podrías esperar de un cliente de correos, soporte MIME, libreta de direcciones, manipulación de carpetas, buscador de mensajes y corrector de ortografia. RoundCube ha sido desarrollado en PHP, utiliza bases de datos MySQL o Postgres y la interfaz es completamente modificable utilizando XHTML y CSS2.
(more…)

Spring Security 2, la configuración a la medida con DAO Hibernate IV

5 Comments

Más filtros de los que explicamos en el artículo anterior se puede usar en Spring Security, donde vimos los filtros esenciales para la configuración de nuestra capa de seguridad.

AnonymousProcessingFilter

Este filtro es muy util, nos permite darle acceso a un usuarios anónimos a secciones del sistema, digamos que la pagina de registro debe ser de acceso anónimo, en el FilterChainProxy agregamos otra linea donde colocamos el recurso y le asignamos el filtro, ese recurso sera accesible siempre y cuando en el FilterSecurityInterceptor también podemos hacer uso del Rol que indicamos que seran Roles para identificar al usuario anónimo.

<bean id="anonymousProcessingFilter"
		class="org.springframework.security.providers.anonymous.AnonymousProcessingFilter">
		<property name="key">
			<value>MU7kyU0he1MvXEDZ9Mdj7MVvkXOXJ8uRgtg/Xb/3eJyW0HZa3csBoyvinGEC4vmi</value>
		</property>
		<property name="userAttribute">
			<value>anonymousUser,ENCUESTAME_ANONYMOUS
			</value>
		</property>
	</bean>

ExceptionTranslationFilter

Maneja cualquier AccessDeniedException y AuthenticationException arrojados dentro de la cadena de filtro. Este filtro es necesario, ya que proporciona el puente entre las excepciones de Java y las respuestas HTTP. Sólo se ocupan de mantener la interfaz de usuario. Este filtro no hace ninguna garantía real de la ejecución. Para utilizar este filtro, es necesario especificar las siguientes propiedades:

  • authenticationEntryPoint indica que el controlador debe comenzar el proceso de autenticación si un AuthenticationException se detecta. Tenga en cuenta que esto también puede cambiar el actual protocolo de http a https para un inicio de sesión SSL.
  • portResolver (opcional) Se utiliza para determinar el “verdadero” puerto por la que fue recibida la petición.
    • <bean id="exceptionTranslationFilter"
      		class="org.springframework.security.ui.ExceptionTranslationFilter">
      		<property name="authenticationEntryPoint">
      			<ref local="authenticationEntryPoint" />
      		</property>
      	</bean>

      BasicProcessingFilterEntryPoint

      Este filtro es responsable de la tramitación de cualquier solicitud que tiene un encabezado de petición HTTP Authorization con un sistema de autenticación Basica y una codificación username:password simbólico. Por ejemplo, para autenticar el usuario “Aladdin”, con contraseña “ábrete Sésamo” el siguiente encabezado se mostrara como el siguiente ejemplo, (Autorización: Básica QWxhZGRpbjpvcGVuIHNlc2FtZQ == ). Si la autorización es satisfactoria, el objetoAuthentication se colocará en el SecurityContextHolder.

      <bean id="authenticationEntryPoint" class="org.springframework.security.ui.basicauth.BasicProcessingFilterEntryPoint">
        		<property name="realmName"><value>EmForge</value></property>
      </bean>

      LogoutFilter

      Se necesita una forma de cerrar sesión, el LogoutFilter es la solución perfecta, indicamos en el constructor del bean el lugar donde seremos dirigidos cuando cerremos la sesión, y una lista de beans o manejadores de Cerrar sesión, por defecto se debe usar el SecurityContextLogoutHandler, aunque puedes personalizar el tuyo propio.

      <bean id="logoutFilter" class="org.springframework.security.ui.logout.LogoutFilter">
      	 <constructor-arg value="/pages/index.me" />
      		<constructor-arg>
      			<list>
      				<!--  <ref bean="rememberMeServices"/>  -->
      				<bean
      					class="org.springframework.security.ui.logout.SecurityContextLogoutHandler" />
      			</list>
      		</constructor-arg>

      AuthenticationProcessingFilterEntryPoint

      AuthenticationProcessingFilterEntryPoint, es el bean que nos redirecionará a la pantalla de la aplicación donde se inicia sesión, o a donde nosotros queramos por eso la propiedad loginFormUrl. En el caso en que los credenciales no sean correctos se utliza el objeto AccessDeniedHandlerImpl, y en su propiedad errorPage se le especifica a que camino se debe dirigir la aplicación en caso de error.

      <bean id="formEntryPoint" class="org.springframework.security.ui.webapp.AuthenticationProcessingFilterEntryPoint">
            	<property name="loginFormUrl" value="/login.faces"/>
         	</bean>

      Estos son los filtros más usados y que podemos aplicar a nuestra seguridad, junto con los explicados anteriormente son una magnifica opción para crear nuestra seguridad, y como ven, con muy poca programación. En el siguiente artículo veremos la integración del OPENID en Spring Security.

Plone generador de Portales Web en Python

No Comments

plone

¿Que es Plone?

Plone es un generador de portales web construido sobre la sólida base de Zope. Plone permite la creación, personalización y gestión de un sitio web de manera rápida y fácil. Todas las acciones que se han de realizar para la gestión de Plone se pueden realizar a través de un interfaz web una vez instalados Zope y Plone, lo que facilita el trabajo colaborativo y distribuido. Plone es un proyecto desarrollado por una amplia comunidad y su licencia es GPL. Se puede probar Plone sin necesidad de instalarlo en el sitio creado por el propio proyecto Plone para pruebas PloneWeb.

El proyecto Plone comenzó en 1999 por Alan Runyan, Alexander Limi, y Vidar Andersen. Rápidamente se convirtió en uno de los populares y poderosos Sistemas de Gestión de Contenido de Código Abierto. En el 2004 se creó la Fundación Plone para proteger y promover el uso de Plone.

selenium_testrunner

¿Que es Zope?

Zope (ZopeWeb) es un servidor de aplicaciones totalmente orientado a objetos escrito en Python. Es el proyecto estrella de la compañía Zope Corporation, que lo publica bajo los términos de la licencia Zope Public License ZPL, una licencia de software libre.  Zope ofrece una infraestructura general sobre la que se pueden construir aplicaciones web. De esta manera, muchos conceptos y funcionalidades pueden ser reutilizadas. Así, por ejemplo, la herramienta de generación de portales se basa en con módulos de gestión de usuarios, de seguridad o de sesiones ofrecidos por la arquitectura Zope.

zope_ui

El propósito de esta entrada es dar a conocer esta plataforma donde corren lo que són las páginas web de las futuras Alcaldias de Nicaragua, donde 18 portales estan casi listos y en breve publicaré los datos de las alcaldias y que corren sobre esta maravillosa plataforma.

JBug Una comunidad para Jboss Adictos

1 Comment

flyer-jbug-ar

En estas páginas encontrarás una comunidad que comparte tus intereses, ganas y problemas del diario uso del stack de aplicaciones y middleware de JBoss. Si bien el Application Server es el producto más conocido desde este lugar los incentivamos a promover cualquiera de los frameworks propuestos por JBoss. Serán bienvenidos aportes sobre cualquiera de los proyectos libres que se encuentran en el sección community del portal y artículos o notas relacionadas con éstos.

Uno de los objetivos de esta comunidad es concentrar la información de habla hispana relacionada con JBoss a fin de ayudarnos entre todos a conocer distintas tecnologías y mejores prácticas para su implementación. Ansiamos que quieran participar de este emprendimiento y esperamos que la comunidad se pueda nutrir de la experiencia que cada uno tiene y pueda ir aportando.

En la sección calendario publicaremos los encuentros del grupo junto con otras fechas relevantes del mundo del software libre.

También disponen de un Planet, donde solo encontrarás artículos relacionados con JBOSS

http://www.jbug.com.ar/planet/

Si quieres saber más de ellos

http://www.jbug.com.ar/acerca/

JotaDeveloper desde un iPhone

No Comments

No he tenido la dicha de tocar un iPhone en mi vida, pero supongo que algún dia cambiará esa suerte, mi amigo @gandulo me regalo un print screen de mi blog visto desde un iPhone, yo estupefacto ante tanta maravilla tecnológica y lleno de ignorancia absoluta de lo que es usar un SmartPhone, la comparto con la emoción de un niño.

foto

Actualización 18/06/09

Después de instalar correctamente el plugin de WordPress Mobile, se mirará correctamente desde un iPhone,  como aparece en la imagen de abajo.

ihponeJotaDeveloper

También accedí a mi blog desde mi celular (Samsung) y no se mira tan mal, antes ni si quiera me cargaba :)

SamsungJotaDeveloper

Análisis de un Control de Inventario Parte II

20 Comments

screen1

Hace unos 6 meses escribí un artículo sobre un trabajo que realice en 2005 para mi Universidad, finalmente me decidí a liberarlo, aún no libero el editable, solamente el ejecutable, pronto liberaré el editable, puedes descargarlo aquí.

http://jotadeveloperhotel.googlecode.com/files/JotaDeveloperHoteV1.0.mdb

o bien descargarlo en el svn

svn checkout http://jotadeveloperhotel.googlecode.com/svn/trunk/ jotadeveloperhotel-read-only

Este sistema, elaborado por puro amor al arte, esta liberado bajo GNU General Public License v3 y el Contenido bajo Creative Commons 3.0 BY, si deseas la versión editable,

http://code.google.com/p/jotadeveloperhotel/downloads/list

Twitter con jPOS? Esto si que es innovación !!

No Comments

jPOSTwitter

Tal vez una de las fusiones más raras que he visto de una comunidad social con un framework sobre transacciones bancarias, esta clase la encontre en el grupo de jPOS y la verdad como Twittero, me dejo algo alucinado.

Actualización 18/06/09

La única utilidad que le veo es que los log del SysLog del Q2Server aparecen como nuevos mensajes en tu cuenta de Twitter , ha sido probado y funciona.

/*
 * jPOS Project [http://jpos.org]
 * Copyright (C) 2000-2008 Alejandro P. Revilla
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
package org.jpos.util;
 
import java.util.Date;
import java.util.Locale;
import java.util.Iterator;
import java.io.IOException;
import java.text.SimpleDateFormat;
import org.jpos.core.Configurable;
import org.jpos.core.Configuration;
import org.jpos.core.ConfigurationException;
import org.jpos.q2.Q2;
import winterwell.jtwitter.*;
 
/**
 * Twitter Listener
 *
 *  requires jtwitter.jar from http://www.winterwell.com/software/jtwitter.php
 *
 *  Sample configuration:
 *
 *  <log-listener class="org.jpos.util.TwitterLogListener">
 *     <property name="twitterUsername" value="paymentsystems" />
 *     <property name="twitterPassword" value="SuperSecretPassword" />
 *     <property name="tags" value="twitter" />
 *     <property name="prefix" value="[jPOS]"/>
 *  </log-listener>
 *
 */
public class TwitterLogListener implements LogListener, Configurable {
    private Configuration   cfg;
    private String          twitterUsername;
    private String          twitterPassword;
    private String          prefix;
    private String          tags;
    private String          twitterMessage;
 
    private int             MAX_MESSAGE_SIZE = 140;
 
    public TwitterLogListener () {
        super();
    }
    public synchronized LogEvent log (LogEvent ev) {
        if (ev.tag != null && tags.indexOf(ev.tag) != -1) {
 
            Twitter twitter = new Twitter(twitterUsername,twitterPassword);
            StringBuilder sb = new StringBuilder();
            if (prefix != null) {
                sb.append (prefix);
                sb.append (' ');
            }
            Iterator iter = ev.payLoad.iterator();
            for (int i=0; iter.hasNext(); i++) {
                if (i>0)
                    sb.append (' ');
                    sb.append (iter.next().toString());
            }
            if (sb.toString().length()>MAX_MESSAGE_SIZE) {
                twitterMessage = sb.toString().substring(0,MAX_MESSAGE_SIZE);
            } else {
                twitterMessage = sb.toString();
            }
 
            try {
                twitter.updateStatus(twitterMessage);
            } catch (TwitterException e) {
                ev.addMessage ("--- TwitterLogListener error ---");
                ev.addMessage (e);
            }
        }
        return ev;
    }
    public void setConfiguration (Configuration cfg)
        throws ConfigurationException
    {
        this.cfg = cfg;
        try {
            twitterUsername = cfg.get ("twitterUsername");
            twitterPassword = cfg.get ("twitterPassword");
            tags     = cfg.get ("tags", "twitter");
            prefix = cfg.get ("prefix", null);
        } catch (Exception e) {
            throw new ConfigurationException (e);
        }
    }
}

Listeners en jPOS, el ISORequestListener con QMUX

4 Comments

Te preguntaras, que es jPOS?, aquí la respuesta. Cuando usas tu tarjeta de crédito, jPOS es usado en la mayoria de los interfaces para las transacciones de Tarjetas de Crédito, pues es un Framework muy usado y extendido para el protocolo ISO 8583, lo mejor, es gratis.

jPOS ofrece un servidor, llamado Q2 Server, donde podemos montar un proceso intermedio entre tu sistema y tu procesadora de tarjetas de crédito. Cuando estamos trabajando a nivel empresarial, donde las transacciones se hacen en segundos y es necesario dos caracteristicas que nos ofrece jPOS, el QMUX y el ISORequestListener.

El ISORequestListener, este interfaz sirve para construir nuestros propios Listeners y así poder integrarlos con un multiplexor QMUX, el Listener escuchará todas las peticiones de transacciones entrantes y salientes y las procesara según lo que necesites, en nuestro caso, las mandaremos a un multiplexor y esperara una respuesta, con esto podemos controlar errores o personalizar los mensajes de respuesta según nuestras necesidades.

El QMUX, el multiplexor, como su definición indica, se utiliza como dispositivo que puede recibir varias entradas y transmitirlas por un medio de transmisión compartido. Para ello lo que hace es dividir el medio de transmisión en múltiples canales, para que varios nodos puedan comunicarse al mismo tiempo.

IsoRequestListener

Vamos a explicar la figura, muchas aplicaciones se comunican con el Q2 server, el Q2 ejecuta la lógica del ISORequestListener personalizado y busca el QMUX e el jPOS Space, podemos tener muchos multiplexores, en nuestro caso solo tenemos uno y lo buscamos por el nombre identificador. El Adaptador ISO8583 se encarga de la conexión con la Empresa Procesadora de Tarjetas, esto lo veremos en otro artículo, cuando la primera parte del ciclo se concreta, la Empresa entrega una respuesta al Adaptador, el Adaptador al QMUX y el ISORequestListener espera la respuesta de la petición, el Listener buscará en el jPOS Space tu transacción por un campo clave, generalmente el campo 11 del ISO 8583, y así termina el ciclo.

El ISORequestListener se configura en el Q2Server de una manera muy sencilla.

<server name="xml-server" class="org.jpos.q2.iso.QServer" logger="Q2">
<attr name="port" type="java.lang.Integer">8000</attr>
<channel name="dummyclient.channel" class="org.jpos.iso.channel.BASE24Channel"
packager="org.jpos.iso.packager.GenericPackager" logger="Q2">
<property name="packager-config" value="cfg/packager/base24.xml" />
</channel>
<!-- Solo agregamos esta línea a la configuración de nuestro Q2 Server -->
<request-listener class="mipaquete.MiListenerPersonalizado" logger="Q2">
</server>

El ISORequestListener puede programarse de una manera básica de las siguiente manera

import org.jpos.iso.ISODate;
import org.jpos.iso.ISOException;
import org.jpos.iso.ISOField;
import org.jpos.iso.ISOMsg;
import org.jpos.iso.ISORequestListener;
import org.jpos.iso.ISOSource;
import org.jpos.iso.ISOUtil;
import org.jpos.iso.header.BaseHeader;
import org.jpos.q2.iso.QMUX;
import org.jpos.util.Log;
import org.jpos.util.NameRegistrar;
/**
* http://blog.jotadeveloper.com
*Creado por JotaDeveloper
*/
public class MiListenerPersonalizado extends Log implements ISORequestListener {
 
	@Override
	public boolean process(ISOSource source, ISOMsg m) {
		ISOMsg responseISOMsg = null;
		QMUX mux = null;
		try {
                        //Buscamos en el jPOS Space nuestro multiplextor, siempre se busca con el prefijo mux seguido por un punto
			mux = (QMUX) NameRegistrar.get("mux.mymux");
			mux.setLogger("mux");
                        //Se recupera la respuesta
			responseISOMsg = mux.request(m, 20000);
		} catch (NameRegistrar.NotFoundException ex) {
 
		} catch (ISOException ex) {
 
		}
		//Es importante siempre regresar true.
		return true;
	}
}

Y el multiplexor se configura con XML, pues el QMUX ya viene programador por defecto

<mux class="org.jpos.q2.iso.QMUX" logger="Q2" name="mymux">
<in>sample-receive</in>
<out>sample-send</out>
<!-- Este key, es la llave por la cual identificaras unicamente cada mensaje, es importante
poner el valor indicado, generalmente es el 11 o el 17 -->
<key>55</key>
</mux>

En el próximo artículo, veremos los adaptadores y los diferentes tipos de conexiones que podemos crear con jPOS.