viernes, 7 de octubre de 2011

Notas DrupalCampSpain 2011 - Parte 2



Intentaré en estas líneas hacer un breve resumen de la DrupalCampSpain2011 celebrada los días 1 y 2 de Octubre de 2011 en Sevilla.

Recinto:
Facultad de Informática Universidad de Sevilla. Al estar alojados en un hotel muy próximo al lugar del evento, la verdad es que fue muy cómodo moverse desde/hacia el hotel. La E.T.S.I es similar a muchos recintos universitarios, así que poco os puedo contar que no imaginéis ya. Eché en falta una cafetería abierta. Salir a tomar un café a los bares cercano, entre el calor y el partido "der Betí" fue una pesadilla.
Nota 8/10

Ponencias:
Sin ánimo de ofender, y siempre desde el respeto a los ponentes, me parecieron bastante flojas. Por dos motivos:
1.- Muchas se centraban en meros aspectos descriptivos, es decir, esto es el A.P.I de Drupal y podemos hacer, esto, esto y esto. Entiendo que 45 minutos no dan para más, pero muchos de los asistentes ya sabíamos de que iba eso de Drupal y cómo funcionaba.
2.- Me ha dado la impresión de que son muchas charlas. Es decir, en mi opinión reducir el número de intervenciones y realizar un filtro más duro, ayudaría mucho al evento: podría aumentar la calidad de las ponencias, y ayudaría un poco a la imagen.Por ejemplo en la charla de Nginx, para mí de las mejores de la Camp, calculo que como máximo seríamos unos 20. Las que más me han gustado han sido:
Nota 7/10

Comunidad: Lo mejor de lo mejor. "Hacer comunidad", prefiero este término a llamarlo "networking", pero es indiferente. He disfrutado mucho con @perusio charlando sobre oportunidades de negocio con Nginx y Drupal. Con @jcartelle drupaleando todo el fin de semana. Menudas aCAMPadas en el hall de Hotel, creo que algunos fliparon un poco, pues fue llegar de la Camp y continuar Drupaleando hasta altas horas.
Me ha hecho especial ilusión desvirtualizar a @patxangas y a @josereyero, pues para mí son un referente es este campo. Que gente más maja.
Sólo una pega: Muy pocas o nulas referencias al software libre. Eso me entristece mucho, más incluso que ver la charla de Brutus Theme en PowerPoint!
Nota 9/10 : Resto 1 por la cantidad de software privativo que pululaba en el ambiente.


Organización: Si bien el catering y la coordinación técnica se puede mejorar, uno que se ha metido en mil "fregados" como este, sabe y aprecia el esfuerzo de gente, que desinteresadamente organiza eventos tan buenos como DrupalCampSpain2011. Enhorabuena cracks!
Nota 8/10


Nota final: 8. O lo que es lo mismo, el próximo año repito fijo.




martes, 4 de octubre de 2011

tmpfs , Nginx y GNU/Linux

Hablando con @perusio en la pasada DrupalCampSpain2011 de Sevilla acerca del rendimiento de Nginx como servidor web, comentaba que el uso de sistemas de ficheros en RAM para caché en Nginx aumentaba considerablemente el rendimiento del sitio.

He revisado unas notas en relación a este particular, son las siguientes.

1.- Crear el directorio, en mi caso /var/tmpfs.
mkdir /var/tmpfs
2.- Montar el directorio.
mount -t tmpfs -o size=4096K,mode=700 tmpfs /var/tmpfs
3.- Aumentar el tamaño "on fire".
mount -o remount -o size=8192k /var/tmpfs

He visto en este sitio web el uso práctico de esta configuración en Nginx y su configuración para /etc/fstab:

tmpfs /var/lib/nginx tmpfs size=8M,uid=33 0 0



sábado, 1 de octubre de 2011

Notas DrupalCampSpain 2011 - Parte 1

He escrito unas notas en gedit que me gustaría compartir.

Título charla: "Desarrolladores: Bienvenidos a Drupal 7"
Ponente: @pcambra 01/10/11 11:00 horas

Notas
Entidades -> suple en cierta medida a los nodos en D6
En la actualidad todo es una entidad -> incluso los nodos.
A todo lo que sea una entidad podemos añadirle campos.
Drupal Commerce - Organic Group - Casos de estudio de código.

#2 EntityFieldQuery
#3 Entity API
#EntityMetadataWrapper
#EntityProperties

D7 "mata" casi totalmente el módulo CCK. En la actualidad usamos Field API.
Field API, hooks recomendados
.- hook_field_attach_*
.- hook_field_storage_*
.- hook_field_extra_fields_*
Cambios en Form API
.- Incorporaciones de AJAX
.- #states, #ajax, hook_form_alter desde plantilla
.- #limit_validation_errors
.- Elementos HTML5 a través de módulo
Proyecto DBTNG ha reformado la capa de abstracción de Drupal para acercala a un modelo OOP. "Olvídense de db_query" El módulo devel permite "debugear" la query.

Render arrays
Cache -> Cambios en la cache. drupal_static reemplaza a 'static'. Se integra con render array.

Novedades JS:
.- drupal_add_js() permite cambiar el peso de los elementos.
.- Jquery 1.4.4. y Jquery UI 1.8
.- Mejoras en los behaviors

File API
.- Son entidades.
.- Nuevo interfaz de fichero en D7
.- Introducción de streams : public:// private:// temporary://
.- file_unmanaged_*(copy,move, delete).

Code registry
.- Registro de código: para inventariar los ficheros y clases que se deben cargar en cada momento.
.- El único fichero que se carga automáticamente es el .module, el resto de ficheros, plugins, includes, tests...deben declararse en el array files []

Info Files
.- Soporta versiones en las dependencias
.- Configure : ruedecilla de administración
.- Required: fuerza que un módulo o theme sea obligatorio y no pueda deshabilitarlo.

Queue API
.- Nueva API para gestionar la cola de objetos
.- Varios componentes del core como Aggregator, Bach API o Cron ya la implementan de base.
.- Permite guardar elementos en memoria o bbdd y es totalmente configurable según el caso.

Cambios en Schema
.- En D7 declarar hook_schema en el fichero .install es suficiente

Simpletest en Core
.- D7 incorpora el módulo SimpleTest en su núcleo y tiene su unite testing e integration testing en todos los componentes por defecto
.- Tener los elementos verificados proporciona seguridad y calidad.

Plugin: selenium para Firefox.

viernes, 30 de septiembre de 2011

¿Por qué apoyar a una asociación sin ánimo de lucro?

Hace un par de días me comunicaron ex-miembros ya de una asociación sin ánimo de lucro, educadamente todo hay que decirlo, que dejaban de apoyar la causa y que causarían bajan tan pronto como fuese posible de una asociación que lleva desde el 2003 luchando, peleando y trabajando para difundir el software y la cultura libre en un pequeño pueblo de Galicia.

Al llegar a casa, analicé la situación y he sacado mis propias conclusiones, que intentaré plasmar en este espacio, respondiendo al título del post "¿Por qué apoyar a una asociación sin ánimo de lucro?".
  • Una asociación sin ánimo de lucro sigue y persigue un fin social, lejos de intereses económicos y/o de otra índole(profesional, p.e). ¿Crees en una sociedad justa? Pues apoya una causa justa. No hablo de dinero, hablo de apoyo: asistencia a eventos, colaboración, acción, difusión.
  • En segundo lugar por que es fácil y muy barato.¡Es fácil por que sólo tienes que estar! El apoyo de una persona, llámese socio/a,amigo/a, simpatizante o X, tan sólo un minuto, uno, en todo un año es muy importante, más incluso que cualquier aportación económica.
  • En tercer lugar por higiene cultural. Una asociación sin ánimo de lucro ayuda a limpiar, con sus eventos, charlas y discurso, la cultura de la apatía,del "sálvame" y de las "princesas del pueblo".
  • En cuarto lugar por salud mental. Importante en los tiempos que corren. Conocer gente nueva, con distintos modos de ver la vida ayuda,a mi entender,a sanear la mente.
  • En quinto lugar por reconocimiento. Llegar es muy fácil. Montar una charla o un evento es muy sencillo, pero mantenerlo año a año hasta llegar casi a una década, es muy complicado, y menos si no tienes recursos.¿No creéis que esta gente merece una reconocimiento a modo de apoyo o difusión?. Sinceramente, yo creo que sí.
Las asociaciones sin ánimo de lucro puede que no tengan recursos económicos, la organización de eventos no sea perfecta, pero su labor es indiscutible.Reflexionando llegué a la conclusión de que prefiero tener el carnet de una asociación sin ánimo de lucro, antes que ayudar a lucrar a una empresa.

La libertad es la capacidad que tiene el ser humano para poder obrar según su voluntad, amigo lector, actúe en consecuencia!


viernes, 19 de agosto de 2011

Moodle, Drupal, SHA512 y John The Ripper.

A ver si no me lío mucho y voy al grano.

Problema:

"Sincronizar" usuario de una plataforma Moodle 1.9.x y un Drupal 7. Los usuarios deben poder acceder al Drupal7 con la misma cuenta que Moodle. No he visto módulo SSO para Drupal 7 así que decide cocinarme yo el tema. El problema es que no sabía que en Drupal 7 no "hashea" el password con MD5 sino que lo hace con SHA512.

Marrón:

Las pruebas las hice con Drupal 6, hace un tiempo, y le he comentado por anticipado al cliente "eso con un script lo soluciono en una mañana". Mal. Muy mal. Pero bueno, el proyecto está en marcha y lo único que falta es solucionar este pequeño inconveniente.

Descripción del marrón:

  • "El" Moodle y "el" Drupal se ejecutan en distintas máquinas. No es problema, por lo menos yo no veo inconveniente, a priori.
  • Tengo funcionando un script en PHP que exporta los usuarios a un fichero CSV en la máquina Moodle. Sin problema.
  • La máquina Moodle envía por scp el fichero a la máquina Drupal. Sin problema.
  • En la máquina Drupal ejecuto un script lee los registros del CSV y los inserta en la tabla users de Drupal. Aquí está el marrón.
Como indicaba, Drupal no usa md5 sino sha512, por lo tanto si intentas logearte en el sistema no podrás acceder.

Posible solución:

La mejor solución, o la más adecuada en este caso, a mi modo de ver, sería instalar OpenLDAP y se acabarían los problemas, pero no es posible.

La posible solución(no válida a efectos de LOPD, privacidad y demás, pero bueno, al final lo que cuenta es solucionar el problema( ¿?¿?¿? ) ) sería.

A) Averiguar el password del usuario.
B) Insertar/actualizar el campo password de la tabla users de Drupal.


Para el punto B, Drush es la solución, máxime cuando vamos a usar PHP y bash(shell_exec vía PHP). No voy perder el tiempo en este punto, ya que en este post viene bien explicado.

Para el punto A) voy a utilizar el fichero listado_users_passwords.txt generado en la máquina que corre Moodle, cuyo contenido(es un ejemplo, así que no os molestéis en hacer el gamberro que he modificado los datos ^_^).
user,12c41121e857a474b1ce23e24166019, guillermopuertas@microsoft.com

Preparo el fichero para que John The Ripper pueda leerlo e intentar que me indique el password del usuario y poder pasarlo como parámetro a Drush para actualizar el password.

Ahora viene el verdadero motivo por el cual escribí este post: aplicaciones multihilo.

Instalar John en un sistema basado en Debian GNU/Linux no tiene ciencia. Aptitude o apt-get install john y problema resulto. Luego bastaría con:

john -format=raw-MD5 listado_users_passwords.txt

Y en cinco minutos tema resuelto. Esto está muy bien si sólo tienes un usuario, pero cuando son 429, necesitas sí o sí agilizar el proceso. La verdad es que todavía no tengo muy claro el concepto de multihilo a nivel de programación, pero lo que sí he observado es que muchas aplicaciones compiladas para distribuciónes Linux NO tiene soporte multicore, por lo tanto tu dual o quad core por el que has pagado XXX€ y del que tanto farda con tus compis, se queda en un cutre core la mitad del tiempo de proceso. John The Ripper no es una excepción. En el proceso anterior, abrí htop y pude comprobar a ojímetro como uno de los cores del procesador/(Intel(R) Core(TM)2 Duo CPU E7200 @ 2.53GHz) del PC del trabajo estaba más ocioso que Paquirrín en agosto.

Decidí investigar,leer y comprender el por qué. John The Ripper, por lo menos en la versión para Ubuntu/Debian GNU/Linux , sólo va a usar 1 core de tu máquina.En el wiki de Openwall encontré un artículo muy interesante acerca de "Parallel and distributed processing with John the Ripper", que por supuesto recomiendo leer. Seguí navegando y no recuerdo en qué web, leí algo acerca de la versión Jumbo de John The Ripper. En la práctica es un patch que permite usar varios cores. Lo mejor de todo no es esto. Lo más interesante es que me he enterado de que hay una "Community-enhanced version" Jumbo Powered. Genial. La descargo, la compilo y a probar. Juzguen ustedes mismos.

Comando: john -format=raw-MD5 listado_users_passwords.txt
Versión John: Version: 1.7.3.1-1
Paquete: deb
SSOO: Ubuntu 10.10 x86
Kernel: 2.6.35-30-generic-pae
Resultado John:
Loaded 1 password hash (Raw MD5 [raw-md5])
3169Y (user)
guesses: 1 time: 0:00:05:25 (3) c/s: 4876K trying: 314d* - 318bh

Comando: john -format=raw-MD5 listado_users_passwords.txt
Versión John: Version: 1.7.8-jumbo-5
Paquete: src(tar.gz)
SSOO: Ubuntu 10.10 x86
Kernel: 2.6.35-30-generic-pae
Resultado John:
Using raw-md5 mode, by linking to md5_gen(0) functions
Loaded 1 password hash (Raw MD5 [gen])
3169Y (user)
guesses: 1 time: 0:00:02:32 DONE (Fri Aug 19 13:06:13 2011) c/s: 10374K trying: 314d* - 3132E

No sé si al final consiguiré mi propósito, seguro que aplicaré KISS y solucionaré de otro modo el problema.

Nota: sí, he elimando el fichero .john de mi $home.