PHPSenior: el resumen del año 2009

Siguiendo la costumbre de muchos blogs, les hago un resumen de los artículos "más técnicos" que se trataron durante el año. Particularmente este año no fue el más activo en lo que respecta a la creación de nuevos contenidos, ya que la escritura del libro y los posteriores cursos que se fueron dictando durante todo el año nos mantuvieron a todos muy ocupados (incluyo a mis dos grandes colegas y docentes que me acompañan: Andrés Guzmán y Nicolás Fornaro).


Para este próximo año 2010 tengo muchos proyectos, algunos relacionados con este blog y otros relacionados con SURFORCE, los cursos, la nueva versión del libro de POO (que la vengo demorando porque quiero estrenar nuevo material asociado) y las próximas novedades en cursos y libros.


Aquí el resumen de los temas que se trataron durante el año, y espero, el próximo año sea mucho más productivo en todo sentido ;-)

Enero

Febrero

Marzo

Abril

Mayo

Junio

Julio

Agosto

Septiembre

Octubre

Noviembre

Diciembre

¡Feliz Año 2010! ;-)

Video Promocional de la nueva versión Netbeans 6.8

La mayoría ya debe saber que en la actualidad estoy usando más Netbeans que ZendStudio, particularmente porque prefiero usar "software libre" y no tener que usar "software ilegal" ;-)

Aquí les dejo el video promocional (aunque gran cantidad de mejoras son para Java, es un IDE muy completo para PHP y ya empezaron con el desarrollo del soporte para Zend Framework).

Fotos de la pasada PHP Mini Meeting - Argentina (14/11/2009)

El pasado sábado 14/11 nos reunimos varios "phperos" en Argentina en una primer "PHP Mini Meeting". Les voy a hacer un breve resumen de lo que presencié, más algunos comentarios muy personales que hice sobre cada exposición, donde lejos de criticar, intento tratar de transmitirles lo que se trató en cada charla. Desde ya felicito el interés y la dedicación de cada uno de los que dedicó su tiempo personal para preparar y luego presentar cada charla.

Andrés Proaño, organizador de esta primer reunión, se encargó de mostrarnos su proyecto PX, una librería desarrollada en objetos para generar código Xhtml. La única crítica que tuve para hacerle es que no estaba respetando los estándares mínimos de codificación POO, como ser que las clases iniciaran en mayúsculas, singular, etc. Para no ser menos, sugerí que adoptara el estándar de codificación Zend, tema que tal vez en una próxima reunión me encargue de dar.

Germán Peraferrer nos presentó su proyecto ORMphp, herramienta que desarrolló en su empresa para acelerar el trabajo de sus desarrolladores y poder competir con otras empresas en su mismo rubro, logrando acortar los tiempos en preparar prototipos funcionales para sus futuros clientes.

Según nos comentó a través de su presentación, luego de generar la configuración base de conexión a la base de datos, la herramienta genera todos los modelos necesarios (clases) que luego podemos incorporar a nuestros desarrollos y que contienen todas las operaciones necesarias para trabajar con la persistencia de objetos. Según comentamos, fácilmente podríamos integrarlo a Zend Framework (ya que este aún no cuenta con un ORM), y aún mejor, ya viene incorporada la generación de webservices para poder acceder a los datos desde cualquier fuente de origen.

Lo único que tengo para criticarle a Germán es que aún no haya liberado como proyecto libre su herramienta (usando tal vez code.google.com) y tener acceso a una documentación como un wiki y a un svn para bajar su código actualizado. De todas formas Germán ya nos envió el código fuente de la herramienta y una guía de uso, en lo cual estoy en deuda porque aún no pude sentarme a probar, pero que haré dentro de poco (ya que tengo mucho interés de evaluarla y ver si puedo incorporarla en alguno de mis desarrollos actuales :-))

Nota: con Germán ya habíamos tenido algún intercambio amistoso sobre "reinventar la rueda", ya que yo le decía que habían demasiados "ORM's", pero bueno, nos pusimos de acuerdo que a veces no queda otra, las herramientas pueden ser muy complicadas de aprender (curva de aprendizaje empinada) y otras tienen demasiadas funcionalidades que no usaremos nunca, lo que nos obliga a generar proyectos más concretos y específicos.

De todas formas, no sugiero nunca empezar primero creando algo nuevo sin evaluar honestamente las alternativas existentes.

Aquí estoy de espaldas, a tres ventanas de twitters, haciendo algún que otro comentario en vivo sobre la charla.

Sebastian Waisbrot, quién nos presentó sus experiencias usando el framework CodeIgniter. Este framework fue uno de los tantos que analicé oportunamente antes de dejar de perder el tiempo y decantarme por Zend Framework ;-)

En resumen, y confirmando con las palabras de Sebastian, sigo desaconsejando su uso: el equipo de desarrollo sigue una seudo-filosofía similar a Debian, quieren ser "ultra" estables y seguros, además, les preocupa en demasía la compatibilidad hacia atrás, lo que lleva a que aún esté internamente desarrollado en PHP4. Por el resumen de funcionalidades que se comentaron (tal vez por la versión que actualmente usa Sebastian), está bastante lejos de la mayoría de los frameworks más conocidos (Zend, Cake, etc).

Nota: sugiero recorrer el blog de Sebastian, ya que encontré muy buenos artículos sobre POO que recomiendo enormemente (lamentablemente desde el año pasado que no lo actualiza).

Aquí estoy a la derecha, sentado junto a Adrián, otro "phpero" que tuve el gusto de conocer.



Finalmente, luego de terminar, el resto nos fuimos a comer unas pizzas y a planear un proyecto de LUG, similar a los que existen para GNU/Linux, pero pensado para PHP (una idea que comparto desde hace muchos años). Así que esperamos que se puedan seguir armando charlas para todos los desarrolladores PHP que quieran participar y compartir sus conocimientos, y terminar de construir una comunidad tan fuerte como cualquier otra de Software Libre.

Quiero agradecer las fotos a Jonathan Margulis, joven fotógrafo profesional que nos acompañó y le dio otro toque de estilo a las fotos (muy buenas, hasta me veo más flaco y todo ;-))

PD: lamento no tener el nombre de todos ni sus blogs, pero como comenté en la reunión, el hecho de comunicarse a través de un foro y que la mayoría use seudónimos, dificulta enormemente que nos conozcamos y que asociemos lo que decimos y quienes somos ;-)

Así que quienes participaron, bienvenidos a enviarme en los comentarios sus nombres y datos para ser actualizados en este post.

¿Conoces la clase "DateTime"?

Es muy dificil conocer todas las funcionalidades que nos puede ofrecer un lenguaje, ya que leer el manual con el listado de funciones de arriba a abajo es tan divertido como leer la guía telefónica. Generalmente cuando tenemos un problema para resolver vamos a buscar en la sección correspondiente, según el tema, y listo (arrays, matemáticas, strings, etc). Lo importante muchas veces es, no solo saber de memoria, sino, saber donde buscar (o como dice el viejo dicho, "lo más importante es tener el teléfono de quién sabe", aunque esto lo único que hace es que evitemos aprender a valernos por nosotros mismos ;-)).

Siempre creí que la evolución natural de PHP debería ser juntar todas las funciones "sueltas" del lenguaje en formato "estructurado" y agruparlas en clases "base" como tiene cualquier lenguaje 100% Orientado a Objetos (tienen clases como String, Integer, etc, y si usamos un IDE veremos fácilmente toda la lista de métodos disponibles que se aplican a ese contexto concreto).

Nota al margen: hace unos años hicimos un experimento educativo y varios de mis alumnos de mi primer taller piloto a distancia hicieron un pequeño proyecto final que consistía desarrollar clases de tipo "wrapper" que cumplieran este objetivo (siguiendo el API de Java).

Espero que algún día PHP6 o 7 incorpore por defecto este tipo de organización que nos beneficiará a todos los desarrolladores.

De paso les comento que a veces, en raras ocasiones, podemos descubrir en el manual clases que vienen por defecto en PHP, por ejemplo, DateTime:

date_default_timezone_set('America/Argentina/Buenos_Aires');

$date = new DateTime("2009-02-28");
$date->modify("+1 day");
echo $date->format("Y-m-d");

$date = new DateTime("2009-01-01");
$date->modify("-1 day");
echo $date->format("Y-m-d");

// Salida:
//
// 2009-03-01
// 2008-12-31

Y Netbeans detecta todos sus elementos en la ayuda contextual:


Más información (obviamente): Manual Oficial de PHP

PD: y nunca te olvides de conocer las Standard PHP Library (SPL)

¡Próximo lunes, cursos intensivos de 1 mes! (Zend ó POO)

Dada la insistencia de varios alumnos para cursar de forma urgente los cursos de Zend y de POO antes de terminar este año, se abre un período excepcional:

Para quienes estén urgidos de hacer estos cursos, el próximo lunes se abrirán dos grupos reducidos (casi personalizados) para cada uno de los cursos.

Curso intensivo de 1 mes (los dos meses en uno), en el cual tendrán que trabajar más intensamente y dedicarle más horas diarias.

Costo: USD 150 por todo el curso (cursas POO ó Zend).

Nota al margen: Los cursos los empecé a realizar buscando que sean económicos para todo el mundo, por lo tanto, para poder bajar un curso típico de USD 250 dólares a 50 fue que empecé a hacer grupos de 10 a 20 personas. Actualmente ya no da el tiempo para iniciar otro grupo de 2 meses porque nos vamos muy arriba de las fechas de fin de año, lo cual complica la continuidad de los alumnos. Para poder dedicarle a un grupo muy reducido de personas, de forma intensiva durante un período muy breve, el costo del curso se eleva.

Les informo que estos cursos son excepcionales y solo para quienes verdaderamente los necesitan de forma "urgente", de lo contrario, solo tendrán que esperar hasta principios de febrero del año que viene (fecha de nuevo inicio de cursos) y hacerlo en el plazo habitual (2 meses) a un costo promedio de USD 50.

Para hacer la compra deben ingresar a usuarios.surforce.com e ingresar a la sección "Comprar"

Cualquier duda estoy a sus órdenes ;-)

Evento: PHP Mini Meeting (Argentina)



Más información: php-mini-meeting

PD: es este próximo sábado, voy a intentar ir aunque sea un rato (últimamente estoy durmiendo tan poco que no sé si llego despierto como para dar una charla prolija, así que es probable que en esta oportunidad solo haga más que "acto de presencia" y apoye en lo que pueda).

Así que si quieren charlar de PHP5, POO, UML, Zend Framework, etc, bienvenidos, hay tema para rato ;-)

Excepciones: Cómo forzar un "backtrace" en un sistema que no usa try/catch

Para los que venimos de haber trabajado, aunque sea académicamente, en otros lenguajes/plataformas como Java o .Net, trabajar con excepciones es un tema de todos los días. Al principio, cuando uno está aprendiendo y surge el primer volcado de una excepción (aparecen en pantalla muchas líneas con la información del error) hay una que resalta sobre todas y es la que demoramos más aprender a interpretar: el "backtrace" o ruta de ejecución desde que se inicia el sistema, todas las invocaciones que van sucediendo, en qué línea salta la ejecución, hasta terminar en el lugar exacto donde falló el sistema.

Recuerdo cuando probé por primera vez PHP5 (una beta) y lo primero que fui a probar fue hacer un try / catch forzando el fallo de una conexión a la base de datos con funciones nativas del lenguaje. Mi sorpresa fue mayúscula al comprender que los try / catch no funcionan a menos que nos aseguremos que la función que estamos usando retorne una excepción, y para colmo, PHP no lo hace por defecto! ;-) Así que no quedó otra que dejar las excepciones para nuestros desarrollos donde todo método de nuestras clases debía tener un throw new Exception('mensaje de error');

A pesar de mi desilusión, esto no era problema para los sistemas que hacíamos de cero de ahora en más, pero... ¿cómo haríamos con los sistemas que ya están funcionando y que no puedes salir a modificar miles de líneas de código para que un try / catch funcione?

Particularmente considero que una de las informaciones más importantes para poder hacer un debug de qué falló es el "backtrace". No es lo mismo ver en el log del sistema donde falló algo que ver quién invocó antes y con qué información para que fallara esa rutina.

Bien, hace un tiempo que lo buscaba y lo encontré por accidente en un foro, así que les comento la forma de uso y cómo lo pueden aplicar a sus sistemas "legacy":


class Debug
{
public static function getBacktrace()
{
$ex = new Exception();
return $ex->getTrace();
}
public static function getBacktrace2String()
{
$ex = new Exception();
$trace = $ex->getTrace();

/* Elimino la primer linea que
siempre es la misma y
hace referencia a la
invocación de esta clase */

array_shift($trace);

$trace_ret = '';
$linea = 0 ;
foreach ($trace as $item){

$linea++;

$trace_ret .=
"(".$linea.")"
."[file: ".$item['file']
.":".$item['line']."]"
."[".$item['class']
.$item['type']
.$item['function']."]"
."[args: "
.implode(',',$item['args'])
."] ";
}
return $trace_ret;
}
}


Luego, a continuación, tenemos una clase Log que lo único que hace es persistir cualquier información del sistema que queramos en un archivo de log, por lo tanto ahora agregamos la ejecución del backtrace y lo registramos en el log tal cual nos llega:


/* Método modificado de la clase Log */

public static function setError()
{
$backtrace = Debug::getBacktrace2String();
self::logToFile('errores.log',$backtrace);
}


Listo, ahora automáticamente tenemos que cada vez que el sistema deba registrar un error, este, tendrá toda la información de backtrace, que se vería en nuestro sistema de la siguiente manera:

2009-10-26 09:40:11 (1)[file: /var/www/class/App.php:81][Log::errores][args: /var/www/class/Prueba.php,75,ERROR GRAVE: no se obtuvo el resultado esperado en el metodo: getProveedor,,0,SELECT * FROM proveedores WHERE estado = 1 AND id = 111 AND idCuenta = 1234] (2)[file: /var/www/public/sys/send.php:48][Prueba->getProveedor][args: 111,1234]

Lo cual si indentamos en base a los (n) que son los saltos que va dando la ejecución,

2009-10-26 09:40:11

(1)[file: /var/www/class/App.php:81][Log::errores][args: /var/www/class/Prueba.php,75,ERROR GRAVE: no se obtuvo el resultado esperado en el metodo: getProveedor,,0,SELECT * FROM proveedores WHERE estado = 1 AND id = "111" AND idCuenta = 1234]

(2)[file: /var/www/public/sys/send.php:48][Prueba->getProveedor][args: 111,1234]

Aquí se pueden ver dos saltos, el (1) es lo que veríamos siempre en nuestro log, la aplicación que propiamente falla, pero en el (2) estamos viendo desde donde realmente se inicio la ejecución que luego terminó fallando.

De todas formas, esto es un "parche", deberíamos usar try/catch en todos nuestros sistemas de ahora en más (si es que ya no lo estás usando), pero una forma de mejorar lo que ya existe es agregar un forzado "backtrace".

Espero que lo prueben en sus sistemas y les sea de utilidad ;-)

Propuesta de trabajo: Desarrollador PHP / PHP5 / POO / MySQL (Argentina)

Les comparto la siguiente solicitud que me hace llegar una empresa, si les interesa pueden enviarme sus cv's a mi cuenta de correo (si no la sabes, no calificas para el puesto ;-))

Copio el aviso:

"Incorporaremos a nuestro equipo de desarrollo 2 personas con el siguiente perfil:

Requisitos:

- Experiencia comprobable en PHP
- Programación PHP 5 orientada a objetos (POO avanzado)
- Base de datos MySQL 5

Deseables (no excluyente):

- Frameworks PHP (preferencia Zend)
- Frameworks JavaScript (preferencia JQuery)
- Manejo de entornos Linux
- AJAX (XML y JSON)
- Maquetado en XHTML/CSS, HTML, WML
- Estudiante avanzado o graduado de carreras de informática o similar
- Capacidad de trabajo en equipo.
- Compromiso con calidad de productos y manejo de tiempos.

Empresa del rubro mobile (SMS/MMS/WAP),

Zona Palermo / Belgrano"

Tienen mi absoluta reserva.

Cursos SURFORCE: viento en popa!

Sí, nuevamente estoy poco en el blog, con mis colegas (Andrés Guzman y Nicolás Fornaro) estamos en pleno trabajo por el dictado de los cursos ;-)

Como es de público conocimiento, la última fecha para inscribirse durante este año fue a principios de octubre ( ya que los cursos duran 2 meses) y estaríamos terminando las primeras semanas de diciembre.

En este momento están activos los siguientes grupos:
  • Introducción a Zend Framework (3 grupos, dos abiertos y uno privado)
  • POO para PHP5 (3 grupos, dos abiertos y uno privado intensivo)
  • Análisis y Diseño Orientado a Objetos (2 grupos)
  • Introducción a los Patrones de Diseño (1 grupo)
  • Taller Zend de Zend Framework (1 grupo)
De todas formas, les sugiero que se registren como usuarios, así cuando existan novedades les hago un envío de las próximas fechas de cursos (tentativamente finales de enero, principios de febrero, a confirmar).

En el caso de empresas, se pueden fijar otras fechas especiales, armar grupos privados, o hasta dictados intensivos (en vez de durar 2 meses, se puede hacer en 1 mes o hasta en 2 semanas, dependiendo el tiempo de dedicación diario del alumno).

Espero que para los próximos cursos no te quedes afuera! ;-)

[SURFORCE] Cambio de fecha de inicio de cursos: lunes 12 de Octubre

Hasta esta hora estuve confirmando los pagos de los cursos y aún hay alumnos atrasados, por lo que para poder iniciar con los grupos completos vamos a tener que postergar unos días el inicio de los cursos.

Se extenderá el plazo hasta el próximo viernes para estar al día con el pago del curso y posteriormente SIN EXCEPCIONES no se recibirán más pagos y los cursos darán inicio el próximo lunes 12 de Octubre.

Aún quedan algunos lugares en los cursos para llegar al tope máximo de 20 alumnos, así que quién envíe el pago inmediatamente obtiene el lugar disponible que aún no se ha pago.

¡Si aún no pudiste confirmar tu lugar, esta es la última semana!

Cualquier duda o problema estamos a sus órdenes.

Saludos!

Entradas populares