feb 17 2011

Quomai

tatai

Con este nombre, es como hemos bautizado a este nuevo proyecto y aventura en el que nos hemos metido. Quomai.

Logo de Quomai

Queremos que suene mucho y fuerte entre todos vosotros y estamos trabajando muy duro para que en breve veáis la idea en funcionamiento.

Y así para empezar… os gusta el nombre? Y el logo?

Stay tuned!

Estos son algunos de los sitios donde daremos guerra:


nov 2 2010

Slides and links from PHPConference 2010

tatai

Polling #pbc10 at Twitter during PHPConference and Googling later on I have compile all these links from each talk, trying to find at least twitter account, blog and slide links from each talk and presenter.

I know it is not complete, but it will be as soon as I can.

If you know any other source or find a broken link, please comment post or  tweet me and I will update this list.

Hope it is useful.

Hidden features of PHP by Ilia Alshanetsky

APC & Memcached the High Performance Duo by Ilia Alshanetsky

A new approach to object persistence in PHP by Stefan Priebsch

Split A/B Testing Database-driven PHP Web Applications by Kuassi Mensah

‘In search of…’ – integrating site search systems by Ian Barber

How to scale PHP applications by Enrico Zimuel

Cloud computing with PHP and Azure by David Salgado

Design patterns… revisited for PHP 5.3 by Fabien Potencier

PHP in the Enterprise: Develop and Deploy Mission Critical Applications by Kuassi Mensah


Graphs in the database: RDBMS in the social networks age by Lorenzo Alberton

Cómo involucrarse con PHP by Yago Ferrer

Real-time Communication Techniques with PHP by Scott Mattocks

Demystifying PostgreSQL by Asher Snyder

Database version control without pain by Harrie Verveer

PHP for Android: Scripting PHP en Android by Ivan Mosquera

Scaling Magento by Fernando Palomo

Continuous Improvement in PHP projects by Thorsten Rihnne

iPhone Websites with PHP by Markus Franz (speaker could not arrive on time, this talk took place instead:)
PHP Code audits by Damien Seguy

Distributed Source Code Management by Hugh Gilmour

Varnish in action by Thijs Feryn

Architecture and testability by Giorgio Sironi

Comet: By Pushing Server Data, We Push the Web Forward by Philip Ross

Doctrine 2.0 by Juozas Kaziukenas

Lemur Framework by Javier Linares & Paulo Oliveira

Service Oriented Architecture: a good thing to do by Jan Willem Eshuis

Mondongo, un ODM para PHP y MongoDB by Pablo Díez

SCRUM al detalle: Revisión práctica y perversiones humanas by Carlos Buenosvinos

MySQL client caching by Johannes Schlüter

Desarrollo de aplicaciones para Facebook en PHP by Victor Castell

PHP Team organisation by Damien Seguy

PHP through the eyes of a hoster by Thijs Feryn

High Performance WebApps Faster & Easier with NOLOH by Asher Snyder



oct 31 2010

PHP Conference 2010. Día 2

tatai

Y como todo lo bueno siempre se acaba, la PHP Conference 2010 ha dado cerrojazo.

No sin polémica ya que el ganador de la XBOX del sorteo general se llevó también el iPad del sorteo de emagister… la suerte está mal repartida :p (hay que aclarar que el sorteo ha sido legal y a la vista de todos, hay poco que añadir a parte de que la mecánica pueda -posiblemente- cambiarse para el año que viene y unir ambos sorteos).

Y esta fue la elección para el segundo día. Creo que bastante más acertada que el primer día, aunque con alguna decepción:

  • Graphs in the database: RDBMS in the social networks age by Lorenzo Alberton
  • APC & Memcached: the high performance duo by Ilia Alshanetsky
  • Database version control without pain by Harrie Verveer
  • Continuous Improvement in PHP projects by Thorsten Rihnne
  • PHP Team organisation by Damien Seguy

Seguidamente, un resumen de cada una de ellas.

Graphs in the database: RDBMS in the social networks age by Lorenzo Alberton

De nuevo, tras haber ya asistido el año pasado a otra charla magistral, otra interesantísima chala de Lorenzo sobre grafos, árboles y bases de datos. Esta vez centrada en dos puntos, las CTE (Common Table Expressions) y Window Functions.

Pese a ser una charla compleja debido a que la presentación se basa en ejemplos SQL y en la teoría, Lorenzo realiza un esfuerzo inhumano para hacerlo entendible desde un primer momento. Además, este año mostró ejemplos reales y concretos que todos conocíamos en la web y que nos destripó a nivel de base de datos.

Tras una breve introducción a los gráficos y sus componentes nos mostró diversas soluciones posibles a la hora de plantear una estructura de árbol en una base de datos a la que seguro que todos nos hemos enfrentado alguna vez. Tras unos consejos básicos de rendimiento y eficiencia y demostrar como realizar cualquier tipo de consulta que abarcara más de un nivel (por ejemplo coger los hijos hasta n niveles), mostró las CTE gracias a WITH (y WITH RECURSIVE). Como si de una función o proceso almacenado se tratase pero viviendo únicamente en el momento de la ejecución, con sus partes bien diferenciadas (inicialización, recursividad y llamada), nos mostró ejemplos desde la clásica sucesión de Fibonacci hasta cómo se pueden encontrar combinaciones de vuelo o transporte mediante varios saltos, los grados de separación en LinkedIn, cómo encontrar los contactos (de camino mínimo) entre tú y otra persona o los “quizás conozcas”. Todos estos últimos ejemplos usando Transitive Closures.

También nos mostró como a veces técnicas como esta pueden ser un embrollo y un simple INTERSECT puede solucionar el problema de una forma muy sencilla y rápida.

El segundo caso, las Window Functions (SQL-2003) que nos permiten agrupar cierto número de filas que tienen una relación y extraer datos concretos (por ejemplo, una media de salarios por departamento) y usar ese dato para cada fila, pero sin agruparlas ya que perderíamos cada usuario, es decir, sin usar un GROUP BY. La sintaxis es bastante liosa en un inicio y mucho más potente de lo que a primeras aparenta pero sin duda, gracias a ciertas funciones complementarias, con aplicaciones muy interesantes como poder extraer en una misma petición lo datos completos de venta un día y también agrupados por usuario o los datos agrupados y paginados de los contactos telefónicos.

Por último nos llamó a la reflexión ante qué debe ser bueno ejecutar sobre base de datos y que no ya que se puede ver con los ejemplos como podemos quitar carga de procesado en la parte de aplicación, eliminando conexiones y RTT entre la base de datos y la aplicación, pero que ello conlleva sobrecargar la base de datos.

APC & Memcached: the high performance duo by Ilia Alshanetsky

La charla empezó la charla dando cuál iba a ser el slogan: “Slide motto: not everything has to be real-time”. Y lo siguiente en darme cuenta fue que es realmente un crack y que su trepidante velocidad y conocimiento hace que perderte unos segundos escribiendo algo en el portátil puede hacer que te pierdas gran parte de un slide.

La estructura de la charla en mi opinión fue perfecta: breve introducción de las aplicaciones y cómo instalarlas (que estoy seguro que eran conocidas para la amplia mayoría de los asistentes) y tras esto, una serie de consejos, buenas prácticas y trucos de cada una de ellas. Eso sí, yo creo que el oxígeno se lo inyectaba, porque no creo que le diese tiempo a respirar entre frase y frase, jeje.

En cuanto a APC, lo primero a tener en cuenta es que tenemos el cacheo propio y transparente que hace de los opcodes, con la consecuente mejora de rendimiento que conlleva y que además podemos usar para cachear datos en shared memory. Y lo más importante, lo que se cachea no es el valor, sino el propio opcode. La ventaja de este método es radical ya que si comparamos con un método trandicional de cacheo mediante serialización de datos (aunque sea binario), siempre hay que realizar la propio acción de serialización y deserialización, desmaterializando y materializando los objetos, mientras que APC cachea el propio opcode, el dato en sí, algo que es mucho más rápido y efectivo.

Otros trucos: cómo saber cuando apc_fetch nos ha devuelto información o no y es gracias a un segundo parámetro que tenemos que pasar por referencia ya que lo que se retorna es el dato y puede ser cualquiera de los valores posibles (null, true, false, array, objeto…) por lo tanto necesitamos un punto de referencia.

Y como consejo muy importante, evitar todo lo posible el borrado de caché: “Don’t delete: deleting from cache is expensive as it may need to re-structure internal hash tables”. A veces el mejor borrar todos los datos de un usuario que un dato concreto debido a todo el proceso que puede desencadenar.

Como contra, APC es un sistema de cache única y exclusivamente para PHP, nadie más puede usarlo y es local, no distribuído, lo que limita su radio de acción.

En cuanto a memcached, lo primero que nos hizo notar fue la necesidad de usar la extensión de Andrei Zmievski y no la otra existente que no lleva d al final ya que la diferencia y mejoras es notable: serialización binaria mediante igbinary, compresión fastlz, interface multiservidor y soporte ante fallos de caídas.

Con esta extensión, tenemos (entre otras muchas cosas, a destacar):

  • getResultCode() para saber si hemos recuperado un ejemplo o no (comparándolo con MemCached::RES_SUCCESS)
  • podemos asignar y recuperar varios valores simultáneamente con [get|set]Multi()
  • se pueden añadir varios servidores son prioridad o balanceo usando addServers() y el tercer parámetro para cada servidor
  • podemos segmentar información indicando el servidor concreto donde se almacenará (sin dejar que memcached decida) gracias a [add|get|set|delete]ByKey()
  • segmentar varios datos a la vez [add|get|set|delete]MultiByKey()
  • utilizar contadores atómicos increment() y decrement()

Y por último, destacar el hecho de poder pedir datos de forma retardada (delayed fetch) de modo que nuestra aplicación no tenga que esperar, sino que puede hacerlo más tarde, continuando con la ejecución de nuestra aplicación. Lo que hay que tener muy en cuenta es que la información es probable que no venga en orden.

Database version control without pain by Harrie Verveer

Tengo que decir que esta charla me defraudó mucho. Con un título tan potente ante un tema que realmente da muchos quebraderos de cabeza, no esperaba que diese el quid que solucionase completamente el problema (algo que parece que sí dice el título o eso esperábamos todos los presentes), pero sí que parecía algo importante.

Pero más allá de la realidad,  nos dio varias de las herramientas que actualmente existen y que intentan facilitar el trabajo y declarar que el problema es muy importante y hay que llevarlo con cautela. Sí que me quedo con una frase que me parece muy importante: “Never modify a patch file once it is version control”. Es decir, en caso de que hagas un patch file y tenga un error, no debes corregir ese, sino crear “el patch del patch” que lo solucione.

Estas son las herramientas recomendadas:

En las preguntas finales: el propio ponente declaró que su estrategia es un “homebrew script” aunque otros equipos en su empresa usan DB deploy y parecen estar muy contentos.

Continuous Improvement in PHP projects by Thorsten Rihnne

En esta charla en primer lugar se mostró cómo un código que se mejora constantemente funciona mucho mejor, demostrando además como técnicas ágiles y la integración continua van de la mano. Tras mostrar estos conceptos muy relacionados principalmente con scrum, se mostraron una serie de herramientas desarrolladas en su empresa (o mejoradas) que ayudan a la hora de controlar un proyecto e intentar que mejore.

Las aplicaciones que se mostraron fueron:

PHP Team organisation by Damien Seguy

De manos del genial Damien Seguy asistimos a una charla sobre cómo realizar gestión de equipos, mejorar su implicación y como gestionar impedimentos. Fueron muchos los consejos, pero podemos resumirla en la siguiente lista que se explica por sí sola:

  • Weekly meeting
    • Discussion of future stuff
    • Specific training on tools, methods
    • Read indicators (audits, PI, ec)
    • Review reference documents
    • One question each (helps prepare for the meeting
  • Name domain gurus
    • Create domain experts
    • Specific domain
    • Unit test, IHM, database
    • Willing team member
    • Name it after he has taken the responsability
  • Healthy competition
    • Number of unit tests
    • Lines of codes
    • Number of methods
    • Number of commits
  • Learn to say no
  • 5 minutes meeting daily
  • Short cycles
  • References
  • PHP Mantra: short version of conventions
  • Evangelize
  • Name your teams/projects
  • Tag your code
  • Cross audits

oct 29 2010

PHP Conference 2010. Día 1

tatai

Tras terminar el primer día, voy a dar un pequeño repaso de las charlas en las que he estado. De entre todas las charlas disponibles, yo he elegido estas:

  • Doctrine 2.0 by Juozas Kaziukenas
  • Distributed Source Code Management by Hugh Gilmour
  • Varnish in action by Thijs Feryn
  • PHP in the Enterprise: Develop and Deploy Mission Critical Applications by Kuassi Mensah
  • Desarrollo de aplicaciones para Facebook en PHP by Victor Castell
  • Architecture and testability by Giorgio Sironi
  • Comet: by pushing server data, we push the web forward by Philip Ross

De primeras, con lo que he visto y he podido leer en twitter, tengo que decir que parece que he cogido las más “divulgativas” y yo he venido con bastantes ganas de ver cosas nuevas o por lo menos ver código y aplicaciones.

Ahora, un breve resumen de cada una de ellas.

Doctrine 2.0 by Juozas Kaziukenas

Un repaso por lo que va a ser Doctrine 2.0, tanto por las nuevas características que tendrá como por comparación con Doctrine 1.x. La versión actual de Doctrine, pese a ser lento, tener un alto uso de memoria (principalmente por un uso cíclico de referencias), su “magia” y otros problemas como la dificultad de ejecutar “raw” SQL, sigue siendo el mejor ORM para PHP hoy en día y por ello Doctrine 2 tendrá esas funcionalidades (y más) aunque cambiará la forma de hacerlo.

Reescrito completamente para PHP 5,3, con una nueva API simplificada y muchas mejoras de rendimiento es la tarjeta de visita de esta nueva versión.

Además, se divide en 4 módulos: Common, DBAL (DB Abstraction Layer), ORM y ODM (Object Document Layer). Este último permitirá trabajar con motores NoSQL, otra de las nuevas características.

Una interesante charla de introducción a lo que va a ser Doctrine 2.

Distributed Source Code Management by Hugh Gilmour

La charla tuvo dos partes diferenciadas, la primera fue una revisión del distinto software usado a lo largo del tiempo para realizar control de código y la segunda fue una comparación entre git, bazaar y mercurial.

Desde mi punto de vista, la parte más interesante fue la segunda, aunque fue algo particular ya que no se basaba únicamente en compararlos desde el punto de vista de cómo se realizan las revisiones, o las características de los branches y merges, sino también dio las herramientas que se usan para todos ellos, soporte de IDEs e incluso bugtrackers e integración contínua. Muy interesante para analizar estas diferencias que en más de un caso, pueden ser muy importantes.

De todas formas, me quedo con perlas dichas por Hugh como “Simplest option is always the best” y “Work at the level of the least technical person in the project”. La primera porque es una máxima que creo que hay que seguir siempre, sobre todo en el desarrollo de software como buen principio y la segunda porque a la hora de elegir cualquier opción, el factor humano y profesional debe tenerse en cuenta, que no quiere decir que haya que poner lo más simple (que no sencillo), sino lo que se adapte mejor, hay que buscar lo mejor.

Varnish in action by Thijs Feryn

Presentación que muestra las posibilidades de Varnish, aunque sin profundizar demasiado en el producto. Se muestran muchas de los comandos y configuraciones que nos permiten configurar la aplicación considerando que la principal aplicación de Varnish es la de caching.

Creo que aunque se intentaba mostrar toda la potencia del servicio, que realmente parece muy potente, a la vista de cómo es la configuración, principalmente mediante comandos y subrutinas en ficheros, realmente esconde un entorno bastante complicado de configurar.

Una charla muy rápida (casi 100 transparencias en 50 minutos) a nivel visual fue difícil de seguir debido al ritmo tan trepidante impuesto por Thijs que aclaró desde un primer momento que no tenía perfil técnico, algo que se echó de menos en algunos momentos.

PHP in the Enterprise: Develop and Deploy Mission Critical Applications by Kuassi Mensah

Charla muy marcada por la presencia de Oracle (recordemos que el Platinum partner) en la que se mostraba algunas de las características que provee Oracle como base de datos en los cambios entre entornos, facilitando distintas aplicaciones y el cambio.

Desarrollo de aplicaciones para Facebook en PHP by Victor Castell

Esta charla/taller estaba dividida en dos (algo que no estaba muy claro en el programa ya que tan sólo estaba en dos sesiones separadas por uno de los descansos largos) y sólo pude asistir a la primera parte.

La idea era buena puesto que se quería mostrar cómo realizar una aplicación en PHP para Facebook y de hecho, para avanzar en el proceso y hacerlo más sencillo, creo que la forma de realizarla no estuvo nada organizada, lo que provocó que en los 50 minutos que estuve en la charla, apenas se dieron los conceptos básicos, haciendo principal hincapié en las condiciones de uso de Facebook, los problemas que tiene el desarrollo en Facebook (latencias, caídas, cambios en la API, etc) y en que hay que buscar la aplicación que se interesante para el cliente. Pero el tiempo empleado por ejemplo en dar de alta la aplicación en Facebook (pudieron ser tranquilamente 3o minutos) me pareció excesiva y poco fructífera ya que, exceptuando un par de conceptos que sí que es necesario explicar y aclarar, el resto se podía suponer de una forma bastante clara.

Si a todo esto unimos que la sala estaba realmente hasta arriba y era la pequeña pequeña (estaríamos unas 60 personas de pie), pues no pude probar nada y esperaré a que cuelguen el enlace y la presentación para poder trastear algo. Algo más de organización hubiese venido muy bien y al menos salvaron los problemas técnicos que no tuvieron que ver con ellos de forma magistral.

Architecture and testability by Giorgio Sironi

Interesante conferencia a manos de Giorgio sobre la importancia del buen código y del testeo. Se centró en estos cuatro puntos principalmente: “Do dependency injection”, “Avoid static methods”, “Law of Demeter” y “Singleton vs. Factory”.

Aunque creo que se extendió demasiado para explicar algunos conceptos que se veía que controlaba y haber dado más ejemplos creo que le hubiese ayudado más.

Sin lugar a dudas, me quedo con estas dos perlas: “Easy to test means easy to maintain” y “When tests are difficult to write, change the design to ease testing (listen to your tests)”

Comet: by pushing server data, we push the web forward by Philip Ross

Excelente presentación de la gente de NOLOH sobre las ventajas de comet, aunque desde un punto de vista muy superficial. Me ha gustado bastante la parte en la que han hecho especial énfasis en la historia de la tecnología y su futuro por ejemplo con WebSockets, aunque los navegadores pondrán muchas trabas a no ser que mejore el asunto.

Debido a problemas técnicos iniciales y a la saturación de la conexión a internet, la charla fue más corta de lo esperado y sin ejemplos prácticos que se echaron en falta.

Finalmente mostraron algo de NOLOH Framework aunque nos quedamos con las ganas de ver más cosas interesantes.

Update: continúa leyendo el día 2


oct 29 2010

PHPConference 2010

tatai

Y de nuevo este año me he venido el 29 y 30 de octubre a disfrutar de la PHPConference a Cornellà, Barcelona. Tras el muy buen sabor de boca del año pasado, era necesario repetir porque las conferencias no pintan nada mal. Quizás menos “grandes nombres” en el cartel, pero ni mucho menos parece que va a desmerecer.

En breve lo comprobaremos.

Mis reviews del año pasado:

Update: ya disponible el review del primer día

Update: y el del segundo

Update: y el listado de slides y datos de conferenciantes


oct 21 2010

Problemas con Internet Explorer y hover (css)

tatai

La semana pasada uno de nuestros clientes nos puso un problema sobre la mesa que nos ha traído de cabeza unos días. El problema en cuestión era que diversas páginas de su web, que eran pesadas (incluso podemos decir que muy pesadas ya que algunas tenían 4 megas de HTML, pero otras 8, 13 y hasta 15), tenían un problema de rendimiento bastante grave.

Poniendo en contexto, una vez cargadas esas páginas, es decir, no teniendo en cuenta el tiempo que necesita el navegador para descargar la página ni el tiempo para renderizarla al completo, con su javascript, cuando navegamos por la página, Internet Explorer (7 y 8, con la 6 no tanto) empieza a cargar la máquina, subiendo el uso de CPU hasta el 100% durante varios segundos y haciendo imposible la navegación, hasta tal punto que no sólo afectaba al scroll sino que incluso cuando desplazamos el cursor por la página el simple hecho de ponernos encima de un enlace, llegaban a pasar segundos hasta que el cursor cambiaba desde la tradicional flecha al cursor:pointer característico en cada sistema operativo y navegador.

Por no hablar del tiempo de respuesta ante los scripts o cualquier evento. Inviable.

Detallar todo el proceso que seguimos nos daría para varios posts y varias páginas, pero bueno, habiendo descartando completamente que el problema fuese javascript o el framework que se usaba (en este caso jQuery), el problema parecía estar en el tamaño de página porque cuando se reducía su tamaño los problemas desaparecían y también en la hoja de estilos, porque al comentar algunas de las hojas, el efecto se atenuaba e incluso llegaba a desaparecer.

La primera impresión fue que es posible que al ser la página tan grande y tener muchos elementos que flotaban, alternando con elementos de bloque es posible que el navegador necesitase todo ese procesado, pero comprobamos como ese no era el problema (evidentemente, algo de se notó puesto que efectivamente el navegador tenía que pensar algo menos), pero no era la causa ya que la mejora no era aceptable.

Finalmente, probando más cosas surgió la idea de comentar todos los hover (también se probó con los float y otros atributos) y cuál fue nuestra sorpresa cuando el efecto desapareció. Centramos toda nuestra atención, esto no lo habíamos visto nunca.

Sólo había una cosa rara, en unas pocas líneas (4 ó 6) teníamos unas propiedades css similares a estas (no es el caso real, pero sí similar):

.listados .visual {color:#777;}
.listados .visual:hover {color:#000;}

Para un HTML como este:

<div class="listados">
<p><a href="#" class="visual">Texto</a></p>
<p><a href="#">Texto</a></p>
<p><a href="#">Texto</a></p>
<p><a href="#" class="visual">Texto</a></p>
</div>

Es decir, resumiendo, las propiedades css hacen que los enlaces con class visual se pongan de color negro cuando el ratón se pone por encima.

Esto supone un gran problema para Internet Explorer. Pese a que la propiedad hover está puesta para un enlace, no poner explícitamente en los estilos que es para un enlace (tag <a>) provoca que esté constantemente recalculando y “pensando”, y aquí la raíz de todo el problema.

Es decir, las líneas css deben ser:

.listados .visual {color:#777;}
.listados a.visual:hover {color:#000;}

Lo más correcto sería incluir también el a en la primera línea, para tener más coherencia, aunque no es necesario y no cambia la solución del problema.

Pero bueno, la guerra contra el IE ha terminado… y hemos ganado :)


sep 27 2010

Juega al trivial con Twitter y Caja Navarra

tatai

Una nueva y curiosa iniciativa ha nacido en Caja Navarra: jugar al trivial mediante Twitter! Es posible inscribirse a partir de hoy mismo hasta el 3 de octubre ya que el próximo lunes 4 de octubre comenzará el juego. Cuenta con unos jugosos premios:

  • 1er premio: iPad 16GB Wi-FI 3G
  • 2º premio: Iphone 4 16Gb libre
  • 3º 4º 5º premio: Kindle Wireless Reading Device, Wi-Fi, pantalla de 6 pulgadas
  • Para todo el que pase a la segunda fase, 100 euros en metálico y si estás entre los 50 primeros, una tarjeta Civic Sampling con 10 euros

Toda la info la tienen colgada aquí: http://www.cajanavarra.es/es/juego-trivial/premios-trwivial.htm pero se tratará de responder a preguntas, al estilo del tradicional trivial, pero todo usando Twitter como único canal. Se creará un ranking con las puntuaciones durante las dos fases de las que consta el juego hasta el 22 de octubre que es cuando se conocerán los ganadores definitivos.

Seguiremos de cerca la iniciativa que tiene muy buena pinta porque #twitterengancha ;)


jul 20 2010

Equation y Matrix, mis últimos desarrollos en PHP

tatai

Para recuperar un poco el blog, que últimamente está muy mustio, voy a hablar de un par de desarrollos que he hecho y publicado en PHP. Los he llamado con el original nombre de Equation y Matrix.

Los tenía desde hace bastante tiempo, pero aprovechando que le estoy dando a TDD y a los testeos unitarios, los he adecentado y completado hasta ponerlos decentes para publicarlos y este es el resultado.

Equation

Es una sencilla clase que nos permite trabajar con una ecuación polinomial de grado n-ésimo mediante un objeto, facilitando el acceso a cada uno de los coeficientes así como una sencilla evaluación de la misma (basada en el método Horner).

Además, permite mostrar la ecuación renderizada al formato indicado de una forma muy sencilla. Actualmente en el paquete existe la opción de mostrarlo en formato HTML, cuyo resultado final sería algo del estilo: y = x3 + 7x2 + 10

El código completo, incluyendo ejemplos y test unitarios está publicado en github. También lo he publicado en phpclasses (sin test unitarios por lo engorroso que es subir cada fichero de forma individual).

Matrix

Este paquete consta de varias clases, la principal es Matrix que permite representar en un objeto una matriz matemática. Podemos además realizar distintas operaciones que a día de hoy son:

  • suma de dos matrices
  • resta de dos matrices
  • multiplicación de dos matrices
  • multiplicación de una matriz por un escalar
  • multiplicación de una fila por un valor
  • multiplicación de una columna por un valor
  • cambiar dos filas
  • cambiar dos columnas
  • inversa de una matriz
  • unir dos matrices compatibles
  • trasponer una matriz
  • eliminación de Gauss-Jordan (con el que poder obtener, por ejemplo, ajustes polinómicos de cualquier grado o inversas)

Las clases, con sus correspondientes test unitarios, están publicada en github.

Enlaces

Update 2010.08.01: PHPClasses acaba de avisarme que Equation está nominada al Innovation Award July 2010 :) A ver si hay suerte

Update 2010.09.01: Olé! Equation ha quedado 4ª en el Innovation Award July 2010 de PHPClasses


abr 12 2010

Genera gráficos burndown de forma sencilla

tatai

Si utilizas scrum como metodología de trabajo o si has oído hablar de ella, seguramente habrás oído hablar también del gráfico burndown. Con él, de forma sencilla puede verse de un vistazo información sobre cómo va el trabajo realizado durante el sprint entre otras cosas.

Estos gráficos son muy sencillos de realizar, pero si no quieres complicarte nada la vida, tienes Yet another online burndown generator o, lo que es lo mismo, un generador de burndown online.

El funcionamiento es muy sencillo: indicamos los puntos (u horas o la unidad de trabajo con la que estés midiendo tu velocidad), los días y un título. Con estos tres datos, la aplicación te genera un PDF del tamaño de un A4 horizontal listo para imprimir con tu gráfico.

Ejemplo de burndown

Se admiten todo tipo de sugerencias y críticas (mientras sean constructivas :p). Hay unas cuantas en lista pero seguro que se te ocurren algunas más. La idea es mantener la sencillez de hacer un gráfico, pero con toda la potencia que puedas esperar para tener un burndown a tu gusto.

Enlaces:


abr 2 2010

Documentación oficial de PHP en español

tatai

Tras un largo tiempo sin ella, podemos anunciar que está de nuevo online la documentación oficial de PHP en español. De esta forma, para todos aquellos a los que se os hacía complicada la lectura de la ayuda en alguno de los idiomas actualmente disponibles, ahora no teneis excusa ;)

Hace ya unos años que el manual en español se consideró obsoleto debido a la discontinuidad de la traducción (principalmente con la llegada de PHP5), pero volvemos a contar con él.

La traducción la realizan voluntarios que prestan su tiempo a esta tarea y se organizan mediante una la lista de correo oficial documentación de PHP-ES.

Como se puede ver en la lista que hay más adelante, no está traducido todo el manual. A fecha de hoy, 2 de abril de 2010, el 21% del manual oficial de PHP en inglés (manual base) está traducido a español. Aunque pueda parecer una cifra reducida, irá creciendo poco a poco.

El manual en español es el cuarto con más contenido traducido. Existen otras lenguas en las que se ha empezado con la tarea pero que, hasta el momento, no tienen contenido suficiente como para estar publicados.

Actualmente la documentación oficial de PHP está disponible en los siguientes idiomas (entre paréntesis, la cantidad del manual que está traducido):

  • Inglés (100%)
  • Francés (90%)
  • Japonés (69%)
  • Turco (35%)
  • Español (21%)
  • Alemán (18%)
  • Portugués brasileño (11%)
  • Polaco (4%)
  • Rumano (4%)
  • Búlgaro (3%)
  • Coreano (3%)

¿Te animas a traducir apoyando así a la comunidad? Cualquier ayuda es buena y será bienvenida :)

Links: