<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9023974285878579728</id><updated>2012-03-10T23:48:04.365-03:00</updated><category term='Python'/><category term='Software Libre'/><category term='Off Topic'/><category term='CC BY NC ND'/><category term='model-view-controller'/><category term='MVC'/><category term='DBAbstractModel'/><category term='LGPL'/><category term='Test-First Programming'/><category term='Cursos Gratis'/><category term='Librerias GPL'/><category term='Línea de comandos'/><category term='Test Unitarios'/><category term='GNU'/><category term='Desarrollo Ágil'/><category term='Apuntes PHP'/><category term='TDD'/><category term='Cursos'/><category term='Cretive Commons'/><category term='Kanban'/><category term='Diseño Gráfico'/><category term='Publicaciones'/><category term='MissArchitect'/><category term='Aviso Legal'/><category term='tecnología'/><category term='Modelo-Vista-controlador'/><category term='Europio Start Guide'/><category term='PHPAggregate'/><category term='PHPFormValidator'/><category term='Mis artículos en la Web'/><category term='Europio v1.0 Final'/><category term='POO'/><category term='Anuncios Importantes'/><category term='Europio english documentation'/><category term='Steve Job'/><category term='comandos Linux'/><category term='Herramientas Online'/><category term='PHPTemplate'/><category term='Planning Pocker'/><category term='Extreme Programming'/><category term='PHP'/><category term='safeCreative'/><category term='Linux'/><category term='Europio'/><category term='Scrum'/><category term='PHPUnit'/><category term='OOP'/><category term='Libros gratis de programación'/><category term='Programación Orientada a Objetos'/><category term='Enhance PHP'/><title type='text'>Programación LAMP con Scrum y XP</title><subtitle type='html'>Desarrollo, programación  e ingeniería de sistemas informáticos con tecnologías LAMP (Linux, Apache, MySQL, PHP y Python). Gestión de proyectos con Scrum, XP y Kanban. Descarga directa de libros y artículos de programación con licencia Creative Commons. Programación orientada a objetos y MVC. Librerías GPL en PHP y JavaScript.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>56</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-4495045682590983784</id><published>2012-02-23T18:16:00.001-03:00</published><updated>2012-02-23T18:18:05.490-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo Ágil'/><category scheme='http://www.blogger.com/atom/ns#' term='Kanban'/><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><title type='text'>El síndrome de lo malo conocido</title><content type='html'>Tienes la idea y el dinero pero... &lt;b&gt;¿cómo llevar adelante el proyecto? &lt;/b&gt;es la pregunta que te frena.&lt;br /&gt;&lt;br /&gt;Lo primero que la mayoría de las personas hacen, es &lt;b&gt;"planificar" esa idea de negocios&lt;/b&gt;. En esa planificación, lo primero que surge es un &lt;b&gt;boceto de la idea.&lt;/b&gt; Pero cuando ese boceto, comienza a tomar forma, es el momento en el cual, &lt;b&gt;la mayoría, se ve ganado por la obsesión en los detalles&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;¿Qué sucede entonces? Es tal el costumbrismo al que todos hemos sido sometidos -sobre todo, en sociedades subdesarrolladas como la nuestra, donde la frase &lt;b&gt;"más vale malo conocido que bueno por conocer"&lt;/b&gt;, se nos termina haciendo carne sin más remedio-, que &lt;b&gt;el miedo a lo desconocido toma mayor importancia que los resultados&lt;/b&gt;: nos terminamos olvidando de los resultados, postergándolos y &lt;b&gt;nos aferramos a "seguir un plan"&lt;/b&gt; al pie de la letra,&lt;b&gt; incluso, cuando está demostrado que seguir ese plan, reduce la calidad &lt;/b&gt;final de todo lo que teníamos en mente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="micss_hidden_post"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;¿Ágil o predictivo?&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Sin dudas, "hacer las cosas de manera tradicional" es la elección de la mayoría. Aunque, insisto, &lt;b&gt;hacerlas de forma tradicional juegue en desmérito de los resultados&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;Hace algo más de 6 meses, un gran amigo y colega me decía&lt;i&gt; "a mi lo que me interesa, es que el producto final, sea tan bueno, que nadie pueda criticarlo"&lt;/i&gt;. Seis meses hablando de ello, dándole mi punto de vista, sugiriendo y aconsejando aunque solo hace poco menos de dos meses, que el proyecto comenzó a desarrollarse.&lt;br /&gt;&lt;br /&gt;Hoy, hablando por teléfono con él, le comenté que estaría bueno que presentaran el proyecto en el próximo &lt;a href="http://www.eugeniabahit.com/betabeers-buenosaires2012/" target="_blank"&gt;&lt;b&gt;Betabeers Buenos Aires 2012&lt;/b&gt;&lt;/a&gt; (a realizarse recién, a principios de Abril), a lo que -para mi gran sorpresa-, me respondió:&lt;br /&gt;&lt;i&gt;- "Es que todavía no hay nada para mostrar"&lt;/i&gt;&lt;br /&gt;Lógicamente, le aclaré:&lt;br /&gt;&lt;i&gt;- "Mira que recién es para Abril, ya serán 4 meses"&lt;/i&gt; y me dijo:&lt;br /&gt;&lt;i&gt;- "Si, es que&lt;b&gt; el primer entregable lo corrimos para principios de Mayo&lt;/b&gt;"&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Sinceramente, no pude contenerme y le dije:&lt;br /&gt;&lt;i&gt;- "&lt;b&gt;Haciéndolo por Sprints&lt;/b&gt;, a esta altura, no solo ya tendrían algo para mostrar, sino que además, mínimamente,&lt;b&gt; habría 4 deploy ya hechos&lt;/b&gt;".&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Mi amigo, simplemente se limitó a &lt;b&gt;responder con la frase, que más escuché en los últimos 5 o 6 años de mi carrera&lt;/b&gt;:&lt;br /&gt;&lt;i&gt;- "Lo que pasa es que tuvimos que&lt;b&gt; reformular el alcance &lt;/b&gt;y &lt;b&gt;nos llevaron bastante tiempo los prototipos&lt;/b&gt;"&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;- "¿Prototipos?!?!"&lt;/i&gt;, le dije y continué: &lt;i&gt;- "¿Qué prototipos necesitaban para algo tan simple?"&lt;/i&gt;.&lt;br /&gt;Y me respondió:&lt;br /&gt;&lt;b&gt;&lt;i&gt;- "Es que el cliente, necesitaba hacerse una idea de como iba a quedar, antes de aprobar el proyecto.&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;No podía creer lo que escuchaba, incluso cuando ya lo he escuchado miles de veces, no podía salir de mi asombro. Por eso, insistí:&lt;br /&gt;&lt;i&gt;- "Pero ¿&lt;b&gt;no es hora de cambiar de metodología&lt;/b&gt; y probar a comenzar planificando iterativamente en orden de prioridades?"&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;La respuesta fue:&lt;br /&gt;&lt;i&gt;- "¿Pero qué me asegura &lt;b&gt;que se cumpla con el tiempo pautado?&lt;/b&gt;"&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Ay! Mi amigo:&lt;br /&gt;&lt;i&gt;- "¿qué te lo asegura ahora si ya tuviste que postergar entregables?&lt;b&gt; ¡Tu tiempo terminó hace rato!&lt;/b&gt;"&lt;/i&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;b&gt;Hablando con él, una vez más, me di cuenta que no hay nada que uno pueda hacer o decir para mejorar las cosas. Que no se trata de dar argumentos técnicos, sino de "cambiar la mentalidad" de las personas. Y creo, que no hay Freud que pueda con ello. Son temas que exceden a la gestión de proyectos, a la informática y a los negocios. Es simplemente, la personalidad que engloba a una sociedad, que no está acostumbrada a evolucionar favorablemente.&lt;/b&gt;&lt;/blockquote&gt;&lt;br /&gt;Si bien &lt;b&gt;nunca pierdo las esperanzas,&lt;/b&gt; cada vez que veo este tipo de situaciones, &lt;b&gt;una especie de resignación ácida, comienza a invadirme&lt;/b&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-4495045682590983784?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/4495045682590983784/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2012/02/el-sindrome-de-lo-malo-conocido.html#comment-form' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/4495045682590983784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/4495045682590983784'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2012/02/el-sindrome-de-lo-malo-conocido.html' title='El síndrome de lo malo conocido'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-282156789556998428</id><published>2012-01-23T17:27:00.000-03:00</published><updated>2012-01-23T17:28:28.535-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Test-First Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Test Unitarios'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Test-First Programming en Bash y Shell Scripting</title><content type='html'>&lt;a href="http://www.debianhackers.net/2012/01/23/test-first-programming-en-bash-shell-scripting/"&gt;Test-First Programming en Bash y Shell Scripting&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;[...] Resulta que &lt;b&gt;shUnit2&lt;/b&gt; está basado en jUnit y entre otros Sistemas Operativos, soporta &lt;b&gt;GNU/Linux, FreeBSD y OpenSolaris&lt;/b&gt;. Cabe destacar que posee una lista aceptable de asserts y soporta métodos setUp() y tearDown().&lt;br /&gt;&lt;br /&gt;La última versión estable (al 22 de enero de 2012) es la 2.0.3 (que data de 2007) y a la fecha, se encuentra en desarrollo la versión 2.1.x. Lógicamente, se distribuye con licencia LGPL (Software Libre) y se encuentra perfectamente documentado y con sus FAQ correspondientes [...]&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-282156789556998428?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/282156789556998428/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2012/01/test-first-programming-en-bash-y-shell.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/282156789556998428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/282156789556998428'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2012/01/test-first-programming-en-bash-y-shell.html' title='Test-First Programming en Bash y Shell Scripting'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-761076260477810006</id><published>2012-01-22T00:16:00.000-03:00</published><updated>2012-01-22T00:34:57.514-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Libre'/><category scheme='http://www.blogger.com/atom/ns#' term='LGPL'/><title type='text'>Software Libre - No te quedes con la duda</title><content type='html'>En estos dos últimos días, y a raíz de un &lt;a href="https://twitter.com/#!/eugeniabahit/status/160443902137090048" target="_blank"&gt;twit&lt;/a&gt; que publiqué, relacionado a una &lt;a href="http://bit.ly/zD9uFr" target="_blank"&gt;entrevista&lt;/a&gt; que &lt;a href="http://bit.ly/xmCDyR" target="_blank"&gt;360 TV&lt;/a&gt; realizó a &lt;a href="http://es.wikipedia.org/wiki/Linus_Torvalds" target="_blank"&gt;Linus Torvalds&lt;/a&gt;, el creador de Linux, el kernel que utiliza el Sistema Operativo libre &lt;a href="http://bit.ly/wp6lAO" target="_blank"&gt;GNU/Linux&lt;/a&gt;, surgieron unas cuantas dudas y confusiones.&lt;br /&gt;&lt;br /&gt;Entonces, decidí escribir un post tan breve como sea posible, para que leyendo unas pocas líneas, puedas entender mejor, &lt;b&gt;de qué hablamos cuando hablamos de Software Libre&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="micss_hidden_post"&gt;&lt;h3&gt;&lt;span style="color: #0b5394;"&gt;Entendiendo de qué hablamos cuando hablamos de Software Libre&lt;/span&gt;&lt;/h3&gt;&lt;br /&gt;&lt;div style="background-color: lemonchiffon; border: 1px solid #ff9900; color: black; font-family: sans-serif; font-size: 17px; padding: 6px; text-align: center;"&gt;&lt;b&gt;SOFTWARE LIBRE = LIBERTAD DE HACER&lt;/b&gt;&lt;br /&gt;Libertad de ejecutar, modificar, copiar y distribuir el software.&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Software Libre&lt;/b&gt; se refiere a la &lt;b&gt;LIBERTAD&lt;/b&gt; de:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Ejecutar&lt;/b&gt; el software con cualquier propósito&lt;/li&gt;&lt;li&gt;&lt;b&gt;Modificar&lt;/b&gt; el software (y acceder al código fuente)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Copiar&lt;/b&gt; y distribuir el software&lt;/li&gt;&lt;li&gt;Copiar y &lt;b&gt;distribuir&lt;/b&gt; la versión modificada del software&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="background-color: lemonchiffon; border: 1px solid #ff9900; color: black; font-family: sans-serif; font-size: 17px; padding: 6px; text-align: center;"&gt;&lt;b&gt;SOFTWARE LIBRE &lt;u&gt;NO SIGNIFICA&lt;/u&gt; GRATIS&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;El «software libre» es una cuestión de libertad y no de precio. Para entender el concepto, se debería pensar en «libre» como cuando nos referimos a la «libre expresión» y no, como cuando hablamos de «barra libre» o «muestras gratis».&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: lemonchiffon; border: 1px solid #ff9900; color: black; font-family: sans-serif; font-size: 17px; padding: 6px; text-align: center;"&gt;&lt;b&gt;SOFTWARE LIBRE &lt;u&gt;NO ES LO MISMO&lt;/u&gt; QUE OPEN SOURCE&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;El &lt;b&gt;Software Libre&lt;/b&gt; es una corriente que promueve la &lt;b&gt;&lt;a href="http://bit.ly/xClz3k" target="_blank"&gt;Free Software Foundation&lt;/a&gt;&lt;/b&gt;, cuyo presidente (y principal promotor de la misma) es &lt;b&gt;Richard Stallman&lt;/b&gt;. Open Source, es otra corriente que nada tiene que ver con el Software Libre y solo hace referencia al libre acceso al código fuente de un programa.&lt;br /&gt;Ver &lt;a href="http://bit.ly/z567Y0" target="_blank"&gt;diferencias entre Open Source y Software Libre&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: lemonchiffon; border: 1px solid #ff9900; color: black; font-family: sans-serif; font-size: 17px; padding: 6px; text-align: center;"&gt;La Free Software Foundation es la&lt;br /&gt;&lt;b&gt;&lt;u&gt;ÚNICA FUENTE DE REFERENCIA LEGÍTIMA&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;La &lt;b&gt;&lt;a href="http://bit.ly/xClz3k" target="_blank"&gt;Free Software Foundation (FSF)&lt;/a&gt;&lt;/b&gt;&amp;nbsp;es la entidad sin fines de lucro, que promueve el Software Libre de la mano de su presidente &lt;b&gt;Richard Stallman&lt;/b&gt;. Muchas entidades, organismos y personas, ayudan a la FSF a promover el Software Libre, mediante diferentes actividades.&amp;nbsp;&lt;b&gt;La Free Software Foundation es la única fuente de referencia válida&lt;/b&gt; en cuanto a Software Libre se refiere. &lt;b&gt;&lt;span style="color: #cc0000;"&gt;NO TE DEJES ENGAÑAR.&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;a href="http://bit.ly/xClz3k" target="_blank"&gt;Recurre a la única fuente válida!&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: lemonchiffon; border: 1px solid #ff9900; color: black; font-family: sans-serif; font-size: 17px; padding: 6px; text-align: center;"&gt;&lt;b&gt;EL SOFTWARE LIBRE &lt;u&gt;PUEDE SER COMERCIAL&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;blockquote class="tr_bq"&gt;«Software libre» no significa «que no sea comercial». Un programa libre debe estar disponible para el uso comercial, la programación comercial y la distribución comercial. [...] &lt;b&gt;&lt;i&gt;Puede haber pagado dinero para obtener copias de software libre, o puede haber obtenido copias sin costo.&lt;/i&gt;&lt;/b&gt; Pero sin tener en cuenta cómo obtuvo sus copias, &lt;b&gt;siempre tiene la libertad de copiar y modificar el software, incluso de &lt;u&gt;vender copias&lt;/u&gt;.&lt;/b&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;div style="background-color: lemonchiffon; border: 1px solid #ff9900; color: black; font-family: sans-serif; font-size: 17px; padding: 6px; text-align: center;"&gt;&lt;b&gt;GNU ES EL SISTEMA OPERATIVO LIBRE&lt;/b&gt;&lt;br /&gt;Linux, es el kernel (núcleo) del Sistema Operativo GNU&lt;/div&gt;&lt;br /&gt;&lt;a href="http://bit.ly/wp6lAO" target="_blank"&gt;&lt;b&gt;GNU es un Sistema Operativo libre&lt;/b&gt;&lt;/a&gt; (Software Libre) que utiliza el Kernel Linux.&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;La &lt;b&gt;Free Software Foundation&lt;/b&gt; es la &lt;b&gt;principal organización que patrocina el Sistema Operativo GNU&lt;/b&gt;. Su misión es &lt;b&gt;preservar, proteger y promover la libertad de usar, estudiar, copiar, modificar y distribuir programas de ordenador; así como defender los derechos de los usuarios de software libre&lt;/b&gt;.&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;¡Apoya a GNU y a la FSF!&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://bit.ly/yXpp8l" target="_blank"&gt;Uniéndote a la FSF como miembro asociado&lt;/a&gt;, ó...&lt;/li&gt;&lt;li&gt;&lt;a href="http://bit.ly/zz2MO5" target="_blank"&gt;Haciendo una donación directa a la FSF&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-761076260477810006?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/761076260477810006/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2012/01/software-libre-no-te-quedes-con-la-duda.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/761076260477810006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/761076260477810006'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2012/01/software-libre-no-te-quedes-con-la-duda.html' title='Software Libre - No te quedes con la duda'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-4778474332284629671</id><published>2011-10-22T16:49:00.000-03:00</published><updated>2011-10-22T18:34:54.287-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='comandos Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Línea de comandos'/><category scheme='http://www.blogger.com/atom/ns#' term='Off Topic'/><title type='text'>Aprende a prescindir del entorno gráfico en Linux</title><content type='html'>&lt;a href="http://blog.desdelinux.net/aprende-a-prescindir-del-entorno-grafico/"&gt;Aprende a prescindir del entorno gráfico&lt;/a&gt;&lt;br /&gt;Comparto este artículo publicado en DesdeLinux.net que incluye muchísimos ejemplos de como utilizar rápidamente Linux, por línea de comandos [...]&lt;br /&gt;&lt;br /&gt;&lt;div class="micss_hidden_post"&gt;&lt;br /&gt;–» Como crear enlace entre archivos&lt;br /&gt;–» Como crear enlace entre carpetas&lt;br /&gt;–» Crear una imagen de un CD/DVD&lt;br /&gt;–» Comprobar el UUID de alguna partición&lt;br /&gt;–» Montar y desmontar un ISO desde una carpeta hacia otra carpeta&lt;br /&gt;–» Para comprobar los datos de un CD/DVD&lt;br /&gt;–» Buscando archivos&lt;br /&gt;–» Conocer tipo de un archivo&lt;br /&gt;–» Borrar completamente una carpeta&lt;br /&gt;–» Borrar completamente un tipo de archivos dentro de una carpeta&lt;br /&gt;–» Picar o dividir archivos&lt;br /&gt;–» Unir archivos divididos con split&lt;br /&gt;–» Para cambiar resolución de pantalla y tiempo de refresco&lt;br /&gt;–» Hacer un screenshot o pantallazo&lt;br /&gt;–» Convertir imágenes de un formato hacia otro&lt;br /&gt;–» Cambiar dimensiones de una imagen&lt;br /&gt;–» Convertir una imagen de colores a blanco y negro&lt;br /&gt;–» Crear un gif animado con varias imágenes&lt;br /&gt;–» Extraer el audio de un video&lt;br /&gt;–» Convertir un archivo MPEG a un AVI&lt;br /&gt;–» Para apagar la PC&lt;br /&gt;–» Para apagar la PC luego de un tiempo determinado&lt;br /&gt;–» Para apagar la PC a una hora determinada&lt;br /&gt;–» Para reiniciar la PC&lt;br /&gt;–» Para reiniciar la PC luego de un tiempo determinado&lt;br /&gt;–» Para reiniciar la PC a una hora determinada&lt;br /&gt;-» Usando la calculadora.&lt;br /&gt;-» Muestra las propiedades y características de una imagen.&lt;br /&gt;-» Como configurar la red.&lt;br /&gt;-» Revisa tu email.&lt;br /&gt;-» Navegar por internet.&lt;br /&gt;-» Comprime y descomprime todo tipo de archivos.&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/9023974285878579728-4778474332284629671?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/4778474332284629671/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/10/aprende-prescindir-del-entorno-grafico.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/4778474332284629671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/4778474332284629671'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/10/aprende-prescindir-del-entorno-grafico.html' title='Aprende a prescindir del entorno gráfico en Linux'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-8273906741135309171</id><published>2011-10-13T16:40:00.000-03:00</published><updated>2011-10-13T16:42:12.317-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Europio Start Guide'/><category scheme='http://www.blogger.com/atom/ns#' term='Europio english documentation'/><category scheme='http://www.blogger.com/atom/ns#' term='Enhance PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Europio'/><title type='text'>Database Integration Testing With Enhance PHP</title><content type='html'>&lt;a href="http://www.stevefenton.co.uk/Content/Blog/Date/201110/Blog/Database-Integration-Testing-With-Enhance-PHP/"&gt;Database Integration Testing With Enhance PHP&lt;/a&gt;: When I write an integration test, I want to test that my data access works with my database engine - that is the test! But how do you deal with the problem of needing data in the correct state? You can try to keep a copy of a database that is in the correct state, but it is very hard to keep it in the right state and also keep the tables in step with any changes. It is also possible that if some of your tests fail, the database will be left in a mess, so you would need to restore a previous snapshot of the data. I think that there is a better way, so here is how I do integration tests for my database layer. [&lt;a href="http://www.stevefenton.co.uk/Content/Blog/Date/201110/Blog/Database-Integration-Testing-With-Enhance-PHP/"&gt;see more&lt;/a&gt;]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-8273906741135309171?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/8273906741135309171/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/10/database-integration-testing-with.html#comment-form' title='10 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/8273906741135309171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/8273906741135309171'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/10/database-integration-testing-with.html' title='Database Integration Testing With Enhance PHP'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-5093302632563180772</id><published>2011-10-13T15:41:00.002-03:00</published><updated>2011-10-13T15:41:36.682-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cursos'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='Cursos Gratis'/><title type='text'>Curso gratis de Python</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-sIEmLfFSf-s/TpcuMA9S1lI/AAAAAAAAA6c/mZLuHTWT3Hk/s1600/logo_python.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-sIEmLfFSf-s/TpcuMA9S1lI/AAAAAAAAA6c/mZLuHTWT3Hk/s1600/logo_python.png" /&gt;&lt;/a&gt;&lt;/div&gt;Ya se encuentra publicado el primer capítulo de la guía &lt;b&gt;&lt;a href="http://www.maestrosdelweb.com/editorial/guia-python/" target="_blank"&gt;Aprender Python Programando&lt;/a&gt;&lt;/b&gt;, un &lt;b&gt;&lt;a href="http://www.maestrosdelweb.com/editorial/guia-python/" target="_blank"&gt;curso gratuito de Python&lt;/a&gt;&lt;/b&gt; para quienes deseen iniciarse en este lenguaje de una manera &lt;b&gt;rápida&lt;/b&gt;, &lt;b&gt;eficaz&lt;/b&gt; y &lt;b&gt;profesional&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Invito a todos/as a participar de este desafío, desde el &lt;b&gt;11 de Octubre&lt;/b&gt;, &lt;b&gt;todos los martes&lt;/b&gt; a través de &lt;b&gt;&lt;a href="http://www.maestrosdelweb.com/editorial/guia-python/" target="_blank"&gt;Maestros del Web&lt;/a&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.maestrosdelweb.com/editorial/guia-python/" target="_blank"&gt;Dudas / consultas&lt;/a&gt; sobre la guía, pueden realizarse a través de &lt;a href="http://www.maestrosdelweb.com/editorial/guia-python/" target="_blank"&gt;Maestros del Web&lt;/a&gt; o aquí mismo. ¡Gracias!&lt;br /&gt;&lt;br /&gt;&lt;div style="font-size: 12px; color: #666; margin-left: 100px;"&gt;&lt;b&gt;Curso:&lt;/b&gt; Aprender Python Programando&lt;br /&gt;&lt;b&gt;Fecha:&lt;/b&gt; desde el 11.10.2011 (todos los martes)&lt;br /&gt;&lt;b&gt;Modalidad:&lt;/b&gt; a distancia&lt;br /&gt;&lt;b&gt;Duración:&lt;/b&gt; -&lt;br /&gt;&lt;b&gt;Lugar:&lt;/b&gt; &lt;a href="http://www.maestrosdelweb.com/editorial/guia-python/" target="_blank"&gt;Maestros del Web&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Precio:&lt;/b&gt; $0.00.-&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-5093302632563180772?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/5093302632563180772/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/10/curso-gratis-de-python.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/5093302632563180772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/5093302632563180772'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/10/curso-gratis-de-python.html' title='Curso gratis de Python'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-sIEmLfFSf-s/TpcuMA9S1lI/AAAAAAAAA6c/mZLuHTWT3Hk/s72-c/logo_python.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-5837727498801366630</id><published>2011-10-07T18:23:00.002-03:00</published><updated>2011-10-07T18:26:35.145-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Europio Start Guide'/><category scheme='http://www.blogger.com/atom/ns#' term='Europio english documentation'/><category scheme='http://www.blogger.com/atom/ns#' term='Europio'/><title type='text'>8. Write controllers for your models</title><content type='html'>&lt;h2&gt;How event handler works?&lt;/h2&gt;In order to write a controller, first, you must know &lt;b&gt;how Europio works&lt;/b&gt;.&lt;br /&gt;In Europio, the user events are handled by a event handler that catchs:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;What module is being called&lt;/li&gt;&lt;li&gt;What model must be invoked, and&lt;/li&gt;&lt;li&gt;What action (event) is required by the user.&lt;/li&gt;&lt;/ul&gt;&lt;div class="micss_hidden_post"&gt;&lt;br /&gt;All these events are handled from the &lt;b&gt;URL requested&lt;/b&gt; by the user.&lt;br /&gt;&lt;blockquote&gt;&lt;u&gt;For example&lt;/u&gt;:&lt;br /&gt;If the URL that is being called looks like that: &lt;span class="Apple-style-span" style="color: blue;"&gt;http://servername/myapp/store/product/new/&lt;/span&gt;&lt;br /&gt;The event handler answers these questions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;What module is being called?&lt;/b&gt;&amp;nbsp;store&lt;/li&gt;&lt;li&gt;&lt;b&gt;What model must be invoked?&lt;/b&gt; product&lt;/li&gt;&lt;li&gt;&lt;b&gt;What action (event) is required by the user?&lt;/b&gt; new&lt;/li&gt;&lt;/ul&gt;Then, the event handler calls to the general controller of this model and sends the action that is required:&amp;nbsp;&lt;b&gt;product_controller('new')&lt;/b&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;h2&gt;What do you need in order to write controllers?&lt;/h2&gt;Write controllers on Europio is very simple. You can write a controller in just two simple steps. &lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Step #1: write the general controller&lt;/h2&gt;&lt;pre class="brush: php"&gt;function model_name_controller($event) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; $controller_name = "model_name_{$event}_controller";&lt;br /&gt;&amp;nbsp; &amp;nbsp; call_user_func($controller_name);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;model_name&lt;/b&gt; must be the lowercase model name and separate words by a underscore. For example, if the model name is ShoppingCart, the controller name must be &lt;b&gt;shopping_cart_controller( )&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Step #2: write your own controllers&lt;/h2&gt;The next step is write your own controller. In the previous step, the general controller calls to a next controller.&lt;br /&gt;&lt;blockquote&gt;The &lt;b&gt;controller name&lt;/b&gt; must be written by following this pattern: [model_name]_[event_name]_controller&lt;br /&gt;&lt;br /&gt;&lt;u&gt;For example&lt;/u&gt;:&lt;br /&gt;&lt;pre&gt;function shopping_cart_view_cart_controller() {&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;h2&gt;Complete example&lt;/h2&gt;&lt;pre class="brush: php"&gt;// General controller for Product model&lt;br /&gt;function product_controller($event) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; $controller_name = "product_{$event}_controller";&lt;br /&gt;&amp;nbsp; &amp;nbsp; call_user_func($controller_name);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Insert a new product&lt;br /&gt;function product_addnew_controller() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; // call to model&lt;br /&gt;&amp;nbsp; &amp;nbsp; $product = new Product();&lt;br /&gt;&amp;nbsp; &amp;nbsp; // change model&lt;br /&gt;&amp;nbsp; &amp;nbsp; $product-&amp;gt;product_name = $_POST['product_name'];&lt;br /&gt;&amp;nbsp; &amp;nbsp; $product-&amp;gt;price = $_POST['price'];&lt;br /&gt;&amp;nbsp; &amp;nbsp; $product-&amp;gt;description = $_POST['description'];&lt;br /&gt;&amp;nbsp; &amp;nbsp; // call to model method&lt;br /&gt;&amp;nbsp; &amp;nbsp; $response = $product-&amp;gt;add_new();&lt;br /&gt;&amp;nbsp; &amp;nbsp; // send response to the view&lt;br /&gt;&amp;nbsp; &amp;nbsp; $product_view = new ProductView('addnew', $response);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;Europio + Enhance PHP User Guide&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://eugeniabahit.blogspot.com/p/europio.html"&gt;Back to the table of contents&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-5837727498801366630?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/5837727498801366630/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/10/8-write-controllers-for-your-models.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/5837727498801366630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/5837727498801366630'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/10/8-write-controllers-for-your-models.html' title='8. Write controllers for your models'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-2091061460919114714</id><published>2011-10-07T13:46:00.000-03:00</published><updated>2011-10-07T13:52:33.330-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Herramientas Online'/><category scheme='http://www.blogger.com/atom/ns#' term='Off Topic'/><category scheme='http://www.blogger.com/atom/ns#' term='Diseño Gráfico'/><title type='text'>[off-topic] Phixr - Editor online de fotos</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-uxNN_E8Khzw/To8t-RwQixI/AAAAAAAAA6Y/MDnFLgkB148/s1600/phixr.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="256" src="http://3.bp.blogspot.com/-uxNN_E8Khzw/To8t-RwQixI/AAAAAAAAA6Y/MDnFLgkB148/s320/phixr.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Para quienes &lt;b&gt;no somos front-end developers&lt;/b&gt;, muchas veces nos vemos en la tediosa tarea de tener que realizar algún tipo de actividad, relacionada con el diseño de interfaces gráficas o similar, y es allí donde cual si fuéramos un comic, comienzan a flotar a nuestro alrededor, frases como "Recórcholis Batman!" o "Ay! Mamá pulpa! santos calamares", solo que surgen así, tras pasar por la censura del "buen gusto"... originalmente... convengamos en que suelen ser un poco más "elevedas de tono" ;)&lt;br /&gt;&lt;br /&gt;En mi caso, la más tediosa de todas las tareas, es tener que editar fotografías de cientos de megas, reducirlas, mejorarles brillo, contraste y demás cuestiones, que realmente, &lt;b&gt;no las domino en lo absoluto&lt;/b&gt; y tampoco tengo un software apropiado (y si lo tuviese, me daría mucha "palma" tener que aprender a usarlo, pues lo mío, es "codear").&lt;br /&gt;&lt;div class="micss_hidden_post"&gt;&lt;br /&gt;Gracias a la maravillosa Internet que nos alimenta, me encontré con &lt;a href="http://es.phixr.com/" target="_blank"&gt;Phixr&lt;/a&gt;, un &lt;a href="http://es.phixr.com/" target="_blank"&gt;&lt;b&gt;editor de fotos online&lt;/b&gt;&lt;/a&gt; que me salvó la vida (exagero: pero realmente, logra que editar una foto sea solo cuestión de segundos). &lt;a href="http://es.phixr.com/" target="_blank"&gt;Phixr&lt;/a&gt; tiene muchísimas funcionalidades para editar fotos e imágenes: &lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ajustar brillo, contraste, tono, saturación, color y otras que no se ni que son&lt;/li&gt;&lt;li&gt;Cambiar tamaño, reducir, escalar, rotar y demás&lt;/li&gt;&lt;li&gt;Dar decenas de efectos como blanco y negro, sepia, solarizar y esas cosas extrañas que hacen los diseñadores gráficos&lt;/li&gt;&lt;li&gt;Dibujar formas geométricas, agregar texto (incluso marcas de agua), globos tipo comic, marcos, texturas, dibujos varios, etc.&lt;/li&gt;&lt;li&gt;Mezclar fotografías&lt;/li&gt;&lt;li&gt;Redondear esquinas&lt;/li&gt;&lt;li&gt;Corregir ojos rojos, etc..&lt;/li&gt;&lt;li&gt;Guardar la imagen en diferentes formatos (JPG, GIF, PNG y PDF), optimizando la calidad (más alta o más baja) y el tamaño (más pequeña o más grande)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Y todo ello, con la posibilidad de aplicar cada efecto o herramienta en una zona seleccionada o en toda la imagen.&lt;br /&gt;&lt;br /&gt;Algo que para un diseñador gráfico seguramente es obsoleto e inútil, para un programador que nada entiende de diseño, puedo asegurarles que es una salvación. Un off-topic que tal vez les sirva para salir del paso.&lt;br /&gt;&lt;br /&gt;Por cierto: la de la foto es &lt;b&gt;Burbuja&lt;/b&gt;, mi gata :)&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/9023974285878579728-2091061460919114714?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/2091061460919114714/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/10/phixr-editor-online-de-fotos.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/2091061460919114714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/2091061460919114714'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/10/phixr-editor-online-de-fotos.html' title='[off-topic] Phixr - Editor online de fotos'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-uxNN_E8Khzw/To8t-RwQixI/AAAAAAAAA6Y/MDnFLgkB148/s72-c/phixr.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-5481963877456379339</id><published>2011-10-06T15:44:00.000-03:00</published><updated>2011-10-06T15:44:11.749-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Europio Start Guide'/><category scheme='http://www.blogger.com/atom/ns#' term='Europio english documentation'/><category scheme='http://www.blogger.com/atom/ns#' term='Europio'/><title type='text'>7. Test-first your model methods with Enhance PHP</title><content type='html'>With &lt;b&gt;Enhance PHP&lt;/b&gt; and &lt;b&gt;Europio&lt;/b&gt; you can making TDD, easily. But, &lt;b&gt;Why write TDD?&lt;/b&gt; All &lt;a href="http://www.enhance-php.com/Content/About-Unit-Testing/" target="_blank"&gt;responses are here&lt;/a&gt; (or &lt;a href="http://eugeniabahit.blogspot.com/2011/09/enhance-php-acerca-de-los-test.html" target="_blank"&gt;aquí en español&lt;/a&gt;).&lt;br /&gt;&lt;div class="micss_hidden_post"&gt;&lt;br /&gt;&lt;b&gt;Enhance PHP&lt;/b&gt; is an unit testing framework that provides several methods that helps to test our class methods. Moreover, &lt;b&gt;Europio&lt;/b&gt; includes a RunTest function which runs all tests automatically by the command line and in turn helps to write less test-code.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Write TDD with Enhance PHP on Europio&lt;/h2&gt;&lt;blockquote&gt;&lt;b&gt;1. Create a php file named like the model file to be tested and save file in the test folder.&lt;/b&gt;&lt;/blockquote&gt;For example, if your model file is /app/module/models/user.php the test file must be /app/module/test/user.php&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;2. In the test file, write the class test like that:&lt;/b&gt;&lt;/blockquote&gt;&lt;pre class="brush: php"&gt;include_file('../models/model_name.php');&lt;br /&gt;// model_name.php must be the filename of the model to be tested&lt;br /&gt;&lt;br /&gt;class ModelNameTests extends EnhanceTestFixture {&lt;br /&gt;// ModelName must be the name of the class to be tested&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;/pre&gt;&lt;blockquote&gt;&lt;b&gt;3. Write the test methods like that:&lt;/b&gt;&lt;/blockquote&gt;&lt;pre class="brush: php"&gt;&amp;nbsp; &amp;nbsp; public function name_of_functionTest() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; // name_of_function could be the method name to be tested&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $target = Enhance::getCodeCoverageWrapper('ModelName');&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // call at the method to be tested&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $result = $target-&amp;gt;name_of_function(params);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Assert results&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Assert::assertion_method(your_expect, $result);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* where assertion_method is an EnhancePHP assert method&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; and your_expect will be the result that you are expecting&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You can see &lt;b&gt;&lt;a href="http://www.enhance-php.com" target="_blank"&gt;more about unit testing with EnhancePHP&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;Europio + Enhance PHP User Guide&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://eugeniabahit.blogspot.com/p/europio.html"&gt;Back to the table of contents&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-5481963877456379339?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/5481963877456379339/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/10/7-test-first-your-model-methods-with.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/5481963877456379339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/5481963877456379339'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/10/7-test-first-your-model-methods-with.html' title='7. Test-first your model methods with Enhance PHP'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-3040612945477996137</id><published>2011-10-04T21:38:00.002-03:00</published><updated>2011-10-04T23:47:25.039-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Europio Start Guide'/><category scheme='http://www.blogger.com/atom/ns#' term='Europio english documentation'/><category scheme='http://www.blogger.com/atom/ns#' term='Europio'/><title type='text'>6. Making a standard model (Europio User Guide)</title><content type='html'>In the previous chapters we were created the folders needed to our app. Now, is time to begin writing the models.&lt;br /&gt;&lt;br /&gt;&lt;div class="micss_hidden_post"&gt;&lt;h2&gt;Model structure&lt;/h2&gt;A model created with Europio must have a class structure like that:&lt;br /&gt;&lt;pre class="brush: php"&gt;// class definition&lt;br /&gt;class ClassName implements DataModel {&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; // set_data_model public method&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function set_data_model($DataModel) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // set data types&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; // your own methods from here&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;The &lt;i style="color: black;"&gt;ClassName&lt;/i&gt; must be the singular model name with CamelCase style.&lt;/li&gt;&lt;li&gt;The &lt;i style="color: black;"&gt;data types&lt;/i&gt; can be whichever of data-types provided by Europio (see "Europio Data types")&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h2&gt;Europio Data Types&lt;/h2&gt;Europio DataModel is a global object that provides some data types that can be used in order to create your own models and to set its properties.&lt;br /&gt;&lt;blockquote&gt;You don't have to think about the database structure: you must think about how the models are related between itself.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;When you are ready to think about models and not to think about databases, you will be able to make a robust app based on related objects.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Forget the databases! You can try it! It's very easy and simple!&lt;/blockquote&gt;&lt;br /&gt;The &lt;b style="color: #000"&gt;data-type methods&lt;/b&gt; provides by Europio are:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;String types&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;pre style="color: black; display: inline;"&gt;set_char&lt;/pre&gt;&amp;nbsp; two characters&lt;br /&gt;&lt;pre style="color: green; display: inline; font-size: 11px;"&gt;set_char(&lt;b&gt;&lt;i&gt;string&lt;/i&gt;&lt;/b&gt; $property_name[, &lt;b&gt;&lt;i&gt;string&lt;/i&gt;&lt;/b&gt; $null])&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre style="color: black; display: inline;"&gt;set_varchar&lt;/pre&gt;&amp;nbsp; 0 to 255 characters&lt;br /&gt;&lt;pre style="color: green; display: inline; font-size: 11px;"&gt;set_varchar(&lt;b&gt;&lt;i&gt;string&lt;/i&gt;&lt;/b&gt; $property_name[, &lt;b&gt;&lt;i&gt;int&lt;/i&gt;&lt;/b&gt; $max_len, &lt;b&gt;&lt;i&gt;string&lt;/i&gt;&lt;/b&gt; $null])&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre style="color: black; display: inline;"&gt;set_text&lt;/pre&gt;&amp;nbsp; long text string&lt;br /&gt;&lt;pre style="color: green; display: inline; font-size: 11px;"&gt;set_text(&lt;b&gt;&lt;i&gt;string&lt;/i&gt;&lt;/b&gt; $property_name[, &lt;b&gt;&lt;i&gt;string&lt;/i&gt;&lt;/b&gt; $null])&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Numeric types&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;pre style="color: black; display: inline;"&gt;set_int&lt;/pre&gt;&amp;nbsp; integer number&lt;br /&gt;&lt;pre style="color: green; display: inline; font-size: 11px;"&gt;set_int(&lt;b&gt;&lt;i&gt;string&lt;/i&gt;&lt;/b&gt; $property_name[, &lt;b&gt;&lt;i&gt;int&lt;/i&gt;&lt;/b&gt; $max_len, &lt;b&gt;&lt;i&gt;string&lt;/i&gt;&lt;/b&gt; $null])&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre style="color: black; display: inline;"&gt;set_float&lt;/pre&gt;&amp;nbsp; float number&lt;br /&gt;&lt;pre style="color: green; display: inline; font-size: 11px;"&gt;set_float(&lt;b&gt;&lt;i&gt;string&lt;/i&gt;&lt;/b&gt; $property_name[, &lt;b&gt;&lt;i&gt;string&lt;/i&gt;&lt;/b&gt; $null])&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre style="color: black; display: inline;"&gt;set_boolean&lt;/pre&gt;&amp;nbsp; true/false&lt;br /&gt;&lt;pre style="color: green; display: inline; font-size: 11px;"&gt;set_boolean(&lt;b&gt;&lt;i&gt;string&lt;/i&gt;&lt;/b&gt; $property_name)&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Date and time types&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;pre style="color: black; display: inline;"&gt;set_date&lt;/pre&gt;&amp;nbsp; date&lt;br /&gt;&lt;pre style="color: green; display: inline; font-size: 11px;"&gt;set_date(&lt;b&gt;&lt;i&gt;string&lt;/i&gt;&lt;/b&gt; $property_name[, &lt;b&gt;&lt;i&gt;string&lt;/i&gt;&lt;/b&gt; $null])&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre style="color: black; display: inline;"&gt;set_time&lt;/pre&gt;&amp;nbsp; time&lt;br /&gt;&lt;pre style="color: green; display: inline; font-size: 11px;"&gt;set_time(&lt;b&gt;&lt;i&gt;string&lt;/i&gt;&lt;/b&gt; $property_name[, &lt;b&gt;&lt;i&gt;string&lt;/i&gt;&lt;/b&gt; $null])&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre style="color: black; display: inline;"&gt;set_datetime&lt;/pre&gt;&amp;nbsp; date and&lt;br /&gt;&lt;pre style="color: green; display: inline; font-size: 11px;"&gt;set_datetime(&lt;b&gt;&lt;i&gt;string&lt;/i&gt;&lt;/b&gt; $property_name[, &lt;b&gt;&lt;i&gt;string&lt;/i&gt;&lt;/b&gt; $null])&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Rrelated types&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;pre style="color: black; display: inline;"&gt;foreign_key&lt;/pre&gt;&amp;nbsp; relation between a model property and another entire model&lt;br /&gt;&lt;pre style="color: green; display: inline; font-size: 11px;"&gt;foreign_key(&lt;b&gt;&lt;i&gt;string&lt;/i&gt;&lt;/b&gt; $model_name)&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Index types&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;pre style="color: black; display: inline;"&gt;set_index&lt;/pre&gt;&amp;nbsp; make a index with the indicated properties&lt;br /&gt;&lt;pre style="color: green; display: inline; font-size: 11px;"&gt;set_index(&lt;b&gt;&lt;i&gt;string&lt;/i&gt;&lt;/b&gt; $property_name[, &lt;b&gt;&lt;i&gt;string&lt;/i&gt;&lt;/b&gt; $property_name_2, &lt;b&gt;&lt;i&gt;string&lt;/i&gt;&lt;/b&gt; $property_name_3])&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre style="color: black; display: inline;"&gt;set_unique&lt;/pre&gt;&amp;nbsp; make a unique index with the indicated properties&lt;br /&gt;&lt;pre style="color: green; display: inline; font-size: 11px;"&gt;set_unique(&lt;b&gt;&lt;i&gt;string&lt;/i&gt;&lt;/b&gt; $property_name[, &lt;b&gt;&lt;i&gt;string&lt;/i&gt;&lt;/b&gt; $property_name_2, &lt;b&gt;&lt;i&gt;string&lt;/i&gt;&lt;/b&gt; $property_name_3])&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;Please, note that the &lt;b&gt;ID property mustn't be created!!&lt;/b&gt; It will be created by the Europio DataModel.&lt;/blockquote&gt;&lt;br /&gt;&lt;h2&gt;Data type sintax&lt;/h2&gt;&lt;pre style="color: #000;"&gt;$DataModel-&gt;data_type(params);&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;The $null parameter&lt;/h2&gt;You can set the $null parameter as &lt;b&gt;null&lt;/b&gt; or &lt;b&gt;notnull&lt;/b&gt;. The "null" value is not necessary because the default value allways is "null".&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Here are some examples:&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;$DataModel-&gt;set_char("state"); // it's equal to $DataModel-&gt;set_char("state", "null");&lt;br /&gt;$DataModel-&gt;set_varchar("country", 125, "notnull"); // it's right too!&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;A Model example&lt;/h2&gt;&lt;pre class="brush: php"&gt;/* &lt;br /&gt;===============================&lt;br /&gt;&amp;nbsp; &amp;nbsp;user_type.php file&lt;br /&gt;===============================&lt;br /&gt;*/&lt;br /&gt;class UserType implements DataModel {&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function set_data_model($DataModel) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $DataModel-&gt;set_varchar("user_type", 25, "notnull");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $DataModel-&gt;set_boolean("active");&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; // your own methods from here&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/* &lt;br /&gt;===============================&lt;br /&gt;&amp;nbsp; &amp;nbsp;user.php file&lt;br /&gt;===============================&lt;br /&gt;*/&lt;br /&gt;class User extends UserType implements DataModel {&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function set_data_model($DataModel) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $DataModel-&gt;set_varchar("username", 50, "notnull");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $DataModel-&gt;set_varchar("pass", 24, "notnull");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $DataModel-&gt;set_varchar("email", 125, "notnull");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $DataModel-&gt;set_varchar("name", 255, "notnull");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $DataModel-&gt;set_date("birthday");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $DataModel-&gt;set_boolean("active");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $DataModel-&gt;set_text("resume");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $DataModel-&gt;set_index("username", "email");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $DataModel-&gt;set_unique("email");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $DataModel-&gt;foreign_key("UserType");&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; // your own methods from here&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;blockquote&gt;Please, note again that the &lt;b&gt;ID property mustn't be created!!&lt;/b&gt; It will be created by the Europio DataModel.&lt;/blockquote&gt;&lt;br /&gt;&lt;h2&gt;The model file names&lt;/h2&gt;The name of the model file must be &lt;b&gt;the name of the model in lowercase&lt;/b&gt;. When the model name has two or more words, these words must be separated by a _&lt;br /&gt;For example: if the model name is &lt;b&gt;UserType&lt;/b&gt; the file name must be &lt;b&gt;user_type.php&lt;/b&gt;.&lt;br /&gt;&lt;blockquote&gt;Please, note that if you don't follow these style rules, &lt;b&gt;you get a fatal error warning&lt;/b&gt;.&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;Europio + Enhance PHP User Guide&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://eugeniabahit.blogspot.com/p/europio.html"&gt;Back to the table of contents&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-3040612945477996137?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/3040612945477996137/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/10/making-model-getting-started.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/3040612945477996137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/3040612945477996137'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/10/making-model-getting-started.html' title='6. Making a standard model (Europio User Guide)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-4168764402962693130</id><published>2011-10-04T15:04:00.002-03:00</published><updated>2011-10-04T23:47:38.557-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Europio Start Guide'/><category scheme='http://www.blogger.com/atom/ns#' term='Europio english documentation'/><category scheme='http://www.blogger.com/atom/ns#' term='Europio'/><title type='text'>5. Making the first module (Europio User Guide)</title><content type='html'>&lt;h2&gt;The module folder&lt;/h2&gt;The first step in order to make an app, is create a module. So, we must create a folder for our module by following these rules:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The module folder must be put into the app dir&lt;/li&gt;&lt;li&gt;The folder name must be equal to the module name but in lowercase&lt;/li&gt;&lt;li&gt;If the module name has more of one word, you must separate the words by a medium hyphen (-)&lt;/li&gt;&lt;/ul&gt;&lt;div class="micss_hidden_post"&gt;&lt;blockquote&gt;&lt;b&gt;For example:&lt;/b&gt; if the name of the module is &lt;b&gt;"Shopping Cart"&lt;/b&gt; the name of the module folder must be &lt;b&gt;"shopping-cart"&lt;/b&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;h2&gt;The module sub-folders&lt;/h2&gt;You must make four sub-folders: &lt;b&gt;models&lt;/b&gt;, &lt;b&gt;views&lt;/b&gt;, &lt;b&gt;controllers&lt;/b&gt; and &lt;b&gt;test&lt;/b&gt;. In this way, you can see the follow similar structure:&lt;br /&gt;&lt;pre style="color: black;"&gt;[+] myapp&lt;br /&gt;    [+] shopping-cart&lt;br /&gt;        [+] controllers&lt;br /&gt;        [+] models&lt;br /&gt;        [+] views&lt;br /&gt;        [+] test&lt;br /&gt;&lt;/pre&gt;&lt;blockquote&gt;&lt;b&gt;Please, note that you can't put other folders here.&lt;/b&gt;&lt;br /&gt;&lt;a href="http://eugeniabahit.blogspot.com/2011/10/01-europio-folders-structure.html"&gt;Click here, to Learn more about folders structure&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;h2&gt;File initialize module&lt;/h2&gt;You must to know that all modules must to have an initialize file. This file is named &lt;b&gt;__init__.php&lt;/b&gt;.&lt;br /&gt;Into this file, you must set some necessary data to run the module. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;First, you must include the architecture config manager:&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;require_once('../core/europio/__architect_config.php');&lt;/pre&gt;&lt;br /&gt;Then, &lt;b&gt;you must set the module name &lt;/b&gt; at the $modulo var:&lt;br /&gt;&lt;pre class="brush: php"&gt;$modulo = 'shopping-cart';&lt;/pre&gt;&lt;blockquote&gt;Please, &lt;b&gt;don't change the name of the $modulo var&lt;/b&gt;. It's a global var that is used by Europio in order to know what module is currently working.&lt;/blockquote&gt;&lt;br /&gt;Then, will be necessary to &lt;b&gt;set an array with the name of each model&lt;/b&gt; in your module. &lt;br /&gt;&lt;pre class="brush: php"&gt;$modelos = array('category', 'product',);&lt;/pre&gt;&lt;br /&gt;If you don't have any model yet, please leave the array initialized without values.&lt;br /&gt;&lt;pre class="brush: php"&gt;$modelos = array();&lt;/pre&gt;&lt;blockquote&gt;Please, &lt;b&gt;don't change the name of the $modelos array&lt;/b&gt;. It's a global array that is used by Europio in order to know what models could be working in your currently module.&lt;/blockquote&gt;&lt;br /&gt;Now, you must &lt;b&gt;create a MVC object by passing the global params&lt;/b&gt; ($modulo and $modelos).&lt;br /&gt;&lt;pre class="brush: php"&gt;$mvc = new MissArchitectModule($modulo, $modelos);&lt;/pre&gt;&lt;br /&gt;Finally, must be necessary to&lt;b&gt; create a default controller for the module&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;// default controller example&lt;br /&gt;function default_controller($fu=array()) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; print '&amp;lt;h1&amp;gt;This links will be available for this module&amp;lt;/h1&amp;gt;';&lt;br /&gt;&amp;nbsp; &amp;nbsp; foreach($fu as $name=&amp;gt;$url) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print "&amp;lt;a href='{$url}'&amp;gt;{$url}&amp;lt;/a&amp;gt;&amp;lt;br/&amp;gt;";&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;/pre&gt;&lt;blockquote&gt;Please, note that the name of the default controller must be &lt;b&gt;default_controller()&lt;/b&gt;&lt;/blockquote&gt;If you want, you can use the $fu param in the default controller. The $fu param is passed by default from Europio at the default controller . This param contains an array with all the friendly URLs for your module.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;Europio + Enhance PHP User Guide&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://eugeniabahit.blogspot.com/p/europio.html"&gt;Back to the table of contents&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-4168764402962693130?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/4168764402962693130/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/10/making-app-with-europioenhance-php.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/4168764402962693130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/4168764402962693130'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/10/making-app-with-europioenhance-php.html' title='5. Making the first module (Europio User Guide)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-307498608205969225</id><published>2011-10-03T20:49:00.000-03:00</published><updated>2011-10-06T15:28:16.968-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Europio Start Guide'/><category scheme='http://www.blogger.com/atom/ns#' term='Europio english documentation'/><category scheme='http://www.blogger.com/atom/ns#' term='Europio'/><title type='text'>2. Install Europio + Enhance PHP on Linux (Europio User Guide)</title><content type='html'>&lt;h2&gt;First step&lt;/h2&gt;&lt;b&gt;Download&lt;/b&gt; europio_v2_0_18.tar.gz from &lt;a href="https://launchpad.net/europio/+download" target="_blank"&gt;https://launchpad.net/europio/+download&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="micss_hidden_post"&gt;&lt;div style="background-color: transparent;"&gt;&lt;img height="175px;" id="internal-source-marker_0.6869590333662927" src="https://lh6.googleusercontent.com/lWVi8ACeabU9GNoHHgaDFKJiM4nLFjx-xeUDBIr7nbsI_Dt8yYUNKP-KVtkP7Tcv2v7ALS8Gocngwu-8vOdeS-MphwDcTQtJFEiDB3bCby5et21KTeo" width="347px;" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2&gt;Second step&lt;/h2&gt;&lt;b&gt;Decompress&lt;/b&gt; tarball and &lt;b&gt;rename&lt;/b&gt; europio_2_0 folder by the name of your new app. You must be sure that the new app folder is into the root folder server.&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: transparent; clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img height="122px;" id="internal-source-marker_0.6869590333662927" src="https://lh5.googleusercontent.com/AKT_T5AAxd-zdvzO5Zwb4zpe_kOgQSiui6KzQqRuTb9MwWJn1JYSR2-_IVjPLceLw0sr1KBBS0cqLNjMvcgt2N2c4JugQ5Yc8nSjtD_BkdWHfZWIpRE" width="142px;" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;You can use the root folder like folder for your app.&lt;/b&gt;&lt;br /&gt;In this case, you must move the europio_2_0 folder content to the root server folder.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Third step&lt;/h2&gt;&lt;b&gt;Enable&lt;/b&gt; Apache &lt;b&gt;mod_rewrite&lt;/b&gt; by writing &lt;br /&gt;&lt;pre style="display: inline;"&gt;sudo a2enmod rewrite&lt;/pre&gt;in the command line. Then, &lt;b&gt;restart&lt;/b&gt; Apache by writing &lt;br /&gt;&lt;pre style="display: inline;"&gt;sudo /etc/init.d/apache2 restart&lt;/pre&gt;(You note that the &lt;br /&gt;&lt;pre style="display: inline;"&gt;/etc/init.d/apache2&lt;/pre&gt;path could be different in your server).&lt;br /&gt;&lt;div style="background-color: transparent;"&gt;&lt;img height="77" id="internal-source-marker_0.6869590333662927" src="https://lh6.googleusercontent.com/p-wBQRkGDdtC2TwXNJ3uvEjISUW4nmWhit4y6jz0GJ6ODZkFmky_YmyhJvfRkUjM8LQDGidly3LljSOceTTqD-nu_MtjLIivaD0PFycgv8149z-h_PI" width="400" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2&gt;Final step&lt;/h2&gt;&lt;b&gt;Edit&lt;/b&gt; the &lt;pre style="display: inline;"&gt;/etc/apache2/sites-available/&amp;lt;sitename&amp;gt;&lt;/pre&gt;file by changing this:&lt;br /&gt;&lt;pre&gt;AllowOverride None&lt;/pre&gt;for: &lt;br /&gt;&lt;pre&gt;AllowOverride &lt;b&gt;All&lt;/b&gt;&lt;/pre&gt;and restart Apache again.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;Europio + Enhance PHP User Guide&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://eugeniabahit.blogspot.com/p/europio.html"&gt;Back to the table of contents&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-307498608205969225?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/307498608205969225/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/10/europio-enhance-php-install-guide-on.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/307498608205969225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/307498608205969225'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/10/europio-enhance-php-install-guide-on.html' title='2. Install Europio + Enhance PHP on Linux (Europio User Guide)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-1589961578412359226</id><published>2011-10-03T19:22:00.000-03:00</published><updated>2011-10-04T23:47:51.874-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Europio Start Guide'/><category scheme='http://www.blogger.com/atom/ns#' term='Europio english documentation'/><category scheme='http://www.blogger.com/atom/ns#' term='Europio'/><title type='text'>4. Configure the settings.php file (Europio User Guide)</title><content type='html'>The &lt;b&gt;./core/settings.php&lt;/b&gt; file has information about central data that are used by Europio in order to run the entire app. You must be sure that its information are correctly before to run the app.&lt;br /&gt;&lt;br /&gt;Please, take a look at the below documentation in order to configure the settings.php file correctly.&lt;br /&gt;&lt;br /&gt;&lt;div class="micss_hidden_post"&gt;&lt;h2&gt;Configure the database constants&lt;/h2&gt;These constants must be look like that:&lt;br /&gt;&lt;pre class="brush: php"&gt;const DB_HOST = 'localhost'; // host of the database&lt;br /&gt;const DB_NAME = 'mydbone'; // name of the primary database&lt;br /&gt;const DB_USER = 'root'; // user of the database&lt;br /&gt;const DB_PASS = 'pass'; // password of the database&lt;/pre&gt;&lt;blockquote&gt;Note that if the database not exists will be created by the ORM at the first time that it runs by the command line.&lt;/blockquote&gt;&lt;br /&gt;&lt;h2&gt;Set the app folder&lt;/h2&gt;The app folder must be setting in the APPLICATION_DIR constant:&lt;br /&gt;&lt;pre class="brush: php"&gt;// your app folder here&lt;br /&gt;const APPLICATION_DIR = '/mynewapp';&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;Installed modules&lt;/h2&gt;Europio was planned in order to write modular apps. It suppose that your app has one or more modules developed.&lt;br /&gt;If you have only one module anyway, you must keep the &lt;a href="http://eugeniabahit.blogspot.com/2011/10/01-europio-folders-structure.html"&gt;modulars folder structure&lt;/a&gt;. In this way, you must set the name of each installed modules in the $modulos array (even if you have only one).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;For example:&lt;/b&gt;&lt;br /&gt;If you have an "users" module, the $modulos array must be look like that:&lt;br /&gt;&lt;pre class="brush: php"&gt;$modulos = array('users',);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;But, if you have two or more modules (for example: users, store, blog) the $modulos array will look like that:&lt;br /&gt;&lt;pre class="brush: php"&gt;$modulos = array('users', 'store', 'blog',);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;Set the app resources&lt;/h2&gt;&lt;blockquote&gt;The &lt;b&gt;resources are all actions or functions&lt;/b&gt; that can be executed by each model in your app.&lt;/blockquote&gt;For example, your models could have some resources like as create, read, update and/or delete methods. Also, these methods could have another actions like show-form-update, show-form-search, etc.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;All resources must be defined in a own constant.&lt;/b&gt; Each resource-constant must start with the __FU__ prefix in order to be automaticly identified by Europio. Europio will be using these constants in order to get all the friendly URL of your app and then, will be returned a global array with them.&lt;br /&gt;&lt;br /&gt;The friendly URLs are formed by the following pattern:&lt;br /&gt;&lt;pre&gt;/app_dir/module/model/&lt;b&gt;resource&lt;/b&gt;/&lt;/pre&gt;Where &lt;b&gt;resource&lt;/b&gt; will be replaced by the value of each constant.&lt;br /&gt;&lt;br /&gt;See this example:&lt;br /&gt;&lt;pre class="brush: php"&gt;const __FU__SHOW_FORM_NEW_ROW = 'new';&lt;br /&gt;const __FU__SAVE_NEW_ROW = 'insert';&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;&lt;br /&gt;Friendly URLs retorned:&lt;br /&gt;&lt;br /&gt;$__FU__ = array(&lt;br /&gt; 'USERS_PROFILE_SHOW_FORM_NEW_ROW' =&gt; '/mynewapp/users/profile/new/',&lt;br /&gt; 'USERS_PROFILE_SHOW_SAVE_NEW_ROW' =&gt; '/mynewapp/users/profile/insert/',&lt;br /&gt; 'USERS_PICTURE_SHOW_FORM_NEW_ROW' =&gt; '/mynewapp/users/picture/new/',&lt;br /&gt; 'USERS_PICTURE_SHOW_SAVE_NEW_ROW' =&gt; '/mynewapp/users/picture/insert/',&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;*/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The previous example returns an array based-on an app that has only one module called "users" and it has two models: "profile" and "picture".&lt;br /&gt;Like you see, the defined resources are generic and are used on each module for each model. But then, you may can to use only those what you need.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;Europio + Enhance PHP User Guide&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://eugeniabahit.blogspot.com/p/europio.html"&gt;Back to the table of contents&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-1589961578412359226?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/1589961578412359226/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/10/settingsphp-file.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/1589961578412359226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/1589961578412359226'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/10/settingsphp-file.html' title='4. Configure the settings.php file (Europio User Guide)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-2666383577946022157</id><published>2011-10-02T16:59:00.001-03:00</published><updated>2011-10-04T23:48:33.140-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Europio english documentation'/><category scheme='http://www.blogger.com/atom/ns#' term='Europio'/><title type='text'>1. About Europio (Europio User Guide)</title><content type='html'>&lt;h2&gt;What is Europio?&lt;/h2&gt;&lt;b&gt;Europio&lt;/b&gt; is a suite of tools and libraries that can be used as core by any modular app, developed in PHP object orientated under a MVC architecture.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Europio&lt;/b&gt; can be used like a framework that it help you to keep coherency in your MVC architecture by writing standard code with predefined style rules.&lt;br /&gt;&lt;br /&gt;Also, &lt;b&gt;Europio&lt;/b&gt; has included some additional helpers that are useful in order to write less code and to test your classes through &lt;b&gt;Enhance PHP&lt;/b&gt;, a unit testing framework, that was incorporated since the 2.0 release.&lt;br /&gt;&lt;br /&gt;&lt;div class="micss_hidden_post"&gt;&lt;div style="text-align: right;"&gt;&lt;a href="https://code.launchpad.net/europio" target="_blank" class="buttonlink"&gt;&lt;b&gt;Download Europio v2.0.18 Now!&lt;/b&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2&gt;Features summary&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Keep a standard-fixed MVC architecture&lt;/li&gt;&lt;li&gt;Easy maintainability and scalability of modular apps&lt;/li&gt;&lt;li&gt;DB abstraction layer to keep clean models&lt;/li&gt;&lt;li&gt;Predefined style rules to write standard code&lt;/li&gt;&lt;li&gt;Set data model interface to create relational models easily&lt;/li&gt;&lt;li&gt;Creating relational databases by object relational mapping (ORM) of all your app models&lt;/li&gt;&lt;li&gt;Easy data validation based on common regular expressions&lt;/li&gt;&lt;li&gt;Write TDD, mocks and stubs for your entire app with Enhance PHP&lt;/li&gt;&lt;li&gt;Abstraction views layer to avoid blending programming languages&lt;/li&gt;&lt;li&gt;Dynamic data rendering of HTML templates&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: right;"&gt;&lt;a href="https://code.launchpad.net/europio" target="_blank" class="buttonlink"&gt;&lt;b&gt;Download Europio v2.0.18 Now!&lt;/b&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h2&gt;About Europio and Enhance PHP Projects&lt;/h2&gt;&lt;br /&gt;&lt;b&gt;Europio&lt;/b&gt; and &lt;b&gt;Enhance PHP&lt;/b&gt; are &lt;b&gt;free software&lt;/b&gt; distributed under GNU / LGPL and Apache 2.0 licence, respectively.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Europio&lt;/b&gt;, developed by &lt;a href="http://www.eugeniabahit.com.ar/"&gt;Eugenia Bahit&lt;/a&gt; in Argentina and &lt;b&gt;&lt;a href="http://www.enhance-php.com/" target="_blank"&gt;Enhance PHP&lt;/a&gt;&lt;/b&gt;, developed by &lt;a href="http://www.setevefenton.co.uk/" target="_blank"&gt;Steve Fenton&lt;/a&gt; in England were joined in September 2011 by its developers in order to make the europio-enhance project, hosted in Launchpad at &lt;a href="https://code.launchpad.net/europio" target="_blank"&gt;code.launchpad.net/europio&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;a href="https://code.launchpad.net/europio" target="_blank" class="buttonlink"&gt;&lt;b&gt;Download Europio v2.0.18 Now!&lt;/b&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;Europio + Enhance PHP User Guide&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://eugeniabahit.blogspot.com/p/europio.html"&gt;Back to the table of contents&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-2666383577946022157?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/2666383577946022157/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/10/about-europio-english-documentation.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/2666383577946022157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/2666383577946022157'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/10/about-europio-english-documentation.html' title='1. About Europio (Europio User Guide)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-8079844509065152912</id><published>2011-10-02T00:00:00.000-03:00</published><updated>2011-10-04T23:48:05.302-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Europio Start Guide'/><category scheme='http://www.blogger.com/atom/ns#' term='Europio english documentation'/><title type='text'>3. Folders Structure (Europio User Guide)</title><content type='html'>You must have the following folder structure in your app:&lt;br /&gt;&lt;div class="micss_hidden_post"&gt;&lt;h2&gt;One folder for your app&lt;/h2&gt;&lt;blockquote&gt;&lt;pre&gt;[+] &lt;b&gt;mynewapp&lt;/b&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;h2&gt;One folder for each app module into the app folder&lt;/h2&gt;&lt;blockquote&gt;&lt;pre&gt;[-] mynewapp&lt;br /&gt;&amp;nbsp; &amp;nbsp; [+] &lt;b&gt;module-1&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; [+] &lt;b&gt;module-2&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; [+] &lt;b&gt;module-3&lt;/b&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;h2&gt;Inside each of the modules must be the following four folders: models, views, &amp;nbsp;controllers and test&lt;/h2&gt;&lt;blockquote&gt;&lt;pre&gt;[-] mynewapp&lt;br /&gt;&amp;nbsp; &amp;nbsp; [-] module-1&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [+]&lt;b&gt; models&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [+] &lt;b&gt;views&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [+] &lt;b&gt;controllers&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [+] &lt;b&gt;test&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; [-] module-2&lt;br /&gt;&amp;nbsp; &amp;nbsp; [-] module-3&lt;/pre&gt;&lt;/blockquote&gt;&lt;h2&gt;The Europio core folder must be into the app folder&lt;/h2&gt;&lt;blockquote&gt;&lt;pre&gt;[-] mynewapp&lt;br /&gt;&amp;nbsp; &amp;nbsp; [+]&lt;b&gt; core&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; [-] module-1&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [+] models&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [+] views&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [+] controllers&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [+] test&lt;br /&gt;&amp;nbsp; &amp;nbsp; [-] module-2&lt;br /&gt;&amp;nbsp; &amp;nbsp; [-] module-3&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;h2&gt;Files inside the app folder&lt;/h2&gt;The &lt;a href="http://pastebin.com.ar/6824" target="_blank" title="see or download this file"&gt;__init__.php&lt;/a&gt; app file and an &lt;a href="http://pastebin.com.ar/6825" target="_blank" title="see or download this file"&gt;.htaccess&lt;/a&gt; file.&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;[-] mynewapp&lt;br /&gt;&amp;nbsp; &amp;nbsp; [+] module-1&lt;br /&gt;&amp;nbsp; &amp;nbsp; [+] module-2&lt;br /&gt;&amp;nbsp; &amp;nbsp; [+] module-3&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;b&gt;__init__.php&lt;/b&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;b&gt;.htaccess&lt;/b&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;h2&gt;One __init__.php module file inside each module&lt;/h2&gt;Note that the __init__.php module file is different that the __init__.php app file.&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;[-] mynewapp&lt;br /&gt;&amp;nbsp; &amp;nbsp; [-] module-1&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [+] models &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [+] views &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [+] controllers &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [+] test&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt; __init__.php&lt;/b&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;Europio + Enhance PHP User Guide&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://eugeniabahit.blogspot.com/p/europio.html"&gt;Back to the table of contents&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-8079844509065152912?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/8079844509065152912/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/10/01-europio-folders-structure.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/8079844509065152912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/8079844509065152912'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/10/01-europio-folders-structure.html' title='3. Folders Structure (Europio User Guide)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-6396984784011734981</id><published>2011-09-27T12:43:00.001-03:00</published><updated>2011-09-28T22:03:21.923-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Europio v1.0 Final'/><category scheme='http://www.blogger.com/atom/ns#' term='Anuncios Importantes'/><title type='text'>Europio + Enhance PHP</title><content type='html'>&lt;h2&gt;Se suma EnhancePHP, Framework para Unit Testing a la versión 2.0.18 de Europio&lt;/h2&gt;Desde la versión 2.0.18 de &lt;a href="http://eugeniabahit.blogspot.com/2011/09/europio-v10-final-nucleo-para.html"&gt;&lt;b&gt;Europio&lt;/b&gt;&lt;/a&gt;, el core para arquitecturas MVC en PHP, se suma &lt;a href="http://www.enhance-php.com/" target="_blank"&gt;EnhacenPHP&lt;/a&gt;. Un Framework para test unitarios con soporte para mocks, creado por &lt;a href="http://www.stevefenton.co.uk/" target="_blank"&gt;&lt;b&gt;Steve Fenton&lt;/b&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Download the latest stable version, now!&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;a href="https://launchpad.net/europio/+download" target="_blank"&gt;Download Europio + EnhancePHP&lt;/a&gt;&lt;/b&gt; (version 2.0.18)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.enhance-php.com/Content/Download/" target="_blank"&gt;Download EnhancePHP only&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h2&gt;Documentación (inglés / español)&lt;/h2&gt;Desde aquí puedes acceder a la documentación completa tanto en español como en inglés:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://eugeniabahit.blogspot.com/search/label/Enhance%20PHP"&gt;Documentación completa&lt;/a&gt; en español.&lt;/li&gt;&lt;li&gt;&lt;a href="http://eugeniabahit.blogspot.com/2011/09/enhance-php-guia-de-inicio-rapido.html"&gt;Guía de Inicio rápido&lt;/a&gt; en español&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.enhance-php.com/Content/Documentation/" target="_blank"&gt;Documentation in english&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/9023974285878579728-6396984784011734981?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/6396984784011734981/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/09/europio-enhance-php.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/6396984784011734981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/6396984784011734981'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/09/europio-enhance-php.html' title='Europio + Enhance PHP'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-4357789598007513684</id><published>2011-09-26T17:18:00.000-03:00</published><updated>2011-09-26T19:50:38.274-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Enhance PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Test Unitarios'/><title type='text'>Enhance PHP: Acerca de los Test Unitarios (traducción al español)</title><content type='html'>Traducción al español de &lt;a href="http://www.enhance-php.com/Content/About-Unit-Testing/" target="_blank" title="versión original (en inglés)"&gt;enhance-php.com/Content/About-Unit-Testing/&lt;/a&gt; (por Eugenia Bahit)&lt;br /&gt;&lt;br /&gt;Si eres nuevo en las pruebas unitarias y quieres saber de qué se trata todo esto, este es definitivamente el lugar. Hablamos de las bases de las pruebas unitarias y algunos de los principios generales, incluyendo el desarrollo guiado por pruebas o TDD (test-driven development).&lt;br /&gt;&lt;br /&gt;También vamos a añadir algunas recomendaciones de libros si quieres saber más!&lt;br /&gt;&lt;br /&gt;&lt;div class="micss_hidden_post"&gt;&lt;!-- PREGUNTA 1 --&gt;&lt;br /&gt;&lt;p id="p1" class="pseudolink_new"&gt;¿Qué es un test unitario (o prueba unitaria)?&lt;/p&gt;&lt;div id="a1"&gt;Un test unitario es una forma rápida y automática de probar que tu código hace lo que se supone que debe hacer. Confirma que tu código continúa trabajando después de realizar cambios o te alerta desde el comienzo que algo se ha roto. Al escribir test unitarios que cubren todo nuestro código, podemos ejecutarlos rápidamente y verificar nuestra aplicación completa en pocos segundos. &lt;br /&gt;&lt;br /&gt;Un test unitario, actúa incluso como parte de la documentación, descibiendo cómo tu código debe ser utilizado.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- PREGUNTA 2 --&gt;&lt;p id="p2" class="pseudolink_new"&gt;¿Por qué deberías escribir test?&lt;/p&gt;&lt;div id="a2"&gt;Antes que la comunidad de programadores estuviese convencida de los beneficios, algunas personas pensaban que los test unitarios eran una pérdida de tiempo. Algunos programadores pensaban que su trabajo era escribir código de producción, por lo cual, emplear tiempo en los test los cuales no eran código de producción, no era por lo que ellos habían recibido un pago.&lt;br /&gt;&lt;br /&gt;Hoy en día, la mayoría de los programadores profesionales saben que los test unitarios son una parte importante de la escritura del código para producción. Esto significa  que se ofrece una mejor calidad de código y se realizan trabajos como refactorización de código o agregado de nuevas características con facilidad.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;El equipo de investigación, encontró que los equipos que desarrollaban con TDD producían código entre un 60% y 90% mejor, en cuanto a la densidad de defectos que los equipos que desarrollaban sin TDD – vía Phil Haack&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Si tu código no está cubierto por test unitarios, es código antiguo.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- PREGUNTA 3 --&gt;&lt;p id="p3" class="pseudolink_new"&gt;Diferencia entre test unitarios y test de integración&lt;/p&gt;&lt;div id="a3"&gt;Un test unitario aísla una pequeña parte de tu código para realizar las pruebas. Los componentes de los cuales depende tu código, son reemplazados con versiones falsas (simuladas) para hacer tus tests más estables. Un test de integración, cubre muchos componentes en un único test.&lt;br /&gt;&lt;br /&gt;Generalmente un test unitario llama a un método único en una clase única y prueba una parte única de la lógica en el método, mientras que un test de integración garantiza que dos componentes interactúan como se esperaba.&lt;br /&gt;&lt;br /&gt;Debes tener una cobertura de test tan amplia como sea posible para asegurar que el comportamiento de tu código, es lo que esperas que sea. La cobertura de los test de integración no debe abarcar el detalle del compartamiento del código (puesto que esto ya está cubierto por las pruebas unitarias) pero centraliza su foco en comprobar que los componentes están presentes, conectados e interactúan.&lt;br /&gt;&lt;br /&gt;Puedes realizar los Test Unitarios y los Test de Integración con Enhance PHP.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- PREGUNTA 4 --&gt;&lt;p id="p4" class="pseudolink_new"&gt;Buenas prácticas&lt;/p&gt;&lt;div id="a4"&gt;Un test solo debe probar una única unidad lógica. Si estás haciendo múltiples asserts en un único test, deberías considerar si en su lugar, debería haber varios tests con un solo assert. Si un test falla, debería dejar en claro qué lógica está rota; si realizadas demasiadas pruebas en un solo test, será difícil discernir la causa del fallo.&lt;br /&gt;&lt;br /&gt;Métodos públicos:&lt;br /&gt;&lt;br /&gt;Sólo debes probar los métodos públicos. Si el método público llama a un método privado, puedes diseñar tus tests ejercitando las diferentes partes de las lógicas contenidas en el método privado, llamando al método público con la combinación correcta de argumentos.&lt;br /&gt;&lt;br /&gt;Dependencias:&lt;br /&gt;&lt;br /&gt;Si la clase o función que estás testeando se basa en algún otro componente, debes proporcionar una versión falsa (simulada) de ese componente para aislar el test. No deseas cambios en otro componente para afectar tus tests.&lt;br /&gt;&lt;br /&gt;Sobre los nombres:&lt;br /&gt;&lt;br /&gt;El nombre de tu test debe ser lo suficientemente descriptivo para decirte que ha ido mal si éste falla. Por ejemplo:&lt;br /&gt;&lt;br /&gt;[NombreDelMétodo]con[condición]esperando[Resultados]&lt;br /&gt;&lt;br /&gt;Un ejemplo real sería:&lt;br /&gt;&lt;br /&gt;SumarDosNumerosCon3y5Esperando8&lt;br /&gt;&lt;br /&gt;Algunas personas utilizan el guión bajo en vez de “con” y “esperando”.&lt;br /&gt;&lt;br /&gt;[NombreDelMétodo]_[condición]_[Resultados]&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- PREGUNTA 5 --&gt;&lt;p id="p5" class="pseudolink_new"&gt;Un test de ejemplo&lt;/p&gt;&lt;div id="a5"&gt;&lt;pre class="brush: php"&gt;public function SumarDosNumerosCon3y2Esperando5() {&lt;br /&gt;        $destino = Enhance::getCodeCoverageWrapper('ExampleClass');&lt;br /&gt;        $resultado = $destino-&gt;SumarDosNumeros(3, 2);&lt;br /&gt;        Assert::areIdentical(5, $resultado);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Este test es para un método llamado "SumarDosNumeros", el cual es una función de suma simple. Lo probamos pasándole 3 y 2 esperando que la respuesta (resultado) sea 5. Si el método retorna otro valor el test fallaría.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- PREGUNTA 6 --&gt;&lt;p id="p6" class="pseudolink_new"&gt;¿Qué son los fakes, los mocks y los stubs?&lt;/p&gt;&lt;div id="a6"&gt;Un "fake" es una clase ficticia u objeto que usas en lugar de uno real con el propósito de realizar el test. Por ejemplo, si tenías un código basado en una clase llamada "CalcularImpuesto", no querrías usar la Calculadora de Impuestos real en tus tests  ya que esto haría que los test sean frágiles. Si la calculadora de impuestos cambia, podría causar que tus test fallen a pesar de que le código y el comportamiento de tu código en el test esté correcto. Así que en vez de usar la calculadora de impuestos real, que actualmente determina el impuesto al 22%, pero el próximo año podrá ser de 20% o 25%, crearemos una versión falsa (un fake) que siempre utilice el mismo porcentaje. Ahora nuestros test no serán afectados por los cambios en la calculadora de impuestos y será menos frágil.&lt;br /&gt;&lt;br /&gt;Los “Mocks” y “Stubs” son dos tipos de versiones falsas (fakes) usados en los test unitarios. Un stub simplemente actúa como un comodín para permitir que los test se ejecuten mientras que un mock es usado para verificar que se llama a ciertos hechos con determinados argumentos. Así que un stub está justo allí para hacer que tus tests transcurran fuera de las clases sin depender de ella y un mock  es usado para pasar o fallar un test (es decir, no llama a un método que debería llamar o, si llama a un método que no debería haber llamado, puedes hacer fallar el test).&lt;br /&gt;&lt;br /&gt;Puedes reproducir un mock o un stub escribiendo una clase con la misma interfaz como en la clase real y hardcodear los valores devueltos. Sinembargo, para ahorrarte el trabajo, Enhance PHP la generará por ti.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- PREGUNTA 7 --&gt;&lt;p id="p7" class="pseudolink_new"&gt;¿Cómo utilizar un mock?&lt;/p&gt;&lt;div id="a7"&gt;Crear un mock y agregar una expectativa (el resultado que esperas):&lt;br /&gt;&lt;pre class="brush: php"&gt;$mock = MockFactory::createMock('ExampleClass');&lt;br /&gt;$mock-&gt;addExpectation(&lt;br /&gt;	Expect::method('SumarDosNumeros')-&gt;with(3, 5)-&gt;returns(8)-&gt;times(1)&lt;br /&gt;);&lt;/pre&gt;&lt;br /&gt;Pasarlo a la clase como una dependencia:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;$myClass = new MyClass($mock);&lt;/pre&gt;&lt;br /&gt;Comprobar que le método fue llamado el número de veces exacto con los argumentos correctos:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;$mock-&gt;verifyExpectations();&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- PREGUNTA 8 --&gt;&lt;p id="p8" class="pseudolink_new"&gt;¿Cómo usar un Stub?&lt;/p&gt;&lt;div id="a8"&gt;Crear un stub y agregar los valores de retorno requeridos:&lt;br /&gt;&lt;pre class="brush: php"&gt;$stub= MockFactory::createStub('ExampleClass');&lt;br /&gt;$stub-&gt;addExpectation(&lt;br /&gt;	Expect::method('SumarDosNumeros')-&gt;with(3, 5)-&gt;returns(8)&lt;br /&gt;);&lt;/pre&gt;&lt;br /&gt;Pasarlo a una clase como una dependencia:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;$myClass = new MyClass($stub);&lt;/pre&gt;&lt;br /&gt;No verificas las expectativas sobre un stub – éste justamente está allí para ayudarte a evitar realizar varios tests de dependencias de una clase cuando en realidad intentas testar la clase en sí misma.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- PREGUNTA 9 --&gt;&lt;p id="p9" class="pseudolink_new"&gt;¿Qué es el desarrollo guiado por pruebas (TDD)?&lt;/p&gt;&lt;div id="a9"&gt;El desarrollo guiado por pruebas es el proceso de solo escribir el código de producción una vez que hayas hecho fallar el test. Primero escribes el test para verificar una sola parte de la funcionalidad de tu aplicación, entonces, escribes la mínima cantidad de código requerida para hacerlo trabajar.&lt;br /&gt;&lt;br /&gt;Aquí hay un ejemplo rápido:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Paso 1:&lt;/b&gt;&lt;br /&gt;Primero que todo, crearemos nuestra clase de suma simple, y vamos a escribir una función que sume dos números, teniendo dos argumentos que serán los números a ser sumados. Antes de pensar en el código que habrá que implementar, escribiremos un test que esperamos que falle. Este es un ejemplo completo:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;&amp;lt;?php&lt;br /&gt;// Ejemplo construido usando TDD&lt;br /&gt;include('../EnhanceTestFramework.php');&lt;br /&gt;class ExampleClass {&lt;br /&gt;        public function SumarDosNumeros($a, $b) {&lt;br /&gt;        }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class ExampleTestFixture extends EnhanceTestFixture {&lt;br /&gt;        private $target;&lt;br /&gt;        &lt;br /&gt;        public function setUp() {&lt;br /&gt;                $this-&gt;target = Enhance::getCodeCoverageWrapper('ExampleClass');&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        public function SumarDosNumerosCon3y2Esperando5() {&lt;br /&gt;                $result = $this-&gt;target-&gt;SumarDosNumeros(3, 2);&lt;br /&gt;                Assert::areIdentical(5, $result);&lt;br /&gt;        }&lt;br /&gt;}&lt;br /&gt;Enhance::runTests();&lt;br /&gt;?&amp;gt;&lt;/pre&gt;&lt;br /&gt;Desde éste, tenemos el siguiente resultado - ya que el método no devuelve nada.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;SumarDosNumerosCon3y2Esperando5 - Failed &lt;br /&gt;Expected 5 but was&lt;/b&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;b&gt;Paso 2:&lt;/b&gt;&lt;br /&gt;Nuestro siguiente paso es implementar la mínima cantidad de código necesaria para hacer pasar el test, para lo cual cambiaremos nuestro método:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;	public function SumarDosNumeros($a, $b) {&lt;br /&gt;       }&lt;br /&gt;&lt;/pre&gt;por:&lt;br /&gt;&lt;pre class="brush: php"&gt;	public function SumarDosNumeros($a, $b) {&lt;br /&gt;		return 5;&lt;br /&gt;       }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Cuando ejecutemos nuestro test, pasará la prueba:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;SumarDosNumerosCon3y2Esperando5 - Passed&lt;/b&gt;&lt;/blockquote&gt;&lt;br /&gt;Al comienzo, puede parecer extraño escribir una pequeña cantidad de código para hacer pasar el test, pero el punto es, que si hubiésemos escrito más código que ese, el código adicional escrito más allá del mínimamente requerido en realidad no estaría completamente testeado.&lt;br /&gt;&lt;br /&gt;Escribiendo una mínima cantidad de código para hacer que el test pase, nos obligamos a escribir el siguiente test para exponer el error en la función que estamos probando.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Paso 3:&lt;/b&gt;&lt;br /&gt;Por lo tanto, ya que queremos escribir más código de producción, necesitamos provocar una falla en lo que tenemos, usando un test. Éste, es el test que podríamos añadir:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;public function SumarDosNumerosCon4y2Esperando6() {&lt;br /&gt;    $result = $this-&gt;target-&gt;SumarDosNumeros(4, 2);&lt;br /&gt;    Assert::areIdentical(6, $result);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Debido a que previamente hardcodeamos el valor devuelto para pasar el test anterior, este test fallará:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;SumarDosNumerosCon4y2Esperando6 - Failed &lt;br /&gt;Expected 6 but was 5&lt;/b&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;b&gt;Paso 4:&lt;/b&gt;&lt;br /&gt;Y hacemos pasar este test, escribiendo la mínima cantidad de código una vez más – sólo que esta vez, necesitamos hacer pasar nuestros dos test, así que en vez de hardcodear el valor devuelto a 6, haremos algo así:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;public function SumarDosNumeros($a, $b) {&lt;br /&gt;    return $a + $b;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;SumarDosNumerosCon3y2Esperando5 - Passed &lt;br /&gt;SumarDosNumerosCon4y2Esperando6 - Passed &lt;/b&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;b&gt;Paso 5:&lt;/b&gt;&lt;br /&gt;Repetimos este proceso hasta que tengamos toda nuestra funcionalidad desarrollada por completo. Podemos tener mucha confianza en que nuestros tests son ejercicios de todo el recorrido lódigo através de nuestro código y podemos ejecutar nuestros tests, cada vez que hacemos un cambio para asegurar que no se ha afectado el comportamiento de nuestra aplicación.&lt;br /&gt;&lt;br /&gt;El punto final para recordar para el desarrollo guiado por pruebas, es que si un bug es reportado, deberás escribir un test que exponga el bug antes de corregirlo. Al comienzo, tu motivación para este proceso será que si tienes un test que exponga el bug, puedes tener la certeza de que el mismo bug jamás volverá a ocurrir nuevamente.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Lectura recomendada: &lt;/b&gt; Si deseas ampliar tus conocimientos sobre TDD, te recomiendo el libro &lt;b&gt;Diseño Ágil con TDD&lt;/b&gt; (en español) de &lt;b&gt;Carlos Blé&lt;/b&gt;. Puedes acceder a este libro de forma gratuita visitando el siguiente enlace: &lt;a href="http://eugeniabahit.blogspot.com/2011/08/diseno-agil-con-tdd-por-carlos-ble.html"&gt;http://eugeniabahit.blogspot.com/2011/08/diseno-agil-con-tdd-por-carlos-ble.html&lt;/a&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/9023974285878579728-4357789598007513684?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/4357789598007513684/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/09/enhance-php-acerca-de-los-test.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/4357789598007513684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/4357789598007513684'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/09/enhance-php-acerca-de-los-test.html' title='Enhance PHP: Acerca de los Test Unitarios (traducción al español)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-8264942497601084981</id><published>2011-09-25T19:14:00.002-03:00</published><updated>2011-09-25T19:14:48.224-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Enhance PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Test Unitarios'/><title type='text'>Enhance PHP: Guía de Inicio Rápido</title><content type='html'>Instalar Enhance PHP y escribir tu primer test es verdaderamente fácil. Es probable que sea el framework para test unitarios en PHP, más fácil de instalar, pero esto, no ha sido “clínicamente” comprobado.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Instalación&lt;/h2&gt;&lt;a href="http://www.enhance-php.com/Content/Download/" target="_blank"&gt;Descargar y descomprimir el ZIP con el archivo EnhanceTestFramework.php&lt;/a&gt; y colocarlo en algún lugar donde pued ser importado desde tus test.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Tu primer test&lt;/h2&gt;Aquí hay un ejemplo para tu primer test, con una gran cantidad de comentarios que le ayudarán a empezar. Puede copiar este ejemplo en un archivo .php para probarlo.&lt;br /&gt;&lt;div class="micss_hidden_post"&gt;&lt;pre class="brush: php"&gt;&amp;lt;?php&lt;br /&gt;// Importar Enhance PHP&lt;br /&gt;include_once('EnhanceTestFramework.php');&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;&amp;nbsp; &amp;nbsp;Crear las clases de la aplicación&lt;br /&gt;&amp;nbsp; &amp;nbsp;éstas, podrán lógicamente, estar en archivos y directorios separados&lt;br /&gt;&amp;nbsp; &amp;nbsp;y luego ser importadas en los test&lt;br /&gt;*/&lt;br /&gt;class ExampleClass {&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function addTwoNumbers($a, $b) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return $a + $b;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;&amp;nbsp; &amp;nbsp;Los test deben ser clases extendidas de EnhanceTestFixture&lt;br /&gt;&amp;nbsp; &amp;nbsp;El nombre de la clase será NombreDeMiClaseTest&lt;br /&gt;*/&lt;br /&gt;class ExampleClassTests extends EnhanceTestFixture {&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /*&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Método setUp:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Es un método opcional. Los métodos setup en los test unitarios son&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; utilizados para pre-configurar todo aquello que necesite ser utilizado&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; en todo el test (por ejemplo, setear el valor de una propiedad)&lt;br /&gt;&amp;nbsp; &amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function setUp() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //...&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /*&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Método tearDown:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Es también un método opcional. Los métodos tearDown en los test&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; unitarios, cumplen la función inversa a los métodos setup, es decir,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sirven para reestablecer aquellas configuraciones realizadas, que sean&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; requeridas al finalizar el test.&lt;br /&gt;&amp;nbsp; &amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function tearDown() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //...&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /*&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; El test:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Puede tener el nombre que desees, pero ten cuenta que debe ser un método&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; público.&lt;br /&gt;&amp;nbsp; &amp;nbsp; */&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function addTwoNumbersWith3and2Expect5Test() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Crear el objeto a ser testeado&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $target = Enhance::getCodeCoverageWrapper('ExampleClass');&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Llamar al método que será testeado&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $result = $target-&amp;gt;addTwoNumbers(3, 2);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Verificar los resultados mediante un método assert&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Assert::areIdentical(5, $result);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Correr el test&lt;br /&gt;Enhance::runTests();&lt;br /&gt;?&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-8264942497601084981?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/8264942497601084981/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/09/enhance-php-guia-de-inicio-rapido.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/8264942497601084981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/8264942497601084981'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/09/enhance-php-guia-de-inicio-rapido.html' title='Enhance PHP: Guía de Inicio Rápido'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-4832552027119421363</id><published>2011-09-25T18:41:00.000-03:00</published><updated>2011-09-26T23:53:26.654-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Enhance PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Test Unitarios'/><title type='text'>Presentación de Enhance PHP - Framework para test unitarios en PHP</title><content type='html'>&lt;b&gt;&lt;a href="http://www.enhance-php.com/" target="_blank" title="(documentación en inglés)"&gt;Enhance PHP&lt;/a&gt;&lt;/b&gt; es un framework liviano de código abierto, para realizar test unitarios en PHP, con soporte para mocks y stubs, escrito en PHP, para PHP.&lt;br /&gt;&lt;blockquote&gt;Utilizando una sintaxis de test unitarios, simple y natural, &lt;a href="http://www.enhance-php.com/" target="_blank" title="(documentación en inglés)"&gt;Enhance PHP&lt;/a&gt; asegura ser la mejor opción para programadores que deseen  comenzar rápidamente con test unitarios, mocks y stubs.&lt;/blockquote&gt;&lt;a href="http://www.enhance-php.com/" target="_blank" title="(documentación en inglés)"&gt;Enhance PHP&lt;/a&gt; planea cumplir los siguientes objetivos:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ser el más rápido para &lt;span id="goog_744968324"&gt;&lt;/span&gt;comenzar a utilizar&lt;span id="goog_744968325"&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Tener un estilo y sintaxis más familiar comparado con otros lenguajes&lt;/li&gt;&lt;li&gt;Inclusión&amp;nbsp;de las características más necesarias&lt;/li&gt;&lt;li&gt;Arrojar reportes en formato HTML y XML&lt;/li&gt;&lt;/ul&gt;&lt;div class="micss_hidden_post"&gt;&lt;br /&gt;Los creadores de &lt;a href="http://www.enhance-php.com/" target="_blank" title="(documentación en inglés)"&gt;Enhance PHP&lt;/a&gt;, utilizan actualmente el framework para realizar los auto-test del proyecto. Las características principales del proyecto son:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Framework para test unitarios&lt;/li&gt;&lt;li&gt;Amplio rango de métodos assert&lt;/li&gt;&lt;li&gt;Mocks y Stubs que puedan ser verificados&lt;/li&gt;&lt;li&gt;Método simple de cobertura de las estadísticas integrado, que no requiere debugger&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Sobre el Proyecto: Miembros del equipo&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Diseño del logotipo, del sitio Web - &lt;a href="http://www.stevefenton.co.uk/" target="_blank" title="(documentación en inglés)"&gt;Steve Fenton&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Gestión de contenidos / Hosting - &lt;a href="http://www.swift-point.co.uk/" target="_blank" title="(documentación en inglés)"&gt;Swift Point&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Framework Developer &amp;nbsp;- &lt;a href="http://www.stevefenton.co.uk/" target="_blank" title="(documentación en inglés)"&gt;Steve Fenton&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Framework Advisor - &lt;a href="http://twitter.com/m_j_o_n_e_s" target="_blank" title="(documentación en inglés)"&gt;Mark Jones&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Visitar la &lt;b&gt;Web del proyecto&lt;/b&gt;:&amp;nbsp;&lt;a href="http://www.enhance-php.com/" target="_blank" title="(documentación en inglés)"&gt;http://www.enhance-php.com/&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-4832552027119421363?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/4832552027119421363/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/09/presentacion-de-enhance-php-framework.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/4832552027119421363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/4832552027119421363'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/09/presentacion-de-enhance-php-framework.html' title='Presentación de Enhance PHP - Framework para test unitarios en PHP'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-3820578308989232643</id><published>2011-09-07T21:51:00.000-03:00</published><updated>2011-09-27T12:32:51.415-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Librerias GPL'/><category scheme='http://www.blogger.com/atom/ns#' term='POO'/><category scheme='http://www.blogger.com/atom/ns#' term='Europio v1.0 Final'/><category scheme='http://www.blogger.com/atom/ns#' term='Modelo-Vista-controlador'/><category scheme='http://www.blogger.com/atom/ns#' term='Libros gratis de programación'/><category scheme='http://www.blogger.com/atom/ns#' term='OOP'/><category scheme='http://www.blogger.com/atom/ns#' term='Europio'/><category scheme='http://www.blogger.com/atom/ns#' term='Anuncios Importantes'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación Orientada a Objetos'/><category scheme='http://www.blogger.com/atom/ns#' term='model-view-controller'/><title type='text'>Europio v1.0 Final - Núcleo para Arquitecturas MVC Modulares en PHP 5 Orientado a Objetos</title><content type='html'>&lt;h2&gt;Presentación de Europio&lt;/h2&gt;&lt;b&gt;Europio V1.0 Final - Núcleo para Arquitecturas MVC Modulares en PHP 5 Orientado a Objetos:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Europio&lt;/b&gt; es un conjunto de Librerías PHP liberadas bajo licencia &lt;b&gt;LGPL v3.0&lt;/b&gt;, compuestas de helpers, handlers, clases, funciones agregadas, un dispatcher de URLs y un ORM, diseñadas para actuar como núcleo (core) de aplicaciones modulares desarrolladas bajo el patrón arquitectónico Modelo-Vista-Controlador y programadas en PHP 5.3+ orientado a objetos.&lt;br /&gt;&lt;br /&gt;&lt;div class="micss_hidden_post"&gt;&lt;div class="recuadro_cool"&gt;&lt;img class="fleft" src="http://www.eugeniabahit.com.ar/blog/img/download.png" /&gt;&lt;a href="https://launchpad.net/europio/+download" target="_blank" title="Descargar Europio v1.0 final"&gt;Descargar Europio v1.0 final &amp;gt;&amp;gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="recnormal"&gt;Archivos 100% operativos y funcionales&lt;br /&gt;(Todos los archivos + manual de referencias)&lt;/span&gt;&lt;/div&gt;&lt;div class="recuadro_cool"&gt;&lt;img class="fleft" src="http://www.eugeniabahit.com.ar/blog/img/save.png" /&gt;&lt;a href="https://launchpad.net/europio/+download" target="_blank" title="Manual de Europio v1.0 final"&gt;Descargar Manual de Europio 1.0 &amp;gt;&amp;gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="recnormal"&gt;Manual de referencias y guía de uso de Europio v1.0 final&lt;br /&gt;(formato PDF)&lt;/span&gt;&lt;/div&gt;&lt;div class="recuadro_cool"&gt;&lt;img class="fleft" src="http://www.eugeniabahit.com.ar/blog/img/foro.png" /&gt;&lt;a href="https://answers.launchpad.net/europio" target="_blank" title="Soporte de Europio v1.0 Final"&gt;Foro de Soporte de Europio v1.0 final &amp;gt;&amp;gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="recnormal"&gt;Acceso al soporte ténico sobre todo el core de Europio.&lt;br /&gt;(foro abierto - no requiere registro)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-family: sans-serif; font-size: 17px; font-weight: bold;"&gt;Europio es Software Libre&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.safecreative.org/work/1109080023431" rel="cc:license" xmlns:cc="http://creativecommons.org/ns#"&gt;&lt;img alt="Safe Creative #1109080023431" src="http://resources.safecreative.org/work/1109080023431/label/barcode-150" style="border: 0;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Europio NO ES un framework, sino un "core"&lt;/b&gt;, pensado y desarrollado para &lt;b&gt;Arquitectos de Software avanzados&lt;/b&gt; y &lt;b&gt;Analistas Programadores expertos, cuyo manejo del lenguaje PHP, el patrón arquitectónico MVC y la Programación Orientada a Objetos, sea altamente fluido&lt;/b&gt;, siendo su única finalidad, brindar &lt;b&gt;un core básico y elemental, común a cualquier aplicación modularmente evolutiva y escalable&lt;/b&gt;, que permita no perder el tiempo en tareas repetitivas, facilitando así, la atención en la arquitectura propia de la aplicación (aquella única e irrepetible en cada software), en la creación de modelos que definan el comportamiento y característica de cada objeto, al tiempo de brindarles el apoyo necesario para centrarse únicamente en la ingeniería del sistema, dejando el diseño de interfaces, en manos de diseñadores especializados.&lt;br /&gt;&lt;br /&gt;Europio está compuesto una suite de herramientas y librerías, preparadas para funcionar como núcleo de una aplicación modular. Las librerías y herramientas que lo componen son:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;MissArchitect: Manejador de eventos para arquitecturas MVC y Despachador de URLs Amigables&lt;/h2&gt;&lt;b&gt;MissArchitect&lt;/b&gt; es una mezcla de helpers, handlers y dispatcher de URLs, con “estandarizador de estilos”, diseñada para guiar la arquitecturas de aplicaciones PHP modulares, cuando se trabaja bajo el patrón arquitectónico MVC. En cierta forma, MissArchitect se comporta de forma similar a un Singleton sin serlo, ya que está integrado por dos clases finales, que solo podrán instanciarse una única vez. La finalidad de MissArchitect, es guiar las arquitecturas MVC, proveyendo un manejo absoluto de URL amigables, para controlar las vistas e invocar modelos, sumado a un manejador de peticiones de usuario que actúa de forma automáticamente con cada petición, invocando al controlador correspondiente, y ahorrando al programador, la tarea de tener que manejar dichos eventos.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;MissArchitect ORM: Herramienta de mapeo relacional de datos&lt;/h2&gt;&lt;b&gt;MissArchitect ORM &lt;/b&gt;es un ORM que se encarga de mapear relacionalmente los modelos de toda la aplicación (módulo por módulo) y generar el query necesario, para la creación íntegra de la base de datos relacional. Es la librería más nuevo del núcleo Europio, y pretende avanzar en la provisión de métodos CRUD para todos los módelos. Con la ayuda de MissArchitect ORM, solo bastará con crear los modelos de la aplicación y correr el ORM, para obtener el script de creación de la base de datos relacional, para toda la aplicación. MissArchitect ORM opera con el motor InnoDB permitiendo bases de datos datos relacionales robustas, a través de referencias con claves foráneas.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;DBAbstractModel: Manejador de conexiones y consultas a MySQL&lt;/h2&gt;&lt;b&gt;DBAbstractModel&lt;/b&gt; es una clase abstracta que permite manejar conexiones a bases de datos MySQL, proveyendo los métodos necesarios para ejecutar consultas de cualquier tipo, con solo indicar el query. DBAbstractModel utiliza el objeto mysqli de PHP 5.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;PHPAggregate: Funciones agregadas para la validación de datos&lt;/h2&gt;&lt;b&gt;PHPAggregate&lt;/b&gt; es una librería de funciones agregadas para PHP 5, destinadas a la validación de datos por medio de expresiones regulares. Entre sus funciones agregadas, pueden encontrarse:&lt;br /&gt;Funciones para validación de correo electrónico&lt;br /&gt;Validación de direcciones de IP&lt;br /&gt;Validación de nombres personales, etc.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;PHPValidator: Ayudante para PHPAggregate&lt;/h2&gt;&lt;b&gt;PHPValidator&lt;/b&gt; es el complemento ideal para PHPAggregate ya que permite validar múltiples POST o GET datas, con las funciones agregadas de PHPAggregate, en un solo paso, con tan solo ser instanciado.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;PHPTemplate: Métodos de renderización de diccionarios dinámicos&lt;/h2&gt;&lt;b&gt;PHPTemplate&lt;/b&gt; es una clase PHP que permite la renderización de datos, basada en diccionarios dinámicos, permitiendo una abstracción absoluta de la lógica y el layout de las vistas, logrando una independencia absoluta de lenguajes de programación de los de diseño. Al ser una clase pública, puede ser heradada por la lógica de las vistas o instanciada.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;EnhancePHP: Framework para Unit Testing&lt;/h2&gt;Agregado a la versión Alfa 7 de Europio, se suma &lt;a href="http://www.enhance-php.com/" target="_blank"&gt;EnhacenPHP&lt;/a&gt;. Un Framework para test unitarios con soporte para mocks, creado por &lt;a href="http://www.stevefenton.co.uk/" target="_blank"&gt;&lt;b&gt;Steve Fenton&lt;/b&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Branch a la versión Alfa 7:&lt;/b&gt; bzr branch lp:~eugeniabahit/europio/alfa-7.0&lt;br /&gt;&lt;b&gt;Descarga de EnhacenPHP:&lt;/b&gt; &lt;a href="http://bazaar.launchpad.net/~eugeniabahit/europio/alfa-7.0/files/head:/core/" target="_blank" title="Descargar EnhancePHP desde LaunchPad"&gt;Descargar EnhancePHP desde LaunchPad&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Documentación en español:&lt;/b&gt; &lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://eugeniabahit.blogspot.com/search/label/Enhance%20PHP"&gt;Documentación completa&lt;/a&gt;&lt;br /&gt;Acceder a la &lt;a href="http://eugeniabahit.blogspot.com/2011/09/enhance-php-guia-de-inicio-rapido.html"&gt;Guía de Inicio rápido&lt;/a&gt;&lt;/blockquote&gt;&lt;b&gt;Documentación completa en inglés:&lt;/b&gt; &lt;a href="http://www.enhance-php.com/Content/Documentation/" target="_blank"&gt;www.enhance-php.com&lt;/a&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/9023974285878579728-3820578308989232643?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/3820578308989232643/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/09/europio-v10-final-nucleo-para.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/3820578308989232643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/3820578308989232643'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/09/europio-v10-final-nucleo-para.html' title='Europio v1.0 Final - Núcleo para Arquitecturas MVC Modulares en PHP 5 Orientado a Objetos'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-2837550591069639044</id><published>2011-09-03T21:38:00.000-03:00</published><updated>2011-09-08T00:03:49.689-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Librerias GPL'/><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='Modelo-Vista-controlador'/><category scheme='http://www.blogger.com/atom/ns#' term='MissArchitect'/><category scheme='http://www.blogger.com/atom/ns#' term='OOP'/><category scheme='http://www.blogger.com/atom/ns#' term='model-view-controller'/><title type='text'>MissArchitect - core para arquitecturas MVC en PHP</title><content type='html'>&lt;b&gt;MissArchitect&lt;/b&gt; es una “mezcla” de &lt;b&gt;helper&lt;/b&gt;, &lt;b&gt;handler&lt;/b&gt; y &lt;b&gt;dispatcher&lt;/b&gt; con “&lt;b&gt;estandarizador de estilos&lt;/b&gt;” &lt;b&gt;para arquitecturas MVC en PHP 5&lt;/b&gt;. Tal vez el objetivo más fuerte del proyecto &lt;b&gt;MissArchitect&lt;/b&gt;, es simplemente, este último, y con poco código, obligar a mantener una arquitectura homogénea con reglas de estilo estandarizada, cuando se trabaja con el patrón modelo-vista-controlador en PHP 5 orientado a objetos.&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;Autor: &lt;/b&gt;Eugenia Bahit&lt;br /&gt;&lt;b&gt;Versión actual:&lt;/b&gt; Europio v1.0 Final (estable)&lt;br /&gt;&lt;b&gt;Licencia: &lt;/b&gt;LGPL v3 (software libre)&lt;br /&gt;&lt;b&gt;Descarga y Documentación completa:&lt;/b&gt;&lt;br /&gt;&lt;a href="https://launchpad.net/europio/+download"&gt;https://launchpad.net/europio/+download&lt;/a&gt;&lt;/blockquote&gt;&lt;b&gt;MissArchitect&lt;/b&gt; está desarrollado en PHP 5. Se encuentra integrado por dos clases finales, las cuales no pueden ser heradadas. Tanto sus métodos como propiedades, son privadas, por lo cual no pueden ser accedidas desde ninguna parte de la aplicación. Ambas clases cuentan con su método constructor correspondiente, motivo por el cual, solo requieren ser instanciadas para que cumplan su función.&lt;br /&gt;&lt;div class="micss_hidden_post"&gt;&lt;br /&gt;&lt;b&gt;MissArchitect&lt;/b&gt;, está especialmente diseñada, para manejar la arquitectura de aplicaciones modulares.&lt;br /&gt;&lt;br /&gt;De forma automática, el core del framework, &lt;b&gt;MissArchitectModule&lt;/b&gt;, se encarga de:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Generar las URL amigables (Friendly URLs) para todas las vistas del módulo&lt;/li&gt;&lt;li&gt;Importar todos los modelos, las lógicas de las vistas y los controladores del módulo&lt;/li&gt;&lt;li&gt;Manejar las peticiones del usuario&lt;/li&gt;&lt;li&gt;Invocar al controlador correspondiente&lt;/li&gt;&lt;li&gt;Normalizar la arquitectura y las reglas de estilo de la aplicación&lt;/li&gt;&lt;/ul&gt;Por otro lado, cuenta con &lt;b&gt;MissArchitectApp&lt;/b&gt;: un helper que se encarga de retornar los paths de los módulos instalados en la aplicación, cuando ningún módulo ha sido invocado por el usuario.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-2837550591069639044?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/2837550591069639044/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/09/missarchitect-framework-para.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/2837550591069639044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/2837550591069639044'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/09/missarchitect-framework-para.html' title='MissArchitect - core para arquitecturas MVC en PHP'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-1791939188631992191</id><published>2011-08-27T23:34:00.000-03:00</published><updated>2012-01-23T17:35:35.922-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mis artículos en la Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Publicaciones'/><title type='text'>Artículos escritos para otros sitios</title><content type='html'>&lt;h2&gt; Debian Hackers&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.debianhackers.net/2012/01/23/test-first-programming-en-bash-shell-scripting/" target="_blank"&gt;Test-First Programming ¿en Bash &amp;amp; Shell Scripting?&lt;/a&gt;&lt;br /&gt;Reseña y mini-tutorial de shUnit. Un framework para Test Unitarios en Bash y Shell Scripting&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h2&gt;Programación en Python&lt;/h2&gt;&lt;b&gt;&lt;a href="http://www.maestrosdelweb.com/editorial/guia-python/" target="_blank"&gt;Guía de Programación Orientada a Objetos en Python&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;Completa guía en 9 capítulos, que enseña desde cero, como programar orientado a objetos en Python. Abarca desde los conceptos básicos y fundamentales de la POO, hasta interfaces gráficas y Unit Testing.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Publicado en &lt;b&gt;Noviembre/2011&lt;/b&gt; en &lt;b&gt;MaestrosDelWeb.com&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt; Manual de Metodologías Ágiles para el Desarrollo de Software&lt;/h2&gt;&lt;b&gt;&lt;a href="http://www.desarrolloweb.com/articulos/intro-desarrollo-agil-software.html"&gt;Introduciéndonos en el Desarrollo Ágil&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;Explicación de las metodologías de gestión de proyectos y en concreto del enfoque conocido como Agile.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Publicado el &lt;b&gt;25/08/2011&lt;/b&gt; en &lt;b&gt;DesarrolloWeb.com&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.desarrolloweb.com/articulos/desarrollo-agil-scrum.html"&gt;Introducción al Desarrollo Ágil con Scrum&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;En este capítulo, haremos una vista general de Scrum, definiendo su enfoque y la propuesta al tiempo que lograremos un primer acercamiento a los pilares de sus pautas organizativas.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Publicado el &lt;b&gt;05/09/2011&lt;/b&gt; en &lt;b&gt;DesarrolloWeb.com&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.desarrolloweb.com/articulos/roles-scrum.html"&gt;Los Roles en Scrum&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;Nos insertamos a fondo, en los roles propuestos por Scrum. Hablaremos sobre el Dueño de Producto, el Scrum Master y el Scrum Team. Cuáles son sus tareas y que aspectos deben cuidar cada uno de los roles.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Publicado el &lt;b&gt;14/09/2011&lt;/b&gt; en &lt;b&gt;DesarrolloWeb.com&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.desarrolloweb.com/articulos/artefactos-scrum.html"&gt;Artefactos en Scrum&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;Hablamos sobre las herramientas que Scrum, propone para mantener organizado un proyecto de desarrollo de Software: el backlog de producto, el backlog de sprint y Scrum Taskboar, y el incremento de funcionalidad.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Publicado el &lt;b&gt;21/09/2011&lt;/b&gt; en &lt;b&gt;DesarrolloWeb.com&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.desarrolloweb.com/articulos/ceremonias-scrum.html"&gt;Ceremonias en Scrum&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;En este capítulo hablaremos sobre cómo llevar adelante, la planificación de un Sprint, las reuniones diarias del equipo con el Scrum Master, la revisión y la retrospectiva.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Publicado el &lt;b&gt;29/09/2011&lt;/b&gt; en &lt;b&gt;DesarrolloWeb.com&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="micss_hidden_post"&gt;&lt;h2&gt; Artículos sobre programación en PHP&lt;/h2&gt;&lt;b&gt;&lt;a href="http://vitaminaweb.com/introduccion-a-la-programacion-orientada-a-objetos-en-php_1046" target="_blank"&gt;Introducción a la Programación Orientada a Objetos en PHP&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;Breve síntesis del libro "POO y MVC en PHP".&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Publicado el &lt;b&gt;02/09/2011&lt;/b&gt; en &lt;b&gt;VitaminaWeb.com&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://vitaminaweb.com/ordenar-y-filtrar-resultados-de-consultas-mysql-con-php-sin-saturar-la-base-de-datos_969" target="_blank"&gt;&lt;b&gt;Ordenar y filtrar resultados de consultas MySQL con PHP, sin saturar la base de datos&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;Ordenar y filtrar resultados de consultas MySQL con PHP, mediante la manipulación de arrays evitando consultas SQL anidadas y la saturación de la base de datos.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Publicado el &lt;b&gt;15/08/2011&lt;/b&gt; en &lt;b&gt;VitaminaWeb.com&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://vitaminaweb.com/dos-consejos-para-agilizar-la-escritura-de-codigo-php-y-su-rendimiento_968" target="_blank"&gt;&lt;b&gt;Dos consejos para agilizar la escritura de código PHP (y su rendimiento)&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;Modificar valores de un array en un bucle foreach y Modificar variables globales evitando el uso de global y $GLOBALS.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Publicado el &lt;b&gt;15/08/2011&lt;/b&gt; en &lt;b&gt;VitaminaWeb.com&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt; Opinión&lt;/h2&gt;&lt;b&gt;&lt;a href="http://blogrootlinux.blogspot.com/2011/10/un-medico-la-derecha-por-favor-ah-y-un.html" target="_blank"&gt;Un médico a la derecha y un Freud a la Gerencia de Sistemas&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;Controversias e intercambio de roles en el área IT de las empresas. Un artículo de opinión que vale la pena ser leído para comprender mejor la diferencia real entre los diversos roles del área de la informática.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Publicado el &lt;b&gt;14/10/2011&lt;/b&gt; en &lt;b&gt;RootLinux.com.ar&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-1791939188631992191?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/1791939188631992191/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/08/sobre-el-desarrollo-agil.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/1791939188631992191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/1791939188631992191'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/08/sobre-el-desarrollo-agil.html' title='Artículos escritos para otros sitios'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-6853104306503928543</id><published>2011-08-04T21:30:00.001-03:00</published><updated>2011-08-04T21:32:59.203-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Extreme Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Test-First Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Test Unitarios'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Diseño Ágil con TDD (por Carlos Blé Jurado)</title><content type='html'>Hace unos días, navegando por Internet y sin recordar qué estaba buscando con exactitud, me crucé con el libro &lt;b&gt;&lt;a href="http://www.dirigidoportests.com/el-libro"&gt;Diseño Ágil con TDD&lt;/a&gt;&lt;/b&gt; del español&amp;nbsp;&lt;b&gt;&lt;a href="http://www.carlosble.com/"&gt;Carlos Blé Jurado&lt;/a&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Apasionada como siempre por el Desarrollo Guiado por Pruebas - TDD - (al que al comienzo cuando lo conocí, me pareció que nunca iba a poder con él, pero luego, cuando "le tomé la mano" no me pude separar jamás) y por las metodologías ágiles como Scrum y XP, no puedo más que &lt;b&gt;recomendar altamente este libro&lt;/b&gt;. Cuenta con unas 300 páginas e innumerable cantidad de códigos de ejemplo (lo siento "pehacheperos", pero esta vez, no hay PHP). Aún no terminé de leerlo, pero me ha "capturado" de una forma que no puedo desprenderme.&lt;br /&gt;&lt;div class="micss_hidden_post"&gt;&lt;br /&gt;Si bien lo puedes&amp;nbsp;&lt;a href="http://www.dirigidoportests.com/el-libro"&gt;descargar gratuitamente&lt;/a&gt; ya que es un aporte más con licencia Creative Commons, también puedes&amp;nbsp;&lt;b&gt;&lt;a href="http://www.lulu.com/product/tapa-blanda/dise%C3%B1o-%C3%81gil-con-tdd/6267427"&gt;adquirir una versión impresa por solo US$ 26&lt;/a&gt; &lt;/b&gt;y monedas, que recomiendo (obviamente si tienes una tarjeta de crédito y no como yo que me pierdo de toda compra por Internet por seguir resistiéndome "al plástico").&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-6853104306503928543?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/6853104306503928543/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/08/diseno-agil-con-tdd-por-carlos-ble.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/6853104306503928543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/6853104306503928543'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/08/diseno-agil-con-tdd-por-carlos-ble.html' title='Diseño Ágil con TDD (por Carlos Blé Jurado)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-4089870559174353955</id><published>2011-07-26T20:37:00.005-03:00</published><updated>2011-09-07T23:15:34.667-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Librerias GPL'/><category scheme='http://www.blogger.com/atom/ns#' term='PHPFormValidator'/><title type='text'>PHPFormValidator: Clase para validación automática de cualquier tipo de formulario</title><content type='html'>&lt;div class="separator" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-Ui61KaXQBTw/Ti9T3eJbG8I/AAAAAAAAA40/cgPZyk1gaVQ/s1600/logo_validator.png" /&gt;&lt;/div&gt;&lt;b&gt;&lt;u&gt;Descripción&lt;/u&gt;:&lt;/b&gt; &lt;b&gt;PHPFormValidator&lt;/b&gt; es una clase para PHP 5 que con tan solo instanciar al objeto PHPFormValidator y pasarle una matriz con el nombre de los campos del formulario con su tipo de datos correspondiente, lo validará exhaustivamente, devolviendo el resultado de la validación. PHPFormValidator trabaja en forma conjunta con &lt;b&gt;&lt;a href="http://eugeniabahit.blogspot.com/search/label/PHPAggregate%20Beta%201"&gt;PHPAggregate&lt;/a&gt;&lt;/b&gt; para la validación del tipo de datos.&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;&lt;u&gt;Versión actual&lt;/u&gt;&lt;/b&gt;: Europio v1.0 Final (estable)&lt;br /&gt;&lt;b&gt;&lt;u&gt;Autor&lt;/u&gt;&lt;/b&gt;: &lt;a href="http://eugeniabahit.blogspot.com/"&gt;Eugenia Bahit&lt;/a&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Licencia&lt;/u&gt;&lt;/b&gt;: &lt;a href="http://www.gnu.org/licenses/lgpl.html" target="_blank"&gt;LGPL&lt;/a&gt; v3 (software libre)&lt;br /&gt;&lt;b&gt;&lt;u&gt;Requiere&lt;/u&gt;&lt;/b&gt;: &lt;a href="http://eugeniabahit.blogspot.com/search/label/PHPAggregate%20Beta%201"&gt;Librería PHPAggregate&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;div class="micss_hidden_post"&gt;&lt;b&gt;&lt;u&gt;Descarga&lt;/u&gt;:&amp;nbsp;&lt;/b&gt;&lt;a href="https://launchpad.net/europio/+download"&gt;https://launchpad.net/europio/+download&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="border-right: none; border: 4px solid #f4f4f4; height: 200px; overflow: auto; padding: 5px;"&gt;&lt;b&gt;&lt;u&gt;Importante!&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Instanciar a PHPFormValidator pasándole los parámetros necesarios, tal cual se indica en Sintaxis&lt;/li&gt;&lt;/ul&gt;&lt;pre class="brush: php"&gt;$fv = new FormValidator('POST', $array_field_list);&lt;br /&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;El objeto creado, retornará automáticamente dos propiedades públicas:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;$fv-&amp;gt;invalid_fields&lt;/b&gt; una matriz con los nombres de los campos que no superaron la evaluación y el error correspondiente. $fv-&amp;gt;invalid_fields devolverá NULL si todos los campos evaluados son correctos.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;$fv-&amp;gt;form_data&lt;/b&gt; una matriz conteniendo el nombre de todos los campos y sus valores correspondientes.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Sintaxis:&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;$fv = new FormValidator('[GET|POST]', $array_field_list);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Parámetros:&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;string GET | string POST&lt;/b&gt; Método a través del cual, se envían los datos del formulario. El valor por defecto es POST, pero puede modificarlo, etableciéndolo en GET.&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;$array_field_list&lt;/b&gt; Matriz conteniendo el nombre de los campos a validar, su tipo de datos y parámetros opcionales para la validación (ver más abajo: "tipos de datos admitidos"). Su sintaxis es:&lt;br /&gt;&lt;pre class="brush: php"&gt;$array_field_list = array(&lt;br /&gt;      'nombre_del_campo_1'=&amp;gt;array('tipo_de_datos', $requerid, [opciones]),&lt;br /&gt;      'nombre_del_campo_5'=&amp;gt;array('tipo_de_datos', $requerid, [opciones]),&lt;br /&gt;    );&lt;br /&gt;&lt;/pre&gt;Donde:&lt;br /&gt;&lt;b&gt;$requerid&lt;/b&gt; admite como valor TRUE o FALSE respondiendo a si es o no un campo obligatorio.&lt;br /&gt;&lt;b&gt;[opciones]&lt;/b&gt; (opcional) responde a los parámetros necesarios para validar el tipo de datos. Las opciones a pasar como parámetros adicionales responden al tipo de datos según las funciones de &lt;a href="http://eugeniabahit.blogspot.com/search/label/PHPAggregate%20Beta%201"&gt;PHPAggregate&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;div style="border-right: none; border: 4px solid #f4f4f4; height: 200px; overflow: auto; padding: 5px;"&gt;&lt;b&gt;&lt;u&gt;Tipos de datos admitidos&lt;/u&gt;:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;A continuación, se muestra una tabla con los tipos de datos admitidos que pueden pasarse para ser validados:&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt; &lt;th&gt;Tipo de datos&lt;/th&gt; &lt;th&gt;Descripción&lt;/th&gt; &lt;th&gt;Parámetros&lt;/th&gt; &lt;/tr&gt;&lt;tr&gt;   &lt;td style="font-weight: bold;"&gt;alphabetic&lt;/td&gt;   &lt;td&gt;valida que una cadena contenga solo letras del alfabeto&lt;/td&gt;   &lt;td&gt;&lt;a href="http://eugeniabahit.blogspot.com/2011/07/manual-de-phpaggregate-libreria-de.html"&gt;is_alphabetic()&lt;/a&gt;&lt;br /&gt;(función de PHPAggregate)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt;   &lt;td style="font-weight: bold;"&gt;alphanumeric&lt;/td&gt;   &lt;td&gt;valida que una cadena contenga solo letras y números&lt;/td&gt;   &lt;td&gt;&lt;a href="http://eugeniabahit.blogspot.com/2011/07/manual-de-phpaggregate-libreria-de.html"&gt;is_alphanumeric()&lt;/a&gt;&lt;br /&gt;(función de PHPAggregate)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt;   &lt;td style="font-weight: bold;"&gt;numeric&lt;/td&gt;   &lt;td&gt;valida que una cadena contenga solo números&lt;/td&gt;   &lt;td&gt;&lt;a href="http://eugeniabahit.blogspot.com/2011/07/manual-de-phpaggregate-libreria-de.html"&gt;is_only_numbers()&lt;/a&gt;&lt;br /&gt;(función de PHPAggregate)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt;   &lt;td style="font-weight: bold;"&gt;email&lt;/td&gt;   &lt;td&gt;valida un e-mail&lt;/td&gt;   &lt;td&gt;&lt;a href="http://eugeniabahit.blogspot.com/2011/07/manual-de-phpaggregate-libreria-de.html"&gt;is_email()&lt;/a&gt;&lt;br /&gt;(función de PHPAggregate)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt;   &lt;td style="font-weight: bold;"&gt;password&lt;/td&gt;   &lt;td&gt;valida una contraseña estándar&lt;/td&gt;   &lt;td&gt;&lt;a href="http://eugeniabahit.blogspot.com/2011/07/manual-de-phpaggregate-libreria-de.html"&gt;is_password()&lt;/a&gt;&lt;br /&gt;(función de PHPAggregate)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt;   &lt;td style="font-weight: bold;"&gt;secure_password&lt;/td&gt;   &lt;td&gt;valida una contraseña segura&lt;/td&gt;   &lt;td&gt;&lt;a href="http://eugeniabahit.blogspot.com/2011/07/manual-de-phpaggregate-libreria-de.html"&gt;is_secure_password()&lt;/a&gt;&lt;br /&gt;(función de PHPAggregate)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt;   &lt;td style="font-weight: bold;"&gt;ip&lt;/td&gt;   &lt;td&gt;valida una dirección IP&lt;/td&gt;   &lt;td&gt;&lt;a href="http://eugeniabahit.blogspot.com/2011/07/manual-de-phpaggregate-libreria-de.html"&gt;is_ip()&lt;/a&gt;&lt;br /&gt;(función de PHPAggregate)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt;   &lt;td style="font-weight: bold;"&gt;nickname&lt;br /&gt;username&lt;/td&gt;   &lt;td&gt;valida un nickname (apodo, nombre de usuario)&lt;/td&gt;   &lt;td&gt;&lt;a href="http://eugeniabahit.blogspot.com/2011/07/manual-de-phpaggregate-libreria-de.html"&gt;is_nickname()&lt;/a&gt;&lt;br /&gt;(función de PHPAggregate)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt;   &lt;td style="font-weight: bold;"&gt;personal_name&lt;/td&gt;   &lt;td&gt;valida nombre y apellido completos de una persona&lt;/td&gt;   &lt;td&gt;&lt;a href="http://eugeniabahit.blogspot.com/2011/07/manual-de-phpaggregate-libreria-de.html"&gt;is_personal_name()&lt;/a&gt;&lt;br /&gt;(función de PHPAggregate)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt;   &lt;td style="font-weight: bold;"&gt;spanish_date&lt;/td&gt;   &lt;td&gt;valida una fecha con formato español (día, mes, año)&lt;/td&gt;   &lt;td&gt;&lt;a href="http://eugeniabahit.blogspot.com/2011/07/manual-de-phpaggregate-libreria-de.html"&gt;is_spanish_date()&lt;/a&gt;&lt;br /&gt;(función de PHPAggregate)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt;   &lt;td style="font-weight: bold;"&gt;usa_date&lt;br /&gt;date&lt;/td&gt;   &lt;td&gt;valida una fecha con formato americano (mes, día, año)&lt;/td&gt;   &lt;td&gt;&lt;a href="http://eugeniabahit.blogspot.com/2011/07/manual-de-phpaggregate-libreria-de.html"&gt;is_usa_date()&lt;/a&gt;&lt;br /&gt;(función de PHPAggregate)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt;   &lt;td style="font-weight: bold;"&gt;iso_date&lt;br /&gt;canonical_date&lt;/td&gt;   &lt;td&gt;valida una fecha con formato canónico (ISO: año, mes, día)&lt;/td&gt;   &lt;td&gt;&lt;a href="http://eugeniabahit.blogspot.com/2011/07/manual-de-phpaggregate-libreria-de.html"&gt;is_iso_date()&lt;/a&gt;&lt;br /&gt;(función de PHPAggregate)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt;   &lt;td style="font-weight: bold;"&gt;string&lt;/td&gt;   &lt;td&gt;valida que una cadena contenga entre n1 y n2 caracteres&lt;/td&gt;   &lt;td&gt;&lt;a href="http://eugeniabahit.blogspot.com/2011/07/manual-de-phpaggregate-libreria-de.html"&gt;is_strlen_between()&lt;/a&gt;&lt;br /&gt;(función de PHPAggregate)&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt;   &lt;td style="font-weight: bold;"&gt;boolean&lt;/td&gt;   &lt;td&gt;valida que el dato sea de tipo booleano&lt;/td&gt;   &lt;td&gt;&lt;a href="http://es.php.net/manual/es/function.is-bool.php" target="_blank"&gt;is_bool()&lt;/a&gt;&lt;br /&gt;(función de PHP 4, PHP 5)&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Valores devueltos:&lt;/b&gt;&lt;br /&gt;El Objeto PHPFormValidator retorna dos propiedades públicas:&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;invalid_fields&lt;/b&gt; Array con el nombre de los campos evaluados como inválidos, con su correspondiente error.&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;form_data&lt;/b&gt; Array con el nombre de los campos evaluados y su correspondiente valor.&lt;/blockquote&gt;&lt;div class="importantnote"&gt;&lt;b&gt;AVISO&lt;/b&gt;&lt;br /&gt;&lt;b&gt;invalid_fields&lt;/b&gt; retornará &lt;b&gt;&lt;span class="Apple-style-span" style="color: #e69138;"&gt;NULL&lt;/span&gt;&lt;/b&gt; cuando no existan campos evaluados como inválidos.&lt;/div&gt;&lt;br /&gt;&lt;div class="importantnote"&gt;&lt;b&gt;AVISO&lt;/b&gt;&lt;br /&gt;PHPFormValidator retornará un error &lt;b&gt;Warning: The execution was stopped!&lt;/b&gt; frenando la ejecución del script mediante una llamada a &lt;b&gt;exit()&lt;/b&gt;, cuando un error de programación en la instancia al objeto sea encontrado.&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Error Warning: The execution was stopped!&lt;/b&gt;&lt;br /&gt;PHPFormValidator puede responder con el siguiente mensaje tras verse forzado a llamar al método exit() de PHP:&lt;br /&gt;&lt;br /&gt;&lt;div class="importantnote"&gt;&lt;b&gt;Warning: The execution was stopped!&lt;/b&gt;&lt;br /&gt;&lt;b&gt;validate_form() method said: I can not continue because&amp;nbsp;I found an error programming in the received arguments: [error_description]&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Los motivos retornados se detallan a continuación:&lt;br /&gt;&lt;br /&gt;&lt;div style="border-right: none; border: 4px solid #f4f4f4; height: 200px; overflow: auto; padding: 5px;"&gt;&lt;b&gt;No $_GET data recived&lt;/b&gt;&lt;br /&gt;Se produce cuando habiendo indicado a PHPFormValidator que el método de envío de datos del formulario es GET, el método constructor no recibe ninguna data vía $_GET&lt;br /&gt;&lt;br /&gt;&lt;b&gt;No $_POST data recived&lt;/b&gt;&lt;br /&gt;Se produce cuando habiendo indicado a PHPFormValidator que el método de envío de datos del formulario es POST, el método constructor no recibe ninguna data vía $_POST&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Arguments are not sufficient in the fields options&lt;/b&gt;&lt;br /&gt;Se produce cuando la función de validación de datos llamada para comprobar un determinado campo, no encuentra los argumentes suficientes para ejecutarse.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Arguments are wrong&lt;/b&gt;&lt;br /&gt;Para cada campo, PHPFormValidator espera una string con el nombre del tipo de datos y una variable booleana (TRUE o FALSE) para saber si el campo es o no obligatorio (es decir, si el usuario tiene la obligación de rellenar dicho campo). Cuando PHPFormValidator se encuentra con que el primer argumento del campo, no es una string o el segundo, no es boolean, retornará el error "Arguments are wrong"&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[data_type] is an unknown data type&lt;/b&gt;&lt;br /&gt;Se produce cuando el tipo de datos indicado para un determinado campo, no es un tipo de datos conocido (ver más arriba, la tabla: "Tipos de datos admitidos").&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[field_name] was not found in the received array data&lt;/b&gt;&lt;br /&gt;Se produce cuando se ha indicado el nombre de un campo inexistente. En este caso, se recomienda verificar la ortografía del nombre del campo indicado en [field_name], pues frecuente que este error se produzca por un error de tipeado.&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;$lista_de_campos = array(&lt;br /&gt;    'nombre'=&amp;gt;array('personal_name', true), // llamará a is_personal_name.&lt;br /&gt;    'email'=&amp;gt;array('email', true), // true indica que es campo obligatorio&lt;br /&gt;    'telefono'=&amp;gt;array('numeric', true, false),&lt;br /&gt;    'empresa'=&amp;gt;array('string', false, 3, 25), // 3 y 25 responden a argumentos adicionales de is_strlen_between de PHPAggregate&lt;br /&gt;    'cargo'=&amp;gt;array('string', false, 3, 25),&lt;br /&gt;    'fecha_nac'=&amp;gt;array('spanish_date', true, '-'),&lt;br /&gt;    'newsletter'=&amp;gt;array('boolean', false),&lt;br /&gt;    'asunto'=&amp;gt;array('string', true, 3, 50),&lt;br /&gt;    'mensaje'=&amp;gt;array('string', true, 3, 1500)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;include_once('phpformvalidator');&lt;br /&gt;&lt;br /&gt;$fv = new PHPFormValidator('POST', $lista_de_campos);&lt;br /&gt;&lt;br /&gt;// Obtener campos con errores&lt;br /&gt;$errores = $fv-&amp;gt;invalid_fields;&lt;br /&gt;&lt;br /&gt;// Obtener los campos con sus datos&lt;br /&gt;$data = $fv-&amp;gt;form_data;&lt;br /&gt;&lt;br /&gt;// Continuar el script de acuerdo a lo retornado por PHPFormValidator&lt;br /&gt;if($fv-&amp;gt;invalid_fields) { // si invalid_field NO es NULL&lt;br /&gt;    print 'hubo errores en los siguientes campos:'.chr(10);&lt;br /&gt;    foreach($fv-&amp;gt;invalid_fields as $campo=&amp;gt;$error) {&lt;br /&gt;        print '   * '.$campo.': '.$error.chr(10);&lt;br /&gt;    }&lt;br /&gt;} else {&lt;br /&gt;    print 'Datos OK!!';&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Imprime en pantalla los datos recibidos&lt;br /&gt;print chr(10).'Data recibida:'.chr(10);&lt;br /&gt;foreach($fv-&amp;gt;form_data as $nombre_campo=&amp;gt;$valor) {&lt;br /&gt;    print $nombre_campo.': '.$valor.chr(10);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-4089870559174353955?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/4089870559174353955/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/phpformvalidator-clase-para-validacion.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/4089870559174353955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/4089870559174353955'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/phpformvalidator-clase-para-validacion.html' title='PHPFormValidator: Clase para validación automática de cualquier tipo de formulario'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-Ui61KaXQBTw/Ti9T3eJbG8I/AAAAAAAAA40/cgPZyk1gaVQ/s72-c/logo_validator.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-6503121783907666525</id><published>2011-07-24T06:30:00.011-03:00</published><updated>2011-09-07T23:12:46.843-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Librerias GPL'/><category scheme='http://www.blogger.com/atom/ns#' term='PHPTemplate'/><title type='text'>PHPTemplate - Clase PHP para manejar la lógica de las vistas en MVC</title><content type='html'>&lt;div class="separator" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-bRRYwTod_Bk/Tiu-Il_0qSI/AAAAAAAAA4k/MubGjMGoi-o/s1600/phptemplate_logo.png" /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;u&gt;Descripción&lt;/u&gt;: PHPTemplate&lt;/b&gt; es una clase para PHP 4 y PHP 5 que permite renderizar datos dinámicamente encargándose de manejar la lógica de las vistas cuando se trabaja con el patrón arquitectónico MVC. &lt;b&gt;PHPTemplate&lt;/b&gt;, puede renderizar tanto datos individuales como patrones iterativos, lo cual permite una abstracción absoluta de la vista, facilitando la individualización de archivos y lenguajes de programación. &lt;b&gt;PHPTemplate ha sido incluida como parte del proyecto &lt;a href="https://sourceforge.net/projects/europio/files/" target="_blank"&gt;Europio PHPLibraries&lt;/a&gt;&lt;/b&gt;.&lt;/div&gt;&lt;blockquote&gt;&lt;b&gt;&lt;u&gt;Versión actual&lt;/u&gt;&lt;/b&gt;: Europio v1.0 Final (estable)&lt;br /&gt;&lt;b&gt;&lt;u&gt;Autor&lt;/u&gt;&lt;/b&gt;: &lt;a href="http://eugeniabahit.blogspot.com/"&gt;Eugenia Bahit&lt;/a&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Licencia&lt;/u&gt;&lt;/b&gt;: &lt;a href="http://www.gnu.org/licenses/lgpl.html" target="_blank"&gt;LGPL&lt;/a&gt; v3 (software libre)&lt;/blockquote&gt;&lt;div class="micss_hidden_post"&gt;&lt;b&gt;&lt;u&gt;Descarga&lt;/u&gt;:&amp;nbsp;&lt;/b&gt;&lt;a href="https://launchpad.net/europio/+download"&gt;https://launchpad.net/europio/+download&lt;/a&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: large;"&gt;&lt;b&gt;Métodos de la clase PHPExtendableTemplate&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Métodos públicos&lt;/th&gt; &lt;th&gt;Métodos protegidos&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt; &lt;tbody&gt;&lt;tr&gt; &lt;td&gt;&lt;span class="pseudolink" id="ln_get_content"&gt;get_content&lt;/span&gt;&lt;/td&gt; &lt;td&gt;&lt;span class="pseudolink" id="ln_get_file"&gt;get_file&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt;&lt;span class="pseudolink" id="ln_get_loop_content"&gt;get_loop_content&lt;/span&gt;&lt;/td&gt;  &lt;td&gt;&lt;span class="pseudolink" id="ln_render_data"&gt;render_data&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt;-&lt;/td&gt;  &lt;td&gt;&lt;span class="pseudolink" id="ln_render_loop_data"&gt;render_loop_data&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;br /&gt;&lt;div id="get_content"&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-size: x-large;"&gt;&lt;b&gt;get_content&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Renderizar datos individuales. Método público accesible desde cualquier instancia de PHPExtendableTemplate.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sintaxis:&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;get_content($array_diccionario, $file, $folder);&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Parámetros:&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;$array_diccionario&lt;/b&gt; Array conteniendo el diccionario de datos a renderizar, donde las claves son los datos a ser reemplazados y los valores, el dato dinámico por el cual se reemplazarán las claves. Un ejemplo de ello, es el siguiente:&lt;br /&gt;&lt;pre class="brush: php"&gt;$array_diccionario = array(&lt;br /&gt;    '{clave_1}'=&amp;gt;'reemplazar por este dato',&lt;br /&gt;    '{clave_2}'=&amp;gt;'reemplazar por este otro dato',&lt;br /&gt;  );&lt;/pre&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;$file&lt;/b&gt; (opcional) Nombre del archivo que contiene el template html. Este valor es opcional ya que de no indicarse, tomará por defecto el valor asignado en la constante de clase DEFAULT_TEMPLATE&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;$folder&lt;/b&gt; (opcional) Localización del archivo que contiene el template html (es decir, la ruta de las carpetas). Este valor es opcional ya que de no indicarse, tomará por defecto el valor asignado en la constante de clase DEFAULT_TEMPLATE_FOLDER&lt;/blockquote&gt;&lt;b&gt;Valores devueltos:&lt;/b&gt;&lt;br /&gt;Devuelve el código HTML del archivo pasado con los datos renderizados.&lt;br /&gt;&lt;pre class="brush: php"&gt;// crear diccionario de datos&lt;br /&gt;$dict = array(&lt;br /&gt;     '{title}'=&amp;gt;'PHPExtendableTemplate para PHP 5',&lt;br /&gt;     '{subtitle}'=&amp;gt;'Ejemplo de uso'&lt;br /&gt;    );&lt;br /&gt;&lt;br /&gt;// nombre del archivo html del template&lt;br /&gt;$file = 'my_template.html';&lt;br /&gt;&lt;br /&gt;// localización del archivo&lt;br /&gt;$folder = '/any_folder/templates_folder/';&lt;br /&gt;&lt;br /&gt;// importar la clase PHPExtendableTemplate&lt;br /&gt;require_once('phpextendabletemplate.php');&lt;br /&gt;&lt;br /&gt;// instanciar a PHPExtendableTemplate&lt;br /&gt;$PHPExtendableTemplate = new PHPExtendableTemplate();&lt;br /&gt;&lt;br /&gt;// llamada al método get_content&lt;br /&gt;$content = $PHPExtendableTemplate-&amp;gt;get_content($dict, $file, $folder);&lt;br /&gt;/*&lt;br /&gt;    get_content() reemplazará todas &lt;br /&gt;    las insidencias de {title} por &lt;br /&gt;    PHPExtendableTemplate para PHP 5&lt;br /&gt;    y las de {subtitle} por&lt;br /&gt;    Ejemplo de uso&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;// imprimir la vista renderizada en pantalla&lt;br /&gt;print $content;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;div id="get_loop_content"&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-size: x-large;"&gt;&lt;b&gt;get_loop_content&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Renderizar diccionario de datos individuales y datos iterativos. Método público accesible desde cualquier instancia de PHPExtendableTemplate.&lt;br /&gt;Este método es una extensión/ampliación del método &lt;b&gt;get_content&lt;/b&gt;. Si get_loop_content es llamado, get_content no necesita ser llamado.&lt;br /&gt;&lt;br /&gt;&lt;div class="importantnote"&gt;&lt;b&gt;IMPORTANTE:&lt;/b&gt;&lt;br /&gt;get_loop_content debe identificar los "bloques" de código HTML que deben ser renderizados cíclicamente.&lt;br /&gt;A fin de lograr una abstracción e individualización absoluta de lenguajes (evitando colocar código PHP con HTML en el mismo archivo), get_loop_content utiliza "identificadores" para localizar los patrones.&lt;br /&gt;Estos &lt;b&gt;identificadores de patrones de código HTML&lt;/b&gt; deben escribirse a modo de &lt;b&gt;comentarios HTML&lt;/b&gt; y su sintáxis es la siguiente:&lt;br /&gt;&lt;pre class="brush: html"&gt;&amp;lt;!--iniloop:nombre_del_identificador--&amp;gt;&lt;br /&gt;write your HTML code here! &lt;br /&gt;And replace &lt;b&gt;{this_data}&lt;/b&gt; iteratively&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!--endloop:nombre_del_identificador--&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;nombre_del_identificador&lt;/b&gt; debe ser cualquier string con la que desees identificar el fragmento de código HTML que será renderizado iterativamente.&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Sintaxis:&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;get_loop_content($array_iterative_data, $array_diccionario, $file, $folder);&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Parámetros:&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;$array_iterative_data&lt;/b&gt; Array conteniendo el diccionario de datos iterativos a renderizar, donde:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;las claves son los nombres de los identificadores de los patrones HTML a renderizar (ejemplo: identificador_1)&lt;/li&gt;&lt;li&gt;el valor de cada clave-identificador será otro array&lt;/li&gt;&lt;li&gt;dentro de éste, habrá tantos array como iteraciones a realizar. Cada uno de estos array, estará formado por:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;clave: los datos a ser reemplazados&lt;/li&gt;&lt;li&gt;valor: el dato dinámico por el cual se reemplazarán las claves.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;Un ejemplo de ello, es el siguiente: &lt;pre class="brush: php"&gt;$array_iterative_data = array(&lt;br /&gt;    'identificador_1'=&amp;gt;array(&lt;br /&gt;        array('{site_name}'=&amp;gt;'Google',&lt;br /&gt;              '{site_url}'=&amp;gt;'www.google.com'&lt;br /&gt;             ),&lt;br /&gt;        array('{site_name}'=&amp;gt;'Yahoo!',&lt;br /&gt;              '{site_url}'=&amp;gt;'www.yahoo.com'&lt;br /&gt;             )&lt;br /&gt;        ),&lt;br /&gt;    'identificador_2'=&amp;gt;array(&lt;br /&gt;        array('{name}'=&amp;gt;'Creedence Clearwater Revival',&lt;br /&gt;              '{song}'=&amp;gt;'Fortunate Son',&lt;br /&gt;              '{id}'=&amp;gt;127587&lt;br /&gt;             ),&lt;br /&gt;        array('{name}'=&amp;gt;'Bob Seger',&lt;br /&gt;              '{song}'=&amp;gt;'Fire Lake',&lt;br /&gt;              '{id}'=&amp;gt;987492&lt;br /&gt;             )&lt;br /&gt;        )&lt;br /&gt;    );&lt;/pre&gt;&lt;div class="importantnote"&gt;&lt;b&gt;Nótese&lt;/b&gt; que el formato del array de cada identificador, es el formato de salida de consultas SQL que son almacenadas en una matriz. Esto significa, que dichos datos, pueden ser traídos desde una consulta a base de datos. Suponiendo que la consulta SQL arroje los datos en una variable llamada $results, usted podría formar el array, de la siguiente manera:        &lt;br /&gt;&lt;pre class="brush: php"&gt;$array_iterative_data = array(&lt;br /&gt;        'identificador_1'=&amp;gt;$results,&lt;br /&gt;    );&lt;br /&gt;&lt;/pre&gt;Si tuviese varias consultas SQL, el procedimiento continuaría siendo igual de sencillo:        &lt;br /&gt;&lt;pre class="brush: php"&gt;$array_iterative_data = array(&lt;br /&gt;        'identificador_1'=&amp;gt;$results_sql_1,&lt;br /&gt;        'identificador_2'=&amp;gt;$results_sql_2,&lt;br /&gt;        'identificador_3'=&amp;gt;$results_sql_3,&lt;br /&gt;    );&lt;br /&gt;&lt;/pre&gt;Tenga en cuenta, que la finalidad del método &lt;b&gt;get_loop_content&lt;/b&gt;, es permitirle &lt;b&gt;renderizar datos iterativos&lt;/b&gt; habiendo sido diseñado primordialmente para &lt;b&gt;renderizar datos extraídos de consultas SQL&lt;/b&gt;. &lt;/div&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;$array_diccionario&lt;/b&gt; Array conteniendo el diccionario de datos a renderizar, donde las claves son los datos a ser reemplazados y los valores, el dato dinámico por el cual se reemplazarán las claves. Un ejemplo de ello, es el siguiente: &lt;br /&gt;&lt;pre class="brush: php"&gt;$array_diccionario = array(&lt;br /&gt;    '{clave_1}'=&amp;gt;'reemplazar por este dato',&lt;br /&gt;    '{clave_2}'=&amp;gt;'reemplazar por este otro dato',&lt;br /&gt;  );&lt;/pre&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;$file&lt;/b&gt; (opcional) Nombre del archivo que contiene el template html. Este valor es opcional ya que de no indicarse, tomará por defecto el valor asignado en la constante de clase DEFAULT_TEMPLATE&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;$folder&lt;/b&gt; (opcional) Localización del archivo que contiene el template html (es decir, la ruta de las carpetas). Este valor es opcional ya que de no indicarse, tomará por defecto el valor asignado en la constante de clase DEFAULT_TEMPLATE_FOLDER&lt;/blockquote&gt;&lt;b&gt;Valores devueltos:&lt;/b&gt; Devuelve el código HTML del archivo pasado con los datos renderizados.  &lt;b&gt;CÓDIGO HTML DE EJEMPLO&lt;/b&gt; &lt;br /&gt;&lt;pre class="brush: html"&gt;&amp;lt;!doctype html&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;  &amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;{title}&amp;lt;/title&amp;gt;&lt;br /&gt;  &amp;lt;/head&amp;gt;&lt;br /&gt;  &amp;lt;body&amp;gt;&lt;br /&gt;    &amp;lt;h1&amp;gt;Sites&amp;lt;/h1&amp;gt;&lt;br /&gt;    &amp;lt;ul&amp;gt;&lt;br /&gt;      &amp;lt;!--iniloop:identificador_1--&amp;gt;&lt;br /&gt;      &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;{site_name}&amp;lt;/b&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;        &amp;lt;a href="http://{site_url}" title="go to {site_name}"&amp;gt;{site_url}&amp;lt;/a&amp;gt;&lt;br /&gt;      &amp;lt;/li&amp;gt;&lt;br /&gt;      &amp;lt;!--endloop:identificador_1--&amp;gt;&lt;br /&gt;    &amp;lt;/ul&amp;gt;&lt;br /&gt;    &amp;lt;h1&amp;gt;Songs&amp;lt;/h1&amp;gt;&lt;br /&gt;    &amp;lt;ul&amp;gt;&lt;br /&gt;      &amp;lt;!--iniloop:identificador_2--&amp;gt;&lt;br /&gt;      &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;{song} (ID: {id})&amp;lt;/b&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;        {name}&lt;br /&gt;      &amp;lt;/li&amp;gt;&lt;br /&gt;      &amp;lt;!--endloop:identificador_2--&amp;gt;&lt;br /&gt;    &amp;lt;/ul&amp;gt;&lt;br /&gt;  &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;CÓDIGO PHP DE EJEMPLO&lt;/b&gt; &lt;br /&gt;&lt;pre class="brush: php"&gt;// crear diccionario de datos simples&lt;br /&gt;$dict = array(&lt;br /&gt;     '{title}'=&amp;gt;'Example'&lt;br /&gt;    );&lt;br /&gt;&lt;br /&gt;// arma diccionario de datos iterativos&lt;br /&gt;&lt;br /&gt;// diccionario identificador_1&lt;br /&gt;$web_sites = array(&lt;br /&gt;    array('{site_name}'=&amp;gt;'Google',&lt;br /&gt;          '{site_url}'=&amp;gt;'www.google.com'&lt;br /&gt;         ),&lt;br /&gt;    array('{site_name}'=&amp;gt;'Yahoo!',&lt;br /&gt;          '{site_url}'=&amp;gt;'www.yahoo.com'&lt;br /&gt;         ),&lt;br /&gt;    array('{site_name}'=&amp;gt;'Facebook',&lt;br /&gt;          '{site_url}'=&amp;gt;'www.facebook.com'&lt;br /&gt;         )&lt;br /&gt;    );&lt;br /&gt;&lt;br /&gt;// diccionario identificador_2&lt;br /&gt;$rock_bands = array(&lt;br /&gt;    array('{name}'=&amp;gt;'Creedence Clearwater Revival',&lt;br /&gt;          '{song}'=&amp;gt;'Fortunate Son',&lt;br /&gt;          '{id}'=&amp;gt;127587&lt;br /&gt;         ),&lt;br /&gt;    array('{name}'=&amp;gt;'Bob Seger',&lt;br /&gt;          '{song}'=&amp;gt;'Fire Lake',&lt;br /&gt;          '{id}'=&amp;gt;987492&lt;br /&gt;         ),&lt;br /&gt;    array('{name}'=&amp;gt;'Bachman-Turner Overdrive',&lt;br /&gt;          '{song}'=&amp;gt;'Life Still Goes On',&lt;br /&gt;          '{id}'=&amp;gt;323274&lt;br /&gt;         ),&lt;br /&gt;    array('{name}'=&amp;gt;'Johnny Rivers',&lt;br /&gt;          '{song}'=&amp;gt;'Sunny',&lt;br /&gt;          '{id}'=&amp;gt;300598&lt;br /&gt;         )&lt;br /&gt;    );&lt;br /&gt;&lt;br /&gt;// array identificadores&lt;br /&gt;$array_iterative_data = array(&lt;br /&gt;    'identificador_1'=&amp;gt;$web_sites,&lt;br /&gt;    'identificador_2'=&amp;gt;$rock_bands&lt;br /&gt;    );&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// nombre del archivo html del template&lt;br /&gt;$file = 'base_template.html';&lt;br /&gt;&lt;br /&gt;// localización del archivo&lt;br /&gt;$folder = 'site_media/html/';&lt;br /&gt;&lt;br /&gt;// importar la clase PHPExtendableTemplate&lt;br /&gt;require_once('core/phpextendabletemplate.php');&lt;br /&gt;&lt;br /&gt;// instanciar a PHPExtendableTemplate&lt;br /&gt;$PHPExtendableTemplate = new PHPExtendableTemplate();&lt;br /&gt;&lt;br /&gt;// llamada al método get_content&lt;br /&gt;$content = $PHPExtendableTemplate-&amp;gt;get_loop_content(&lt;br /&gt;                $array_iterative_data,&lt;br /&gt;                $dict, $file, $folder);&lt;br /&gt;&lt;br /&gt;// imprimir la vista renderizada en pantalla&lt;br /&gt;print $content;&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;get_loop_content&lt;/b&gt; imprimirá la siguiente pantalla: &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-RrjaScVxovc/TivoY2KTrgI/AAAAAAAAA4w/cWDFFZXYMs0/s1600/example_loop.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/-RrjaScVxovc/TivoY2KTrgI/AAAAAAAAA4w/cWDFFZXYMs0/s400/example_loop.png" width="267" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id="get_file"&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-size: x-large;"&gt;&lt;b&gt;get_file&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Método protegido. Devuelve el código HTML del archivo especificado sin renderizar. Solo puede ser llamado desde clases que hereden de PHPExtendableTemplate. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sintaxis:&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;get_file($file, $folder);&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Parámetros:&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;$file&lt;/b&gt; (opcional) Nombre del archivo que contiene el template html. Este valor es opcional ya que de no indicarse, tomará por defecto el valor asignado en la constante de clase DEFAULT_TEMPLATE&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;$folder&lt;/b&gt; (opcional) Localización del archivo que contiene el template html (es decir, la ruta de las carpetas). Este valor es opcional ya que de no indicarse, tomará por defecto el valor asignado en la constante de clase DEFAULT_TEMPLATE_FOLDER&lt;/blockquote&gt;&lt;b&gt;Valores devueltos:&lt;/b&gt;&lt;br /&gt;Devuelve una string con el código HTML del archivo especificado sin renderizar.&lt;/div&gt;&lt;div id="render_data"&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-size: x-large;"&gt;&lt;b&gt;render_data&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Método protegido. Devuelve código HTML renderizado, del contenido que se le haya pasado como parámetro. Solo puede ser llamado desde clases que hereden de PHPExtendableTemplate. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sintaxis:&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;render_data($array_diccionario, $string_contenido);&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Parámetros:&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;$array_diccionario&lt;/b&gt; Array conteniendo el diccionario de datos a renderizar, donde las claves son los datos a ser reemplazados y los valores, el dato dinámico por el cual se reemplazarán las claves. Un ejemplo de ello, es el siguiente: &lt;br /&gt;&lt;pre class="brush: php"&gt;$array_diccionario = array(&lt;br /&gt;    '{clave_1}'=&amp;gt;'reemplazar por este dato',&lt;br /&gt;    '{clave_2}'=&amp;gt;'reemplazar por este otro dato',&lt;br /&gt;  );&lt;/pre&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;$contenido&lt;/b&gt; String conteniendo el código HTML a ser renderizado (generalmente, el código devuelto por &lt;b&gt;get_file()&lt;/b&gt;&lt;/blockquote&gt;&lt;b&gt;Valores devueltos:&lt;/b&gt;&lt;br /&gt;Devuelve una string con el código HTML renderizado, del contenido que se le haya pasado como parámetro. &lt;/div&gt;&lt;div id="render_loop_data"&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-size: x-large;"&gt;&lt;b&gt;render_loop_data&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Método protegido. Devuelve código HTML renderizado, del contenido iterativo que se le haya pasado como parámetro. Solo puede ser llamado desde clases que hereden de PHPExtendableTemplate. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sintaxis:&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;render_loop_data($string_nombre_del_identificador, $string_contenido, $array_diccionario);&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Parámetros:&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;$string_nombre_del_identificador&lt;/b&gt;String. Nombre del identificador del bloque HTML a renderizar iterativamente. El nombre del identificador es el que se asigna con la sintaxis: &amp;lt;!--iniloop:&lt;b&gt;identificador&lt;/b&gt;--&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;$string_contenido&lt;/b&gt; String conteniendo el código HTML que contiene el bloque a ser renderizado (generalmente, el código devuelto por &lt;b&gt;get_file()&lt;/b&gt;. Este contenido debe contener al menos un bloque HTML inicializado por los tags-comentados &amp;lt;!--iniloop:identificador--&amp;gt; y &amp;lt;!--endloop:identificador--&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;$array_diccionario&lt;/b&gt; Array conteniendo sub-arrays con los datos iterativos a ser reemplazos:&lt;br /&gt;&lt;pre class="brush: php"&gt;$array_diccionario = array(&lt;br /&gt;    array('{clave_1}'=&amp;gt;'Valor 1',&lt;br /&gt;          '{clave_2}'=&amp;gt;'valor 2'&lt;br /&gt;         ),&lt;br /&gt;    array('{clave_1}'=&amp;gt;'Valor 3',&lt;br /&gt;          '{clave_2}'=&amp;gt;'valor 4'&lt;br /&gt;         ),&lt;br /&gt;    );&lt;/pre&gt;&lt;/blockquote&gt;&lt;b&gt;Valores devueltos:&lt;/b&gt;&lt;br /&gt;Devuelve una string con el código HTML renderizado, del contenido iterativo que se le haya pasado como parámetro&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/9023974285878579728-6503121783907666525?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/6503121783907666525/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/phptemplate-clase-php-para-manejar-la.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/6503121783907666525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/6503121783907666525'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/phptemplate-clase-php-para-manejar-la.html' title='PHPTemplate - Clase PHP para manejar la lógica de las vistas en MVC'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-bRRYwTod_Bk/Tiu-Il_0qSI/AAAAAAAAA4k/MubGjMGoi-o/s72-c/phptemplate_logo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-3671515532689006267</id><published>2011-07-24T01:43:00.005-03:00</published><updated>2011-09-07T21:58:05.530-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Librerias GPL'/><category scheme='http://www.blogger.com/atom/ns#' term='Europio'/><category scheme='http://www.blogger.com/atom/ns#' term='DBAbstractModel'/><title type='text'>DBAbstractModel - Clase PHP 5 para insertar, eliminar, actualizar y seleccionar datos de una DB MySQL</title><content type='html'>&lt;div class="separator" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-F1lNCmOdAFE/TiumEUhPCmI/AAAAAAAAA4g/216ePR7swsA/s1600/phpdb_logo.png" /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;u&gt;Descripción&lt;/u&gt;:&lt;/b&gt; &lt;b&gt;DBAbstractModel&lt;/b&gt; es una &lt;b&gt;clase abstracta&lt;/b&gt; sencilla, para PHP que opera en forma conjunta con la clase mysqli() de PHP 5, permitiendo insertar, actualizar, eliminar y seleccionar datos de bases de datos MySQL.&lt;/div&gt;&lt;blockquote&gt;&lt;b&gt;&lt;u&gt;Versión actual:&lt;/u&gt;&lt;/b&gt; Europio v1.0 Final&lt;br /&gt;&lt;b&gt;&lt;u&gt;Autor&lt;/u&gt;&lt;/b&gt;: &lt;a href="http://eugeniabahit.blogspot.com/"&gt;Eugenia Bahit&lt;/a&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Licencia&lt;/u&gt;&lt;/b&gt;: &lt;a href="http://www.gnu.org/licenses/lgpl.html"&gt;LGPL&lt;/a&gt; v3 (software libre)&lt;/blockquote&gt;&lt;div class="micss_hidden_post"&gt;&lt;b&gt;&lt;u&gt;Descargar archivos&lt;/u&gt;:&amp;nbsp;&lt;/b&gt;&lt;a href="https://launchpad.net/europio/+download"&gt;https://launchpad.net/europio/+download&lt;/a&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Manual de referencias&lt;/u&gt;:&amp;nbsp;&lt;/b&gt;&lt;a href="https://launchpad.net/europio/+download"&gt;https://launchpad.net/europio/+download&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: large;"&gt;&lt;b&gt;Entendiendo la clase&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;DBAbstractModel&lt;/b&gt; declara &lt;b&gt;cuatro métodos abstractos:&lt;/b&gt;&amp;nbsp;&lt;b&gt;insert()&lt;/b&gt;, &lt;b&gt;delete()&lt;/b&gt;, &lt;b&gt;update()&lt;/b&gt; y &lt;b&gt;select()&lt;/b&gt;,&amp;nbsp;que deben ser re-definidos en la/s clase/s que la hereden (o comentados en la propia clase a fin de evitar errores).&lt;br /&gt;&lt;br /&gt;Esta clase abstracta pretende servir como modelo a clases cuyos objetos, requieran de métodos donde sea necesario realizar consultas a bases de datos. No es una librería para conectarse a una base de datos desde cualquier ámbito. Es una clase abstracta que no puede ser instanciada, sino que necesita ser heredada por otra clase.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;DBAbstractModel&lt;/b&gt; declara y define el algoritmo de &lt;b&gt;cuatro métodos no abstractos&lt;/b&gt;, de los cuales, uno de ellos permite ejecutar cualquier sentencia SQL INSERT, UPDATE o DELETE y otro, sentencias SELECT.&lt;br /&gt;&lt;br /&gt;Las clases que hereden de &lt;b&gt;DBAbstractModel&lt;/b&gt;, además de re-definir los cuatros métodos abstractos, podrá llamar a cualquiera de los dos métodos no abstractos (mencionados en el párrafo anterior), redifiniendo el valor de las propiedades &lt;b&gt;$this-&amp;gt;query&lt;/b&gt; (sentencia SQL a ser ejecutada) y &lt;b&gt;$this-&amp;gt;db_name&lt;/b&gt; (base de datos a utilizar).&lt;br /&gt;&lt;br /&gt;Si necesita saber más sobre el uso de clases abstractas en PHP 5, le recomiendo &lt;a href="http://eugeniabahit.blogspot.com/p/poo-y-mvc-en-php.html"&gt;descargar gratuitamente el libro POO y MVC en PHP&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: large;"&gt;Modificar HOST, USUARIO y/o CONTRASEÑA&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;DBAbstractModel&lt;/b&gt;&amp;nbsp;necesita que le sean modificados los valores de tres de sus &lt;b&gt;propiedades estáticas&lt;/b&gt;: &lt;b&gt;$db_host&lt;/b&gt;, &lt;b&gt;$db_user&lt;/b&gt; y &lt;b&gt;$db_pass&lt;/b&gt;, con el host de la base de datos, el usuario y contraseña respectivamente.&lt;br /&gt;&lt;br /&gt;Si necesita &lt;b&gt;modificar host, usuario y contraseña&lt;/b&gt;&amp;nbsp;de la base de datos en las clases que hereden de&amp;nbsp;&lt;b&gt;DBAbstractModel&lt;/b&gt;, deberá cambiar (en&amp;nbsp;&lt;b&gt;DBAbstractModel&lt;/b&gt;) la visibilidad de las propiedades que necesite modificar, de privadas a protegidas y además, quitarles el atributo de estáticas, de modo tal que el bloque:&lt;br /&gt;&lt;pre class="brush: php"&gt;private static $db_host = 'localhost';&lt;br /&gt;private static $db_user = 'usuario';&lt;br /&gt;private static $db_pass = 'clave';&lt;/pre&gt;se vea de la siguiente forma:&lt;br /&gt;&lt;pre class="brush: php"&gt;protected $db_host = 'localhost';&lt;br /&gt;protected $db_user = 'usuario';&lt;br /&gt;protected $db_pass = 'clave';&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: large;"&gt;Creando una clase heredada de DBAbstractModel&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Recuerde que por defecto, usted debe re-definir los cuatro métodos que se muestran a continuación. Si alguno de los métodos no fuese a utilizarlos en NINGUNA clase de las que heredan de DBAbstractModel, podrá comentarlos en dbabstractmodel.php o re-definirlos sin un algoritmo. Rcuerde tambien, establecer la visibilidad de cada método. Por defecto, los cuatro métodos son declarados con visibilidad protegida.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;require_once('dbabstractmdel.php');&lt;br /&gt;class MiClase extends DBAbstractModel {&lt;br /&gt;&lt;br /&gt;    // métodos obligatorios. &lt;br /&gt;    // deberá comentarlos en DBAbstractModel si no desea utilizarlos&lt;br /&gt;    protected function insert() {&lt;br /&gt;        $this-&amp;gt;query = "INSERT INTO tabla (campo) VALUES (1)";&lt;br /&gt;        $this-&amp;gt;execute_single_query();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;   &amp;nbsp;protected function delete() {&lt;br /&gt;        $this-&amp;gt;query = "DELETE FROM tabla WHERE campo=1";&lt;br /&gt;        $this-&amp;gt;execute_single_query();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;   &amp;nbsp;protected function update() {&lt;br /&gt;        $this-&amp;gt;query = "UPDATE tabla SET campo=7 WHERE campo=1";&lt;br /&gt;        $this-&amp;gt;execute_single_query();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;   &amp;nbsp;public function select() {&lt;br /&gt;        $this-&amp;gt;query = "SELECT * FROM tabla";&lt;br /&gt;        $this-&amp;gt;get_results_from_query();&lt;br /&gt;        // retorna un array con los resultados $this-&amp;gt;rows;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-3671515532689006267?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/3671515532689006267/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/dbabstractmodel-clase-php-5-para.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/3671515532689006267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/3671515532689006267'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/dbabstractmodel-clase-php-5-para.html' title='DBAbstractModel - Clase PHP 5 para insertar, eliminar, actualizar y seleccionar datos de una DB MySQL'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-F1lNCmOdAFE/TiumEUhPCmI/AAAAAAAAA4g/216ePR7swsA/s72-c/phpdb_logo.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-5127085116529031280</id><published>2011-07-19T00:06:00.028-03:00</published><updated>2011-09-07T23:16:28.938-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Librerias GPL'/><category scheme='http://www.blogger.com/atom/ns#' term='PHPAggregate'/><title type='text'>PHPAggregate - Librería GPL de funciones agregadas de validación de datos para PHP</title><content type='html'>&lt;div class="separator" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;"&gt;&lt;img alt="Descargar librería LGPL PHPAggregate" border="0" src="http://www.disenowebestandarizado.com/blog/img/phpaggregate_beta1_logo.png" /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;u&gt;Descripción&lt;/u&gt;: PHPAggregate&lt;/b&gt; es una &lt;b&gt;librería para PHP 4 y PHP 5&lt;/b&gt;, de &lt;b&gt;funciones de validación de datos básicos&lt;/b&gt; como direcciones de correo electrónico, cadenas de texto, direcciones IP, nombres de usuario y contraseñas, fechas, entre otros. La librería &lt;b&gt;PHPAggregate&lt;/b&gt;, está &lt;b&gt;basada en expresiones regulares&lt;/b&gt; y utiliza mayormente, la función&amp;nbsp;&lt;b&gt;preg_match()&lt;/b&gt; de PHP 4 para evaluar dichas expresiones.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;DESCARGA:&lt;/b&gt;&amp;nbsp;&lt;a href="https://launchpad.net/europio/+download"&gt;https://launchpad.net/europio/+download&lt;/a&gt;&lt;/div&gt;&lt;div class="micss_hidden_post"&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-size: 19px; font-weight: bold;"&gt;Funciones incluidas&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="pseudolink" id="ln_is_email"&gt;is_email&lt;/span&gt; valida un e-mail&lt;br /&gt;&lt;span class="pseudolink" id="ln_is_password"&gt;is_password&lt;/span&gt; valida una contraseña estándar &lt;br /&gt;&lt;span class="pseudolink" id="ln_is_secure_password"&gt;is_secure_password&lt;/span&gt; valida una contraseña segura &lt;br /&gt;&lt;span class="pseudolink" id="ln_is_ip"&gt;is_ip&lt;/span&gt; valida una dirección IP &lt;br /&gt;&lt;span class="pseudolink" id="ln_is_alphabetic"&gt;is_alphabetic&lt;/span&gt; valida que una cadena contenga solo letras del alfabeto &lt;br /&gt;&lt;span class="pseudolink" id="ln_is_alphanumeric"&gt;is_alphanumeric&lt;/span&gt; valida que una cadena contenga solo letras y números&lt;br /&gt;&lt;span class="pseudolink" id="ln_is_only_numbers"&gt;is_only_numbers&lt;/span&gt; valida que una cadena contenga solo números&lt;br /&gt;&lt;span class="pseudolink" id="ln_is_nickname"&gt;is_nickname&lt;/span&gt; valida un nickname (apodo, nombre de usuario) &lt;br /&gt;&lt;span class="pseudolink" id="ln_is_personal_name"&gt;is_personal_name&lt;/span&gt; valida nombre y apellido completos de una persona&lt;br /&gt;&lt;span class="pseudolink" id="ln_is_strlen_between"&gt;is_strlen_between&lt;/span&gt; valida que una cadena contenga entre n1 y n2 caracteres &lt;br /&gt;&lt;span class="pseudolink" id="ln_is_spanish_date"&gt;is_spanish_date&lt;/span&gt; valida una fecha con formato español (día, mes, año) &lt;br /&gt;&lt;span class="pseudolink" id="ln_is_usa_date"&gt;is_usa_date&lt;/span&gt; valida una fecha con formato americano (mes, día, año) &lt;br /&gt;&lt;span class="pseudolink" id="ln_is_canonical_date"&gt;is_canonical_date&lt;/span&gt; valida una fecha con formato canónico (ISO: año, mes, día)  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="is_email"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-size: x-large;"&gt;is_email:&lt;/span&gt;&lt;/b&gt; Valida direcciones de correo electrónico tradicionales.  &lt;b&gt;Sintaxis:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;is_email($string);&lt;/pre&gt;&lt;b&gt;Parámetros:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;$string&amp;nbsp;&lt;/b&gt;Cadena a evaluar&lt;/blockquote&gt;&lt;b&gt;Valores devueltos:&lt;/b&gt; Devuelve &lt;b&gt;&lt;i&gt;TRUE&lt;/i&gt;&lt;/b&gt; si la cadena evaluada es una dirección de e-mail con formato válido. De lo contrario, devuelve &lt;i style="font-weight: bold;"&gt;FALSE&lt;/i&gt;. &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;$email = 'nombre.apellido_78@algundominio.com';&lt;br /&gt;if(is_email($email) == true) {&lt;br /&gt;    print $email . ' es un e-mail válido';&lt;br /&gt;} else {&lt;br /&gt;    print $email . ' no es un e-mail válido';&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Imprime:&lt;br /&gt;// nombre.apellido_78@algundominio.com es un e-mail válido&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div id="is_password"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-size: x-large;"&gt;is_password:&lt;/span&gt;&lt;/b&gt; Valida contraseñas alfanuméricas convencionales. Permite letras minúsculas de la "a" a la "z"; mayúsculas de la "A" a la "Z" y números. No acepta otros caracteres.  &lt;b&gt;Sintaxis:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;is_password($string, $int_min, $int_max);&lt;/pre&gt;&lt;b&gt;Alias:&lt;/b&gt; La función is_password puede ser llamada también, como: &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;is_aZ9_between is_aZ9_password&lt;/blockquote&gt;&lt;b&gt;Parámetros:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;$string&lt;/b&gt; Cadena a evaluar&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;$int_min&lt;/b&gt; &lt;span class="Apple-style-span" style="color: orange;"&gt;(opcional)&lt;/span&gt; Número entero. Indica la cantidad mínima de caracteres que puede tener. El &lt;u&gt;valor por defecto es 6&lt;/u&gt;.&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;$int_max&lt;/b&gt; &lt;span class="Apple-style-span" style="color: orange;"&gt;(opcional)&lt;/span&gt; Número entero. Indica la cantidad máxima de caracteres que puede tener. El &lt;u&gt;valor por defecto es 18&lt;/u&gt;.&lt;/blockquote&gt;&lt;b&gt;Valores devueltos:&lt;/b&gt; Devuelve&amp;nbsp;&lt;b&gt;&lt;i&gt;TRUE&lt;/i&gt;&lt;/b&gt;&amp;nbsp;si la cadena evaluada es una contraseña válida. De lo contrario, devuelve&amp;nbsp;&lt;i style="font-weight: bold;"&gt;FALSE&lt;/i&gt;. &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;$passwords = array('clave 1'=&amp;amp;amp;gt;'aKgt67',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'clave 2'=&amp;amp;amp;gt;'holamundo',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'clave 3'=&amp;amp;amp;gt;'incorrect_pass',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'clave 4'=&amp;amp;amp;gt;'h5Tm',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'clave 5'=&amp;amp;amp;gt;'*v*765-la'&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; );&lt;br /&gt;&lt;br /&gt;foreach($passwords as $clave=&amp;amp;amp;gt;$valor) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(is_password($valor) == true) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print $clave . ' es correcta';&lt;br /&gt;&amp;nbsp; &amp;nbsp; } else {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print $clave . ' no es correcta';&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;Salida:&lt;br /&gt;&lt;br /&gt;clave 1 es correcta&lt;br /&gt;clave 2 es correcta&lt;br /&gt;clave 3 no es correcta&lt;br /&gt;clave 4 no es correcta&lt;br /&gt;clave 5 no es correcta&lt;br /&gt;&lt;br /&gt;*/&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div id="is_secure_password"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-size: x-large;"&gt;is_secure_password:&lt;/span&gt;&lt;/b&gt; Valida contraseñas seguras que deban incluir al menos una letra mayúscula (A-Z), una minúscula (a-z), un número (0-9) y al menos 1 de los siguientes caracteres especiales:&amp;nbsp;&lt;b&gt;!&lt;/b&gt;, &lt;b&gt;¡&lt;/b&gt;, &lt;b&gt;#&lt;/b&gt;, &lt;b&gt;$&lt;/b&gt;, &lt;b&gt;%&lt;/b&gt;, &lt;b&gt;&amp;amp;amp;amp;&lt;/b&gt;, &lt;b&gt;/&lt;/b&gt;, &lt;b&gt;?&lt;/b&gt;, &lt;b&gt;¿&lt;/b&gt;, &lt;b&gt;*&lt;/b&gt;, &lt;b&gt;+&lt;/b&gt;, &lt;b&gt;-&lt;/b&gt;, &lt;b&gt;_&lt;/b&gt;, &lt;b&gt;@&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;Sugerencia:&lt;/b&gt;Para que una contraseña sea almacenada de forma segura, lo mejor es proceder a su cifrado MD5 o similar.&lt;/blockquote&gt;&lt;b&gt;Sintaxis:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;is_secure_password($string, $int_min, $int_max)&lt;/pre&gt;&lt;b&gt;Parámetros:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;$string&lt;/b&gt; Cadena a evaluar&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;$int_min&lt;/b&gt; &lt;span class="Apple-style-span" style="color: orange;"&gt;(opcional)&lt;/span&gt; Número entero. Indica la cantidad mínima de caracteres que puede tener. El &lt;u&gt;valor por defecto es 8&lt;/u&gt;.&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;$int_max&lt;/b&gt; &lt;span class="Apple-style-span" style="color: orange;"&gt;(opcional)&lt;/span&gt; Número entero. Indica la cantidad máxima de caracteres que puede tener. El &lt;u&gt;valor por defecto es 64&lt;/u&gt;.&lt;/blockquote&gt;&lt;b&gt;Valores devueltos:&lt;/b&gt; Devuelve&amp;nbsp;&lt;b&gt;&lt;i&gt;TRUE&lt;/i&gt;&lt;/b&gt;&amp;nbsp;si la cadena evaluada es una contraseña segura válida. De lo contrario, devuelve&amp;nbsp;&lt;i style="font-weight: bold;"&gt;FALSE&lt;/i&gt;. &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;$passwords = array('clave 1'=&amp;amp;amp;gt;'aKgt67',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'clave 2'=&amp;amp;amp;gt;'hola*mundo',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'clave 3'=&amp;amp;amp;gt;'Any_paSsw0rd',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'clave 4'=&amp;amp;amp;gt;'h5Tm*',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'clave 5'=&amp;amp;amp;gt;'*v*765-lA'&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; );&lt;br /&gt;&lt;br /&gt;foreach($passwords as $clave=&amp;amp;amp;gt;$valor) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(is_secure_password($valor) == true) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print $clave . ' es una clave segura'.chr(10);&lt;br /&gt;&amp;nbsp; &amp;nbsp; } else {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print $clave . ' no es una clave segura'.chr(10);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;Salida:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;clave 1 no es una clave segura&lt;br /&gt;clave 2 no es una clave segura&lt;br /&gt;clave 3 es una clave segura&lt;br /&gt;clave 4 no es una clave segura&lt;br /&gt;clave 5 es una clave segura&lt;br /&gt;&lt;br /&gt;*/&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div id="is_ip"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-size: x-large;"&gt;is_ip:&lt;/span&gt;&lt;/b&gt; Valida direcciones IP.  &lt;b&gt;Sintaxis:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;is_ip($string);&lt;/pre&gt;&lt;b&gt;Parámetros:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;$string&lt;/b&gt; Cadena a evaluar&lt;/blockquote&gt;&lt;b&gt;Valores devueltos:&lt;/b&gt; Devuelve &lt;b&gt;&lt;i&gt;TRUE&lt;/i&gt;&lt;/b&gt; si $string es una dirección IP váida. De lo contrario, devuelve &lt;b&gt;&lt;i&gt;FALSE&lt;/i&gt;&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;$ip_addresses = array('IP 1'=&amp;amp;amp;gt;'20064390',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'IP 2'=&amp;amp;amp;gt;'200.64.3.90',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'IP 3'=&amp;amp;amp;gt;'0.0.1.10'&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;);&lt;br /&gt;&lt;br /&gt;foreach($ip_addresses as $ip=&amp;amp;amp;gt;$valor) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(is_ip($valor) == true) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print $ip . ' es correcta'.chr(10);&lt;br /&gt;&amp;nbsp; &amp;nbsp; } else {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print $ip . ' no es correcta'.chr(10);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;Salida:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;IP 1 no es correcta&lt;br /&gt;IP 2 es correcta&lt;br /&gt;IP 3 es correcta&lt;br /&gt;&lt;br /&gt;*/&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div id="is_alphabetic"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-size: x-large;"&gt;is_alphabetic: &lt;/span&gt;&lt;/b&gt; Valida que una cadena de texto contenga únicamente letras mayúsculas y minúsculas entre la "a" y la "z".  &lt;b&gt;Sintaxis:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;is_alphabetic($word);&lt;/pre&gt;&lt;b&gt;Parámetros:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;$word&lt;/b&gt; Palabra/cadena a ser evaluada&lt;/blockquote&gt;&lt;b&gt;Valores devueltos:&lt;/b&gt; Devuelve &lt;b&gt;&lt;i&gt;TRUE&lt;/i&gt;&lt;/b&gt; si la cadena contiene solo letras del abecedarios (mayúsculas y/o minúsculas). De lo contrario, devuelve &lt;b&gt;&lt;i&gt;FALSE&lt;/i&gt;&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;$words = array('Palabra 1'=&amp;amp;amp;gt;'esto es una oración pero no una palabra',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Palabra 2'=&amp;amp;amp;gt;'Palabra',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Palabra 3'=&amp;amp;amp;gt;'PostgreSQL',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Palabra 4'=&amp;amp;amp;gt;'PHP',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Palabra 5'=&amp;amp;amp;gt;'PHP4',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Palabra 6'=&amp;amp;amp;gt;'PHP 5',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; );&lt;br /&gt;&lt;br /&gt;foreach($words as $word=&amp;amp;amp;gt;$valor) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(is_alphabetic($valor) == true) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print $word . ' tiene solo letras'.chr(10);&lt;br /&gt;&amp;nbsp; &amp;nbsp; } else {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print $word . ' no tiene solo letras'.chr(10);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;Salida:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Palabra 1 no tiene solo letras&lt;br /&gt;Palabra 2 tiene solo letras&lt;br /&gt;Palabra 3 tiene solo letras&lt;br /&gt;Palabra 4 tiene solo letras&lt;br /&gt;Palabra 5 no tiene solo letras&lt;br /&gt;Palabra 6 no tiene solo letras&lt;br /&gt;&lt;br /&gt;*/&lt;/pre&gt;&lt;/div&gt;&lt;div id="is_personal_name"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-size: x-large;"&gt;is_personal_name:&lt;/span&gt;&lt;/b&gt; Valida nombres personales completos (nombres y apellidos / apellidos y nombres) siendo sensible a mayúsculas y minúsculas. Admite&amp;nbsp;apóstrofos&amp;nbsp;característicos en apellidos de origen italiano y francés. No admite abreviaciones, respondiendo afirmativamente solo a la consigna "nombre completo" (Juan C López retornaría una negación a is_personal_name, puesto que lingüísticamente no responde a "nombre completo" sino que la "C" es abreviación del segundo nombre. (véase ejemplo para una idea más amplia de los formatos de nombres admitidos y no admitidos)  &lt;b&gt;Sintaxis:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;is_personal_name($string);&lt;/pre&gt;&lt;b&gt;Parámetros:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;$string&lt;/b&gt; Cadena a evaluar&lt;/blockquote&gt;&lt;b&gt;Valores devueltos:&lt;/b&gt; Devuelve &lt;b&gt;&lt;i&gt;TRUE&lt;/i&gt;&lt;/b&gt; si $string es un nombre personal válido. De lo contrario, devuelve &lt;b&gt;&lt;i&gt;FALSE&lt;/i&gt;&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;$names = array('Nombre 1'=&amp;amp;amp;gt;'Juan Carlos Lopez',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Nombre 2'=&amp;amp;amp;gt;'Juan Carlos Lopez y Planes',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Nombre 3'=&amp;amp;amp;gt;'Juan Lopez',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Nombre 4'=&amp;amp;amp;gt;'Juan Carlos D\'Alessando',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Nombre 5'=&amp;amp;amp;gt;'Juan Carlos D\'alessandro',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Nombre 6'=&amp;amp;amp;gt;'Juan C Lopez',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Nombre 7'=&amp;amp;amp;gt;'juan carlos lopez',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Nombre 7'=&amp;amp;amp;gt;'Juan carlos Lopez',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Nombre 8'=&amp;amp;amp;gt;'Juan',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Nombre 9'=&amp;amp;amp;gt;'Juan CL',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Nombre 10'=&amp;amp;amp;gt;'Juan C L',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Nombre 11'=&amp;amp;amp;gt;'J C Lopez',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Nombre 12'=&amp;amp;amp;gt;'JC Lopez',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Nombre 13'=&amp;amp;amp;gt;'Lopez Juan Carlos',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Nombre 14'=&amp;amp;amp;gt;'Lopez y Planes Juan Carlos',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Nombre 15'=&amp;amp;amp;gt;'Lopez Y Planes Juan Carlos',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Nombre 16'=&amp;amp;amp;gt;'D\'Alessandro Juan Carlos',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Nombre 17'=&amp;amp;amp;gt;'D\'alessandro Juan Carlos',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Nombre 18'=&amp;amp;amp;gt;'Juan Carlos D\' Alessandro'&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; );&lt;br /&gt;&lt;br /&gt;foreach($names as $name=&amp;amp;amp;gt;$valor) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(is_personal_name($valor) == true) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print $valor . ' es un nombre personal valido';&lt;br /&gt;&amp;nbsp; &amp;nbsp; } else {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print $valor . ' no es un nombre valido';&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;Salida:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Juan Carlos Lopez es un nombre personal valido&lt;br /&gt;Juan Carlos Lopez y Planes es un nombre personal valido&lt;br /&gt;Juan Lopez es un nombre personal valido&lt;br /&gt;Juan Carlos D'Alessando es un nombre personal valido&lt;br /&gt;Juan Carlos D'alessandro es un nombre personal valido&lt;br /&gt;Juan C Lopez no es un nombre valido&lt;br /&gt;Juan carlos Lopez no es un nombre valido&lt;br /&gt;Juan no es un nombre valido&lt;br /&gt;Juan CL no es un nombre valido&lt;br /&gt;Juan C L no es un nombre valido&lt;br /&gt;J C Lopez no es un nombre valido&lt;br /&gt;JC Lopez no es un nombre valido&lt;br /&gt;Lopez Juan Carlos es un nombre personal valido&lt;br /&gt;Lopez y Planes Juan Carlos es un nombre personal valido&lt;br /&gt;Lopez Y Planes Juan Carlos no es un nombre valido&lt;br /&gt;D'Alessandro Juan Carlos es un nombre personal valido&lt;br /&gt;D'alessandro Juan Carlos es un nombre personal valido&lt;br /&gt;Juan Carlos D' Alessandro no es un nombre valido&lt;br /&gt;&lt;br /&gt;*/&lt;br /&gt;&lt;/pre&gt;&lt;blockquote&gt;Nótese que &lt;b&gt;is_personal_name&lt;/b&gt; también devolverá &lt;b&gt;FALSE&lt;/b&gt; si &lt;b&gt;$string&lt;/b&gt; &lt;u&gt;comienza o finaliza con un espacio en blanco&lt;/u&gt;.&lt;/blockquote&gt;&lt;/div&gt;&lt;div id="is_alphanumeric"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-size: x-large;"&gt;is_alphanumeric:&lt;/span&gt;&lt;/b&gt; Valida que una cadena solo contenga letras mayúsculas y/o minúsculas y/o números.  &lt;b&gt;Sintáxis:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;is_alphanumeric($string);&lt;/pre&gt;&lt;b&gt;Parámetros:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;$string&lt;/b&gt; Cadena a evaluar&lt;/blockquote&gt;&lt;b&gt;Valores devueltos:&lt;/b&gt; Devuelve &lt;b&gt;&lt;i&gt;TRUE&lt;/i&gt;&lt;/b&gt; si la cadena evaluada contiene únicamente letras (mayúsculas y/o minúsculas) y/o números. De lo contrario, devuelve &lt;b&gt;&lt;i&gt;FALSE&lt;/i&gt;&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;$cadenas = array('Cadena 1'=&amp;amp;amp;gt;'abdgdt',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Cadena 2'=&amp;amp;amp;gt;'aKjhP8Y',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Cadena 3'=&amp;amp;amp;gt;'ahY lK7',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Cadena 4'=&amp;amp;amp;gt;'JAHDG',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Cadena 5'=&amp;amp;amp;gt;'Jkj_D2G'&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; );&lt;br /&gt;&lt;br /&gt;foreach($cadenas as $cadena=&amp;amp;amp;gt;$valor) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(is_alphanumeric($valor) == true) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print $cadena . ' es alfanumerica&lt;br /&gt;';&lt;br /&gt;&amp;nbsp; &amp;nbsp; } else {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print $cadena . ' no es alfanumerica&lt;br /&gt;';&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;Salida:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Cadena 1 es alfanumerica&lt;br /&gt;Cadena 2 es alfanumerica&lt;br /&gt;Cadena 3 no es alfanumerica&lt;br /&gt;Cadena 4 es alfanumerica&lt;br /&gt;Cadena 5 no es alfanumerica&lt;br /&gt;&lt;br /&gt;*/&lt;/pre&gt;&lt;/div&gt;&lt;div id="is_only_numbers"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-size: x-large;"&gt;is_only_numbers:&lt;/span&gt;&lt;/b&gt; Valida que una cadena contenga solo números y opcionalmente puede permitir el ingreso de 1 guión medio (-) entre números.  &lt;b&gt;Sintaxis:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;is_only_numbers($string, $allow_dash);&lt;/pre&gt;&lt;b&gt;Parámetros:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;$string&lt;/b&gt; Cadena a evaluar&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;$allow_dash&lt;/b&gt; &lt;span class="Apple-style-span" style="color: orange;"&gt;(opcional)&lt;/span&gt;. Boolean. True, para permitir un guión medio entre números. False, para no permitir guiones medios. &lt;u&gt;Valor por defecto&lt;/u&gt;: FALSE&lt;/blockquote&gt;&lt;b&gt;Valores devueltos:&lt;/b&gt; Devuelve &lt;b&gt;&lt;i&gt;TRUE&lt;/i&gt;&lt;/b&gt; si la cadena evaluada contiene solo números (y guiones medios si $allow_dash se indicó como true). De lo contrario, retorna &lt;b&gt;&lt;i&gt;FALSE&lt;/i&gt;&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;$cadenas = array('Cadena 1'=&amp;amp;amp;gt;'65845',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Cadena 2'=&amp;amp;amp;gt;'8 6584',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Cadena 3'=&amp;amp;amp;gt;'656-9852',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Cadena 4'=&amp;amp;amp;gt;'56+558',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Cadena 5'=&amp;amp;amp;gt;'25.15',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Cadena 6'=&amp;amp;amp;gt;'325_458',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Cadena 7'=&amp;amp;amp;gt;'+54 (911) 0000-0000',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Cadena 8'=&amp;amp;amp;gt;'+54 011 00000000',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Cadena 9'=&amp;amp;amp;gt;'15-4444-9999'&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; );&lt;br /&gt;&lt;br /&gt;foreach($cadenas as $cadena=&amp;amp;amp;gt;$valor) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(is_only_numbers($valor) == true) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print $cadena . ' contiene solo numeros&lt;br /&gt;';&lt;br /&gt;&amp;nbsp; &amp;nbsp; } else {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print $cadena . ' no contiene solo numeros&lt;br /&gt;';&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;Salida:&lt;br /&gt;Cadena 1 contiene solo numeros&lt;br /&gt;Cadena 2 no contiene solo numeros&lt;br /&gt;Cadena 3 no contiene solo numeros&lt;br /&gt;Cadena 4 no contiene solo numeros&lt;br /&gt;Cadena 5 no contiene solo numeros&lt;br /&gt;Cadena 6 no contiene solo numeros&lt;br /&gt;Cadena 7 no contiene solo numeros&lt;br /&gt;Cadena 8 no contiene solo numeros&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$cadenas = array('Cadena 1'=&amp;amp;amp;gt;'65845',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Cadena 2'=&amp;amp;amp;gt;'8 6584',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Cadena 3'=&amp;amp;amp;gt;'656-9852',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Cadena 4'=&amp;amp;amp;gt;'56+558',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Cadena 5'=&amp;amp;amp;gt;'25.15',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Cadena 6'=&amp;amp;amp;gt;'325_458',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Cadena 7'=&amp;amp;amp;gt;'+54 (911) 0000-0000',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Cadena 8'=&amp;amp;amp;gt;'+54 011 00000000',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Cadena 9'=&amp;amp;amp;gt;'15-4444-9999'&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; );&lt;br /&gt;&lt;br /&gt;foreach($cadenas as $cadena=&amp;amp;amp;gt;$valor) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(is_only_numbers($valor, true) == true) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print $cadena . ' contiene solo numeros&lt;br /&gt;';&lt;br /&gt;&amp;nbsp; &amp;nbsp; } else {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print $cadena . ' no contiene solo numeros&lt;br /&gt;';&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;Salida:&lt;br /&gt;Cadena 1 contiene solo numeros&lt;br /&gt;Cadena 2 no contiene solo numeros&lt;br /&gt;Cadena 3 contiene solo numeros&lt;br /&gt;Cadena 4 no contiene solo numeros&lt;br /&gt;Cadena 5 no contiene solo numeros&lt;br /&gt;Cadena 6 no contiene solo numeros&lt;br /&gt;Cadena 7 no contiene solo numeros&lt;br /&gt;Cadena 8 no contiene solo numeros&lt;br /&gt;Cadena 9 contiene solo numeros&lt;br /&gt;*/&lt;/pre&gt;&lt;/div&gt;&lt;div id="is_nickname"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-size: x-large;"&gt;is_nickname:&lt;/span&gt;&lt;/b&gt; Valida apodos (&lt;i&gt;nicknames&lt;/i&gt; o nombres de usuario) que solo puedan contener al menos una o más letras y/o uno o más números, permitiendo guiones bajos (_) consecutivos al inicio, final o entre medio de la cadena.  &lt;b&gt;Sintaxis:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;is_nickname($string, $int_min, $int_max);&lt;/pre&gt;&lt;b&gt;Parámetros:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;$string&lt;/b&gt; Cadena a ser evaluada&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;$int_min&lt;/b&gt; &lt;span class="Apple-style-span" style="color: orange;"&gt;(opcional)&lt;/span&gt;&amp;nbsp;Número entero. Cantidad de caracteres mínimos que puede contener la cadena. &lt;u&gt;El valor por defecto es 6&lt;/u&gt;.&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;$int_max&lt;/b&gt; &lt;span class="Apple-style-span" style="color: orange;"&gt;(opcional)&lt;/span&gt; Número entero. Indica la cantidad de caracteres máximos que puede contener la cadena. &lt;u&gt;El valor por defecto es 12&lt;/u&gt;.&lt;/blockquote&gt;&lt;b&gt;Valores devueltos:&lt;/b&gt; Devuelve &lt;b&gt;&lt;i&gt;TRUE&lt;/i&gt;&lt;/b&gt; si $string es un nickname válido. De lo contrario, retorna &lt;b&gt;&lt;i&gt;FALSE&lt;/i&gt;&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;$nicknames = array('Nick 1'=&amp;amp;amp;gt;'____jr___75',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Nick 2'=&amp;amp;amp;gt;'cuervo72',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Nick 3'=&amp;amp;amp;gt;'____TurKa_ar',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Nick 4'=&amp;amp;amp;gt;'__^yop^__',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Nick 5'=&amp;amp;amp;gt;'@myself',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Nick 6'=&amp;amp;amp;gt;'juan carlos',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Nick 7'=&amp;amp;amp;gt;'juan-carlos',&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'Nick 8'=&amp;amp;amp;gt;'juan_carlos'&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; );&lt;br /&gt;&lt;br /&gt;foreach($nicknames as $nick=&amp;amp;amp;gt;$valor) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(is_nickname($valor) == true) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print $nick . ' es valido&lt;br /&gt;';&lt;br /&gt;&amp;nbsp; &amp;nbsp; } else {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print $nick . ' no es valido&lt;br /&gt;';&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;Salida:&lt;br /&gt;Nick 1 es valido&lt;br /&gt;Nick 2 es valido&lt;br /&gt;Nick 3 es valido&lt;br /&gt;Nick 4 no es valido&lt;br /&gt;Nick 5 no es valido&lt;br /&gt;Nick 6 no es valido&lt;br /&gt;Nick 7 no es valido&lt;br /&gt;Nick 8 es valido&lt;br /&gt;*/&lt;/pre&gt;&lt;/div&gt;&lt;div id="is_strlen_between"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-size: x-large;"&gt;is_strlen_between:&lt;/span&gt;&lt;/b&gt; Evalúa si una cadena tiene entre n1 y n2 caracteres permitiendo o no espacios en blanco.  &lt;b&gt;Sintaxis:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;is_strlen_between($string, $int_min, $int_max, $allow_white_spaces);&lt;/pre&gt;&lt;b&gt;Parámetros:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;$string&lt;/b&gt; Cadena a ser evaluada&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;$int_min&lt;/b&gt; &lt;span class="Apple-style-span" style="color: orange;"&gt;(opcional)&lt;/span&gt; Numero entero. Cantidad mínima de caracteres que debe tener la cadena. &lt;u&gt;Valor por defecto: 1&lt;/u&gt;.&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;$int_max&lt;/b&gt; &lt;span class="Apple-style-span" style="color: orange;"&gt;(opcional)&lt;/span&gt; Numero entero. Cantidad máxima de caracteres permitidos. &lt;u&gt;Valor por defecto: 255&lt;/u&gt;.&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;$allow_white_spaces&lt;/b&gt; &lt;span class="Apple-style-span" style="color: orange;"&gt;(opcional)&lt;/span&gt; Boolean. True para permitir espacios en blanco. False para no permitir espacios en blanco. &lt;u&gt;Valor por defecto: FALSE&lt;/u&gt;&lt;/blockquote&gt;&lt;b&gt;Valores devueltos:&lt;/b&gt; Devuelve &lt;b&gt;&lt;i&gt;TRUE&lt;/i&gt;&lt;/b&gt; si si la cantidad de caracteres de la cadena está entre n1 y n2. De lo contrario, devuelve &lt;b&gt;&lt;i&gt;FALSE&lt;/i&gt;&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;$cadena = 'Esta es una cadena que tiene más caracteres de los permitidos';&lt;br /&gt;&lt;br /&gt;if(is_strlen_between($cadena, 6, 25, true) == true) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; print 'Cadena es correcta';&lt;br /&gt;} else {&lt;br /&gt;&amp;nbsp; &amp;nbsp; print 'Cadena es incorrecta';&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;Salida:&lt;br /&gt;Cadena es incorrecta&lt;br /&gt;*/&lt;/pre&gt;&lt;/div&gt;&lt;div id="is_spanish_date"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-size: x-large;"&gt;is_spanish_date:&lt;/span&gt;&lt;/b&gt; Evalúa si una fecha tiene formato español día, mes, año, aceptando como separador: &lt;b&gt;/&lt;/b&gt;, &lt;b&gt;-&lt;/b&gt; y &lt;b&gt;.&lt;/b&gt; (25/10/2008, 25-10-2008, 25.10.2008). Además del formato, evalúa que sea una fecha válida llamando a la función checkdate() de PHP (tiene en cuenta años bisiestos). &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Incluida a partir de la versión &lt;b&gt;Beta 1.1&lt;/b&gt;&lt;/blockquote&gt;&lt;b&gt;Sintaxis:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;is_spanish_date($string_date, $string_separador);&lt;/pre&gt;&lt;b&gt;Parámetros:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;$string&lt;/b&gt; Cadena a ser evaluada como fecha&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;$string_separador&lt;/b&gt; &lt;span class="Apple-style-span" style="color: orange;"&gt;(opcional)&lt;/span&gt; Separador para día, mes, año. Acepta: barra (/), guión medio (-) y punto (.). &lt;u&gt;Valor por defecto: '/'&lt;/u&gt;.&lt;/blockquote&gt;&lt;b&gt;Valores devueltos:&lt;/b&gt; Devuelve &lt;b&gt;&lt;i&gt;TRUE&lt;/i&gt;&lt;/b&gt; si si la cadena es una fecha válida, con formato español válido. De lo contrario, devuelve &lt;b&gt;&lt;i&gt;FALSE&lt;/i&gt;&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;$fecha = '25/02/1970';&lt;br /&gt;&lt;br /&gt;if(is_spanish_date($fecha) == true) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; print 'Es una fecha válida';&lt;br /&gt;} else {&lt;br /&gt;&amp;nbsp; &amp;nbsp; print 'Fecha es incorrecta';&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;Salida:&lt;br /&gt;Es una fecha válida&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;$fecha = '25-02-1970';&lt;br /&gt;&lt;br /&gt;if(is_spanish_date($fecha, '-') == true) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; print 'Es una fecha válida';&lt;br /&gt;} else {&lt;br /&gt;&amp;nbsp; &amp;nbsp; print 'Fecha es incorrecta';&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;Salida:&lt;br /&gt;Es una fecha válida&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div id="is_usa_date"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-size: x-large;"&gt;is_usa_date:&lt;/span&gt;&lt;/b&gt; Evalúa si una fecha tiene formato americano, mes, día, año, aceptando como separador: &lt;b&gt;/&lt;/b&gt;, &lt;b&gt;-&lt;/b&gt; y &lt;b&gt;.&lt;/b&gt; (10/25/2008, 10-25-2008, 10.25.2008). Además del formato, evalúa que sea una fecha válida llamando a la función checkdate() de PHP (tiene en cuenta años bisiestos). &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Incluida a partir de la versión &lt;b&gt;Beta 1.1&lt;/b&gt;&lt;/blockquote&gt;&lt;b&gt;Sintaxis:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;is_usa_date($string_date, $string_separador);&lt;/pre&gt;&lt;b&gt;Parámetros:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;$string&lt;/b&gt; Cadena a ser evaluada como fecha&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;$string_separador&lt;/b&gt; &lt;span class="Apple-style-span" style="color: orange;"&gt;(opcional)&lt;/span&gt; Separador para día, mes, año. Acepta: barra (/), guión medio (-) y punto (.). &lt;u&gt;Valor por defecto: '/'&lt;/u&gt;.&lt;/blockquote&gt;&lt;b&gt;Valores devueltos:&lt;/b&gt; Devuelve &lt;b&gt;&lt;i&gt;TRUE&lt;/i&gt;&lt;/b&gt; si si la cadena es una fecha válida, con formato americano válido. De lo contrario, devuelve &lt;b&gt;&lt;i&gt;FALSE&lt;/i&gt;&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;$fecha = '02/25/1970';&lt;br /&gt;&lt;br /&gt;if(is_usa_date($fecha) == true) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; print 'Es una fecha válida';&lt;br /&gt;} else {&lt;br /&gt;&amp;nbsp; &amp;nbsp; print 'Fecha es incorrecta';&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;Salida:&lt;br /&gt;Es una fecha válida&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;$fecha = '02-25-1970';&lt;br /&gt;&lt;br /&gt;if(is_usa_date($fecha, '-') == true) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; print 'Es una fecha válida';&lt;br /&gt;} else {&lt;br /&gt;&amp;nbsp; &amp;nbsp; print 'Fecha es incorrecta';&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;Salida:&lt;br /&gt;Es una fecha válida&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div id="is_canonical_date"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-size: x-large;"&gt;is_canonical_date:&lt;/span&gt;&lt;/b&gt; Evalúa si una fecha tiene formato canónico (ISO), año, mes, día, aceptando como separador: &lt;b&gt;/&lt;/b&gt;, &lt;b&gt;-&lt;/b&gt; y &lt;b&gt;.&lt;/b&gt; (2008/10/25, 2008-10-25, 2008.10.25). Además del formato, evalúa que sea una fecha válida llamando a la función checkdate() de PHP (tiene en cuenta años bisiestos). &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Incluida a partir de la versión &lt;b&gt;Beta 1.1&lt;/b&gt;&lt;/blockquote&gt;&lt;b&gt;Alias:&lt;/b&gt; is_iso_date  &lt;b&gt;Sintaxis:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;is_canonical_date($string_date, $string_separador);&lt;/pre&gt;&lt;b&gt;Parámetros:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;$string&lt;/b&gt; Cadena a ser evaluada como fecha&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;$string_separador&lt;/b&gt; &lt;span class="Apple-style-span" style="color: orange;"&gt;(opcional)&lt;/span&gt; Separador para día, mes, año. Acepta: barra (/), guión medio (-) y punto (.). &lt;u&gt;Valor por defecto: '/'&lt;/u&gt;.&lt;/blockquote&gt;&lt;b&gt;Valores devueltos:&lt;/b&gt; Devuelve &lt;b&gt;&lt;i&gt;TRUE&lt;/i&gt;&lt;/b&gt; si si la cadena es una fecha válida, con formato canónico (ISO) válido. De lo contrario, devuelve &lt;b&gt;&lt;i&gt;FALSE&lt;/i&gt;&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;$fecha = '1970-25-02';&lt;br /&gt;&lt;br /&gt;if(is_canonical_date($fecha, '-') == true) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; print 'Es una fecha válida';&lt;br /&gt;} else {&lt;br /&gt;&amp;nbsp; &amp;nbsp; print 'Fecha es incorrecta';&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;Salida:&lt;br /&gt;Es una fecha válida&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;if(is_iso_date($fecha, '-') == true) { // alias de is_canonical_date&lt;br /&gt;&amp;nbsp; &amp;nbsp; print 'Es una fecha válida';&lt;br /&gt;} else {&lt;br /&gt;&amp;nbsp; &amp;nbsp; print 'Fecha es incorrecta';&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;Salida:&lt;br /&gt;Es una fecha válida&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-5127085116529031280?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/5127085116529031280/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/manual-de-phpaggregate-libreria-de.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/5127085116529031280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/5127085116529031280'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/manual-de-phpaggregate-libreria-de.html' title='PHPAggregate - Librería GPL de funciones agregadas de validación de datos para PHP'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-4367156474410586465</id><published>2011-07-16T03:32:00.004-03:00</published><updated>2011-07-16T03:47:17.938-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Planning Pocker'/><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><title type='text'>Scrum: Cartas para Planning Pocker</title><content type='html'>Navegando en Internet, me encontré estas &lt;b&gt;espectaculares cartas&lt;/b&gt; para &lt;b&gt;Planning Pocker&lt;/b&gt; creadas por &lt;b&gt;&lt;a href="http://www.autentia.com/" target="_blank"&gt;Autentia&lt;/a&gt;&lt;/b&gt;. Para descargar la baraja, simplemente ingresa en &lt;a href="http://www.autentia.com/" target="_blank"&gt;http://www.autentia.com&lt;/a&gt; y allí verás en la columna izquierda, el link directo para la descarga.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img height="200" src="http://1.bp.blogspot.com/-RjWzgbLP_IM/TiEwKWI1GOI/AAAAAAAAA3Y/1l0ZgUFLQlA/s200/carta_100_cc.jpg" width="134" /&gt; &lt;img height="200" src="http://2.bp.blogspot.com/-vKDlRU4xbOY/TiEwA3etDcI/AAAAAAAAA3U/xzigiZggOOE/s200/carta_13_cc.jpg" width="134" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-4367156474410586465?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/4367156474410586465/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/scrum-cartas-para-planning-pocker.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/4367156474410586465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/4367156474410586465'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/scrum-cartas-para-planning-pocker.html' title='Scrum: Cartas para Planning Pocker'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-RjWzgbLP_IM/TiEwKWI1GOI/AAAAAAAAA3Y/1l0ZgUFLQlA/s72-c/carta_100_cc.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-8568595091264071409</id><published>2011-07-15T22:32:00.021-03:00</published><updated>2012-02-18T14:14:36.473-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='POO'/><category scheme='http://www.blogger.com/atom/ns#' term='Modelo-Vista-controlador'/><category scheme='http://www.blogger.com/atom/ns#' term='Libros gratis de programación'/><category scheme='http://www.blogger.com/atom/ns#' term='OOP'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación Orientada a Objetos'/><category scheme='http://www.blogger.com/atom/ns#' term='model-view-controller'/><title type='text'>POO y MVC en PHP</title><content type='html'>&lt;b&gt;Título del libro:&lt;/b&gt; POO y MVC en PHP (primera edición no revisada)&lt;br /&gt;&lt;b&gt;Autor:&lt;/b&gt; Eugenia Bahit&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Descripción: &lt;/b&gt;El paradigma de la programación orientada a objetos con PHP y el patrón arquitectónico MVC. Conceptos teóricos, códigos de ejemplo, ejercios, y más.&lt;br /&gt;&lt;br /&gt;&lt;div class="micss_hidden_post"&gt;&lt;b&gt;Licencia:&lt;/b&gt; Creative Commons BY-NC-ND (libre)&lt;br /&gt;&lt;b&gt;Páginas:&lt;/b&gt; 66 páginas&lt;br /&gt;&lt;b&gt;Formato: &lt;/b&gt;PDF&lt;br /&gt;&lt;b&gt;Fecha de publicación: &lt;/b&gt;15.07.2011&lt;br /&gt;&lt;br /&gt;&lt;div class="recuadro_cool"&gt;&lt;a href="http://vitaminaweb.com/foros/viewforum.php?f=17" target="_blank" title="Ir al Foro de Consultas y dudas sobre el libro"&gt;Foro de Consultas sobre el libro &amp;gt;&amp;gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="recnormal"&gt;Realizar consultas sobre los archivos del ejemplo del libro o sobre conceptos teóricos (gentileza de &lt;a href="http://www.vitaminaweb.com/" target="_blank"&gt;VitaminaWeb.com&lt;/a&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div class="recuadro_cool"&gt;&lt;a href="http://dl.dropbox.com/u/10247930/ejemplo_poo_y_mvc_en_php.tar.gz" target="_blank" title="Descargar los archivos utilizados en el libro"&gt;Descargar los archivos del ejemplo del libro &amp;gt;&amp;gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="recnormal"&gt;Descargar todos los archivos PHP y HTML utilizados en el libro.&lt;br /&gt;(incluye SQL para crear la tabla de la base de datos)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Descargar libro gratis o leer libro online:&lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;safeCreative (descargar):&lt;br /&gt;&lt;a href="https://www.safecreative.org/work/1107229727073" target="_blank" title="Descargar libro POO y MVC en PHP de Eugenia Bahit desde safeCreative"&gt;https://www.safecreative.org/work/1107229727073&lt;/a&gt;&lt;/blockquote&gt;&lt;blockquote&gt;Dropbox (descargar):&lt;br /&gt;&lt;a href="http://dl.dropbox.com/u/10247930/eugenia_bahit--poo_y_mvc_en_php.pdf" title="Descargar libro POO y MVC en PHP de Eugenia Bahit desde Dropbox (public folder)"&gt;http://dl.dropbox.com/u/10247930/eugenia_bahit--poo_y_mvc_en_php.pdf&lt;/a&gt;&lt;/blockquote&gt;&lt;blockquote&gt;Bubok (descargar):&lt;br /&gt;&lt;a href="http://www.bubok.es/libros/205199/POO-y-MVC-en-PHP" target="_blank" title="Descargar libro POO y MVC en PHP de Eugenia Bahit desde Bubok"&gt;http://www.bubok.es/libros/205199/POO-y-MVC-en-PHP&lt;/a&gt;&lt;/blockquote&gt;&lt;blockquote&gt;Lulu (descargar):&lt;br /&gt;&lt;a href="http://www.lulu.com/product/ebook/poo-y-mvc-en-php/16314858" title="Descargar libro POO y MVC en PHP de Eugenia Bahit desde Lulu"&gt;http://www.lulu.com/product/ebook/poo-y-mvc-en-php/16314858&lt;/a&gt;&lt;/blockquote&gt;&lt;blockquote&gt;Scribd (leer online / descargar):&lt;br /&gt;&lt;a href="http://es.scribd.com/doc/60177735/POO-y-MVC-en-PHP" target="_blank" title="Descargar o leer online libro POO y MVC en PHP de Eugenia Bahit desde Scribd"&gt;http://es.scribd.com/doc/60177735/POO-y-MVC-en-PHP&lt;/a&gt;&lt;/blockquote&gt;&lt;blockquote&gt;SlideShare (leer online / descargar):&lt;br /&gt;&lt;a href="http://www.slideshare.net/eugeniabahit/poo-y-mvc-en-php-por-eugenia-bahit" target="_blank" title="Descargar o leer online libro POO y MVC en PHP de Eugenia Bahit desde SlideShare"&gt;http://www.slideshare.net/eugeniabahit/poo-y-mvc-en-php-por-euge...&lt;/a&gt;&lt;/blockquote&gt;&lt;blockquote&gt;Google Docs (leer online / descargar):&lt;br /&gt;&lt;a href="https://docs.google.com/viewer?a=v&amp;amp;pid=explorer&amp;amp;chrome=true&amp;amp;srcid=0B-WmXm2YQ4sXNmZhODQ5MjUtOGJiYi00MjkwLWE2MGMtNzEzNTE5ZmFmYjg4&amp;amp;hl=en_US" target="_blank" title="Descargar o leer online libro POO y MVC en PHP de Eugenia Bahit desde Google Docs"&gt;https://docs.google.com/viewer?a=v&amp;amp;pid=explorer...&lt;/a&gt;&lt;/blockquote&gt;&lt;blockquote&gt;LibroVirtual (leer online / descargar):&lt;br /&gt;&lt;a href="http://www.librovirtual.org/lectura.php?obra=N1311356485" target="_blank" title="Descargar o leer en línea libro POO y MVC en PHP de Eugenia Bahit desde LibroVirtual.org"&gt;http://www.librovirtual.org/lectura.php?obra=N1311356485&lt;/a&gt;&lt;/blockquote&gt;&lt;blockquote&gt;WoBook (leer online / descargar):&lt;br /&gt;&lt;a href="http://www.wobook.com/infos/WBlL4vz0k619-wb/POO-y-MVC-en-PHP.html" target="_blank" title="Descargar o leer en línea libro POO y MVC en PHP de Eugenia Bahit en WoBook"&gt;http://www.wobook.com/infos/...POO-y-MVC-en-PHP.html&lt;/a&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-8568595091264071409?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/8568595091264071409/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/poo-y-mvc-en-php.html#comment-form' title='43 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/8568595091264071409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/8568595091264071409'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/poo-y-mvc-en-php.html' title='POO y MVC en PHP'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>43</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-333784854358717916</id><published>2011-07-14T08:02:00.004-03:00</published><updated>2011-07-18T02:11:09.647-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apuntes PHP'/><title type='text'>PHP: require() o include() ¿cuál uso?</title><content type='html'>Si bien las funciones require() e include() de PHP realizan una acción similar (importar un archivo), no son iguales.&lt;br /&gt;&lt;br /&gt;&lt;div class="micss_hidden_post"&gt;&lt;br /&gt;&lt;b&gt;include()&lt;/b&gt; intenta importar al archivo indicado y en caso de no poder hacerlo, &lt;b&gt;arroja un error y continúa&lt;/b&gt; ejecutando el resto del script.&lt;br /&gt;&lt;br /&gt;Sin embargo, la función &lt;b&gt;require()&lt;/b&gt;, cuando no logra importar el archivo indicado, &lt;b&gt;arroja un error y finaliza&lt;/b&gt; sin permitir que el resto del script continúe ejecutándose.&lt;br /&gt;&lt;br /&gt;Supongamos que require e include no existiesen y que solo existiese la función importar_archivo(). Y que esta función solo se encargara de importar un archivo y si lo encontrara lo retornaría y si no pudiese importarlo, simplemente no retornaría nada.&lt;br /&gt;&lt;br /&gt;Para completar dicha función y, "pensar" como lo harían include y require, el algoritmo sería similar a este:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;si pensáramos como include:&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;if (importar_archivo() == false) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; print 'arrojo un error';&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;si pensáramos como require:&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;if (importar_archivo() == false) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; print 'arrojo un error y finalizo';&lt;br /&gt;&amp;nbsp; &amp;nbsp; exit();&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Fíjate que gran diferencia, habremos hecho llamando a exit().&lt;br /&gt;&lt;br /&gt;Para saber cual de las dos funciones utilizar, simplemente tiene que plantearte el grado de importancia que tiene el archivo que deseas importar.&lt;br /&gt;&lt;br /&gt;Si la ejecución que sigue, depende sí y solo sí de ese archivo, entonces, utilizarás require().&lt;br /&gt;&lt;br /&gt;Pero en cambio, si el resto del script no depende únicamente de ese archivo y el hecho de no lograr importarlo, no afecta de forma directa el resto del script, podrás utilizar include().&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-333784854358717916?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/333784854358717916/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/php-require-o-include-cual-uso.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/333784854358717916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/333784854358717916'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/php-require-o-include-cual-uso.html' title='PHP: require() o include() ¿cuál uso?'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-7174581639802473956</id><published>2011-07-14T04:42:00.010-03:00</published><updated>2011-07-16T21:11:59.034-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kanban'/><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><title type='text'>Kanban y Scrum, obteniendo lo mejor de ambos (en español)</title><content type='html'>De la mano de&amp;nbsp;&lt;b&gt;Henrik Kniberg&lt;/b&gt; (el autor de &lt;a href="http://eugeniabahit.blogspot.com/2011/07/scrum-y-xp-desde-las-trincheras-en.html"&gt;Scrum y XP desde las Trincheras&lt;/a&gt;) y &lt;b&gt;Mattias Skarin&lt;/b&gt;&amp;nbsp;y traducido al español por el equipo de Agile-Spain.com, llega&amp;nbsp;&lt;b&gt;Kanban y Scrum, obteniendo lo mejor de ambos&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Adoro a "Henrik", pero este libro me resultó algo denso. En realidad, no se si denso, pero tardé varios días en terminar de leer sus 123 pages (y no debería decirlo, pero algunos capítulos como que los pasé un poco de largo :D).&lt;br /&gt;&lt;br /&gt;&lt;div class="micss_hidden_post"&gt;Así y todo, no puedo negar que es &lt;b&gt;sumamente interesante&lt;/b&gt;. Otro libro más, distribuido con Licencia Creative Commons, que en este caso, puede descargarse desde &lt;b&gt;proyectalis&lt;/b&gt;&amp;nbsp;en la URL&amp;nbsp;&lt;a href="http://www.proyectalis.com/2010/01/28/scrum-vs-kanban-en-castellano/" target="_blank" title="Descargar gratis Kanban y Scrum, obteniendo lo mejor de ambos en español"&gt;http://www.proyectalis.com/2010/01/28/scrum-vs-kanban-en-castellano/&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-7174581639802473956?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/7174581639802473956/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/kanban-y-scrum-obteniendo-lo-mejor-de.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/7174581639802473956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/7174581639802473956'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/kanban-y-scrum-obteniendo-lo-mejor-de.html' title='Kanban y Scrum, obteniendo lo mejor de ambos (en español)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-7898850325701201986</id><published>2011-07-14T04:17:00.002-03:00</published><updated>2011-07-16T21:12:14.991-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Extreme Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><title type='text'>Scrum y XP desde las Trincheras (en español)</title><content type='html'>&lt;b&gt;Scrum y XP desde las Trincheras&lt;/b&gt; (de&amp;nbsp;Henrik Kniberg), traducido al español de la mano de Ángel Medinilla, es uno de mis favoritos. ¡No! ¿Cómo me atrevo? No es uno de mis favoritos... ¡Es mi favorito!&lt;br /&gt;Este "muchacho" Henrik (si, parece que ya lo considero amigo), es algo así como "simpático" para escribir, a la vez de ser muy claro.&lt;br /&gt;&lt;br /&gt;Si ya tienes conocimientos de Scrum (al menos una base), este libro, en 122 páginas, te servirá para conocer en detalle todos los artefactos de Scrum, cómo implementarlos y lo más importante, cómo combinar Scrum con las prácticas técnicas de Extreme Programming (XP).&lt;br /&gt;&lt;br /&gt;&lt;div class="micss_hidden_post"&gt;&lt;b&gt;InfoQ&lt;/b&gt; nos ofrece la &lt;b&gt;descarga gratuita&lt;/b&gt; de &lt;b&gt;Scrum y XP desde las Trincheras (en español)&lt;/b&gt; desde su sitio Web &lt;a href="http://www.infoq.com/minibooks/scrum-xp-from-the-trenches" target="_blank" title="Descargar gratis Scrum y XP desde las Trincheras en español"&gt;http://www.infoq.com/minibooks/scrum-xp-from-the-trenches&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-7898850325701201986?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/7898850325701201986/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/scrum-y-xp-desde-las-trincheras-en.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/7898850325701201986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/7898850325701201986'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/scrum-y-xp-desde-las-trincheras-en.html' title='Scrum y XP desde las Trincheras (en español)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-3347208889013016005</id><published>2011-07-14T04:02:00.004-03:00</published><updated>2011-07-17T04:42:00.989-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><title type='text'>The Scrum Primer (en español)</title><content type='html'>&lt;b&gt;The Scrum Primer&lt;/b&gt;&amp;nbsp;de los autores&amp;nbsp;Pete Deemer, Gabrielle Benefield, Craig Larman y Bas Vodde, es uno de los mejores libros para introducirse en Scrum. Con solo 20 páginas y&amp;nbsp;&lt;b&gt;traducido al español por Leo Antoli&lt;/b&gt;, es sin lugar a dudas, la mejor forma de comenzar a entender el enfoque ágil de gestión de proyectos más utilizado por las empresas de desarrollo de Software.&lt;br /&gt;&lt;div class="micss_hidden_post"&gt;&lt;br /&gt;&lt;b&gt;The Scrum Primer &lt;/b&gt;se distribuyye con una licencia Creative Commons BY-NC-ND, motivo por el cual, podrás &lt;b&gt;descargarlo gratuitamente desde el sitio Web de Scrum Foundation&lt;/b&gt; en la URL&amp;nbsp;&lt;a href="http://scrumfoundation.com/library" target="_blank" title="Descargar The Scrum Primer en español (descarga gratuita)"&gt;http://scrumfoundation.com/library&lt;/a&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/9023974285878579728-3347208889013016005?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/3347208889013016005/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/scrum-primer-en-espanol.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/3347208889013016005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/3347208889013016005'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/scrum-primer-en-espanol.html' title='The Scrum Primer (en español)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-2664932980312041310</id><published>2011-07-09T11:51:00.001-03:00</published><updated>2011-07-18T02:33:46.380-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apuntes PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='PHPUnit'/><category scheme='http://www.blogger.com/atom/ns#' term='Test Unitarios'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Manual de PHPUnit en español - Capítulo 4: Testeando errores PHP</title><content type='html'>&lt;br /&gt;Por defecto, PHPUnit convierte los errores, advertencias y avisos de PHP que son desencadenados durante la ejecución de un test para una excepción.&lt;br /&gt;Usando estas excepciones, puede, por ejemplo, esperar un test para desencadenar un error PHP como se muestra en el siguiente ejemplo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="micss_hidden_post"&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Ejemplo 4.8&lt;/u&gt;: Esperando un error PHP usando @expectedException&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;class ExpectedErrorTest extends PHPUnit_Framework_TestCase&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* @expectedException PHPUnit_Framework_Error&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function testFailingInclude()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; include 'not_existing_file.php';&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;phpunit ExpectedErrorTest&lt;/b&gt;&lt;br /&gt;PHPUnit 3.4.14 by Sebastian Bergmann.&lt;br /&gt;&lt;br /&gt;.&lt;br /&gt;&lt;br /&gt;Time: 0 seconds&lt;br /&gt;&lt;br /&gt;OK (1 test, 1 assertion)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;PHPUnit_Framework_Error_Notice&lt;/b&gt; y &lt;b&gt;PHPUnit_Framework_Error_Warning&lt;/b&gt; representan avisos y advertencias de PHP, respectivamente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Nota&lt;/b&gt;&lt;br /&gt;Usted debería ser tan específico como sea posible cuando testea excepciones. El testeo para la clase Exception, por ejemplo, es muy general en la mayoría de los casos y puede tener efectos secundarios indeseables.&lt;br /&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/9023974285878579728-2664932980312041310?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/2664932980312041310/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/manual-de-phpunit-en-espanol-capitulo-4_7228.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/2664932980312041310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/2664932980312041310'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/manual-de-phpunit-en-espanol-capitulo-4_7228.html' title='Manual de PHPUnit en español - Capítulo 4: Testeando errores PHP'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-8210221626337868048</id><published>2011-07-09T11:36:00.001-03:00</published><updated>2011-07-18T02:35:56.222-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apuntes PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='PHPUnit'/><category scheme='http://www.blogger.com/atom/ns#' term='Test Unitarios'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Manual de PHPUnit en español - Capítulo 4: Testeando Excepciones</title><content type='html'>Muestra como usar la anotación @expectedException para probar si se produce una excepción en el código del test.  &lt;br /&gt;&lt;br /&gt;&lt;div class="micss_hidden_post"&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Ejemplo 4.5&lt;/u&gt;: Usando @expectedException&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;require_once 'PHPUnit/Framework.php';&lt;br /&gt;&lt;br /&gt;class ExceptionTest extends PHPUnit_Framework_TestCase&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* @expectedException InvalidArgumentException&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function testException()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;phpunit ExceptionTest&lt;/b&gt;&lt;br /&gt;PHPUnit 3.4.14 by Sebastian Bergmann.&lt;br /&gt;&lt;br /&gt;F&lt;br /&gt;&lt;br /&gt;Time: 0 seconds&lt;br /&gt;&lt;br /&gt;There was 1 failure:&lt;br /&gt;&lt;br /&gt;1) testException(ExceptionTest)&lt;br /&gt;Expected exception InvalidArgumentException&lt;br /&gt;&lt;br /&gt;FAILURES!&lt;br /&gt;Tests: 1, Assertions: 1, Failures: 1.&lt;br /&gt;&lt;br /&gt;Alternativamente, puede utilizar el método setExpectedException() para establecer como mostrar la excepción esperada.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Ejemplo 4.6&lt;/u&gt;: Esperando una excepción arrojada por el código testeado&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;require_once 'PHPUnit/Framework.php';&lt;br /&gt;&lt;br /&gt;class ExceptionTest extends PHPUnit_Framework_TestCase&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function testException()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $this-&amp;gt;setExpectedException('InvalidArgumentException');&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;phpunit ExceptionTest&lt;/b&gt;&lt;br /&gt;PHPUnit 3.4.14 by Sebastian Bergmann.&lt;br /&gt;&lt;br /&gt;F&lt;br /&gt;&lt;br /&gt;Time: 0 seconds&lt;br /&gt;&lt;br /&gt;There was 1 failure:&lt;br /&gt;&lt;br /&gt;1) testException(ExceptionTest)&lt;br /&gt;Expected exception InvalidArgumentException&lt;br /&gt;&lt;br /&gt;FAILURES!&lt;br /&gt;Tests: 1, Assertions: 1, Failures: 1&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Métodos provistos para el testing de excepciones&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;void setExpectedException(string $exceptionName)&lt;br /&gt;Establece el nombre de la excepción esperada en $exceptionName.&lt;br /&gt;&lt;br /&gt;String getExpectedException()&lt;br /&gt;retorna el nombre de la excepción esperada.&lt;br /&gt;&lt;br /&gt;Puede utilizar también el enfoque mostrado en el siguiente ejemplo para el testing de excepciones:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Ejemplo 4.7&lt;/u&gt;: Enfoque alternativo para el testing de excepciones&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;require_once 'PHPUnit/Framework.php';&lt;br /&gt;&lt;br /&gt;class ExceptionTest extends PHPUnit_Framework_TestCase {&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function testException() {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; try {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // ... Code that is expected to raise an exception ...&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; catch (InvalidArgumentException $expected) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $this-&amp;gt;fail('An expected exception has not been raised.');&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;En el ejemplo anterior, si el código que se espera arroje una excepción, no arroja la excepción esperada, la subsiguiente llamada a fail() detendrá el test e indicará un problema con la prueba. Si la excepción esperada es arrojada, el bloque de captura (catch) será ejecutado y el test finalizará satisfactoriamente.&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/9023974285878579728-8210221626337868048?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/8210221626337868048/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/manual-de-phpunit-en-espanol-capitulo-4_6158.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/8210221626337868048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/8210221626337868048'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/manual-de-phpunit-en-espanol-capitulo-4_6158.html' title='Manual de PHPUnit en español - Capítulo 4: Testeando Excepciones'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-2722338719826961379</id><published>2011-07-09T11:32:00.001-03:00</published><updated>2011-07-18T02:36:57.619-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apuntes PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='PHPUnit'/><category scheme='http://www.blogger.com/atom/ns#' term='Test Unitarios'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Manual de PHPUnit en español - Capítulo 4: Proveedores de datos (data providers)</title><content type='html'>&lt;br /&gt;Un método de prueba puede aceptar argumentos arbitrariamente. Estos argumentos serán provistos por un método proveedor de datos.&lt;br /&gt;&lt;br /&gt;Un método proveedor de datos debe ser público y también retornar un array de arrays o un objeto que implemente la interfaz repetitiva y el rendimiento de un &amp;nbsp;array para cada paso repetitivo. Para cada array que sea parte de la colección del test será llamado con el contenido del array como su argumento.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="micss_hidden_post"&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Ejemplo 4.4&lt;/u&gt;: Usando proveedores de Datos&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;class DataTest extends PHPUnit_Framework_TestCase&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* @dataProvider provider&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function testAdd($a, $b, $c)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $this-&amp;gt;assertEquals($c, $a + $b);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function provider()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return array(&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; array(0, 0, 0),&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; array(0, 1, 1),&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; array(1, 0, 1),&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; array(1, 1, 3)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; );&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;phpunit DataTest&lt;br /&gt;PHPUnit 3.4.14 by Sebastian Bergmann.&lt;br /&gt;&lt;br /&gt;...F&lt;br /&gt;&lt;br /&gt;Time: 0 seconds&lt;br /&gt;&lt;br /&gt;There was 1 failure:&lt;br /&gt;&lt;br /&gt;1) testAdd(DataTest) with data (1, 1, 3)&lt;br /&gt;Failed asserting that &lt;integer:2&gt; matches expected value &lt;integer:3&gt;.&lt;/integer:3&gt;&lt;/integer:2&gt;&lt;br /&gt;/home/sb/DataTest.php:21&lt;br /&gt;&lt;br /&gt;FAILURES!&lt;br /&gt;Tests: 4, Assertions: 4, Failures: 1.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Nota 1&lt;/b&gt;&lt;br /&gt;Cuando un test recibe una entrada desde un método proveedor de datos y a la vez desde uno o más tests sus dependencias sobre los argumentos desde el proveedor de datos vendrán antes de una de los test de los cuales depende.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Nota 2&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Cuando un test depende de otro que utiliza proveedores de datos, el test dependiente será ejecutado cuando el test del cual depende tenga éxito para al menos un set de datos. El resultado de un test que utiliza proveedores de datos no puede ser inyectado en un test dependiente.&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/9023974285878579728-2722338719826961379?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/2722338719826961379/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/manual-de-phpunit-en-espanol-capitulo-4_9544.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/2722338719826961379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/2722338719826961379'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/manual-de-phpunit-en-espanol-capitulo-4_9544.html' title='Manual de PHPUnit en español - Capítulo 4: Proveedores de datos (data providers)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-670327596165121498</id><published>2011-07-09T11:10:00.016-03:00</published><updated>2011-07-18T02:38:44.295-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Test-First Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Apuntes PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='PHPUnit'/><category scheme='http://www.blogger.com/atom/ns#' term='Test Unitarios'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Manual de PHPUnit en español - Capítulo 4: Dependencias</title><content type='html'>&lt;div class="micss_hidden_post"&gt;&lt;/div&gt;&lt;blockquote&gt;Los Tests Unitarios son principalmente escritos como una buena práctica para ayudar a los desarrolladores a identificar y localizar errores (bugs), refactorizar código y servir como documentación para una unidad de software bajo test. Para obtener estos beneficios, los tests unitarioss deben abarcar todas las rutas posibles en un programa. Un test unitario usualmente abarcan una ruta específica en una función o método. De todos modos, un método de prueba no necesariamente es una entidad encapsulada independientemente (?) Con frecuencia, hay dependencias implícitas entre métodos de prueba ocultos en la implementación del escenario de un test. (Adrian Kuhn et. al.)&lt;/blockquote&gt;PHPUnit soporta la declaración de dependencias explícitas entre los métodos de prueba. Tales dependencias no definen el order en el cual los métodos de prueba serán ejecutados pero permiten el retorno de una instancia del test fijo de un productor pasándolo a los consumidores dependientes.&lt;br /&gt;&lt;div class="micss_hidden_post"&gt;&lt;ul&gt;&lt;li&gt;Un &lt;b&gt;productor&lt;/b&gt; es un método de prueba que devuelve un valor de retorno.&lt;/li&gt;&lt;li&gt;Un &lt;b&gt;consumidor&lt;/b&gt; es un método de prueba dependiente de uno o más productores y de sus valores retornados.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Ejemplo 4.2&lt;/u&gt;: Uso de la notación @depends para expresar una dependencia&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;class Stack extends PHPUnit_Framework_TestCase&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function testEmpty()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $stack = array();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $this-&amp;gt;assertTrue(empty($stack));&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return $stack;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* @depends testEmpty&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function testPush(array $stack)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; array_push($stack, 'foo');&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $this-&amp;gt;assertEquals('foo', $stack[count($stack)-1]);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $this-&amp;gt;assertFalse(empty($stack));&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return $stack;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* @depends testPush&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function testPop(array $stack)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $this-&amp;gt;assertEquals('foo', array_pop($stack));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $this-&amp;gt;assertTrue(empty($stack));&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;En el ejemplo de arriba, el primer test, testEmpty(), crea un nuevo array y afirma que éste está vacío. El test, entonces, retorna el fixture como su resultado. El segundo test, testPush(), depende de testEmpty() y el resultado del que depende, le es pasado como argumento. Finalmente, testPop() depende de testPush().&lt;br /&gt;&lt;br /&gt;Para localizar rápidamente los defectos, queremos que nuestra atención sea focalizada sobre las pruebas fallidas en cuestión. Esto es porque PHPUnit saltea la ejecución de un test cuando un test dependiente falla. Esto mejora la localización de defectos por explotar las dependencias entre los test como se muestra en el siguiente ejemplo.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Ejemplo 4.3&lt;/u&gt;: Explotando las dependencias entre tests&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;class DependencyFailureTest extends PHPUnit_Framework_TestCase&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function testOne()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $this-&amp;gt;assertTrue(FALSE);&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; /**&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* @depends testOne&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function testTwo()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;phpunit --verbose DependencyFailureTest&lt;/b&gt;&lt;br /&gt;PHPUnit 3.4.14 by Sebastian Bergmann.&lt;br /&gt;&lt;br /&gt;DependencyFailureTest&lt;br /&gt;FS&lt;br /&gt;&lt;br /&gt;Time: 0 seconds&lt;br /&gt;&lt;br /&gt;There was 1 failure:&lt;br /&gt;&lt;br /&gt;1) testOne(DependencyFailureTest)&lt;br /&gt;Failed asserting that &lt;boolean:false&gt; is true.&lt;/boolean:false&gt;&lt;br /&gt;/home/sb/DependencyFailureTest.php:6&lt;br /&gt;&lt;br /&gt;There was 1 skipped test:&lt;br /&gt;&lt;br /&gt;1) testTwo(DependencyFailureTest)&lt;br /&gt;This test depends on "DependencyFailureTest::testOne" to pass.&lt;br /&gt;&lt;br /&gt;FAILURES!&lt;br /&gt;Tests: 2, Assertions: 1, Failures: 1, Skipped: 1.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Un test puede tener más de una dependencia. PHPUnit no cambia el orden en el cual los test son ejecutados. Debe asegurarse que las dependencias de un test puedan realmente ser reunidas antes de que el test corra.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-670327596165121498?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/670327596165121498/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/manual-de-phpunit-en-espanol-capitulo-4_09.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/670327596165121498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/670327596165121498'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/manual-de-phpunit-en-espanol-capitulo-4_09.html' title='Manual de PHPUnit en español - Capítulo 4: Dependencias'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-8172165744974528411</id><published>2011-07-09T11:04:00.001-03:00</published><updated>2011-07-18T02:41:33.460-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Test-First Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Apuntes PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='PHPUnit'/><category scheme='http://www.blogger.com/atom/ns#' term='Test Unitarios'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Manual de PHPUnit en español - Capítulo 4: Escribiendo Test en PHPUnit</title><content type='html'>&lt;div class="micss_hidden_post"&gt;Quienes me conocen, saben que si hay algo que no me gusta de este mundo, es el idioma inglés; que no me llevo bien con este idioma, es sabido; y que me molesta enormemente que me hablen en inglés, tampoco es novedad. Pero, de igual manera no es un secreto, que me gusta traducir libros y manuales de informática, desde aquel idioma que poco y nada domino (y poca voluntad tengo para hacerlo) al español, que no solo representa mi "lengua natal" sino que además, me apasiona (pensando en voz alta... ¿y las faltas de ortografía, qué? jo! bueno, se me escapan a veces, che!).&lt;br /&gt;&lt;br /&gt;Y cual vendedor ambulante ofreciendo peines en el Ferrocarril Gral. Roca - ramal Bosques -, en esta "oportúnity" les hago llegar una "óferty" ideal para la cartera de la "Lady" y el bolsillo del "Gentelman": la &lt;b&gt;traducción al español del manual de PHPUnit, el framework para realizar Test Unitarios en PHP&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Hago un meritorio agradecimiento (hablando en serio) a la infinidad de profesoras de inglés que en mi infancia se han esforzado por enseñarme, al menos algo, de este idioma. A mis profesoras de la Cultural Inglesa de Buenos Aires (1986-1987); a la profesora Elena (1990), de mi ¿apreciado? barrio Gerli, de quien no recuerdo su apellido; a la profesora de inglés de sexto grado del Colegio Esteban Echeverría de Capital Federal y a mis 5 profesoras de inglés del colegio Joaquín V. González de Barracas. Evidentemente, han hecho todas un excelente trabajo, pues no se como, 20 años después, algo en mi memoria ha quedado. También, debo agradecer a Google Translate por servirme de diccionario electrónico :D&lt;br /&gt;&lt;br /&gt;Ahora sí, con ustedes (y de a capítulos porque no lo terminé aún), la&amp;nbsp;&lt;b&gt;traducción al español del manual de PHPUnit&lt;/b&gt;&amp;nbsp;(comienza en el capítulo 4).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Manual oficial de PHPUnit (en inglés):&lt;/b&gt; &lt;a href="http://www.phpunit.de/manual/current/en/" target="_blank"&gt;http://www.phpunit.de/manual/current/en/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3 class="post-title entry-title"&gt;Capítulo 4: Escribiendo Test en PHPUnit&lt;/h3&gt;&lt;/div&gt;&lt;br /&gt;En el siguiente ejemplo, mostramos como escribir tests usando PHPUnit para ejercitar operaciones de arrays en PHP. El ejemplo introduce las convenciones y pasos básicos para escribir tests con PHPUnit:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Nombre de la clase:&lt;/b&gt; El test para una clase Class debe ir dentro de una clase ClassTest&lt;/li&gt;&lt;li&gt;&lt;b&gt;Herencia: &lt;/b&gt;ClassTest hereda (la mayor parte del tiempo) de PHPUnit_Framework_TestCase&lt;/li&gt;&lt;li&gt;&lt;b&gt;Métodos: &lt;/b&gt;Los tests son métodos públicos que son nombrados con el prefijo test. Alternativamente, puede usar la anotación @test en un docblock del método para marcarlo como un método test.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Assertion methods:&lt;/b&gt; Dentro de los métodos de tests, los métodos de acierto (assertion methods) como assertEquals() son utilizados para afirmar que un valor real coincide con un valor esperado.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="micss_hidden_post"&gt;&lt;b&gt;&lt;u&gt;Ejemplo 4.1&lt;/u&gt;: Testeando operaciones de arrays con PHPUnit&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: php"&gt;require_once 'PHPUnit/Framework.php';&lt;br /&gt;&lt;br /&gt;class Stack extends PHPUnit_Framework_TestCase&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; public function testPushAndPop()&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $stack = array();&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $this-&amp;gt;assertEquals(0, count($stack));&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; array_push($stack, 'foo');&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $this-&amp;gt;assertEquals('foo', $stack[count($stack)-1]);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $this-&amp;gt;assertEquals(1, count($stack));&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $this-&amp;gt;assertEquals('foo', array_pop($stack));&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $this-&amp;gt;assertEquals(0, count($stack));&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;blockquote&gt;Cada vez que esté tentado de escribir algo dentro de una declaración print o una expresión de debug, en su lugar, escribirlo como un test. (Martin Fowler)&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-8172165744974528411?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/8172165744974528411/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/manual-de-phpunit-en-espanol-capitulo-4.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/8172165744974528411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/8172165744974528411'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/manual-de-phpunit-en-espanol-capitulo-4.html' title='Manual de PHPUnit en español - Capítulo 4: Escribiendo Test en PHPUnit'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-1535897592067107092</id><published>2011-07-08T03:32:00.002-03:00</published><updated>2011-07-21T03:39:58.856-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tecnología'/><category scheme='http://www.blogger.com/atom/ns#' term='Off Topic'/><title type='text'>Emprendimientos en la Web 2.0: Dropbox: Almacenamiento en la nube</title><content type='html'>&lt;a href="http://entrepreneur-web.blogspot.com/2011/06/dropbox-almacenamiento-en-la-nube.html?spref=bl"&gt;Emprendimientos en la Web 2.0: Dropbox: Almacenamiento en la nube&lt;/a&gt;: "  ¿A quien no le paso tener que imprimir algún archivo y darse cuenta que quedo en la PC del trabajo o viceversa? ¿Quien no perdió horas bus..."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-1535897592067107092?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://entrepreneur-web.blogspot.com/2011/06/dropbox-almacenamiento-en-la-nube.html?spref=bl' title='Emprendimientos en la Web 2.0: Dropbox: Almacenamiento en la nube'/><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/1535897592067107092/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/emprendimientos-en-la-web-20-dropbox.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/1535897592067107092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/1535897592067107092'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/07/emprendimientos-en-la-web-20-dropbox.html' title='Emprendimientos en la Web 2.0: Dropbox: Almacenamiento en la nube'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-9184736162516524775</id><published>2011-06-13T20:24:00.001-03:00</published><updated>2011-06-14T00:23:54.687-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python: Guía rápida de referencias (métodos del objeto diccionario)</title><content type='html'>&lt;div class="micss_hidden_post"&gt;&lt;b&gt;Métodos del Objeto Diccionario&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Sintaxis general&lt;br /&gt;&lt;div class="micss_codebox"&gt;diccionario.metodo()&lt;/div&gt;&lt;br /&gt;Métodos más usuales:&lt;br /&gt;&lt;div class="micss_codebox"&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;keys() &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Retorna una lista con todas las claves del diccionario&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;values()&amp;nbsp;&amp;nbsp;&amp;nbsp; Retorna una lista con todos los valores del diccionario&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;items()&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Retorna una lista que contiene en cada nodo una tupla con la clave y el valor.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; diccionario = {'madera:':'cedro', 'ancho':175, 'alto':250}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; lista = diccionario.items() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print lista #Salida: [('madera', 'cedro'), ('ancho', 175), ('alto', 250)] &lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;pop('clave', ['mensaje_de_error_clave_no_encontrada'])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Borrar el para clave-valor que coincida con el parámetro pasado.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; En caso de no encontrarlo, en vez de un error puede proveernos de un mensaje de&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; error personalizado.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;has_key(clave)&amp;nbsp;&amp;nbsp;&amp;nbsp; Retorna true si el diccionario contiene la clave pasada como parámetro.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;clear()&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Elimina todos los elementos del diccionario.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;copy()&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Copia el diccionario en memoria.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;popitem()&amp;nbsp;&amp;nbsp;&amp;nbsp; Retorna y borra un elemento del diccionario al azar.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;update(otro_diccionario)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Actualiza el diccionario agregando las claves y valores de otro_diccionario en &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; el diccionario actual.&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/9023974285878579728-9184736162516524775?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/9184736162516524775/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias_1955.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/9184736162516524775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/9184736162516524775'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias_1955.html' title='Python: Guía rápida de referencias (métodos del objeto diccionario)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-5087106147034380785</id><published>2011-06-13T20:23:00.001-03:00</published><updated>2011-06-14T00:23:54.688-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python: Guía rápida de referencias (métodos del objeto list)</title><content type='html'>&lt;div class="micss_hidden_post"&gt;&lt;b&gt;Métodos del Objeto List&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Sintaxis general&lt;br /&gt;&lt;div class="micss_codebox"&gt;lista.metodo()&lt;/div&gt;&lt;br /&gt;Métodos más usuales:&lt;br /&gt;&lt;div class="micss_codebox"&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;append(element) Agrega un elemento a la lista.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;extend(elementos) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Agrega más de un elemento a la lista.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;insert(posicion, elemento)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Agrega un elemento a la lista en la posición indicada.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;pop([posicion])&amp;nbsp;&amp;nbsp;&amp;nbsp; Retorna y borra el elemento correspondiente a la posición indicada.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Si no se le indica una posición, retorna y borra el último elemento de la lista.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;remove(element) Borra el primer elemento de la lista que coincida con el parámetro pasado.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;count(elemento)&amp;nbsp;&amp;nbsp;&amp;nbsp; Cuenta la cantidad de veces que el elemento aparece en la lista.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;index(elemento, [inicio], [fin])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Retorna la primera posición en la que se encuentra el elemento pasado como &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; parámetro.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;sort()&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Ordena la lista de menor a mayor.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;reverse()&amp;nbsp;&amp;nbsp;&amp;nbsp; Invierte el orden de la lista.&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/9023974285878579728-5087106147034380785?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/5087106147034380785/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias_2176.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/5087106147034380785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/5087106147034380785'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias_2176.html' title='Python: Guía rápida de referencias (métodos del objeto list)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-2192386599717391918</id><published>2011-06-13T20:21:00.001-03:00</published><updated>2011-06-14T00:23:54.688-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python: Guía rápida de referencias (métodos del objeto string)</title><content type='html'>&lt;div class="micss_hidden_post"&gt;&lt;b&gt;Métodos del Objeto String&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Sintaxis general:&lt;br /&gt;&lt;div class="micss_codebox"&gt;string.metodo()&lt;/div&gt;&lt;br /&gt;Métodos más comunes:&lt;br /&gt;&lt;div class="micss_codebox"&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;capitalize()&amp;nbsp;&amp;nbsp;&amp;nbsp; Retorna otra cadena con el primer caracter en mayúsculas.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;upper()&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Convierte toda la cadena a mayúsculas.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;lower()&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Convierte toda la cadena a minúsculas.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;isupper()&amp;nbsp;&amp;nbsp;&amp;nbsp; Retorna true si todos los caracteres están en mayúsculas.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;islower()&amp;nbsp;&amp;nbsp;&amp;nbsp; Retorna true si todos los caracteres están en minúsculas.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;isdigit()&amp;nbsp;&amp;nbsp;&amp;nbsp; Retorna true si todos los caracteres de la cadena son dígitos.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;isalpha()&amp;nbsp;&amp;nbsp;&amp;nbsp; Retorna true si todos los caracteres de la cadena son alfabéticos.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;isspace()&amp;nbsp;&amp;nbsp;&amp;nbsp; Retorna true si todos los caracteres de la cadena son espacios en blanco.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;isalnum()&amp;nbsp;&amp;nbsp;&amp;nbsp; Retorna true si los caracteres de la cadena son alfanuméricos.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;find('cadena_buscada', [inicio], [fin]) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Busca cadena_buscada en la cadena y retorna su posición. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Opcionalmente se puede indicar una posición de inicio y fin para efectuar &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; la búsqueda. Si no la encuentra retorna -1.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;rfind('cadena_buscada', [inicio], [fin])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Igual a find() pero comienza la búsqueda de atrás hacia adelante.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;count('cadena_buscada', [inicio], [fin])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Retorna la cantidad de veces que cadena_buscada se repite en la cadena &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; desde inicio hasta fin aunque estos dos parámetros son opcionales.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;replace('busqueda', 'reemplazo', [maximo_numero_de_reemplazos])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Retorna una cadena habiendo reemplazado busqueda por reemplazo.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;split('caracter_divisor', [maximo])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Retorna una lista dividiéndola en trozos a partir de cada ocurrencia &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; del caracter_divisor.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;rsplit('caracter_divisor', [maximo])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Igual que split() pero comienza de atrás hacia adelante.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;splitlines()&amp;nbsp;&amp;nbsp;&amp;nbsp; Retorna una lista dividiendo la cadena con cada salto de línea.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;swapcase()&amp;nbsp;&amp;nbsp;&amp;nbsp; Convierte las mayúsculas a minúsculas y viceversa.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;rjust(longitud, 'caracter_de_relleno')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Rellena una string hacia la izquierda, con el caracter indicado la cantidad &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; de veces que sea necesario hasta completar la longitud indicada.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;ljust(longitud, 'caracter_de_relleno')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Similar a rjust() pero completa hacia la derecha.&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;center(longitud, 'caracter_de_relleno')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Similar a rjust() y ljust() pero centrando la cadena.&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/9023974285878579728-2192386599717391918?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/2192386599717391918/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias_6252.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/2192386599717391918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/2192386599717391918'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias_6252.html' title='Python: Guía rápida de referencias (métodos del objeto string)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-1118800428577724392</id><published>2011-06-13T20:18:00.004-03:00</published><updated>2011-06-14T00:23:54.689-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python: Guía rápida de referencias (excepciones)</title><content type='html'>&lt;div class="micss_hidden_post"&gt;&lt;b&gt;Captura de Excepciones&lt;/b&gt;&lt;br /&gt;&lt;div class="micss_codebox"&gt;try:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #algoritmo&lt;br /&gt;&lt;br /&gt;except [(TipoDeExcepcion_1, TipoDeExcepcion_2)]:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #respuesta&lt;br /&gt;&lt;br /&gt;finally:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #algoritmo&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #se puede prescindir de finally ya que no es obligatorio&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/9023974285878579728-1118800428577724392?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/1118800428577724392/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias_6889.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/1118800428577724392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/1118800428577724392'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias_6889.html' title='Python: Guía rápida de referencias (excepciones)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-5321955725154801578</id><published>2011-06-13T20:17:00.002-03:00</published><updated>2011-06-14T00:23:54.690-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python: Guía rápida de referencias (clases, métodos y objetos 2)</title><content type='html'>&lt;div class="micss_hidden_post"&gt;&lt;b&gt;El Método __str__&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;• El método especial __str__, al igual que __init__, se ejecuta de forma automática. &lt;br /&gt;• Facilita a la función print, imprimir una string de forma humanamente legible, cuando se le pasa como parámetro un objeto.&lt;br /&gt;&lt;div class="micss_codebox"&gt;class MiClase:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Constructor de la clase&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def __init__(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; self.nombre = "Juan"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; self.apellido = "Perez"&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def __str__(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; persona = "Apellido y nombre: %s, %s" % (self.apellido, self.nombre)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return persona&lt;br /&gt;&lt;br /&gt;mi_objeto = MiClase()&lt;br /&gt;print mi_objeto&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;La Clase File()&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;• Crear un Archivo para escritura&lt;br /&gt;&lt;div class="micss_codebox"&gt;archivo = open('nombre_del_archivo.txt', '[w|a]')&lt;/div&gt;&lt;br /&gt;• Abrir un Archivo para solo lectura&lt;br /&gt;&lt;div class="micss_codebox"&gt;archivo = open('nombre_del_archivo.txt', 'r')&lt;/div&gt;&lt;br /&gt;• Cerrar un Archivo&lt;br /&gt;&lt;div class="micss_codebox"&gt;archivo.close()&lt;/div&gt;&lt;br /&gt;• Escribir en un Archivo&lt;br /&gt;&lt;div class="micss_codebox"&gt;archivo.write('contenido')&lt;/div&gt;&lt;br /&gt;• Leer un archivo línea por línea&lt;br /&gt;&lt;div class="micss_codebox"&gt;archivo.readline()&lt;/div&gt;&lt;br /&gt;• Leer todo el contenido de un archivo&lt;br /&gt;&lt;div class="micss_codebox"&gt;archivo.readlines()&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/9023974285878579728-5321955725154801578?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/5321955725154801578/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias_9403.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/5321955725154801578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/5321955725154801578'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias_9403.html' title='Python: Guía rápida de referencias (clases, métodos y objetos 2)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-2140884990459125643</id><published>2011-06-13T20:15:00.001-03:00</published><updated>2011-06-14T00:23:54.690-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python: Guía rápida de referencias (clases, métodos y objetos 1)</title><content type='html'>&lt;div class="micss_hidden_post"&gt;&lt;b&gt;Definición de una Clase&lt;/b&gt;&lt;br /&gt;&lt;div class="micss_codebox"&gt;class MiClase:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; atributo = ""&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Constructor de la clase&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def __init__(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; self.otro_atributo = "Atributo de la clase"&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def mi_funcion(self, parametro):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; self.atributo = parametro&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; self.imprimir_atributo()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def imprimir_atributo(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print self.atributo, self.otro_atributo&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Instanciar un objeto&lt;/b&gt;&lt;br /&gt;&lt;div class="micss_codebox"&gt;mi_objeto = MiClase()&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Llamada a métodos de un objeto&lt;/b&gt;&lt;br /&gt;&lt;div class="micss_codebox"&gt;mi_objeto.mi_funcion('Dato del parámetro')&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Extender una clase: herencia&lt;/b&gt;&lt;br /&gt;&lt;div class="micss_codebox"&gt;class MiClase(ClasePadre):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #funciones, atributos...&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/9023974285878579728-2140884990459125643?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/2140884990459125643/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias_7083.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/2140884990459125643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/2140884990459125643'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias_7083.html' title='Python: Guía rápida de referencias (clases, métodos y objetos 1)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-1862550477173104902</id><published>2011-06-13T20:11:00.002-03:00</published><updated>2011-06-14T00:23:54.690-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python: Guía rápida de referencias (funciones propias de uso frecuente)</title><content type='html'>&lt;div class="micss_hidden_post"&gt;&lt;b&gt;range([inicio,] fin[, paso])&lt;/b&gt;&lt;br /&gt;• Devuelve una lista de valores enteros&lt;br /&gt;• Comienza con el valor pasado al parámetro [inicio]&lt;br /&gt;• En caso de omitir este parámetro comienza en cero &lt;br /&gt;• Finaliza con el valor indicado en el parámetro 'fin' sin incluirlo. &lt;br /&gt;• En caso de indicar el parámetro [paso] la lista de valores se incrementa según dicho número, sino se incrementa de uno en uno.&lt;br /&gt;&lt;br /&gt;&lt;div class="micss_codebox"&gt;print range(0, 10, 2) #Salida: [0, 2, 4, 6, 8]&lt;br /&gt;print range(1, 11) #Salida: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]&lt;br /&gt;print range(10) #Salida: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;str(variable)&lt;/b&gt;&lt;br /&gt;• Convierte a string cualquier tipo de dato pasado en el parámetro&lt;br /&gt;&lt;br /&gt;&lt;div class="micss_codebox"&gt;numero = 15.2&lt;br /&gt;tupla = (1, 2, 'Juan Perez')&lt;br /&gt;print str(numero) #Salida: 15.2&lt;br /&gt;print str(tupla) #(1, 2, 'Juan Perez')&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;type(variable)&lt;/b&gt;&lt;br /&gt;• Devuelve el tipo de una variable&lt;br /&gt;&lt;br /&gt;&lt;div class="micss_codebox"&gt;numero = 15.2&lt;br /&gt;tupla = (1, 2, 'Juan Perez')&lt;br /&gt;numero_conv = str(numero)&lt;br /&gt;tupla_conv = str(tupla)&lt;br /&gt;&lt;br /&gt;print type(numero_conv) # Salida: &lt;type 'str'&gt;&lt;br /&gt;&lt;br /&gt;if type(tupla_conv) == str:&lt;br /&gt;print "la variable tupla_conv es una string"&lt;br /&gt;else:&lt;br /&gt;print "algo falló!!!! Qué horror!!!"&lt;br /&gt;&lt;br /&gt;#Salida: la variable tupla_conv es una string&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;dir(variable)&lt;/b&gt;&lt;br /&gt;• Devuelve la lista de métodos de un objeto o de funciones de un módulo&lt;br /&gt;&lt;br /&gt;&lt;div class="micss_codebox"&gt;print dir(range)&lt;br /&gt;#Salida: ['__call__', '__class__', '__cmp__', '__delattr__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__str__'] &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;help(parametro)&lt;/b&gt;&lt;br /&gt;• Devuelve la documentación definida en un módulo, método, función, clase, etc. &lt;br /&gt;&lt;br /&gt;&lt;div class="micss_codebox"&gt;print help(range)&lt;/div&gt;&lt;br /&gt;La salida de lo anterior será:&lt;br /&gt;&lt;div class="micss_codebox"&gt;Help on built-in function range in module __builtin__:&lt;br /&gt;&lt;br /&gt;range(...)&lt;br /&gt;range([start,] stop[, step]) -&gt; list of integers&lt;br /&gt;&lt;br /&gt;Return a list containing an arithmetic progression of integers.&lt;br /&gt;range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.&lt;br /&gt;When step is given, it specifies the increment (or decrement).&lt;br /&gt;For example, range(4) returns [0, 1, 2, 3].  The end point is omitted!&lt;br /&gt;These are exactly the valid indices for a list of 4 elements.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;def mi_funcion():&lt;/b&gt;&lt;br /&gt;&lt;div class="micss_codebox"&gt;""" Esta es la documentación de mi función,&lt;br /&gt;la cual coloco a modo de ejemplo """&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;print help(mi_funcion)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;La salida de lo anterior será:&lt;br /&gt;&lt;div class="micss_codebox"&gt;Help on function mi_funcion in module __main__:&lt;br /&gt;&lt;br /&gt;mi_funcion()&lt;br /&gt;Esta es la documentación de mi función,&lt;br /&gt;la cual coloco a modo de ejemplo&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/9023974285878579728-1862550477173104902?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/1862550477173104902/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias_4718.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/1862550477173104902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/1862550477173104902'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias_4718.html' title='Python: Guía rápida de referencias (funciones propias de uso frecuente)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-3195166475555981903</id><published>2011-06-13T20:07:00.001-03:00</published><updated>2011-06-14T00:23:54.691-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python: Guía rápida de referencias (módulos en Python)</title><content type='html'>&lt;div class="micss_hidden_post"&gt;&lt;b&gt;Módulos&lt;/b&gt;&lt;br /&gt;• Un módulo es un archivo .py el cual puede ejecutarse desde una consola con el comando:&lt;br /&gt;&lt;div class="micss_codebox"&gt;eugenia@cocochito:~$ python mi_modulo.py&lt;/div&gt;&lt;br /&gt;• La forma de insertar un módulo dentro de otro, es mediante la palabra clave reservada import nombre_del_modulo &lt;br /&gt;&lt;div class="micss_codebox"&gt;import mi_modulo&lt;/div&gt;&lt;br /&gt;• Para llamar a una función del módulo importado, se utiliza la siguiente sintaxis:&lt;br /&gt;&lt;div class="micss_codebox"&gt;nombre_del_modulo_importado.funcion()&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/9023974285878579728-3195166475555981903?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/3195166475555981903/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias_659.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/3195166475555981903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/3195166475555981903'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias_659.html' title='Python: Guía rápida de referencias (módulos en Python)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-4957687095414475228</id><published>2011-06-13T20:05:00.001-03:00</published><updated>2011-06-14T00:23:54.691-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python: Guía rápida de referencias (asignando variables)</title><content type='html'>&lt;div class="micss_hidden_post"&gt;&lt;b&gt;Asignaciones Múltiples de Variables&lt;/b&gt;&lt;br /&gt;&lt;div class="micss_codebox"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var1, var2, var3 = valor1, valor2, valor3&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var1, var2, var3 = (valor1, valor2, valor3)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; nombre, apellido, edad = ('Juan', 'Pérez', 23)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var1=var2=var3 = valor&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; a=b=c = 10&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Casos de Uso&lt;/b&gt;&lt;br /&gt;&lt;u&gt;Agrupando asignaciones:&lt;/u&gt;&lt;br /&gt;&lt;div class="micss_codebox"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; personas = [('Juan',23), ('Emilia', 31), ('Raquel', 72)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for nombre, edad in personas:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print "&amp;lt;b&amp;gt;%s&amp;lt;/b&amp;gt; tiene &amp;lt;b&amp;gt;%d&amp;lt;/b&amp;gt; años.&amp;lt;br&amp;gt;" % (nombre, edad)&lt;/div&gt;&lt;br /&gt;La salida de lo anterior será:&lt;br /&gt;&lt;div class="micss_codebox"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Juan tiene 23 años.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Emilia tiene 31 años.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Raquel tiene 72 años.&lt;/div&gt;&lt;br /&gt;&lt;u&gt;Asignaciones múltiples mediante funciones:&lt;/u&gt;&lt;br /&gt;&lt;div class="micss_codebox"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def calcular_precio(monto):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; bruto = monto&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; iva = (monto*21/100)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; neto = bruto+iva&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return (bruto, iva, neto)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bruto, iva, neto = calcular_precio(100)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; linea_divisoria = "-"*20&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "&amp;lt;b&amp;gt;Costo:&amp;lt;/b&amp;gt; $%d&amp;lt;br&amp;gt;&amp;lt;b&amp;gt;IVA:&amp;lt;/b&amp;gt; $%d&amp;lt;br&amp;gt;%s&amp;lt;br&amp;gt;&amp;lt;b&amp;gt;Total:&amp;lt;/b&amp;gt; $%d" % (bruto, iva, linea_divisoria, neto)&lt;/div&gt;&lt;br /&gt;La salida de lo anterior será:&lt;br /&gt;&lt;div class="micss_codebox"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Costo: $100&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IVA: $21&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Total: $121&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/9023974285878579728-4957687095414475228?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/4957687095414475228/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias_553.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/4957687095414475228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/4957687095414475228'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias_553.html' title='Python: Guía rápida de referencias (asignando variables)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-7527072697911075742</id><published>2011-06-13T20:02:00.002-03:00</published><updated>2011-06-14T00:23:54.692-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python: Guía rápida de referencias (formato de texto de salida)</title><content type='html'>&lt;div class="micss_hidden_post"&gt;&lt;b&gt;Concatenar variables dando formato a una String&lt;/b&gt;&lt;br /&gt;Dadas las siguientes variables:&lt;br /&gt;&lt;div class="micss_codebox"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; numero_decimal = 25&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; numero_flotante = 12.8&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cadena_de_texto = "¡Hola Mundo!"&lt;/div&gt;&lt;br /&gt;Podremos unirlas mediante:&lt;br /&gt;&lt;div class="micss_codebox"&gt;concatenacion = "Esta cadena contiene un decimal %d, un flotante %f y una string %s" % (numero_decimal, numero_flotante, cadena_de_texto)&lt;/div&gt;&lt;br /&gt;La salida de lo anterior, al imprimirla será:&lt;br /&gt;&lt;i&gt;Esta cadena contiene un número decimal 25, un número flotante 12.8 y una string ¡Hola Mundo!&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Algunos formatos posibles:&lt;/b&gt;&lt;br /&gt;&lt;div class="micss_codebox"&gt;----------------------------------------------------------------------------&lt;br /&gt;%d&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Decimal (Ejemplos: 10, 15, 174, 1289)&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;%f&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Flotante (Ejemplos: 12.8, 93.74)&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;%10.1f&amp;nbsp; Formateo de flotantes, donde el primer número indica el largo total &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; de caracteres a reservar y el segundo la cantidad de decimales &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (Ejemplo de salida: 93.7)&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;%s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String (Ejemplo: Hola Mundo)&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;%x&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Conversión a hexadecimal &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (Ej.: dada la variable var = 255, la salida sería ff)&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;%o&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Conversión a octal &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (Ej.: dada la variable var = 255, la salida sería 377)&lt;br /&gt;----------------------------------------------------------------------------&lt;br /&gt;%10s&amp;nbsp;&amp;nbsp;&amp;nbsp; Reserva un largo de 10 caracteres de derecha a izquierda&lt;br /&gt;%-10s&amp;nbsp;&amp;nbsp; Reserva un largo de 10 caracteres de izquierda a derecha&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/9023974285878579728-7527072697911075742?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/7527072697911075742/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias_1124.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/7527072697911075742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/7527072697911075742'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias_1124.html' title='Python: Guía rápida de referencias (formato de texto de salida)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-599257457421670437</id><published>2011-06-13T20:00:00.002-03:00</published><updated>2011-06-14T00:23:54.692-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python: Guía rápida de referencias (declaración de funciones)</title><content type='html'>&lt;div class="micss_hidden_post"&gt;&lt;b&gt;Definición de Funciones&lt;/b&gt;&lt;br /&gt;&lt;div class="micss_codebox"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def nombre_funcion(param1, param2):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; suma = param1+param2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return suma&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;print nombre_funcion(10, 10) #Salida: 20&lt;/div&gt;&lt;br /&gt;&lt;div class="micss_codebox"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def nombre_funcion(param1, param2, parametro_por_defecto=15):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; suma = param1+param2+parametro_por_defecto&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return suma&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;print nombre_funcion(10, 10) #Salida: 35&lt;/div&gt;&lt;br /&gt;&lt;div class="micss_codebox"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def nombre_funcion(param1, param2, *parametros_variables):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; suma = param1+param2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for parametro in parametros_variables:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; suma += parametro&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return suma&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;print nombre_funcion(10, 10, 1, 1, 1) #Salida: 23&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/9023974285878579728-599257457421670437?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/599257457421670437/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias_4141.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/599257457421670437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/599257457421670437'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias_4141.html' title='Python: Guía rápida de referencias (declaración de funciones)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-7107689108229909803</id><published>2011-06-13T19:57:00.002-03:00</published><updated>2011-06-14T00:23:54.693-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python: Guía rápida de referencias (condicionales, bucles e iteraciones)</title><content type='html'>&lt;div class="micss_hidden_post"&gt;&lt;b&gt;Condicional if&lt;/b&gt;&lt;br /&gt;&lt;div class="micss_codebox"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if condicion:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ....&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; elif condicion:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Bucle while&lt;/b&gt;&lt;br /&gt;&lt;div class="micss_codebox"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while n1&amp;lt;=n2:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Bucle for in&lt;/b&gt;&lt;br /&gt;&lt;div class="micss_codebox"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; tupla = ('Juan Perez', 25, 1.74)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for elemento in tupla:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print elemento&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Break y Pass&lt;/b&gt;&lt;br /&gt;&lt;div class="micss_codebox"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; tupla = ('Juan Perez', 25, 1.74, 12, 7.8, 'Otro Dato')&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for elemento in tupla:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if elemento != 'Otro Dato':&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print elemento&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; break #corta el bucle&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for elemento in tupla:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if elemento == 25:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; pass #continúa sin hacer nada&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print elemento&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &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/9023974285878579728-7107689108229909803?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/7107689108229909803/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias_9841.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/7107689108229909803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/7107689108229909803'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias_9841.html' title='Python: Guía rápida de referencias (condicionales, bucles e iteraciones)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-5775139860005237072</id><published>2011-06-13T19:55:00.002-03:00</published><updated>2011-06-14T00:23:54.693-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python: Guía rápida de referencias (operadores)</title><content type='html'>&lt;div class="micss_hidden_post"&gt;&lt;b&gt;Operadores Matemáticos&lt;/b&gt;&lt;br /&gt;&lt;div class="micss_codebox"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; +&amp;nbsp;&amp;nbsp; suma&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;nbsp;&amp;nbsp; resta&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp;&amp;nbsp; multiplicación&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;nbsp;&amp;nbsp; división de flotantes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp; división de enteros&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; %&amp;nbsp;&amp;nbsp; resto de una división&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; **&amp;nbsp; exponenciación&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Operadores Relacionales&lt;/b&gt;&lt;br /&gt;&lt;div class="micss_codebox"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ==&amp;nbsp;&amp;nbsp; Igual que&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; !=&amp;nbsp;&amp;nbsp; Distinto que&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Menor que&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;=&amp;nbsp;&amp;nbsp; Menor o igual que&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mayor que&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;=&amp;nbsp;&amp;nbsp; Mayor o igual que&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Operadores Lógicos&lt;/b&gt;&lt;br /&gt;&lt;div class="micss_codebox"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; and&amp;nbsp;&amp;nbsp; (y)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; or&amp;nbsp;&amp;nbsp;&amp;nbsp; (o)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; not&amp;nbsp;&amp;nbsp; (no)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if a==b and (b==c or c==a):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if not a==b:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ...&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/9023974285878579728-5775139860005237072?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/5775139860005237072/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias_13.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/5775139860005237072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/5775139860005237072'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias_13.html' title='Python: Guía rápida de referencias (operadores)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-4807618102020975200</id><published>2011-06-13T19:52:00.001-03:00</published><updated>2011-06-14T00:23:54.694-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python: Guía rápida de referencias (tuplas, listas y diccionarios)</title><content type='html'>&lt;div class="micss_hidden_post"&gt;&lt;b&gt;Tuplas&lt;/b&gt;&lt;br /&gt;• Una tupla es una variable que permite almacenar varios datos inmutables (no pueden ser modificados una vez creados) de tipos diferentes:&lt;br /&gt;&lt;div class="micss_codebox"&gt;mi_tupla = ('cadena de texto', 15, 2.8, 'otro dato', 25)&lt;/div&gt;&lt;br /&gt;• Se puede acceder a cada uno de los datos mediante su índice correspondiente:&lt;br /&gt;&lt;div class="micss_codebox"&gt;print mi_tupla[1] # Salida: 15&lt;/div&gt;&lt;br /&gt;• También se puede acceder a una porción de la tupla, indicando (opcionalmente) desde el índice de inicio hasta el índice de fin:&lt;br /&gt;&lt;div class="micss_codebox"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print mi_tupla[1:4] # Devuelve: (15, 2.8, 'otro dato')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print mi_tupla[3:] # Devuelve: ('otro dato', 25)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print mi_tupla[:2] # Devuelve: ('cadena de texto', 15)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;• Otra forma de acceder a la tupla de forma inversa (de atrás hacia adelante), es colocando un índice negativo:&lt;br /&gt;&lt;div class="micss_codebox"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print mi_tupla[-1] # Salida: 25&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print mi_tupla[-2] # Salida: otro dato&lt;/div&gt;&lt;br /&gt;• Las tuplas son inmutables: no permiten modificar los datos una vez creados ni agregar datos nuevos:&lt;br /&gt;&lt;div class="micss_codebox"&gt;mi_tupla[2] = 3.8 # da un error&lt;/div&gt;&lt;br /&gt;• Con la función len(mi_tupla) podremos conocer la cantidad de datos almacenados en la tupla:&lt;br /&gt;&lt;div class="micss_codebox"&gt;print len(mi_tupla) # Salida: 5&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Listas&lt;/b&gt;&lt;br /&gt;• Una lista es similar a una tupla con la diferencia fundamental de que permite modificar los datos una vez creados&lt;br /&gt;&lt;div class="micss_codebox"&gt;mi_lista = ['cadena de texto', 15, 2.8, 'otro dato', 25]&lt;/div&gt;&lt;br /&gt;• Las lista NO son inmutables: permiten modificar los datos una vez creados:&lt;br /&gt;&lt;div class="micss_codebox"&gt;mi_lista[2] = 3.8 # permite modificar el dato&lt;/div&gt;&lt;br /&gt;• A las listas se accede igual que a las tuplas:&lt;br /&gt;&lt;div class="micss_codebox"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print mi_lista[1] # Salida: 15&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print mi_lista[1:4] # Devuelve: [15, 2.8, 'otro dato']&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print mi_lista[-2] # Salida: otro dato&lt;/div&gt;&lt;br /&gt;• Con la función len(mi_lista) podremos conocer la cantidad de datos almacenados en la lista:&lt;br /&gt;&lt;div class="micss_codebox"&gt;print len(mi_lista) # Salida: 5&lt;/div&gt;&lt;br /&gt;• Las listas, a diferencia de las tuplas, permiten agregar nuevos valores:&lt;br /&gt;&lt;div class="micss_codebox"&gt;mi_lista.append('Nuevo Dato')&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Diccionarios&lt;/b&gt;&lt;br /&gt;• Mientras que a las listas y tuplas se accede solo y únicamente por un número de índice, los diccionarios permiten utilizar una clave para declarar y acceder a un valor:&lt;br /&gt;&lt;div class="micss_codebox"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mi_diccionario = {'clave_1':valor_1, 'clave_2':valor_2, 'clave_7':valor_7}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print mi_diccionario['clave_2'] # Salida: valor_2&lt;/div&gt;&lt;br /&gt;• Un diccionario permite eliminar cualquier entrada:&lt;br /&gt;&lt;div class="micss_codebox"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; del(mi_diccionario['clave_2']) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # elimina clave_2 del diccionario produciendo como resultado: mi_diccionario = {'clave_1':valor_1, 'clave_7':valor_7}&lt;/div&gt;&lt;br /&gt;• Al igual que las listas, el diccionario permite modificar los valores&lt;br /&gt;&lt;div class="micss_codebox"&gt;mi_diccionario['clave_1'] = 'Nuevo Valor'&lt;/div&gt;&lt;br /&gt;• Con la función len(mi_diccionario) podremos conocer la cantidad de pares (clave:valor) almacenados en el diccionario:&lt;br /&gt;&lt;div class="micss_codebox"&gt;print len(mi_diccionario) # Salida: 2&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/9023974285878579728-4807618102020975200?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/4807618102020975200/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/4807618102020975200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/4807618102020975200'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias.html' title='Python: Guía rápida de referencias (tuplas, listas y diccionarios)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-8685428684302870944</id><published>2011-06-13T19:46:00.002-03:00</published><updated>2011-07-18T02:09:27.725-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python: Guía rápida de referencias (lo básico)</title><content type='html'>&lt;div class="micss_hidden_post"&gt;&lt;b&gt;Imprimir en Pantalla&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: python"&gt;print "¡Hola Mundo!"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Comentarios&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: python"&gt;# Esto es un comentario de una línea&lt;br /&gt;&lt;br /&gt;""" Esto es un comentario&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; de varias líneas """&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Definición de Variables&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: python"&gt;# Enteros: &lt;br /&gt;edad = 32&lt;br /&gt;&lt;br /&gt;# Flotantes: &lt;br /&gt;precio = 144.75&lt;br /&gt;&lt;br /&gt;# Booleano: &lt;br /&gt;habilitado = false&lt;br /&gt;&lt;br /&gt;# Strings: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pais1 = "Reino Unido"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pais2 = 'República Argentina'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strings_concatenadas = pais1+pais2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; string_repetida = "Esto se imprime 3 veces. "*3&lt;/div&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-8685428684302870944?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/8685428684302870944/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias-parte.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/8685428684302870944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/8685428684302870944'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/python-guia-rapida-de-referencias-parte.html' title='Python: Guía rápida de referencias (lo básico)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-4000032684970616069</id><published>2011-06-01T06:00:00.001-03:00</published><updated>2011-07-22T17:18:26.533-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CC BY NC ND'/><category scheme='http://www.blogger.com/atom/ns#' term='GNU'/><category scheme='http://www.blogger.com/atom/ns#' term='Aviso Legal'/><category scheme='http://www.blogger.com/atom/ns#' term='Cretive Commons'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Libre'/><category scheme='http://www.blogger.com/atom/ns#' term='safeCreative'/><category scheme='http://www.blogger.com/atom/ns#' term='LGPL'/><title type='text'>Aviso Legal - Contenido Libre</title><content type='html'>&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: large;"&gt;Sobre el material bibliográfico, literario, artículos y notas publicadas&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://creativecommons.org/licenses/by-nc-nd/2.5/ar/" imageanchor="1" style="clear: left; float: left; margin-bottom: 1px; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" src="http://i.creativecommons.org/l/by-nc-nd/3.0/88x31.png" /&gt;&lt;/a&gt;&lt;/div&gt;El contenido es &lt;b&gt;LIBRE&lt;/b&gt;. Todo el material literario (excluyendo libros y artículos escritos por terceras personas) es de &lt;b&gt;libre copia, publicación y distribución&lt;/b&gt;&amp;nbsp;y se encuentra publicado bajo licencia &lt;b&gt;Creative Commons BY-NC-ND&lt;/b&gt;. &lt;a href="http://creativecommons.org/licenses/by-nc-nd/2.5/ar/" target="_blank"&gt;Más acerca de sus derechos &amp;gt;&amp;gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: large;"&gt;Sobre las librerías, software y otros códigos fuente&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.gnu.org/licenses/lgpl.html" imageanchor="1" style="clear: left; float: left; margin-bottom: 1px; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-2dBUpjJhstY/TinTU7UHK9I/AAAAAAAAA4Y/oLnWqLFAlHU/s1600/LogoLGPLv3.png" /&gt;&lt;/a&gt;&lt;/div&gt;Todo el código fuente publicado en este blog, así como librerías, scripts, snippets, software, aplicaciones, etc. es &lt;b&gt;Software Libre&lt;/b&gt;. &lt;a href="http://www.es.gnu.org/Software_Libre" style="clear: right; float: right; margin-bottom: 1px; margin-left: 1em;" target="_blank"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-JN4-c5wqc7s/TinSXlcRuOI/AAAAAAAAA4U/wPn0PUZBDjE/s200/535px-Heckert_GNU_white.png" style="width: 100px;" /&gt;&lt;/a&gt;Usted es libre de utilizar dichos códigos fuente para sus aplicaciones, copiarlo, publicarlo, distribuirlo, mejorarlo, etc. ya que se encuentra publicado bajo licencia pública &lt;b&gt;GNU LGPL v3&lt;/b&gt;. Queda exento el código fuente publicado por terceras personas o aquel que simplemente no es de mi autoría, excepto que el autor, especifique lo contrario. &lt;a href="http://www.gnu.org/licenses/lgpl.html" target="_blank"&gt;Más acerca de sus derechos &amp;gt;&amp;gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-family: 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: large;"&gt;Sobre la garantía de sus derechos&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://www.safecreative.org/user/eugeniabahit" imageanchor="1" style="clear: left; float: left; margin-bottom: 1px; margin-right: 1em;" target="_blank"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-dHLiJrf1ZVM/TinVtljb_uI/AAAAAAAAA4c/KtZS5Olt8l0/s200/safecreative.jpg" style="width: 150px;" /&gt;&lt;/a&gt;&lt;/div&gt;Sus derechos de libre copia, publicación y distribución, así como el de acceder GRATUITAMENTE al material publicado, se encuentran amparados por el registro del material bajo las licencias mencionadas en &lt;b&gt;safeCreative&lt;/b&gt;. &lt;a href="https://www.safecreative.org/user/eugeniabahit" target="_blank"&gt;Más acerca de estas garantías &amp;gt;&amp;gt;&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-4000032684970616069?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/4000032684970616069/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/aviso-legal-contenido-libre.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/4000032684970616069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/4000032684970616069'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/06/aviso-legal-contenido-libre.html' title='Aviso Legal - Contenido Libre'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-2dBUpjJhstY/TinTU7UHK9I/AAAAAAAAA4Y/oLnWqLFAlHU/s72-c/LogoLGPLv3.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9023974285878579728.post-2459658414519688270</id><published>2011-01-31T16:05:00.000-03:00</published><updated>2011-10-06T16:10:48.942-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Steve Job'/><category scheme='http://www.blogger.com/atom/ns#' term='tecnología'/><category scheme='http://www.blogger.com/atom/ns#' term='Off Topic'/><title type='text'>Discurso de Steve Jobs en la Universidad de Stanford (2005)</title><content type='html'>&lt;blockquote&gt;[...]Today I want to tell you three stories from my life. That's it. No big deal. Just three stories[...]&lt;br /&gt;&lt;/blockquote&gt;&lt;b&gt;&lt;a href="http://news.stanford.edu/news/2005/june15/jobs-061505.html"&gt;Texto completo [+]&lt;/a&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9023974285878579728-2459658414519688270?l=eugeniabahit.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eugeniabahit.blogspot.com/feeds/2459658414519688270/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://eugeniabahit.blogspot.com/2011/01/discurso-de-steve-jobs-en-la.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/2459658414519688270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9023974285878579728/posts/default/2459658414519688270'/><link rel='alternate' type='text/html' href='http://eugeniabahit.blogspot.com/2011/01/discurso-de-steve-jobs-en-la.html' title='Discurso de Steve Jobs en la Universidad de Stanford (2005)'/><author><name>Eugenia Bahit</name><uri>https://profiles.google.com/104151223595939241834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-iGu5aKJsUPI/AAAAAAAAAAI/AAAAAAAAA54/kW0uVdPxaWY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
