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.
Un sueño hecho realidad
22-feb-12Hace 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:
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 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
Ahora sí, vamos a modificar la confi del grub
Y añade esto a la línea GRUB_CMDLINE_LINUX_DEFAULT
GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash hpet=force nolapic”
salva y
y ya acabando
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.
Python y PHP: contructores múltiples
25-jun-10Mae 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Clase(): _id=None 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | class Clase { 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; } } |
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.
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))) |
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
12-feb-10En qué se parecen los juegos de Linux a la “Inteligencia Militar”. En que ni los militares tienen inteligencia, ni Linux juegos.
Iconizar Evolution
12-dic-09Llevo 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:
Una vez instalado es muy fácil de usar. Para el ejemplo de Evolution, desde consola se puede lanzar
et voilà

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
Logo, mucho más de lo que parece
12-dic-09Evidentemente, el conocimiento estándar que se le aporta a nuestros hijos en la escuela pública es más que suficiente, pero es inevitable pensar en complementarlo con algún extra que le aporte alguna ventaja en su futura autosufiencia. Hay quien refuerza este aprendizaje con clases de apoyo escolar, de inglés, informática, música o deportes. Todas estas disciplinas aportan sus propios patrones cognitivos que configuran su personalidad adulta, aunque nada como los tres primeros años de vida. Hace poco, he ido a fijarme en una que quisiera investigar con más detenimiento y aunque es demasiado pronto para decidir, el tiempo vuela.
Hará un par de años un familiar me habló de Kumon, una empresa que “vende” un método de aprendizaje que así se describe en su web:
“Kumon es una actividad extraescolar diseñada para desarrollar al máximo el potencial de cada niño a través de las matemáticas. Gracias a nuestro programa individualizado nuestros alumnos desarrollan confianza, concentración, responsabilidad y hábito de estudio que los acompañan durante toda la vida.”Del mensaje me caló que las habilidades adquiridas le acompañarían toda la vida y ese es al fin y al cabo el objetivo, habilidades que le permitan desarrollarse con soltura. Aunque una disciplina matemática es dura, los críos motivados son esponjas, pero no estoy seguro que sea esto lo que busco para Eva. De rebote, he encontrado una alternativa parecida que me convence algo más, aunque tampoco creo que sea la panacea. Se llama Logo, un lenguaje de programación derivado de LISP (un lenguaje de programación para inteligencia artificial) usado para aprender mediante el juego y la experimentación y que busca ofrecerles las ventajas de ser capaces de desarrollar estrategias basadas en pequeñas metas y objetivos que en su conjunto, sirvan para resolver problemas complicados de la vida y les permita desarrollarse con seguridad en cualquier tipo de disciplina, ya sea artística, científica, humanística o empresarial.
Había oído hablar de este lenguaje cuando era niño, pero nunca tuve la oportunidad de usarlo; los ordenadores no estaban al alcance de los mortales y cuando tuve ordenador, no conseguí hacerme con este programa (internet no existía), aunque si he de ser sincero, no estaba demasiado interesado por lo que creía ser un método de iniciación a la programación para niños y yo, por aquellos entonces, me creía mayor aprendiendo Basic, QuickBasic y TurboPascal. El panorama ha cambiado mucho desde aquel entonces en el que el hecho de tener un ordenador ya era de por sí friki. No estoy seguro, pero cuando mi hija llegue a secundaria, probablemente deba usar ya ordenadores en clase así que su normalización habrá que aprovechar. Esto no quita, que otras actividades de habilidad social, deban tener un gran papel en su etapa de formación, de hecho, en ello irá su felicidad.
Lo único malo es que no tengo un plan de ejercicios… un plan de seguimiento o un objetivo concreto, como ocurre con kumon, aunque lo mismo existen planes, es cuestión de investigar. Por lo pronto, aquí dejo un enlace que parece interesante al respecto. Os iré comentando.
git para usuarios de svn
21-oct-09En el trabajo hemos tenido algunos problemas con el sistema control de versiones que usamos, svn, en cuanto al mantenimiento de las distintas branch. Un compañero (Karl) ha comentado que usar git, podría ayudarnos con el mantenimiento de las branches, trunk y los merges entre ellos. En git, cada commit genera en una base de datos un identificador único en forma de hash. Esto ayudaría en cualquier momento a conocer en que branches está disponible un commit concreto y administrar correctamente el código por las distintas ramas del árbol.
Se da la circunstancia que estoy desarrollando un proyecto personal con un amigo, por el gusto de aprender bien python y jquery (y las malas artes del 2.0 famoso). y ya nos hemos visto en la necesidad de disponer de un sistema control de versiones, así que, con el objeto de probar y conocer mejor git, ambos hemos decidido instalarlo: bah!, pasando de svn.
La primera impresión ha sido bastante buena. La gestión de las branch parece “mágica” (sí he escrito mágica y no magia; algún día explicaré qué es eso de mágica). Sin moverte del mismo path del sistema de archivos, puedes cambiar de branch (git checkout [branch_name]) y mágicamente si haces un ls, descubres que la estructura de ficheros se ha modificado a la de la branch elegida.
En fin, menos introducciones y más al tajo.
Lo primero es crear el repositorio. En git los repositorios no tienen por qué estar centralizados en un servidor, es más un “cliente” puede actuar de servidor para sí mismo o para otros. Cuando termine la explicación de cómo se usa, os daréis cuenta de esto. En cualquier caso, voy a seguir el modelo de cliente-servidor, tal como funciona en svn para que quede más claro.
Comencemos. En el servidor (host.dominio.com) crear un usuario devel (por ejemplo):
Loguearse con ese usuario y hacer
cd git/nombre_proyecto.git
git init --bare
ya está creado el repositorio sin código de nuestro proyecto. Para subir el código, lo vamos hacer desde nuestro sistema cliente (nuestro estación de trabajo). Para ello vamos a usar de capa de transporte, ssh, de tal modo que pase cifrado. Aconsejo subir tu clave pública al servidor para no tener que estar escribiendo user y pass todo el tiempo. Nos vamos al directorio donde tangamos ya nuestro código y le pasamos los siguientes comandos:
git init
git remote add origin ssh://devel@host.dominio.com/home/devel/git/nombre_proyecto.git
git add .
git commit -m "Apertura del repositorio"
Este commit, no escribe en el servidor, sino que lo hace en local generando su correspondiente entrada hash (el identificador único que identifica la operación) en la bbdd de git.
finalmente, con push, lo empujamos al servidor
Si por lo que sea, queremos obtener una copia del repositorio en otro ordenador o path, podemos optar por traerlo clonado desde el servidor. Esto es algo parecido a un checkout, sólo que se trae toda la base de datos de todo lo sucedido en el repositorio. Es decir, que en un momento dado este clon, podría convertirse en el repositorio raiz.
Clonar un repositorio ya creado:
cd proyecto
git clone ssh://devel@host.dominio.zona/home/devel/git/nombre_proyecto.git
Para crear una branch del proyecto es pasmosamente fácil:
Donde branch_proyecto es el nombre de la branch del repositorio
Para ver la branch en la que estás:
Para añadir ficheros al proyecto (svn add, svn commit). Lo primero es asegurarse que la branch en la principal :
y ahora sí a añadir:
git commit
Y finalmente hay que hacer un push, si quieres que llegue el cambio al repositorio del servidor. De esta forma, otros usuario podrán usar tus cambios:
Para tener actualizado tu repositorio local con el remoto:
Equivale a svn update y el –rebase es para revisar si otro usuario ha hecho antes un push
Más o menos con esto te puedes hacer una idea y manejarte con git. Más información en la página del proyecto oficial.
En cuanto a gestores de tickets para git, se puede usar el clásico Trac con el plugin correspondiente, aunque en realidad me gustaría probar http://www.redmine.org/ un trac para git. Intentaré hablaros pronto de redmine
Saber vivir
11-jun-09Muchas veces creemos que no teníamos elección, aunque dicen, que siempre la hay. Sin embargo la decisión a veces es lo de menos, lo importante es aprender a vivir con las elecciones tomadas en la vida.
Documental de la 2: Código Linux
15-dic-06No me había percatado de un documental que han puesto en Google Video y que hace tiempo echaron por la 2 de TVE, me refiero a “Código Linux”. Espero que no desaparezca por problemas de copyright o cosas así.
En este documental, se habla de cómo nació Linux, la importancia que tuvo internet en ello y las repercusiones sociológicas que promueve a nivel global, casi de manera accidental en una evolución natural de los mercados. Para los de ideas solidarias, podrán encontrar en el movimiento de software libre (en el que está inmerso Linux, como un proyecto más) la transferencia de capital que ha realizado y se realiza desde de los países ricos hacia los pobres. El modelo económico del software libre (dentro del capitalista) se basa en trabajar en equipo y sobre todo compartir, no en tener la voluntad de compartir para ser “buenos” en el más amplio sentido de la palabra, sino en compartir para potencia el lucro (aunque también tiene cabida el altruismo). Es curioso el modelo, pero funciona y beneficia a todos, creando un modelo
de inteligencia colectiva y trabajo colaborativo sin precedente en la historia.
Supongo que os estaréis haciendo la siguiente pregunta “¿y qué tiene que ver la informática con los movimientos sociales?. Cuando veáis el documental lo entenderéis. Si no tenéis ganas de verlo por durar 51 minutos, quizá este anuncio televisivo de un minuto y medio, del gigante informático IBM os abra apetito para ver el documental.
Espero que os guste y os haga pensar.
Esto me pasa por presuponer
29-jun-06Cómo dije en una anterior entrada, dispongo de 64Mb de RAM y 32 de swap para este servidor web, lo que no dije es que es una máquina virtual. En el plan de precios que pago me incluye esa memoria, que para lo que quiero funciona, aunque últimamente me da algunos problemillas. En su momento di por sentado que la memoria swap que “venía de serie” era inalterable ya que esta gente es la que controla el kernel de mi máquina, así que ni probé
Esta era la memoria que tenía
Mem: 60312 53260 7052 0 2100 25680
-/+ buffers/cache: 25480 34832
Swap: 32760 5956 26804
Desesperado por las tres últimas semanas de caídas de servicios, se me ocurrió probar suerte para añadirle más memoria swap a la máquina virtual, como si de una máquina normal se tratase y el resultado fue inesperado: FUNCIONA!. Le he añadido 105Mb y este es el resultado.
Mem: 60312 53540 6772 0 2156 25800
-/+ buffers/cache: 25584 34728
Swap: 135152 5956 129196
Lo he hecho del siguiente modo. Crear un archivo de memoria swap.
mkswap -c /swap/swap1 102400
y por último “montar” la memoria
swapon /swap/swap1
Y para acabar, se tendrá que añadir a /etc/fstab el swapfile para que cuando reinicie, se mantengan las mejoras de memoria
[cce_bash line_numbers="false"]
/swap/swap1 swap swap defaults,noatime 0 0
[cce_bash]
La felicidad
27-jun-06Casi todos los psicólogos están deacuerdo, o al menos eso es lo que he sacado en conclusión con varios autores: la felicidad lo dan las relaciones sociales, el dinero sirve para otras cosas. Pon amigos en tu vida.
El hallazgo: itextdotnet
23-jun-06Estaba practicando algunos ejemplos del uso de itextsharp en C# para poder generar informes en pdf, cuando me he topado con una nueva librería que proviene también de la original escrita en java, itext. Esta nueva, que parece no ser demasiado conocida, al menos en las listas de mono-hispano, se llama itext .Net o itextdotnet para los amigos. En esta dirección se encuentra una magnífica documentación del proyecto, al menos en lo que a ejemplos se refiere. Utiliza los mismos ejemplos del proyecto original itext en java, pero escritos en C#, una copia de los mismos en J# de la plataforma .NET o IKVM si se usa Mono (mi caso) y por último en VB.Net (y que supongo que funcionará también en Mono). Lo bueno de esta librería es que puedes utilizar Mono o .Net para escribir el código en Java, C# o VB.net, algo que hará las delicias de muchos. Yo con que esté en C# me conformo.
¿Y por qué tanto jaleo con una librería para generar pdfs?. Los programadores de Mono que queremos hacer aplicaciones multiplataforma tenemos algunas dificultades extras que nos obligan a complicarnos un poco más, unas veces por carencias de software como Crystal Report y otras por minimizar las dependencias de sistemas operativos concretos. Para la generación de informes a partir de XML y que además se puedan imprimir independientemente del gestor de impresoras del sistema operativo concreto en el que corra la aplicación, ayuda bastante la generación de documentos pdf en vez de enviarlos directamente a la impresora. Los documentos pdf, son un formato muy extendido y que cualquier S.O. actual soporta. A modo de introducción de como se pueden leer XML y convertirlos a pdf, aquí enlazo un ejemplo que hace un tiempo comentamos en mono-hispano.
