Archivo para la categoría ‘Programacion

Optimiza Codeigniter

11 de abril de 2008

en: Programacion

CodeIgniter es un genial framework, pensado para ofrecer un alto rendimiento, claro está con una óptima configuración.

Como ya hemos comentado en otras ocasiones CodeIgniter cumple perfectamente el fin de cualquier framework, una estructura definida que de soporte a un proyecto web y ayude a que este proyecto sea organizado y desarrollado, veamos los puntos clave a tener en cuenta a la hora de optimizar la configuración de CodeIgniter.

Ver Ejemplo (Benchmark para CodeIgniter)

Modelo Vista Controlador (MVC)

Seguramente hayas oido e incluso utilizado algún MVC (Modelo Vista Controlador), de lo que se trata en este tipo de modelos es de repetirse lo menos posible y hacer una separación entre la lógica de la aplicación y su presentación:

  • El modelo representa la estructura de datos, a menudo con clases que contienen funciones que te ayudan a insertar, eliminar y actualizar la información de la base de datos.
  • La vista es la información que se presenta al usuario, una vista es a menudo una página web en sí misma, pero en CodeIgniter una vista también puede llegar a ser un fragmento de la página web (pie, cabecera, contenido principal, etc…).
  • El controlador sirve de intermediario entre los Modelos y las Vistas, y es el encargado de coordinar la petición y generar la página web.

Teniendo estos tres puntos claros podemos pasar a ver el diagrama de flujo de CodeIgniter.

Diagrama de Flujo de CodeIgniter

Configuración básica de CodeIgniter

Modelo Vista Controlador
  1. El index.php sirve inicializa el nucleo de CodeIgniter.
  2. El enrutador examina la petición HTTP y determina que se debe de hacer.
  3. Si existe la cache devuelve el archivo HTML sin pasar por el sistema , ahorrandos la carga que ello conlleva.
  4. Seguridad, antes de que se cargue el controlador se filtra los datos enviados para que estos sean fiables.
  5. El controlador carga el modelo, librerias, plugins, helpers y todos los recursos necesarios para satisfacer la petición.
  6. Una vez la Vista está renderizada es enviada al navegador si la cache está habilitada se almacena el resultado en cache para la próxima vez que esta URL sea servida.

Configuración avanzada de CodeIgniter con librería Sparks

Sparks es una librería que nos permite solventar dos deficiencias con las que nos podemos encontrar a la hora de afrontar un proyecto basado en CodeIgniter.

1. Mejora la cache que únicamente permite cachear páginas completas.
2. Podremos incluir “vistas” dentro de “vistas”.

Para entender este supuesto tenemos que imaginar que necesitamos que la página tenga un módulo de autentificación, al devolver sólo HTMl sería imposible hacer convivir la cache y el módulo de autentificación, con esta librería solucionamos el problema pero el diagrama de flujo cambia un poco.

Modelo Vista Controlador
  1. El index.php sirve inicializa el nucleo de CodeIgniter.
  2. El enrutador examina la petición HTTP y determina que se debe de hacer.
  3. Seguridad, antes de que se cargue el controlador se filtra los datos enviados para que estos sean fiables.
  4. El controlador comprueba si existe cache, en caso afirmativo la devuelve pero al hacer la comprobación en este punto podemos llegar a pasar datos dinámicos a la vista (podríamos conseguir que funcionará un módulo de autentificación aún con la cache habilitada), si no existe cache carga el modelo, librerias, plugins, helpers y todos los recursos necesarios para satisfacer la petición.
  5. Una vez la Vista está renderizada es enviada al navegador si la cache está habilitada se almacena el resultado en cache para la próxima vez que esta URL sea servida.

Limitar descargas con Php

23 de febrero de 2008

en: Programacion

Probablemente no te encuentres con este problema pero si lo encuentras esta es una buena solución.

A menudo nos encontramos con sitios con un gran número de archivos para descargar, estos sitios limitan el número de descargas permitidas a sus visitantes.

En un principio no suele haber problemas si no limitas las descargas, pero si el visitante utiliza un “gestor de descargas” en los que puedes introducir un número de conexiones por archivo descargado, veras muy limitados los recursos de tu servidor.

Si tienes un control total de tu servidor puedes limitar de manera sencilla el número de descargas permitidas gracias al módulo mod_limitipconn, pero si tu sitio esta en un “hosting compartido” tendrás que tirar de ingenio para ponerle solución.

Yahoo! Developer Network

11 de febrero de 2008

en: Internet|Programacion

Yahoo Developer Network ofrece a los desarrolladores una variedad de características, como acceso a las API, ejemplos de código fuente, grupos de discusión, listas de correo y secciones es las que se pueden previsualizar herramientas creadas por Yahoo.

Esta serie de herramientas pretende dar solución a los problemas de diseño e interfaz que aparecen en cualquier portal web: autocompletado, pestañas de navegación, Drag & Drop, paginación y calificación.

Se pueden encontrar ejemplos en JavaScript y PHP para infinidad de aplicaciones, desde elementos de interface de usuario hasta cómo parsear las respuestas XML de los Yahoo! Web Services. Es una genial reocopilación de recursos de programación para poder construir nuestro propio portal con numerosas de funcionalidad Ajax para implementar.

Estos tests se han realizado en un VIA Nehemiah 999 MHz con 480 Mb RAM, Windows XP Professional SP2 y PHP 5.2.1. Los scripts necesarios para realizar estas pruebas pueden ser descargados.

1. sizeof vs count

En primer lugar veamos las funciones sizeof y count. Ambas pueden ser utilizadas para contar el número de elementos de un array.

sizeof vs count

sizeof: 3.75928902626 microsegundos
count: 3.33035206795 microsegundos
Tiempo ahorrado: 0.428936958313 microsegundos; 12.8796280262%

La función “count” es un 12% más rápida y ambas tardan entre 3 y 4 microsegundos en contar los elementos de un array con 100.000 elementos. No sólo es más rápida en la ejecución sino que incluso es más sencilla de recordar y más corta a la hora de escribirla en código.

2. is_int vs is_integer

Vamos a ver cuál de estas funciones valida mejor.

is_int vs is_integer

is_int: 3.11394786835 microsegundos
is_integer: 3.42630600929 microsegundos
Tiempo ahorrado: 0.312358140945 microsegundos; 9.11646946006%

La diferencia es pequeña un 9% y ambas tardan en torno a los 3 microsegundos en validar una variable, de nuevo vuelve a ser la función de nombre más corto la más eficiente.

Ya han pasado algunas semanas desde que descubrí este genial framework, pensado para ofrecer un alto rendimiento, además es bastante ligero y fácilmente configurable.

CodeIgniter Framework para PHP

Hay muchos frameworks para PHP y este podría pasar por una alternativa mas, pero si la aplicación que desarrollas requiere de una plataforma que no marque mucho la aplicación y que necesite un alto rendimiento creo que CodeIgniter debería ser tu elección.

Cumple perfectamente el fin de cualquier framework.. una estructura definida que de soporte a un proyecto web y ayude a que este proyecto sea organizado y desarrollado.

Tras esta breve descripción os dejo un ejemplo de como podríamos crear nuestro feed RSS con las herramientas que ofrece CodeIgniter

Creando el controlador

En primer lugar tenenmos que crear un controlador con el nombre “feed”, recuerda que un controlador es simplemente un archivo que es llamado cada vez que la URL a la que va asociado es invocada.

<?php
class Feed extends Controller
{

    function Feed()
    {
        parent::Controller();
        $this->load->model('posts_model', '', TRUE);
        $this->load->helper('xml');
    }

    function index()
    {
        $data['encoding'] = 'utf-8';
        $data['feed_name'] = 'TuFuncion.com';
        $data['feed_url'] = 'http://www.tufuncion.com';
        $data['page_description'] = 'Descripción de la página';
        $data['page_language'] = 'es-es';
        $data['creator_email'] = 'Manuel Gutiérrez Heredia';
        $data['posts'] = $this->posts_model->getRecentPosts();
        header("Content-Type: application/rss+xml");
        $this->load->view('feed/rss', $data);
    }
}
?>

El software de reconocicmiento óptico de caracteres es habitualmente conocido como OCR (Optical character recognition) y es capar de extraer / reconocer caracteres o formas dentro de una imagen.

Dentro de este tipo de software tendríamos también los OMR (optical mark recognition) que reconocerían una marca dentro de una imagen por lo que en la vida real podríamos aplicarlo a un corrector automático de exámenes tipo test o también el mecanismo que detecta las casillas marcadas en una quiniela.

PhpOcr

phpOCR es una librería que nos permite reconocer el texto que esta impreso en una imagen, como hemos dicho nos valemos del reconocimiento óptico de caracteres (Optical Character Recognition).

Que nadie se vaya a pensar que podrá hacer un gran número de cosas con esta libreria… ya que es bastante básica, ya que sólo reconoce texto en imágenes de un solo color (preferiblemente blanco sobre negro) y hay que entrenarla previamente para que alcance una precisión relevante pero no por esto deja de ser útil e interesante.

Ejemplo de PhpOcr

Si nos descargamos la clase encontraremos 25 archivos y una carpeta, la gran mayoria de los archivos son imágenes necesarias para los ejemplos (todas monocromo) y la carpeta (“storage”) es donde se van almacenando los conocimientos del programa… por ejemplo nada más descargarnolos reconocerá las letras: z, m, b, w y el símbolo +.

Descarga el ejemplo que se detalla a continuación

El motivo de que contenga más imágenes de ejemplo que el número de letras citado es que hay letras duplicadas en diferentes tamaños para poder apreciar el verdadero aprendizaje del caracter.

example.php -> Ejemplo de como reconocer y almacenar nuevas letras o formas
example1.php -> Ejemplo de detección de formas o letras, devolverá si es o no es conocidad esa letra o forma dependiendo de si tenía previamente memorizada en la carpeta “storage” alguna letra o forma parecida.

Tras descargarnos la clase y ejecutar estos dos ejemplos básicos podemos proceder a “memorizar una nueva forma / letra”.

Example.php

Lo que hacemos en este primer ejemplo es almacenar la información de los caracteres citados anteriormente.

<?php
include_once("config.php");
include_once("OCR.class.php");

$char = new OCR();

$char->Learn("W");
$char->saveResult();
echo 'Almacenar información de "W"<br>';

$char->Learn("z");
$char->saveResult();
echo 'Almacenar información de "z"<br>';

$char->Learn("M");
$char->saveResult();
echo 'Almacenar información de "M"<br>';

$char->Learn("B");
$char->saveResult();
echo 'Almacenar información de "B"<br>';
?>

Si quisiéramos ampliar un poco el ejemplo y reconocer una nueva forma o caracter deberemos añadir unas líneas a este ejemplo para que almacene en la carpeta “storage” la información del nuevo elemento.

Por ejemplo podríamos hacer una forma compuesta por las letras “TF” y llamar a la forma tufunción.

Tendremos que crearnos una imagen monocroma con nuestra forma del tipo que se muestra en la imagen inferior.

$char->LearnFromImage("tf.png","tufuncion");
$char->saveResult();
echo 'Almacenar información de "tufuncion"<br/><img src="tf.png"/>';

La ejecución de este nuevo ejemplo debería quedarnos muy parecida a la siguiente imagen: