Archivo de la categoría: Desarrollo

Internet Explorer Encoding Fail

…o como un buen día acaba arruinado por esa basura.

Ayer fue un día prolífico de web-developeo, gracias a que me tope con parte del trabajo ya implementado (y libre), facilitándome mucho las cosas :D. Gracias a eso, podré añadirle otro toque «2.0» a Gonium.

En los últimos días, por motivos de fuerza mayor, he estado trabajando con otro laptop, … con windows xp (chan!). Es acá donde recordé que gran cantidad de las herramientas que ocupaba para desarrollar, cuando desconocía Linux, eran propietarias, pesadas y expiraban a los 10-15-30 días (a menos claro que…). Aproveche esta oportunidad para hacer las pruebas de rigor en Internet Explorer. Como era de suponerse, me causo algunas reacciones urticantes.

Entonces investigando encontré algunas cosas útiles, libres y para windows:

  • 7-zip sino como diablos abro un tar.gz o un tar.bz2 😆
  • Xampp un instalador de Apache+PHP(4/5)+Mysql5 y PHPMyAdmin. Lo bueno es que trae además:
    • mod_rewrite (Apache) Necesario para trabajar con Zend_framework y las urls para SEO. Hay que activarlo en el httpd.conf descomentado la linea que lo carga).
    • xdebug (PHP) Aunque no viene preinstalado, pero es cosa de editar el php.ini, sacar zend_optimizer y descomentar las lineas de xdebug (vienen seguidas).
  • Zend Framework, pack de clases + documentación + … + guías, para trabajar con PHP5
  • Notepad++ Editor te texto plano, para trabajar con código fuente en un montón de lenguajes.
  • Poedit Interfaz gráfica para gettex, una aplicación que permite realizar traducciones desde y en nuestro código fuente.

Con todo esto, más un buen pack de navegadores (Firefox, Arora (basado en webkit), Opera, Safari, IE en todas sus repugnantes versiones), ¿necesito pagar un peso para aprender/trabajar?

Construcción

Basado en el código que me encontré, quería implementar un nuevo módulo para mi sitio. Como trabajo con Zend Framework, es cosa de crear una nueva carpeta con la siguiente estructura:

root/modules
root/modules/my_new_module
root/modules/my_new_module/controllers
root/modules/my_new_module/models
root/modules/my_new_module/views
root/modules/my_new_module/views/scripts

Luego cree mi «MyNewModule_IndexController» (en root/modules/my_new_module/controllers) y mi script de vista index.phtml (en root/modules/my_new_module/views/scripts).

Es tan sencillo y corto que no lo voy a postear.

¿Y donde esta el EPIC FAIL?

Probé el nuevo módulo en Firefox durante todo el día, hasta que se me ocurrió ¿porque no probarlo en IE7 si estoy en windows?

EPIC FAIL:

Módulo pwneado en Internet Explorer 7

Todo el div central se desencuadro 👿 !!!

Seguir leyendo Internet Explorer Encoding Fail

Mi nuevo proyecto: Gonium

Tal vez se vea como una tremenda reinvención de rueda.

¿Por qué?

Hay un dicho muy cierto: si quieres las cosas bien hechas, hazlas tu mismo.

Gonium
Captura de pantalla de Gonium

Hay una infinidad de CMS’s a lo largo y ancho de la web. Realmente la fauna es inmensa. Hay CMS’s fáciles de instalar, otros fáciles de administrar, fáciles de extender, fáciles de modificar, etc…

Mi propia reinvención partirá siendo Gonium. Espero poder agregar lo bueno y evitar lo malo de los otros CMS’s. Pero para que no sea una reinvención total, decidí ocupar un Framework PHP: Zend Framework. ¿Por qué ZF? Básicamente porque ya lo conocía. Cuenta con documentación bastante buena, ciclos de desarrollo ágiles, es libre, tiene buena comunidad, etc…

No esperen mucho, está en una etapa embrionaria muy temprana aún. Prácticamente TODO se debe hacer a mano, incluyendo instalación, configuración de la base de datos, crear/instalar módulos, etc…

Además es una buena oportunidad para probar Google Code como repositorio del proyecto.

Inspiración

Lamentablemente ninguno de los CMS’s que he ocupado me ha logrado satisfacer del todo. Generalmente cumplen con su objetivo, pero siempre hay algo que le falta a alguno que sí tiene el otro. O algo que le sobra… Así que pretendo juntar lo bueno y evitar lo malo de aquellos que he probado.

Por ejemplo, admiro y me inspiro en los siguientes:

Seguir leyendo Mi nuevo proyecto: Gonium

PHP5 and his curious inheritance handle (OOP) PHP5 y su curiosa la manera de manejar la herencia (POO)

Mi problema inicial era por decirlo menos, «simple». Cree unas clases para manejar «módulos» (like-joomla), «bloques» (like-phpnuke) , widgets (like-wordpress). Es decir pequeños recuadros de html que puedo poner en una barra lateral, como en este blog.
OK. Mi diseño consistió en:

  • Clase Dock: es un «área» donde se pueden encolar los widgets. Ejemplo: un leftSidebar, un menuBar, etc…
  • Clase Widget: una clase básica de la cual heredaran los demás widgets. Un Widget entonces será un pequeño espacio que retornará HTML.
  • Clases que heredan de Widget. Ejemplo: Widget_Validator, es uno que hice que retorna los botoncitos con los links para validar el html con el validador de la w3c.

Hasta ahí todo OK.

Entonces, surgió la problemática. Algunos de mis Widget_* necesitaban recursos externos (un script de vista, un modelo, una traducción, etc…). Así que pensé «OK, necesito un directorio de recursos para cada widget». El problema está en que en algunas partes del código, tengo las instancias de los widgets, pero no necesariamente conozco su nombre de clase, pues el método $widget->getContent() es el que hace la magia de pegar el HTML en su posición. Entonces pensé «ok, necesito un método que me retorne el nombre del ‘directorio de recursos’, puede ser en base al nombre de la propia clase».

Acá es donde pillé el EPIC FAIL:
Seguir leyendo PHP5 and his curious inheritance handle (OOP) PHP5 y su curiosa la manera de manejar la herencia (POO)

PHP y Xdebug

Hace unas semanas encontré respuestas a preguntas que me planteé hace años acerca de PHP.

Unas de las primeras cosas que aprendemos cuando conocemos PHP, es que al trabajar en la web, el motor funciona con ciertos límites. Límite de tiempo de ejecución (30 segundos por omisión) y límites de uso de memoria (16M por omisión en mi caso).

Lo malo no es que existan límites, todo lo contrario, en el caso de una aplicación web, de naturaleza concurrente, es necesario que lo que hace un usuario no pase a llevar lo que hace otro, cuidando de pasada los recursos de la máquina servidora. Sería nefasto programar mal un ciclo, de tal modo que en ciertas condiciones se vuelva infinito y además la ejecución no parara nunca. También sería catastrófico que tan solo 2 usuarios ejecutando un script terminaran haciendo colapsar el servidor por uso excesivo de memoria. El problema está cuando estamos desarrollando y olvidamos estos límites, lamentablemente en las situaciones más incomodas es cuando se manifiestan, por ejemplo al extraer demasiados datos desde una base de datos, o al hacer una operación muy larga en uso de disco (por ejemplo copiar muchos archivos de un lado a otro), o al leer un archivo muy grande, etc…

Entonces las preguntas que me hice hace años fueron algo así:
¿Como puedo saber cuanto tiempo demora la ejecución de mi script? ¿Como puedo saber cuanto que funciones/procedimientos son las más lentas? ¿Como puedo saber cuanta memoria consume mi script en ciertas condiciones? ¿Como puedo saber cuanta memoria consume una operación?

RESPUESTA: Xdebug
Seguir leyendo PHP y Xdebug

Cambiando el Editor de Joomla

Ya cuando instale Joomla en Promolibros había experimentado inconvenientes con TinyMCE, su «Editor Wysiwyg» predeterminado.

Inconvenientes del tipo «presiono un botón y no ocurre lo que debiera ocurrir». En ese tiempo, me dí cuenta que en ocasiones era AdBlock Plus el culpable que bloqueaba los scripts necesarios para el funcionamiento.

Hoy después de mucho tiempo sin haber ocupado el editor de contenido, me di cuenta que con ningún navegador fue capaz de funcionar correctamente (el que llegó más lejos fue Safari).

Comprendí entonces que si la cosa fallaba desde el principio, menos estaría pensada para funcionar con navegadores actuales.

Entonces, en menos de 5 minutos buscando, dí con otro editor en javascript que si funciona. Damas y caballeros, les presento a JCE.

Para instalarlo, baje el componente, el mambot y language pack en español. Primero instalo el componente, luego el mambot. Para dejarlo en español, es necesario ir al Menu de Componentes en el panel de Administración, y hacer click en el icono «install», luego es como cualquier oto paquete de joomla tipo «subir e instalar».

Para activar el editor y finalmente reemplazarlo por el funesto TinyMCE, es necesario ir Sitio -> Configuración Global, donde basta seleccionarlo en donde dice «Default WYSIWYG Editor:».

Así que ya saben, si hay algo en Joomla que no les gusta o no funciona, es muy probable que exista un reemplazo, uno de los motivos por los que prefiero el software libre

Resolver problema de traducción de WordPress (probado en 2.3.1)

Hace poco que estoy probando Kubuntu en AMD64, y al parecer, esta plataforma tendría algo que ver con el problema que se da al intentar instalar wordpress traducido en español (o wordpress normal + traducción).

El problema es luego de hacer la instalación, igualmente queda en inglés (Como si no se hubiera hecho nunca la traducción).

Acá está una posible solución.

A mi me funcionó.

Corrector OrtoTRÁGICO

Esta fue de esas oportunidades en que el plan A en la prácticamente se vuelve totalmente opuesto.

Mi idea era realizar la tarea de Estructuras de Datos en no más de una semana, y así tener el resto del tiempo (3-4 semanas) libre para dedicarme a estudiar para las pruebas. Pero debido a complicaciones del más allá, el plan cambió radicalmente a «hacer la tarea como sea, y estudia la última semana, cuando llegan todas las pruebas».

El enunciado del problema pedía hacer un script de corrección ortográfico, en C y que funcionara en Linux, que tomara un archivo de texto con las palabras (diccionario 1), con palabras erróneas y su corrección (diciconario 2) y un archivo de prueba, que se debe corregir en base a los diccionarios. La idea es usar TDA de Listas Enlazadas para las palabras.

Hasta ahí, me asuste un poco, porque pensé que al «anudar» los Nodos, recorrerlos, o agregar/eliminar se me iban a perder los punteros. Pero nada… todo eso era simple (finalmente ese era el objetivo de la tarea), sin embargo, fue un parto el manejo de cadenas. Pensé que mi experiencia en C++ podría ayudar, leí cuanto manual hablaba de punteros, arrays, cadenas de char, etc… pero me ocurrían fallos muy curiosos:

  • Las funciones estándar de ANSI C para cadenas se comportaban en forma errática con el caracter final de cadena (o caracter nulo »)
  • Al pedir memoria para una cadena, se caía DENTRO de un malloc
  • Las funciones que s hacían llamada al malloc que se caía, funcionanban bien en forma asilada, pero cuando las ponía dentro de un ciclo comenzaban a aparecer comportamientos erráticos, siendo que ninguna variable era estática, ni habían funciones recursivas, como para que el efecto fuera acumulativo.
  • Al llamar a las funciones problemáticas, a veces se caía luego de llamadas posteriores a otras funciones que no tenían nada que ver.

Acá esta mi primera versión.

En fin, fue un infierno tratar con cadenas de texto en C. Finalmente, gracias a un usuario del irc Powers, pude completar la maldita tarea, el domingo pasado, día antes de la entrega. Este es el producto final.

En C++ no he estado libre de problemas.

Seguir leyendo Corrector OrtoTRÁGICO

Haciendo documentación decente con Doxygen

Ya llevo un buen tiempo ocupando esta herramienta (y con ganas de escribir de ella), pero no había tenido tiempo.

Doxygen es un programa esencialmente de consola, que lee el código fuente de un programa, y a partir de los «comentarios» más las definiciones del propio código genera la documentación, la cual puede hacerse en varios formatos a la vez.

Dentro de los formatos de documento que más me interesan está disponible el HTML (varias páginas con enlaces entre sí) y LaTeX (el cual se puede pasar a PDF con pdflatex).

En el proyecto GDT, he estado traspasando la antigua documentación a los comentarios del código fuente.

Lo interesante de Doxygen, es que en sí trabaja parecido a un compilador, en el sentido de que analiza el texto, la sintaxis, reconoce el lenguaje,y además permite su propia sintaxis en los comentarios, de modo que cualquier cosa que uno escriba puede ser formateada al generar el documento, pero sin alterar la funcionalidad del programa.

Otro dato bueno, es que Doxygen permite ocupar una herramienta externa de Graphviz llamada «dot«. Este programita hace gráficos/diagramas. En conjunto con Doxygen, genera los diagramas de colaboración y herencia entre las Clases.

Finalmente, obtenemos un documento que hace referencia a todo nuestro programa, de calidad profesional, y que permite una facil publicación.

El único contra que llevo hasta el minuto, es que en la versión PDF, la documentación de GDT me está quedando un poquito pasada de peso (3 MB, con más de 500 páginas). Tal vez sea porque active la opción que incluye todos los métodos heredados en las Clases hijas, o quizás GDT tiene muchas Clases.

Hay 2 cosas que he descubierto muy bien aún, pero me parece que se pueden hacer son:

  • Agrandar el tamaño de las fórmulas matemáticas.
  • Incluir imágenes en el PDF (para contribuir con la obesidad del documento :P)

Seguir leyendo Haciendo documentación decente con Doxygen

Como hacer una DLL en Visual C++ y que el mismo código funcione en otros compiadores.

Bueno, este problema es clásico, MS versus resto del mundo. Ya antes me ha ocurrido haciendo páginas web, tener que preocuparse de Internet Explorer y el resto de navegadores.

Mientras intentaba compilar GDT en Visual C++ 2005 Express, me encontré con un problema muy extraño.

Finalmente logre arreglar partes del código para que no me arrojara warnings en tiempo de compilación.

Pero en tiempo de enlazado (en el linker o vínculador) me daba mensajes raros cuando intentaba enlazar un programa de ejemplo con la librería.

El mensaje exactamente símbolo externo «símbolo» sin resolver. Ese símbolo podía ser una variable, una función, una clase, una una propiedad un método, etc…

El problema se produce porque en VC++ se deben exportar los métodos que se tomarán como «visibles» fuera de la librería dinámica (los métodos a los que el programa que se enlaza con ella tendrá acceso).

Según este tutorial de MSDN, la solución pasa por añadir __declspec(dllexport) antes de cada símbolo que se desea exportar a la DLL. El problema es que yo quiero que mi código sea multiplataforma, y esa sentencia claramente no me la va a tomar un compilador como GCC.

Esta es mi solución:

Seguir leyendo Como hacer una DLL en Visual C++ y que el mismo código funcione en otros compiadores.