miércoles, 16 de julio de 2008

Nuevo Dominio

http://blog.pablo-morales.com

Cambios

Es una realidad que el desarrollo web no es solo un lenguaje, y no solo una tecnologia. Nosotros trabajamos en diferentes plataformas (Win, Linux, Max), desarrollamos en varios lenguajes (php, .net, jsp, js, flex, ruby, etc). Cada lenguaje, y herramienta nos permiten crear ciertas caracteristicas que podemos usar para cierto proyecto. Por eso decir que yo solo programo en PHP no solamente nos limitamos en el mercado laboral, sino en la potencia de nuestros desarrollos. Hoy en dia estan sonando tecnologias muy fuerte a nivel web como Flex, Air, RoR, y no son herramientas que un desarrollador web tenga que despreciar. Pensar en un sistema que integre varios lenguajes no es una locura, de hecho no lo hacemos acaso?

Cuando creamos una web, minimamente usamos PHP, JS, Html, y Css. Porque no agregar Flex, o RoR.

Un ejemplo seria hacer el front end de una web con PHP5 y el backend con Flex, o RoR. No es una locura, y me parece que el resultado final puede darnos muchos reditos.

Por esto decidi cambiar la idea de Zend Hispano, por Desarrollador Web. Porque no tenemos que ser fundamentalistas de un solo lenguaje, y de absolutamente de nada, porque un viejo loco siempre decia, que todo es relativo.

Entre los cambios que van a ver en el blog contamos.

Cambio de dominio. Ahora sera http://blog.pablo-morales.com
Cambio de imagen y de herramientas. Vamos a usar wordpress, y espero que les guste este divertido themes.
Cambio de visor de PDF, ahora voy a usar Scrib que genera PDF mucho mas grandes, y claros.
Cambio de contenidos. Ahora vamos a estar mas orientado a lo web, y no solo a PHP5 y Zend.

Espero que disfruten estos cambios, y son libre de dejar cualquier opinion al respecto

domingo, 13 de julio de 2008

Desarrollando en adobe Air

¿Que es adobe air?
Este tiempo se escucho mucho hablar de AIR (Adobe Integrated Runtime). No es mas que una forma de llevar nuestras aplicaciones RIA al escritorio del usuario sin la necesidad de un navegador web, utilizando herramientas como html, javascripts o flash.

Si quieren saber mas pueden leer en la wiki

¿Que necesito para desarrollar en AIR?

Los requisitos minimos son.
Adobe air runtime
Adobe air SDK
y un IDE

Instalacion.

Despues de bajar el SDK e instalar el Runtime de Air, seguimos con la configuracion basica.

El SDK tiene 3 carpetas fundamentales lib, bin, y runtime.
Estas 3 carpetas estan incluidas dentro del sdk.

Lo proximo que necesitamos hacer es agregar al path del sistema la ruta donde tengamos la carpeta bin para poder ejecutar desde cualquier lugar del sistema las aplicaciones air.


Nuestra primer aplicacion

Ahora vamos a crear el primer hello world.

Una aplicacion de Air consta de dos archivos basicos. Un html o swf que va a ser el que tenga todo el contenido, y un xml que va a contener toda la informacion que necesita adobe air para ejecutarse.

Vamos a crear una carpeta en cualquier parte del sistema donde nosotros queramos desarrollar nuestras aplicaciones adobe air.

y vamos a crear dos archivos.

AIRHelloWorld.xml
AIRHelloWorld.html

El primero como dijimos antes contiene toda la informacion que necesita air para procesar el archivo, y el segundo contiene la informacion a mostrar.


AIRHelloWorld.xml













Creo que el significado de las etiquetas se entiende pero voy a explicar algunas.

ID: este es el identificador unico para nuestras aplicaciones adobe air.
FILENAME: El nombre que recibe el archivo cuando la aplicacion ha sido creada
NAME: El nombre que le vamos a asignar a nuestra aplicacion
DESCRIPTION: Una descripcion de nuestra aplicacion
VERSION: Version de la aplicacion

INITIALWINDOWS: aca se encuentran los tags necesarios para que adobe air ejecute la aplicacion.

Pueden ir probando las diferentes opciones a configurar de estos tags, el mas importante es el content que debe tener si o si, el nombre del archivo que tiene el contenido de la aplicacion.

Y por ultimo vamos a ver el codigo de nuestro archvio .html













Aca no tenemos muchas mas novedades que la funcion init que se ejecuta al cargarse la pagina.
Esta funcion es un codigo especifico para que pueda ser interpretado por el runtime de air.

Despues de crear estos dos archivos vamos a ejecutar nuestra aplicacion de esta manera.

Desde la linea de comandos, ejecutamos el siguiente codigo.

adl AIRHelloWorld.xml


Y nos tiene que mostrar la siguiente ventana.




















Facil, no?




La fuente de este documento esta a continuacion en ingles.



viernes, 4 de julio de 2008

El modelo de Drupal

El otro día estaba leyendo un post en un blog de un personaje conocido en el mundo de PHP, criticando a un framework, y me llamo la atención los puntos que marco como deficientes.

Que seria lo correcto o incorrecto ?

La realidad indica que lo funcional es lo correcto, pero es tan asi?

Nosotros sabemos que al mundo lo rigen ciertas reglas, de cosas que deberían ser, y realmente en PHP se hace lo que se quiere sin respetar estas reglas, y es muy difícil destacarse en este ambiente, tan mal visto por verdaderos gurus de la programacion. Al manejar muchos pseudo lenguajes (js, html, css, xml, json, etc), se complica un poco la organizacion, y si además a eso le agregamos que PHP es un hibrido que permite estructurado y POO. Y que hasta estos días no se conoce un estándar de código, mas allá de lo que tenemos en la documentacion de Zend, y que no somos muchos los que lo implementamos. Esto se traduce ha mucho código programado y pensado en muchas variedades diferentes.

Hace unos días empecé a trabajar con Drupal, para el frontend de un portal, y su código podría ser catalogado como incorrecto, pero la funcionalidad y la potencia de este CMS, lo hacen único. Su flexibilidad, su extensionalidad, y lo fácil que resulta lo hacen un gran CMS, sino el mejor. Pero la mayoría de su código son funciones, ni siquiera PHP4 solo funciones, bien estructurado, muchas de esas funciones nos devuelven HTML puro, así es HTML en una función, y generamos las distintas partes de un themes a través de esto.

Y para seguir hablando de lo poco correcto del código, tengo que decirles otra cosa mas (lo que va a leer ahora puede ser nocivo para la salud), usa variables globales!.

Sin embargo Drupal es el CMS mas popular, eficiente, fácil, y extensible del mercado.

Así y todo yo apoyo 100% el uso POO en PHP, creo que PHP5 es uno de los grandes avances que tuvimos, y es la forma en que la gente de Zend nos dice, "Estamos evolucionando, sigan con nosotros", no solo PHP5, sino los magníficos Frameworks que tenemos hoy en el mercado como symfony y Zend Framework, entre otros, que día a día siguen extendiendo funcionalidades, de la mejor forma posible usando POO.

Posibles soluciones: que en las próximas versiones la gente de Zend, elimine la programacion estructurada de su código, y obliga al mejor ejemplo java a usar solo POO, pero esto tiene mas de una contra, va a perder popularidad, el costo de aprendizaje va a ser mayor. Pero vamos a ser mas respetados como programador, los que sigamos con PHP, vamos a tener un camino definido bajo estándares de código, y siguiendo una linea. Sin embargo no creo que sea lo mejor.

En definitiva, creo que lo mejor es que tomemos el tren que mejor nos quede.

Ustedes que piensan?

Enlaces:
Drupal
Zend Framework
Symfony
Estandar de código

martes, 1 de julio de 2008

Paradigmas de Programación: Orientación a Objetos

Orientación a Objetos v1.0

Como vimos antes, los paradigmas son lineas de pensamiento que nos dan herramientas y abstracciones / formas de asbtraccion para poder plantear / estudiar / resolver un problema de cierto tipo en cierto entorno.
De los paradigmas imperativos, el paradigma de objetos es un de los mas conocidos: el mas hablado y el menos usado. Esto se debe, a mi juicio, a la falta de conocimiento del paradigma de objetos: es muy facil programar en java, lo complicado es programar pensando en objetos.

En el caso de la orientación a objetos (OO en adelante), el paradigma nos ofrece dos elementos sobre los que se basan todos los cimientos: Objetos y mensajes.

La nocion de programa en OO es un ambiente en el que conviven objetos, con responsabilidades conocidas y definidas que representan entes de la realidad y se relacionan y comunican entre ellos a travez de mensajes para lograr la solución a traves del trabajo cooperativo.

Asi entonces se puede decir que cada objeto tiene un comportamiento y un estado asociado y se espera que responda y trabaje en equipo con los demas.

La forma de enfocar la resolución de problemas con este paradigmas entonces es tan sencilla y tan complicada como la concepcion de objetos que representen distintos entes y conceptos reales y la adjudicación de reponsabilidades, lo que termina determinando la forma de interrelación entre los objetos.

Una vez modelada la solucion en función de los objetos protagonistas, se pasa a pensar en las clases o en los prototipos de los objetos.

Algunas de las caracteristicas principales del paradigma orientado a objetos son:

    • Objetos

Abstracciones computacionales de entes reales

    • Mensajes

Pedidos que le puedo hacer a un objeto para poder
interactuar con el

    • Polimorfismo

Permitir que dos objetos puedan ser tratados
de la misma manera por un tercero.

    • Herencia

Capacidad de definir objetos extendiendo el
comportamiento de objetos existentes, algo asi como una
evolución natural.

    • Encapsulamiento

Un objeto solo conoce su implementación y no conoce
la implementación de los demas, solo necesita saber
de los demas los mensajes que les puede enviar.

Mas adelante vamos a adentrarnos en estas y otras caracteristicas e ir macheandolas
con ejemplos en distintos lenguajes.

Algunas analogías normales a la forma de pensamiento sistematica modularizada del paradigma OO pueden ser:

Cuerpo Humano:
En el cuerpo humano cada organo hace su trabajo, y comunican necesidades a traves de encimas y otros químicos, trabajando en equipo
y haciendo que el cuerpo funcione.

Empresa:
Una empresa tiene departamentos, conformados por personas con responsabilidades. A su vez, existen canales formales para comunicar
las necesidades y dar a conocer estados.

Algunos lenguajes que dan soporte a orientación a objetos de manera nativa son:

Smalltalk
C++
Objective-C
Python
PHP
Java
Ruby
C#
ASP
Action Script
Java Script
Perl
Delphi
ABAP



lunes, 30 de junio de 2008

Web Services - Introduccion

¿Que son?
Un web service es un conjunto de estándar y protocolo que sirve para intercambiar información entre distintos sistemas. Un sistema desarrollado con cierta tecnología, por ejemplo Java, puede comunicarse con un sistema en PHP a través de un Web Services, esta es la funcionalidad principal, pero no necesariamente tienen que ser de diferentes plataformas, los sistemas pueden estar realizados en un mismo lenguaje, por Ejemplo comunicar dos sistemas realizados en PHP a través de un web service.

Esto se consigue gracias al uso de estándar abiertos que son regulados por la W3C y OASIS encargados de dicha tarea.


Los estándar que se manejan en un web Service, son Web Services Protocol Stack, XML, SOAP, XML-RCP, HTTP, FTP, SMTP, WSDL, UDDI, y WS-Security

Un ejemplo de utilizacion de un web Service.

La cadena de Hoteles OneTravel, se asocia con la agencia de viajes EcoSpace.

Cada empresa tiene un sistema particular para cada empresa, pero surge la necesidad de reservar una habitación desde el sistema de EcoSpace que repercuta en OneTravel, para saber si tiene disponibilidad para cierta fecha, durante ciertos días. Esta comunicacion la podemos hacer a través de un Web Service.

OneTravel, tiene un WebService (desde ahora WS), en el cual nosotros podemos conseguir.

- El listado de los hoteles asociados a OneTravel.
- Interfaz para reservar una habitación
- Interfaz para liberar una reserva
- Interfaz para saber los detalles de los servicios.


EcoSpace al poder interactuar con OneTravel de forma remota y en linea, se puede reservar una habitación desde el sistema de EcoSpace de forma automatizada y que impacte en el sistema de OneTravel, sin la necesidad de correos electrónicos, o llamadas por teléfono para confirmar, de esta forma nosotros impactamos directamente sobre el sistema de OneTravel.

Los Web Service no solo nos sirven para hacer reservas en un hotel desde una agencia de viajes, sino para cualquier tipo de comunicacion a través de sistemas diferentes. A nuestros WS le podemos dar la cantidad de funcionalidades que necesitemos.



Ventajas de un web Services
Los WS tienen muchas ventajas.
Son puentes de comunicacion a través de aplicaciones desarrolladas en diferentes plataformas independientemente de sus propiedades o plataforma en la que se instale. Una aplicacion desarrollada en Linux, se puede comunicar tranquilamente con una aplicacion desarrollada para Windows.

Se puede dar que una aplicacion solo englobe a un conjunto de WS. Por ejemplo un home Banking. Nosotros autenticamos nuestros datos a un servidor especial que Corre una aplicacion en C que corre sobre un Debian, también tenemos la conexión, con las diferentes empresas de tarjeta de créditos (American Express, Visa, Master, Cabal, etc), esta comunicacion se hace a través de un WS que es administrado por cada empresa. Ademas tenemos el WS de pagomiscuentas.com, que a su vez se conecta con los WS de otras empresas y a su vez con mas WS, permitiendo al usuario pagar la cuenta de teléfono de su casa, a través de su Home Banking, sin la necesidad de ir a los cajeros de esta empresas.


Desventajas
El problema principal que tiene un WS es el rendimiento, al ser un estándar basado en texto, resulta ser mas pesado que con otros estándar de comunicacion.
Al ser procesado por el puerto de HTTP, algunas reglas de los firewall pueden ser violadas.


¿Por que crear un WS?
Los WS son fácil de implementar, tanto para la creación de un WS, como para la implementación y uso de este. A medida que pasa el tiempo mas aplicaciones usan los WS para comunicarse, y esto hace que se genere mas información, y sea mas común hablar de WS. Es comun encontrar en grandes organizaciones uno o mas sistemas internos desarrollados en algún lenguaje para crear aplicaciones de escritorio, y con el crecimiento y auge de Internet, el uso de aplicaciones vía web crece dia a dia. Lenguajes como PHP pueden comunicarse muy facilmente con estos sistemas para brindar informacion o interactuar con un usuario via web.


Referencias
OASIS http://www.oasis-open.org
W3C http://www.w3c.es/Consorcio/

Paradigmas de programación

Paradigmas v1.0

Antes de hablar de programación y de las distintas formas que hay para resolver un problema, esta bueno ir un poco más allá y pensar en:

“¿Qué es una forma de resolver un problema?”

Como en todas las ramas del conocimiento, en la programación existe la noción de Paradigma.

Un paradigma, en general, plantea una forma de encarar los estudios y / o problemas, ejemplos claros son los paradigmas de psicología, que existen las distintas escuelas, que van desde la gestalt a el psicoanálisis, postulando formas de estudiar el comportamiento humano completamente distintas, pese a buscar siempre el mismo fin.

Entonces, los paradigmas, son herramientas conceptuales que se encuentran completamente en el mundo de los pensamientos que dan al programador las nociones y formas de abstracción que sirven para resolver problemas.

Algunos de los paradigmas hoy vigentes se clasifican de esta manera:

· Imperativos

o Estructurado – Procedural

o Orientado a Objetos

o Aspectos

o Orientado a procesos (concurrencia)

· Declarativos

o Orientados a lógica

o Orientados a funciones (del tipo matemáticas)

o Orientados a Consulta / Almacenamiento

Este texto contempla solo las dos grandes clasificaciones: Imperativos y Declarativos.

Paradigmas Imperativos

Estos paradigmas se caracterizan principalmente por el hecho de preocuparse por el problema a resolver (“que”) y por “como” resolverlo.

Cuando un piensa en la resolución de un problema, tiene que pensar en todos los pasos a dar para resolverlo. Luego, a la hora de programar, cada uno de esos pasos se transforma en una instrucción o mejor dicho, un mandato (de ahí la calificación de imperativo).

Paradigmas Declarativos

Estos paradigmas se caracterizan, principalmente, por preocuparse de el problema (“que”) y no del “como” resolverlo. En general, los lenguajes que soportan este tipo de paradigmas, tienen un motor que se encarga de interpretar el “que” y transformarlo en una solución.

Cuando uno piensa en la resolución de un problema en este tipo de paradigmas, tiene que modelar el problema en el marco del paradigma concreto y expresar al motor la necesidad asociada para que el lo resuelva.

Ejemplo

Problema:

Necesitamos conseguir una entrada para el recital de Iron Maiden.

Solución 1:

Sabiendo que estamos en un living en un 7mo piso, y a 3 cuadras a la izquierda y dos adelante (tomando como referencia la puerta del edificio) del lugar de venta, y que tenemos la plata en la mesita de luz:

· caminamos hasta el cuarto

· abrimos la mesita de luz

· agarramos la cantidad de plata necesaria

· vamos hasta la puerta

· llamamos el ascensor

· entramos en el ascensor

· apretamos el botón a planta baja

· salimos del ascensor

· salimos del edificio

· caminamos 3 cuadras a la izquierda

· doblamos a la derecha

· caminamos 2 cuadras

· entramos en el local

· compramos la entrada

Solución 2:

Sabiendo que existe el service chart, que tenemos tarjeta de crédito y tenemos teléfono:

· Llamamos al service chart

· Pedimos que nos envíen la entrada

· Damos el código de tarjeta

· Esperamos la entrada J

Puntos en común:

· Ambas formas requieren recursos

· Ambas formas resuelven el problema

Puntos distintos

· La primer forma es mas económica en plata

· La segunda forma es mas económica en tiempo de la persona

· La primer forma solo sirve si estoy siempre en el mismo lugar

· La segunda forma sirve siempre, el service chart es el que se encarga de saber “como”, a mi solo me importa el “que”

Después de ahondar más en los distintos paradigmas voy a volver sobre esta calificación, para poder generalizar los features, que son en definitiva los que hacen que exista la calificación “Imperativo” y “Declarativo”.

Controladores y vistas

Nuestros modulos estan dentro de la carpeta application.

Los modulos en un sistema que trabaja con MVC estan compuesto de 3 partes.

Modelo
Vista
Controlador.

El modelo ya aclaramos en otra seccion como crearlo.

Lo que necesitamos ver ahora son los controladores, y las vistas.

* Controllers
Dentro de la carpeta application tenemos por ejemplo el modulo usuarios, este tiene una carpeta con el mismo nombre. Dentro de esa carpeta podemos ver 2 carpetas mas, controllers, y views. Una particularidad es que un modulo no necesariamente tiene que tener un solo controller puede tener mas de uno, en nuestro caso vamos a tener dos. Un indexController.php y un adminController.php, el primero se va a encargar de procesar todas las acciones dentro del frontend, y el otro, todo lo referente al backend. Pero podemos hacerlo en mas controller, o en uno solo, esto es particular de cada uno.

Nuestros controllers tienen que heredar Zend_Controller_Action, pero como hicimos con los modelos podemos heredar una clase intermedia, eso depende de cada uno.

Cada metodo publico (deberian ser los unicos), tiene el posfijo Action, el cual representa que eso es una accion. Un ejemplo de un controller seria el siguiente.


class Usuarios extends Zend_Db_Table
{
public static function getUsuarios()
{
$view->usuarios = Usuarios::getUsuarios();
$this->render();
}
public function addAction()
{
$this->render();
}
}
?>


Si en la url no especificamos un action, el metodo por default es index. En nuestro ejemplo va a buscar al modelo de usuarios, todos los registros y los va a enviar a la vista a traves de $this->view, esto va a crear una variable $this->usuarios en nuestra vista.


* Vistas.
La carpeta de vistas esta dividida inicialmente en tres partes, filters, helpers, y scripts, en filters, vamos a guardar los filters (cuak), si queremos saber mas sobre esto podemos ir a esta url. http://framework.zend.com/manual/en/zend.filter.html#zend.filter.introduction.definition
En helpers van todos nuestros helpers para ese modulo especifico, si es un helper generico podemos ubicarlo dentro de nuestras librerias.
La carpeta scripts, contiene en nuestro caso tres carpetas admin, index y error. Esto se debe a que usamos dos controllers, si tuvieramos uno solo tendriamos index y error solamente.

Dentro de index para seguir con nuestro ejemplo tenemos varios archivos .phtml, esta extension determina que es una vista. Si nosotros tenemos el metodo index en nuestro controller, debemos tener una vista index.phtml, lo mismo para add, add.phtml. Esto ZF lo interpreta automaticamente, pero tambien podemos decirle que ejecute una vista en particular, o que no ejecute ninguna.

un ejemplo de index.phtml seria.














Esto nos va a mostrar todos los registros devueltos por el modelo.

Creando modelos

A partir de la estructura de directorios que hicimos en el post anterior, vamos a crear nuestros primeros modelos.

Los modelos contienen la logica de negocio, en nuestro caso los modelos estan fuera de los modulos, para evitar la dependencia de un modulo especifico. Esto se debe a que un modulo, puede usar varios modelos, y no su modelo en particular.

En mi caso los modelos heredan la clase Zend_Db_Table, pero podemos incluir una clase propia intermedia. Eso es totalmente configurable.

Los metodos publicos de los modelos son estaticos e instancian a la clase, esto se hace para que se puedan acceder desde cualquier lado del sistema, sin la necesidad de instanciar la clase, y si usamos Zend Studio for Eclipse, al escribir el nombre de la clase, por ejemplo Usuarios:: nuestro IDE nos muestra el listado de metodos publicos.

una clase modelo puede tener la siguiente estructura





class Usuarios extends Zend_Db_Table
{
protected $_name = 'usuarios';
public static function getUsuarios()
{
$usuarios = new Usuarios ();
return $usuarios->fetchAll();
}
}
?>


Para llamar al metodo getUsuarios desde cualquier parte del sistema podemos hacer Usuarios::getUsuarios(); y nos va a devolver los registros de la tabla usuarios.

Estructura basica para trabajar con Zend Framework

Zend Framework es un conjunto de componentes que nos facilitan la resolucion de problemas comunes, el acceso a una base de datos, la administracion de permisos, la creacion de WS, el manejo de OpenId, envio de mails, creacion de pdf, etc. En cada version del framework se agregan mas componentes.

El framework trabaja con MVC pero no obliga a hacerlo, podemos usar Zend Framework como libreria de una aplicacion sin ser MVC, pero este cuenta con componentes para el Manejo de MVC, Zend_View, y Zend_Controller.

En nuestra estructura de es directorios vamos a tener el siguiente esquema

* Application: aca van todos los modulos y funcionalidades del sistema. Dentro de cada modulo, dos carpetas, controllers y views. Los modelos estan fuera de application, y dentro de la raiz del proyecto, el motivo es que esten dentro del path del sistema, asi pueden ser llamados desde cualquier punto del sistema, gracias al autoload de ZF.

* Config: incluye los .ini de configuracion. Configuracion de Base de datos, o configuraciones varias.

* HTML: Esta es la unica carpeta de acceso publico, cualquiera agregando la url puede acceder desde el navegador. Esta carpeta esta dividida en varios items. Inicialmente, tenemos una carpeta clientScripts donde esta todo nuestros js, en scripts, tenemos una carpeta layout, con todos los layout del sistema, una carpeta images, y otra styles.

* Library: Aca esta la libreria de Zend, y podemos agregar una carpeta con nuestras librerias.

* Models: Todos los modelos. Los metodos publicos son estaticos, para que no sea necesario instanciar la clase para usarlos.

* Sql: Aca esta los dump de la base de datos.

Y por ultimo tenemos nuestro bootstrap, index.php , que se encarga de ejecutar los modulos, y la configuracion basica del sistema, ademas de cargar las librerias necesarias. El .htacces redirecciona todas las peticiones al index.php.


Otros articulos:
Estructura de directorios - Blog de Zsamer

miércoles, 25 de junio de 2008

Deshabilitar Zend_Layout para un controller

Siguiendo con el tema el componente Zend_Layout puede surgirnos la necesidad que a cierto controller no cargarle el layout.
Obviamente esto es posible. Con solo agregar la siguiente linea en el Action del controller que queremos deshabilitar el layout es suficiente.



$this->_helper->layout->disableLayout();


Mas Info

Zend_Layout, tener mas de un layout en nuestro sistema.

Generalmente para los sistemas web tenemos dos partes, frontend (la parte del usuario), y un backend. Es probable que compartan el diseño, pero el backend tiende a ser mas simple que el frontend, para diferenciarlo, y que no sea tan molesto el trabajo diario, debido al exceso de contenido.

Si leyeron la guia de implementación de Zend_Layout, de zsamer en su blog. Solo nos muestra un solo layout.

Pero si nosotros queremos tener mas de un layout lo podemos configurar muy facilmente.

Primero en el bootstrap configuramos los layout que va a usar nuestro sistema, y en que ruta vamos a tenerlo. En mi caso los guardo en /html/scripts/layout, pero eso es relativo a cada uno.

Agregamos el siguiente código.


$options = array(
'layout' => 'Frontend',
'layout' => 'Backend',
'layoutPath' => 'html/scripts/layout/'
);
Zend_Layout::startMvc($options);


Con esto ya tenemos configurado nuestro Bootstrap con los dos layout Frontend, y Backend, tengan en cuenta que Frontend va a quedar como layout default. Dentro de la carpeta html/scripts/layout, debe haber un frontend.phtml, y un backend.phtml con la estructura de nuestra web.

Una vez creado nuestros archivos desde el controller que vamos a ejecutar backend o un layout que no sea el default, antes de ejecutar el render, seteamos el layout que queremos que se muestre
en nuestro caso backend.

La linea que debemos agregar es la siguiente
$this->_helper->layout->setLayout('backend');

Y listo, si ejecutamos nuestra aplicacion vamos a poder ver como conviven pacíficamente varios layouts. ;)


Mas info:
Manual Oficial
Entrada en el blog de zsamer
Wikibook

martes, 24 de junio de 2008

Utilizando Zend_Feed

Estoy haciendo el desarrollo de un portal de noticias, que dentro de poco voy a liberar una primer version. Hoy me tocaba la tarea de hacer la suscripcion Atom de las noticias del portal para lo cual use Zend_Feed.

Voy a mostrar como quedo mi ejemplo.

En un primer paso arme el controller para el modulo Rss.


class Rss_IndexController extends Me_Generic_Controller
{
public function indexAction ()
{
Zend_Loader::loadClass('Zend_Feed');
Zend_feed::importArray(Rss::getArray(), 'atom')->send();
$this->_helper->viewRenderer->setNoRender();
}
}
?>


Tenemos por ahora solo un metodo index, desde ese index cargamos Zend_Feed con Zend_loader, despues vamos a obtener del modelo Rss un array con el contenido que va a tener nuestro Atom. Para procesar ese Array vamos a usar Zend_Feed::importArray, el cual convierte el array en un xml valido. Lo otro que vamos a hacer es evitar que cargue la vista del modulo.

Por ahora va muy simple. Ahora vamos al modelo.



class Rss extends Zend_Db_Table
{
const CANT_NOTICIAS = '20';
const CHARSET = 'utf-8';
public static function getArray ()
{
$noticias = Noticias::getXCantidad(self::CANT_NOTICIAS);
$datos['title'] = 'Portal de noticias';
$datos['link'] = 'http://localhost/diario/rss/';
$datos['lastUpdate'] = Fechas::getMkFromFechaHora(Noticias::getLastDate());
$datos['charset'] = self::CHARSET;
$i = 0;
foreach ($noticias as $noticia) {
$datos['entries'][$i]['title'] = utf8_encode($noticia->titulo);
$datos['entries'][$i]['link'] = 'http://localhost/diario/noticias/?noticia=' . $noticia->id_noticia;
$datos['entries'][$i]['description'] = utf8_encode($noticia->texto_portada);
$datos['entries'][$i]['content'] = utf8_encode($noticia->texto);
$datos['entries'][$i]['lastUpdate'] = Fechas::getMkFromFechaHora($noticia->aud_fecha_hora_ingreso);
++ $i;
}
return $datos;
}
}
?>



Por ahora tambien va a tener un metodo solo, getArray en la primeras lineas traemos desde el modelo de Noticias las ultimas 20 noticias cargadas y activas. Declaramos un titulo a nuestro feed, que va a ser el titulo del portal de noticias, agregamos el link al feed, la fecha de la ultima actualizacion que va a estar con formato mktime y el charset, en nuestro ejemplo sera utf-8.

Con el objeto con las ultimas veinte noticias, vamos a iterarlos, para conseguir el detalle de cada noticia. Y vamos a completar los datos correspondientes, y por ultimo vamos a devolver el array generado.

Cuando le devolvemos al controller el array, este lo transforma en un Atom valido.

Cuando ejecutamos.

http://www.dominio.com/rss


nos va mostrar el Atom de las ultimas 20 noticias ;)




Pero falta algo, como hacer que desde el home nos aparezca el icono de rss y nos permita agregar en nuestro feed con la url http://www.dominio.com/ como hacemos con cualquier blog.

Muy facil
Dentro del head de nuestro html, agregamos la siguiente linea

1

2 <link rel="alternate" type="application/rss+xml" title="RSS" href="<?php echo $this->baseUrl;?>/rss/" />



en href ponemos la url a nuestro feed.



asi nos quedaria

Facil, no?

Otros links

Syndicate content with Zend Framework Zend_Feed classes

Internet Explorer en Linux

Si necesitamos por esas cosas de la vida ver una web con IE podemos instalar IEs4Linux. Este software es open source, si queres podes colaborar vía paypal.

El proceso de instalación es muy fácil, y esta disponible una guia para las distribuciones mas importantes.

Estuve probando esta aplicacion para un error especifico con IE6, y el error lo genero perfectamente :( .

En la imagen se puede ver el programa corriendo en un Ubuntu 8.04, además marco un problema con el interlineado que solo aparece con Explorer :@.

jueves, 19 de junio de 2008

Zend Framework y el Patron MVC

En un post anterior vimos como trabajar con MVC, pero en esta oportunidad vamos a ver como trabajar con MVC con Zend Framework.

El documento esta en ingles, pero lo suficiente mente claro ;)


Programacion Orientada a Objetos II

Ampliando la documentacion del post anterior de POO. Voy a compartirles un manual escrito por la gente de desarrollo web muy completo sobre PHP5.


Creacion de scripts en linux

Encontre este interesante articulo creado por jcmoreno. Un usuario de slideshare, que nos explica como crear scripts avanzados en Linux


Programacion Orientada a Objetos

No seremos programadores Zend sino programamos orientado a objetos. En este documento vamos a tener una introduccion a los conceptos basicos de la POO. Y nos puede servir de guia para nuestros primeros pasos.

Tambien es importante que tengan como referencia la web oficial de PHP, y su capitulo de PHP5

Python para todos

La gente de mundo geek realizo un manual de Python, titulado "Python para todos".
Es un manual muy bien escrito y claro. Es una excelente guia para aprender a usar Python y tenerlo como libro de referencia.

El libro fue liberado bajo la licencia Creative Common. Así que sientanse libre de copiarlo las veces que lo necesiten.

El temario que vamos a encontrar es el siguiente.

  • Tipos básicos
  • Control de flujo
  • Funciones
  • Orientación a objetos
  • Programación funcional
  • Excepciones
  • Módulos y paquetes
  • Entrada / Salida
  • Expresiones regulares
  • Sockets
  • Interacción con webs
  • Threads
  • Serialización de objetos


Los que quieran descargarse el libro o saber mas al respecto pueden visitar la web de Mundo Geek en la sección del libro. O pueden usar la descarga directa que habilite hoy.

martes, 17 de junio de 2008

Zend Studio for Eclipse 6.01.

Ya tenemos la nueva versión de Zend Studio para "comprar".

Al parecer solucionaron los problemas de cuelgues habituales en ZS.

Lo mas destacado de los cambios son.

- Soporte para Zend_Layout.
- Zend Framework 1.5.2
- Paquete de lenguajes para Alemán, Italiano y Danés (para cuando el español? )
- Supuestamente solucionaron los problemas de cuelgues y consumo excesivo de memoria. Para solucionar esto en la versión 5 tenia que deshabilitar los builders, y Validation de cada proyecto.
- Refactoring: Ahora además de hacer refactoring rename, también podemos mover y organizar includes


Pero en definitiva, después de leer todo esto me baje el trial y lo probé un poco.

Esta es la pantalla que aparece mientras carga el IDE.




Una vez cargado lo primero que hice fue modificar mi workspaces a /var/www. Cuando se reinicio aparecieron los proyectos que ya tenia cargado en la versión anterior.

Lo segundo a configurar es la forma en que nos formatea el código, y para eso fui a windows->preferences->php->formatter y elegí la opción Zend Framework en Active Profile. Acá también podemos configurar nuestros propios standar de código (no recomendable).



Cuando quise entrar en Code Gallery, el sistema colapso y tuve que cerrarlo forzosamente.

Como ven en la imagen el consumo de memoria era bastante alto.




La realidad que el resto anda muy bien, podemos ver al eterno builder trabajando más rápido.




Y las nuevas opciones de refactoring en el menú contextual.



Zend Studio es el IDE mas completo y profesional para PHP5 y su integracion con Zend Framework. Pero todavía le falta algunos puntos como la optimizacion de recursos.

Lo probé en un Pentium 4 2.8 ghz 1gb de memoria ram con Ubuntu 8.04


Si queres saber mas sobre esta versión entra en este link

miércoles, 11 de junio de 2008

Utilizando componentes ZF individualmente

Una de las ventajas que tiene Zend Framework sobre otros, es que podemos usar sus componentes sin necesidad de migrar todo el sistema al framework, de esta manerapodríamos incluir en nuestro proyecto solo el componente de Base de datos Zend_Db. Lo único que tendríamos que hacer es en nuestra raíz del sistema crear una carpeta Zend que contenga las librerías que necesitemos para ese componente, es recomendable descargar todas las librerías.

Un ejemplo muy simple, para conectarnos en una base local, e insertar datos seria este

1  
<?php
2  
require_once 'Zend/Db/Adapter/Pdo/Mysql.php';
3  
$db = new Zend_Db_Adapter_Pdo_Mysql(array(
4              
'host'     => 'localhost',
5              
'username' => 'desarrollo',
6              
'password' => 'jsdlk123o',
7              
'dbname'   => 'trueque'
8          
));
9  
10  
$datos = array (                   
11                      
'nombre' => 'Josemir',       
12                      
'estado' => '1',
13      );
14  
$db->insert 'nombre_de_la_tabla'$datos );
15  
?>





Y listo. De la misma manera que usamos insert, podemos hacerlo con cualquiera de los otros metodos.

No solo es util para Zend_Db, sino para cualquiera de los demas componentes. En algunos casos es necesario cargar anteriormente el componente Zend_Loader.

Esto es util cuando queremos ir migrando de a poco nuestros sistemas.

lunes, 9 de junio de 2008

Errores tipicos programando POO en PHP5

Preparando la clase de PHP Orientada a objetos que empiezo a dictar hoy, me encontre con estos 10 tipicos errores, Programando PHP Orientado a Objetos. Muchos puntos parecen basicos pero increiblemente se ven a menudo.

El articulo fue extraido de Cristal Labs

1. Usar variables globales dentro las clases: una de las ventajas más importantes de la programación orientada a objetos es la reusabilidad de los códigos. Al usar variables globales ($_GET, $_SESSION, $_POST, $_COOKIE, global) dentro de las clases, esta se ve comprometida considerablemente. La razón es que todos los proyectos no tienen las mismas variables globales.

2. Mezclar código HTML en la definición de las clases: es una de las cosas que me sorprenden cada vez que la veo. Es inaceptable que esto se le haya ocurrido a algunos. Al mezclar HTML en el código PHP se compromete la reusabilidad de la clase, no todos los proyectos tienen el mismo código HTML.

3. Imprimir salida (echo) dentro de las clases: aunque esto se parece a la anterior, me refiero a los echo o similares dentro de los métodos. Si una clase no está destinada para emitir salida no lo debe hacer. Para eso muchos utilizamos sistemas de plantillas.

4. Identificadores de clases, métodos y propiedades sin sentido: un identificador siempre debe ser lo más descriptivo posible. A muchos le gusta usar identificadores increíblemente irrelacionados con su propósito. Esto compromete enormemente la lectura de un código. (Mira las reglas de codificación en PHP)

5. Mezclar uso de versiones de php en una misma clase: a partir de la versión 5 de PHP, la programación orientada a objetos se puede implementar de una manera más formal, pues se introdujo los modificadores de visibilidad public, private, protected. Aparte de que se pueden crear clases de alto nivel (clase Abstractas) y métodos abstractos con la palabra reservada abstract. También se pueden definir los métodos y propiedades estáticas formalmente con la palabra reservada static. Mezclar la programación orientada a objetos en PHP 4 (donde todo era publico) con la de PHP 5 hace un código “sucio”. Consejo: elige una de las versiones y programa para ella.

6. Más de una clase en un mismo archivo: definir distintas clases en un mismo archivo es otra de las cosas que no se debe hacer. Las clase se han de componer lo más reusables posible y si puedes nombrar al archivo con el nombre de la clase muchísimo mejor. Sigue el camino de los grandes lenguajes como: Actionscript, Asp.net, Java entre otros.

7. No hacer pruebas unitarias a las clases: al terminar de codificar una clase recuerda de hacer pruebas unitarias para asegurar el correcto funcionamiento de clase. Esto es simplemente probar todos los posibles caminos que pueda tomar un estado (propiedad), parámetro de método, etc para que la clase no “explote”.

8. Todos los métodos y las propiedades publicas en una clase de PHP 5: los programadores novatos cometen el error de definir todos los métodos y propiedades como públicos, por desconocer las ventajas de los modificadores visibilidad. En PHP este es un problema grave porque no hay tipeado de datos. El problema de las propiedades públicas es que no podemos controlar de manera fácil el tipo de datos que contiene por lo que nuestra clase pudiera explotar por un tipo de dato inesperado. Si no estas seguro de que visibilidad le debes poner a una propiedad hazla privada. Valida los tipos de datos de las propiedades al menos de una manera básica.

9. Duplicación de métodos para ocultar falla de lógica: A diferencia de otros lenguajes como Java y C++, PHP no admite la sobrecarga de métodos. Al menos no de la manera tradicional. Esto, sin embargo, no es excusa para duplicar métodos sólo porque un dato cambia para la operación que éste realiza.

10. Variables de configuración dentro de las clases: Los datos de configuración de base de datos, web services y otros deben ir en un archivo de configuración aparte, NO dentro de la clases que hacen uso de estas. Aunque se admite en clases que sea exclusivamente para ello.


A estos puntos yo añadiria los siguientes

A- No usar clases genericas, que incluyan metodos o propiedades que no tengan nada que ver con el identificador

B- No declarar las propiedades como publicas, para eso tenemos los metodos getter y setter. Cada objeto y solo ese objeto debe saber sus propiedades.

Y seguramente me estoy olvidando de alguna más

martes, 3 de junio de 2008

Ruby Facíl

Ruby Facíl es un libro con licencia creative commons creado por Diego F. Guillém Nakamura, el libro es bastante simple y claro si queremos empezar a aprender Ruby, esta edicion no habla de Rails, el framework que hizo famoso a Ruby, pero es una buena base.


miércoles, 28 de mayo de 2008

PHP vs RoR

Hoy encontre unos graciosos videos donde la gente de ruby, se roba (literalmente), la idea de la publicidad Mac vs PC.

En estos videos se habla de lo simple que es usar ruby y como genera envidia en la gente de PHP.

Aca voy a subir los videos comparando RoR con PHP, pero hay varios, comparandolo incluso con .net.
Veremos quien sigue en pie en 10 años ;).

Obviamente nunca hay que aferrarse a un lenguaje, hay que aprender y conocer distintas tecnologias para nosotros decidamos cual es nuestra mejor alternativa.

Es gracioso que el gordito de PHP, use la remera de cake, porque es un framework que esta basado en PHP 4.

Otro punto tambien es en el segundo video hace alarde del uso de MVC, cuando en PHP tenemos Zend y otros framework que trabajan sobre este patron.

Ruby es Ruby gracias a su Framework, Ruby on Rails y que es un lenguaje POO puro, basado en la idea de Smalltalk. La idea de diseñar aplicaciones 2.0 de fomra rapida y efectiva es muy tentador. El codigo es bastante simple he intuitivo, pero con esto no estoy desmereciendo a PHP, sino que seria bueno tomar de Ruby lo mejor de èl, con PHP5 el codigo es mas claro, con Zend y otros, conseguimos trabajar en MVC de manera limpia. Hay una tendencia que dice que PHP va bien, y estara mejor.

Y si ruby anda bien, en dos años me estare comprando mi primera Mac Pro, y dejare Zend Studio para usar RadRails :P.











Scaffolding en Zend Framework

El otro día tratando de encontrar si había algún proyecto de implementar la técnica de Scaffolding que tanto trabajo nos quita a los programadores. Me encontré con que existe un componente creado por la gente de Zend que si bien aun esta en desarrollo (Zend_Controller_Fron_Scaffold ), seguramente pronto podremos contar con el para implementarlo en nuestras aplicaciones. En PHP el scaffolding lo implementan el framework: CakePHP, y Symfony.

Encontré una definición en el blog de Carlos Leopoldo que nos va a orientar que es esta técnica:
"La palabra Scaffold está en inglés y en español significa Andamio, pero en programación el scaffolding es un método para contruir aplicaciones basadas en bases de datos, esta técnica está soportada por algunos frameworks del tipo MVC en el cuál el programador escribe una especificación que describe cómo debe ser usada la base de datos. Luego el compilador utiliza esa especificación para generar el código que la aplicación usará para crear, leer, actualizar y eliminar registros de la base de datos, esto es conocido cómo CRUD (create, read, update, delete).El Scaffolding fue popularizado por el framework Ruby on Rails y ahora es utilizado por otros frameworks también cómo CakePHP, Symfony.".

Entendiendo el modelo de Objetos en PHP5

En el blog de Sebastian Bergman, encontré un documento titulado "Understanding the PHP Object Model" ( 'Entendiendo el modelo de objetos en PHP'), esto esta basado obviamente en PHP5. Si bien esta en ingles, hay mas código que texto, y creo que esta mas que claro. Los que sigan trabajando con PHP4, van a notar muchas cambios con respecto a su código. Y la verdad que PHP4 no se podía considerar Orientado. PHP5 es una evolución notoria en este aspecto. Si bien todavía nos falta un camino, el lenguaje evoluciono bastante. Ahora faltan algunos detalles, algunos se van a agregar en la versión de PHP6 que son el manejo de paquetes, y otros probablemente vendrán pronto.

Bueno les dejo el documento para que lo disfruten

Steve Jobs - 3 Historias

El discurso es un poco viejo (2005), pero me gusto mucho en su momento, y mas viniendo de un personaje tan importante como uno de los fundadores de Apple, el discurso esta dividido en dos partes, en la primer parte van a tener las dos primeras historias y en el segundo video la tercer y ultima historia.

Es algo que vale la pen ver, o re ver para los que ya lo vieron


Primer video



Segundo Video