<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CEAARnkzcCp7ImA9WxNUFUs.&quot;"><id>tag:blogger.com,1999:blog-19450532</id><updated>2009-11-07T00:59:07.788-02:00</updated><title>PHP Senior</title><subtitle type="html">Como convertirse en un "Desarrollador PHP Senior" y no morir en el intento... escrito por &lt;u&gt;&lt;a href="http://enriqueplace.blogspot.com"&gt;Enrique Place&lt;/a&gt;&lt;/u&gt; de &lt;u&gt;&lt;a href="http://www.surforce.com"&gt;SURFORCE&lt;/a&gt;&lt;/u&gt;</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://phpsenior.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://phpsenior.blogspot.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>enrique_place</name><uri>http://www.blogger.com/profile/15452998349449419148</uri><email>enriqueplace@gmail.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>261</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/phpsenior" type="application/atom+xml" /><feedburner:emailServiceId>phpsenior</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry gd:etag="W/&quot;D0YFQnc9eSp7ImA9WxNVFUs.&quot;"><id>tag:blogger.com,1999:blog-19450532.post-247829405459810595</id><published>2009-10-26T09:00:00.004-02:00</published><updated>2009-10-26T11:51:53.961-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-26T11:51:53.961-02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="debug" /><category scheme="http://www.blogger.com/atom/ns#" term="PHP5" /><title>Excepciones: Cómo forzar un "backtrace" en un sistema que no usa try/catch</title><content type="html">Para los que venimos de haber trabajado, aunque sea académicamente, en otros lenguajes/plataformas como Java o .Net, &lt;a href="http://ar.php.net/manual/en/language.exceptions.php"&gt;trabajar con excepciones&lt;/a&gt; es un tema de todos los días. Al principio, cuando uno está aprendiendo y surge &lt;span style="font-weight:bold;"&gt;el primer volcado de una excepción&lt;/span&gt; (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:&lt;span style="font-weight:bold;"&gt; el "&lt;a href="http://en.wikipedia.org/wiki/Backtrace"&gt;backtrace&lt;/a&gt;"&lt;/span&gt; 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.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Recuerdo cuando probé por primera vez PHP5 (una beta) &lt;/span&gt;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 &lt;span style="font-weight:bold;"&gt;los try / catch no funcionan a menos que nos aseguremos que la función que estamos usando retorne una excepción&lt;/span&gt;, 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');&lt;br /&gt;&lt;br /&gt;A pesar de mi desilusión, esto no era problema para los sistemas que hacíamos de cero de ahora en más, pero...  &lt;span style="font-weight: bold;"&gt;¿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? &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;Bien, hace un tiempo que lo buscaba y &lt;a href="http://www.forosdelweb.com/f68/posible-saber-desde-que-metodo-ha-sido-llamado-otro-704237/#post2945294"&gt;lo encontré por accidente en un foro&lt;/a&gt;, así que les comento la forma de uso y cómo lo pueden aplicar a sus sistemas "legacy":&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="Php"&gt;&lt;br /&gt;class Debug&lt;br /&gt;{&lt;br /&gt;    public static function getBacktrace()&lt;br /&gt;    {&lt;br /&gt;        $ex     = new Exception();&lt;br /&gt;        return $ex-&gt;getTrace();&lt;br /&gt;    }&lt;br /&gt;    public static function getBacktrace2String()&lt;br /&gt;    {&lt;br /&gt;        $ex    = new Exception();&lt;br /&gt;        $trace = $ex-&gt;getTrace();&lt;br /&gt;&lt;br /&gt;        /* Elimino la primer linea que &lt;br /&gt;           siempre es la misma y &lt;br /&gt;           hace referencia a la &lt;br /&gt;           invocación de esta clase */&lt;br /&gt;        &lt;br /&gt;        array_shift($trace); &lt;br /&gt;&lt;br /&gt;        $trace_ret = '';&lt;br /&gt;        $linea = 0 ;&lt;br /&gt;        foreach ($trace as $item){&lt;br /&gt;&lt;br /&gt;            $linea++;&lt;br /&gt;&lt;br /&gt;            $trace_ret .= &lt;br /&gt;                "(".$linea.")"&lt;br /&gt;                ."[file: ".$item['file']&lt;br /&gt;                .":".$item['line']."]"&lt;br /&gt;                ."[".$item['class']&lt;br /&gt;                .$item['type']&lt;br /&gt;                .$item['function']."]"&lt;br /&gt;                ."[args: " &lt;br /&gt;                .implode(',',$item['args']) &lt;br /&gt;                ."] ";&lt;br /&gt;        }&lt;br /&gt;        return $trace_ret;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="Php"&gt;&lt;br /&gt;/* Método modificado de la clase Log */&lt;br /&gt;&lt;br /&gt;public static function setError()&lt;br /&gt;{&lt;br /&gt;   $backtrace      = Debug::getBacktrace2String();&lt;br /&gt;   self::logToFile('errores.log',$backtrace);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;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:&lt;br /&gt;&lt;br /&gt;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-&gt;getProveedor][args: 111,1234]  &lt;br /&gt;&lt;br /&gt;Lo cual si indentamos en base a los &lt;span style="font-weight:bold;"&gt;(n)&lt;/span&gt; que son los saltos que va dando la ejecución, &lt;br /&gt;&lt;br /&gt;2009-10-26 09:40:11 &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;(1)&lt;/span&gt;[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] &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;(2)&lt;/span&gt;[file: /var/www/public/sys/send.php:48][Prueba-&gt;getProveedor][args: 111,1234]  &lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;De todas formas, &lt;span style="font-weight:bold;"&gt;esto es un "parche"&lt;/span&gt;, 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".&lt;br /&gt;&lt;br /&gt;Espero que lo prueben en sus sistemas y les sea de utilidad ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19450532-247829405459810595?l=phpsenior.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpsenior/~4/AlRftoVGFvw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phpsenior.blogspot.com/feeds/247829405459810595/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=19450532&amp;postID=247829405459810595" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/247829405459810595?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/247829405459810595?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phpsenior/~3/AlRftoVGFvw/excepciones-como-forzar-un-backtrace-en.html" title="Excepciones: Cómo forzar un &quot;backtrace&quot; en un sistema que no usa try/catch" /><author><name>enrique_place</name><uri>http://www.blogger.com/profile/15452998349449419148</uri><email>enriqueplace@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="03921750821859760589" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://phpsenior.blogspot.com/2009/10/excepciones-como-forzar-un-backtrace-en.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0ECRXo7fSp7ImA9WxNVEkk.&quot;"><id>tag:blogger.com,1999:blog-19450532.post-2455922980164604365</id><published>2009-10-22T19:59:00.004-02:00</published><updated>2009-10-22T20:14:24.405-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-22T20:14:24.405-02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ofertas de trabajo" /><category scheme="http://www.blogger.com/atom/ns#" term="Argentina" /><title>Propuesta de trabajo: Desarrollador PHP / PHP5 / POO / MySQL (Argentina)</title><content type="html">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 ;-))&lt;br /&gt;&lt;br /&gt;Copio el aviso:&lt;br /&gt;&lt;br /&gt;"Incorporaremos a nuestro equipo de desarrollo 2 personas con el siguiente perfil:&lt;br /&gt;&lt;br /&gt;Requisitos:&lt;br /&gt;&lt;br /&gt;- Experiencia comprobable en PHP&lt;br /&gt;- Programación PHP 5 orientada a objetos (POO avanzado)&lt;br /&gt;- Base de datos MySQL 5&lt;br /&gt;&lt;br /&gt;Deseables (no excluyente):&lt;br /&gt;&lt;br /&gt;- Frameworks PHP (preferencia Zend)&lt;br /&gt;- Frameworks JavaScript (preferencia JQuery)&lt;br /&gt;- Manejo de entornos Linux&lt;br /&gt;- AJAX (XML y JSON)&lt;br /&gt;- Maquetado en XHTML/CSS, HTML, WML&lt;br /&gt;- Estudiante avanzado o graduado de carreras de informática o similar&lt;br /&gt;- Capacidad de trabajo en equipo.&lt;br /&gt;- Compromiso con calidad de productos y manejo de tiempos.&lt;br /&gt;&lt;br /&gt;Empresa del rubro mobile (SMS/MMS/WAP),&lt;br /&gt;&lt;br /&gt;Zona Palermo / Belgrano"&lt;br /&gt;&lt;br /&gt;Tienen mi absoluta reserva.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19450532-2455922980164604365?l=phpsenior.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpsenior/~4/06ztrxEhk6E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phpsenior.blogspot.com/feeds/2455922980164604365/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=19450532&amp;postID=2455922980164604365" title="4 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/2455922980164604365?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/2455922980164604365?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phpsenior/~3/06ztrxEhk6E/propuesta-de-trabajo-desarrollador-php.html" title="Propuesta de trabajo: Desarrollador PHP / PHP5 / POO / MySQL (Argentina)" /><author><name>enrique_place</name><uri>http://www.blogger.com/profile/15452998349449419148</uri><email>enriqueplace@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="03921750821859760589" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://phpsenior.blogspot.com/2009/10/propuesta-de-trabajo-desarrollador-php.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIHQHszfyp7ImA9WxNVEkk.&quot;"><id>tag:blogger.com,1999:blog-19450532.post-5388627758274609050</id><published>2009-10-22T19:40:00.004-02:00</published><updated>2009-10-22T19:55:31.587-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-22T19:55:31.587-02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="cursos" /><category scheme="http://www.blogger.com/atom/ns#" term="POO" /><category scheme="http://www.blogger.com/atom/ns#" term="surforce" /><category scheme="http://www.blogger.com/atom/ns#" term="zend framework" /><title>Cursos SURFORCE: viento en popa!</title><content type="html">Sí, nuevamente estoy  poco en el blog, con mis colegas (&lt;a href="http://bolsadeideas.cl/zsamer/about/"&gt;Andrés Guzman&lt;/a&gt; y Nicolás Fornaro) estamos en pleno trabajo por &lt;a href="http://registracion.surforce.com/cursos"&gt;el dictado de los cursos&lt;/a&gt; ;-)&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;En este momento están activos los siguientes grupos:&lt;br /&gt;&lt;ul style="font-weight: bold;"&gt;&lt;li&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;Introducción  a Zend Framework (3 grupos, dos abiertos y uno privado)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="font-weight: bold;"&gt;&lt;li&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;POO para PHP5 (3 grupos, dos abiertos y uno privado intensivo)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="font-weight: bold;"&gt;&lt;li&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;Análisis y Diseño Orientado a Objetos (2 grupos)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="font-weight: bold;"&gt;&lt;li&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;Introducción a los Patrones de Diseño (1 grupo)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="font-weight: bold;"&gt;&lt;li&gt;&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;Taller Zend de Zend Framework (1 grupo)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;De todas formas, &lt;a href="http://registracion.surforce.com"&gt;les sugiero que se registren como usuarios&lt;/a&gt;, 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).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;En el caso de empresas&lt;/span&gt;, 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).&lt;br /&gt;&lt;br /&gt;Espero que para los próximos cursos no te quedes afuera! ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19450532-5388627758274609050?l=phpsenior.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpsenior/~4/3KR2VQhLO-Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phpsenior.blogspot.com/feeds/5388627758274609050/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=19450532&amp;postID=5388627758274609050" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/5388627758274609050?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/5388627758274609050?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phpsenior/~3/3KR2VQhLO-Y/cursos-surforce-viento-en-popa.html" title="Cursos SURFORCE: viento en popa!" /><author><name>enrique_place</name><uri>http://www.blogger.com/profile/15452998349449419148</uri><email>enriqueplace@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="03921750821859760589" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://phpsenior.blogspot.com/2009/10/cursos-surforce-viento-en-popa.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcER3w5fSp7ImA9WxNXGE0.&quot;"><id>tag:blogger.com,1999:blog-19450532.post-1352021229123787072</id><published>2009-10-06T02:37:00.000-02:00</published><updated>2009-10-06T02:40:06.225-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-06T02:40:06.225-02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="cursos" /><category scheme="http://www.blogger.com/atom/ns#" term="POO" /><category scheme="http://www.blogger.com/atom/ns#" term="surforce" /><category scheme="http://www.blogger.com/atom/ns#" term="zend framework" /><title>[SURFORCE] Cambio de fecha de inicio de cursos: lunes 12 de Octubre</title><content type="html">Hasta esta hora estuve confirmando los pagos de &lt;a href="http://registracion.surforce.com/cursos/"&gt;los cursos&lt;/a&gt; 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.&lt;br /&gt;&lt;br /&gt;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&lt;span style="font-weight: bold;"&gt; lunes 12 de Octubre&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt; Aún quedan algunos lugares en los cursos para llegar al tope máximo de 20 alumnos, así que &lt;strong&gt;quién envíe el pago inmediatamente obtiene el lugar disponible que aún no se ha pago&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt; &lt;strong&gt;¡Si aún no pudiste confirmar tu lugar, esta es la última semana!&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Cualquier duda o problema estamos a sus órdenes.&lt;br /&gt;&lt;br /&gt; Saludos!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19450532-1352021229123787072?l=phpsenior.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpsenior/~4/ZIzTPWc7XpY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phpsenior.blogspot.com/feeds/1352021229123787072/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=19450532&amp;postID=1352021229123787072" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/1352021229123787072?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/1352021229123787072?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phpsenior/~3/ZIzTPWc7XpY/surforce-cambio-de-fecha-de-inicio-de.html" title="[SURFORCE] Cambio de fecha de inicio de cursos: lunes 12 de Octubre" /><author><name>enrique_place</name><uri>http://www.blogger.com/profile/15452998349449419148</uri><email>enriqueplace@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="03921750821859760589" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://phpsenior.blogspot.com/2009/10/surforce-cambio-de-fecha-de-inicio-de.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8EQX4zeyp7ImA9WxNXF0s.&quot;"><id>tag:blogger.com,1999:blog-19450532.post-1807120981497912825</id><published>2009-10-05T15:25:00.003-02:00</published><updated>2009-10-05T15:30:00.083-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-05T15:30:00.083-02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="cursos" /><category scheme="http://www.blogger.com/atom/ns#" term="surforce" /><title>[SURFORCE] El inicio de cursos de Octubre se retrasa 1 día</title><content type="html">El fin de semana estuve confirmando pagos de &lt;a href="http://registracion.surforce.com/cursos"&gt;los cursos&lt;/a&gt; y &lt;span style="font-weight: bold;"&gt;aún hay algunas vacantes&lt;/span&gt; y bastantes alumnos atrasados, por lo que para poder iniciar con los grupos completos vamos a tener que postergar provisoriamente un día el inicio de los cursos (martes 6/10).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Al finalizar el lunes (hoy) se evaluarán los cursos que inician mañana &lt;/span&gt;y &lt;span style="font-weight: bold;"&gt;cuales se postergan una semana hasta el próximo lunes&lt;/span&gt; para poder cerrar con el cupo previsto de alumnos.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;¡Si aún no pudiste confirmar tu lugar, hoy es el día!&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Ni bien tenga novedades les estoy enviando un email a &lt;a href="http://registracion.surforce.com/usuarios/registracion/status/"&gt;todos los usuarios registrados&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sepan disculpar estos inconvenientes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19450532-1807120981497912825?l=phpsenior.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpsenior/~4/nrob7bsx71k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phpsenior.blogspot.com/feeds/1807120981497912825/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=19450532&amp;postID=1807120981497912825" title="4 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/1807120981497912825?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/1807120981497912825?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phpsenior/~3/nrob7bsx71k/surforce-el-inicio-de-cursos-de-octubre.html" title="[SURFORCE] El inicio de cursos de Octubre se retrasa 1 día" /><author><name>enrique_place</name><uri>http://www.blogger.com/profile/15452998349449419148</uri><email>enriqueplace@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="03921750821859760589" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://phpsenior.blogspot.com/2009/10/surforce-el-inicio-de-cursos-de-octubre.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04DRXw6eyp7ImA9WxNXF0w.&quot;"><id>tag:blogger.com,1999:blog-19450532.post-1309553584856331496</id><published>2009-10-05T03:07:00.003-02:00</published><updated>2009-10-05T03:19:34.213-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-05T03:19:34.213-02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="opinión" /><title>Discusión: "¿cuál es tu grado de madurez en POO?"</title><content type="html">Todo surgió respondiendo una consulta en un foro y me pareció interesante discutirlo aquí. Les comparto los "niveles" o "etapas" que considero que todo desarrollador pasa cuando decide dejar atrás la programación estructurada.&lt;br /&gt;&lt;br /&gt;Generalmente todos empiezan por el primero y luego pocos llegan hasta el último (la mayoría solo logra llegar al 2 y se estancan en el 3):&lt;br /&gt;&lt;ol style="list-style-type: decimal;"&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;"Programación Estructurada":&lt;/span&gt; el inicio, desde donde parten, la "nada" ;-)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;"Programación Estructurada con uso de Objetos":&lt;/span&gt; usan objetos "sueltos / aislados", no los saben relacionar entre ellos, se reusan a leer material con "conceptos", creen que es mejor aprender a través del "prueba y error".&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;"Programación Orientada a Objetos Sin Conceptos Claros":&lt;/span&gt; "creen que lo hacen bien" pero luego heredan clases mecánicamente pensando que es el mejor mecanismo para reusar código.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;"Desarrollo 100% OO":&lt;/span&gt; personas que invirtieron sabiamente su tiempo para aprender primero los conceptos para luego poder aplicarlos de forma correcta  &lt;img src="http://static.forosdelweb.com/images/smilies/wink.gif" alt="" title="apachar ojo" class="inlineimg" border="0" /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Puedes seguir desarrollando estructurado y apoyarte en algunos objetos, pero lo ideal es que te vayas adecuando a la forma de trabajo con objetos y estructures todo el sistema de esta forma (y eso empieza por "pensar en objetos", no en código).&lt;br /&gt;&lt;br /&gt;Nuevamente, "crear clases y jugar con objetos" es algo que todos podemos hacer, pero desarrollar "orientado a objetos" es un tema más de tener los conceptos claros que de saber la sintaxis de cómo se codifica.&lt;br /&gt;&lt;br /&gt;Recomiendo que antes de preguntar qué es  o qué no es POO, revisar &lt;a onclick="pageTracker._trackPageview ('/outgoing/http_es_wikipedia_org_wiki_POO');" href="http://es.wikipedia.org/wiki/POO" target="_blank"&gt;el apartado de Wikipedia sobre POO&lt;/a&gt; y &lt;a onclick="pageTracker._trackPageview ('/outgoing/http_es_wikipedia_org_wiki_Paradigma_de_programación');" href="http://es.wikipedia.org/wiki/Paradigma_de_programaci%C3%B3n" target="_blank"&gt;paradigmas de programación&lt;/a&gt; y las diferencias entre ellos.&lt;br /&gt;&lt;br /&gt;¿Tú, en qué nivel de madurez estás? ¿crees que hay otros niveles o etapas más? ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19450532-1309553584856331496?l=phpsenior.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpsenior/~4/xy6CQvPxs_M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phpsenior.blogspot.com/feeds/1309553584856331496/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=19450532&amp;postID=1309553584856331496" title="4 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/1309553584856331496?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/1309553584856331496?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phpsenior/~3/xy6CQvPxs_M/discusion-cual-es-tu-grado-de-madurez.html" title="Discusión: &quot;¿cuál es tu grado de madurez en POO?&quot;" /><author><name>enrique_place</name><uri>http://www.blogger.com/profile/15452998349449419148</uri><email>enriqueplace@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="03921750821859760589" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://phpsenior.blogspot.com/2009/10/discusion-cual-es-tu-grado-de-madurez.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIERXsyfip7ImA9WxNXFks.&quot;"><id>tag:blogger.com,1999:blog-19450532.post-2847064379636095999</id><published>2009-10-03T14:36:00.011-03:00</published><updated>2009-10-04T11:55:04.596-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-04T11:55:04.596-02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="manuales" /><category scheme="http://www.blogger.com/atom/ns#" term="zend framework" /><title>Primeros pasos en Zend Framework: cómo "aprender a pescar"</title><content type="html">&lt;div style="text-align: justify;"&gt;Una de las prácticas que trato constantemente de inculcar es que&lt;span style="font-style: italic;"&gt; "aprendan a pescar"&lt;/span&gt; y a no &lt;span style="font-style: italic;"&gt;"depender que los alimenten en la boca"&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Durante &lt;a href="http://registracion.surforce.com/cursos/"&gt;un curso&lt;/a&gt;, y particularmente después que termine, deberían siempre seguir estos pasos respetando el orden:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;Paso 1) "Siempre consulta primero el manual oficial"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Buscar en el manual oficial &lt;a href="http://framework.zend.com/manual/en/"&gt;http://framework.zend.com/manual/en/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: left;"&gt;Intenta tratar de identificar el componente que provee la funcionalidad. Por ejemplo, si no sabes  el significado de los parámetros del método &lt;span style="font-weight: bold;"&gt;render()&lt;/span&gt;. Este método es parte del componente &lt;span style="font-weight: bold;"&gt;Zend_Controller&lt;/span&gt; - &lt;a href="http://framework.zend.com/manual/en/zend.controller.action.html"&gt;zend.controller.action&lt;/a&gt; y concretamente aquí comenta los parámetros &lt;a href="http://framework.zend.com/manual/en/zend.controller.action.html#zend.controller.action.viewintegration.render"&gt;zend.controller.action.viewintegration.render&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_G8kpjzIeQ4o/SseT8dPF13I/AAAAAAAAEl0/n7aUqZ84o04/s1600-h/zf_manual_render.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 222px;" src="http://4.bp.blogspot.com/_G8kpjzIeQ4o/SseT8dPF13I/AAAAAAAAEl0/n7aUqZ84o04/s400/zf_manual_render.gif" alt="" id="BLOGGER_PHOTO_ID_5388438146021447538" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;Paso 2) "Consulta la API online del Framework"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_G8kpjzIeQ4o/SseRALMnigI/AAAAAAAAElc/Ng-O7RH3W9w/s1600-h/zf_api.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 320px;" src="http://1.bp.blogspot.com/_G8kpjzIeQ4o/SseRALMnigI/AAAAAAAAElc/Ng-O7RH3W9w/s400/zf_api.gif" alt="" id="BLOGGER_PHOTO_ID_5388434911363828226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;En caso de no encontrar una explicación o esta sea breve, consultar la &lt;span style="font-weight: bold;"&gt;API online&lt;/span&gt; que se genera a partir de los fuentes a través del uso de &lt;a href="http://www.phpdoc.org/"&gt;PHPdoc&lt;/a&gt; -&lt;a href="http://framework.zend.com/apidoc/core/"&gt; http://framework.zend.com/apidoc/core/&lt;/a&gt; (en el &lt;span style="font-weight: bold;"&gt;combo superior&lt;/span&gt; pueden seleccionar el componente que quieren visualizar, &lt;span style="font-weight: bold;"&gt;Zend_Controller&lt;/span&gt;, y luego buscar la clase &lt;span style="font-weight: bold;"&gt;Zend_Controller_Action&lt;/span&gt;).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_G8kpjzIeQ4o/SseRKo-tDcI/AAAAAAAAElk/ezXxnOJLG0w/s1600-h/zf_api_combo.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 250px;" src="http://1.bp.blogspot.com/_G8kpjzIeQ4o/SseRKo-tDcI/AAAAAAAAElk/ezXxnOJLG0w/s400/zf_api_combo.gif" alt="" id="BLOGGER_PHOTO_ID_5388435091157224898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Paso 3) "¡Usa el código, Luke!"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Como complemento hasta pueden &lt;span style="font-weight: bold;"&gt;consultar el mismo código fuente de la librería&lt;/span&gt;, que ahí se aprende también mucho de cómo funciona el framework y hasta &lt;a href="http://phpsenior.blogspot.com/search?q=buenas+pr%C3%A1cticas"&gt;buenas prácticas de desarrollo&lt;/a&gt;: revisa el código de &lt;span style="font-weight: bold;"&gt;/library/Zend/Controller/Action.php&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_G8kpjzIeQ4o/SseRoeYbaSI/AAAAAAAAEls/x5cjVO9Md0w/s1600-h/zf_codigo_fuente.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 201px;" src="http://2.bp.blogspot.com/_G8kpjzIeQ4o/SseRoeYbaSI/AAAAAAAAEls/x5cjVO9Md0w/s400/zf_codigo_fuente.gif" alt="" id="BLOGGER_PHOTO_ID_5388435603708406050" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;Paso 4) "Usa Google"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Y recién, solo recién, navegar en Google buscando artículos (y con cuidado, hay que aprender a discernir qué es bueno y qué es malo, ya que hay mucha basura).&lt;br /&gt;&lt;/div&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;En Resumen&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Todo esto lo sacan &lt;span style="font-weight: bold;"&gt;navegando el menú de documentación del sitio oficial&lt;/span&gt; &lt;a href="http://framework.zend.com/"&gt;framework.zend.com&lt;/a&gt;, y desaconsejo terminantemente empezar primero buscando en google y creyendo en el primer artículo que encuentran en el buscador (aunque sea de mi autoría ;-)), ya que hay demasiados &lt;a href="http://phpsenior.blogspot.com/search?q=charlatanes"&gt;charlatanes&lt;/a&gt; que hablan sin saber y conceptualmente pueden llevarnos a cometer errores o adoptar malas prácticas.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_G8kpjzIeQ4o/SsePhnI-iAI/AAAAAAAAElU/xlwsV11gbl4/s1600-h/zf_documentacion_captura.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 204px;" src="http://2.bp.blogspot.com/_G8kpjzIeQ4o/SsePhnI-iAI/AAAAAAAAElU/xlwsV11gbl4/s400/zf_documentacion_captura.gif" alt="" id="BLOGGER_PHOTO_ID_5388433286777178114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Que te sirva,&lt;span style="font-weight: bold;"&gt;  aprende a pescar por tu cuenta&lt;/span&gt; y no esperes que te resuelvan tus propios problemas ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19450532-2847064379636095999?l=phpsenior.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpsenior/~4/tziwB3zh-G0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phpsenior.blogspot.com/feeds/2847064379636095999/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=19450532&amp;postID=2847064379636095999" title="1 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/2847064379636095999?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/2847064379636095999?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phpsenior/~3/tziwB3zh-G0/primeros-pasos-en-zend-framework-como.html" title="Primeros pasos en Zend Framework: cómo &quot;aprender a pescar&quot;" /><author><name>enrique_place</name><uri>http://www.blogger.com/profile/15452998349449419148</uri><email>enriqueplace@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="03921750821859760589" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_G8kpjzIeQ4o/SseT8dPF13I/AAAAAAAAEl0/n7aUqZ84o04/s72-c/zf_manual_render.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://phpsenior.blogspot.com/2009/10/primeros-pasos-en-zend-framework-como.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8DQ348eyp7ImA9WxNQGUw.&quot;"><id>tag:blogger.com,1999:blog-19450532.post-728701273062258175</id><published>2009-09-25T19:19:00.004-03:00</published><updated>2009-09-25T19:31:12.073-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-25T19:31:12.073-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="cursos" /><category scheme="http://www.blogger.com/atom/ns#" term="POO" /><category scheme="http://www.blogger.com/atom/ns#" term="zend" /><category scheme="http://www.blogger.com/atom/ns#" term="surforce" /><title>[SURFORCE]: ¡Últimos cursos del año!</title><content type="html">&lt;iframe src="http://docs.google.com/present/embed?id=ddqnpxpj_731gqhqc56r" frameborder="0" width="410" height="342"&gt;&lt;/iframe&gt;&lt;br /&gt;¡Estimados lectores, se vienen&lt;a href="http://registracion.surforce.com/cursos"&gt; los últimos cursos del año&lt;/a&gt;! Hace unas semanas que se están recibiendo los pagos de las inscripciones:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Fecha de inicio de los cursos:&lt;/span&gt; Lunes 5/Octubre&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Fecha límite para hacer los pagos:&lt;/span&gt;  Viernes 2/octubre&lt;/li&gt;&lt;/ul&gt;Y como novedad para todos los alumnos que ya hicieron el curso de &lt;a href="http://registracion.surforce.com/cursos/zend"&gt;Introducción a Zend Framework&lt;/a&gt;, estamos iniciando el primer &lt;span style="font-weight: bold;"&gt;Taller de Desarrollo en  Zend Framework&lt;/span&gt;, donde aplicaremos todo lo visto en el curso (y más), trabajando de principio a fin un proyecto completo de desarrollo a distancia (incorporando versionado con svn, instalación en servidores, gestión ágil de proyectos, etc)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;¡No pierdas tu lugar! &lt;/span&gt;¡De lo contrario, hasta el año que viene! ;-)&lt;br /&gt;&lt;br /&gt;Para poder realizar la inscripción &lt;a href="http://registracion.surforce.com/usuarios/registracion/paso1"&gt;empieza por registrarte como usuario en SURFORCE&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;PD: cualquier duda o asesoramiento puedes enviarnos un &lt;span style="font-weight: bold;"&gt;email &lt;/span&gt;a &lt;span style="font-weight: bold;"&gt;info &lt;/span&gt;en &lt;span style="font-weight: bold;"&gt;surforce.com&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19450532-728701273062258175?l=phpsenior.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpsenior/~4/B0yvOtfAqI0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phpsenior.blogspot.com/feeds/728701273062258175/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=19450532&amp;postID=728701273062258175" title="0 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/728701273062258175?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/728701273062258175?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phpsenior/~3/B0yvOtfAqI0/surforce-ultimos-cursos-del-ano.html" title="[SURFORCE]: ¡Últimos cursos del año!" /><author><name>enrique_place</name><uri>http://www.blogger.com/profile/15452998349449419148</uri><email>enriqueplace@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="03921750821859760589" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://phpsenior.blogspot.com/2009/09/surforce-ultimos-cursos-del-ano.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMGQX0-fSp7ImA9WxNQF0g.&quot;"><id>tag:blogger.com,1999:blog-19450532.post-5913579671182605634</id><published>2009-09-23T22:30:00.005-03:00</published><updated>2009-09-23T23:13:40.355-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-23T23:13:40.355-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="servidores" /><category scheme="http://www.blogger.com/atom/ns#" term="recuerdos" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><category scheme="http://www.blogger.com/atom/ns#" term="usabilidad" /><title>Cajón del recuerdo: reflotando viejos posts anteriores a PHPSenior</title><content type="html">Se dio la casualidad que &lt;a href="http://phpsenior.blogspot.com/2009/09/pregunta-recibida-consejos-para-hacer.html"&gt;para armar el post anterior&lt;/a&gt; tuve que salir a buscar en mi "base de recuerdos" (los posts de mis blogs) para poder responder algunos temas que alguna vez traté. Inquieto como siempre, me puse a buscar en mi &lt;a href="http://enriqueplace.blogspot.com"&gt;blog personal&lt;/a&gt; (el primero de todos los blogs que creé) y que luego, buscando especializar, dieron lugar a este blog, &lt;span style="font-weight: bold;"&gt;PHPSenior&lt;/span&gt; (al principio tenía tres, &lt;a href="http://phpcinco.blogspot.com/"&gt;PHP5&lt;/a&gt;, &lt;a href="http://templatesmarty.blogspot.com/"&gt;Smarty&lt;/a&gt; y &lt;a href="http://frameworkpear.blogspot.com/"&gt;Pear&lt;/a&gt;, que luego se fusionaron en este blog ;-)). &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Algunos recuerdos de cuando hablaba de todo un poco&lt;/span&gt;, pero particularmente sobre desarrollo web, web 2.0, servidores, etc,  y que no han perdido vigencia (y no me gustaría que se olvidaran, al día de hoy los busco cuando quiero volver a repetir algo que hice por hace mucho tiempo ;-)).&lt;br /&gt;&lt;br /&gt;Un resumen de los post más interesantes que puedo rescatar:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2005&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;h3 class="post-title"&gt;&lt;a href="http://enriqueplace.blogspot.com/2005/11/mi-sitio-web-es-estndar-y-el-tuyo.html"&gt;"¡Mi sitio Web es estándar! ¿Y el tuyo?"&lt;/a&gt; &lt;/h3&gt;&lt;/li&gt;&lt;li&gt;&lt;h3 class="post-title"&gt;&lt;a href="http://enriqueplace.blogspot.com/2005/12/debera-utilizar-estndares-web.html"&gt;"¿Debería utilizar estándares Web?"&lt;/a&gt;&lt;/h3&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;2006&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;h3 class="post-title"&gt;&lt;a href="http://enriqueplace.blogspot.com/2006/01/smarty-formato-numrico-y-formato-de.html"&gt;Smarty: Formato numérico y formato de fecha&lt;/a&gt;&lt;/h3&gt;&lt;/li&gt;&lt;li&gt;&lt;h3 class="post-title"&gt;&lt;a href="http://enriqueplace.blogspot.com/2006/01/postgresql-cmo-hacer-respaldos.html"&gt;PostgreSQL: ¿Cómo hacer respaldos rotativos de una base de datos?&lt;/a&gt;&lt;/h3&gt;&lt;/li&gt;&lt;li&gt;&lt;h3 class="post-title"&gt;&lt;a href="http://enriqueplace.blogspot.com/2006/02/postgresql-la-base-de-datos-empez.html"&gt;PostgreSQL: ¿la base de datos empezó a consumir exageradamente espacio de disco?&lt;/a&gt;&lt;/h3&gt;&lt;/li&gt;&lt;li&gt;&lt;h3 class="post-title"&gt;&lt;a href="http://enriqueplace.blogspot.com/2006/03/cambiar-la-hora-de-los-servidores.html"&gt;Cambiar la hora de los servidores GNU/Linux&lt;/a&gt;&lt;/h3&gt;&lt;/li&gt;&lt;li&gt;&lt;h3 class="post-title"&gt;&lt;a href="http://enriqueplace.blogspot.com/2006/03/postgresql-crear-tablas-temporales.html"&gt;PostgreSQL: crear tablas temporales a partir de una consulta SQL&lt;/a&gt;&lt;/h3&gt;&lt;/li&gt;&lt;li&gt;&lt;h3 class="post-title"&gt;&lt;a href="http://enriqueplace.blogspot.com/2006/06/cuando-usar-ajax-cuando-no-usar-ajax.html"&gt;¿Cuando usar AJAX? ¿Cuando no usar Ajax?&lt;/a&gt;&lt;/h3&gt;&lt;/li&gt;&lt;li&gt;&lt;h3 class="post-title"&gt;&lt;a href="http://enriqueplace.blogspot.com/2006/06/conceptos-mashup-aplicacin-web-hbrida.html"&gt;Conceptos: "Mashup" (aplicación web híbrida)&lt;/a&gt;&lt;/h3&gt;&lt;/li&gt;&lt;li&gt;&lt;h3 class="post-title"&gt;&lt;a href="http://enriqueplace.blogspot.com/2006/06/usabilidad-como-se-mueve-el-ojo-humano.html"&gt;Usabilidad: "¿Como se mueve el ojo humano en una web?&lt;/a&gt;&lt;/h3&gt;&lt;/li&gt;&lt;li&gt;&lt;h3 class="post-title"&gt;&lt;a href="http://enriqueplace.blogspot.com/2006/07/agendar-para-que-los-servidores.html"&gt;Agendar para que los servidores GNU/Linux se apaguen a una hora específica&lt;/a&gt;&lt;/h3&gt;&lt;/li&gt;&lt;li&gt;&lt;h3 class="post-title"&gt;&lt;a href="http://enriqueplace.blogspot.com/2006/07/consejos-y-sugerencias-para-empezar-un.html"&gt;Consejos y sugerencias para empezar un blog&lt;/a&gt;&lt;/h3&gt;&lt;/li&gt;&lt;li&gt;&lt;h3 class="post-title"&gt;&lt;a href="http://enriqueplace.blogspot.com/2006/09/frase-capa-de-abstraccin.html"&gt;Frase: "capa de abstracción"&lt;/a&gt;&lt;/h3&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;2007&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;h3 class="post-title"&gt;&lt;a href="http://enriqueplace.blogspot.com/2007/03/interfases-o-interfaces-echo-o-hecho.html"&gt;¿"Interfases" o "interfaces"? ¿"echo" o "hecho"?&lt;/a&gt;&lt;/h3&gt;&lt;/li&gt;&lt;li&gt;&lt;h3 class="post-title"&gt;&lt;a href="http://enriqueplace.blogspot.com/2007/01/ejemplo-prctico-y-con-imgenes-de-lo-que.html"&gt;Ejemplo práctico de lo que es un  "Análisis de Usabilidad"&lt;/a&gt;&lt;/h3&gt;&lt;/li&gt;&lt;/ul&gt;Y en el 2005 escribía lo que sería mi frase de cabecera profesional:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;"¿Lo quiere rápido, barato, o bien hecho? Puede elegir dos de las tres cosas."&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;– El espectro del Titanic (Arthur C. Clarke, 1998)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Espero que algunos de estos  recuerdos les sirva ahora. ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19450532-5913579671182605634?l=phpsenior.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpsenior/~4/0nOyeeOd7_0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phpsenior.blogspot.com/feeds/5913579671182605634/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=19450532&amp;postID=5913579671182605634" title="4 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/5913579671182605634?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/5913579671182605634?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phpsenior/~3/0nOyeeOd7_0/cajon-del-recuerdo-reflotando-viejos.html" title="Cajón del recuerdo: reflotando viejos posts anteriores a PHPSenior" /><author><name>enrique_place</name><uri>http://www.blogger.com/profile/15452998349449419148</uri><email>enriqueplace@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="03921750821859760589" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://phpsenior.blogspot.com/2009/09/cajon-del-recuerdo-reflotando-viejos.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUGRn47fip7ImA9WxNQF08.&quot;"><id>tag:blogger.com,1999:blog-19450532.post-1688403012265482464</id><published>2009-09-23T14:33:00.004-03:00</published><updated>2009-09-23T14:50:27.006-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-23T14:50:27.006-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="estándares" /><category scheme="http://www.blogger.com/atom/ns#" term="consejos" /><category scheme="http://www.blogger.com/atom/ns#" term="interfaces" /><category scheme="http://www.blogger.com/atom/ns#" term="gui" /><category scheme="http://www.blogger.com/atom/ns#" term="preguntas" /><category scheme="http://www.blogger.com/atom/ns#" term="html" /><category scheme="http://www.blogger.com/atom/ns#" term="css" /><title>Pregunta recibida: "¿Consejos para hacer las interfaces web?"</title><content type="html">Esta semana recibí un email de una ex-alumna que me solicitaba mi recomendación sobre qué hacer y cómo las "interfaces web" en sus desarrollos PHP. Les comparto mi respuesta que puede ser útil a más de uno con la misma duda:&lt;br /&gt;&lt;br /&gt;"En sí &lt;span style="font-weight: bold;"&gt;lo que estoy usando y recomiendo para los desarrollos web es algún framework general&lt;/span&gt;, como es &lt;a href="http://phpsenior.blogspot.com/search?q=Zend+Framework"&gt;Zend Framework&lt;/a&gt;. Con eso ya resuelves todo el problema de estructurar un proyecto, cómo organizarlo, además de múltiples clases que resuelven muchos temas repetitivos (como la persistencia, armado de la interfaz, etc). En las vistas tienes "funciones" que provee Zend (llamadas &lt;a href="http://phpsenior.blogspot.com/search?q=View"&gt;View Helpers&lt;/a&gt;) que simplifican mucho el trabajo (no deja de ser html o html generado a través de funciones), luego, la otra parte se hace con un buen uso de css y javascripts, y siguiendo la filosofía "productiva", te recomiendo usar siempre un framework, como bien podría ser &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;No sé cómo estás con estos temas, pero &lt;span style="font-weight: bold;"&gt;la base es saber bien HTML + CSS (sin tablas) y luego complementarlo con JS&lt;/span&gt; (usando un framework para aumentar la productividad)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Enlaces recomendados&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.hotdesign.com/seybold/"&gt;"Por qué usar tablas es estúpido"&lt;/a&gt; (inglés)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.estadobeta.com/2005/11/25/3-capas-de-presentacin/"&gt;"3 Capas de Presentación"&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://enriqueplace.blogspot.com/2005/12/debera-utilizar-estndares-web.html"&gt;"¿Debería utilizar estándares Web?"&lt;/a&gt;&lt;/li&gt;&lt;li&gt;y nunca está de más leer las &lt;a href="http://www.w3c.es/divulgacion/guiasbreves/"&gt;guías breves de divulgación de la W3C&lt;/a&gt; (en inglés hay &lt;a href="http://www.w3.org/2002/03/tutorials"&gt;más información&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Si no quieres entrar aún con Zend, puedes ver sistemas de plantillas (templates) como &lt;a href="http://www.smarty.net/"&gt;Smarty&lt;/a&gt;, que también te resuelven muchos temas rutinarios y repetivos (&lt;a href="http://phpsenior.blogspot.com/search?q=Smarty"&gt;revisa en mi blog por Smarty&lt;/a&gt; y verás varios artículos de cuando lo usaba, antes de Zend). Pero nuevamente, aquí ataca solo HTML, si te manejas bien con lo básico y simple, &lt;span style="font-weight: bold;"&gt;html solo es presentar los datos y css es dar estética, y js comportamiento&lt;/span&gt; ("3 capas de presentación"), si mantienes esto simple, las interfaces se hacen bien y rápido, fáciles de implementar (de lo contrario tienes un problema adicional al desarrollo puro y duro del sistema)."&lt;br /&gt;&lt;br /&gt;¿Ustedes qué opinan? ¿agregarían algo más? ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19450532-1688403012265482464?l=phpsenior.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpsenior/~4/Z176DKmeySw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phpsenior.blogspot.com/feeds/1688403012265482464/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=19450532&amp;postID=1688403012265482464" title="5 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/1688403012265482464?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/1688403012265482464?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phpsenior/~3/Z176DKmeySw/pregunta-recibida-consejos-para-hacer.html" title="Pregunta recibida: &quot;¿Consejos para hacer las interfaces web?&quot;" /><author><name>enrique_place</name><uri>http://www.blogger.com/profile/15452998349449419148</uri><email>enriqueplace@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="03921750821859760589" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://phpsenior.blogspot.com/2009/09/pregunta-recibida-consejos-para-hacer.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04ERn84fCp7ImA9WxNQEEo.&quot;"><id>tag:blogger.com,1999:blog-19450532.post-224055088512887608</id><published>2009-09-16T02:10:00.009-03:00</published><updated>2009-09-16T02:45:07.134-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-16T02:45:07.134-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="cosas mal hechas" /><category scheme="http://www.blogger.com/atom/ns#" term="plagio" /><title>Plagio, segundo intento: "Desarrollador Senior" versus "PHP Senior"</title><content type="html">Parece broma, pero por accidente leyendo el sitio de &lt;a href="http://www.illasaron.com/"&gt;illasaron.com&lt;/a&gt; llego&lt;a href="http://www.illasaron.com/html/modules.php?name=News&amp;amp;file=article&amp;amp;sid=4684"&gt; a la siguiente noticia&lt;/a&gt; y me encuentro con que &lt;a href="http://phpsenior.blogspot.com/2009/08/copiar-sin-citar-plagio.html"&gt;la misma persona del plagio anterior&lt;/a&gt; vuelve a la carga con un blog &lt;span style="font-style: italic;"&gt;"poco original"&lt;/span&gt; (creado poco después del incidente que tuvimos), &lt;span style="font-weight: bold;"&gt;vuelve a copiar contenidos&lt;/span&gt; de este blog y ahora&lt;span style="font-style: italic;"&gt; "los trabaja un poco más"&lt;/span&gt;, cambia más palabras y sigue sin hacer referencia a su fuente original.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_G8kpjzIeQ4o/SrB09qnmazI/AAAAAAAAEkE/_r7egnIezrk/s1600-h/plagio2_cabezal.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 252px;" src="http://3.bp.blogspot.com/_G8kpjzIeQ4o/SrB09qnmazI/AAAAAAAAEkE/_r7egnIezrk/s400/plagio2_cabezal.gif" alt="" id="BLOGGER_PHOTO_ID_5381930157468969778" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_G8kpjzIeQ4o/SrB1DmDTVlI/AAAAAAAAEkM/uVaqXOX6m-Y/s1600-h/plagio2_cabezal_orig.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 174px;" src="http://4.bp.blogspot.com/_G8kpjzIeQ4o/SrB1DmDTVlI/AAAAAAAAEkM/uVaqXOX6m-Y/s400/plagio2_cabezal_orig.gif" alt="" id="BLOGGER_PHOTO_ID_5381930259322197586" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;En mi cabezal dice desde hace años:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;PHP Senior&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Como convertirse en un "Desarrollador PHP Senior" y no morir en el intento... escrito por &lt;u&gt;&lt;a href="http://enriqueplace.blogspot.com/"&gt;Enrique Place&lt;/a&gt;&lt;/u&gt; de &lt;u&gt;&lt;a href="http://www.surforce.com/"&gt;SURFORCE&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ahora el agrega:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Desarrollador Senior&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Como convertirse en un "Desarrollador web Senior" y no frustrarse en el intento... escrito por &lt;a href="http://arleytriana.blogspot.com/"&gt;Arley Triana&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Leyendo muy por arriba veo que tiene otro artículo parecido a uno que escribí, pero ahora le cambia más palabras para que sea más difícil de distingir... aunque sigue siendo evidente:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_G8kpjzIeQ4o/SrB3FNsDd4I/AAAAAAAAEkU/wZBq8W0aOlE/s1600-h/plagio2_singleton.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 390px;" src="http://2.bp.blogspot.com/_G8kpjzIeQ4o/SrB3FNsDd4I/AAAAAAAAEkU/wZBq8W0aOlE/s400/plagio2_singleton.gif" alt="" id="BLOGGER_PHOTO_ID_5381932486165231490" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Nueva versión plagiada&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Copio la captura del plagio que realizó en el blog anterior, y no puedo salir de mi asombro que siga intentando cambiar algunas palabras para que sea más difícil darse cuenta (hasta usa mi propio uml que hice con Argo)... pero sigue siendo tan evidente:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_G8kpjzIeQ4o/SrB31rvHjRI/AAAAAAAAEkc/p-kxje4bjQ4/s1600-h/plagio4.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 328px; height: 400px;" src="http://4.bp.blogspot.com/_G8kpjzIeQ4o/SrB31rvHjRI/AAAAAAAAEkc/p-kxje4bjQ4/s400/plagio4.gif" alt="" id="BLOGGER_PHOTO_ID_5381933318864866578" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Vieja Versión Plagiada&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Antes decía su Plagio Version 1: &lt;span style="font-weight: bold;"&gt;"tener una clase BaseDeDatos"&lt;/span&gt; ahora dice &lt;span style="font-weight: bold;"&gt;"tener una clase Database"&lt;/span&gt;, antes decía&lt;span style="font-weight: bold;"&gt; "devuelve un objeto llamado bd"&lt;/span&gt; ahora dice&lt;span style="font-weight: bold;"&gt; "devuelve un objeto llamado $conn"&lt;/span&gt;, pero mantiene los subtítulos &lt;span style="font-weight: bold;"&gt;"¿Ventajas / usos?"&lt;/span&gt; y los cambia por &lt;span style="font-weight: bold;"&gt;"¿Ventajas y usos?"&lt;/span&gt;, etcétera, etcétera (si tienes tiempo encuentra las diferencias entre sus propias versiones de plagios que son bastantes y muy cómicas).&lt;br /&gt;&lt;br /&gt;¿Soy muy paranoico o estamos ante un sorprendente caso de estupidez humana?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Más información&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://phpsenior.blogspot.com/2005/09/patrn-de-diseo-singleton.html"&gt;Artículo original&lt;/a&gt; y el &lt;a href="http://desarrolladorsenior.blogspot.com/2009/09/el-patron-de-diseno-singleton-esta.html"&gt;Plagio Versión 2&lt;/a&gt;, todo por el mismo "autor", &lt;a href="http://www.blogger.com/profile/04536576107102887648"&gt;Arley Triana&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19450532-224055088512887608?l=phpsenior.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpsenior/~4/fkk-R9xA9Mk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phpsenior.blogspot.com/feeds/224055088512887608/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=19450532&amp;postID=224055088512887608" title="7 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/224055088512887608?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/224055088512887608?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phpsenior/~3/fkk-R9xA9Mk/plagio-segundo-intento-desarrollador.html" title="Plagio, segundo intento: &quot;Desarrollador Senior&quot; versus &quot;PHP Senior&quot;" /><author><name>enrique_place</name><uri>http://www.blogger.com/profile/15452998349449419148</uri><email>enriqueplace@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="03921750821859760589" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_G8kpjzIeQ4o/SrB09qnmazI/AAAAAAAAEkE/_r7egnIezrk/s72-c/plagio2_cabezal.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total><feedburner:origLink>http://phpsenior.blogspot.com/2009/09/plagio-segundo-intento-desarrollador.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYEQH09eyp7ImA9WxNSGE0.&quot;"><id>tag:blogger.com,1999:blog-19450532.post-5068177545865988950</id><published>2009-09-01T09:07:00.002-03:00</published><updated>2009-09-01T09:11:41.363-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-01T09:11:41.363-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="cursos" /><category scheme="http://www.blogger.com/atom/ns#" term="surforce" /><title>Cambio de fecha de inicio de cursos: 7/Septiembre</title><content type="html">&lt;div&gt;Hasta esta hora estuve confirmando los pagos de &lt;a href="http://registracion.surforce.com/cursos"&gt;los cursos&lt;/a&gt; y aún hay alumnos atrasados, por lo que para poder iniciar con los grupos completos &lt;b&gt;vamos a tener que postergar una semana el inicio de los mismos.&lt;/b&gt;&lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Se extenderá el plazo hasta el próximo &lt;b&gt;viernes (7/9) para estar al día con el pago&lt;/b&gt; del curso y posteriormente SIN EXCEPCIONES no se recibirán más pagos y los cursos darán inicio el &lt;b&gt;próximo lunes 7 / Septiembre&lt;/b&gt;.&lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Aún quedan algunos lugares en los cursos para llegar al tope máximo de 20 alumnos&lt;/b&gt;, así que quién envíe el pago inmediatamente obtiene el lugar disponible que aún no se ha pago.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;div&gt;&lt;b&gt;Para quienes sí hicieron el pago correspondiente&lt;/b&gt;, sepan disculpar el cambio de fecha. Desde ya les pido a todos que ingresen a &lt;a href="http://usuarios.surforce.com/" style="color: rgb(0, 0, 204);" target="_blank"&gt;http://usuarios.surforce.com&lt;/a&gt; &lt;wbr&gt;y &lt;b&gt;revisen que sus pagos y su asignación a su grupo&lt;/b&gt; se encuentra actualizada, de la misma forma, &lt;b&gt;quienes compraron &lt;a href="http://phpsenior.blogspot.com/2009/02/disponible-el-libro-poo-para-php5.html"&gt;el libro de POO para PHP5&lt;/a&gt;&lt;/b&gt;, ya pueden bajarlo en conjunto con todo el material extra.&lt;/div&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En caso contrario, por favor nos envían un email y lo revisamos. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Opciones del sistema:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Resumen de Compras, para ver todos los pagos acreditados&lt;/li&gt;&lt;li&gt;Cursos &gt; Tus Grupos&lt;/li&gt;&lt;li&gt;Libros &gt; Actualizaciones&lt;/li&gt;&lt;li&gt;Libros &gt; Material Extra&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Cualquier duda o problema estoy a sus órdenes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;¡Última semana, si no te inscribiste aún, luego no hay más excusas! ;-)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19450532-5068177545865988950?l=phpsenior.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpsenior/~4/2IxruPiMfKs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phpsenior.blogspot.com/feeds/5068177545865988950/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=19450532&amp;postID=5068177545865988950" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/5068177545865988950?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/5068177545865988950?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phpsenior/~3/2IxruPiMfKs/cambio-de-fecha-de-inicio-de-cursos.html" title="Cambio de fecha de inicio de cursos: 7/Septiembre" /><author><name>enrique_place</name><uri>http://www.blogger.com/profile/15452998349449419148</uri><email>enriqueplace@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="03921750821859760589" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://phpsenior.blogspot.com/2009/09/cambio-de-fecha-de-inicio-de-cursos.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0ACQnY_fip7ImA9WxNSE0o.&quot;"><id>tag:blogger.com,1999:blog-19450532.post-2731044927344844230</id><published>2009-08-26T13:47:00.019-03:00</published><updated>2009-08-27T09:22:43.846-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-27T09:22:43.846-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="cosas mal hechas" /><category scheme="http://www.blogger.com/atom/ns#" term="plagio" /><title>Copiar sin citar = Plagio</title><content type="html">&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_G8kpjzIeQ4o/SpVsjVFV1nI/AAAAAAAAEfI/hEFs4dFNSwA/s1600-h/plagio_arley_1.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 388px;" src="http://2.bp.blogspot.com/_G8kpjzIeQ4o/SpVsjVFV1nI/AAAAAAAAEfI/hEFs4dFNSwA/s400/plagio_arley_1.gif" alt="" id="BLOGGER_PHOTO_ID_5374321084547323506" border="0" /&gt;&lt;/a&gt;&lt;a href="http://arleytriana.blogspot.com/2009/08/herencia-de-clases-y-el-principio-de.html"&gt;Plagio #1&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;La verdad que estoy bastante molesto con este caso de &lt;a href="http://es.wikipedia.org/wiki/Plagio"&gt;Plagio&lt;/a&gt;. No es la primera vez que veo que una persona copia literalmente contenidos de este blog y &lt;span style="font-weight: bold;"&gt;los copia íntegros&lt;/span&gt;, y para peor, &lt;span style="font-weight: bold;"&gt;sin citar&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"Una persona comete plagio cuando copia o imita algo que no le pertenece haciéndose pasar por el &lt;/span&gt;&lt;a style="font-style: italic;" href="http://es.wikipedia.org/wiki/Autor" title="Autor"&gt;autor&lt;/a&gt;&lt;span style="font-style: italic;"&gt; de ello. Dicha acción, al estar protegida la obra legalmente por el &lt;/span&gt;&lt;a style="font-style: italic;" href="http://es.wikipedia.org/wiki/Derecho_de_autor" title="Derecho de autor"&gt;derecho de autor&lt;/a&gt;&lt;span style="font-style: italic;"&gt;, podría conllevar un &lt;/span&gt;&lt;a style="font-style: italic;" href="http://es.wikipedia.org/wiki/Juicio" title="Juicio"&gt;juicio&lt;/a&gt;&lt;span style="font-style: italic;"&gt; y una posible imposición de &lt;/span&gt;&lt;a style="font-style: italic;" href="http://es.wikipedia.org/wiki/Multa" title="Multa"&gt;multas&lt;/a&gt;&lt;span style="font-style: italic;"&gt; y la obligación de &lt;/span&gt;&lt;a style="font-style: italic;" href="http://es.wikipedia.org/wiki/Indemnizaci%C3%B3n_de_perjuicios" title="Indemnización de perjuicios"&gt;indemnizar&lt;/a&gt;&lt;span style="font-style: italic;"&gt; los &lt;/span&gt;&lt;a style="font-style: italic;" href="http://es.wikipedia.org/wiki/Da%C3%B1o" title="Daño" class="mw-redirect"&gt;daños&lt;/a&gt;&lt;span style="font-style: italic;"&gt; y perjuicios."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3 class="post-title entry-title"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_G8kpjzIeQ4o/SpVspf2B_jI/AAAAAAAAEfQ/ckXy-rC1HI8/s1600-h/plagio_arley_1_orig.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 243px;" src="http://2.bp.blogspot.com/_G8kpjzIeQ4o/SpVspf2B_jI/AAAAAAAAEfQ/ckXy-rC1HI8/s400/plagio_arley_1_orig.gif" alt="" id="BLOGGER_PHOTO_ID_5374321190515113522" border="0" /&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://phpsenior.blogspot.com/2007/10/herencia-de-clases-y-el-principio-de.html"&gt;Post Original #1&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Claramente los contenidos de este blog &lt;a href="http://creativecommons.org/licenses/by-nc/2.5/"&gt;tienen licencia Creative Commons&lt;/a&gt; (ver pié del sitio) y se aplican algunas restricciones. Existen distintas versiones de la licencia que puedes optar según tus intereses: en este caso puedes copiar, redistribuir y hacer obras derivadas, &lt;span style="font-weight: bold;"&gt;siempre y cuando cites al autor y no sea con fines comerciales&lt;/span&gt; (no quiere decir que no puedas lucrar con los contenidos, pero para eso debes pedir permiso).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_G8kpjzIeQ4o/SpX0hx3zE_I/AAAAAAAAEfY/htHSgr5v_7s/s1600-h/plagio2.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 280px;" src="http://2.bp.blogspot.com/_G8kpjzIeQ4o/SpX0hx3zE_I/AAAAAAAAEfY/htHSgr5v_7s/s400/plagio2.gif" alt="" id="BLOGGER_PHOTO_ID_5374470591496786930" border="0" /&gt;&lt;/a&gt;&lt;a href="http://arleytriana.blogspot.com/2009/08/principios-de-diseno-orientado-objetos.html"&gt;Plagio #2&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_G8kpjzIeQ4o/SpX1Ae60eCI/AAAAAAAAEfg/W9DnXJQ7Icw/s1600-h/plagio2_orig.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 323px;" src="http://1.bp.blogspot.com/_G8kpjzIeQ4o/SpX1Ae60eCI/AAAAAAAAEfg/W9DnXJQ7Icw/s400/plagio2_orig.gif" alt="" id="BLOGGER_PHOTO_ID_5374471118985132066" border="0" /&gt;&lt;/a&gt;&lt;a href="http://phpsenior.blogspot.com/2007/07/apuntes-principios-de-diseo-orientado.html"&gt;Post Original #2&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Lo correcto sería que hiciéramos un comentario de un artículo que nos pueda gustar&lt;/span&gt;, hacer alguna cita de algún párrafo, pero no copiar íntegro el contenido que no permite distinguir si lo escribimos nosotros u otra persona (a menos que lo aclares explícitamente, avises cuando inicia algo que no escribiste, le agregues comillas, etc), pero esto es lo peor y ya muestra muy mala intención.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_G8kpjzIeQ4o/SpX27X59ffI/AAAAAAAAEfo/D7oIVFUVQGI/s1600-h/plagio3.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 304px;" src="http://2.bp.blogspot.com/_G8kpjzIeQ4o/SpX27X59ffI/AAAAAAAAEfo/D7oIVFUVQGI/s400/plagio3.gif" alt="" id="BLOGGER_PHOTO_ID_5374473230226390514" border="0" /&gt;&lt;/a&gt;&lt;a href="http://arleytriana.blogspot.com/2009/08/abstraer-del-codigo-sql-mediante-un.html"&gt;Plagio #3&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_G8kpjzIeQ4o/SpX3qwf3jOI/AAAAAAAAEf4/W_SmWGfe4ME/s1600-h/plagio3_orig.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 364px; height: 400px;" src="http://2.bp.blogspot.com/_G8kpjzIeQ4o/SpX3qwf3jOI/AAAAAAAAEf4/W_SmWGfe4ME/s400/plagio3_orig.gif" alt="" id="BLOGGER_PHOTO_ID_5374474044281687266" border="0" /&gt;&lt;/a&gt;&lt;a href="http://phpsenior.blogspot.com/2007/11/crear-templates-para-consultas-sql.html"&gt;Post Original  #3&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Esta persona, el Ingeniero &lt;a href="http://www.blogger.com/profile/04536576107102887648"&gt;&lt;span style="font-weight: bold;"&gt;Arley Triana Morín&lt;/span&gt;&lt;/a&gt;, vive en Cuba y &lt;span style="font-weight: bold;"&gt;hace un año tuvimos una pequeña discusión&lt;/span&gt;: me envió un email haciendo una consulta técnica y como no le respondí "inmediatamente", directamente me insultó.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_G8kpjzIeQ4o/SpX5WIitZeI/AAAAAAAAEgA/cvU6JG9jMdc/s1600-h/plagio4.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 328px; height: 400px;" src="http://1.bp.blogspot.com/_G8kpjzIeQ4o/SpX5WIitZeI/AAAAAAAAEgA/cvU6JG9jMdc/s400/plagio4.gif" alt="" id="BLOGGER_PHOTO_ID_5374475888982058466" border="0" /&gt;&lt;/a&gt;&lt;a href="http://arleytriana.blogspot.com/2009/08/patron-de-diseno-singleton.html"&gt;Plagio #4&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_G8kpjzIeQ4o/SpX54ATrTwI/AAAAAAAAEgI/wK2l38EUbE0/s1600-h/plagio4_orig.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 297px; height: 400px;" src="http://3.bp.blogspot.com/_G8kpjzIeQ4o/SpX54ATrTwI/AAAAAAAAEgI/wK2l38EUbE0/s400/plagio4_orig.gif" alt="" id="BLOGGER_PHOTO_ID_5374476470887075586" border="0" /&gt;&lt;/a&gt;&lt;a href="http://phpsenior.blogspot.com/2005/09/patrn-de-diseo-singleton.html"&gt;Post Original #4&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Ahora bien, estaba borrando suscripciones a blogs desde mi Google Reader y de casualidad tenía a esta persona registrada. &lt;span style="font-weight: bold;"&gt;Luego de revisar un rato y encontrar "familiares" algunos temas&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;y artículos&lt;/span&gt; (a veces mi memoria me juega malas pasadas), me percato que son copia literal de contenidos de este blog que escribí hace algún tiempo.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_G8kpjzIeQ4o/SpX7j797f7I/AAAAAAAAEgY/jB1YGYli7p8/s1600-h/plagio5.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 354px; height: 400px;" src="http://2.bp.blogspot.com/_G8kpjzIeQ4o/SpX7j797f7I/AAAAAAAAEgY/jB1YGYli7p8/s400/plagio5.gif" alt="" id="BLOGGER_PHOTO_ID_5374478325147991986" border="0" /&gt;&lt;/a&gt;&lt;a href="http://arleytriana.blogspot.com/2009/08/herencia-multiple-en-php5.html"&gt;Plagio #5&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_G8kpjzIeQ4o/SpX7zEz6FEI/AAAAAAAAEgg/M4mhMD6b7Sk/s1600-h/plagio5_orig.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 278px; height: 400px;" src="http://2.bp.blogspot.com/_G8kpjzIeQ4o/SpX7zEz6FEI/AAAAAAAAEgg/M4mhMD6b7Sk/s400/plagio5_orig.gif" alt="" id="BLOGGER_PHOTO_ID_5374478585219912770" border="0" /&gt;&lt;/a&gt;&lt;a href="http://phpsenior.blogspot.com/2006/08/herencia-mltiple-en-php5.html"&gt;Post Original #5&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Nota:&lt;/span&gt; para peor &lt;span style="font-weight: bold;"&gt;cambia los enlaces&lt;/span&gt; que hacen referencia a otros articulos de este mismo blog por las copias en su propio blog (muy prolijo), ni que decir &lt;span style="font-weight: bold;"&gt;eliminar algunos párrafos con comentarios personales&lt;/span&gt; o &lt;span style="font-weight: bold;"&gt;cambiar levemente algún título&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;A las pruebas me remito.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;En resumen:&lt;/span&gt; Arley, yo por lo menos te &lt;span style="font-style: italic;"&gt;"cito"&lt;/span&gt;, y soy el autor original.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19450532-2731044927344844230?l=phpsenior.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpsenior/~4/G5kgDfMsyb4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phpsenior.blogspot.com/feeds/2731044927344844230/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=19450532&amp;postID=2731044927344844230" title="9 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/2731044927344844230?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/2731044927344844230?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phpsenior/~3/G5kgDfMsyb4/copiar-sin-citar-plagio.html" title="Copiar sin citar = Plagio" /><author><name>enrique_place</name><uri>http://www.blogger.com/profile/15452998349449419148</uri><email>enriqueplace@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="03921750821859760589" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_G8kpjzIeQ4o/SpVsjVFV1nI/AAAAAAAAEfI/hEFs4dFNSwA/s72-c/plagio_arley_1.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">9</thr:total><feedburner:origLink>http://phpsenior.blogspot.com/2009/08/copiar-sin-citar-plagio.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYNR3w9fCp7ImA9WxNTEUs.&quot;"><id>tag:blogger.com,1999:blog-19450532.post-2985188034837105309</id><published>2009-08-13T08:57:00.003-03:00</published><updated>2009-08-13T09:56:36.264-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-13T09:56:36.264-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="framework" /><category scheme="http://www.blogger.com/atom/ns#" term="opinión" /><category scheme="http://www.blogger.com/atom/ns#" term="zend framework" /><title>¿Por qué usar un (zend) framework?</title><content type="html">Estas preguntas me la han hecho muchas veces, así que es buen momento para compartirlas en el blog :-)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;¿Para qué sirve un framework?&lt;/li&gt;&lt;li&gt;¿Por qué Zend Framework?&lt;/li&gt;&lt;li&gt;¿Cuales son las ventajas de no hacer todo yo?&lt;/li&gt;&lt;li&gt;etc&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;La idea de los frameworks es que son &lt;span style="font-style: italic;"&gt;"cajas de herramientas"&lt;/span&gt; que puedes aprovechar en tus desarrollos... la filosofía del desarrollo profesional debería ser &lt;span style="font-style: italic;"&gt;"¿cómo harías para construir una casa con las manos y sin martillos? imposible, no terminaría nunca, debo usar herramientas..."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Por ejemplo, no tienes que crearte tu propia clase de persistencia para recuperar o guardar datos, lo cual incluye además de lo básico, muchas funcionalidades que te ahorran tiempo y &lt;span style="font-weight: bold;"&gt;hasta te dan mayor seguridad&lt;/span&gt; por controles internos que ya incorporan de fábrica.&lt;br /&gt;&lt;br /&gt;Si le sumamos que el esquema de trabajo es &lt;span style="font-weight: bold;"&gt;MVC&lt;/span&gt;, ya te da una forma de organizar tus sistemas, donde colocar cada cosa, etc, que te permite &lt;span style="font-weight: bold;"&gt;estandarizar y ahorrar mucho tiempo&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Un ejemplo bastante común: &lt;/span&gt;tú quieres validar un email que recibes de un formulario, en vez de tener que implementar toda esa parte (y hacerlo bien) puedes hacer uso de clases existentes como &lt;span style="font-style: italic;"&gt;Zend_Validate_EmailAddress()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   &lt;code style="white-space: nowrap;"&gt;    &lt;!-- php buffer start --&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;span style="color: rgb(0, 0, 187);"&gt;$email &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;getRequest&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;()-&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;getPost&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;' email'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'none@example.com'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$validator &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Zend_Validate_EmailAddress&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;&lt;br /&gt;if (&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$validator&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;isValid&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$email&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;)) {&lt;br /&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;// email seems valid&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;} else {&lt;br /&gt; &lt;/span&gt;&lt;span style="color: rgb(255, 128, 0);"&gt;// email seems invalid; Outputting the reasons&lt;br /&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;}  &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/code&gt;&lt;br /&gt;&lt;div id=":13g" class="ii gt"&gt;&lt;br /&gt;Listo, sigues adelante y programas el resto de lo importante de tu sistema, ya que lo que te importa es terminar el trabajo, entregar el sistema y cobrar al cliente.&lt;br /&gt;&lt;br /&gt;De alguna forma, muy resumida, te &lt;span style="font-weight: bold;"&gt;"profesionaliza"&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;No sé si quedó claro el ejemplo ;-)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;PD:&lt;/span&gt; se podría decir que lo importante no es si usas Zend Framework (más allá que yo lo use), creo que deberías por lo menos conocer alguno y estudiarlo en profundidad para sacarle provecho en el reuso de componentes y experiencia de la empresa o grupo que lo desarrolló. Siempre existirán ventajas, más si tu eres un equipo reducido de desarrolladores y el framework fue hecho por un equipo más grande y especializado en su diseño y desarrollo, no lo hicieron en su tiempo libre.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"Apóyate en hombros de gigantes"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19450532-2985188034837105309?l=phpsenior.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpsenior/~4/RpJFCFPWmuE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phpsenior.blogspot.com/feeds/2985188034837105309/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=19450532&amp;postID=2985188034837105309" title="11 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/2985188034837105309?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/2985188034837105309?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phpsenior/~3/RpJFCFPWmuE/por-que-usar-un-zend-framework.html" title="¿Por qué usar un (zend) framework?" /><author><name>enrique_place</name><uri>http://www.blogger.com/profile/15452998349449419148</uri><email>enriqueplace@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="03921750821859760589" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">11</thr:total><feedburner:origLink>http://phpsenior.blogspot.com/2009/08/por-que-usar-un-zend-framework.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYEQXc9fCp7ImA9WxJaGUQ.&quot;"><id>tag:blogger.com,1999:blog-19450532.post-6421025594328991198</id><published>2009-07-26T22:00:00.003-03:00</published><updated>2009-08-11T09:35:00.964-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-11T09:35:00.964-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="optimización" /><title>¿Entrando en la "optimización extrema"?</title><content type="html">&lt;div style="text-align: justify;"&gt;Siempre fui renuente a todos los artículos sobre &lt;a href="http://phpsenior.blogspot.com/2008/06/optimizacin-aplicaciones-php-client.html"&gt;"optimización extrema"&lt;/a&gt;, ya que en PHP es muy poco probable que sirva hilar tan fino como para decir que:&lt;br /&gt;&lt;br /&gt;++$a es más rápido que $a++ (aunque encontraremos opiniones opuestas)&lt;br /&gt;&lt;br /&gt;Que foreach es más lento que un for, o que para imprimir varios valores en un echo es "más rápido" hacerlo con "," que con ".", etcétera.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;No será la primera vez que diré que me parece una locura este tipo de optimizaciones&lt;/span&gt;, no tienen sentido en un ambiente web, en un entorno &lt;a href="http://es.wikipedia.org/wiki/LAMP"&gt;LAMP&lt;/a&gt;, y particularmente para PHP... a menos que estemos usando este lenguaje para hacer grandes "cálculos científicos" en memoria, pero estimo que si necesitas esto, erraste el entorno y el lenguaje para hacerlo.&lt;br /&gt;&lt;/div&gt;&lt;span style="font-size:180%;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;"Optimizaciones Reales"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Para el que no lo sepa, en la actualidad trabajo durante la semana en una empresa argentina relacionada con productos / servicios vinculados a los celulares, y nuestra principal tarea es -muy resumidamente- &lt;a href="http://phpsenior.blogspot.com/search?q=SMS"&gt;enviar y recibir SMS&lt;/a&gt; (aunque ahora estamos empezando a trabajar con &lt;a href="http://es.wikipedia.org/wiki/Multimedia_Messaging_System"&gt;MMS&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;También desarrollamos sistemas de administración y estadísticas para nosotros y para nuestros clientes (que son sistemas que ahora se hacen mayormente con &lt;a href="http://phpsenior.blogspot.com/search?q=Zend+Framework"&gt;Zend Framework&lt;/a&gt;), pero para estos sistemas nuestro tráfico es &lt;span style="font-style: italic;"&gt;"reducido y controlado"&lt;/span&gt;, lo opuesto a un servicio público como podría ser una red social donde los usuarios van creciendo día a día.&lt;br /&gt;&lt;br /&gt;En este caso, de los sistemas web comunes, &lt;span style="font-weight: bold;"&gt;la "optimización extrema" no tienen ningún tipo de efecto&lt;/span&gt;, más que intentar hacer las cosas bien dentro de los &lt;span style="font-style: italic;"&gt;"parámetros conocidos"&lt;/span&gt; y muchas veces estamos hablando de &lt;span style="font-weight: bold;"&gt;hacer las consultas sql de forma correcta&lt;/span&gt; (algo que no es tampoco común para la media de los desarrolladores PHP).&lt;br /&gt;&lt;br /&gt;Pero en el primer caso, nosotros somos una empresa que podemos "estar orgullosos" que &lt;span style="font-weight: bold;"&gt;hacemos el envío de SMS/MMS a través de un ambiente web que incluye Apache, MySQL y PHP&lt;/span&gt; (aunque muchos podría discutir que no es la mejor tecnología, tal vez sería mejor usar arquitecturas como Java y puedo llegar a estar de acuerdo con ellos).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Desde hace unas semanas estamos haciendo funcionar una aplicación masiva&lt;/span&gt; en la que existen miles de usuarios enviando miles de SMS para juntar puntos en modalidad de "&lt;span style="font-weight: bold;"&gt;trivia&lt;/span&gt;" (se envían preguntas y se deben responder con opciones como "A" o "B") para un concurso que durará unos meses. &lt;span style="font-weight: bold;"&gt;Cada &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://es.wikipedia.org/wiki/Servicio_de_mensajes_cortos#Mensajes_MT-SM_.28de_llegada_al_tel.C3.A9fono.29_y_MO-SM_.28originados_en_el_tel.C3.A9fono.29"&gt;MO&lt;/a&gt;&lt;span style="font-weight: bold;"&gt; (mensaje originado por el usuario) enviado equivale a una instancia de apache&lt;/span&gt; evaluando la información recibida, registrando todos los datos y respondiendo a continuación con un &lt;span style="font-weight: bold;"&gt;&lt;a href="http://es.wikipedia.org/wiki/Servicio_de_mensajes_cortos#Mensajes_MT-SM_.28de_llegada_al_tel.C3.A9fono.29_y_MO-SM_.28originados_en_el_tel.C3.A9fono.29"&gt;MT&lt;/a&gt; &lt;/span&gt;(mensaje originado por el sistema). El juego cambia de comportamiento de acuerdo al tipo de jugador, tiene incentivadores que motivan al jugador seguir en carrera, le informa los puntos, le envía nuevos desafíos, lo recaptura si deja de jugar por distintas unidades de tiempo, etc.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Y aquí es donde entra la optimización que yo le llamaría "extrema"&lt;/span&gt;. Les comparto algunas prácticas que fui aprendiendo sobre la marcha para que las discutamos juntos a ver que les parece y si no son tan esotéricas como las "++$a versus $a++":&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;Evitar el acceso a la base de datos &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Generalmente&lt;span style="font-weight: bold;"&gt; el "cuello de botella" de los servidores está en el acceso a disco&lt;/span&gt;, el consumo de procesador es mínimo, pero sí es crítico el acceso a la base de datos y el principal recurso es acceder al disco. Una decisión de diseño fue&lt;span style="font-weight: bold;"&gt; evitar en algunos casos acceder a una tabla para traer datos y los dejamos "estáticos" en un array dentro de una clase&lt;/span&gt; (evitamos conectar, consultar, traer datos, desconectar).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Desventajas:&lt;/span&gt; perdemos "flexibilidad" ya que en vez de tener un admin que acceda a una tabla hay que modificar el código en el fuente (en nuestro caso son datos que no cambiarán frecuentemente y más que flexibilidad buscamos rendimiento y que el sistema no quede sin recursos).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;Evitar repetir el acceso a base de datos&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Nuevamente, nuestro cuello de botella. Algo muy común cuando desarrollamos orientado a objetos es que&lt;span style="font-weight: bold;"&gt; cada objeto es independiente del otro&lt;/span&gt;, y si lo hacemos "3 capas", en algún momento cada objeto terminará accediendo a la base de datos por su cuenta.&lt;br /&gt;&lt;br /&gt;Me ha pasado de implementar un log que activo con todas las consultas del sistema y ver que se repiten algunas consultas dentro del mismo acceso al sistema, una y otra vez, cuando en sí están trayendo la misma información.&lt;br /&gt;&lt;br /&gt;Por ejemplo (el ejemplo no es real, pero lo que importa es el concepto), imaginen que tengo el nombre del usuario en la base de datos y cada vez que hago algo como &lt;span style="font-weight: bold;"&gt;$jugador-&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;getNombre&lt;/span&gt;()&lt;/span&gt; hace un &lt;span style="font-weight: bold;"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;SELECT&lt;/span&gt; nombre &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;FROM&lt;/span&gt; jugadores &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;WHERE&lt;/span&gt; id = 100;&lt;/span&gt;. Como la instancia se usa en varias partes del sistema y requiere verificar información del nombre en distintas oportunidades, esta consulta se repite "n" veces. Para evitar esto se cambia la operativa por una "carga tardía" (&lt;a href="http://en.wikipedia.org/wiki/Lazy_loading"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;lazy&lt;/span&gt; load&lt;/a&gt;), &lt;span style="font-weight: bold;"&gt;nunca cargar nada hasta que lo necesite&lt;/span&gt; (no cargues toda la información en el constructor del objeto), y cuando ya tenga el valor, y si es un valor que no tiende a cambiar/&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;actualizarse&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;retornar su contenido sin ir nuevamente a la base&lt;/span&gt; (parece tonto, pero hasta que no lo detectas que lo estás haciendo no tomas conciencia de que debes evitarlo).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Antes lo podrías tener así:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_G8kpjzIeQ4o/Sm0C3vTpLDI/AAAAAAAAEew/AgERTYvPisU/s1600-h/1.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 67px;" src="http://3.bp.blogspot.com/_G8kpjzIeQ4o/Sm0C3vTpLDI/AAAAAAAAEew/AgERTYvPisU/s400/1.gif" alt="" id="BLOGGER_PHOTO_ID_5362945887883045938" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Luego lo podrías cambiar por:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_G8kpjzIeQ4o/Sm0DDXSCFxI/AAAAAAAAEe4/u6AkGOhMoGY/s1600-h/2.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 89px;" src="http://3.bp.blogspot.com/_G8kpjzIeQ4o/Sm0DDXSCFxI/AAAAAAAAEe4/u6AkGOhMoGY/s400/2.gif" alt="" id="BLOGGER_PHOTO_ID_5362946087592269586" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;Mejorar el acceso a base de datos&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Algo que es poco común que un desarrollador domine, hacer correctas consultas a las bases de datos, agregar índices según lo que necesitemos hacer, evitar los índices en los lugares que no conviene, verificar el tipo de cada campo y si realmente es el que necesitamos.&lt;br /&gt;&lt;br /&gt;Algunas pautas que recuerdo ahora:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Revisa por qué campos haces normalmente las condiciones de tus &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;WHERE&lt;/span&gt;&lt;/span&gt; y crea un índice (recuerda que las claves primarias generan implícitamente un índice).&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Recuerda que por cada índice que agregues tu tabla se recarga si esta tienen que actualizar los datos constantemente&lt;/span&gt;, ya que hará un "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;insert&lt;/span&gt;" en la tabla real y luego deberá actualizar el índice (como si fueran dos tablas). Si tienes 100 índices, y es una tabla grande y con muchas &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;actualizaciones&lt;/span&gt;, será mejor que te tomes el tiempo y veas cual puedes eliminar.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Diferencia las tablas de "lectura/escritura" sobre las de "solo lectura&lt;/span&gt;". Si tu tabla necesita hacer ambas y sabes que crecerá, limita la cantidad de índices (ver punto anterior), pero si es de solo lectura, puedes tomarte la libertad de agregar más índices que en el primer caso.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Usa los mismos tipos y largos en los campos de tus tablas:&lt;/span&gt; si creas jugador_id y es un &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;int&lt;/span&gt;(11), que así sea en todas las demás tablas, ya que unir campos que son de distintos tamaños tendrá un costo de conversión al compararlos.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Diferencia lo que es un &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;varchar&lt;/span&gt; de un &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;char&lt;/span&gt;:&lt;/span&gt; si tus valores de texto serán fijos, es decir, tienes un campo de 100 caracteres que será probable que siempre esté lleno, usa &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;char&lt;/span&gt;(100), si puede que esté lleno de caracteres o existan casos donde no tenga nada, o pocos (10 caracteres), define que es de tipo &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;varchar&lt;/span&gt; (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;var&lt;/span&gt; = variable).&lt;/li&gt;&lt;li&gt;etc&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;En estos casos (bueno, siempre) el manual del motor de base de datos es tu amigo.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;No tengas miedo de desnormalizar una base de datos&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Lo aprendí con el tiempo, no ser extremista y purista, luego de aprender las reglas, descubre cuando se justifica romperlas para sacar más provecho ;-)&lt;br /&gt;&lt;br /&gt;Nos pasó que ante un tráfico masivo de datos estábamos teniendo un crecimiento desmedido en tablas que registran la entrega y salida de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;SMS&lt;/span&gt;, y que cuando queríamos hacer un cruzamiento de datos entre otras tablas, las consultas nos generaban pérdidas de segundos muy valiosos.&lt;br /&gt;&lt;br /&gt;Por ejemplo, si nosotros tenemos un sistema que maneja múltiples &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;carriers&lt;/span&gt;, por lógica deberíamos tener en la tabla de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;participantes&lt;/span&gt; el número de celular y el número de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;carrier&lt;/span&gt; al cual corresponde. En sistemas donde las tablas de &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;participantes&lt;/span&gt; pueden crecer exponencialmente no es conveniente que por cada &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;MO&lt;/span&gt; tengamos que acceder a una tabla extra para saber esta información, por lo que en tablas importantes "desnormalizamos" su acceso y duplicamos estos campos para evitar tener que hacer un &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;join&lt;/span&gt; contra una tabla extra (y así con otros datos).&lt;br /&gt;&lt;br /&gt;Duplica campos en distintas tablas (número de teléfono, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;carrier&lt;/span&gt;, id de usuario, etc) para evitar tener que hacer &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;joins&lt;/span&gt; contra una tabla que crece y se actualiza constantemente.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;Evita acceder a los datos de producción para hacer consultas&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Aunque puede ser obvio, &lt;span style="font-weight: bold;"&gt;evita tener un sistema de estadísticas para tu clientes que hagan consultas directas contra una base de datos en producción&lt;/span&gt;. Cualquier consulta compleja puede tirar el rendimiento de tu sistema. Puedes intentar duplicar la base en otro servidor una vez al día, o simplemente &lt;span style="font-weight: bold;"&gt;crear "tablas resúmenes"&lt;/span&gt; con un proceso que corre cada "x" horas y en vez de sumar todos los datos cada vez que se consulta, ya lo haces en la carga y el sistema de &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_24"&gt;estadísticas&lt;/span&gt; muestra solo los totales.&lt;br /&gt;&lt;br /&gt;Si quieres darte un lujo, &lt;span style="font-weight: bold;"&gt;solo accede a producción para dar datos "reales" con un "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;count&lt;/span&gt;"&lt;/span&gt;, y si quieres acceder a tablas, que estas no sean las más usadas.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;En resumen&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Fuera que descarto que debemos diseñar bien nuestro sistema pensado cual será el contexto en el cual funcionará, pensar en las clases y sus relaciones, y ver si estamos programando correctamente, a menos que estemos hablando de muchas clases por cada vez que hay una invocación en nuestro sistema (estoy hablando de 50 clases o más), &lt;span style="font-weight: bold;"&gt;lo más probable es que la &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;optimización&lt;/span&gt; no se deba hacer en el código &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;PHP&lt;/span&gt;&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;probablemente&lt;/span&gt; esté más orientado hacia nuestra &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_29"&gt;comunicación&lt;/span&gt; con la base de datos (y descarto que ya estamos usando algún sistema de caché del lado del servidor).&lt;br /&gt;&lt;br /&gt;Sé que no es de todos los días tener este tipo de situaciones de cantidades masivas de tráfico, pero cuando ocurren, estos detalles afectan el rendimiento o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_30"&gt;directamente&lt;/span&gt; la estabilidad del servidor.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;¿Tienes algún &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_31"&gt;tips&lt;/span&gt; para compartir? ¿cual fue tu experiencia en estos casos? ;-)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Artículos relacionados:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;h3 class="post-title"&gt;&lt;a href="http://phpsenior.blogspot.com/2008/06/optimizacin-aplicaciones-php-client.html"&gt;"&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_32"&gt;Optimización&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_33"&gt;aplicaciones&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_34"&gt;PHP&lt;/span&gt; - &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_35"&gt;Client&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_36"&gt;side&lt;/span&gt;"&lt;/a&gt;&lt;/h3&gt;&lt;/li&gt;&lt;li&gt;&lt;h3 class="post-title"&gt;&lt;a href="http://phpsenior.blogspot.com/2008/12/rendimiento-conviene-utilizar-poo.html"&gt;"Rendimiento: ¿conviene utilizar &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_37"&gt;POO&lt;/span&gt;?"&lt;/a&gt;&lt;/h3&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19450532-6421025594328991198?l=phpsenior.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpsenior/~4/M5bgEy_4Bfo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phpsenior.blogspot.com/feeds/6421025594328991198/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=19450532&amp;postID=6421025594328991198" title="11 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/6421025594328991198?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/6421025594328991198?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phpsenior/~3/M5bgEy_4Bfo/entrando-en-la-optimizacion-extrema.html" title="¿Entrando en la &quot;optimización extrema&quot;?" /><author><name>enrique_place</name><uri>http://www.blogger.com/profile/15452998349449419148</uri><email>enriqueplace@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="03921750821859760589" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_G8kpjzIeQ4o/Sm0C3vTpLDI/AAAAAAAAEew/AgERTYvPisU/s72-c/1.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">11</thr:total><feedburner:origLink>http://phpsenior.blogspot.com/2009/07/entrando-en-la-optimizacion-extrema.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YGR3Yzfip7ImA9WxJbFkk.&quot;"><id>tag:blogger.com,1999:blog-19450532.post-535328792500998424</id><published>2009-07-26T18:51:00.007-03:00</published><updated>2009-07-26T19:58:46.886-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-26T19:58:46.886-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="novedades" /><title>Retomando los artículos del blog</title><content type="html">&lt;div style="text-align: justify;"&gt;Estimados lectores, como sabrán (dadas &lt;a href="http://www.surforce.com/"&gt;mis actividades de público conocimiento&lt;/a&gt; y las otras, trabajo, familia, etc), he estado un poco alejado de este blog, aunque a veces escribo en &lt;a href="http://enriqueplace.blogspot.com/"&gt;mi blog personal&lt;/a&gt;, tengo bastantes reclamos de ustedes para que retome el ritmo aquí&lt;span style="font-weight: bold;"&gt; :-)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;También voy haciendo micro-post a través de mis cuentas de &lt;/span&gt;twitter (&lt;a href="http://twitter.com/enriqueplace"&gt;la personal&lt;/a&gt;, &lt;a href="http://twitter.com/phpsenior"&gt;la de este blog&lt;/a&gt; y la relacionada a &lt;a href="http://twitter.com/surforce"&gt;SURFORCE y los cursos a distancia&lt;/a&gt;), pero obviamente no es lo mismo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Intentaré seguir prácticas de otros blogs&lt;/span&gt;, hacer un resumen de temas aunque no me de el tiempo de desarrollar un artículo completo al respecto, pero por lo menos podré comentar temas del momento relacionadas con PHP y algunas experiencias más, y en caso de requerirlo a través de los comentarios, me extenderé en lo que pueda.&lt;br /&gt;&lt;br /&gt;Así que, &lt;span style="font-weight: bold;"&gt;retomando ritmo&lt;/span&gt;, como quién dice: este lunes empiezo el gimnasio, sin falta ;-)&lt;br /&gt;&lt;br /&gt;PD: siempre recibo sus sugerencias a través de email o en los comentarios de este blog, así que &lt;span style="font-weight: bold;"&gt;aprovechen este mismo post para tirar ideas de temas que les gustaría tratar en el corto plazo&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Abrazos! ;-)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19450532-535328792500998424?l=phpsenior.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpsenior/~4/0W2iq3iM9yI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phpsenior.blogspot.com/feeds/535328792500998424/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=19450532&amp;postID=535328792500998424" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/535328792500998424?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/535328792500998424?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phpsenior/~3/0W2iq3iM9yI/retomando-los-articulos-del-blog.html" title="Retomando los artículos del blog" /><author><name>enrique_place</name><uri>http://www.blogger.com/profile/15452998349449419148</uri><email>enriqueplace@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="03921750821859760589" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://phpsenior.blogspot.com/2009/07/retomando-los-articulos-del-blog.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEEQn86fyp7ImA9WxJUEUs.&quot;"><id>tag:blogger.com,1999:blog-19450532.post-6356799675767192149</id><published>2009-07-09T14:40:00.009-03:00</published><updated>2009-07-09T16:26:43.117-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-09T16:26:43.117-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tips" /><category scheme="http://www.blogger.com/atom/ns#" term="calidad" /><category scheme="http://www.blogger.com/atom/ns#" term="opinión" /><category scheme="http://www.blogger.com/atom/ns#" term="zend framework" /><title>Comentar código de forma "invisible"</title><content type="html">Este tema tiene un origen histórico, trataré de empezar desde el principio ;-)&lt;br /&gt;&lt;br /&gt;Cuando hace años empezamos en el mundo estático del "html" (cuando el 95% de los sitios solo eran puro html sin dinamismo, sin un lenguaje de scripting), lo que aprendimos fue a &lt;span style="font-weight: bold;"&gt;"programar html" haciendo muchas tablas&lt;/span&gt; (no usábamos los div's como ahora) y para seguir la "cascada" de código le agregábamos comentarios usando el tradicional &amp;lt;!-- --&amp;gt;&lt;br /&gt;&lt;br /&gt;Por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_G8kpjzIeQ4o/SlZB_Dqcs7I/AAAAAAAAEeg/TWmq0Kaeup8/s1600-h/html.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 285px; height: 246px;" src="http://1.bp.blogspot.com/_G8kpjzIeQ4o/SlZB_Dqcs7I/AAAAAAAAEeg/TWmq0Kaeup8/s400/html.gif" alt="" id="BLOGGER_PHOTO_ID_5356541358374695858" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Muy "cómodo" para hacer debug "manual" usando de apoyo los comentarios porque evidentemente era un "humano" el que debía controlar todo esto y se podía perder entre tanto código en cascada ;-)&lt;br /&gt;&lt;br /&gt;Para los "técnicos" esto siempre fue desprolijo, ya que para nuestros futuros clientes o hasta curiosos, estábamos revelando detalles internos de nuestra aplicación / diseño. Está de más decir que no es para nada recomendable hacer comentarios técnicos importantes en ellos ya que &lt;span style="font-weight: bold;"&gt;es "código público" que cualquiera puede leer&lt;/span&gt;, y tampoco comentar código que no se va a usar, ya que es extremadamente desprolijo (si no lo quieres perder, respalda, o &lt;a href="http://phpsenior.blogspot.com/2009/06/lo-bueno-de-usar-un-ide-svn-captura.html"&gt;versiona&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Nota:&lt;/span&gt; no será la primera y última vez que veo en los comentarios de un código html insultos del propio desarrollador, que la verdad queda muy feo ;-)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Primer sugerencia, el código de producción debe estar "limpio"&lt;/span&gt;, y si conoces algún sistema que pueda contener los comentarios en tu código de desarrollo e impida que quede en producción, úsalo.&lt;br /&gt;&lt;br /&gt;Algunos ejemplos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Usando el propio lenguaje de scripting: PHP&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cuando la tecnología evolucionó y empezamos a contar con lenguajes de scripting como PHP, la primera práctica que empezamos a adoptar fue el de embeber el código "dinámico" dentro de nuestro código html, pero dejamos todas las demás prácticas intactas, por lo que los comentarios seguían estando públicos en el html.&lt;br /&gt;&lt;br /&gt;Con el tiempo, dejamos de "embeber" y ya no era tan evidente la manipulación del código html, empezamos a hacer invocaciones a funciones de tipo:&lt;br /&gt;&lt;br /&gt;    &lt;code style="white-space: nowrap;"&gt;    &lt;!-- php buffer start --&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;span style="color: rgb(0, 0, 187);"&gt;generarCabezalHtml&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;generarContenido&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'Hola Mundo'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;generarPie&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();  &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Por lo que ya no es el "humano" que debe seguir tan literalmente el código, ver si cierra o no, porque podemos &lt;a href="http://validator.w3.org/"&gt;validarlo a través de herramientas&lt;/a&gt;, y luego tratar de seguirlo a través del código PHP (aquí también ayudan mucho los &lt;a href="http://es.wikipedia.org/wiki/Entorno_de_desarrollo_integrado"&gt;IDEs&lt;/a&gt; en la pre-validación del código y evitar errores).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Una opción posible es mover todos los comentarios html al código php y estos quedan "privados" dentro del sistema.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Si esto no fuera suficiente, aún se podría generar algo como una configuración que diga "habilitarComentariosHtml" y que genere html con comentarios embebidos, y una vez en producción, eliminar esta opción (pero estaríamos generando mucho código poco productivo para el sistema).&lt;br /&gt;&lt;br /&gt;Sigamos un siguiente nivel en la escala evolutiva ;-)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Usando sistemas de plantillas: Smarty&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Con los años esto no nos quedó muy cómodo y preferimos optar por un sistema de "plantillas" (templates), y limpiar nuestro código PHP. &lt;a href="http://phpsenior.blogspot.com/search?q=Smarty"&gt;Smarty fue una de las mejores opciones por años&lt;/a&gt;, lo cual te ofrecía además un código simil PHP del lado del template, pero podíamos volver a caer en la misma práctica, hacer comentarios html públicos.&lt;br /&gt;&lt;br /&gt;Repitiendo lo que hablamos en el punto anterior, podíamos adoptar el mecanismo de &lt;a href="http://www.smarty.net/manual/es/language.basic.syntax.php#language.syntax.comments"&gt;comentarios de Smarty&lt;/a&gt;, lo cual genera el mismo efecto que hacerlo desde PHP. Se hacía con &lt;span style="font-weight: bold;"&gt;{*&lt;/span&gt; comentarios &lt;span style="font-weight: bold;"&gt;*}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code style="white-space: nowrap;"&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;{* &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;display dropdown lists &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;*}&lt;br /&gt;&lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;select name&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"company"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;&gt;&lt;br /&gt;{&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;html_options options&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$vals selected&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$selected_id&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;}&lt;br /&gt;&lt;!--&lt;/span--&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;select&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;La diferencia con el primer caso de "solo html" es que lo estamos haciendo en la plantilla y no es público, y tampoco lo estamos haciendo del lado de PHP ya que toda la parte de generado de html era responsabilidad de Smarty (como una &lt;a href="http://phpsenior.blogspot.com/2006/04/php5-diseo-en-3-capas-y-problemas-con.html"&gt;separación de capas&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Siguiendo con la evolución...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Nos pasamos a Zend Framework y usamos "Vistas"  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Las vistas son como al principio de nuestra era, código html donde se embebe código PHP de la siguiente forma (un mix entre PHP embebido y sistema de plantillas).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_G8kpjzIeQ4o/SlZBUuV_1SI/AAAAAAAAEeY/i6_oOfCfFLU/s1600-h/zend_vista_embebida.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 198px;" src="http://2.bp.blogspot.com/_G8kpjzIeQ4o/SlZBUuV_1SI/AAAAAAAAEeY/i6_oOfCfFLU/s400/zend_vista_embebida.gif" alt="" id="BLOGGER_PHOTO_ID_5356540631097267490" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Y volvemos al principio, he visto muchos proyectos que para poder hacer seguimiento de lo que generan de html tienen comentarios públicos html por todos lados, por lo que mi sugerencia final es... &lt;span style="font-weight: bold;"&gt;hagamos los comentarios dentro de la la vista, dentro del código PHP embebido y no dejemos expuestos nuestros comentarios internos.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Existen también herramientas que limpian el código, lo compactan y hasta te lo ofuscan, bien podrían ser una alternativa.&lt;br /&gt;&lt;br /&gt;Pero la idea es esa, trata de no dejar comentarios que los pueda leer todo el mundo, sé ordenado y limpio. En lo personal cuando voy a ver páginas de diseño web que se ufanan de seguir "estándares", descubrir luego tablas o comentarios del tipo "abre tabla", "cierra tabla", etc, no me dejan muy tranquilo.&lt;br /&gt;&lt;br /&gt;¿Qué opinas? ¿cuales son tus prácticas? ¿o no te importa que puedan descubrir leyendo el código de tu sitio? ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19450532-6356799675767192149?l=phpsenior.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpsenior/~4/a-Z7myw8xNs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phpsenior.blogspot.com/feeds/6356799675767192149/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=19450532&amp;postID=6356799675767192149" title="10 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/6356799675767192149?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/6356799675767192149?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phpsenior/~3/a-Z7myw8xNs/comentar-codigo-de-forma-invisible.html" title="Comentar código de forma &quot;invisible&quot;" /><author><name>enrique_place</name><uri>http://www.blogger.com/profile/15452998349449419148</uri><email>enriqueplace@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="03921750821859760589" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_G8kpjzIeQ4o/SlZB_Dqcs7I/AAAAAAAAEeg/TWmq0Kaeup8/s72-c/html.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">10</thr:total><feedburner:origLink>http://phpsenior.blogspot.com/2009/07/comentar-codigo-de-forma-invisible.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YNSH87cSp7ImA9WxJVEk0.&quot;"><id>tag:blogger.com,1999:blog-19450532.post-3776970610644347240</id><published>2009-06-28T12:53:00.003-03:00</published><updated>2009-06-28T13:06:39.109-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-28T13:06:39.109-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="cursos" /><category scheme="http://www.blogger.com/atom/ns#" term="POO" /><category scheme="http://www.blogger.com/atom/ns#" term="PHP5" /><category scheme="http://www.blogger.com/atom/ns#" term="surforce" /><category scheme="http://www.blogger.com/atom/ns#" term="zend framework" /><title>Cursos SURFORCE: ¡falta una semana para iniciar!</title><content type="html">Para todos los que están interesados en participar de &lt;a href="http://registracion.surforce.com/cursos/"&gt;los cursos de educación a distancia&lt;/a&gt;, les comento que queda solo una semana para empezar, la cual fijamos como primer lunes de julio (6/7).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;El cupo máximo para un grupo son de 20 alumnos&lt;/span&gt;, posteriormente se abre un siguiente grupo que iniciaría una semana después (13/7).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;El estado actual de los lugares confirmados:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Introducción a los Patrones de Diseño para PHP5  =  7&lt;/li&gt;&lt;li&gt;Análisis y Diseño Orientado a Objetos para PHP5  =  9&lt;/li&gt;&lt;li&gt;Introducción a Zend Framework  =  10&lt;/li&gt;&lt;li&gt;POO PHP5 2009 + Libro  =  19&lt;/li&gt;&lt;/ul&gt;Recordatorio, aún quedan registraciones sin confirmar el pago, pero, &lt;span style="font-weight: bold;"&gt;quién &lt;span style="font-size:130%;"&gt;&lt;a href="http://registracion.surforce.com/"&gt;se registre ahora&lt;/a&gt;&lt;/span&gt; y pague inmediatamente obtiene el lugar disponible&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Se recibirán los pagos hasta el viernes inclusive, &lt;span style="font-weight: bold;"&gt;no se recibirán pagos durante el último fin de semana&lt;/span&gt;, ya que lo usaré para &lt;a href="http://formacion.surforce.com"&gt;preparar los sistemas&lt;/a&gt; para iniciar los cursos.&lt;br /&gt;&lt;br /&gt;Por lo tanto ¡última semana! ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19450532-3776970610644347240?l=phpsenior.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpsenior/~4/RtjwhVYBSNI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phpsenior.blogspot.com/feeds/3776970610644347240/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=19450532&amp;postID=3776970610644347240" title="3 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/3776970610644347240?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/3776970610644347240?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phpsenior/~3/RtjwhVYBSNI/cursos-surforce-falta-una-semana-para.html" title="Cursos SURFORCE: ¡falta una semana para iniciar!" /><author><name>enrique_place</name><uri>http://www.blogger.com/profile/15452998349449419148</uri><email>enriqueplace@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="03921750821859760589" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://phpsenior.blogspot.com/2009/06/cursos-surforce-falta-una-semana-para.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMFR3o8eyp7ImA9WxJWF0o.&quot;"><id>tag:blogger.com,1999:blog-19450532.post-143127835945961126</id><published>2009-06-19T20:29:00.012-03:00</published><updated>2009-06-23T14:16:56.473-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-23T14:16:56.473-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="gestion" /><category scheme="http://www.blogger.com/atom/ns#" term="cursos" /><category scheme="http://www.blogger.com/atom/ns#" term="surforce" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><category scheme="http://www.blogger.com/atom/ns#" term="google docs" /><title>Google Docs para gestionar proyectos a distancia (actualización 23/6)</title><content type="html">&lt;div style="text-align: justify;"&gt;A veces las herramientas simples pueden ser de gran utilidad cuando no contamos con infraestructura en sistemas, problemas de tiempo o por no haber encontrado la herramienta "ideal" (existen muchos sistemas, pero a veces hacen más de lo que necesitamos y se vuelven complejos de usar).&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_G8kpjzIeQ4o/SjwhVhxztEI/AAAAAAAAEbw/4VtEKHk0t40/s1600-h/captura1_panilla.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 314px; height: 399px;" src="http://4.bp.blogspot.com/_G8kpjzIeQ4o/SjwhVhxztEI/AAAAAAAAEbw/4VtEKHk0t40/s400/captura1_panilla.gif" alt="" id="BLOGGER_PHOTO_ID_5349187111137555522" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Lo bueno de usar &lt;a href="http://docs.google.com/"&gt;Google Docs&lt;/a&gt; es que te resuelve muchos problemas de forma muy simple, agregando una característica muy importante: se puede acceder remotamente desde cualquier navegador sin siquiera necesitar un servidor dedicado y su curva de aprendizaje es muy suave... &lt;span style="font-weight: bold;"&gt;¿quién no sabe usar una planilla electrónica?&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Fundamentalmente hay que usar un poco de imaginación y bien podremos aplicarlo para gestionar un proyecto web a distancia... como lo estamos haciendo ahora en la última tarea del curso a distancia de &lt;a href="http://registracion.surforce.com/cursos/"&gt;Análisis y Diseño Orientado a Objetos&lt;/a&gt;, aplicando técnicas de gestión ágil entre 4 personas ;-)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_G8kpjzIeQ4o/SjwicVW8qJI/AAAAAAAAEb4/ubN9KK8YoXY/s1600-h/captura2_panilla.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 236px;" src="http://4.bp.blogspot.com/_G8kpjzIeQ4o/SjwicVW8qJI/AAAAAAAAEb4/ubN9KK8YoXY/s400/captura2_panilla.gif" alt="" id="BLOGGER_PHOTO_ID_5349188327574382738" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Aquí se puede visualizar la organización de la planilla, compartida entre 4 personas, donde tienes dos grandes divisiones que representan zonas de trabajo: el &lt;span style="font-weight: bold;"&gt;"Frontend"&lt;/span&gt; (la parte pública del sistema) y el &lt;span style="font-weight: bold;"&gt;"Backend"&lt;/span&gt; (la parte privada, el "admin" del sistema). Posteriormente agregamos el título de la tarea y una breve descripción de lo que involucra (no más, esto ayuda a dimensionar claramente lo que lleva hacer el sistema sin ambigüedades y costos ocultos).&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Forma de trabajo&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Una vez definidas las tareas macro, podemos empezar a&lt;span style="font-weight: bold;"&gt; agregar las tareas "micro" o sub-tareas&lt;/span&gt;, para llegar a afinar lo que hay que hacer, por ejemplo: al principio definimos una tarea &lt;span style="font-style: italic;"&gt;"login" &lt;/span&gt;que era solo &lt;span style="font-style: italic;"&gt;"involucra mostrar el formulario"&lt;/span&gt;, pero luego lo extendimos porque nos dimos cuenta que además había que hacer &lt;span style="font-style: italic;"&gt;"agregar validación por clave"&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;La idea es que las &lt;span style="font-weight: bold;"&gt;prioridades &lt;/span&gt;se definen de acuerdo a su aparición en la planilla, es decir, &lt;span style="font-weight: bold;"&gt;lo que está arriba es más importante que lo que está abajo&lt;/span&gt;. También pueden ver esto en las divisiones más grandes como Frontend y Backend, en este caso, como estamos siguiendo una &lt;a href="http://es.wikipedia.org/wiki/Proceso_%C3%83%C2%81gil"&gt;&lt;span style="font-style: italic;"&gt;"metodología ágil"&lt;/span&gt;&lt;/a&gt;, nuestra prioridad es hacer entregables&lt;span style="font-style: italic;"&gt; "visibles para el cliente"&lt;/span&gt;, así que empezamos por el Frontend.&lt;/li&gt;&lt;li&gt;Para auto-organizarnos, &lt;span style="font-weight: bold;"&gt;cada desarrollador toma la tarea que quiere hacer de la lista&lt;/span&gt; (siguiendo el orden de prioridad) y luego la marca con "verde" y pone su nombre en la columna a la extrema derecha. Así, todos sabemos quién está haciendo qué y así podemos tomar la siguiente tarea, evitando &lt;span style="font-style: italic;"&gt;"cuellos de botella"&lt;/span&gt; ya que no existe alguien que deba asignar tareas al equipo, siempre hay algo para hacer y evitamos tiempos muertos.&lt;/li&gt;&lt;li&gt;Una vez terminada, se colorea en "gris".&lt;/li&gt;&lt;li&gt;Si queda suspendida por algo, usaremos un color "amarillo".&lt;/li&gt;&lt;li&gt;etc.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;Otra cosa que usamos son las &lt;span style="font-weight: bold;"&gt;solapas al pié de la planilla &lt;/span&gt;para agregar otras secciones en el proyecto, como links a documentación (también documentos web compartidos), separar los bugs de las funcionalidades, etc.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_G8kpjzIeQ4o/SjwmRgDWtWI/AAAAAAAAEcA/3lqpyLmWuRY/s1600-h/captura3_panilla.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 77px;" src="http://3.bp.blogspot.com/_G8kpjzIeQ4o/SjwmRgDWtWI/AAAAAAAAEcA/3lqpyLmWuRY/s400/captura3_panilla.gif" alt="" id="BLOGGER_PHOTO_ID_5349192539512943970" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Lo bueno es que en un momento dado podemos estar varias personas a la vez en la planilla  (desde distintos países) y todos vemos en el instante lo que pasa y hasta podemos usar el chat a la derecha para discutir algún tema en particular.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_G8kpjzIeQ4o/SjwmxRlILjI/AAAAAAAAEcI/a6PjZ3szXhA/s1600-h/captura4_panilla.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 241px; height: 227px;" src="http://4.bp.blogspot.com/_G8kpjzIeQ4o/SjwmxRlILjI/AAAAAAAAEcI/a6PjZ3szXhA/s400/captura4_panilla.gif" alt="" id="BLOGGER_PHOTO_ID_5349193085383880242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Todo con una simple planilla web.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Si lo quieres ver, &lt;a href="http://spreadsheets.google.com/pub?key=rA45T1DXG-GNl4L37OU3nlA&amp;amp;output=html"&gt;también puedes hacer el documento público&lt;/a&gt; para que tu cliente siga los avances del proyecto ;-)&lt;br /&gt;&lt;br /&gt;¿Qué más se te ocurre que podrías agregar? ¿algún otro sistema simple que uses y quieras compartir? ;-)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Actualización&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Luis Artola, estimado colega, levanta el guante y &lt;a href="http://www.programania.net/desarrollo-agil/control-de-las-funcionalidades-de-un-producto-con-google-docs/"&gt;hace un post comentado su experiencia&lt;/a&gt; usando Google Docs en la gestión de proyectos.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19450532-143127835945961126?l=phpsenior.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpsenior/~4/HD5EN9_QnLc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phpsenior.blogspot.com/feeds/143127835945961126/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=19450532&amp;postID=143127835945961126" title="7 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/143127835945961126?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/143127835945961126?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phpsenior/~3/HD5EN9_QnLc/google-docs-para-gestionar-proyectos.html" title="Google Docs para gestionar proyectos a distancia (actualización 23/6)" /><author><name>enrique_place</name><uri>http://www.blogger.com/profile/15452998349449419148</uri><email>enriqueplace@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="03921750821859760589" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_G8kpjzIeQ4o/SjwhVhxztEI/AAAAAAAAEbw/4VtEKHk0t40/s72-c/captura1_panilla.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total><feedburner:origLink>http://phpsenior.blogspot.com/2009/06/google-docs-para-gestionar-proyectos.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUCQn06fip7ImA9WxJXF0U.&quot;"><id>tag:blogger.com,1999:blog-19450532.post-1368499844740061573</id><published>2009-06-12T03:19:00.003-03:00</published><updated>2009-06-12T03:31:03.316-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-12T03:31:03.316-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="cursos" /><category scheme="http://www.blogger.com/atom/ns#" term="surforce" /><title>SURFORCE_CURSOS: temarios disponibles!</title><content type="html">&lt;div style="text-align: justify;"&gt;Se encuentran &lt;a href="http://registracion.surforce.com/cursos/"&gt;disponibles los temarios de cada curso&lt;/a&gt; que estarán iniciando a partir de los primeros días de julio. También, durante este fin de semana, quedará habilitada la posibilidad de pagar  a través &lt;span style="text-decoration: underline;"&gt;de la web&lt;/span&gt; vuestro lugar en los grupos de los cursos (Paypal, Western Union y giro bancario si estás en Argentina).&lt;br /&gt;&lt;br /&gt;Antes que se inicie el proceso de pagos, le estaré comunicando a todos los &lt;a href="http://registracion.surforce.com"&gt;usuarios registrados&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;PD:&lt;/span&gt; sepan disculpar las demoras (tengo bastantes correos pendientes).  Esta semana hemos estado con pequeños problemas de salud (comunes para el invierno) lo que obligó a estar algunos días en cama.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;¡Saludos! ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19450532-1368499844740061573?l=phpsenior.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpsenior/~4/8cVkzwJ_zHA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phpsenior.blogspot.com/feeds/1368499844740061573/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=19450532&amp;postID=1368499844740061573" title="2 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/1368499844740061573?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/1368499844740061573?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phpsenior/~3/8cVkzwJ_zHA/surforcecursos-temarios-disponibles.html" title="SURFORCE_CURSOS: temarios disponibles!" /><author><name>enrique_place</name><uri>http://www.blogger.com/profile/15452998349449419148</uri><email>enriqueplace@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="03921750821859760589" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://phpsenior.blogspot.com/2009/06/surforcecursos-temarios-disponibles.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEIMSX05eip7ImA9WxJXFUg.&quot;"><id>tag:blogger.com,1999:blog-19450532.post-355776456365166269</id><published>2009-06-08T20:14:00.007-03:00</published><updated>2009-06-09T10:03:08.322-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-09T10:03:08.322-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IDE" /><category scheme="http://www.blogger.com/atom/ns#" term="herramientas" /><category scheme="http://www.blogger.com/atom/ns#" term="svn" /><title>Lo bueno de usar un IDE + SVN (captura)</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_G8kpjzIeQ4o/Si2cjpbnk5I/AAAAAAAAEbQ/xLz5uTgaqe0/s1600-h/captura_diff_netbeans.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 138px;" src="http://1.bp.blogspot.com/_G8kpjzIeQ4o/Si2cjpbnk5I/AAAAAAAAEbQ/xLz5uTgaqe0/s400/captura_diff_netbeans.gif" alt="" id="BLOGGER_PHOTO_ID_5345100468989694866" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;A veces entramos fácilmente en la discusión de si usar un &lt;a href="http://es.wikipedia.org/wiki/Entorno_de_desarrollo_integrado"&gt;IDE&lt;/a&gt; o un "Editor con Esteroides", o si usar o no un &lt;a href="http://es.wikipedia.org/wiki/Software_Configuration_Management"&gt;SCM&lt;/a&gt;, etc, bueno, aquí un ejemplo de lo que es retomar un proyecto que dejaste colgado y no te acuerdas qué fue lo último que modificaste localmente con respecto a lo último que tienes en tu servidor de producción.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Usando Netbeans 6.7 RC2 + SVN&lt;/span&gt;, abro el fuente y le doy a la combinación &lt;span style="font-weight: bold;"&gt;"ALT + D"&lt;/span&gt; (lo configuré así para que me ejecute el comando diff de SVN), lo cual muestra gráficamente las diferencias entre ambas versiones.&lt;br /&gt;&lt;br /&gt;Lo que está a la izquierda es lo último versionado, lo que está a la derecha son los cambios locales que hice hace unos días (agregando un control para que antes de asignar verifique si están registradas las variables).&lt;br /&gt;&lt;br /&gt;Lo bueno es que si cometí errores, &lt;span style="font-weight: bold;"&gt;puedo presionar sobre las "x" rojas y eliminar las líneas locales diferentes que no quiero dejar&lt;/span&gt; (de todas formas puedo volver atrás cuando quiera y comparar las versiones que quiera, no importa cuales, y recuperar cualquier línea de código).&lt;br /&gt;&lt;br /&gt;Para quién aún no usa IDE's y versionado, no, no es lo mismo que un &lt;span style="font-style: italic;"&gt;"Editor con Esteroides"&lt;/span&gt; (si no te muestra el contenido público de un objeto, yo no lo considero un IDE).&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19450532-355776456365166269?l=phpsenior.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpsenior/~4/MKJzZ6293XU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phpsenior.blogspot.com/feeds/355776456365166269/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=19450532&amp;postID=355776456365166269" title="18 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/355776456365166269?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/355776456365166269?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phpsenior/~3/MKJzZ6293XU/lo-bueno-de-usar-un-ide-svn-captura.html" title="Lo bueno de usar un IDE + SVN (captura)" /><author><name>enrique_place</name><uri>http://www.blogger.com/profile/15452998349449419148</uri><email>enriqueplace@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="03921750821859760589" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_G8kpjzIeQ4o/Si2cjpbnk5I/AAAAAAAAEbQ/xLz5uTgaqe0/s72-c/captura_diff_netbeans.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">18</thr:total><feedburner:origLink>http://phpsenior.blogspot.com/2009/06/lo-bueno-de-usar-un-ide-svn-captura.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MASXoyeyp7ImA9WxJVEk8.&quot;"><id>tag:blogger.com,1999:blog-19450532.post-4127476382572445482</id><published>2009-06-05T14:46:00.005-03:00</published><updated>2009-06-28T19:50:48.493-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-28T19:50:48.493-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="cursos" /><category scheme="http://www.blogger.com/atom/ns#" term="surforce" /><title>¡Semana próxima: Segundo Semestre de Cursos a Distancia!</title><content type="html">A partir del &lt;span style="font-weight: bold;"&gt;lunes próximo&lt;/span&gt; iniciamos el &lt;span style="font-weight: bold;"&gt;armado de grupos&lt;/span&gt; y &lt;span style="font-weight: bold;"&gt;cobro de las reservas&lt;/span&gt; para los cursos del &lt;span style="font-weight: bold;"&gt;segundo semestre del año&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Programación Orientada a Objetos en PHP5 (3ra Edición)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Introducción a Zend Framework (2da Edición)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Introducción a los Patrones de Diseño (2da Edición)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Análisis y Diseño Orientado a Objetos (2da Edición)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;Tentativamente la fecha de inicio es el primer lunes de Julio 2009&lt;/span&gt;, con los grupos que se hayan armando a partir de los usuarios que realizaron su pago. &lt;span style="font-weight: bold;"&gt;El cupo mínimo de alumnos será de 20 por grupo&lt;/span&gt; y se irá iniciando un grupo por semana, en caso de no llegar a los cupos mínimos, se posterga una semana.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;El costo sigue siendo el mismo, un único pago de USD 50 por persona durante dos meses&lt;/span&gt;, y la forma de pago oficial es a través de &lt;span style="font-weight: bold;"&gt;Paypal &lt;/span&gt;y la alternativa a través de &lt;span style="font-weight: bold;"&gt;Western Union&lt;/span&gt; (solo si estás en Argentina podemos hacer una transferencia bancaria).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;AVISO IMPORTANTE:&lt;/span&gt; para este nuevo período &lt;span style="font-weight: bold;"&gt;se abrirán menos grupos&lt;/span&gt; que en el primer período, principalmente por un tema de sobrecarga de trabajo que tuvimos en el primer semestre de este año, y que quiero evitar que nos atrasemos con algún grupo o que los docentes terminemos extremadamente cansados :-(&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Si estás interesado, &lt;span style="font-weight: bold;"&gt;no pierdas un lugar a partir del próximo lunes&lt;/span&gt;, donde habilitaré el pago de los cursos y empezaré a armar los grupos que inician por semana.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Si aún no estás registrado en &lt;a href="http://www.surforce.com/"&gt;SURFORCE&lt;/a&gt;&lt;/span&gt;, ingresa TUS DATOS REALES (incluyendo la foto) en &lt;a href="http://registracion.surforce.com/"&gt;http://registracion.surforce.com&lt;/a&gt; (los datos son privados y confidenciales, sin ellos, no voy a enviar datos de pago ni habilitar alumnos bajo seudónimos ni nombres fantasía).&lt;br /&gt;&lt;br /&gt;Los cursos se dictarán a través de &lt;a href="http://es.wikipedia.org/wiki/Moodle"&gt;Moodle&lt;/a&gt; (sistema de educación a distancia) en la dirección &lt;a href="http://formacion.surforce.com/"&gt;http://formacion.surforce.com&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Saludos!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;PD:&lt;/span&gt; también, a más tardar el lunes próximo, &lt;span style="font-weight: bold;"&gt;estaré entregando los diplomas a todos los alumnos que aprobaron&lt;/span&gt; los cursos del primer semestre.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19450532-4127476382572445482?l=phpsenior.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpsenior/~4/GbpBj_knd3I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phpsenior.blogspot.com/feeds/4127476382572445482/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=19450532&amp;postID=4127476382572445482" title="6 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/4127476382572445482?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/4127476382572445482?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phpsenior/~3/GbpBj_knd3I/semana-proxima-segundo-semestre-de.html" title="¡Semana próxima: Segundo Semestre de Cursos a Distancia!" /><author><name>enrique_place</name><uri>http://www.blogger.com/profile/15452998349449419148</uri><email>enriqueplace@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="03921750821859760589" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><feedburner:origLink>http://phpsenior.blogspot.com/2009/06/semana-proxima-segundo-semestre-de.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEAFQ3w7fCp7ImA9WxJSE0U.&quot;"><id>tag:blogger.com,1999:blog-19450532.post-6729254383439964959</id><published>2009-05-02T13:50:00.006-03:00</published><updated>2009-05-03T18:38:32.204-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-03T18:38:32.204-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="zend framework" /><category scheme="http://www.blogger.com/atom/ns#" term="errores" /><title>Por actualizar apurado de ZF 1.7 a 1.8 (actualizado)</title><content type="html">Notice: &lt;span style="font-weight: bold;"&gt;Zend_Loader::Zend_Loader::autoload is deprecated&lt;/span&gt; as of 1.8.0 and will be removed with 2.0.0; use Zend_Loader_Autoloader instead in [..]/library/Zend/Loader.php on line 186&lt;br /&gt;&lt;br /&gt;Interesante, ni bien lo solucione les comento ;-)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Actualización&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Antes estábamos usando:&lt;br /&gt;&lt;br /&gt;  &lt;code style="white-space: nowrap;"&gt;    &lt;!-- php buffer start --&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;span style="color: rgb(0, 0, 187);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;include &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Zend/Loader.php"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Zend_Loader&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;registerAutoload&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();  &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ahora debemos usar:&lt;br /&gt;&lt;br /&gt;&lt;code style="white-space: nowrap;"&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;require_once &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'Zend/Loader/Autoloader.php'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$loader &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Zend_Loader_Autoloader&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;getInstance&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$loader&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;setFallbackAutoloader&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;true&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$loader&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;suppressNotFoundWarnings&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;false&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/code&gt;Luego que &lt;a href="http://framework.zend.com/manual/en/zend.loader.autoloader.html"&gt;lea un poco más&lt;/a&gt; &lt;a href="http://akrabat.com/2009/04/30/zend_loaders-autoloader_deprecated-in-zend-framework-18/"&gt;me fundamentaré mejor&lt;/a&gt; sobre lo que hay que hacer de ahora en adelante ,-)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Nueva actualización:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;3/5/2009 - &lt;a href="http://devzone.zend.com/article/4525-Developing-a-Comprehensive-Autoloader"&gt;&lt;span style="font-size:100%;"&gt;Developing a Comprehensive Autoloader&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19450532-6729254383439964959?l=phpsenior.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpsenior/~4/PMjTWFNjY7o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phpsenior.blogspot.com/feeds/6729254383439964959/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=19450532&amp;postID=6729254383439964959" title="5 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/6729254383439964959?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/6729254383439964959?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phpsenior/~3/PMjTWFNjY7o/por-actualizar-apurado-de-zf-17-18.html" title="Por actualizar apurado de ZF 1.7 a 1.8 (actualizado)" /><author><name>enrique_place</name><uri>http://www.blogger.com/profile/15452998349449419148</uri><email>enriqueplace@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="03921750821859760589" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://phpsenior.blogspot.com/2009/05/por-actualizar-apurado-de-zf-17-18.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQHRng_eip7ImA9WxJTGEo.&quot;"><id>tag:blogger.com,1999:blog-19450532.post-4729020529840843272</id><published>2009-04-27T20:50:00.000-03:00</published><updated>2009-04-27T20:52:17.642-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-27T20:52:17.642-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="zend framework" /><title>Cómo usar componentes de Zend Framework fuera del MVC</title><content type="html">&lt;div style="text-align: justify;"&gt;Uno de los caminos para crear una "plataforma de desarrollo" (y bajar costos de desarrollo) es tener unificadas todas las herramientas que usamos a la hora de desarrollar nuestros sistemas. &lt;br /&gt;&lt;br /&gt;Por ejemplo, &lt;span style="font-weight: bold;"&gt;no deberíamos tener distintas clases de acceso a base de datos o generación de logs según el entorno que estemos trabajando&lt;/span&gt; (a menos que tengas una razón coherente para hacerlo ;-) ). Si desarrollas dentro de la misma empresa  / proyecto tanto sistemas web tradicionales, sistemas de gestión, páginas wap, o aplicaciones de envío SMS (como es en mi caso), no debería haber razón para tener código duplicado.&lt;br /&gt;&lt;br /&gt;Una "plataforma" debería servir para eso, tener ya resuelto los problemas triviales y habituales para concentrarnos solo en los problemas nuevos y no triviales.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Una de las grandes ventajas de Zend Framework es poder usar cada uno de sus componentes fuera de la estructura tradicional de MVC&lt;/span&gt;, evitando necesariamente tener que usar un controller, modelo y vista. Si ya usas Zend Framework, puedes aprovechar los componentes también de forma aislada, lo que reusas código y conocimiento en el desarrollo de sistemas (aprendes a usar un componente y lo sigues usando en todos los sistemas).&lt;br /&gt;&lt;br /&gt;Un caso puntual es poder eliminar todas las clases "artesanales" que hoy día tenemos para la generación de logs y empezar a uzar &lt;a href="http://framework.zend.com/manual/en/zend.log.html"&gt;Zend_Log&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;"La forma de hacerlo&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;La primera, es instalar en nuestros servidores en un lugar estandarizado las  "librerías", como por ejemplo en &lt;span style="font-weight: bold;"&gt;/var/www/library&lt;/span&gt; instalar &lt;span style="font-weight: bold;"&gt;Zend Framework&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Luego, deberíamos crear un archivo de configuración para que nuestra aplicación pueda encontrar fácilmente los componentes de Zend. Mi sugerencia es que usen la función de &lt;a href="http://framework.zend.com/manual/en/zend.loader.html"&gt;"autoload" (Zend_Loader)&lt;/a&gt;, así no tienen que estar viendo de llamar una a una las clases que necesitan cada uno de los componentes.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;config.php&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;code style="white-space: nowrap;"&gt;    &lt;!-- php buffer start --&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;span style="color: rgb(0, 0, 187);"&gt;&lt;?php&lt;br /&gt;&lt;br /&gt;set_include_path&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'.' &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;. &lt;br /&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;PATH_SEPARATOR &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;. &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'/var/www/library' &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;.&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;PATH_SEPARATOR &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;. &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;get_include_path&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;()&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;include &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;"Zend/Loader.php"&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Zend_Loader&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;registerAutoload&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;/span&gt; &lt;/span&gt; &lt;/code&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Y así incluiríamos ahora la clase &lt;span style="font-weight: bold; font-style: italic;"&gt;Zend_Log&lt;/span&gt; en nuestros desarrollos:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;test.php&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;code style="white-space: nowrap;"&gt;    &lt;!-- php buffer start --&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;span style="color: rgb(0, 0, 187);"&gt;&lt;?php&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;require_once &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'config.php'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$writer &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Zend_Log_Writer_Stream&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'/tmp/test.log'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$logger &lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;= new &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Zend_Log&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$logger&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;addWriter&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$writer&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;$logger&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;-&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;log&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;'This is a log message!'&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;, &lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;Zend_Log&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 187);"&gt;INFO&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;);&lt;/span&gt; &lt;/span&gt; &lt;/code&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Listo, ya tenemos un scripts en PHP común y corriente, pero usando ahora un componente del framework Zend.&lt;br /&gt;&lt;br /&gt;Así deberíamos poder hacerlo con todos los componentes básicos (base de datos, logs, envío de emails, config, etc), y evitar tener que reinventar la rueda.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;¿Te parece útil? &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;¿Una nueva razón para usar Zend? ¿otros frameworks te permiten hacer lo mismo?&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19450532-4729020529840843272?l=phpsenior.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpsenior/~4/-Qv1MWvHCCQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phpsenior.blogspot.com/feeds/4729020529840843272/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=19450532&amp;postID=4729020529840843272" title="4 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/4729020529840843272?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/4729020529840843272?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phpsenior/~3/-Qv1MWvHCCQ/como-usar-componentes-de-zend-framework.html" title="Cómo usar componentes de Zend Framework fuera del MVC" /><author><name>enrique_place</name><uri>http://www.blogger.com/profile/15452998349449419148</uri><email>enriqueplace@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="03921750821859760589" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://phpsenior.blogspot.com/2009/04/como-usar-componentes-de-zend-framework.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QMQXw_fip7ImA9WxVaGU0.&quot;"><id>tag:blogger.com,1999:blog-19450532.post-9217313014368731861</id><published>2009-04-16T13:46:00.005-03:00</published><updated>2009-04-16T14:03:00.246-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-16T14:03:00.246-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="crítica" /><category scheme="http://www.blogger.com/atom/ns#" term="cosas mal hechas" /><category scheme="http://www.blogger.com/atom/ns#" term="foros" /><title>"La decadencia de forosdelweb.com", parte II</title><content type="html">&lt;div style="text-align: justify;"&gt;Si luego de &lt;a href="http://phpsenior.blogspot.com/2009/04/la-decadencia-de-forosdelwebcom.html"&gt;leer varios comentarios "políticamente correctos"&lt;/a&gt; (aunque por dentro estén insultándote), este último comentario terminó de dejar claro &lt;a href="http://twitter.com/cvander/statuses/1534344405"&gt;cómo son verdaderamente las cosas&lt;/a&gt; (que error ni error):&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_G8kpjzIeQ4o/Sedh_rn9iWI/AAAAAAAAEZo/M-b-fe28zoU/s1600-h/cvander.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 186px;" src="http://1.bp.blogspot.com/_G8kpjzIeQ4o/Sedh_rn9iWI/AAAAAAAAEZo/M-b-fe28zoU/s400/cvander.gif" alt="" id="BLOGGER_PHOTO_ID_5325332831058889058" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Veo que la filosofía es &lt;span style="font-style: italic;"&gt;"estás conmigo o contra mi"&lt;/span&gt;, no hay puntos medios ni sincero reconocimiento de errores, pura y llana &lt;span style="font-style: italic;"&gt;"cortina de humo"&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Al final de cuentas:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;¿Todo esto fue una forma indirecta de intentar sacarme del foro de POO de PHP?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;... el tiempo dirá.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19450532-9217313014368731861?l=phpsenior.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/phpsenior/~4/dy5UCt_Y1-0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://phpsenior.blogspot.com/feeds/9217313014368731861/comments/default" title="Enviar comentarios" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=19450532&amp;postID=9217313014368731861" title="4 comentarios" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/9217313014368731861?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/19450532/posts/default/9217313014368731861?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/phpsenior/~3/dy5UCt_Y1-0/la-decadencia-de-forosdelwebcom-parte.html" title="&quot;La decadencia de forosdelweb.com&quot;, parte II" /><author><name>enrique_place</name><uri>http://www.blogger.com/profile/15452998349449419148</uri><email>enriqueplace@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="03921750821859760589" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_G8kpjzIeQ4o/Sedh_rn9iWI/AAAAAAAAEZo/M-b-fe28zoU/s72-c/cvander.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://phpsenior.blogspot.com/2009/04/la-decadencia-de-forosdelwebcom-parte.html</feedburner:origLink></entry></feed>
