lunes, 20 de diciembre de 2010

Yupp Genesis v0.2.5

Estamos contentos de anunciar la liberación de Yupp Framework v0.2.5 (versión Genesis).

Con motivo de esta liberación, se compatibilizaron todas las aplicaciones de Yupp Apps. Las nuevas versiones pueden descargarse aquí: http://code.google.com/p/yupp-apps/

Los cambios hechos desde la liberación anterior pueden verse en la hoja de ruta: http://code.google.com/p/yupp/wiki/Hoja_de_ruta

Notas de la versión: http://code.google.com/p/yupp/wiki/YuppPHPFrameworkv025

Documentación actualizada: http://simplewebportal.net/yupp_framework_php_doc

Descargas: http://code.google.com/p/yupp/downloads/list

Dudas o comentarios: http://groups.google.com/group/yuppframeworkphp


Agradecemos desde ya a toda la comunidad que nos apoya, y a quienes prueban el framework, nos envían consejos y mejoras, y lo usan para sus proyectos.

Para todos, gracias por seguir el desarrollo de este pequeño framework PHP en español, y por apoyarnos. Felices fiestas y un muy feliz año.

martes, 7 de diciembre de 2010

Encuesta sobre la version de PHP que usas

Estoy tratando de implementar algunas características en Yupp que a su vez requieren de características que están disponibles desde PHP 5.3.0.

Siendo que Yupp funciona desde PHP 5.2.3 (e incluso anteriores), estos cambios requerirán el uso de PHP 5.3.0 o superior.

Queda abierta la encuesta para evaluar si vale la pena agregar estas características, en función del costo del cambio de versión de PHP.

¿Qué versión de PHP usas para desarrollar?
¿Qué versión de PHP tienen tus servidores de aplicaciones en producción?


Muchas gracias por la ayuda.

domingo, 5 de diciembre de 2010

Mejorando la performance de Yupp Framework

Hace un par de semanas hice la primer prueba de performance en tiempos de respuesta sobre el framework. Para hacer las pruebas utilicé Apache Bench (http://httpd.apache.org/docs/2.0/programs/ab.html).

Primero lancé una prueba sin ninguna optimización. Para esto utilicé una aplicación simple, sin acceso a la base de datos (lo que llaman un "hello world" básico). De esta prueba obtuve como resultado que el framework soportaba 5.5 pedidos por segundo y en promedio cada pedido se resolvía en 1.8 segundos (esto cuenta envío 
del pedido, procesamiento de Apache, procesamiento del framework y envío de la respuesta).


Luego, puse un objetivo para bajar los tiempos de respuesta y aumentar los pedidos que se pueden hacer por segundo. El objetivo fue llevarlo al doble, o sea: atender 11 pedidos por segundo y que en promedio, el tiempo de respuesta fuera de 0.9 seg.


Luego de algunas optimizaciones en la inclusión de clases en el index.php, se obtuvieron mejores resultados de los esperados: más de 27 pedidos por segundo y una demora promedio de 367 ms por pedido. A continuación dejo el detalle de los resultados.


Creo que con un poco más de optimización podremos llegar a 40 pedidos por segundo y 200 ms de tiempo promedio por pedido. 



C:\wamp\bin\apache\Apache2.2.11\bin>ab -k -n 1000 -c 10 http://localhost/YuppPHPFramework/apli/entrada/index
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/ 

Benchmarking localhost (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests 

Server Software:        Apache/2.2.11
Server Hostname:        localhost
Server Port:            80 

Document Path:          /YuppPHPFramework/apli/entrada/index
Document Length:        33 bytes 

Concurrency Level:      10
Time taken for tests:   181.797 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Keep-Alive requests:    995
Total transferred:      449790 bytes
HTML transferred:       33000 bytes
Requests per second:    5.50 [#/sec] (mean)
Time per request:       1817.969 [ms] (mean) 

Time per request:       181.797 [ms] (mean, across all concurrent
requests)
Transfer rate:          2.42 [Kbytes/sec] received 

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.5      0      16
Processing:  1031 1810 445.8   1672    4844
Waiting:     1031 1810 445.9   1672    4844
Total:       1031 1810 445.8   1672    4844 

Percentage of the requests served within a certain time (ms)
  50%   1672
  66%   1828
  75%   2063
  80%   2344
  90%   2516
  95%   2641
  98%   2719
  99%   2828
 100%   4844 (longest request) 






C:\wamp\bin\apache\Apache2.2.11\bin>ab -k -n 1000 -c 10 http://localhost/YuppPHPFramework/apli/entrada/index
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/ 

Benchmarking localhost (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests 

Server Software:        Apache/2.2.11
Server Hostname:        localhost
Server Port:            80 

Document Path:          /YuppPHPFramework/apli/entrada/index
Document Length:        33 bytes 

Concurrency Level:      10
Time taken for tests:   36.891 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Keep-Alive requests:    997
Total transferred:      449836 bytes
HTML transferred:       33000 bytes
Requests per second:    27.11 [#/sec] (mean) 
Time per request:       368.906 [ms] (mean) 
Time per request:       36.891 [ms] (mean, across all concurrent
requests)
Transfer rate:          11.91 [Kbytes/sec] received 

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.5      0      16
Processing:   266  367  50.1    359     828
Waiting:      266  367  50.1    359     828
Total:        266  367  50.1    359     828 

Percentage of the requests served within a certain time (ms)
  50%    359
  66%    375
  75%    391
  80%    391
  90%    422
  95%    453
  98%    516
  99%    563
 100%    828 (longest request) 



domingo, 21 de noviembre de 2010

Proximas liberaciones del framework

Estimados,

Ya estamos en condiciones de liberar Yupp Framework v0.2.3, pero no haremos liberaciones hasta la v0.2.5, para acumular las mejoras y evitar el elevado costo en tiempo que tiene realizar cada liberación.

Como siempre, el código actualizado estará en nuestro servidor de versiones SVN (con cualquier cliente SVN como Tortoise o Subclipse lo pueden descargar y probar): http://yupp.googlecode.com/svn/YuppPHPFramework/

También puedes ver el código en el SVN por versión: http://yupp.googlecode.com/svn/tags/

Aquí está la hoja de ruta actualizada al día de hoy: http://code.google.com/p/yupp/wiki/Hoja_de_ruta#v0.2.3:
  • Seguiremos la hoja de ruta, actualizando los avances ahí mismo (los tickets resueltos llevan un cartel "HECHO").

Cualquier pregunta o comentario es bienvenido.

Atte.,
Pablo.

martes, 9 de noviembre de 2010

Agrega tus aplicaciones a Yupp Apps

Para quienes quieran mostrar sus desarrollos, aunque sean pequeños, o sean simplemente pruebas del framework, son bienvenidos a enviármelas para su publicación en nuestro sitio de Yupp Apps: http://code.google.com/p/yupp-apps.

La idea es tener todas las aplicaciones desarrolladas con Yupp Framework en un mismo lugar, además que las pruebas que cada uno hizo con el framework, pueden servirle a los demás para comenzar a usarlo. Lo que buscamos son aplicaciones compatibles con la última versión del framework (v0.2.2), o sea que básicamente deben tener un descriptor de la aplicación (ver ejemplos en http://code.google.com/p/yupp-apps/downloads/list).

Esto ayudará a fortalecer la comunidad y mostrar nuestros desarrollos, incluso para ponerse en contacto con otros miembros y poder colaborar en los proyectos en común.

Para enviar tu aplicación, primero ponte en contacto con el grupo respondiendo a este hilo de discusión: http://groups.google.com/group/yuppframeworkphp/browse_thread/thread/c376238ddb1579bb

¡Estamos en contacto!

jueves, 14 de octubre de 2010

Nuevo sitio de Yupp Apps

Estimados,

Como habrán notado en la descarga de la nueva versión de Yupp PHP Framework, no se incluye la aplicación de Blog ni el gestor de películas que se incluía en las versiones anteriores como aplicaciones de ejemplo de cómo usar Yupp.

De esta forma la descarga es más liviana, y además cada uno puede instalar luego las aplicaciones que desee probar.

Para este fin, hemos creado un sitio en Google Code llamado Yupp Apps, en el cual publicaremos todas las versiones de las distintas aplicaciones y las futuras aplicaciones que desarrolle cualquier miembro de la comunidad Yupp.

Aquí pueden ver las aplicaciones que ya están disponibles: http://code.google.com/p/yupp-apps/downloads/list

Para instalar una aplicación, simplemente es descargar el ZIP con una aplicación y descomprimir su contenido en la carpeta "apps" de Yupp (carpeta que existe desde la versión 0.2.2 del framework).

Cualquier pregunta sobre como instalar aplicaciones o cómo subir sus propias aplicaciones Yupp al sitio de Yupp Apps, no duden en preguntar en nuestro grupo de discusión: http://groups.google.com/group/yuppframeworkphp.

miércoles, 13 de octubre de 2010

Liberamos Yupp Portal v03

Estamos muy contentos de anunciar la nueva liberación de Yupp Portal, la aplicación para gestión de portales de Yupp Framework.

La nueva versión incluye nuevas características y la corrección de varios bugs:

Soporte para comentarios en las páginas: http://code.google.com/p/yupp-portal/issues/detail?id=16
Corrección de inclusión de clase en Bootstrap: http://code.google.com/p/yupp-portal/issues/detail?id=24
Corrección de problema al volver del registro de un nuevo usuario: http://code.google.com/p/yupp-portal/issues/detail?id=27
Corrección del paginador en el listado de usuarios pendientes: http://code.google.com/p/yupp-portal/issues/detail?id=21

Esta versión de Yupp Portal funciona desde Yupp PHP Framework v0.2.2.

Descarga ahora: http://code.google.com/p/yupp-portal/downloads/list

También puedes descargar desde el sitio de Yupp Apps: http://code.google.com/p/yupp-apps/downloads/list

martes, 12 de octubre de 2010

Nuevo Yupp PHP Framework 022

Estamos muy contentos de anunciar la liberación de una nueva versión de Yupp PHP Framework.

Esta versión 0.2.2 marca un antes y un después en el desarrollo de aplicaciones con Yupp.

La principal mejora es la del fortalecimiento del concepto de "aplicación web", frente al concepto previo de "componente", en donde las aplicaciones eran desarrolladas como plugins al framework. Ahora lo importante son las aplicaciones web, donde:
  • Cada aplicación web tiene una estructura definida pero flexible.
  • Cada aplicación web puede tener sus propios iconos.
  • Cada aplicación web puede usar sus propias librerías Javascript o usar las del framework.
  • Cada aplicación web puede usar su propia configuración de base de datos o usar la del framework (si, cada aplicación puede tener su propio servidor de bases de datos, separado del resto de las aplicaciones)
  • Cada aplicación web tiene su propio descriptor, que contiene información útil para integrar las aplicaciones al framework y para actualizar automáticamente las versiones de las aplicaciones que se tengan instaladas.
  • Cada aplicación web puede tener su propio conjunto de tests, para facilitar su testeo automático.
  • Una sola instancia del framework puede alojar un número ilimitado de aplicaciones web.

Descarga el framework ahora: http://code.google.com/p/yupp/downloads/list


En breve crearemos un conjunto de videos para explicar mejor los temas relacionados con la instalación y configuración del framework, y también el desarrollo de distintas aplicaciones web y cómo obtener mejores resultados utilizando Yupp PHP Framework.

También estaremos actualizando la documentación: http://www.simplewebportal.net/yupp_framework_php_doc/

domingo, 25 de julio de 2010

Nueva liberacion de Yupp PHP Framework

Estamos muy contentos de anunciar la nueva liberación del framework, Yupp PHP Frameowrk v0.2.1.

Cambios con respecto a la versión anterior:

  • Se creó el generador de aplicaciones.
  • Se corrigieron los mensajes de errores de validación para que sean internacionalizables.
  • Se creó la primer versión de Yupp Desktop, desde donde ser permite el acceso a las aplicaciones, la generación de tablas y la creación de nuevas aplicaciones de forma simple.
  • Nuevo paquete de testing para crear y ejecutar casos de prueba de forma automática.
  • Correcciones al paquete http.
  • Se agregan descriptores de aplicación para simplificar la gestión de las aplicaciones Yupp.

Le cambiamos la cara al framework, nuevo Yupp Desktop v0.1.0


Esta es la primer versión de Yupp Desktop, una interfaz simple desde donde acceder a las aplicaciones instaladas en el framework, poder generar tablas para las aplicaciones, poder generar nuevas aplicaciones, ejecutar pruebas y más. Así comenzamos a mejorar la interfaz con el usuario y a simplificar la interacción con el framework, además de dar un aspecto más amigable.


Notas de la versión:

Documentación de referencia (en actualización)

Descarga:

Colabora con el framework:

sábado, 3 de julio de 2010

Resolviendo llamados AJAX entre dominios distintos

Esta semana tuve la necesidad de consumir servicios JSON a través de AJAX, el problema es que esos servicios estaban en otro host. Buscando en internet, llegué a que el tema de realizar llamadas a AJAX entre distintos dominios no funcionaba directamente, ya que era una gran brecha de seguridad permitir hacer esto en HTTP. Luego de un rato de darme la cabeza contra el teclado, decidí hacerlo de esta forma.

Digamos que tengo una vista (una página) desde la que necesito consumir el servicio JSON invocando una determinada URL por AJAX, con Prototype esto sería algo así (esta invocación falla por hacerse a un dominio distinto al local):

Event.observe(window, 'load', function() {

   new Ajax.Request('http://www.otrohost.com/servicio', {
      method: 'get',
      onLoading: function(res) {
         ....
      },
      onSuccess: function(res) {
         var json = res.responseJSON; // resultado del servicio JSON
         ....
      }
   });
});

Sustituyendo la url destino del llamado AJAX por una url local, quien atiende la llamada es la acción de un controlador de Yupp, entonces se puede hacer que esa acción sea la que haga el llamado al servicio JSON en http://www.otrohost.com/servicio y devuelva a la vista el resultado.

El controlador tendrá este aspecto (archivo: /components/xxx/controllers/components.xxx.controllers.ServicioController.class.php):

YuppLoader::load('core.http', 'HTTPRequest');

class ServicioController extends YuppController {

   public function getJSONAction()
   {
      $req = new HTTPRequest();
      $req->setTimeOut( 5 );
      $res = $req->HTTPRequestGet('http://www.otrohost.com/servicio');

      // La respuesta
      $json = $res->getBody();
      
      // Devuelve la respuesta a la vista
      header('Content-Type: application/json');
      return $this->renderString( $json );
   }
}


Así logramos pedirle a un controlador local que haga un pedido HTTP al servicio JSON remoto y que devuelva el objeto JSON a la vista local desde la que partió el pedido AJAX original. El javascript en la vista con la invocación al controlador local quedaría así:

Event.observe(window, 'load', function() {

   new Ajax.Request('<?php echo h('url', array('component'=>'xxx', 'controller'=>'servicio', 'action'=>'getJSON'); ?>', {
      method: 'get',
      onLoading: function(res) {
         ....
      },
      onSuccess: function(res) {
         var json = res.responseJSON; // resultado del servicio JSON local
         ....
      }
   });
});

Así con pocas líneas de código podemos resolver un problema que tenemos frecuentemente, sobre todo cuando necesitamos consumir APIs externas con servicios JSON o XML.

viernes, 18 de junio de 2010

Liberamos Yupp PHP Framework v0.2.0

Ha pasado algún tiempo desde la última liberación, por eso estamos muy contentos de anunciar la nueva versión de Yupp PHP Framework v0.2.0.


Esta nueva versión es más estable ya que se corrigieron varios problemas encontrados en la versión anterior, y cuenta con varios ejemplos de componentes y uso de helpers para hacer más fácil el aprendizaje.

Las notas de la versión con descripción de la instalación del framework:
    Descargas:
    Documentación:
    La lista detallada de los cambios y las correcciones se encuentra aquí:
    Colabora con el desarrollo del framework:

    En breve haremos algunos videos para explicar el funcionamiento del framework y mostrar cómo crea aplicaciones web desde cero. También mejoraremos la documentación, agregando más ejemplos.

    domingo, 11 de abril de 2010

    Liberamos nueva version de Yupp PHP Framework

    Estamos muy contentos de anunciar la nueva liberación del Yupp PHP Framework v0.1.9.

    Para esta nueva versión se incorporación correcciones a varios bugs encontrados desde la versión anterior,  además tendrá un nuevo paquete HTTP que servirá para enviar pedidos HTTP a otros sistemas y procesar su respuesta (gracias a Magdalena que implementó este paquete). También incluirá un mecanismo de conversión
    automática de instancias del modelo a XML, incluso de estructuras de datos complejas.

    Esta nueva versión es muy estable y tiene muchas funcionalidades y cuenta con nuevos ejemplos de uso para hacer más fácil la adopción por parte de los programadores, mejorando su curva de aprendizaje.

    Las notas de la versión con descripción de la instalación del framework:
      Descargas:
      Documentación:
      La lista detallada de los cambios y las correcciones se encuentra aquí:
      Colabora con el desarrollo del framework:

      martes, 16 de febrero de 2010

      Liberamos Yupp Portal v0.2

      ¡Yupp Portal v0.2 liberado!
      Yupp Portal es el componente para crear portales de Yupp PHP Framework.

      Descargas:
      http://code.google.com/p/yupp-portal/

      Hoja de ruta del proyecto:
      http://groups.google.com/group/yuppframeworkphp/web/yupp-portal---hoja-de-ruta


      ¿Para qué sirve Yupp Portal?

      Es una herramienta de alta productividad que permite crear un portal web completo en pocos minutos, sin necesidad de programación extra, solamente es necesario configurar la conexión con la base de datos.

      Este componente permite:


      Administrar páginas:


      1. Crear páginas con un clic
      2. Editar contenido con editor visual desde la web
      3. Estados de páginas: Normal, Borrador, Deshabilitada, Oculta
      4. Edición visual de items del menú principal
      5. Edición visual de contenido fijo (por ejemplo banners que se muestran en todas las páginas)

      Administración de usuarios:


      1. Administración de roles
      2. Crear/Editar/Eliminar/Aprobar usuarios
      3. Registro de usuarios y aprobación con email en un clic
      4. Login/Logout

      Tres roles disponibles:


      1. Administrador: crea/edita páginas, modifica el menú, crea/edita usuarios
      2. Editor: crea/edita páginas, modifica el menú
      3. Usuario: ve páginas ocultas

      martes, 9 de febrero de 2010

      Nueva liberación de Yupp PHP Framework

      Estamos muy contentos de anunciar la nueva liberación del framework, Yupp PHP Frameowrk v0.1.8.

      Esta liberación es la primera que incluye un juego de tests para detectar problemas en el YORM, el modulo de ORM de Yupp Framework.

      Para esta liberación hemos corregido los siguientes tickets:
      También hemos corregido y mejorado la documentación de referencia:
       Para descargar la nueva versión, accede a nuestro sitio en google code:
      Nos interesa que nos cuentes si has probado el framework, qué cosas buenas le encontraste y qué cosas le mejorarías, tu opinión cuenta!

      Si quieres colaborar con el framework y no sabes como, accede a la guía de colaboración:
      Las notas de la versión están en nuestra wiki:

      ¡Esperamos tus comentarios!
      -
      -

      martes, 19 de enero de 2010

      Testing del ORM

      En la línea de acción que estamos siguiendo para estabilizar el framework, estamos implementando un set de pruebas para YORM, el componente de ORM de Yupp Framework. Los tests se centran en la generación de las tablas en la base de datos, guardar correctamente estructuras complejas de datos, obtener estructuras complejas de datos desde la base, y verificar restricciones sobre los datos que se intentan guardar en la base.

      Con esto lograremos encontrar las debilidades del YORM, al mismo tiempo que demostramos las fortalezas que tiene actualmente.

      Los juegos de tests pueden ser descargados del SVN en nuestro sitio en Google Codehttp://code.google.com/p/yupp/source/checkout

      De esta forma nos acercamos a una versión estable de Yupp Framework, garantizando su poder para crear proyectos web de forma ágil y sencilla, ordenando el desarrollo y evitando las tareas repetitivas.


      Actualización:
      Uno de los tests que estoy desarrollando es el de probar estructuras de árboles en la base de datos. La prueba consiste en implementar una clase persistente en YORM, la cual es una página web, que a su vez puede tener subpáginas. Aquí está la implementación de la clase:

      class Pagina extends PersistentObject
      {
         function __construct($args = array (), $isSimpleInstance = false)
         {
            $this->setWithTable("test_a004_pagina");
      
            $this->addAttribute("titulo",  Datatypes :: TEXT);
            $this->addAttribute("contenido", Datatypes :: TEXT);
      
            // Pagina padre
            $this->addHasOne('owner', 'Pagina');
      
            // Paginas hijas
            $this->addHasMany('subpages', 'Pagina');
      
            $this->addConstraints(
               "titulo",
               array (
                  Constraint :: maxLength(255)
               )
            );
            $this->addConstraints(
               "contenido",
               array (
                  Constraint :: maxLength(100000)
               )
            );
            $this->addConstraints(
               "owner",
               array (
                  Constraint :: nullable(true) // Las paginas del primer nivel no tienen padre.
               )
            );
      
            parent :: __construct($args, $isSimpleInstance);
         }
      
         // Mas codigo ...
      }
      

      Y ahora la prueba de cómo generar una estructura de árbol y guardarla en la base. Lo que vamos a hacer son 4 instancias de la clase Pagina, la primera es la página raíz, la segunda es hija de la página raíz y las dos restantes son a su vez hijas de esta última. Con el siguiente código no solo creamos la estructura de árbol de páginas, si no que vamos a ver que toda la estructura se guarda automáticamente en la base con una única línea de código por parte del programador!!!

      $p1 = new Pagina(
              array(
                "titulo" => "Pagina raiz",
                "contenido" => "This step is usually done transparently as most compilers perform it and then invoke the assembler..."
              )
            );
            $p11 = new Pagina(
              array(
                "titulo" => "Subpagina de raiz 1",
                "contenido" => "This step is usually done transparently as most compilers perform it and then invoke the assembler...",
                "owner" => $p1
              )
            );
            $p111 = new Pagina(
              array(
                "titulo" => "Sub subpagina de raiz 1",
                "contenido" => "This step is usually done transparently as most compilers perform it and then invoke the assembler...",
                "owner" => $p11
              )
            );
            $p112 = new Pagina(
              array(
                "titulo" => "Sub subpagina de raiz 2",
                "contenido" => "This step is usually done transparently as most compilers perform it and then invoke the assembler...",
                "owner" => $p11
              )
            );
            
            
            // subpaginas de p11
            $p11->addToSubpages($p111);
            $p11->addToSubpages($p112);
            
            // subpaginas de p1
            $p1->addToSubpages($p11);
            
            // Guarda toda la estructura con esta única línea de código!
            if (!$p1->save())
            {
               Logger::struct( $p1->getErrors(), "Falla test A004.2 1" );
            }
            else
            {
               echo "Guarda Ok";
            }