Foros abiertos para surforce-cms y surforce-social

Les copio el mail que mandé al foro del tallerphp5 que hicimos durante el año 2007:


"Estimados:


Estoy reorganizando los proyectos, ya habrán escuchado de "surforce-social" (la misma idea de "surforce-cms" pero en otro contexto). Para empezar a definir un nuevo criterio, cerraré este foro y crearé uno público para todos los que quieran participar (el commit sobre el svn seguirá siendo restrictivo según demostrada valía para contribuir).


Desde ya agradezco la participación de todos e invito a que si desean seguir participando libremente (en cualquiera de los proyectos abierto), se den de alta voluntariamente.

Un abrazo a todos, empezaremos el año 2008 con cambios, como debe ser ;-)"


Así seguiremos con los demás proyectos, aportando mi experiencia para ayudar a ser de "incubadora" usando como base Zend Framework y apoyar de esta forma el desarrollo de nuestra comunidad compartiendo entre todos los avances que hagamos en nuestros proyectos abiertos.

Actualmente tenemos:
Y tengo pendiente que se postule algún voluntario para ser el desarrollador principal de:
Bienvenidos todos, sigamos trabajando y aprendiendo juntos ;-)

Nuevo proyecto: "surforce-social"


Bien, lanzamos nuevo proyecto y este estará relacionado con las redes sociales de contactos, tan en auge en este momento entre las empresas del rubro "web". Nuestro proyecto comunitario inicial fue suforce-cms, que aunque su desarrollo sigue lento y la participación de los colaboradores es muy esporádica, se mantiene activo y se está usando como base para otros proyectos que necesiten de una estructura inicial para proveer un servicio de tipo CMS y a su vez para empezar a desarrollar con Zend Framework (evitando involucrase en estructuras extremadamente complejas como puede ser Joomla, Drupal o Mambo).

En este caso, tomaremos otro tema para este proyecto, y son la redes sociales. Conozco a muchas empresas que quieren o están embarcadas en proyectos de desarrollo de este tipo de productos (algunas hasta han recibido millones de dólares en inversión), y no son pocas las veces que me han pedido para desarrollar un producto con estas características. Así qué mejor para acaparar la atención de los desarrolladores que involucrarnos en un tema tan interesante como este ;-)

Pablo Morales, un colega uruguayo que está trabajando en Argentina, nos dará una mano con el proyecto: él será el teamleader del mismo y yo lo apoyaré desde el rol de project manager. Se tocarán muchos temas interesantes, como el hecho de desarrollar toda la comunicación interna del mismo entre los usuarios y a su vez la posibilidad de hacer chat entre ellos. Por consiguiente, mucha interfaz, mucho Ajax ;-)

Los últimos meses he venido investigado "desde dentro" varios sistemas, conociendo fortalezas y debilidades. Entre ellos puedo destacar a neurona, xing, wamba, badoo y recientemente contakme. En lo personal, no los veo extremadamente complejos (tampoco soy un experto en el desarrollo de este tipo de sistemas), y a muchos de ellos les faltan muchas funcionalidades que considero básicas, o que directamente tiene uno pero que falta en el otro, y que juntos se complementarían.

Veremos cómo nos va, desde ya están todos invitados a participar, y espero que el tema interese. Estaremos estos días definiendo la estructura y la arquitectura base para trabajar.

PD: ¿cómo nos va a ir? Ni idea, pero espero que aprendamos algo en el camino, como nos pasó con el primero ;-)

Foro en español sobre Zend Framework


Les comento la existencia de un foro en español para concentrar consultas, novedades y proyectos en nuestro propio idioma sobre Zend Framework. Este foro es parte de un movimiento de la empresa Zend para crear un foro por idioma y así ayudar a difundir esta herramienta entre los desarrolladores PHP.

Espero que lo aprovechemos, no solo consultando, sino también respondiendo dudas.

"Filtro de parámetros en PHP5"

Estaba leyendo anieto2k (desarrollador web español, muy recomendado) y comenta en un artículo la nueva forma de filtrar parámetros que nos brinda PHP5.

Transcribo los ejemplos que me parecieron más claros que lo que dice la documentación oficial sobre el tema.

Comprobar y limpiar una variable POST

PHP 4

1  
<?php
2  
if (isset($_POST["submit"])) {
3       
$submit addslashes(strip_tags($_POST["submit"]));
4  }
5  
?>



PHP 5

1  
<?php
2  
3  
if( filter_has_var  INPUT_POST ’submit’)) {
4  
5     
$submit filter_input(
6        
INPUT_POST
7        
’submit’
8        
FILTER_SANITIZE_SPECIAL_CHARS);
9  
10  }
11  
?>



Validar email

PHP 4

1  
<?php
2  
3  $valida 
ereg("^([a-zA-Z0-9\._]+)\@([a-zA-Z0-9\.-]+)\.([a-zA-Z]{2,4})$",$email);
4  
5  if( !
valida ){
6     echo 
"El e-mail no es válido";
7  } else {
8     
// ...
9  
}
10  
11  
?>



PHP 5

1  
<?php
2  
if( filter_var('roberto@example.com'FILTER_VALIDATE_EMAIL )){
3     echo 
"El e-mail no es válido";
4  } else {
5     
// ...
6  
}
7  
?>



¿Alguna duda que hay que migrar urgentemente a PHP5? ;-)

Prueba de screencasts con Jing generando .swf

Bueno, recibí por fin un nuevo auricular con micrófono (no es nada del otro mundo, pero hasta que consiga otro de mejor calidad, salimos del paso) y estoy probando distintos programas "legales" (me resisto a usar software a través de "cracks").

Para mi primer screencasts estaba usando uno gratuito de Microsoft (Windows Media Encoder) pero no encuentro la versión vieja que usaba y la nueva consume demasiados recursos para mi gusto. Y por el momento estoy usando Windows XP para unos proyectos, así que más adelante volveré a GNU/Linux.







Buscando me encontré el proyecto Jing, así que lo estoy probando. Genera directamente archivos en formato flash (.swf) e inocentemente pensé que podía subirlo a Youtube directamente, algo que no es cierto ya que debo antes convertirlo a ".flv".

Por el momento subí el archivo .swf a mi servidor y lo incrusté en Blogger. Aparentemente funciona bien, pero me gustaría simplificar la operación y seguir subiendo los futuros screencasts a Youtube para que estén a disposición de todos.

¿Sugerencias? ¿Software para hacer screencasts que recomienden?

Soluciono estos detalles y esta semana empiezan a salir los screencasts como "por un tubo" ;-)

PD: También muchos usuarios me han sugerido en su momento la opción para bajarlos, pero creo que a través de youtube se puede llegar a más gente usando una infraestructura existente. Sé que el tamaño es reducido (tengo que jugar dentro de los 425x355 de Youtube para no distorsionar la imagen), tal vez se podría hacer otros de mayor tamaño, pero tendría que ver el ancho de banda y cómo quedaría posteriormente.

Screencasts sobre Zend Framework


Como muchos sabrán a través de este blog, hace un tiempo que estoy dedicándome a estudiar el Zend Framework (producto desarrollado por "la empresa de PHP"). La idea fundamental, motivado por grandes modas como Ruby On Rails, es generar un marco de trabajo de más alto nivel, así evitar la habitual programación artesanal de "una sola capa" (php con html embebido y programando sin uso de objetos).

Lo vivo en carne propia, no es sencillo aprenderlo ya que hay que entender antes muchos conceptos para luego lentamente ir comprendiendo el marco de trabajo para empezar a sacarle el provecho justo.

Actualmente me estoy apoyando en varios screencasts, que aunque están en inglés, son muy entendibles y te muestran paso a paso cómo empezar a construir la estructura de tu proyecto para poder usar el framework y aplicar el patrón MVC.

El primero es de Mitchell Hashimoto y la sección se llama Zend Framework Tutoriales donde este estudiante nos cuenta paso a paso y a través de código cómo instalar Zend partiendo de una estructura en cero (el nos invita luego a hacerle una donación a través de Paypal para apoyar sus estudios). El otro tutorial es sobre Zend_Registry, que nos permite entender cómo funciona la registración de variables para luego poder ser utilizada en distintas partes de nuestro sistema (funcionalidad similar a contar con variables globales pero sin los perjuicios de estas).

Los otros screencasts que estoy viendo, directamente como si estuviera en un curso ;-), son de la misma empresa Zend y están en la sección Webinar, y también tienen uno que inicia de cero, pero primero por los conceptos, explicando la estructura del framework (hay que registrarse primero en el sitio para poder verlo).

Próximamente voy a compartirles dos ayudas más:
  1. A pesar que existe el proyecto abierto surforce-cms que puede servir a cualquier desarrollador para empezar a conocer cómo funciona Zend Framework, voy a armar otro proyecto con el nombre "surforce-base" que contará con lo mínimo indispensable para empezar un proyecto de cero: Zend instalado, configuración básica, un ejemplo con conexión a la base de datos y comentados todos los pasos. Tengo pensado agregarle un detalle interesante: dejar configurado por defecto Smarty para poder aprovecharlo en esta estructura (ya que conozco muchas empresas que sus diseñadores usan templates para luego fácilmente pasarles el trabajo a los desarrolladores).
  2. Armar un screencasts basado en los anteriores que están en inglés, pero en nuestro idioma y profundizando un poco más los conceptos básicos de cómo trabajar con Zend, la parte de persistencia y usando Eclipse para la demostración.
Bueno, espero que les sea de utilidad y si tienen alguna sugerencia más que pueda aportarles y reducirles el nivel de dificultad para aprender a desarrollar con este framework, bienvenidos los comentarios en este post.

Dentro de poco novedades ;-)

Crear templates para consultas SQL

Los "templates" o "plantillas" nos sirven para disponer de una estructura base y agregarle solo la información que cambia o varía, evitando tener que volver a copiar código una y otra vez.

En el caso de HTML podríamos usar Smarty, lo que nos permite contar con archivos de extensión .tpl y separar el código de presentación del código que se encargaría de armar o recibir información de la lógica de nuestro sistema.

Me ha sucedido que en muchos proyectos relacionados con web y con PHP se tienen que trabajar intensamente con consultas sql, más allá del tema de usar o no una capa de abstracción para conectarse a la base de datos. En estas situaciones existe mucho trabajo del lado del rol de DBA para incorporar mucha lógica en el motor de base de datos, como ser restricciones de integridad, disparadores, vistas, etc. De la misma forma, muchas reglas del negocio se resuelven a través de complejas consultas SQL que escapan del entendimiento de muchos de los programadores tradicionales (cabe aclarar que un programador nace con un cerebro distinto al de un DBA; muchas veces odiamos a las bases de datos y todo lo relacionado con la teoría de conjuntos ;-)).

En estos casos conviene que las consultas vengan preparadas por el DBA y que el desarrollador solo tenga que ejecutarlas, en otros, directamente trabajar con vistas que nos oculten toda la complejidad del diseño de la estructura de datos. También se pueden aprovechar "procedimientos almacenados" para ejecutar consultas con solo entregar algunos parámetros.

Me ha sucedido en situaciones intermedias y menos complejas que me es útil manejar el concepto de templates pero aplicados a consultas SQL donde simplemente tengo almacenadas las consultas y les paso los parámetros que requieren para ejecutarse.

Un ejemplo sencillo sería:

SELECT * FROM usuarios WHERE id = 1

Donde si tuviera un código PHP tendría que hacer cosas como:

1  
<?php
2    
3  
function traerUsuario$id ){
4     
$sql "SELECT * FROM usuarios WHERE id = $id";
5  
6     
// ejecutar_sql( $sql );
7     // etc.
8    
9  
}
10    
11  
?> 



O alguna versión más POO como:

1  
<?php 
2  
3  
class Usuario{
4     function 
getId$id ){
5        
$sql "SELECT * FROM usuarios WHERE id = $id";
6        
// procesar consulta
7     
}
8  }
9  
10  
?> 



Ahora bien, ¿qué pasa si para todas mis tablas uso constantemente esta misma lógica, donde solo necesito cambiar el nombre de la tabla y mantengo siempre un campo id, y luego solo le paso distintos valores por parámetro?

Yo puedo procesar esta consulta como un template, armando el marco para la sentencia y luego sustituyendo las "marcas" por valores, simplemente así:

1  
<?php 
2  
3  $sql_one 
"SELECT * FROM %s WHERE id = %s ";
4  
$sql sprintf$sql_one"usuarios");
5  
6  
?>



Lo que sucede es que ahora tomará la sentencia sql y en cada %s ("s" por "String") sustituirá en orden por los valores que agregue a continuación, causando el resultado esperado:

$sql = "SELECT * FROM usuarios WHERE id = 1";

Y ahí podemos aumentar enormemente la complejidad de las consultas y podremos reutilizarlas todas las veces que queramos, más, si las tenemos almacenadas en un archivo aparte y que todo nuestro sistema las use. Llegado el caso, si hubiera que optimizarlas habría que modificar un solo archivo.

Otra cosa que se me ocurre es algo más parecido al patrón de diseño ActiveRecord, que nos solucionaría un poco la vida con la operación de nuestras clases de persistencia de objetos.

Por ejemplo, podría crearme una clase Persistente que fuera así (usaré PHP4 para demostrar que no hace falta gran uso del lenguaje para implementar la idea):

1  
<?php 
2  
3  
require_once( 'BaseDeDatos.class.php' )
4  
5  class 
Persistente {
6     var 
$id;
7     var 
$tabla;
8     var 
$orden;
9  
10     var 
$sql_one "SELECT * FROM %s WHERE id = %s ";
11     var 
$sql_all "SELECT * FROM %s ORDER BY %s ASC";
12  
13     function 
getId$id ){
14        
$sql sprintf$this->sql_one$this->tabla$id );
15  
16        
$bd = new BaseDeDatos();
17        
$datos $bd->traerTodo$sql );
18        
$this->cargarDatos$datos );
19     }
20     function 
cargarDatos$datos ){
21        foreach( 
$datos as $key => $it ){
22           
$this->$key $it;
23        }
24     }
25     function 
getAll(){
26        
$sql sprintf$this->sql_all$this->tabla$this->orden );
27  
28        
$bd = new BaseDeDatos();
29        
$datos $bd->traerTodo$sql );
30        return 
$datos
31     
}
32  } 
33  
34  
?>



¿Bien, y cómo se usaría? Me creo mi clase concreta de persistencia de objetos, por ejemplo Usuario, y simplemente defino la información particular de la misma:

1  
<?php 
2  
3  
require_once( 'Persistente.class.php' );
4  
5  class 
Usuario extends Persistente {
6  
7     function 
Usuario() {
8        
$this->tabla "usuarios";
9        
$this->orden "id";
10     }
11  } 
12  
13  
?>



Y listo, no debo decirle nada más. Ahora solo me basta usarla de esta forma:

Si quiero traerme a todos los usuarios

$usuario = new Usuario();
$datos = $usuario->getAll();


Y si quiero traerme solo a un usuario particular, basta con que la base de datos del usuario tenga los campos id, nombre y apellido para hacer dinámicamente lo siguiente:

$usuario = new Usuario();
$usuario->getId(1);

echo
"Mi nombre es {$usuario->nombre} y mi apellido
es {$usuario->apellido}"
;


Y lo más interesante es que en situaciones donde lo genérico puede quitarnos libertad de acción, simplemente con sobreescribir los valores de los atributos definidos en la clase Persistente pero del lado de la clase Usuario resolvemos algunas limitaciones:

1  
<?php 
2  
3  
require_once( 'Persistente.class.php' );
4  
5  class 
Usuario extends Persistente {
6  
7     function 
Usuario() {
8        
$this->tabla "usuarios";
9        
$this->orden "id";
10  
11        
// Agregamos un JOINs con otra tabla
12        
$this->sql_all "SELECT * FROM %s as u, 
telefonos as t WHERE u.id = t.idUsuario ORDER BY u.%s, t.id ASC"
;
13     }
14  }
15  
16  
?> 



Mmm... creo que hoy me fui muy lejos divagando... más adelante les comparto un ejemplo completo que incluye persistencia en todos sus casos (update, delete, etc).

Más información

- Manual oficial, comando sprintf

Presentación: "Construyendo Entornos de Desarrollo Escalables"

Buscando presentaciones sobre "gestión ágil", metodologías y en concreto sobre Scrum, me encontré con esta de casualidad. Muy interesante, se las comparto:

"Surforce CMS": nueva lista de tareas pendientes

Estoy en estos momentos ingresando en una planilla de Google Docs la lista de tareas pendientes a realizar sobre el CMS que estamos desarrollando de forma colaborativa, con el simple objetivo de aprender entre nosotros a usar Zend Framework.

Si quieres participar -necesitamos revitalizar el equipo de trabajo- esta es tú oportunidad; deberás simplemente y por cuenta propia (hay mucha información en este blog de cómo hacerlo):
  1. Reconstruir localmente el CMS
  2. Elegir alguna de las tareas pendientes
  3. Implementarla
  4. Enviarme por mail el código nuevo (un "diff" mostrando lo que se hizo)
Si es correcto y funcional, lo que enviaste será agregado al repositorio y tú al grupo oficial de desarrollo para seguir aprendiendo en equipo.

Demuestra que puedes lograrlo y estás dentro. ¡Suerte!

Herencia de clases y el "Principio de Liskov" (actualizado 15/10/2007)


En realidad se llama "Principio de sustitución de Liskov" y el nombre completo es Bárbara H. Liskov (sí, hay mujeres en la informática y han hecho grandes aportes ;-)).

A grandes rasgos dice que el famoso "es un" (is_a) que generalmente usan los docentes para enseñarnos "herencia de clases" no es suficiente.

No basta con "ser" hay que "comportarse como tal".


Generalmente hago el mismo chiste cuando trato el tema en un curso: "un docente es una persona, pero no basta, debe comportarse como tal".

Un ejemplo más real: Sistema de liquidación de sueldos

Si tienes un sistema que liquida sueldos, una clase base Empleado (con atributos como "sueldo" que se usa para calcular su pago) y subclases Gerente, Desarrollador, Administrativa y Becario (asumamos que el último no recibe ninguna remuneración).

Usas polimorfismo y en tu clase Administracion tienes un método liquidarSueldo donde recibirás objetos de tipo Empleado. Bien, cuando en un momento recibes de tu lista de empleados un becario... ¿qué debe hacer el sistema? (ya que haces el cálculo en base al valor que viene en el atributo sueldo y este es heredado por todos desde la clase Empleado).
  1. ¿Emitir un comprobante impreso pero con valor 0?
  2. ¿Agregar un "if" preguntando si es becario, y no hacer nada?
  3. etc

Supongamos que el 1) no es aceptable por el gasto de papel y te piden que no se impriman (no tiene sentido), pasamos al punto 2), agregamos un "if".

¿No estamos "codificando a fuego" nuestro sistema para un comportamiento particular?

Estamos rompiendo el polimorfismo, justamente, el patrón estratégico más importante que tiene la POO. Cada vez que tenemos que cambiar nuestro código generamos nuevos costos y nuevos posibles errores.

Por eso cada vez nos cuesta más desarrollar un sistema, hasta que tenemos que tirarlo y desarrollar otro de cero... y empezamos otra vez con los problemas del mal diseño (code smell).

La base teórica

Los principios de diseño te dicen que "desarrolla cerrado al cambio y abierto a la extensión" (Principio Open/Closed, "Abierto / Cerrado").

Por ejemplo, tu código debe ser reutilizable (¿no es la idea esencial de la OO?) y con solo agregar código -sin tocar el existente- lograrás adecuarte a los cambios, a los nuevos requerimientos. No te olvides que nuestro código lo usan muchos otros objetos, si este cambiara, generaría un efecto en cadena, posiblemente, dejando de funcionar lo ya existente y tener que modificar más objetos.

Esta forma de "extensión" es agregar más clases a la herencia y el método liquidarSueldo no se modifica, pero si tu no haces correctas herencias, no puedes hacer lo primero, por lo tanto tu sistema se degradará en cascada.

Esta simple tontería el autor demuestra con muchos ejemplos que hacer "herencia por herencia", "por reutilizar código", no es suficiente y genera grandes problemas en los diseños.

Es una de las razones que me ven de mal humor cuando veo que implementan herencia a los golpes, prueba y error, con el argumento solo de "reutilizar código"

La conclusión final es...

El problema es que la herencia está mal formulada y que el Becario no se comporta como un Empleado, por lo tanto no puede ir en esa estructura jerárquica, de lo contrario nos va a obligar a desarmar nuestro sistema para tratar de ajustarlo a un comportamiento no adecuado (agregando condiciones explícitas para el mismo, hardcode) y este empezará a dejar de ser reusable.

No se puede hacer herencia por herencia, para reusar código. No se puede hacer herencia simplemente por que un "Becario es un Empleado", hay que estar seguro que además de "ser" se comporte como tal.

Nuestro becario, ya que no cobra una remuneración, no pude pasar por el sistema de liquidación de sueldos. La solución no es ajustar el sistema de sueldos para que lo permita.

Anexo otro artículo relacionado: Herencia Múltiple en PHP5

Nota: este post está basado en una discusión presentada en Foros del Web

Parece que pasamos a las ligas mayores: ¡Namespaces en PHP 5.3!

Me comenta mi colega Julio Viana que se enteró a través del blog de Inwe una muy buena noticia: la disponibilidad en la rama 5.3 de desarrollo de los tan necesitados namespaces. Fue toda una sorpresa, ya que se discutía si estaría recién en la próxima versión 6, pero veo que se han dado cuenta que era una vergüenza no contar con tan básica funcionalidad (los que conocemos lenguajes que se usan en arquitecturas como Java o .Net sabemos que sin esto no se puede vivir).

Si quieres saber de qué te hablo, puedes leer los siguientes post:

Próximo martes, curso en Universidad ORT




Bajar folleto

Recuerda: a partir del año que viene PHP4 dejará de tener soporte y se generará una importante demanda de desarrolladores con conocimientos de PHP5, no solo para migrar, sino, para rehacer sistemas y convertirlos a Programación Orientada a Objetos (sí, bien tarde, cuando todo el mundo ya habla "objetos").

Lo más importante de PHP5 no es el lenguaje en sí ni las miles de funciones que incorpora, es que podrás trabajar por fin "Orientado a Objetos" como con los "lenguajes mayores", al estilo de Java.

Puedes estar en la cresta de la ola o dejarla pasar.

PD: no digas que no te avisé.

"Surforce CMS": primer prototipo cerrado


Les comparto el siguiente correo que envié a la lista donde participamos todos los "teamleaders" del equipo de desarrollo del taller -piloto- on-line:

"Primer prototipo terminado

Bueno, se hicieron muchos cambios (están todos registrados en los comentarios del log de svn).

Revisión 76

Recomendación a todos:

Hacer un update del repositorio y volver a reconstruir la base de datos de cero a partir del archivo 6_TODO.sql (tiene la base de datos completa y ahora con soporte UTF8). También hay que configurar el proyecto en Eclipse para que soporte el mismo formato.

Felicitaciones a todos por su trabajo y dedicación, en especial a Julio Viana (mi mano derecha ;-)) que se quedó conmigo hasta las 3am para hacer los últimos arreglos y "cableados a fuego" para cumplir en tiempo y forma con las fechas de entrega.

El prototipo fue entregado al cliente para su evaluación. En base a las correcciones que sugieran seguimos con la segunda etapa que culmina con un segundo prototipo para el 31 de agosto.

Lo que hay que hacer mientras tanto es un fuerte refactoring para corregir todos los errores que cometimos y poder continuar limpiamente.


Nuevamente, felicitaciones a todos y adelante! ;-)"

Como había comentado en su momento este desarrollo es "real", para un cliente real, con exigencias reales. El proyecto lo estamos trabajando principalmente con mi colega Julio Viana, pero vamos asignando tareas para intentar compartir entre quienes quieran participar (solo hace falta ganas de aprender y dedicación) de la experiencia y así entre todos poder más fácilmente aprender herramientas nuevas, como en este caso, Zend Framework.

El sitio donde se encuentran los fuentes es en Google Code (alojado como un proyecto libre y de licencia GPL) y el sitio de pruebas está en Surforce.

Desde ya agradezco a todos los que se han mantenido activos hasta el momento, pues con la retroalimentación todos aprendemos.

Los teamleader's

De los cuatro grupos de desarrollo que participan hasta el momento (con desarrolladores a su cargo):


Y quiero hacer menciones especiales a:

El "Robin" que todo "Batman" necesita, el mano derecha que se encarga de encontrar soluciones mágicas para tratar de cumplir con las fechas propuestas ;-)

A los colaboradores que han levantado el guante y participaron enviando código con funcionalidades que necesitábamos: Rodrigo Muñoz (que de ahora en más va a participar con nosotros) más todos los aportes de gurús latinoamericanos como Pablo Rigazzi (Ar) y Christopher Valderrama (Mx) que siempre nos aportan una luz cuando el camino de nuestro aprendizaje se hace más oscuro y no sabemos hacia donde ir.

Nuevamente, gracias a todos (espero no olvidar a nadie) y seguimos adelante, quedan aún dos meses para concluir con el taller ;-)

Si quieres participar, ya sabes qué debes hacer.

PD: me queda pendiente saludar y agradecer a cada uno de los desarrolladores de cada uno de los cuatro grupos de desarrollo, a no desesperar, quiero armar un post aparte sobre el tema ;-)

Faltan 24 días - Curso "Desarrollo de Sistemas Web con PHP 5" (duración: 4 meses)


Existe abundante información en este blog de lo que trata el curso, los temas que abordaremos , la forma de darlo, mi filosofía con respecto al desarrollo de sistemas y en particular sobre el mundo "PHP Profesional". Todo lo que recorreremos durante 4 meses se puede desprender perfectamente desde el primero al último de los artículos que publico regularmente aquí.

¿Entonces, qué puedo decir de nuevo? ;-)

Bien, desde ya que no hay un curso igual, no solo porque siempre trato de adecuarme al público que tengo en frente y tratar de canalizar todas sus expectativas, sino porque yo también aprendo durante el proceso de cada dictado, obteniendo más experiencia, conocimientos, variando las herramientas... el mundo cambia rápidamente y nosotros no podemos estar ajenos a ello.

En la primera versión del curso de este año, que ya casi termina (20 de agosto entrega de obligatorios y defensas), la propuesta fue desarrollar un sistema similar a Twitter (aquí el mío), buscando con ello que no solo "programen"... que entiendan lo que involucra "desarrollar sistemas", conocer el mercado y casos de éxito, entender qué es "Web 2.0" y qué no, plantear un negocio, definir una estrategia, ser rentables, los riesgos que involucra, cómo dividir los problemas en pequeñas partes, o cómo trabajar en equipo apoyados con herramientas especializadas para ello, trabajo a distancia, conceptos de Ingeniería de Software, y un largo etcétera.

Para la segunda versión del curso -Setiembre 2007- estoy manejando varias actualizaciones, entre ellas agregar una introducción a Zend Framework que incluye abordar en la práctica el patrón MVC (para que se vayan con lo último que se está trabajando en el mercado mundial), y como obligatorio ya estoy evaluando solicitar la implementación de un sistema de "contactos personales" (del estilo Match.com o Yahoo.com) que involucra muchos puntos interesantes y desafiantes (además de los clásicos, mayor incorporación de Ajax para las interfaces, el desarrollo de chats entre usuarios, mayor trabajo en equipo tratando de emular un proyecto real con varios desarrolladores en paralelo, etc).

En los próximos días más novedades... pero ve reservando ya tu lugar en Universidad ORT ;-)

Surforce-CMS: están disponibles los requerimientos y las primeras tareas

Se encuentra disponible en el wiki del proyecto información sobre los requerimientos del sistema y ya se hizo el primer contacto con cada grupo de desarrollo que se armó durante el taller.

Aquí es la parte donde los que se quedaron por el camino o perdido la oportunidad de participar puedan incorporarse a través de una "demostrada valía" ;-)

Quienes puedan enviarme mejoras, correcciones, funcionalidades prontas de nuestra lista de pendientes serán integrados como miembros activos del proyecto.

Les hago copia del mail que les envié a todos los líderes con las asignaciones de tareas:

Primeras asignaciones que deben estar prontas antes del 15 de agosto.

Muchas de ellas son triviales y se hace siguiendo las pautas existentes en el proyecto actual.

La filosofía de los ABMs es lo más KISS que puedo sugerir ;-)

Como ejemplo, las noticias o los usuarios que están actualmente implementados: si eres un visitante anónimo puedes ver el listado de usuarios y las noticias existentes, no así el resto de operaciones. Si ingresas al sistema (iniciar sesión), inmediatamente después de ingresar aparecen las opciones de Altas, Bajas y Modificaciones (al clásico estilo RoR que podemos ver en cualquier ejemplo).

El primer prototipo del CMS (para el 15 de agosto) hará todas las operaciones necesarias siguiendo este camino, por lo que las tareas siguientes será seguir los ejemplos codificados (noticias y usuarios):

  • Grupo 1 - ABM de Contenidos
  • Grupo 2 - ABM de Secciones
  • Grupo 3 - ABM de Configuraciones
  • Grupo 4 - ABM de Menú

Por ejemplo: en el caso del ABM de Menús ya existe un menú (a la izquierda del todas las pantallas del CMS) pero en la actualidad es código estático en un template. Deberán crear toda la estructura para administrar dinámicamente un típico menú. Si el usuario está registrado le aparecerán las mismas opciones que en los demás ejemplos, alrededor del menú existente (Nueva opción, modificar opción, etc).

Toda la información base se encuentra en el Wiki: http://code.google.com/p/surforce-cms/wiki/CMSRequerimientos

Los detalles, dudas, diseños, directivas, restricciones, los discutiremos en este foro.

Como siempre, KISS, pragmáticos, traten de hacer la solución más simple, dividan el problema en pequeños problemas muy pequeños y repartan a sus integrantes pequeñas partes para luego integrarlas.

Tenemos una semana y media para terminar este prototipo y pasar a la segunda etapa ;-)

Si no aprendemos con esto, no aprendemos con nada.

Bienvenidos al mundo real ;-)

Perfectamente algún líder, desarrollador o equipo completo puede desertar o ser directamente descartado por su inacción. Por consiguiente, si quieres participar, es tu oportunidad de demostrar que puedes unirte colaborando con cualquiera de las necesidades del proyecto.

Espero vuestros comentarios ;-)

Final del TallerPHP5: Desarrollar un CMS usando PHP5 + Zend Framework

Como había anunciado en un post anterior, ya está toda la infraestructura base para empezar a trabajar en equipo sobre un mini-proyecto de CMS aplicando lo aprendido hasta el momento y agregando ahora un atractivo más: el famoso Zend Framework.

La idea es trabajar estos tres últimos meses (agosto, setiembre y octubre, aproximadamente) en un proyecto que ya está liberado como "Software Libre" (GPL) y que nos permitirá compartir conocimientos y experiencias sobre un tema que está siendo muy requerido por todos los desarrolladores, como es el uso del patrón de diseño MVC y un framework que nos ayude a ser cada vez más productivos evitando caer constantemente en la "programación artesanal".

En este momento ya existe un dominio para hacer pruebas y pueden ingresar al mismo con cualquier usuario de la lista y con la password "clave".

De ahora en más iré empezando a subir información de diseño en el sitio de hosting de Google (especialmente pensado para proyectos libres), armar la lista de pendientes por desarrollar, fechas para los entregables, deadlines, lista de bugs por corregir, etc, etc.

A pesar que existen 4 grupos de desarrollo (cada uno con un teamleader), mi idea es que de ahora en más cualquiera puede participar y ser dado de alta como un integrante del proyecto (con la posibilidad de hacer cambios en el SVN, participar en uno de los grupos existentes, integrar las listas de correo de coordinación, etc) lo podrá hacer simplemente demostrando interés y capacidad para trabajar en el proyecto.

¿Cómo participar?

Ahora cualquier usuario puede reconstruir localmente este proyecto. Si ese usuario me contacta con soluciones, mejoras, correcciones de bugs, funcionalidades que tenemos pendientes por desarrollar, haré una evaluación de las mismas y posteriormente será integrado a un grupo bajo la tutela de un teamleader.

Un buen lugar para empezar es la lista de tareas pendientes

Si quieres participar, esta es tu oportunidad de aprender con nosotros y ser famoso ;-)

Espero vuestros comentarios y/o sugerencias.

Apuntes: "Principios de Diseño Orientado a Objetos"

Volviendo a mis inicios, retomaremos el camino de los artículos que buscan reforzar determinados conocimientos o conceptos que en otras arquitecturas o lenguajes son tan comunes pero que muchas veces son desconocidos en el mundo PHP.

Teniendo en cuenta que PHP5 es una realidad que nos permite pasar a desarrollos más elaborados, con una Orientación a Objetos más robusta, es fundamental saber que existen "principios de diseño" que nos marcan el rumbo.

Aquí mis apuntes sobre estos temas (que en un futuro espero extenderme en detalle):

Principios de Diseño Orientado a Objetos
  1. SRP - Single Responsibility Principle (Principio de Responsabilidad Única)
  2. OCP - Open/Closed Principle (Principio Abierto / Cerrado)
  3. LSP - Liskov Substitution Principle (Principio de Sustitución de Liskov)
  4. DIP - Dependency Inversion Principle (Principio de Inversión de Dependencias)
  5. ISP - Interface Segregation Principle (Principio de Segregación de Interfaces)
Algunos apuntes encontrados en Wikipedia (inglés)
http://en.wikipedia.org/wiki/Single_responsibility_principle
http://en.wikipedia.org/wiki/Open/closed_principle
http://en.wikipedia.org/wiki/Liskov_substitution_principle

1. SRP - Single Responsibility Principle (Principio de Responsabilidad Única)


Enunciado formal: "Una clase debería tener solo una razón para cambiar"

2. OCP - Open/Closed Principle (Principio Abierto / Cerrado)


Enunciado formal: "Entidades de Software (clases, módulos, funciones, etc) deberían ser abiertas para la extensión y cerradas para la modificación"

3. LSP - Liskov Substitution Principle (Principio de Sustitución de Liskov)


Enunciado formal: "Subtipos deben ser sustituibles por sus clases bases"

4. DIP - Dependency Inversion Principle (Principio de Inversión de Dependencias)


Enunciado formal: "los clientes tienden a ser propietarios de las interfaces y aquellos que ofrecen los servicios las implementan"

5. ISP - Interface Segregation Principle (Principio de Segregación de Interfaces)

Enunciado formal: "Clientes no deberían depender de métodos que no utilizan"

Taller: concluida la segunda etapa - Proyecto "Clases Bases"

Cuando empezamos este "taller piloto" claramente no sabía cómo iba resultar ni todos los problemas que iban a surgir... aunque siempre supe por donde debía transitar y que sería evidente que cambiaría constantemente para ir ajustándome a los acontecimientos.

Esta segunda etapa estuvo concentrada en el trabajo en equipo, con teamleaders a cargo de pequeños grupos de desarrolladores y con un especial aditamento: la falta de experiencia en gestión de los líderes como a su vez en desarrollo POO de los dirigidos, y para peor, todos "a distancia".

El proceso fue lento y existieron muchos problemas que tuvimos que ir solucionando, pero finalmente llegamos al cometido: afirmar conocimientos a los novatos sobre los temas de programación orientada a objetos usando PHP5.

Todos sacamos -directa o indirectamente- conclusiones y adquirimos experiencia en muchos temas: trabajo a distancia, educación a distancia, gestión a distancia, colaboración, versionado, comunicación, herramientas colaborativas, etc.

Como "producto" de ese proceso tenemos un proyecto libre llamado "Clases Bases", que obviamente están invitados a probarlo, estudiarlo, preguntar, criticar y hasta continuar desarrollando.

Próximamente comentaré la tercer y última etapa del taller (serán los últimos 3 meses del mismo): desarrollar un proyecto libre todos los equipos juntos y usando Zend Framework.


¡Felicitaciones a todos! ¡Excelente trabajo!

A estar atentos de las novedades ;-)

Por fin: campañas para migrar definitivamente a PHP5

Hace un tiempo ya que critico nuestra propia actitud pasiva cuando argumentamos que no usamos PHP5 porque en la mayoría de los servidores de hosting solo tienen instalado PHP4.

Hay que entender que siempre "somos parte del problema o parte de la solución", por consiguiente, si quieres que la situación cambie, no consumas sus productos, quéjate, solicita cambios, nuevas características, has proselitismo, crea una "causa"... como sucedió ahora.

"Debemos pasar de los dichos a los hechos

De la misma forma, creo que nos hace falta tener más
"sentimiento de comunidad", como sucede habitualmente -hasta de forma exagerada- en el mundo GNU/Linux. No es posible que nos sigamos quejando que los proveedores de hosting siguen usando PHP4. Deberíamos hacer campañas para promover la migración a las nuevas versiones de PHP, pero fundamentalmente, incorporar en nuestros desarrollos las características avanzadas del lenguaje, e invitar a usarlo como si fuera una arquitectura, actualizar a nuestro equipo de desarrolladores, visitar empresas, universidades, etc."

Artículo escrito en Nov / 2006 - "debemos profesionalizarnos"


No me canso de hablar del tema, de lo importante que es migrar a la versión 5 del lenguaje, pero fundamentalmente "migrar" la mentalidad de los programadores clásicos de PHP hacia niveles similares de madurez que cuentan los desarrolladores en arquitecturas como Java o .Net (no sirve si cambiamos de lenguaje pero seguimos programando igual, seguir rechazando la programación orientada a objetos... ya ni se discute que sirve).

Hace pocos días parece que el mundo se puso de acuerdo y han surgido dos noticias muy importantes. Primero, la creación de un movimiento que empuja la migración definitiva hacia PHP5 (exponiendo todas sus ventajas, buscando el apoyo de empresas, colocando una fecha límite, etc) y segundo, la noticia oficial de que PHP4 dejará de ser desarrollado (este será el último año).

Contundente la frase final del anuncio: "Por favor, dedica lo que queda del año para hacer que tus aplicaciones puedan funcionar sobre PHP5"

Claro, si PHP5 hace varios años que está disponible como una versión estable y ahora se anuncia que en el correr del fin de este año -principios del próximo- estaría disponible la primer versión 6 (PHP6)... ¿como puede ser que todavía se maneje la excusa de usar PHP4 porque "es más estable, seguro y probado"?


Espero que cuando solo exista PHP5 y PHP6 empiece a usarse, la comunidad no cometa el mismo error con el cambio a PHP7.

Debemos madurar, lo único constante es el cambio (y hay que asumir riesgos).



PD: hace pocas semanas también fue lanzado Zend Framework 1.0. Me pregunto, tú, desarrollador profesional de PHP... lo empezaste a probar? Donde quieres estar hoy? y mañana?

Capturando el pizarrón de mi clase


Hace mucho tiempo tengo la costumbre de sacar fotos con mi celular como forma rápida de documentar lo que se puede escribir en un pizarrón durante una discusión de diseño, tanto en el trabajo como en el dictado de un curso.

Para mis cursos

En mi caso particular sigo la premisa de "para improvisar hay que estar antes muy preparado", por lo cual cada clase me lleva muchas horas de trabajo pero que luego "en vivo" suelo ir adaptándola rápidamente a como van reaccionando mis interlocutores. No es la primera vez que de camino a la universidad voy -en el mismo ómnibus- haciendo correcciones con un lápiz a los ejercicios que ya tenía preparados, pues se me ocurrió que cambiando o hasta quitando determinados detalles podía simplificar aún más el entendimiento de los conceptos.

El problema luego es que siempre trato de seguir relacionando los temas y los ejercicios unos con otros, y necesito una forma rápida de documentar estos cambios de último momento (se me complica dictar una clase, hacer cambios en el aire, para luego registrarlo a mano).

Si fuera el caso de una empresa lo ideal es que luego de una reunión escribir un acta (para registrar lo sucedido y hasta donde se llegó) y agregar todas estas fotos.

En este caso les muestro como ejemplo lo que hicimos en la clase pasada de mi curso de PHP5

Nota: los dibujos no están muy prolijos pues la idea es ser progresivo con los ejemplos, ir borrando y agregando nuevos detalles, o haciendo comentarios al margen sobre temas que necesitan ser reforzados en el momento (aunque de ahora en más voy a poner un poco más de cuidado así las fotos salen mejor ;-) ) :


Aquí, continuando con la primera foto que explica el concepto de un diseño básico de 3 capas, explico cómo sería la codificación a partir de un módulo listado_clientes.php que hiciera uso de cada capa del sistema, empezando por la "presentación". El módulo invocaría a la clase HTML del paquete "presentación", que a su vez invoca a la clase Mensaje del paquete "dominio", para luego invocar a la clase BaseDeDatos del paquete "persistencia" (para más información buscar en este mismo blog por "diseño 3 capas").

Aquí definimos una estrategia del tipo "divide y vencerás" para enfrentar la larga lista de requerimientos del trabajo obligatorio de desarrollo que deben culminar para aprobar el curso de actualización profesional. No sé si se dan cuenta, pero deben desarrollar un primer prototipo con la funcionalidad base de Twitter, más toda otra serie de requisitos (patrones de diseño, 3 capas, Ajax, plantear mejoras al sistema original, etc).

Tratando de mostrar el proceso completo del desarrollo de un sistema orientado a objetos usando UML, se parte de un diagrama de Casos de Uso (ya borrado del pizarrón), un Diagrama de Paquetes, Diagrama de Clases y el -en mi opinión- más importante para todo desarrollador profesional: el Diagrama de Secuencia.

Y aquí, como "la cereza de la torta", me voy abruptamente al borde del abismo de la improvisación y ya engancho con la introducción al tema de "Principios de Diseño de la Orientación a Objetos" de la mano del más revelador de todos: "Principio Abierto / Cerrado (Open/Closed)".

La memoria trabaja mejor con imágenes

Creo que estas fotos son muy útiles para nuestro uso profesional. La memoria trabaja en base a imágenes y asociaciones, y a veces uno no recuerda tan fácilmente a partir de nuestras propias transcripciones escritas de lo que ve (siempre te pierdes algo), pero a mi me pasa que una sola imagen puede hacerme recordar exactamente todo lo que se habló en ese momento.

Pruébalo en tu próxima reunión que hagan uso de un pizarrón, y luego súbelo al Wiki de la intranet de tu organización para documentar y compartir la experiencia ;-)

TallerPHP: Se inició el primer contacto con los líderes de los equipos

Sepan disculpar mi demora con el avance del taller, pero se han suscitado muchos compromisos juntos que me han dejado poco tiempo libre.

Pero bueno, más real no puede ser el taller, ¿cuando han visto un Gerente que no esté ocupado y que sobrecargue a sus "Team Leaders"? ;-)

Como habrán visto en la planilla, cada líder tendrá 2 misiones: desarrollar un sistema particular y desarrollar un sistema en conjunto con los demás equipos.

Por consiguiente, empezaremos con el proyecto común para iniciar el trabajo en equipo, definir la comunicación entre nosotros y posteriormente la asignación de tareas de cada uno de sus recursos (desarrolladores).

"Clases Base"

La idea es desarrollar una estructura base de clases como cuentan en el lenguaje Java: clase Array, String, Integer, etc. Cada líder irá tomando un conjunto de clases y asignará a sus recursos una para desarrollar. Puede ser una clase entera, o compartir con ellos el desarrollo parcial de cada parte (un método cada uno).

Donde tomaremos las clases es en www.gotapi.com, sección J2SE 1.5 (especificación del lenguaje Java) y navegando en el arbol (izquierda): java.lang

De ahí (documentación de la API) sacaremos la estructura base de cada clase. Antes de iniciar cualquier desarrollo debemos estar coordinados entre los líderes y su gerente de proyectos.

Está demás decir que los desarrolladores de cada equipo vayan "calentando los motores", pues en poco días recibirán el llamado para unirse a las filas.

Los escucho: ¿preguntas, dudas, crisis? ;-)

Taller: Ya se encuentran armados los equipos de desarrollo



Espartanos, desayunad bien. ¡Porque esta noche cenaremos en el infierno!

Mil disculpas a todo el mundo, pero la verdad que me he envuelto en muchos compromisos que me han quitado tiempo para dedicarme a terminar de definir el taller. Por suerte, luego de analizarlo varios días tengo ya pronto los equipos de desarrollo con cada uno de sus integrantes.

Están creados los foros en Google Groups, existe uno privado exclusivo para los líderes (donde impartiré las órdenes y las sugerencias para gestionar sus equipos) y luego uno para cada equipo así pueden trabajar con su líder.

Se encuentra una planilla pública donde se puede visualizar la lista de grupos e integrantes y los sistemas que se deberán desarrollar.

En las próximas horas me estoy comunicando con cada líder para empezar a trabajar en los requerimientos de los sistemas.

¡Bienvenidos, seguimos con la segunda parte del Taller Piloto de PHP5!

Solución Semana 4: "Sistema Modular" (V de V)

El punto V de los requerimientos de la Semana 4 decía:

Seguridad: el sistema actual confía de los datos que recibe, lo cual puede convertirse en un problema de seguridad a través de un ataque del tipo "sql injection". Proponer una solución a este problema.

En el propio manual oficial de PHP hay un capítulo exclusivo sobre Seguridad (IV) y dentro existe una sección sobre Bases de Datos y una sub-sección que dice concretamente Inyección de SQL:

La Inyección Directa de Comandos SQL es una técnica en la cual un atacante crea o altera comandos SQL existentes para exponer datos escondidos, o sobrescribir datos críticos, o incluso ejecutar comandos del sistema peligrosos en la máquina en donde se encuentra la base de datos. Esto se consigue cuando la aplicación toma información de entrada del usuario y la combina con parámetros estáticos para construir una consulta SQL. Los siguientes ejemplos, desafortunadamente, están basados en historias reales.

Esta parte la vivimos la comienzo de la puesta en producción del sistema de registro de usuarios para este taller piloto de PHP5, donde uno o más saboteadores intentaron borrar la base de datos usando este tipo de ataque.

Veamos qué podemos hacer para reforzar la seguridad

La esencia es evitar completamente que los datos lleguen en bruto desde la url o de un formulario hacia la base de datos, verificando cada dato y asegurando que la construcción final del SQL no sea alterada para modificar el funcionamiento normal de nuestro sistema.

La lista a continuación no es extensa, solo intenta ser una introducción al tema:

  1. Verificar los tipos de datos que se reciben: controlar cada uno de los parámetros según el tipo de dato que se espera. Si es un campo numérico del formulario se deberá verificar que sus datos sean así, numéricos, evitando que agreguen una cadena de texto (String) con código SQL maligno.
  2. "Escapear" caracteres riesgosos: comilla simple ('), comilla doble ("), barra invertida (\) y NULL (el byte NULL). Hay que tener en cuenta que si los datos son grabados en la base de datos con "caracteres escapeados" (addslashes), hay que hacer el proceso inverso para presentarlos en pantalla (quitando las "\" con stripslashes).
  3. Agregar procesos que verifiquen sentencias SQL: otra forma de reforzar es verificar que cada cadena de texto que debamos ejecutar en la base no contenga determinadas palabras que no estamos usando para una determinada operación. Por ejemplo, si deseamos obtener datos sin modificar la base (SELECT) no deberíamos permitir que se ejecutaran comandos como "INSERT", "DELETE" y "UPDATE" (ni ningún otro que permita saber información interna ni de las estructuras de las tablas), y/o directamente prohibir que se puedan agregar "AND", "OR" o un ";" (lo que permite agregar a continuación otra sentencia SQL).
Estimo que la mejor forma de tener controlado este proceso es separar los datos por un lado, la generación de las consultas SQL por otro, y evitar tener un proceso genérico donde todo pase por el mismo lugar.

Algunos ejemplos

Nota: si la imagen no se visualiza claramente, presionar sobre ella para ampliarla.


Validar el tipo de valor que recibo por parámetros: para luego pasarlo al armado de la consulta.

En este caso esperamos que los valores posibles son Null o un Integer, si es el primero hacemos un "SELECT * FROM usuarios" y si es el segundo esperamos que sea un número de usuario. Verificamos que no sea nulo, y luego nos aseguramos que sea un valor numérico.

Crear un método "quote" en la clase BaseDeDatos:
el término quote se usa en muchos frameworks a la hora de crear un proceso que "escapee" (si alguien conoce castellanización que avise) las variables que se usan en una sentencia SQL.

En este caso verificamos la existencia de funciones que ya realizan automáticamente el "escaping", de lo contrario lo hacemos manualmente. De la misma forma existe una función de PHP específica para la base MySQL, lo cual nos ataría a futuro si queremos cambiar de base de datos.

Separar los datos de la consulta sql:
para poder procesar fácilmente cada dato.


En este caso tomamos nuestro método ejecutarSQL, que solo recibía una sentencia sql, y que ahora recibe por un lado el esqueleto de la sentencia y por otro los valores a ser insertados en la construcción de la sentencia final. Su funcionamiento es similar al de cualquier sistema de templates.


Aquí pasamos por referencia (&) la sentencia original para modificarla, sustituyendo nosotros cada uno de los valores en los lugares que corresponde insertar y ejecutando la "sanitización" de cada valor con el método "quote".


Nuevamente la definición del método "quote".

Este es un ejemplo de cómo funcionaría en una situación donde queremos solo obtener datos de la base de datos, definiendo primero un array de datos asociando la clave PAR01 (parámetro 1) y el valor recibido por la url. Luego, se armar el template SQL y colocando el PAR01 donde debería ir para que el proceso de armado sustituya de forma segura por el valor correspondiente luego de "desinfectarlo".

Este es otro caso, el más complejo, donde hay alteración de la base de datos y existe más de un parámetro. La lógica es simple, y como afirmé más arriba, es lo mismo que utilizar un sistema de templates o plantillas, defines una marca o variable que será sustituida por el valor que tu asignes, manteniendo el resto sin alterar.

Validación con Javascript


Finalmente, no quiero olvidarme comentar el tema de las validaciones desde el propio cliente con Javascript (lo vi comentado en una de las soluciones entregadas por algunos participantes del taller). La solución de este lado del proceso puede considerarse un complemento, pero no la solución más segura. Estimo que cualquier usuario que quiera hacer un ataque de este tipo lo primero que probará si encuentra controles del lado del cliente es deshabilitar el Javascript en el navegador. Sirve como complemento, pero no es la mejor opción ni la más segura.

La recomendación final

El tema de la seguridad es una tarea muy especializada, no sirve agregar un par de métodos con algunas funciones, habría que auditar constantemente todo el código nuevo que se agrega al sistema. Para este caso particular, el SQL Injection, como afecta exclusivamente a la persistencia de datos en un motor de base de datos, lo mejor es tener una "capa de abstracción" de terceros que tenga bien resuelta toda esta problemática. Por ejemplo, podemos usar MDB2 del framework Pear o directamente PDO que incorpora el propio PHP5.1 en adelante.

Documentación relacionada
Ya se encuentra la planilla actualizada, como así también el repositorio con los fuentes y como siempre, en los comentarios de esta entrada se pueden sacar las dudas sobre este tema :-)

PD: en las próximas horas se estarán haciendo los anuncios con los equipos de desarrollo armados. En primera instancia estarán involucrados los participantes que sobrevivieron todo el proceso del taller (¡Felicitaciones! ;-)) y posteriormente iré analizando la incorporación de más colaboradores en base a la evolución de las primeras pruebas y teniendo en cuenta la lista de registrados al taller.

¡POR FIN, CERRAMOS LA SEMANA 4!

Entradas populares