jueves, 29 de diciembre de 2011

Nginx y CDNs

No voy a hablar de lo bonito que es NGINX ni de lo rápido que sirve contenido, para eso hay miles de posts y "how to" que indican cómo hacerlo.

Desde que tuve el placer de conocer a un crack( @perusio) en la matería me han quedado claro un par de conceptos relacionados con NGINX :
  • En entornos LAMP(por favor, no entremos en que sí Apache o Cherokee, o Linux vs BSD, este tema aburre), el cuello de botella, a menudo está en el propio PHP,aunque con una configuración adecuada de PHP5-FPM se puede minimizar el "desastre".
  • NGINX "tira" con casi todo. Y con lo que no tira es por que aún nadie lo ha documentado. Queréis un ejemplo, visitad el espacio en github.com del Señor Perusio.
  • Sysadmins: si pensáis que Drupal es un simple CMS, y que las Drupaldas y Camps(no, no me refiero al de los trajes), son simples reuniones de maquetadores web, estáis completamente equivocados. [ Toma 1 ] [ Toma 2 ] .


Estoy jugando con CDNs. Si no sabéis qué es una CDN tenéis más información aquí y aquí. El clásico de los clásicos en la materia desde hace un tiempo es Amazon CloudFront, así que también he caído. Pero como suelo hacer, antes de meterme de lleno con algo, procuro documentarme. Conclusiones.

Listado de CDNs, sin orden ni prioridad, pero entiendo, tras las pesquisas realizadas que son las mejores tanto en calidad como en precio. También estoy seguro que se han escapado alguna, así que ya sabéis, enviad un comentario.

En Drupal sólo he buscado módulos relacionados con CDN para Amazon. He visto bastante cosas, aunque el que más me interesa, Amazon S3, está aún en versión alpha; y le he pillado un bug(no sé si es un bug en realidad) interesante. Sí instalas el módulo e introduces unas claves erróneas para validarte contra el REST de Amazon: adiós! Ni desinstalando el módulo he podido reconfigurar las opciones. Supongo tendré que pelearme con el módulo, cuestión de tiempo.

He leído un artículo interesante en Etnassoft sobre "Cargar JQuery desde un CDN". Muchas veces, al trabajar con un CMS pasamos por alto concepto básicos como los del post anterior.

Me ha llamado la atención un plugin para Firefox: S3Fox, que permite loggearte en el S3 de Amazon, revisar logs, transferencias....interesante.

De momento esto es todo, sigo vivo, que no es poco!

Salud!





miércoles, 28 de diciembre de 2011

Ganas...

no me faltan para continuar escribiendo en el blog. Lo único que necesitaba es un poco de descanso, sólo eso. He estado sometido a mucho stress, tanto profesional como personal. En lo laboral he tenido que meterme de lleno con C# bajo Window$.No me entusiasma, pero trabajar con gente profesional y con tantos conocimientos en la materia me ha hecho reflexionar y repleantearme ciertos matices sobre mi vida laboral, que, hace tan sólo un mes serían impensables. Ahora sí me apetece. He descubierto Mono, y ha sido como ver la luz al final de un túnel. Recuerdo, que desde la ignorancia, hace un tiempo,criticaba a Miguel de Icaza; ahora, con perspectiva, sólo tengo palabra de elogio. Reconocer los errores y aprender ellos, por lo menos a mi entender, es una consecuencia directa de la edad.

En lo personal(en relación con el software libre, quiero decir) sigo como siempre: ocupado. Últimamente muy centrado en Drupal.

En noviembre impartí un mini-taller de iniciación a Debian GNU/Linux en el local de la asociación Ociorum, en A Coruña. Lo que en un principio serían 2 horas, al final, se extendió a hasta las 00:15 llegando a superar las 5 horas de parloteo.

El pasado día 9 de diciembre, participé en la III Noite Drupal & GNU/Linux de Ordes. Personalmente, creo que ha sido la de menos nivel, pero seguimos conservando el buen rollo y las ganas de enseñar,y sobre todo de aprender.

El mismo día 9, comenzamos una nueva historia en O Zulo: "Curso de iniciación ao deseño web con Drupal". En resumen, un curso de formación básica con Drupal en modalidad mixta: teleformación + presencial. 13 personas inscritas y 10 asistentes. El curso ha sido un éxito. Pero no lo digo yo, lo han dicho los alumnos:

"El nivel demostrado por los profesores y la pasion desprendida estan fuera de duda. Para mi gusto, sin embargo, el curso es demasiado profundo para los profanos en informatica. Me alegra haber asistido porque es un salto de gigante esta introduccion, pero echo de menos una version mas "popular" del curso, algo para gente no "informatizada", que empiece explicando que es un servidor. De todas formas, es cierto que Drupal es la caña. Infinito. Veremos ahora cuando me ponga a practicar como me siento.... Enhorabuena por el interes y la disposicion del la Asocicacion. "

"Como sempre pasa neste tipo de cursos, o tempo do curso queda curto para o contido programado. Polo demáis, un 1010!"

"hola. la ostia, tíos, muy buen curso. muchas gracias."

En fin, que estos comentarios dan la fuerza necesaría para seguir en la lucha, por lo menos, un año más.

Salud!



domingo, 16 de octubre de 2011

snipMate

Uso vim desde que tengo memoria. En uno de mis post sobre la pasada DrupalCamp 2011 en Sevilla comentaba que una de las charlas, a mi entender, más interesantes fue la del compañerlo @patxangas "Drupal & VIM (Los hackers eligen VIM)".

Este post viene a cuento por un paseillo por github esta tarde que me llevó a snipMate para Vim. No voy a comentar nada más. Os dejo un vídeo:

snipMate.vim Introductory Screencast from Michael Sanders on Vimeo.

Si queréis más información sobre snipMate visitad la web del script en en vim.org.


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.


jueves, 18 de agosto de 2011

bootinst.sh : Permission denied Slax


Me gusta Slax. La uso a menudo para instalar Gentoo en otras máquinas. En caso es que esta tarde me disponía a instalar Gentoo en mi HP-Mini y durante un tiempo(unos minutos :P ) fue imposible cambiar el permiso el fichero pues al ejecutar bootinst.sh devolvía: Permission denied. Revisando los foros de Slax, un crack apuntaba que es probable que la distribución que utilizo (Debian GNU/Linux) montase el pendrive con el atributo noexec, por lo tanto no sería posible cambiar los permisos a +x al fichero en cuestión. La solución, como casi siempre en GNU/Linux, muy sencilla:
mount /dev/sdb1 -o exec /media/usb
Ahora ya podemos ejecutar bootinst.sh y disfrutar de Slax. Por cierto, nunca está de más echar un vistazo a las páginas del manual de mount.

miércoles, 17 de agosto de 2011

"Instalar" Gingerbread en un tablet Archos 101 [OpenAOS] [Android 2.3]

Ni en vacaciones tenía ganas de mirar este tema. No por tiempo, sino por que simplemente no me apetecía. Esta tarde, en lugar de darle vueltas a la configuración de los servidores del Kernel 2011, he preferido frikear un buen rato e instalar Gingerbread en el tablet Archos 101 del curre.

Antes de comenzar, que quede claro una cosa: este post se resume básicamente en "instalar CyanogenMod" en un tablet Archos. ¿Que no sabes lo que es CyanogenMod? Pues visitas la web del proyecto, muy interesante, por cierto. Ahora en serio y hablando claro: CyanogenMod es una "modificación" de Android 2.3 Gingerbread que añade funcionalidades extra a las proporcionadas por el original de Google.

Paso 1: Instalar el SDE de la web oficial de Archos.
  • Navegas hasta www.archos.com, link Soporte & Cuenta, item Descargas. En la parte inferior encontrarás un enlace a "Special developer edition firmaware", clic ahí.
  • Dependiendo del modelo de tablet elige el enlace que coincida con tu modelo. En mi caso el primero "SDE firmware for ARCHOS Generation 8 devices:"
  • Aceptas las condiciones y el aviso de Archos y descarga el fichero AOS en tu PC.
  • Activa el "modo" almacenamiento masivo en el tablet.
  • Copia el fichero que has descargado en la carpeta raíz del tablet.
  • Apaga el tablet.
  • Enciende el tablet y mantén pulsado el botón "Volumen -" unos 10 segundos hasta que veas el "Boot Menu".
  • Para desplazarse por el menú usa las teclas de "Volumen". Selecciona "Recovery System" pulsando la tecla de encendido. A continuación selecciona "Update firmware".
  • Una vez finalizado el proceso, apaga el tablet.
  • Enciende de nuevo el Archos 101 y verás que se ha añadido un nuevo ítem al menú "Developer edition menú".
  • Apaga de nuevo el tablet.
Paso 2: Instalar el bootloader OpenAOS.

¿Qué es OpenAOS? Es la versión Gingerbread para dispositivos Archos. Tiene más información en la web www.openaos.org.. Como veis voy al grano, citando sólo lo más importante para completar el proceso. Luego que cada uno se pare en lo que más le interese :P.
  • Del sitio web http://download.openaos.org/bubu/gen8/ descargas dos ficheros: initramfs.cpio.gz y zImage. Recomiendo comprobar la suma md5 de los dos ficheros. Recordad que estamos "jugando" con el firmware del tablet.
  • Enciende el tablet pulsando el botón "Volumen -" durante 10 segundos hasta que veas el "Boot menu".
  • Selecciona en el menú "Recovery System"/"Developer Menu Edition"/"Flash kernel and initramfs".
  • El almacenamiento USB debería haberse activado. Copia los fichero initramfs.cpio.gz y zImage en el directorio raíz del tablet y pulsa "Flash kernel and initramfs"
  • Espera a que finalice el proceso y apaga el tablet.
Paso 3: Instalar la imagen Cyanogenmod en el tablet.
  • Descargar la imagen más reciente desde la URL http://download.openaos.org/bubu/gen8/android/
  • Nombre del fichero debería ser similar a este: openaos-gingerbread-gen8-20110708_183154.img.gz
  • Descomprime el fichero y renómbralo a : openaos-gingerbread.img. MUY IMPORTANTE: Si no lo descomprimes y lo renombras NO podrás arrancar con Cyanogenmod.
  • Reinicia el Archos 101 con el clásico "Volumen - ". Elige "Developer Edition", espera unos segundos y verás un nuevo menú donde podrás elegir Gingerbread. He leído en algún sitio que si no aparece la entrada para el boot en Gingerbread, con un nuevo reinicio sería suficiente.
En teoría, y si no he olvidado nada, estos son los pasos(muy resumidos) para instalar Gingerbread en tu Archos 101. Por cierto, la mayor parte de este post viene de aquí. He añadido el paso 1, ya que en el original no se citaban los pasos. Si que decir tiene, que NO me responsabilizo de nada de lo que le pueda pasar a tu tablet.





jueves, 11 de agosto de 2011

No he perdido la fe...

...desde 1999 en el mundo del software libre ni en GNU/Linux. Ni siquiera en 2008 cuando compré un Apple Macbook.*1

Conocí la obra de Neal Stephenson, si no recuerdo mal, en 2005. Había leído fragmentos de Criptonomicón e incluso, con un buen amigo, charlado largo y tendido sobre cómo había cambiado su concepción de la vida después de leer Snow Crash.

Este verano en la mochila, a parte de unos cuantos gadgets, guardo también "En el principio... fue la línea de comandos.". Ayer, a punto de terminar una estupenda jornada playera, finalicé por no sé qué veces este ensayo. Desconozco la razón, pero tenías más ganas que nunca de llegar a mi casa, arrancar "mi" Debian GNU/Linux y pulsar la tecla "Vivir".

Vamos a dejar los desvaríos y a centrarnos en el verdadero motivo de este post. "En el principio...fue la línea de comandos" es una obra maestra, una verdadera apología de la libertad y de la capacidad innata para decidir libremente tu futuro, tus pensamientos...tu vida.

Si bien es cierto que Stephenson en la actualidad afirma que si reescribiese el libro no escribiría ni la mitad de las afirmaciones libertarias(en términos de software claro.Se confiesa, ahora, fiel usuario de MacOSX) que escribió en 1999, a mi este particular me trae sin cuidado.

Os recomiendo encarecidamente la lectura de este ensayo. En el que podréis deleitaros con párrafos tan maravillosos como estos:

"Todo esto es perfectamente congruente con la pertenencia a la burguesía, que es un estado tanto mental como material. Y explica por qué Microsoft se ve constantemente atacado en la Red desde ambos lados. Los que se siente pobres y oprimidos interpretan todo lo que hace Microsoft como parte de algún siniestro complot orwelliano. A los que les gusta considerarse usuarios inteligentes e informados, les desquicia lo chapucero que es Windows."

"Pero el precio que tuvimos que pagar los dueños de un Mac por una estética y un diseño superiores no fue meramente financiero. Había un precio cultural también, debido al hecho de que no podíamos abrir el ordenador y enredar con él. Doug Barnes tenía razón. Apple, pese a su reputación de ser la opción de los hackers creativos y contestatarios, había creado de hecho una máquina que desalentaba el hackeo, mientras que Microsoft, considerada una perezosa tecnológica y una plagiaria, había creado un vasto bazar de componentes sin orden ni concierto: una sopa primordial que había acabado autoorganizándose en Linux."


"Unix es difícil de aprender.El proceso de aprenderlo tiene múltiples pequeñas epifanías. Lo típico es estar a punto de inventar una herramienta o utilidad necesaria cuando te das cuenta de que alguien ya la inventó, y la incorporó, y eso explica algún extraño archivo o directorio que viste pero que nunca comprendiste realmente antes. "

Y el que da sentido a este blog y a gran parte de mi "vida y demás historias":

"¿Qué diría el ingeniero, una vez hubieras explicado tu problema y enumerado todas las insatisfacciones de tu vida? Probablemente te diría que la vida es una cosa muy difícil y complicada; que ninguna interfaz puede cambiar eso; que cualquiera que crea lo contrario es un imbécil; y que si no te gusta que escojan por ti, deberías empezar a elegir por ti mismo."







*1: Esto es otro debate. Considero que para poder hablar de un tema, cualquiera en general, y Apple en este particular, es necesario conocer, saber e informarse, antes de emitir un juicio de valor. Muchos de vosotros lo hacéis sin tener ni la más remota idea de lo que estáis diciendo. A menudo, yo también cometo este error, pero día a día intento no caer en el pozo de la ignorancia.

jueves, 4 de agosto de 2011

PPA para Hotot

Si usais Twitter o Identi.ca os habréis dado cuenta de las miles y miles de apss que existen para gestionar las cuentas.

He usado alguna que otra app para GNU/Linux, concretamente en GNOME, y la verdad es que ninguna me ha gustado, salvo Hotot.

Gwibber es muy pobre, las actualizaciones raras veces funcionan. Tweetdeck es de Adobe, por lo tanto propietario, entonces lo descarto. He probado incluso alguna para KDE que no recuerdo.

El caso es que hace unos meses buceando por Google Code encontré Hotot. Siempre(o casi siempre) funciona a las mil maravillas. He migrado mi ssoo de escritorio a Linux Mint y al buscar información sobre el proyecto me he enterado de que ya tienen PPA. Buena noticia. El proyecto ha madurado, me alegro!

Tenéis más info sobre los PPA de Hotot aquí: http://www.hotot.org/get_hotot.html

Autenticación básica Nginx en Debian 6.0

Desde hace un año aproximadamente uso Nginx en alguno de los servidores que administro y la verdad es que los resultados son más que aceptables, sobre todo desde que liberaron la versión 1.0.

No había trasteado aún no la autenticación básica sobre Nginx, pero es muy muy sencillo, incluso me atrevería a afirmar que más sencillo que en Apache2.

Indico los pasos que debéis seguir para habilitar "basic_auth" en Debian GNU/Linux Squeeze:

1.-Lee la documentación oficial!
2.- Instala apache2-utils(si, paradojas de la vida, dejas Apache2, pero....)
aptitude install apache2-utils
3.-Crea el fichero que almacenará las credenciales:

root@:/etc/nginx/conf.d# htpasswd -c /etc/nginx/conf.d/htpasswd admin
New password:
Re-type new password:
Adding password for user admin

4.- El fichero de configuración de Nginx debería ser similar a este:

server {
listen 3312;
auth_basic on;
server_name server.org;
include /etc/nginx/php.conf;
access_log /var/log/nginx/server.org.access_log;
error_log /var/log/nginx/server.error_log;
root /var/www/myfolder;
location /admin {
auth_basic "E logho ti, de quen ves sendo...";
auth_basic_user_file conf.d/htpasswd;
}
}

5.- Recargar la configuración de Nginx

root@x:/home/apermuy# /etc/init.d/nginx reload
Reloading nginx configuration: nginx.

jueves, 7 de julio de 2011

Qué opino del Google Nexus S...ahora.

Lo bueno se hace esperar: tengo un Google Nexus S. Creo que este es el primer post relacionado con Android, no lo recuerdo...

El principal motivo del cambio es la operadora: de Movistar a Vodafone. La verdad es que no he tenido problemas ni cobertura ni de navegación vía móvil con Movistar, pero después de 7 años como cliente, he decido cambiar. Cambio por que las tarifas(de todas la compañías en general) son abusivas, pero lo de Movistar es de juzgado de guardia.

Al grano:

Mi opinión sobre Android 2.3.4 "Gingerbread"
Lo bueno:
  • Rapidísimo, supongo que el terminal cuenta, pero esta versión está muy trabajada en temas relacionados con usabilidad y UX.
  • El soporte para múltiples cámaras funciona muy bien.
  • El teclado multi táctil idem que las cámaras.
  • El modo "hotspot" wifi es una auténtica pasada.¿No tienes internet?El Nexus S hace de punto de acceso wireless! :)
Lo malo:
  • Es pronto para una opinión sincera sobre lo malo de Android 2.3.4.
  • Me preocupa Google, todo: desde cómo ha cambiado el "don't be evil", la privacidad, Chrome, Android...Necesito probar, jugar,programar, explorar todavía más para poder afirmar si los buenos son tan buenos y los malos son tan malos.
Mi opinión sobre el hardware del Nexus S
  • Las especificaciones las tenéis aquí, así que no voy a hacer un copia-pega.
Lo malo:
  • Batería: Día y medio. Con 3gwatchdog y JuiceDefender(aunque no es necesario)
  • Tamaño: un poco grande. A veces me olvido de que realmente es un teléfono. Aunque esto no sé si es malo o no.
Lo bueno:
  • La pantalla es una pasada!
  • La wireless va de cine!
  • Peso: no es excesivo, se lleva bien! :)
  • Multimedia: he leído que si el Samsung Galaxy S II es mejor, que si HTC Desire HD...no śe. El Nexus S reproduce Youtube, Mp3, vídeos en general con una calidad más que aceptable. No soy un geek de los teléfonos, ni un "experto" de sites como Xataka: el Nexus S es una pasada, digan lo que digan es un gran terminal, el mejor, no lo sé.
  • Web y redes sociales: No sólo es cuestión del terminal, sino de SSOO, pero es muy manejable y navegar/twittear es un placer con este cacharro.
Resumiendo: pasar de un Nokia 5800 a un Nexus S es como viajar en un Seat 131 y cambiar a un Mercedes SLK AMG. Ustedes mismos!
Salud!

jueves, 23 de junio de 2011

SELinux, RHEL y cosas extrañas...

Últimamente entre reuniones de proyectos y coordinación apenas tengo tiempo para ponerme con temas de administración de sistemas, aún así, le sigo dedicando tiempo.
El caso es que he finalizado la fase de desarrollo de un sitio web con Drupal 7 y quería subirlo al servidor de producción. Todo iba como la seda hasta que al levantar el vhost me encuentro con :
[root@XXX httpd]# /etc/init.d/httpd restart
Parando httpd: [ OK ]
Iniciando httpd: Warning: DocumentRoot [/var/www/html/biblioteca] does not exist
Warning: DocumentRoot [/var/www/html/moodle-testing20/moodle] does not exist
[ OK ]


¡DocumentRoot does not exist! Imposible, pensé. Al final, después de darle muchas vueltas leí en este post que podría ser que SELinux impidiese añadir directorios. Basta con añadirlo al contexto de SE y listo:
chcon -R system_u:object_r:httpd_sys_content_t /var/www/html/biblioteca

martes, 21 de junio de 2011

logwatch

La próxima semana voy a impartir un curso de Drupal en Lugo, de 16:30 a 20:30 de Lunes a Viernes y el Sábado día 2 de 10:00 a 13:30.

El primer día lo dedicaré completo a conocer el entorno de trabajo, desde VirtualBox hasta PHPMyAdmin y demás.

El servidor web que utilizaremos será Apache2, como suele ser habitual en este tipo de cursos express. Veremos temas básicos, desde la instalación a la configuración de virtual hosts y como no, también algo de seguridad, que nunca está de más. Repasando apps interesantes me he topado con logwatch, que para los que no lo conocéis es un script en Perl que facilita la visualización amigable de logs. La instalación es vía apt y lo único de debemos hacer para que muestre información en la consola es copia el fichero de ejemplo a /etc/logwatch:
cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/

Es posible configurar los reportes para que se envíen vía email y demás, pero esto lo dejamos para otro momento. Ahí os va la salida de logwatch directamente en la consola:
################### Logwatch 7.3.6 (05/19/07) ####################
Processing Initiated: Tue Jun 21 08:51:10 2011
Date Range Processed: yesterday
( 2011-Jun-20 )
Period is day.
Detail Level of Output: 0
Type of Output/Format: stdout / text
Logfiles for Host: creba
##################################################################
--------------------- dpkg status changes Begin ------------------------

Installed:
libconfig-inifiles-perl 2.52-1
mytop 1.6-6
---------------------- dpkg status changes End -------------------------

--------------------- httpd Begin ------------------------

Requests with error response codes
404 Not Found
/calendar/view.php?view=month&cal_d=1&cal_m=12&cal_y=2037: 1 Time(s)
/calendar/view.php?view=month&cal_d=1&cal_m=3&cal_y=2030: 1 Time(s)
/calendar/view.php?view=month&cal_d=1&cal_m=6&cal_y=1925: 1 Time(s)
http://98.126.15.13/proxyheader.php: 1 Time(s)
http://healthforcaring.com/proxyheader.php: 3 Time(s)
http://www.ezhealths.com/proxyheader.php: 1 Time(s)
http://www.hardjob.net/proxyheader.php: 2 Time(s)


lunes, 13 de junio de 2011

Charla "Introducción ao software libre - O Grove 2011"

El pasado 6 de Mayo tuve la oportunidad de "evangelizar" en O Grove. Os dejo la presentación por si os interesa.



domingo, 24 de abril de 2011

Charla Drupal Xornadas Inestable Ordes

El pasado Jueves 21 tuve la oportunidad de dar una ponencia de introducción a Drupal en el marco de las VIII Xornadas de Software Libre de Ordes, organizadas por Inestable. Lo que en un principio se concretó para una charla de 90 minutos superó las dos horas y media, buena o mala señal la verdad es que no lo sé, pero sí pude comprobar cómo Drupal y el desarrollo web con CMSs interesa al público asistente a este tipo de eventos.

Desde aquí quiero agradecer la amabilidad de Nika, Salva, los demás miembros de Inestable y todos los asistentes al evento. ¡Seguid así amigos!

Si os interesa la presentación, como suele ser habitual, la he subido a mi rincón de Slideshare:

Obradoiro Drupal
Ver todas las presentaciones de Alberto Permuy Leal

La verdad es que el tema Drupal en Galicia, actualmente me tiene un poco abrumado. Hay mucho interés, y me da la impresión de que después de la II Noite Drupal & GNU/Linux esto va a ir a más. Estamos organizando la segunda, y ya nos han ofrecido colaboración para la III. No soy ni pretendo ser un gurú del tema. Me interesa Drupal por que reconozco que es software de calidad, y lo más importante : es libre.

Salud!

martes, 19 de abril de 2011

Exportar consulta MySQL a CSV desde Python

A modo de apunte dejo un pequeño script en Python para exportar una consulta MySQL a CSV. Estoy bastante liado con un pequeño proyecto relacionado con Moodle y Drupal. El caso es que NO se puede tocar NADA del Moodle y los mismos usuarios de Moodle deben tener acceso a Drupal. He dedicado tiempo a buscar un módulo que permita cambiar el modo de validación de Drupal, pero no he encontrado apenas información. No, no me vale el MoodleSSO.


#!/usr/bin/python
#-*- coding: UTF-8 -*
import _mysql
mysql_servidor = 'localhost'
mysql_usuario = 'user'
mysql_clave = 'ejemplo'
mysql_bd = 'moodle'
conexion = _mysql.connect(host=mysql_servidor, user=mysql_usuario, passwd=mysql_clave, db=mysql_bd)
sql = "SELECT username,password,email INTO OUTFILE '/tmp/drupal_export.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '\\\\' FROM mdl_user "
conexion.query(sql)
conexion.close()

martes, 12 de abril de 2011

apt y cacheo de paquetes



Preparando la "I Noite Drupal & GNU/Linux " que celebraremos en Mugardos este próximo Viernes día 15 de Abril me ha surgido una duda que sinceramente sí había visto en alguna ocasión pero no recordaba el "tip" para solucionarla. ¿Cómo le indico a apt que "tiene que salir" por un proxy? Por lo que he visto podemos hacerlos dos modos.

Modo 1: El chapucero.

Añadimos al fichero /etc/bash.bashrc lo siguiente:

export http_proxy=”http://proxy.noite.drupal:3128”
export ftp_proxy=”http://proxy.noite.drupal:3128”


Modo 2: El modo "pro".

Creamos el fichero /etc/apt/apt.conf.d/proxy con el siguiente contenido.

Acquire::http::Proxy "http://proxy.noite.drupal:3128/";
Acquire::ftp::Proxy "http://proxy.noite.drupal:3128/";


Particularmente me decanto por la opción dos por un motivo fundamental. En el modo 1 optamos por definir dos variables de entorno, estando estas disponibles para cualquier script o aplicación que lo necesite. En la opción 2 sólo indicamos a APT que debe salir por un proxy.

Rizando el rizo, he visto que en lo repositorios de Debian GNU/Linux existe una aplicación que se llama apt-cacher, que en resumidas cuentas viese a ser un proxy para apt. No voy a tocar nada más de este tema, si os interesa en el blog de Alberto Molina se explica muy bien el funcionamiento básico de la aplicación apt-cacher.

sábado, 9 de abril de 2011

Remake: Unixbench

Preparando el servidor OpenVZ para la "I Noite Drupal & GNU/Linux" de Mugardos he encontrado una perla en Google Code: UnixBench. El objetivo de la aplicación es muy claro: ser un indicador de rendimiento para sistemas operativos basados en Unix partiendo de los resultados base de un SPARCstation 20-60(valor 10,0)

Entre los múltiples tests realizados destacan:
.- Dhrystone : Prueba de manejo de cadenas(sin coma flotante :P)
.- Whetstone: Mide la velocidad y efiencia de las operaciones con coma flotante.
.- Execl Throughput : mide la velocidad a la cual los datos pueden ser transferidos de un archivo a otro, con diferentes tamaños de búfer.

Un consejo. No es un test rápido. En un AMD Athlon(tm) 64 X2 Dual Core Processor 4800+ con frecuencia de 2,5ghz y 8GB de RAM el test necesitó más de 40 minutos para finalizar y mostrar resultados.
Para curiosos, geek y demás fauna, ahí van los resultados:



Version 5.1.3 Based on the Byte Magazine Unix Benchmark

Multi-CPU version Version 5 revisions by Ian Smith,
Sunnyvale, CA, USA
January 13, 2011 johantheghost at yahoo period com


1 x Dhrystone 2 using register variables 1 2 3 4 5 6 7 8 9 10

1 x Double-Precision Whetstone 1 2 3 4 5 6 7 8 9 10

1 x Execl Throughput 1 2 3

1 x File Copy 1024 bufsize 2000 maxblocks 1 2 3

1 x File Copy 256 bufsize 500 maxblocks 1 2 3

1 x File Copy 4096 bufsize 8000 maxblocks 1 2 3

1 x Pipe Throughput 1 2 3 4 5 6 7 8 9 10

1 x Pipe-based Context Switching 1 2 3 4 5 6 7 8 9 10

1 x Process Creation 1 2 3

1 x System Call Overhead 1 2 3 4 5 6 7 8 9 10

1 x Shell Scripts (1 concurrent) 1 2 3

1 x Shell Scripts (8 concurrent) 1 2 3

2 x Dhrystone 2 using register variables 1 2 3 4 5 6 7 8 9 10

2 x Double-Precision Whetstone 1 2 3 4 5 6 7 8 9 10

2 x Execl Throughput 1 2 3

2 x File Copy 1024 bufsize 2000 maxblocks 1 2 3

2 x File Copy 256 bufsize 500 maxblocks 1 2 3

2 x File Copy 4096 bufsize 8000 maxblocks 1 2 3

2 x Pipe Throughput 1 2 3 4 5 6 7 8 9 10

2 x Pipe-based Context Switching 1 2 3 4 5 6 7 8 9 10

2 x Process Creation 1 2 3

2 x System Call Overhead 1 2 3 4 5 6 7 8 9 10

2 x Shell Scripts (1 concurrent) 1 2 3

2 x Shell Scripts (8 concurrent) 1 2 3

========================================================================
BYTE UNIX Benchmarks (Version 5.1.3)

System: polinico: GNU/Linux
OS: GNU/Linux -- 2.6.32-5-openvz-amd64 -- #1 SMP Mon Mar 7 22:25:57 UTC 2011
Machine: x86_64 (unknown)
Language: en_US.utf8 (charmap="ANSI_X3.4-1968", collate="ANSI_X3.4-1968")
CPU 0: AMD Athlon(tm) 64 X2 Dual Core Processor 4800+ (2009.1 bogomips)
Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET
CPU 1: AMD Athlon(tm) 64 X2 Dual Core Processor 4800+ (2009.1 bogomips)
Hyper-Threading, x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET
18:09:05 up 1:48, 3 users, load average: 0.25, 0.30, 0.23; runlevel 2

------------------------------------------------------------------------
Benchmark Run: sáb abr 09 2011 18:09:05 - 18:38:11
2 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables 18476798.9 lps (10.0 s, 7 samples)
Double-Precision Whetstone 2613.2 MWIPS (9.9 s, 7 samples)
Execl Throughput 1260.8 lps (29.6 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks 308577.4 KBps (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks 100308.1 KBps (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks 697625.5 KBps (30.0 s, 2 samples)
Pipe Throughput 987893.9 lps (10.0 s, 7 samples)
Pipe-based Context Switching 102266.6 lps (10.0 s, 7 samples)
Process Creation 3968.2 lps (30.0 s, 2 samples)
Shell Scripts (1 concurrent) 2277.5 lpm (60.0 s, 2 samples)
Shell Scripts (8 concurrent) 804.0 lpm (60.0 s, 2 samples)
System Call Overhead 2051427.4 lps (10.0 s, 7 samples)

System Benchmarks Index Values BASELINE RESULT INDEX
Dhrystone 2 using register variables 116700.0 18476798.9 1583.3
Double-Precision Whetstone 55.0 2613.2 475.1
Execl Throughput 43.0 1260.8 293.2
File Copy 1024 bufsize 2000 maxblocks 3960.0 308577.4 779.2
File Copy 256 bufsize 500 maxblocks 1655.0 100308.1 606.1
File Copy 4096 bufsize 8000 maxblocks 5800.0 697625.5 1202.8
Pipe Throughput 12440.0 987893.9 794.1
Pipe-based Context Switching 4000.0 102266.6 255.7
Process Creation 126.0 3968.2 314.9
Shell Scripts (1 concurrent) 42.4 2277.5 537.2
Shell Scripts (8 concurrent) 6.0 804.0 1340.0
System Call Overhead 15000.0 2051427.4 1367.6
========
System Benchmarks Index Score 667.9

------------------------------------------------------------------------
Benchmark Run: sáb abr 09 2011 18:38:11 - 19:07:26
2 CPUs in system; running 2 parallel copies of tests

Dhrystone 2 using register variables 36832151.8 lps (10.0 s, 7 samples)
Double-Precision Whetstone 5246.4 MWIPS (9.9 s, 7 samples)
Execl Throughput 3706.6 lps (29.6 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks 402547.4 KBps (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks 121746.1 KBps (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks 911624.0 KBps (30.0 s, 2 samples)
Pipe Throughput 1990029.1 lps (10.0 s, 7 samples)
Pipe-based Context Switching 437120.2 lps (10.0 s, 7 samples)
Process Creation 10823.0 lps (30.0 s, 2 samples)
Shell Scripts (1 concurrent) 6206.0 lpm (60.0 s, 2 samples)
Shell Scripts (8 concurrent) 809.3 lpm (60.1 s, 2 samples)
System Call Overhead 2618061.3 lps (10.0 s, 7 samples)

System Benchmarks Index Values BASELINE RESULT INDEX
Dhrystone 2 using register variables 116700.0 36832151.8 3156.1
Double-Precision Whetstone 55.0 5246.4 953.9
Execl Throughput 43.0 3706.6 862.0
File Copy 1024 bufsize 2000 maxblocks 3960.0 402547.4 1016.5
File Copy 256 bufsize 500 maxblocks 1655.0 121746.1 735.6
File Copy 4096 bufsize 8000 maxblocks 5800.0 911624.0 1571.8
Pipe Throughput 12440.0 1990029.1 1599.7
Pipe-based Context Switching 4000.0 437120.2 1092.8
Process Creation 126.0 10823.0 859.0
Shell Scripts (1 concurrent) 42.4 6206.0 1463.7
Shell Scripts (8 concurrent) 6.0 809.3 1348.9
System Call Overhead 15000.0 2618061.3 1745.4
========
System Benchmarks Index Score 1258.5

miércoles, 6 de abril de 2011

Sobre Memcached, Apache2 y Drupal



Llega un momento en la vida de un sitio web levantado con Drupal(este es mi caso) en que, bien por el número de visitas o por la complejidad de las consultas, se hace necesario instalar y configurar un sistema de cacheo de contenido que agilice el proceso de envío de información.

No voy a entrar en que si proxy inverso, APC o mil gaitas, sólo trataré el proceso de instalación y configuración de memcache ejecutado en una máquina corriendo Debian GNU/Linux 6.0 Squeeze y Apache2 un sitio web con Drupal 6. Comenzamos descargando y activando el módulo "Memcache API and Integration" del sitio drupal.org.

A continuación, lo primero que debemos hacer es actualizar las fuentes de nuestra distribución Debian GNU/Linux:
[root@localhost] aptitude update

Una vez finalizado el proceso instalaremos dos paquetes:
  • memcached: "daemon" o servicio de cacheo diseñado específicamente para que los sitios web dinámicos decrementen la carga de las bases de datos almacenados objetos en memoria. Danga Interactive desarrolló memcached para mejorar la velocidad de LiveJournal.com un sitio que tuvo más de 20 millones de vistas de páginas dinámicas cada día para 1 millón de usuarios con un puñado de servidores web y un puñado de servidores de base de datos. memcached reduce la carga de la base de datos a casi nada, mejorando los tiempos de carga de las páginas para los usuarios, la utilización de los recursos y haciendo más rápido el acceso a las bases de datos.
  • php5-memcache y php5-memcached: Extensión que permite a las aplicaciones escritas en PHP5 comunicarse con los servidores memcache.
Como (casi) siempre en Debian GNU/Linux:
[root@localhost] aptitude -y install php5-memcached php5-memcache memcached

Si este paso se ha ejecutado correctamente debemos configurar qué tipo de estrategia hash utilizará memcache para manejar los objetos de la caché. Dos opciones : standard o consistency. Por lo que leído la tendencia es utilizar esta última, ya que si estamos trabajando con varios servidores memcache evitaríamos problemas al tener que compartir una misma instancia de ejecución de PHP-Apache2. Resumiendo:

Añadimos:

memcache.hash_strategy="consistent"
al fichero /etc/php5/apache2/php.ini.

Modificamos el fichero settings.php de nuestro sitio Drupal y añadimos:


$conf = array(
// The path to wherever memcache.inc is. The easiest is to simply point it
// to the copy in your module's directory.
'cache_inc' => './sites/default/modules/memcache/memcache.inc',

'memcache_servers' => array(
'localhost:11211' => 'default',
'localhost:11212' => 'content',
'localhost:11213' => 'filter',
'localhost:11214' => 'menu',
'localhost:11215' => 'page',
'localhost:11216' => 'views',
),
'memcache_bins' => array(
'cache' => 'default',
'cache_content' => 'content',
'cache_filter' => 'filter',
'cache_menu' => 'menu',
'cache_page' => 'page',
'cache_views' => 'views',
),

Lo realmente curioso de esta configuración para Drupal6, o por lo menos a mi llama mucho la atención, es la posibilidad de dedicar distintas máquinas a diferentes objetos de cache: views, menús...Intentaré darle una vuelta a este tema.
Para finalizar, he visto en este blog, que hay gente que reemplaza el fichero /etc/init.d/memcached por un con contenido similar a este:




#!/bin/bash
prog="memcached"
start() {
echo -n $"Starting $prog "
# Sessions cache.
memcached -m 16 -l 0.0.0.0 -p 11211 -d -u nobody
# Default cache.
memcached -m 32 -l 0.0.0.0 -p 11212 -d -u nobody
# Block cache.
memcached -m 32 -l 0.0.0.0 -p 11213 -d -u nobody
# Content cache. Holds fully loaded content type structures.
memcached -m 16 -l 0.0.0.0 -p 11214 -d -u nobody
# Filter cache. Usually the busiest cache after the default.
memcached -m 32 -l 0.0.0.0 -p 11215 -d -u nobody
# Form cache.
memcached -m 32 -l 0.0.0.0 -p 11216 -d -u nobody
# Menu cache.
memcached -m 32 -l 0.0.0.0 -p 11217 -d -u nobody
# Page cache. Bigger than most other caches.
memcached -m 128 -l 0.0.0.0 -p 11218 -d -u nobody
# Views definition cache.
memcached -m 1 -l 0.0.0.0 -p 11219 -d -u nobody
# Views data cache (may need to be increased if heavily used).
memcached -m 32 -l 0.0.0.0 -p 11220 -d -u nobody

# More caches that might be added later:
# Users table.
#/usr/bin/memcached -m 24 -l 0.0.0.0 -p 11219 -d -u nobody
# Path source cache.
#/usr/bin/memcached -m 4 -l 0.0.0.0 -p 11220 -d -u nobody
# Path destination cache.
#/usr/bin/memcached -m 6 -l 0.0.0.0 -p 11221 -d -u nobody
RETVAL=$?
echo
return $RETVAL
}

stop() {
if test "x`pidof memcached`" != x; then
echo -n $"Stopping $prog "
killall memcached
echo
fi
RETVAL=$?
return $RETVAL
}
case "$1" in
start)
start
;;
stop)
stop
;;

restart)
stop
start
;;
condrestart)
if test "x`pidof memcached`" != x; then
stop
start
fi
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart}"
exit 1
esac

¿Por que digo similar? Pues muy sencillo, basta con teclear:
memcached -h
y observar todos los parámetros de configuración que acepta en la línea de comandos. En mi opinión se debe tener especial cuidado a la hora de manejar la cantidad de memoria máxima a utilizar, el protocolo de escucha, el número máximo de conexiones simultáneas. 






[ Memcache funcionando en Drupal 6 ]


I'm back



He vuelto. Después de más de 1 mes sin aportar nada a este blog confirmo que sigo vivo. Por motivos de trabajo, asociación y personales apenas he tenido tiempo para escribir. Tengo varios apuntes que trasladar aquí, intentaré hacer lo más rápido posible.
Saludos y gracias por leerme!

lunes, 21 de febrero de 2011

Parsear XML con Python



Desde hace unas semanas estoy leyendo, estudiando y practicando Python. Es un lenguaje tan apasionante como interesante. En pocos días, me atrevería a decir que incluso horas, con unos conocimientos básicos de programación, puedes crear verdaderas maravillas pythonianas.
El caso es en la Asociación Comunidade O Zulo , hemos puesto en marcha un proyecto para customizar una distribución Ubuntu Linux y completarla con material multimedia. Para realización las aportaciones multimedia de este proyecto, todavía un embrión pero os adelanto que tiene muy buena pinta, hemos levantado un sitio web en Drupal dónde los usuarios podrán enviar las imágenes. [Explicación técnica que omito para no aburrir al personal] Para recuperar las imágenes estamos desarrollando un script en Python que lee el XML y vía SQLite completa un álbum en Shotwell. El script básico para parsear el XML es el siguiente:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# xml-parser-ozulo-0.0.1-dev.py
#
# Copyright 2011 Alberto Permuy Leal
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
import sys, urllib
from xml.etree import ElementTree as et


def main():
documento = et.parse(urllib.urlopen('http://www.comunidadeozulo.org/rss.xml')).getroot()
entradas = documento.getiterator('item')
for una_entrada in entradas:
elementos = una_entrada.getiterator()
for un_elemento in elementos:
if un_elemento.tag == 'title':
print un_elemento.text
return 0

if __name__ == '__main__':
main()

Es casi idéntico a esta entrada, salvo que he añadido el parse vía urllib.

martes, 8 de febrero de 2011

Validar formato IPv4 con bash

#!/bin/bash
test $(echo $1 | egrep '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$')
if [ $? == 0 ]; then
echo "Ip correcta"
else
echo "Ip no válida"
fi
A modo de minichuleta, dejo por aquí este sencillo script en bash para comprobar si el formato de una IPv4 que se pasa como parámetro al script es correcto o no.

lunes, 7 de febrero de 2011

Debian 6.0 ¡Cómo pasa el tiempo!



Recuerdo la primera vez que escuché hablar de Debian GNU/Linux. Un tal Carlos, me comentaba que no perdiese el tiempo con RedHat, mientras me "dejaba" tres CDs con Debian Potato 2.2 terminando el año 2000. Con sólo un año de experiencia en GNU/Linux, la primera vez que me puse a instalar Debian GNU/Linux creí conocer de cerca el infierno.

Recuerdo que en 2003 y cuando aún por aquel entonces usaba como distribución de escritorio SuSE Linux, un chico que realizaba las prácticas en la misma empresa que yo por aquel entonces, llegaba con 7CDs de Debian Woody. Luego llegarían Sarge, Etch, Lenny y ahora Squeeze.

Cada release de Debian GNU/Linux, a mi entender debe ser celebrada, como mínimo tanto como un título de cualquier equipo de fútbol o selección que se precie. Es un esfuerzo de miles de personas que trabajan por y para la comunidad. No voy a soltar ahora mismo la clásica chapa acerca del software libre y las bondades de Debian GNU/Linux. Mi particular celebración para esta versión 6.0 es citar los aspectos que me han resultado, cuando menos, curiosos en relación con otras versiones.

  • Han renovado el aspecto de www.debian.org. Todo hay que decir, que si bien la versión anterior y la actual no difieren mucho, esta última si está mejor estructurada y por lo menos, a primera vista, no parece que te encuentras preso de un flashback a los '90.
  • Debian Social. Impresionante el seguimiento desde Twitter e Identi.ca de todos los twitteros linuxeros. Para muestra, un botón.
  • ¿Ha sido la release menos mediática? Es posible, lo respeto pero no lo comparto. Leo en ZDNet que sí, que quizá el asentamiento de Ubuntu como distro más amigable a desplazado al ostracismo a Debian GNU/Linux. A lo mejor soy un bicho raro, pero cuando me hablan de Ubuntu, mis pensamientos siempre pasan o se dirigen a Debian GNU/Linux.
  • GNU/kFreeBSD. Es la primera release que tiene una versión sin un núcleo Linux. ¡ Muy buena noticia!
  • Núcleo Linux completamente libre. Cito directamente de Debian.org "Otra novedad es el núcleo de Linux completamente libre. En esta versión el núcleo ya no contiene archivos problemáticos de firmware. Estos se han dividido en paquetes separados y se han movido fuera del archivo principal de Debian al área no libre («non-free») del archivo, la cual no está activada de manera predeterminada".
Quizá no haya sido la versión más mediática, pero, estimados lectores, el reconocer el gran trabajo y enorme esfuerzo de la comunidad Debian para release de Squeeze, es cuando menos, digno de elogio. Por lo me que a mi respecta, como siempre que la decisión sobre el SSOO y arquitectura dependan de mi criterio: siempre Debian GNU/Linux.¡Enhorabuena a toda la comunidad!

martes, 1 de febrero de 2011

Firmware WRT54G v7


Desde hace algunos años(2005) usos productos Linksys. Tengo dos WRT54G, uno v1 y otro v7. Alguna tarjeta PCI Wireless, otra USB, y creo recordar que algún AP por ahí perdido. Me gusta por la relación calidad precio y por que Cisco Systems está por detrás.


El caso es que el ModemRouter de R(proveedor de fibra para Galicia(España)) es una auténtica patata. Es un Scientific Altanta 217893036 .¿Por qué es una patata?
  • La interfaz web es de los 90, poco intuitiva y muy cutre.
  • Ayer quise jugar con RIP y nada, no soporta protocolos de enrutamiento.
  • Se cuelga. Misteriosamente después de unos 30 minutos el "cacharro" se queda colgado y tienes que reiniciarlo.
Si desactivas la interfaz wireless del aparato funciona como la seda. Conclusión: instalar el WRT54G v7 en el piso de arriba. De momento estoy probando con dos redes wireless, una para cada piso. El motivo de este post no deja de ser curioso. Después de estar un tiempo sin usar un cacharrito de este tipo, me gusta actualizar el firmware, ya que siempre suelen corregir bugs y añaden alguna que otra funcionalidad. El caso es que este modelo, dejando a un lado que no se le puede instalar el DDWRT al ser un router proscrito, parece ser que cuando la gente de Linksys "descubrió" que se podía flashear e instalar GNU/Linux , disminuyeron la RAM y el tamaño de la flash, amén de pasarse por el forro la licencia GPL, pero eso en otro post. Voy a seguir que me lio. El caso es que en la web de Linksys no existe ninguna referencia relacionada con el firmware de "mi cacharro", y claro ahora como está muy de moda el tema del "live chat", pues "click, vamos a chatear con estos tipos, a ver qué me cuentan...."

[ WRT54G ]

[2011-01-31 12:09:36] Please wait... Your number in the queue: 1
[2011-01-31 12:09:36] A representative will be joining shortly.
[2011-01-31 12:09:36] A representative will be with you in 4 minute(s)
[2011-01-31 12:09:57] A representative will be with you in 1 minute(s)
[2011-01-31 12:10:21] Vaughn (30070E) has joined this session.
[2011-01-31 12:10:32] Vaughn (30070E): Hello Alberto Permuy! Welcome to Linksys Live Chat. How may I help you?
[2011-01-31 12:10:47] Alberto Permuy: Hi! I'm looking for WRT54G firmware updates in linksys's website, but I can't find, could you help me?
[2011-01-31 12:11:00] Vaughn (30070E): Sure
[2011-01-31 12:11:08] Vaughn (30070E): May I know which country are you based in?
[2011-01-31 12:11:20] Alberto Permuy: Spain
[2011-01-31 12:11:48] Vaughn (30070E): Can you please confirm the serial number of your linksys product?
[2011-01-31 12:12:21] Alberto Permuy: CDFE1XXXXXX
[2011-01-31 12:13:38] Vaughn (30070E): The device seems to be Out of warranty, but I will provide you with the link, if you still face any issues, please contact our phone support at 902 027 997 0.09€/call + 0.07€/min Red fija: establecimiento de llamada 0.09€ + 0.07€/minuto. Estos precios pueden variar en función del operador o en el caso de que usted llame desde un teléfono móvil. Monday - Friday 10 AM - 8 PM (CET)
[2011-01-31 12:13:45] Vaughn (30070E): Please let me know the version
[2011-01-31 12:14:08] Alberto Permuy: V 7
[2011-01-31 12:18:31] Vaughn (30070E): Thank you for your patience!
[2011-01-31 12:18:38] Vaughn (30070E): Please click on following link

El caso es que, a pesar de que han tardado un par de horas en enviarme el enlace para la descarga, al final lo he recibido. Supongo que esto no dejará de ser más que una anécdota, pero si puedo ayudar a alguien que se encuentre en la misma situación, ahí os dejo el link.

Firmware Version: v7.00.8 build 008, Jul. 9, 2009
Firmware Verification: F3BF743BD7ED4D242EB84012F467C0B7
Descargar Web Oficial Linksys
Descargar desde pub.permuy.org

domingo, 30 de enero de 2011

Compilar Dropbox para AMD64

Desde hace unos días he cambiado Ubuntu por Debian AMD64 en el macbook. Salvo la tarjeta wireless y la webcam(que apenas utilizo) no he tenido mayores problemas.Usando module-assistant para la wireless en cinco minutos y previa lectura del wiki de Debian : "habemus wireless".

El problema viene cuando usas la rama unstable y quieres instalar aplicaciones que depende de librerías de versiones anteriores. Eso mismo ha sucedido con Dropbox.He descargado el .deb para arquitectura de 64 bits y no he podido concluir la instalación, por lo que decido compilar nautilus-dropbox. Es muy sencillo
aptitude update && aptitude install libnautilus-extension-dev python-docutils

Ahora descomprimimos el paquete , compilamos e instalamos:
tar jxvf nautilus-dropbox-0.6.7.tar.bz2 && cd nautilus-dropbox-0.6.7
./configure && make && make install




domingo, 16 de enero de 2011

BETT2011 Londres

He tenido la oportunidad de asistir al BETT2011, el mayor evento de tecnología educativa que se celebra anualmente en Londres.La opinión general del evento es muy positiva. Voy a intentar hacer un breve resumen indicando lo que me ha gustado y lo que no.

Me ha gustado.

.- La organización: La inscripción vía web ha sido muy sencilla.Al llegar al Olympia lo único que tenías que hacer es presentar el código de barras que previamente te habían enviado al buzón de correo e inmediatamente generaban tus credenciales. A posteriori ese código de barras impreso en la credencial, servía para que te lo escaneasen en los expositores para hacer SPAM.
.- Localización: Muy fácil llegar en autobús o en metro. El último día, cansado ya de tanta tecnología educativa, decidí dar una vuelta por el barrio a descubrir el otro BETT.
.- Variedad: Si en esto está el gusto, han acertado. Desde pizarras digitales, software para pizarras, filtros de contenido por hardware y software, robots, maletines, cámaras, telefonía IP, casi de todo podías encontrar en el BETT2011.
.- Internet café: Por cortesía de Netgear, se habilitaron unas zonas de libre acceso a internet, tanto access point como PCs para uso común.
.- Cafetería: He contado alrededor de unos 6 o 7 espacios para comer o reponer fuerzas.


No me ha gustado.
.- Demasiada paja. Muchos stands de software para pizarras, en muchos casos podría decir que muy pobres. Abundancia de información en papel, una vergüenza para los tiempos que corren.
.- Demasiado grande. El BETT2011 es inmenso, necesitaría dos días completos para ver todos y cada unos de los stands. En una ocasión he tenido la sensación de estar completamente perdido.
.- Software privativo. Todo, a excepción de un par de stands, estaban relacionados con software privativo. Una pena.
.- Muy caro. Comer y beber en el BETT2011 es muy caro. Una Pepsi 2,10 libras, es decir, casi 2,50€. Podéis imaginar lo que cuesta un menú "enlatado" con ensalada y bebida....un robo!


Lo mejor.
[ Detalle de SumoBot Kit ]

Active Robots. Una empresa dedicada a comercializar kits para introducirse en la robótica y la electrónica. Estos kits sirven para aprender a programar en C y en PBASIC, y de paso para divertirse con estos robots. La verdad es que para mí fue lo mejor. Los dos días estuve en el stand. He de decir que los tipos de ActiveRobots son muy majos, y respondieron a todas y cada una de las preguntas planteadas...unos cracks! Enhorabuena!
Netsweeper: Filtro de contenidos web para centros educativos. Por lo que me han comentado, ellos te proporcionan un RPM que aconsejan correr en CentOS, y después te aconsejan cómo integrar éste dentro de tu infraestructura de red: detrás o delante de un firewall, dentro de una VPN...
Bloxx: Más filtro de contenido. En este caso software y hardware. Similar al Netsweeper, salvo la diferencia de que con BLOXX no tienes que comprar hardware, ellos te proporcionan un servidor de 1U con el producto. BLOXX es capaz de filtrar contenido web, email, contenido de Youtube y un sin fin de funcionalidades, todo desde una cuidada interfaz web. Me sorpendió la facilidad con la que se puede integrar la solución con un Active Directory de Microsoft Windows, así como crear reglas para grupos de usuarios.


El tema de las pizarras digitales lo pasaré muy por encima, es un mundo que desconozco, y salvo casos concretos, mi interés es obligatoriamente profesional. No me gusta que me traten como un idiota, esa es la sensación que he tenido en el mini-tour por el stand de SMART. En lugar de explicar como una ametralladora todo lo que hacen sus pizarras, podrían haber montando en su espacio un aula y hacer una demostración de cómo usar una pizarra en clase. Eso sí sería interesante.

Microsoft, DELL, HP, Toshiba, Asus y demás fabricantes tenían presencia en BETT2011. A mi modo de ver más "a calzador" que por tener una relación directa con la formación. Por eso no voy a hacer ninguna referencia al respecto.

Para finalizar, señalar que no había un espacio tipo auditorio dónde asistir a ponencia de gente versada en la materia, y eso, señoras y señores organizadores del BETT, es algo que se puede mejorar para ediciones posteriores.

¿Volverías al BETT? Por supuesto, la primera para aprender. En la segunda supongo iré al grano.