Aplicaciones web escalables con potencialidades sin límites

Escabilidad: Sistema de aplicaciones Atómico

Cuando empecé a programar en PHP allá por el año 2005 ya pensaba que no quería mezclar código HTML con PHP, es por esto mismo que los creadores del lenguaje PHP creyeron que era mejor si se utilizaban objetos, capas, separación, jerarquías, etc. , es decir, su deseo era crear algo más parecido a C y C++, igual que yo con PHP y este framework. En definitiva, estos lenguajes comparten características, en concreto dos muy importantes: escabilidad y potencialidad. Continue reading

Consultas avanzadas y plantillas simples

Cuando tenemos un sistema de aplicaciones web multidominio, las tareas como comprobar si un fichero existe cuando está en otro dominio virtual se pueden complicar.

Con el framework zenphp es fácil evitar el problema enfocándolo de una manera práctica y sencilla, he aprendido muchísimo desde que empecé con él en el año 2005, este truco os lo regalo, como todo lo que he hecho en mi trabajo 🙂

Veamos la solución al problema con un ejemplo sencillo: tengo que poner una imagen de miniatura en una parte de la web en cada dominio, pero el usuario es posible que no haya subido ninguna imagen de miniatura y si no lo ha hecho debemos crear un “thumbnail” famoso, pero,..y aquí viene la cuestión del millón de dólares…¿cómo podremos hacer la comprobación de existencia de un fichero si los almacenamos en el servidor principal que es virtual y no queremos crear ningún servicio web porque no queremos perder tiempo?

Lo primero que tenemos que hacer es crear una plantilla HTML con una etiqueta genérica del sistema de plantillas de zenphp (basado en una simple substitución de etiquetas entre #almohadillas# desde un array) de forma que el atributo src será de la forma:

<img src=”http://www.Mi_Dominio.es/#foto1#” width=”290″ height=”135″/>

bien, podéis fijaros que el dominio utilizado es donde reside nuestro almacén de imágenes, y que se restringe a un ancho y alto para mayor seguridad.

El siguiente paso es evidente, vamos a ir al visualizador (concepto mezcla de controlador/vista del patrón mvc), en este caso el de productos, la función que muestra el listado de productos, donde encontraremos en su lista de campos una modificación de foto1 por

if(miniatura<>”,miniatura,id) as foto1

así, le decimos a mysql: si ves que hay miniatura, quiero la miniatura, en otro caso el id de producto, pero lo llamamos en cualquier caso foto1 a este campo, tal como decía en la plantilla HTML.

Ahora, sabremos si el usuario ha usado una miniatura con una simple condición

[php]

if (is_numeric($dato[‘foto1’]))
$dato[‘foto1’] = “img/{$dato[‘foto1’]}/290/135/”; //redimensionada con la original
else
$dato[‘foto1’] = “fotos/thumbs/{$dato[‘foto1’]}”; //miniatura del usuario

[/php]

Lo cual viene a ser, que si es un ID, no hay miniatura y utilizaremos un script básico de creación de thumbnail (con redirección al nuevo fichero creado al terminar la operación de generación) y en otro  caso, muestra la miniatura.

Observar que en la generación de thumbnail con PHP se utiliza como parámetros el ID del producto para extraer la primera imagen y el tamaño, es decir, alto y ancho (290×135).

aquí está la función para crear el thumbnail:

[php]

/**

* Construye una imagen a partir del id de un producto
*  * @param array $datos  */

function img($datos=null){
$foto = $this->padre->bd->seleccion_unica(“foto1 from productos where id=”.intval($datos[0]));
if (!$foto) die(“No existe la imagen”);
//existe el thumbnail?
$w  = isset($datos[1])&&$datos[1]<600&&$datos[1]>20?abs(intval($datos[1])):101;
$h  = isset($datos[2])&&$datos[2]<600&&$datos[2]>20?abs(intval($datos[2])):100;
if (!file_exists(ZF_DIR_PPAL.”fotos/thumbs/$w$foto”)){

//crear el thumbnail

require_once(ZF_DIR_LIBRERIAS.”clase_zen_Imagen.php”);

$zi =& new zen_Imagen(ZF_DIR_PPAL.”fotos/$foto”,ZF_DIR_PPAL.”fotos/thumbs/$w$foto”);

$zi->redimensionar($w,$h);

}

//Redirigir a la imagen thumbnail

header(“Location: /fotos/thumbs/$w$foto”);

}

[/php]

Espero que os sirva y os lo paséis tan bien como en mi caso programando 😉

Más Extras para completar zenphp:VCard y DHTML Calendar

Como he visto que faltaban algunas cuestiones extras, las he añadido:

Una captura:

Espero que os sirvan, como siempre 🙂

Extendiendo los procesos de automatización

Para automatizar los procesos de una aplicación web lo mejor es usar un esqueleto y escribir código a partir de él. Aunque muchas veces el problema es como se dice en todos sitios, la curva de aprendizaje de un método.
Con cualquiera de las formas de pensar a la hora de hablar de programación encontramos similitudes porque los humanos pensamos de la misma manera XD ¿Qué quiero decir con esto? Pues ,pasa lo mismo que con las ideas que se tienen implementando capas de redes, cuando a alguien se le ocurre una idea para proteger,enviar o recibir, encriptar,…lo que sea!, seguramente se le ha ocurrido a otra persona antes, y si no se le ha ocurrido se le ocurrirá pronto 🙂 y me explico, a mi se me ocurren ideas que me parecen muy buenas y dada mi experiencia con programación orientada a objetos para programar páginas web considero que debo compartir lo que he aprendido y he de mezclarlo con los conocimientos ya adquiridos y puestos en la red con libertad de uso…lo que a mi se me ha ocurrido se le puede haber ocurrido a cualquiera otra persona en cualquier otro momento, sin embargo lo voy a publicar, para que cualquier otra persona no tenga que implementar lo que en mi caso, con más experiencia, me cuesta menos expresar en líneas de código. El resultado es un conjunto de clases llamadas librerías que están muy organizadas y disponen de un sistema de comunicación entre sí que permite seguir las normas de la programación estructurada fácilmente gracias a la documentación asociada a estas librerías asi como seguir los ejemplos propuestos.
La fases de los procesos de automatización de un Sistema Gestor de Contenidos fueron expuestas en anteriores artículos de este mismo blog. Lo que ahora es más interesante es preguntarse de qué forma se puede implementar un SGC para que no se convierta en la desconfianza de Joomla en cuanto a sus módulos y la desorganización entre versión tras versión que hace chocar implementaciones entre si e imposible reutilizar código por joven que éste parezca…y la respuesta es el generador de código, que mantiene la sincronización actualizada de los procesos de automatización, en otras palabras, se encarga, una vez actualizado, de compilar los paquetes de módulos contenidos en uno/s cartucho/s para generar una salida adaptada a la versión más reciente, a partir de ahi el código final puede surgir cambios pero sólo si no se está usando en modo de programación orientada a aspectos, esto permite realizar cambios directamente en el cartucho y obtener la versión actualizada del framework en ese momento.

Las primeras pruebas las estoy utilizando para proyectos simples y en los que me baso para ir mejorando poco a poco.

Asi es como se puede extender un proceso de automatización sin riesgos.

Ahora estoy aprendiendo un poco de ASP, y creo que me va a resultar difícil encontrar un SGC de código libre en condiciones…:P

Generar el esqueleto de una aplicación web en 15 segundos

Hagamos un repaso de los vídeos de la sección de documentos.

Toma 1:Validaciones

Después de ver los vídeos de las validaciones

Toma 2: modelo de datos

De como se construye un modelo de datos con su visualizador usando el MVC modificado

Toma 3: Visualizador avanzado:

Avanzamos con el visualizador:[ver]

Toma 4: El scaffolding

y le añadimos un andamio (scaffolding):[ver]

Todo en uno: el generador

Podemos ver como el generador de aplicaciones lo hace todo en 15 segundos (o menos :))[en acción] realiza nuestro trabajo más rápido que nosotros y nos permite concentrarnos en la parte importante del problema, lo que tenemos que presentar, finalmente.

Ir al vídeo

Operaciones automáticas del generador de aplicaciones

Para construir una aplicación el generador toma una serie de modelos de ficheros necesarios como base para completar la estructura del sistema.

La estructura del generador se puede ver en el siguiente diagrama:
Diagrama de clases del generador de aplicaciones PHP-GTK2 para zenphp
La macro zen_generador_gtk.php lanza la ventana principal (GtkWindow,PHP-GTK2:GtkWindow) que usa la clase zen_fabrica_gtk para “fabricar” todos los componentes de la ventana principal, asociándole los eventos que se agrupan en la clase zen_eventos_ventana_principal, de forma que tenemos siempre un puntero en todas las clases a ésta ventana principal que sirve para localizar cualquier componente,clase o método que necesitemos desde cualquier lugar, asi, se construyen los modelos de las estructuras de datos como las de los árboles con una clase info_configuracion_arbol asociada a la “fábrica”, que sólo inciarse, en su constructor lee las definiciones del fichero de configuración XML del generador, y genera los menús en el GtkMenuBar llamado zen_menu_gtk existiendo la posibilidad de definir nuestros propios menus de usuario, los eventos se asocian directamente y son “atrapados” por medio de la función “public function evento_menu($nombre) ;” de la clase zen_eventos_ventana_principal, sólo hemos de añadir nuestro “caso” al resto para que se ejecuten las órdenes que necesitemos…

Queda mencionar la última conexión con la fábrica, que estoy desarrollando, el generador GTK se conecta con el generador POA para compilar y aplicar los “aspectos” en los que se basa, esto es, nuestros modelos y ayudantes definidos en el cartucho, los visualizadores asociados, las bases de datos configuradas en la aplicación,etc. Esto se hace con el zen_generador_poa, asociado a la fábrica Gtk de forma que carga el motor de zenphp y conecta las 3 partes del proyecto a través del paradigma orientado a aspectos. Tras compilar, generar y construir todo el sistema de aplicaciones, se muestra el mensaje de confirmación. Ya se puede copiar el directorio de salida al directorio web y si todo estaba bien definido, probar la aplicación…

Quizás algo interesante es zen_ventana_mysql_admin , un administrador de bases de datos MySQL, podemos definir en el XML de nuestro cartucho el acceso a varios servidores y mediante la aplicación al hacer doble click sobre dicha línea de configuración conectarremos al servidor especificado para realizar las tareas que consideremos oportunas fácilmente.

Pruebas con caché y anti-spam para la forja

Hace tiempo que me procuré de encontrar un método eficaz y simple para evitar spam en los foros de la forja pero nunca lo encontré, asi que ideé uno, por si teneis problemas con el spam en vuestros foros aquí teneis el código, son sólo dos ficheros, vuestro servidor necesita tener CURL instalado.

  1. Generador de enlaces de spam en los foros de tu proyecto de la Forja
  2. Iframe que incrusta los formularios para borrar los mensajes de spam

Para que funcione, sólo debéis colocarlo en vuestro servidor, y llamar a miservidor.es/borra_spam.php.
Para configurarlo:

  • $id_proyecto es vuestro número de proyecto, aparece cuando pincháis en los foros de vuestro proyecto ( ?group_id=#___# ) donde #___# es vuestro ID de proyecto
  • $id_foros es un array con todos los identificadores de los foros que tengais: (?forum_id=#___#) donde #___# es vuestro id de foro
  • $palabra es la/s palabra/s que hay en los mensaje de spam…y ¡cuidado! debe ser una sentencia única, porque es peligroso y podeis borrar mensajes que no queríais borrar sin poder recuperarlos…podeis probar qué encuentra con el buscador en el que se basa este generador de anti-spam con el genial buscador avanzado que trae la Forja en:
    https://forja.rediris.es/search/advanced_search.php?group_id=#___#
    donde #___# es vuestro id de proyecto.

El generador de enlaces de spam recorrerá los foros especificados abriendo una conexión con el buscador avanzado, es por eso que debeis tener una sesión abierta como administrador para que aparezcan los formularios de edición y se pueda establecer la conexión correctamente al hacer el envío pinchando en cada uno de los botones “Borrar” de cada iframe, que aparecerán por cada acierto de la/s palabra/s encontradas en los foros del proyecto, en mi caso , el atacante spam me envia cada dia una ristra de posts donde aparece la palabra drug, cosa que no suelo utilizar XD en mis foros, por eso puedo encontrarlo y borrarlo rápidamente.

Aquí una captura:

Cambiando de tema, en este foro hay nuevas pruebas con Akismet para vuestras aplicaciones así como de un ejemplo de caché.

Pasaré a explicar un poco mejor como funciona esto de la caché: esto es lo que hace que vuestras aplicaciones suban muchos puntos en cuanto a rendimiento,tal como hace Drupal, de forma que se guardan en la caché contenidos que no vayan a cambiar mucho,estableciéndose el tiempo límite y asi, cargar el contenido generado (sólo una vez) desde un fichero en lugar de procesarlo todo muchas veces, es un truco que también usa WordPress, sin embargo se puede utilizar para cualquier parte de la aplicación, por ejemplo si lleváis un número de comentarios en un artículo mayor de 50, es tonteria leerlos todos y aplicarles las plantillas, en lugar de eso, se genera hasta un número límite de 50, se guarda una vez y se establece una caché para esos primeros cincuenta.

En cuanto al progreso, se ha avanzado mucho con el gestor de contenidos, el generador está a punto para insertar dicho generador como un administrador con una aplicación zen_aplicacion_administrador…

Salu2!

Invitacion a encuesta para seleccionar el nuevo logotipo

Mientras termino con la implementación del diseño de clases GTK del generador de aplicaciones GTK, concretamente la clase que vincula el Paradigma de la Programación Orientada a Aspectos [diagrama] con el lector de cartuchos, además de las pruebas y el código de los ejemplos más el documento de memoria (ahí es ná) he hecho una encuesta con unos logotipos que me ha creado mi amigo Pablox, un genio!! 🙂

Éstas son las opciones para la encuesta

Logotipo 1

Logotipo 2:

Logotipo 3:

Logotipo 4:

Logotipo 5:

Creative Commons

Para participar pinchar aquí.

Gracias.

Resultados de la encuesta sobre el generador de código fuente

Bueno, aquí están los resultados de la encuesta sobre el generador de código fuente.

La gráfica que sale es algo parecido a esto:

Aclaro las leyendas:

  • Verde claro: Aplicación con administración
  • Morado: Sólo esqueleto de aplicación
  • Naranja claro: Configurar campos en los modelos con XML
  • Rojo: Interfaz para configurar
  • Azul oscuro (arriba): Usarlo sólo para empezar como base entre PHP y el SDK
  • Verde olivo: Usar clases propias con ayuda
  • Naranja oscuro: Usarlo como CMS (Gestor de contenidos)
  • Azul claro (abajo): Generador con interfaz web

Está claro que el generador necesita que se ponga todo su empeño en generar clases simples que le sirvan al programador para empezar con el framework, añadiendo comentarios y documentación con enlaces a los manuales y ejemplos para que “pique” su propio código con total libertad.

Hay un nuevo vídeo del generador, estoy formateándolo para que no ocupe tanto….