Solucionar error symbol lookup error: suhosin.so: undefined symbol: php_mb_encoding_translation en PHP 5.4 con cPanel

Suhosin logo
Suhosin logo de Hardened PHP Project

Si has actualizado a PHP 5.4 en cPanel es posible que durante la subida de archivos u otras partes de tu código PHP te encuentres el siguiente error en el error_log de Apache.

/usr/bin/php: symbol lookup error: /usr/local/lib/php/extensions/no-debug-non-zts-20100525/suhosin.so:
 undefined symbol: php_mb_encoding_translation

Este error sólo se produce si además tienes activo Suhosin. Oficialmente PHP 5.4 no tiene soporte para Suhosin, pero esta extensión es muy necesaria para el uso de servidores compartidos, debido a que ofrece bastantes características de seguridad adicionales a la instalación base de PHP.

El problema se debe a que varias funciones relacionadas con mb string no estan presentes en el código fuente de PHP (probablemente porque cPanel usa una versión propia y ligeramente modificada del código original de PHP), donde puede haber sido eliminada la función php_mb_encoding_translation

Podemos observar, que en el código fuente de la versión PHP 5.4.19 se encuentra definida la función php_mb_encoding_translation() en concreto en /ext/mbstring/mbstring.c:102. Teóricamente esta función existe en el código nativo de PHP y suhosin debería poder utilizarla, pero al ser la versión PHP personalizada de cPanel no esta presente y suhosin falla al ejecutar el código php y eso producirá un error 500 en Apache abortando la ejecución del script.

Afortunadamente, existe un parche en Github en forma de Pull Request cuyo autor es Jan Ingvoldstad, que no ha sido aún aceptada después de más de 8 meses (al momento de escribir este artículo).

Puedes aplicar directamente el parche en el código fuente de github y compilarlo. En mi caso, he creado un repositorio aparte haciendo cherry picking del parche y de otros parches adicionales que corrigen otros errores en PHP 5.4 con suhosin y aún no han sido fusionados en el proyecto original.

La forma rápida de solucionarlo sería:

1 – Clonar mi repositorio de Suhosin con los parches aplicados (cherry picking)

git clone -b master --single-branch http://github.com/shakaran/suhosin.git suhosin-shakaran

2 – Compilar e instalar suhosin desde mi rama. En una sola línea sería:

cd suhosin-shakaran; phpize; ./configure; make; make install

Pero si quieres hacer tu propio cherry picking te explico como podrías hacer lo mismo que yo:

1 – Dirígete a github, en el repositorio oficial de suhosin y haz un fork del proyecto original

2 – Añade como repositorio remoto la rama de Jan Ingvoldstad

git remote add jani-upstream git://github.com/jani/suhosin.git

3 – Baja los commits de dicha rama (solo las referencias)

git fetch jani-upstream

4 – Haz un cherry pick del commit (parche) que arregla el fallo:

git cherry-pick e8beb4f50fa997c0ea4b923677deb275cc7660e

5 – Compila con:

cd suhosin-shakaran; phpize; ./configure; make; make install

Y listo, tendrás tu propio branch con tu parche aplicado.

pygifme un simple comando para generar gif animados

pygifme Generar GIFs fácilmente en Python
pygifme = pygifme generar GIFs fácilmente via Python

pygifme es un script en python que he portado como desarrollo en base al script original gifme escrito en ruby de Zach Holman (GitHub).

El script de ruby es bastante antiguo, pero al utilizarlo y ver su código para ver como funcionaba se me ocurrió portarlo a python como simple práctica y prueba al tratarse de algo sencillo y sin demasiadas dependencias.

La funcionalidad es exactamente la misma, añadiendo un par de pequeños cambios y realizando comprobaciones más exhaustivas internamente. Por respetar el nombre antiguo del script y que no fuera muy largo de escribir lo he llamado “pygifme”. Es bastante útil para generar un .gif desde varias imágenes y evitarse complicaciones con editores gráficos de imágenes.

pygifme instalación

Esta disponible desde pypi (Python Package Index) y desde mi repositorio de código github.

Agradecería las pruebas que se realicen con el script, propuestas de mejoras y reporte de sugerencias si lo deseas.

Instalación

Puede instalarse fácilmente desde pypi con:

$ pip3 install pygifme

También puede instalarse vía el archivo setup.py:

$ python3 setup.py install

También es necesario instalar ImageMagick.

En sistemas GNU/LINUX Debian:

$ sudo apt-get install imagemagick

En OS X, es fácil usando Homebrew:

$ brew install imagemagick

Este script es para Python >= 3.0. También necesita del módulo de python argcomplete si deseas que el autompletado en línea de comandos de pygifme

Puedes instalarlo con:

$ sudo pip3 install argcomplete

O via el archivo requirements.txt:

$ sudo pip3 install -r requirements.txt --use-mirrors

Uso

$ pygifme ~/Desktop/1.png ~/Desktop/2.png
 You now have a handsome animation at ~/Desktop/animated.gif

Por supuesto también puedes agrupar archivos con glob:

$ pygifme ~/Desktop/*.jpg
 You now have a handsome animation at ~/Desktop/animated.gif

CloudApp

Una vez que tu animación haya finalizado, se intentará subir a CloudApp. Si tienes el script de cloudapp instalado, se usara, de lo contrario se omitirá este paso.

Usos super avanzados

En algunos gifs, es bonito tener un bucle suave, para que cuando termine no haya un salto hasta el último fotograma al primero otro vez. Usa la opción ‘–reverse’ o ‘-r’ para crear una animación normal y posteriormente revertir los fotogramas y que estos sean añadidos a la animación, de esta forma parecerá una transición suave.

$ pygifme --reverse ARCHIVOS

Si pasas una URL de un gif (archivo remoto) en lugar de ARCHIVOS, el programa descargará el gif, lo dividirá en fotogramas y te permitirá recrearlo. Por ejemplo, puede tomar un gif online y darle la vuelta con ‘–reverse’:

$ pygifme --reverse http://tumblr.com/some-crazy.gif

También puedes redimensionarlos. Por defecto el tamaño es de 500 píxeles, pero puede cambiarse a lo que necesites.

$ pygifme --width 1000 http://tumblr.com/some-crazy.gif

Para otras muchas más opciones, comprueba la ayuda con:

$ pygifme -h

Ejecutando los test unitarios

Es un simple script, pero puede tener comportamientos inesperados cuando se hacen cosas extrañas con el backend de ImageMagick. Si deseas asegurarte de un comportamiento común, entonces puedes ejecutar la batería de pruebas unitarias con:

$ python3 -m unittest test

O también desde el archivo setup.py (recomendado):

$ sudo python3 setup.py test

Visualizar cambios en normativas de proyectos, de forma geek

proyectos geek - Geeks win eventually geeks-win-eventually.png
Geeks win eventually

Hace tiempo que termine mi proyecto de fin de carrera y para documentarlo en su día tuve que seguir una normativa de proyectos de fin de carrera definida por la Escuela de Informática de Ciudad Real (UCLM).

proyectos geek

Esta normativa estaba escrita con normas de 2007 y hasta no hace pocos días no se ha publicado una nueva normativa. Aunque ya no tengo la necesidad de leerla para hacer un nuevo pfc, si me ha surgido la curiosidad de cuales son los cambios que realmente se han llevado a cabo.

El problema, es que ambos documentos son dos PDFs y no se exponen de forma clara cuales han sido los cambios. Aunque quizás la escuela podría haber hecho un repositorio de código con el texto, tal cual como hacen otras instituciones alemanas para la publicación de leyes, no es el caso. Pero explicaré en este artículo como podemos ver estos simples cambios.

Lo primero que necesitamos es obtener ambos pdfs, después con la herramienta pdftotext convertiremos los pdf a texto crudo, donde no existe formato, pero si podemos conservar la forma del contenido (layout) con bastante precisión.

Una vez tenemos las normativas en texto crudo, podemos aplicar el comando diff y comparar lado por lado o bien generar un fichero con las diferencias.

Como la automatización es importante por si cambia de nuevo en un futuro, he creado un pequeño script llamado esi-pfc-differ.sh en mi cuenta github que hace exactamente esos objetivos.

Por otro lado, si no quieres complicaciones y quieres algo mas rápido, he alojado las diferencias generadas como un archivo en un pastebin (lo hubiese hecho en un gist, pero parece que había problemas en github en esos momentos).

Este método puede aplicarse a la mayoría de archivos pdf, por lo que es muy conveniente para detectar pequeños cambios.

Blog de un ingeniero informático superior y sysadmin


Notice: Use of undefined constant AN_PRO_PLUGIN_DIR - assumed 'AN_PRO_PLUGIN_DIR' in /home/shakaran/public_html/blog/wp-content/plugins/adblock-notify-by-bweb/adblock-notify-functions.php on line 480

Notice: Use of undefined constant AN_PRO_PLUGIN_DIR - assumed 'AN_PRO_PLUGIN_DIR' in /home/shakaran/public_html/blog/wp-content/plugins/adblock-notify-by-bweb/adblock-notify-functions.php on line 486

Warning: require_once(AN_PRO_PLUGIN_DIRinc/class-an-image.php): failed to open stream: No such file or directory in /home/shakaran/public_html/blog/wp-content/plugins/adblock-notify-by-bweb/adblock-notify-functions.php on line 486

Fatal error: require_once(): Failed opening required 'AN_PRO_PLUGIN_DIRinc/class-an-image.php' (include_path='.:/opt/cpanel/ea-php70/root/usr/share/pear') in /home/shakaran/public_html/blog/wp-content/plugins/adblock-notify-by-bweb/adblock-notify-functions.php on line 486