Desarrollo y Programación
Mis experiencia al desarrollar 2 plugins de WordPress bajo software libre
Este artículo cuenta mi experiencia luego de tres años, al desarrollar un proyecto de software libre (licencia GPL) y motivarlos a crear sus propios proyectos o colaborar en los existentes. Si no te gusta leer mucho, básicamente quiero compartir que al crear y mantener un proyecto de software libre logras: aprender a ser mejor programador al recibir correcciones de otras personas, conoces gente de varias partes del mundo interesadas en tu programa, ves correr el programa en lugares no pensados, recibes código programado por otras personas, puedes recibir dinero sin previo aviso y sin nada a cambio, consigues futuros clientes y recibes felicitaciones por resolver un problema de otra persona.
Inicio
Como mi blog hecho con WordPress empezó a acumular años, el historial de artículos se hizo grande y ocupaba mucho espacio para mostrarlo. La solución por defecto es mostrar los años en una caja desplegable pero lucía muy feo y conseguí un sencillo plugin que los mostraba en un menú desplegable con animación hecha en Javascript. El plugin dejó de soportarse al poco tiempo y no siguió funcionando con WordPress, por ello, decidí hacer uno similar y como estaba aprendiendo jQuery (estaba de moda) lo utilicé para la implementación y nombre. Escribirlo fue fácil pues WordPress ofrece una excelente documentación, además, utilicé el plugin que usaba como base.
¿Ofrecerlo como software libre o usar una licencia cerrada y venderlo?
Una vez terminado, pense en 3 posibilidades: usarlo para mi mismo, venderlo por un precio muy barato y ganar algo de dinero por él, liberarlo como software libre porque le podría servir a alguien con la misma necesidad que yo. Decidí ésta última porque por primera vez tenía algo que surgía de una necesidad y estaba seguro de servirle a mucha gente en la misma situación que yo. Lo subí a WordPress y mi sorpresa es que tuvo bastantes descargas los primeros días (creo que como 300).
Por novatada, empecé a recibir peticiones (no quejas) de gente que deseaba mejor código porque no me entendían, soporte para otros días (me decían que si hablaba español por qué no había menús en este lenguaje), soporte para cambiar el formato del mes, etc. Aproveché un tiempo libre y lancé una segunda versión con el código mas sencillo y limpio, documentado, soporte para multi-idioma (en ese momento inglés y español) e implementé la funcionalidad del mes.
Primeras contribuciones
Luego de esos cambios pensé que el plugin estaba listo y no era necesario hacer mas cosas, para mi sorpresa empecé a recibir ideas de nuevas funcionalidades, código de personas para añadir compatibilidad de características de WordPress desconocidas para mi, por ejemplo, para ese entonces no conocida de WordPress MU, shortcodes, filtros, etc. Recibí parches para mejorar el código SQL porque había una persona con miles de posts, etc.
Mi sorpresa es ver como gente desconocida, se tomó el tiempo para estudiar el código elaborado por mí, modificarlo para soportar sus necesidades y compartirlo conmigo para incluirlo en la rama oficial, permitiendo al resto de usuarios disfrutar de estas funcionalidades. Además, las funcionalidades implementadas eran interesantes y muy variadas, yo sólo no hubiese podido hacerlas porque eran situaciones muy distintas en cada caso. Otra cosa interesante, fue que uno de los primeros programadores en enviarme código, tradujo el plugin a Checo y Esloveno, dos idiomas que jamás pensé contar en mi plugin.
Mantenimiento
Una vez con una base de funcionalidades generales, gente empieza a pedir características mas complejas, a veces fuera de las funcionalidades o el objetivo del plugin, generalmente algunas se resolvían con otro plugin y otras tuve que agregarlas. Una de las mas solicitadas era la posibilidad de excluir tareas pero fallé, sin embargo, otro de los primeros programadores en contribuir lo implementó sin que le pidiera ayuda y pude ofrecerlo al resto.
Al momento de estabilizarse el proyecto: buena base de usuarios, programadores voluntarios contribuyendo en el proyecto. Noté un incremento en el soporte, la gente al ver que el plugin funciona bien desean expandir sus posibilidades y empiezan a contactarte para ver como realizar ciertas cosas o dar nuevas idea. Comencé a recibir donaciones simplemente por realizar el plugin, motivandome a realizar nuevas funcionalidades (como soportar muchas instancias que requería casi re-escritura total).
En otras palabras, una vez que el proyecto se mantiene, el mantenimiento consiste en arreglar bugs, dar soporte a las personas y dependiendo de la frecuencia de solicitudes, agregar funcionalidades nuevas. En este punto es bien porque ya vez el fruto del esfuerzo realizado anteriormente, sin embargo, me parece delicado descuidarlo porque se puede ir todo para atrás. Pues aquí la gente confía mas en tí y espera respuestas rápidas, tal vez algunas sean incómodas al exigir como si estuviesen pagando altas sumas por ello, pero otras son buenas al agradecerte por el esfuerzo realizado.
Conclusiones
Después de este tiempo, puedo decir que es uno de los proyectos mas satisfactorios a nivel profesional y pesonal, en el primer ámbito porque me permite mejorar mis capacidades de programación, conseguir nuevos clientes (mi mayor cliente lo conseguí al solucionarle un problema con este plugin), mejora el currículo (puedo demostrar capacidad de liderar un proyecto, experiencia con PHP y WordPress, Javascript, etc) y mas. Respecto a la parte personal, cada vez que recibo un correo de una persona agradeciendome por el trabajo, por el tiempo ahorrado al utilizar este programa, al ver ejecútandose en sitios conocidos o muy extraños. Me alegra saber que he ayudado a otra persona sin nada a cambio, además cuando recibo donaciones pues también es bien saber que se recibe una recompensa monetaria extra por un trabajo que muchas veces es para mí (para mi blog).
Si alguno tiene una idea o programa en mente, es sencillo y sienten que pueden ayudar a otro, liberelenlo bajo una licencia de código abierto, publiquen el repositorio y con el tiempo verás como crece con la ayuda de otros programadores. Realmente es una buena experiencia.
Si alguno desea conocer o probar mis 2 plugins, pueden hacerlo en las siguientes direcciones:
Happy Hacking!
NoSQL Style (Parodia Geek de Gangnam Style)
Leyendo una entrada de Geeksroom ví esta buena parodia (no musicalmente) de Gangnam Style pero acerca de la tecnología NoSQL, la letra es realmente buena, cuando dijo que era para datos estructurados me pareció bien hecha pues aclara cuando usarla (mucha gente piensa que NoSQL es un sustituto de SQL).
En fín, les dejo observar este vídeo para que disfruten un rato Geek y Musical.
¡Comparte este video con sus amigos Geeks!
Automatización de pruebas funcionales con Selenium en Yii usando Netbeans
El título de esta entrada es un poco largo, pero intentaré de explicarles de una manera sencilla como podemos hacer pruebas funcionales en nuestras aplicaciones hechas con el framework de PHP Yii, usando Selenium y Netbeans. Para quienes no conocen las pruebas funcionales, son aquellas para comprobar la correcta ejecución de cada una de las funcionalidades del sistema, muchas veces hacemos este proceso manualmente: entrando al sitio, escribiendo a mano (o usando un plugin del navegador) cada campo, haciendo clic en los botones y así sucesivamente. Pero cuando el sistema se hace muy grande o estamos en agregando funcionalidades, se puede perder mucho tiempo en realizar este proceso, si se deja para el final (como en las metodologías antiguas) puede ser muy tarde y si se omite tendremos un software con potenciales fallas.
La idea es automatizar este proceso, para que con un solo clic se ejecuten muchas pruebas y asegurarnos el correcto funcionamiento del programa a lo largo del desarrollo y mantenimiento del mismo.
Configuración en Netbeans
Para esta guía deben tener ya instalado y configurado los siguientes programas: Netbeans, PHP Unit, un programa hecho con Yii framework, Selenium Server, Firefox (Debe ser igual para otro navegador pero no lo probé), Linux (No sé si este proceso es igual para Windows).
Primero lo que vamos a hacer es instalar un plugin de Netbeans para manipular el servidor de Selenium desde el IDE, este paso es opcional pero me parece mas fácil iniciarlo / detenerlo con un clic que a través de comandos. Para ello vamos a:
- Entrar en Netbeans.
- Luego en el menú “Tools -> Plugins -> Available Plugins“.
- Allí buscamos el que tenga el nombre de “Selenium Module for PHP” le damos clic en Install.
- Una vez finalizada la instalación, en la pestaña de Servicios en la parte de Servidores tendremos el de Selenium.
Antes de iniciar las pruebas, debemos arrancar el servidor de Selenium con clic derecho y luego en “Start”. Luego procedemos a configurar el proyecto actual (el realizado en Yii) para indicar a Netbeans donde se encuentran las pruebas y PHP Unit:
- Hacemos click derecho en el proyecto y luego en “Properties”.
- En la sección “Sources” existe una caja llamada “Test Folder”, en ella vamos a colocar la ruta absoluta a la carpeta /protected/tests del proyecto (en caso de no funcionar, entonces a /protected/tests/unit).
- Luego en la misma ventana, cambiamos la sección “PHPUnit” y activamos donde dice “Use Bootstrap” donde rellenamos la caja de texto a la ruta absoluta de /protected/tests/bootstrap.php
- Luego activamos la opción “Use XML Configuration” y rellenamos en la caja la ruta absoluta de /protected/tests/phpunit.xml.
Con esto ya esta configurado Netbeans, sin embargo, en mi caso no funcionó de una vez hasta hacer unos pequeños ajustes:
- En mi caso no quería detectar al navegador Firefox, para hacerlo funcionar en el archivo de configuración (phpunit.xml) tuve que eliminar todo el contenido dentro de las etiquetas <selenium></selenium> dejándolas como las acabo de escribir.
- En el archivo WebTestCase.php,en la función setUp() necesité colocar $this->setBrowser(‘*firefox’); para indicar el navegador por defecto.
- Como estaba usando Bootstrap para el frontend, Selenium debe esperar un poco hasta que algunos eventos de Javascript terminen de mejorar la apariencia visual, para ello en el archivo /protected/config/main.php se agrega enla sección de preload lo siguiente (asumiendo la carga de log como se encuentra por defecto):
- Listo, ya con presionar Alt + F6 empezará a ejecutar todas las pruebas, si solo quieren para la clase actual deben presionar Shift + F6.
Consejos para las pruebas
A continuación les doy unos consejos y extractos de código, pues al principio me costó encontrar como realizar las siguientes tareas en Selenium.
- Iniciar sesión en cada prueba: para ello deben crear en WebTestCase.php (la clase principal para las pruebas) un método para el login que comience con _ (piso), pues éstos no se ejecutarán en las pruebas, aquí mi les dejo código y luego en cada prueba hacen un $this->_login() donde requieran identificarse.
protected function _login() {
$this->windowMaximize();
$this->open("site/login");
$this->type("LoginForm_username", "skatox"); //Donde LoginForm_username es el id del usuario
$this->type("LoginForm_password", "contrasena");
$this->click("LoginForm_rememberMe"); //Permite recordar y no estar autenticando cada rato
$this->click("name=yt0");
$this->waitForPageToLoad(self::PAGE_LOAD_WAIT_TIME); //constante que declaré para esperar un tiempo
} - Interactuar con la ventana de confirmación al eliminar un elemento del grid: En este caso se me complicó porque se debe interactuar con una ventana de javascript, el siguiente código también está en WebTestCase.php porque lo utilizo a lo largo de todas las pruebas, los parámetros son: $confirmMsg que es el mensaje de confirmación que aparece en la ventana y $nonFoundMsg, mensaje de cuando se ha borrado el elemento.
protected function _testDelete($confirmMsg, $nonFoundMsg){
sleep(self::WAIT_JS_TIME); //tiempo para esperar la ventana de javascript
$this->chooseCancelOnNextConfirmation(); //Selecciona el boton cancelar para probar este paso
$this->click($this->firstDeleteXpath); //Hace clic en el boton de eliminar del grid (Xpath)
$this->assertConfirmationPresent($confirmMsg); //Se asegura que esta bien el mensaje
$this->getConfirmation();
sleep(self::WAIT_JS_TIME);
$this->chooseOkOnNextConfirmation(); //Escoge aceptar
$this->click($this->firstDeleteXpath);
$this->assertConfirmationPresent($confirmMsg);
$this->getConfirmation();
$this->waitForTextPresent($nonFoundMsg); //Espera que no hayan resultados porque los borró
}
Ya con estos pasos pueden empezar a realizar las pruebas funcionales de forma automática, si quieren conocer como se vé, les dejo un vídeo de unas pruebas de un módulo de una aplicación que estoy realizando:
Mi breve análisis de Window 8
Hace unos días recibí una licencia de Windows 8 en una jornada de la UNET y decidí actualizar mi instalación de Windows 7 para ver las “mejoras” que ofrece Microsoft en su último sistema operativo.
Instalación
La instalación no ha cambiado desde Windows 7 simplemente escoger: el idioma, el país, disposición del teclado y presionar siguiente. Por defecto, Windows detecta si tienes una instalación previa y te ofrece actualizarla o instalar desde 0. Si tienen otras instalaciones de otros sistemas operativos (como en mi caso que tengo Archlinux y Backtrack en otras particiones) se debe seleccionar la instalación avanzada (en realidad no tiene nada de avanzado) y seleccionar la partición (aqui se llama volumen) para formatear en instalar allí. Como siempre, no respeta si tienes un cargador de arranque instalado así que debes volver a instalarlo luego de tener Windows 8.
Arranque y Apagado
El primer arranque o cuando existen actualizaciones tarda 30-40 sg lo normal en Win7, sin embargo, luego de ello el arranque es muy rápido (mas que Linux) esto se logra a que Windows no inicia desde 0 el sistema operativo sino que lo hiberna cada vez que “apagamos” permitiendo cargar una sesión de Windows en menos tiempo. Si quieren mas detalles pueden leer en inglés el artículo sobre Fast Boot.
Interfaz gráfica
Éste es el punto fuerte de Windows, con cada lanzamiento se esperan mejoras en esta área y en mi opinión Win8 presenta los mayores cambios desde Windows 95. Ahora se ha introducido la interfaz ModernUI (antes conocida como Metro) que ha debutado antes en otros dispositivos de Microsoft como el X-Box y Windows Phone.
Para mí, la interfaz ModernUI es muy pulida, sencilla y limpia. Realmente es agradable usar esta interfaz pero esta muy diseñada para dispositivos táctiles, mi laptop no posee pantalla de este tipo por lo que usar el mouse para realizar ciertas acciones es muy fastidioso o no intuitivo. Microsoft hizo un buen trabajo pero aún es muy temprano imponer esta tecnología sobre el hardware existe.
Debido a estos cambios, ahora se cuentan con 2 escritorios (¡Si! como leen, dos escritorios) uno el tradicional de Windows 7 y el nuevo con la interfaz metro. Esto me causa mucha confusión porque las aplicaciones estan diseñada para un escritorio u el otro, por ejemplo, estaba usando Skype y usa ModernUI, luego abrí Firefox para navegar y automáticamente cambia al escritorio tradicional, esto confunde, además, no hay manera desde el escritorio tradicional acceder a las aplicaciones Metro sin cambiar de tipo de escritorio. Esto ocasiona que no sabes si tienes una aplicación Metro abierta o vicevers y debes cambiar para darte cuenta de ello.
El menú inicio desaparece y ahora en vez de estar todo categorizado, por defecto te arroja toda la lista de cosas que tiene instalada, primero aparecen las aplicaciones Metro y luego si las tradicionales, aunque puedes organizarlas a tu gusto. Personalmente prefiero este menú al tradicional de inicio, es mas cómodo e incluye como widgets para obtener información de algunas cosas sin tener que abrir programas.
Aplicaciones incluidas
Como siempre, se incluyen aplicaciones sencillas, entre las que pude probar fue la de correo la cual me pareció muy chévere por ser liviana, buena interfaz Metro y configuración sencilla. Pero cada cierto tiempo se cerraba sola sin avisar y sin informarme del error para ver si es posible arreglarlo. La galería de imágenes es muy buena, con mejores animaciones, mejor organización y ahora permite integrar servicios de Internet como Flickr para incluir imágenes desde allí. Por cierto, ahora Windows 8 se integra mucho con redes sociales o servicios de internet para guardar configuración general, sincronizar archivos, entre otros. El gestor de tareas también recibió un cambio, la interfaz es mejor y muestra mejor información que en versiones anteriores.
Tienda
La tienda de aplicaciones es similar a la de Apple o Android, pero no encontré buenas aplicaciones disponibles y creo que solo instala aplicaciones Metro, nada tradicional, pues no aparecen las aplicaciones gratuitas mas usadas en este sistema operativo. Creo que todavía le falta bastante (bueno apenas comiena) para igualar a las tiendas de la competencia, sin embargo, espero que se integre con Windows Update para tener el sistema operativo actualizado. A windows le faltaba un medio integrado para conseguir mas aplicaciones o mantener las existentes.
Conclusiones
Windows 8 es un sistema operativo que mezcla la interfaz para dispositivos táctiles con la interfaz de Windows 7, me parece un decisión arriesgada por parte de Microsoft pero el tiempo dirá si funciona, en mi opinión todavía es temprano realizar este tipo de cambios porque el hardware de este tipo no se ha generalizado y ademas el cambio de como se debe usar el sistema operativo frustará a la mayoría de usuarios.
Si tienes una licencia de Windows 7 te recomiendo quedarte allí, este S.O. es bueno si tienes una tablet o computadora táctil, si lo usas para trabajo diario o usando las aplicaciones “tradicionales” este Windows será malo para ti.
Deja tu comentario si ya probaste este S.O. y deseas aportar algo a los demás.
Crudgen: Generador CRUD para PostgreSQL usando phppgadmin
Crudgen fue mi proyecto de tesis de grado que culminé a medidados del 2009, el mismo consiste en un generador de páginas para realizar operaciones CRUD (Create, Report, Update y Delete) en una base de datos Postgres a través de phppgadmin, el mejor gestor web para administrar este tipo de base de datos. Para ese entonces modifiqué el código fuente de varias partes de la aplicación, dificultando su integración en el programa, al año siguiente (2010) decidí reescribirlo y modificar su uso siguiendo las sugerencias del equipo, sin embargo, por falta de tiempo lo abandoné. En agosto de 2011, se agregó soporte para complementos por parte de Leonardo Sápiras al participar en el Google Summer of Code, permitiendo escribir un plugin con esta funcionalidad sin modificar el código fuente del programa.En el último año, cuando tenía tiempo libre me puse a rescribir (por tercera vez) el programa y hasta hace poco logré finalizarlo.
El plugin permite a través de pocos pasos, generar páginas web para realizar operaciones sobre las tablas seleccionadas de una base de datos. El código generadoson funciones PHP para realizar las acciones, las cuales son llamadas desde una plantilla HTML, esta plantilla, puede ser programada fácilmente o fácil de adaptar desde un diseño un existente, permitiendo obtener resultados con diseños personalizados (a diferencia de las otras soluciones donde todos los resultados tienen la misma apariencia).
Respecto al código del lado del servidor, soporta las bibliotecas PGSQL o PDO_PGSL brindando posibilidad al usuario de elegir la que mas le convezca (debería usarse siemper PDO para mayor seguridad), posee seguridad respecto a ataques de inyección SQL, usa PHP5 de fácil lectura y con flexibilidad para adaptarla a los requisitos del programador. Centraliza funciones comunes entre las páginas y mucho mas.
Si les interesa, les invito a ver este vídeo en inglés (me di cuenta que necesito prácticar) donde explico todo el funcionamiento del programa, sino entienden el idioma, no importa, pueden ver todo el proceso y ver lo que genera el plugin.
Espero que lo utilicen, compartan esta información, reporten bugs, se unan al proyecto y aporten código al mismo.










