Actualización a Ubuntu 14.04 Errores encontrados

Ayer realizé una actualización de  mi Ubuntu 13.10 a 14.04. Me estaba resistiendo por evitar los típicos problemas de actualización brusca de versión, pero veía que 14.10 se aproxima y el cambio ahora sí que iba a ser brusco. Los problemas que me he encontrado en este upgrade han sido varios:

  • Gnome shell 3.10. No me atrevo con 3.12 por ser inestable.
    • He tenido que reactivar todas los extensiones de nuevo
    • Algunas extensiones que usaba ya no funcionan
  • Chrome/Chromium ya no soporta NPAPI Pipelight plugins, así que no puedo instalar directamente desde https://extensions.gnome.org/
    • Usar firefox para solucionarlo.
  • Apache 2.4.7 no carga bien el módulo mpm-itk. Parece un problema de paquetes ubuntu.
    • cargar mpm-prefork también. mpm-itk es parte de mpm-prefork.
      • a2dismod mpm-itk && a2enmod mpm-prefork && a2enmod mpm-itk
  • Al cargar el escritorio hay algún problema con gnome-settings-daemon y no lee el archivo monitor.xml, así que se pierde la posición de como tengo montados mis tres monitores. Como workarround, he programado al inicio del escritorio que mate gnome-settings-daemon
    • pkill -9 -f gnome-settings-daemon

      Gnome Shell

      Gnome Shell

Reflexión

Soy usuario de Linux desde 1999. He pasado temporadas por Slackware, Suse, Redhat, Mandrake, Mandriva, CentOS, Debian y Ubuntu. Desde 2006 aproximadamente,  me decanté como usuario de escritorio de Ubuntu (y desde 2010, para servidores también) por ser la menos dolorosa en sus upgrades. El que he realizado en esta ocasión ha sido para actualizar la 13.10, que a su vez actualizó desde una 13.04,  una 12.10 y así nos remontamos hasta la 8.04 que tenía instalado en una placa con Atom por lo que he cambiado hasta de hardware, evolucionando a un i5 con tres monitores y una nvidia como gráfica y la verdad, no he formateado ni una vez. No se si con windows se puede pasar de por ejemplo XP a Vista, 7, 8 y migrar de hardware, pero nunca lo había oído… aunque estoy tan desconectado de esa plataforma que cualquiera saber. En cualquier caso, no todo es perfecto. En cada upgrade a una release distinta he tenido que arreglar algunos problemas bloqueantes de cierta gravedad que afectaban a la visualización gráfica, el sonido o a servicios y se han quedado por el camino software de mi gusto que ha dejado de mantenerse, algunas veces sustituido por herramientas mejores y en otras, ha quedado un amargo vacío. En este upgrade, una vez solucionados los problemas, puedo decir que mi ubuntu sigue con muy buena salud. Larga vida a los sistemas operativos de escritorio libres.

S4A Robótica para niños: liderar y trabajar en equipo

arduino

He iniciado un proyecto personal para enseñar a los niños robótica y programación. Lo cierto es que es algo que me lleva rondando la cabeza desde hace tiempo. Lo mínimo que se necesita para aprender todo esto es leer, escribir y un poco de álgebra muy básica, nada que no se pueda aprender sobre la marcha. Es decir, para niños de entre 7-8 años creo que iría bastante bien, aunque pienso que a partir de 8 años sería óptimo. Casualmente he encontrado varias personas interesadas en lo mismo, Juan Daniel Toledano Ferrera, Keeponfresh Moopy (es un alias) y Diego Manso,  con los que espero tener una estrecha colaboración.  Juan Daniel incluso ha avanzado en asuntos de recursos como aulas y equipos informáticos, contactos interesantes de varias universidades y del MIT. Yo estoy avanzando desde la parte más práctica: arduino y programación con Scratch, además de diseñar un plan de estudios.

arduino

Como todos sabemos, los niños nacidos en esta década son nativos digitales. Usan los ordenadores, tabletas y móviles con una absoluta y pasmosa facilidad. Sin duda, es una gran ayuda en su futuro y una gran ventaja sobre las anteriores generaciones quienes tienen que volver a reaprender el  mundo que les rodea. Sin embargo, estas nuevas generaciones sólo son consumidores digitales puros. No entienden como funciona la tecnología. Para ellos es natural que funcione así, no han visto la evolución de la tecnología y ni se plantean el por qué funcionan ni cómo funciona. Si queremos que nuestros niños y jóvenes construyan un futuro mejor para todos, con más riqueza compartida, tenemos que enseñarlos a dejar de ser meros consumidores y fomentar su creatividad para diseñar sus propias tecnologías.

El proyecto que quiero llevar a cabo, consiste en desarrollar un mini curso que permita programar robots con herramientas sencillas, divertidas y muy baratas, para que sean capaces mediante el juego de:

  • trabajar en equipo
  • liderar proyectos
  • pensar con lógica
  • aprender a programar
  • Dar solución a un gran problema, dividiéndolo en muchos pequeños.
  • Potenciar la creatividad

La idea por tanto sería enseñarles en un par de horas la base para jugar con los robots y luego plantear los retos que les permita desarrollar todas estas habilidades. Pero no sólo quiero enseñarles tecnología y cómo desarrollarla, que está muy bien en cuanto a espectativas para su futuro, sino que quiero que aprendan a pensar en procesos, en crear y seguir métodos, en compartir el conocimiento, a dirigir proyectos de cualquier tipo y en definitiva, a darle habilidades que generen riqueza para todo el mundo.

Así que lo primero que vamos a hacer para iniciar el proyecto es tomar contacto con la plataforma Arduino y S4A. Este último es una modificación de  Scratch que se “habla” con la placa Arduino. Más información sobre S4A en la web oficial del proyecto 

Para que podáis comprobar lo sencillo que es esta tecnología, os pongo un vídeo con mi primera toma de contacto. He invertido un par de horas entre instalar el software necesario, conectar los cables diseñar el circuito y aprender lo básico para conseguir el resultado que se puede ver en el video.

 

Ahora vamos a por el plan de estudios :-)

tuvozlegal.es mi primer proyecto público con web2py

web2py

Llevo años programando aplicaciones web con interfaces bastante complejos de tipo gestión empresarial y para gestión de sistemas, siempre en las intranet de las empresas que me han contratado. He desarrollado en PHP y frameworks como Ruby on Rails, Web2Py y Django, pero esta es la primera web que hago con Web2py y que coloco en abierto en internet. Por supuesto sí que he entregado muchas webs basados en Joomla, Drupal (casi me pego un tiro), WordPress, TikiWiki, OpenCart, Magento (casi me pego otro tiro) y también con Web2py pero privada (protegida con login/pass sólo para la empresa) pero hasta el momento nunca había escrito mi propio código Web2py para una aplicación en Internet pública. Está desarrollada además con jQuery y TwitterBootstrap; le podéis echar un vistazo en www.tuvozlegal.es. En realidad ya está publicada y en producción, pero sólo es la primera iteración del proyecto. Falta una segunda que se publicará aproximadamente en un mes y medio.

¿Y por qué he usado web2py os estaréis preguntando y no otros frameworks de desarrollo infinitamente más populares, como Django y Ruby on Rails? Principalmente por el DAL y los HELPERS de Web2py. El DAL es una capa de abstracción para la programación de bases de datos relacionales, no relacionales, basadas en documento y de diccionario y hasta el protocolo IMAP. La lista completa es esta:

    • database drivers (source)
    • SQLite sqlite3 or pysqlite2 or zxJDBC [zxjdbc] (on Jython)
    • PostgreSQL psycopg2 [psycopg2] or pg8000 [pg8000] or zxJDBC [zxjdbc] (on Jython)
    • MySQL pymysql [pymysql] or MySQLdb [mysqldb]
    • Oracle cx_Oracle [cxoracle]
    • MSSQL pyodbc [pyodbc]
    • FireBird kinterbasdb [kinterbasdb] or fdb or pyodbc
    • DB2 pyodbc [pyodbc]
    • Informix informixdb [informixdb]
    • Ingres ingresdbi [ingresdbi]
    • Cubrid cubriddb [cubridb] [cubridb]
    • Sybase Sybase [Sybase]
    • Teradata pyodbc [Teradata]
    • SAPDB sapdb [SAPDB]
    • MongoDB pymongo [pymongo]
    • IMAP imaplib [IMAP]

DJango y Ruby on Rails utilizan algo parecido denominado ORM. El ORM es un poco diferente, te abstrae del lenguaje de la base de datos pero no a nivel de mapeo de las sentencias del lenguaje, sino que trata como objetos los datos de la base de datos. Esta idea es muy buena, porque te permite generar un código muy orientado a objetos y por lo tanto muy limpio y elegante, pero tiene la desventaja que cuando hay que hacer operaciones sobre grandes volúmenes de datos, se vuelve muy ineficiente, teniendo que bajar al nivel del lenguaje de la base de datos concreta. DAL en cambio es muy eficiente porque mapea/traduce su lenguaje al propio de la base de datos en cuestión. Se podría decir que ORM es una capa que da acceso a su propio DAL y este traduce a la base de datos, como si ORM fuese otra capa encima de DAL; no es exacto pero “gráficamente” lo ilustra bastante bien.

El otro motivo son los HELPERS. No es ya por velocidad de desarrollo, la potencia, la limpieza que te permite trabajar con formularios, tags html y todo tipo de inputs, sino la integración que tienen los HELPERS con el framework en cualquier parte del código de la aplicación, desde el modelo, al controlador o la vista y por supuesto el nivel de seguridad que te aporta para la interfaz de usuario que da al saber que cumple con los problemas de seguridad listados en OWASP. En Django y Ruby on Rails he probado muchos tipos de herramientas para la vista, erb, haml, etc, pero no he encontrado la agilidad y potencia que con los HELPERS de web2py

Y por último hay algo que hace a Web2py imbatible: la retrocompatibilidad hacia atrás

la primera aplicación que escribí con web2py (nada serio) fue en 2008. Ese mismo código lo puedes coger y calzar en la última versión de web2py y funciona 100%. En Rails por ejemplo esto es ciencia ficción. En definitiva, este framework es muy ligero, de rápido desarrollo, muy potente y altamente escalable. Evidentemente los otros frameworks también aportan ventajas superiores a web2py, por lo pronto sus comunidades son infinitamente más amplias. En cualquier caso es imposible saber cual es le mejor framework y como en todas las disputas informáticas de cual es la mejor tecnologia, nunca hay una respuesta clara, así que podríamos decir que en ocasiones es subjetivo y en ocasiones es según el tipo de proyecto y con el equipo de gente y tecnologías que tengas que integrar el proyecto. En este momento y en este contexto el que más me encaja y con el que más cómo me siento es con web2py :-)

Y ahora en secreto, todo este rollo me lo he marcado para que google indexe un poco mejor a www.tuvozlegal.es ;-P

Disco SSD en servidor

Tengo que montar un nuevo servidor. Como no necesito grandes cantidades de storage, me he decidido por un “disco” SSD. Se suponen que son muy rápidos, así que espero se note el rendimiento. Por lo pronto he hecho unos mini benchmark de lectura/escritura comparándolo con un SATA3 de 7k revoluciones.

Resultados SSD

Lectura

root@ns354000:~# hdparm -Tt /dev/md2

/dev/md2:

Timing cached reads: 27268 MB in 2.00 seconds = 13648.40 MB/sec
Timing buffered disk reads: 792 MB in 3.01 seconds = 263.35 MB/sec

Escritura

root@ns354000:~# dd if=/dev/zero of=/tmp/output2 bs=8k count=10k; rm -f /tmp/output2
10240+0 records in
10240+0 records out
83886080 bytes (84 MB) copied, 0.0398274 s, 2.1 GB/s

Resultados SATA3 7K rpm

Lectura

root@odysseus:/home/freemem# hdparm -Tt /dev/sda

/dev/sda:
Timing cached reads: 20206 MB in 2.00 seconds = 10111.98 MB/sec
Timing buffered disk reads: 462 MB in 3.00 seconds = 153.88 MB/sec

Escritura

root@odysseus:/home/freemem# dd if=/dev/zero of=/tmp/output bs=8k count=10k; rm -f /tmp/output
10240+0 records in
10240+0 records out
83886080 bytes (84 MB) copied, 0,0496915 s, 1,7 GB/s

No voy a sacar conclusiones hasta que no haga comparativas de rendimiento con aplicaciones instaladas. Al menos ya me he quitado la curiosidad. Por lo pronto, parece que el aumento es considerable.

 

 

 

Gestión Experta CRM en GitHub

github

Ayer por la noche generé mi primer proyecto en gitHub:

https://github.com/FreeMEM/gestionexpertacrm

Este proyecto pretender matar dos pájaros de un tiro:

    • Que un amigo se ponga las pilas con la programación, la programación web con el framework web2py, python y la ingeniería de software.
    • Tener un CRM para mi empresa en http://www.gestionexperta.com. Los objetivos de la aplicación serán:
      • Controlar los contratos de servicios de los clientes. Fecha de inicio y fin.
      • Una herramienta de helpdesk mediante tickets
      • Herramienta para hacer presupuestos
      • Herramienta para facturar
      • Herramienta para hacer newsletter masivos a suscritos

La licencia libre que tendrá todavía no la he decidido, aunque por ahora tiene una GPL V.3.

¿Y por qué no uso CRMs de proyectos ya creados? ahorraría costos. Bueno, eso es lo primero que piensas, sin embargo en mi entorno empresarial esto no ocurre así.
Instalar, configurar y entender cómo funciona un CRM, no es algo rápido. Tengo que adaptarme a sus excesos y limitaciones y por lo tanto, tengo que adaptar mi empresa tal como los desarrolladores del CRM en cuestión han imaginado. Luego vienen los problemas de integración con otras herramientas, como pueden ser herramientas de helpdesk, emailings, marketing, facturación, contabilidad, etc. Mi entorno empresarial gira alrededor de tecnologías escritas en python con el framework web2py. Este entorno de programación incluye un poderoso y versátil sistema de gestión de usarios que me permite integrar todos los desarrollos que voy haciendo en un único gran paradigma. Es decir, que puedo compartir datos e información con una facilidad pasmosa entre aplicaciones. Pero lo mejor es su sistema de formularios. Para herramientas internas, que no necesiten un acabado visual exquisito, me permite crear aplicaciones de gestión a muy alta velocidad. Es casi como programar en Clipper en cuanto términos de productividad. En una mañana puedo terminarme el módulo de helpdesk y en otra el de los contratos. En una semana puedo tener terminados los objetivos marcados.

Ahora necesito encontrar un hueco para implementarlo. El código que hay ahora mismo (que no hace casi nada) lo escribí en 20 minutos mientras le explicaba, para poner en raíles al  amigo  que está enganchándose a la programación. Digamos que lo creamos sólo para que pudiese aprender con un “proyecto” real. Después de eso, pensé que quizá había sentado las bases para crear mi primera aplicación de software libre. Vamos a ver qué tal evoluciona.

Condiciones de una sola línea en ruby y en python

images (1)

Para hacer condiciones de una sóla línea, se pueden usar en ruby y python estructuras de este tipo

Ruby:

resultado = condicion ? si_verdadero : si_falso

Python:

resultado = (si_falso,si_verdadero)[condicion]

De este modo podríamos sustituir todas estas líneas

if True:
n=0
else:
n=1

Árboles creciendo

La imágen que os dejo es una comparativa de los árboles que hay frente a mi casa, entre el año 2005 y 2012. Es impresionante cómo crecen. ¿Uhmmmmm y si monto un stopmotion y espero otros pocos años?  Click en la imágen para verla completa.

Un sueño hecho realidad

Hace unos años tuve la oportunidad de practicar “puenting”. Desde aquel momento se me atravesó una idea: quería saltar en paracaídas desde un avión. Acabo de cumplir 40 y María del Mar, mi santa esposa, tras el machaque de años contándole mi sueño, me sorprendió con un regalazo, ¡y qué regalazo! Evidentemente lo he grabado en vídeo, eso sí, a 200Km/h y 4600m de altura.  Aquí os lo dejo para que conste en acta ;-P.

Problemas con Acer Aspire One D250, Ubuntu Lucid Remix y grub

Hace unos días me prestaron un Acer Aspire One D250, muy mono por cierto, al que le instalé desde un pendrive (¿quien carajo quiere ya los CD/DVDs?) la Ubuntu 10.04 Remix para NetBooks. La verdad es que probé cuatro distribuciones, la Ubuntu Lucid desktop, Jolicloud (que no me gustó nada), Meego (simplemente no me funcionó) y la Lucid para netbooks, que es la que tiene ahora. Toda la instalación fue muy transparente, rápida y sencilla, hasta que decidí reiniciar. Simplemente, no arrancó. Hice mil pruebas y nada. Estaba claro, algo pasaba con el grub. Googleé un poco y encontré gente con el mismo problema pero sin solución. Al final, rejunté toda la información para darle arreglo y este es el resultado:

Lo primero es arrancar con el pendrive en modo live y acceder a un terminal. La idea es cambiar un parámetro del grub:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash hpet=force nolapic"

pero antes hay que acceder a la partición del disco donde está y activar los cambios con update-grub. Para ello, en el terminal teclear todo esta lista de comandos

sudo fdisk -l
sudo mount /dev/sda1 /mnt
sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys
sudo mount --bind /dev/pts /mnt/dev/pts
sudo chroot /mnt
sudo grub-mkconfig -o /boot/grub/grub.cfg
sudo grub-install /dev/sda

Si falla esto último comando, reinténtalo de esta forma

sudo grub-install --recheck /dev/sda

Ahora sí, vamos a modificar la confi del grub

gksudo gedit /etc/default/grub

Y añade esto a la línea GRUB_CMDLINE_LINUX_DEFAULT

GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash hpet=force nolapic”

salva y

sudo update-grub

y ya acabando

exit
sudo umount /mnt/dev
sudo umount /mnt/proc
sudo umount /mnt/sys
sudo umount /mnt

Ahora arranca de nuevo y ya debería funcionar. Espero os sirva.

Contructores múltiples en Python y PHP

python y php

Mae mía, ni en python 2.6.x ni en php 5.x se pueden escribir clases con contructores multiples, como se hace con toda normalidad en C# por ejemplo. Hace tiempo pensé un par de trucos parecidos para cuando estoy con lenguajes con esta particularidad y que me gustaría compartir, pero vamos que hay mil formas de hacerlo.

Python:

class Clase():
_id=None</code>

def __init__(self,*args):
if len(args) != 1:
if isinstance(args[0], str):
self.__constructor_uno (int(args[0]))
else:
self.__constructor_dos()

def __constructor_uno(self, id):
self._id=id

def __constructor_dos(self):
self._id=0

PHP:

class Clase {</code>

private $id;

function __construct() {
$args = func_get_args();
$nargs = func_num_args();
switch($nargs) {
case 1:
self::__constructor_uno($args[0]);
break;
case 2:
self::__constructor_dos();
break;
}
}

function __constructor_uno($get) {
$id=$get;
}

function __constructor_dos() {
$id=0;
}
}

Bitácora sobre NetSurvibox y sus nuevos modelos

Para todo aquellos que trabajen con los legendarios routers/firewall de IronGate, NetSurvibox266, deciros que hay una bitácora nueva sobre esta familia de dispositivos, igseguridadyredes.com. Y digo familia porque recientemente la han ampliado con dos modelos nuevos, el NetSurvibox 400 y el 667. He tenido la suerte de probarlos y son una maravilla, de hecho tengo un 400 en el salón ;-)

El 667 es el hermano mayor del NSB400. Ofrece las mismas características, pero su procesador funciona a 667 Mhz, y  tiene 256MB de RAM, aumentando el rendimiento y las prestaciones (más túneles VPN).

Se trata de un router ideado para la seguridad en la red de las PYMES, actuando como firewall, antivirus  (POP3) y filtrador de contenidos web. Ofrece una interfaz muy sencilla (similar a la del NSB266) basada  en objetos con la que podrás activar/desactivar dichos servicios de la forma más cómoda y rápida posible.

Dispone de 5 puertos de RJ-45 (4 de LAN en switch y 1 de WAN), y permite la posibilidad de añadirle (se vende por separado)  un módulo de ADSL2+ y una tarjeta minipci para conexiones Wireless (se vende por separado), compatible con los estándares de red inalámbricos 802.11 b/g/n, con la que pueden crearse dos redes inalámbricas distintas (por ejemplo, una de hogar y otra de trabajo), lo que supone una plataforma ideal para teletrabajo.

Con este dispositivo se pueden configurar hasta 40 VPNs, estáticas y/o dinámicas.

Dispone de brazos para montarlo en un armario de telecomunicaciones (rack) y ocupa 1,5 U (6cms) de altura.

Su músculo es de un Intel ARM IXP435 a 667Mhz con 256Mb de RAM y 4+1 conectores ethernet RJ45 en switch. El mío viene montado además con un router ADSL2+ y una CompactFlash.

web2py’s examples: helpers, validators y expresiones regulares

No me voy a explicar demasiado. Sólo un ejemplo de vista de formulario con web2py en el que interviene un input html, que limito con expresión regular palabras de entre  3 y 15 letras alfanuméricos, incluyendo “ñ”s, tildes y algo más, con una longitud máxima de 128 caracteres y 10 palabras. Incluye además un mensaje de error traducible. Ese mensaje de error luego se puede capturar con jquery y mostrarse cómodamente en un bonito efecto. Todo en una única línea, mu cómodo oiga.

1
INPUT (_value='', _name='tags', _id='tags', requires=(IS_NOT_EMPTY(error_message = T('Tags are required')), IS_MATCH('^([\wáéíóúÁÉÍÓÚñÑçÇàèìòùÀÈÌÒÙâêôûÂÊÎÔÛ]{3,15}\ ?){1,10}, error_message=T('only allowed words of third to fifteen characters')), IS_LENGTH(128)))

Python’s examples: quitar palabras repetidas de una cadena

Si algo me gustaba de php era lo sencillo que resultaba tirar código a toda velocidad y sin pensar. Desde el verano pasado me he aficionado a python por lo mismo y  sobre todo por la facilidades que tiene para trabajar con él en cualquier entorno operativo, ya sea de escritorio, consola o web. Muestra de ello, os dejo un ejemplo de cómo en una sola línea se pueden quitar las palabras repetidas de una cadena de texto:



1
2
3
4
>>> import string
>>> cadena=”hola esto es una lista lista de de cadenas hola repetidas”
>>> print string.join(set(string.split(cadena,’ ‘)),’ ‘)
esto repetidas de una hola cadenas lista es

Chiste malo de Linux

En qué se parecen los juegos de Linux a la “Inteligencia Militar”. En que ni los militares tienen inteligencia, ni Linux juegos.

Iconizar Evolution

Llevo años usando el Evolution de Gnome y años quejándome de que no se puede iconificar en el trayicon. Hace unas semanas un amigo me enseñó un programa que viene a solucionar este problema. Me entusiasmé mucho con este programa pero hasta que no lo probase durante un buen tiempo, no quería decir nada en el blog. Se llama Alltray y logra iconizar cualquier programa que sea lanzado con esta herramienta. Para instalarlo en Ubuntu/Debian, invocamos a apt:

apt-get install alltray

Una vez instalado es muy fácil de usar. Para el ejemplo de Evolution, desde consola se puede lanzar

alltray "evolution --component=mail"

et voilà

Alltray

Ya sólo hay que situarse con el puntero del ratón encima del icono del sobre y botón derecho e izquierdo para probar sus funciones

Página siguiente »