miércoles, 28 de noviembre de 2012

Frameworks de javascript que no conocía

Portabilidad ADSL y teléfono fijo desde Jazztel a Vodafone (españa)

Información, que espero le sea útil a alguien, sobre la portabilidad desde Jazztel a Vodafone (Noviembre 2012, España)

Plazos:
  • 7 días para revocar portabilidad
  • 7 días para entrega en la dirección que has indicado.
  • La entrega se hace a través de Correos. Si no lo recibes te dejan una notificación y la recoges en la oficina de correos.)
  • 20 días en tramitarse la portabilidad.
En el departamento de "Fidelización" de Jazztel me dijeron que me cobrarían hasta el día que se dá la baja y no el resto del mes.

martes, 30 de octubre de 2012

Top frameworks de CSS actuales

Artículo con la comparación de los 3 primeros [en inglés][en ruso].

sábado, 4 de agosto de 2012

Parsers de XML y JSON para la plataforma JAVA

Librerías de código abierto para parsear XML y JSON en la plataforma JAVA.
http://fasterxml.com/projects.html

viernes, 22 de junio de 2012

HtmlUnit - Desactivar trazas de advertencia de css y javascript

Añadir el siguiente código:
LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog");
De ésta forma ya no veremos más en la consola las (molestas) trazas de HtmlUnit del tipo:
21-jun-2012 17:26:01 com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify ADVERTENCIA: Obsolete content type encountered: 'application/x-javascript'. 21-jun-2012 17:26:01 com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify ADVERTENCIA: Obsolete content type encountered: 'application/x-javascript'. 21-jun-2012 17:26:02 com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify ADVERTENCIA: Obsolete content type encountered: 'application/x-javascript'. 21-jun-2012 17:26:02 com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify ADVERTENCIA: Obsolete content type encountered: 'application/x-javascript'. 21-jun-2012 17:26:02 com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine handleJavaScriptException INFO: Caught script exception ======= EXCEPTION START ======== EcmaError: lineNumber=[797] column=[0] lineSource=[] name=[ReferenceError] sourceName=[script in http://aURL from (794, 64) to (798, 12)#797)] com.gargoylesoftware.htmlunit.ScriptException: ReferenceError: "flush" is not defined. (script in http://aURL from (794, 64) to (798, 12)#797) at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:595) at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:537) at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:538) at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.execute(JavaScriptEngine.java:499) at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.execute(JavaScriptEngine.java:474) at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptIfPossible(HtmlPage.java:870) at com.gargoylesoftware.htmlunit.html.HtmlScript.executeInlineScriptIfNeeded(HtmlScript.java:302) at com.gargoylesoftware.htmlunit.html.HtmlScript.executeScriptIfNeeded(HtmlScript.java:368) at com.gargoylesoftware.htmlunit.html.HtmlScript$1.execute(HtmlScript.java:230) at com.gargoylesoftware.htmlunit.html.HtmlScript.onAllChildrenAddedToPage(HtmlScript.java:240) at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.endElement(HTMLParser.java:598) at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source) at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.endElement(HTMLParser.java:556) at org.cyberneko.html.HTMLTagBalancer.callEndElement(HTMLTagBalancer.java:1142) at org.cyberneko.html.HTMLTagBalancer.endElement(HTMLTagBalancer.java:1044) at org.cyberneko.html.filters.DefaultFilter.endElement(DefaultFilter.java:206) at org.cyberneko.html.filters.NamespaceBinder.endElement(NamespaceBinder.java:329) at org.cyberneko.html.HTMLScanner$ContentScanner.scanEndElement(HTMLScanner.java:3018) at org.cyberneko.html.HTMLScanner$ContentScanner.scan(HTMLScanner.java:2005) at org.cyberneko.html.HTMLScanner.scanDocument(HTMLScanner.java:908) at org.cyberneko.html.HTMLConfiguration.parse(HTMLConfiguration.java:499) at org.cyberneko.html.HTMLConfiguration.parse(HTMLConfiguration.java:452) at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.parse(HTMLParser.java:789) at com.gargoylesoftware.htmlunit.html.HTMLParser.parse(HTMLParser.java:225) at com.gargoylesoftware.htmlunit.html.HTMLParser.parseHtml(HTMLParser.java:179) at com.gargoylesoftware.htmlunit.DefaultPageCreator.createHtmlPage(DefaultPageCreator.java:221) at com.gargoylesoftware.htmlunit.DefaultPageCreator.createPage(DefaultPageCreator.java:106) at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseInto(WebClient.java:433) at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:311) at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:373) at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:358) at es.cuponet.AirfastScrapper.main(AirfastScrapper.java:115) Caused by: net.sourceforge.htmlunit.corejs.javascript.EcmaError: ReferenceError: "flush" is not defined. (script in http://aURL from (794, 64) to (798, 12)#797) at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3790) at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3768) at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.notFoundError(ScriptRuntime.java:3852) at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.getNameFunctionAndThis(ScriptRuntime.java:2239) at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpretLoop(Interpreter.java:1505) at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpret(Interpreter.java:854) at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:164) at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.doTopCall(ContextFactory.java:429) at com.gargoylesoftware.htmlunit.javascript.HtmlUnitContextFactory.doTopCall(HtmlUnitContextFactory.java:267) at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3183) at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.exec(InterpretedFunction.java:175) at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$3.doRun(JavaScriptEngine.java:490) at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:589) ... 32 more Enclosed exception: net.sourceforge.htmlunit.corejs.javascript.EcmaError: ReferenceError: "flush" is not defined. (script in http://aURL from (794, 64) to (798, 12)#797) at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3790) at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3768) at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.notFoundError(ScriptRuntime.java:3852) at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.getNameFunctionAndThis(ScriptRuntime.java:2239) at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpretLoop(Interpreter.java:1505) at script(script in http://aURL from (794, 64) to (798, 12):797) at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpret(Interpreter.java:854) at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:164) at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.doTopCall(ContextFactory.java:429) at com.gargoylesoftware.htmlunit.javascript.HtmlUnitContextFactory.doTopCall(HtmlUnitContextFactory.java:267) at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3183) at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.exec(InterpretedFunction.java:175) at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$3.doRun(JavaScriptEngine.java:490) at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:589) at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:537) at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:538) at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.execute(JavaScriptEngine.java:499) at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.execute(JavaScriptEngine.java:474) at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptIfPossible(HtmlPage.java:870) at com.gargoylesoftware.htmlunit.html.HtmlScript.executeInlineScriptIfNeeded(HtmlScript.java:302) at com.gargoylesoftware.htmlunit.html.HtmlScript.executeScriptIfNeeded(HtmlScript.java:368) at com.gargoylesoftware.htmlunit.html.HtmlScript$1.execute(HtmlScript.java:230) at com.gargoylesoftware.htmlunit.html.HtmlScript.onAllChildrenAddedToPage(HtmlScript.java:240) at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.endElement(HTMLParser.java:598) at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source) at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.endElement(HTMLParser.java:556) at org.cyberneko.html.HTMLTagBalancer.callEndElement(HTMLTagBalancer.java:1142) at org.cyberneko.html.HTMLTagBalancer.endElement(HTMLTagBalancer.java:1044) at org.cyberneko.html.filters.DefaultFilter.endElement(DefaultFilter.java:206) at org.cyberneko.html.filters.NamespaceBinder.endElement(NamespaceBinder.java:329) at org.cyberneko.html.HTMLScanner$ContentScanner.scanEndElement(HTMLScanner.java:3018) at org.cyberneko.html.HTMLScanner$ContentScanner.scan(HTMLScanner.java:2005) at org.cyberneko.html.HTMLScanner.scanDocument(HTMLScanner.java:908) at org.cyberneko.html.HTMLConfiguration.parse(HTMLConfiguration.java:499) at org.cyberneko.html.HTMLConfiguration.parse(HTMLConfiguration.java:452) at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.parse(HTMLParser.java:789) at com.gargoylesoftware.htmlunit.html.HTMLParser.parse(HTMLParser.java:225) at com.gargoylesoftware.htmlunit.html.HTMLParser.parseHtml(HTMLParser.java:179) at com.gargoylesoftware.htmlunit.DefaultPageCreator.createHtmlPage(DefaultPageCreator.java:221) at com.gargoylesoftware.htmlunit.DefaultPageCreator.createPage(DefaultPageCreator.java:106) at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseInto(WebClient.java:433) at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:311) at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:373) at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:358) at es.cuponet.AirfastScrapper.main(AirfastScrapper.java:115) ======= EXCEPTION END ======== 21-jun-2012 17:26:02 com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify ADVERTENCIA: Obsolete content type encountered: 'application/x-javascript'. 21-jun-2012 17:26:03 com.gargoylesoftware.htmlunit.DefaultCssErrorHandler error ADVERTENCIA: CSS error: [563:46] Error in expression. Invalid token "=". Was expecting one of: ...

martes, 22 de mayo de 2012

lunes, 21 de mayo de 2012

Librerías javascript para crear gráficas


sábado, 12 de mayo de 2012

Descargar películas y series desde SHURWEB.es


Nos instalamos el plugin MusicSig Vkontakte Lite para el chrome. Para ello: 

  • Abrimos una nueva pestaña, 
  • Vamos a chrome web store, 
  • Buscamos el plugin 
  • Lo instalamos pinchando en "añadir a chrome" 
Sin necesidad de reiniciar el navegador, nos vamos a la página con alguna de las películas o series en shurweb.es y debajo del cuadro con el reproductor del vídeo, veremos un botón azul con el texto "Iphone/Ipad".
Lo pinchamos y se abre la página original de vk.com (el facebook ruso) con el vídeo, que debajo del cuadro del reproductor tiene enlaces para la descarga en distintos formatos.
Verás normalmente dos enlaces para la descarga, para los formatos 320x240 y 480x360. Cada uno de esos enlaces dice "Descargar"(Скачать) y en paréntesis el formato del video. La extensión es .MP4. Para descargar, pulsas el enlace, eliges el destino de descarga y a esperar.
Cuando intentas descargarlo con el administrador de descargar del propio Chrome no pone automáticamente la extensión del fichero. Y para poder abrirlo automáticamente una vez finalizada la descarga, no viene mal guardar el fichero poniéndole el nombre con esa extensión ".mp4", para que lo puedan reconocer automáticamente los reproductores.
Para las opciones de compartir (insertar el video en nuestra página dentro de un iframe), pulsar "Поделиться" y después "Получить код видео". Aparecerá un nueva ventanita con el código a insertar, similar a la que proporciona youtube para insertar vídeos.
En la FAQ de shurweb.es (películas y series gratis), sección "Cómo descargo los vídeos?" se explica éste mismo proceso.

viernes, 11 de mayo de 2012

Comentar bloque de código HTML y RUBY mezclado

Una forma un tanto laboriosa, pero al parecer la más simple que hay en rails, para comentar múltiples líneas con código ruby y html entremezclado, en los ficheros con scripts para generar vistas:

<%
=begin %>
... aquí va el código html y ruby entremezclado, que se ha deshabilitado por estar comentado
<%
=end %>
Una monstruosidad de comentarios multilínea, para un framework que presume de simplificar... En jsp por el contario, sería tan simple como rodear el bloque a comentar con <%-- y --%>.

"10 cosas" sobre Ruby para un programador de Java

10 cosas sobre Ruby para un programador de Java (en inglés)

Anidar plantillas en Rails

Método de anidar plantillas para las vistas en Rails, descrito en el blog de Matt McCray.

Fuente

Seguir a - Scott Gonzalez

Scott Gonzalez es desarrollador líder en JQuery UI, la librería de JQuery para interfaces. También activo en Node.js y WHATWG.

http://scottgonzalez.com/

JSMAG - Buen blog sobre lo último de JavaScript

El blog sobre javascript imprescindible, para estar a la última. Novedades de plugins, artículos de autoridades del sector,...

www.jsmag.com

Por ejemplo he descubierto éste fantástico plugin turnjs, que permite reproducir el efecto de paso de páginas.

Como instalar RVM (gestor de versiones de RUBY)

En sistemas basados en linux:

Modo normal

Instalar RVM:
$ curl -L get.rvm.io | bash -s stable
Cargar RVM:
$ source ~/.rvm/scripts/rvm
Listar los requisitos (seguir las instrucciones):
$ rvm requirements
Instalar una versión de ruby:
$ rvm install 1.9.3

Modo guiado

En modo guiado con ruby & rails:
$ curl -L get.rvm.io | bash -s stable --rails
En modo guiado con rubinius & rails & puma:
$ curl -L get.rvm.io | bash -s stable --ruby=rbx --gems=rails,puma

Windows

Para instalar RVM con cygwin en Windows seguir éste tutorial.

Concurso de mini programas en javascript de 1K

En el concurso js1k.com compiten script de javascript de no más de 1K. Surgió como una broma, pero desde su primera edición ha resultado en una gran cantidad de participantes, premios y "programillas" de gran calidad.

Un ejemplo es éste árbol de Navidad girando en 3D de Román Cortés.

O el flexi droid de la edición de 2011.

O todo un juego de plataformas:

O éste impresionante motor gráfico con efectos de dinámica:

domingo, 6 de mayo de 2012

Rails TypeError - can't convert false into String

He estado probando definir páginas estáticas en un proyecto rails. Había creado el proyecto y configurado para que utilizase una base de datos MySql. La base de datos contra la que trabajaba se llamaba "OFF". Al arrancar el servidor y realizar una petición a la página estática que había generado obtenía el inexplicable error: "TypeError can't convert false into String".
Mirando las trazas el error se producía en:
mysql2 (0.3.11) lib/mysql2/client.rb:44:in `connect'
Probé a configurar otra base de datos con otro nombre y funcionaba correctamente. Así que mi sospecha es que lo que pasaba es que "OFF" es palabra reservada, parece que de sql, que no se puede usar como nombre de base de datos (y seguramente tampoco como nombre de columna, tabla, modelo en rails,...). He encontrado ésta recopilación de palabras reservadas relacionadas con rails, que habrá que evitar usar como nombres personalizados en nuestras aplicaciones rails y elementos relacionados, para evitarnos dolores de cabeza.

viernes, 27 de abril de 2012

Cómo saber el shell actualmente activo

Para saber que shell actualmente activa se está usando, ejecutar:
echo $0
Dependiendo del shell activo se puede obtener /bin/sh o bash o /bin/bash o ...

martes, 24 de abril de 2012

Libros PDF de matemáticas (nivel universitario) en español gratis

Diversas materias matemáticas recogidas, organizadas y redactadas en libros por Carlos Ivorra, profesor de la Universidad de Valencia, en sus ratos libres. ¡Un agradecimiento enorme a éste hombre!
Libros de matemáticas y artículos de Carlos Ivorra.
  • Superficies aritméticas
  • Teoría de esquemas
  • Representaciones de grupos finitos
  • Álgebra homológica y álgebra conmutativa
  • Curvas elípticas 
  • Geometría algebraica 
  • Topología algebraica
  • Teoría de números 
  • Funciones de variable compleja
  • Análisis 
  • Análisis no estándar
  • Geometría
  • Álgebra
  • Teoría descriptiva de conjuntos
Otros recursos muy interesantes para autodidactas de las matemáticas son:

viernes, 20 de abril de 2012

Instalar MySql Workbench en Ubuntu 11.10

Para instalar en ubuntu desktop 11.10 MySql Workbench, que es una muy buena herramienta visual de diseño de bases de datos que integra desarrollo de software, Administración de bases de datos, diseño de bases de datos, creacion y mantenimiento para el sistema de base de datos MySQL. Ejecutar los siguiente desde el terminal:

(Solución provisional hasta que lo cambie Oracle.)
sudo add-apt-repository ppa:olivier-berten/misc
sudo apt-get update
sudo apt-get install mysql-workbench-gpl

Flags en el editor de tabla de MySql Workbench

  • PK - Primary Key
  • NN - Not Null
  • BIN - Binary
  • UN - Unsigned
  • UQ - Unique Key
  • ZF - Zero-Filled
  • AI - Auto Incremenent

La longitud máxima de enlaces (URIs, URLs) en la práctica es - 2,083

Antes de nada, es:
2083
Tenía una duda, qué longitud de campo necesito en mi tabla de una base de datos mysql para poder almacenar cualquier URL(enlace).

Aunque en la especificación del protocolo HTTP no se especifica ninguna longitud máxima, los distintos navegadores y software de servidores imponen unos límites prácticos. El menor de los cuales, el del navegador Explorer, es 2083, sin que haya más de 2,048 caracteres formando el path. Curiosamente el límite manejado por el servidor Microsoft Internet Information Server es 16,384.

En éste caso, lo de Explorer no me parece una cagada, una longitud excesiva de enlaces normalmente es resultado de un mal diseño. La regla general es que en el enlace deberían ir los parámetros que son imprescindibles para regenerar el contenido de la página. La solución estándar para realizar una petición equivalente al envío de un formulario con muchos campos es usar el método POST en vez de GET y meter los parámetros en el cuerpo del mensaje.

Así que si estamos pensando en crear un campo en nuestra base de datos de MySql para guardar URLs, definiríamos uno como
VARCHAR(2083)
En realidad para el caso de mysql hay dos casos:
  1. si < MySQL 5.0.3 usar tipo de campo TEXT, porque VARCHAR estaba limitado a 255.
  2. si >= MySQL 5.0.3 usar tipo de campo VARCHAR(2083)
Sacado de aquí y aquí.

jueves, 19 de abril de 2012

VMWare Ubuntu server - apagar máquina virtual

Para apagar (salir de) la máquina virtual con ubuntu server, ejecutamos en el terminal:
sudo shutdown -h now

Ubuntu 10.04 server - cambiar distribución del teclado a Español

Decidí crearme una máquina virtual con Ubuntu Server 10.04 LTS de 64bits.
Para crear y ejecutar la máquina virtual uso VMWare Player 4.0.2 (gratuito).
Tras crearla y ejecutarla, me encontré que la distribución por defecto del teclado
es para un teclado americano. Mi objetivo no es cambiar todo tipo de locales a español, sino sólo cambiar la distribución del teclado, para poder teclear sin problemas en mi teclado español, dejando todo el sistema (de momento) en inglés.

Con esa distribución y mi teclado español, es un rollo buscar y recordar las teclas que sirven para cada símbolo y ni hablar del historial de comandos en consola, que debería ser flecha arriba (encontré que con esa distribución sí que podrían obtenerse los comandos anteriores con control+p, pero no es cómodo).

Éste es el teclado que tengo en mi portátil. Según las especificaciones, es un teclado de 85 teclas, "85 key Numeric Keyboard".

La solución ha sido instalar el siguiente paquete:
sudo apt-get install console-data

Y ejecutar (si no se ha ejecutado ya automáticamente):
sudo dpkg-reconfigure console-setup

Al parecer para el ubuntu server 11, en vez de "console-setup" se debe usar "keyboard-configuration":
sudo dpkg-reconfigure keyboard-configuration

En el menú que aparece, ir confirmando todo, menos en aquella pantalla que seleccione como país "Spain", pulsando repetidas veces la tecla "s", para que la selección llegara a marcar dicha opción. El problema en ese menú, es que no encontré una manera de subir/bajar por el menú de opciones teniendo la distribución del teclado mal, porque las flechas de arriba y abajo no funcionan.

La configuración se guarda en el fichero /etc/default/console-setup.
Seguramente se puede configurar la distribución de teclado editando directamente ese fichero, pero no lo he probado.

Sacado de aquí.

sábado, 14 de abril de 2012

Boston dynamics - Robots caminando y subiendo escaleras

Impresionantes imágenes de sistemas robóticos antropomorfos que suben escaleras o que van caminando. Creación de Mientras camina sobre una cinta móvil, un hombre empuja incluso al robot mientras éste camina, y éste no se cae, recupera el equilibrio y sigue caminando. Impresionante. La verdad es que da un poco de miedito. Parece que dentro de no mucho, tendremos "bichillos" de éstos caminando entre nosotros. Mientras no nos pisen, ni nos disparen, ¿bien no?



Igualmente es impresionante y muy triste pensar, que si éstos robots reemplazan a soldados humanos, las sociedades del primer mundo cuyos gobiernos promueven éste tipo proyectos no tendrán "tanto reparo" contra las guerras de expolio donde se utilicen éstas tropas, porque ahora no sufrirán bajas de personas reales, como mucho les podrá molestar que les suban los impuestos o los precios, para sufragar la pérdidas materiales.

martes, 10 de abril de 2012

Hamster free book converter - Cambiar formato del libro electrónico

Desde que me compré el Kindle 3 (con el que estoy muy contento), hará más de un año, he estado usando Calibre. Ahora me entero, a través de PCActual, de otra aplicación que puede estar bien para convertir rápido y fácilmente entre los distintos formatos. Es el Hamster free book converter. Es gratuito, soporta la mayoría de los formatos existentes, y también un gran número de dispositivos.

martes, 3 de abril de 2012

RVM - error "RVM is not a function, selecting rubies with 'rvm use ...' will not work."

Supongamos que hemos instalado RVM, e incluso hemos instalado alguna versión de Ruby usando el propio RVM. Ahora cuando intentamos establecer la versión de Ruby a usar, con:
rvm use una_version_de_Ruby
Nos escupe un error del tipo:
RVM is not a function, selecting rubies with 'rvm use ...' will not work.
Para arreglarlo, tenemos que añadir al fichero ~/.bashrc lo siguiente:
if test -f ~/.rvm/scripts/rvm; then
[ "$(type -t rvm)" = "function" ] || source ~/.rvm/scripts/rvm
fi
De ésta forma, cada vez que inicialicemos una shell en modo interactivo, si rvm todavía no es una función, se evaluará el script ~/.rvm/scripts/rvm para que esté disponible rvm como función y podrá ir haciendo los cambios oportunos a la configuración de entorno de la shell.

Instalar Ruby con RVM

RVM permite instalar y gestionar distintas versiones de Ruby, instaladas simultáneamente en el equipo.

Es recomendable, antes de instalar versiones de Ruby con RVM y prevenir que el proceso no se complete por falta de alguna dependencia, ejecutar:
rvm requirements

Que mostrará los paquetes que tenemos que tener instalados, que se requerirán durante la instalación.

Requirements for Linux ( DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=11.10
DISTRIB_CODENAME=oneiric
DISTRIB_DESCRIPTION="Ubuntu 11.10" )

NOTE: 'ruby' represents Matz's Ruby Interpreter (MRI) (1.8.X, 1.9.X)
This is the *original* / standard Ruby Language Interpreter
'ree' represents Ruby Enterprise Edition
'rbx' represents Rubinius

bash >= 4.1 required
curl is required
git is required (>= 1.7 for ruby-head)
patch is required (for 1.8 rubies and some ruby-head's).

To install rbx and/or Ruby 1.9 head (MRI) (eg. 1.9.2-head),
then you must install and use rvm 1.8.7 first.

Additional Dependencies:
# For Ruby / Ruby HEAD (MRI, Rubinius, & REE), install the following:
ruby: /usr/bin/apt-get install build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison subversion

# For JRuby, install the following:
jruby: /usr/bin/apt-get install curl g++ openjdk-6-jre-headless
jruby-head: /usr/bin/apt-get install ant openjdk-6-jdk

# For IronRuby, install the following:
ironruby: /usr/bin/apt-get install curl mono-2.0-devel

Pero por experiencia personal, no hace falta instalar del tirón todos los paquetes que se mencionan. Yo probé a instalar directamente una versión de Ruby, y cuando el proceso fallaba, instalaba sólo los paquetes de los que se quejaba que faltaban (en mi caso bison y autoreconf). Como vamos a estar instalando la misma versión, sólo al principio se descargan los fuentes, y se consume tiempo, pero si volvemos a ejecutar la instalación de esa misma versión, ya no se vuelve a descargar los fuentes, porque ya los tiene, así que no se tarda mucho y nos instalamos sólo lo imprescindible.

Una vez se tiene instalado RVM, podemos ver las versiones de Ruby y derivados disponibles que podemos instalar con rvm. Para ello ejecutamos:
rvm list known

Cuando ejecute esto, las versiones de Ruby que tenía disponibles eran:
# MRI Rubies
[ruby-]1.8.6[-p420]
[ruby-]1.8.7[-p358]
[ruby-]1.8.7-head
[ruby-]1.9.1[-p431]
[ruby-]1.9.2-p180
[ruby-]1.9.2-p290
[ruby-]1.9.2[-p318]
[ruby-]1.9.2-head
[ruby-]1.9.3-preview1
[ruby-]1.9.3-rc1
[ruby-]1.9.3-p0
[ruby-]1.9.3[-p125]
[ruby-]1.9.3-head
ruby-head

Para instalar una versión concreta pondremos:
rvm install identificador_versión

Por ejemplo, para instalar la versión [ruby-]1.9.3-head, podemos poner:
rvm install 1.9.3-head
o
rvm install ruby-1.9.3-head

Hay que tener en cuenta, que si no tenemos alguna versión de Ruby ya instalada o su ejecutable no está en la ruta, obtendremos un error durante el proceso de instalación, si intentamos instalar una versión acabada en "-head".
Yo, por ejemplo, cuando intenté instalar la versión 1.9.3-head, obtuve el siguiente error:

Installing Ruby from source to: /home/nikito/.rvm/rubies/ruby-1.9.3-head, this may take a while depending on your cpu(s)...

ruby-1.9.3-head - #fetching
HEAD is now at 65d88f9 merge revision(s) 35221:
From git://github.com/ruby/ruby
* branch ruby_1_9_3 -> FETCH_HEAD
Already up-to-date.
Copying from repo to src path...
Patch 'xcode-debugopt-fix-r34840' not found.
ruby-1.9.3-head - #autoreconf
ruby-1.9.3-head - #configuring
ruby-1.9.3-head - #compiling
Error running 'make ', please read /home/nikito/.rvm/log/ruby-1.9.3-head/make.log
There has been an error while running make. Halting the installation.

En el log del make tenía esto:

[2012-04-03 11:29:55] make
CC = gcc
LD = ld
LDSHARED = gcc -shared
CFLAGS = -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Werror=pointer-arith -Werror=write-strings -Werror=declaration-after-statement -Werror=implicit-function-declaration -fPIC
XCFLAGS = -include ruby/config.h -include ruby/missing.h -fvisibility=hidden -DRUBY_EXPORT
CPPFLAGS = -I. -I.ext/include/i686-linux -I./include -I.
DLDFLAGS = -Wl,-soname,libruby.so.1.9
SOLIBS = -lpthread -lrt -ldl -lcrypt -lm
compiling main.c
compiling dmydln.c
compiling dmyencoding.c
compiling version.c
compiling dmyversion.c
generating miniprelude.c
executable host ruby is required. use --with-baseruby option.
make: *** [miniprelude.c] Error 1

Así que lo que hice, es desistir de instalar la ruby-1.9.3-head, y optar por instalarme la ruby-1.9.3-p125. Ejecutando:
rvm install 1.9.3

Que se instaló del tirón sin problemas.

Descargar GIT usando GIT

Parece una forma un poco retorcida para descargárselo, pero tiene sentido si queremos obtener una copia de los fuentes del git de una versión determinada o la última de desarrollo, que luego podemos actualizar y compilar sustituyendo a la que venimos utilizando. De esta forma podemos obtener todas las versiones de git que estén disponibles en su repositorio de fuentes y no estamos tan limitados por los repositorios de apt o demás formas de instalarse el git.

Bien es cierto, que para esto, tenemos que tener previamente instalada alguna versión del GIT, con el que vamos a descargarnos el repositorio.

Copiar el repositorio git:
git clone git://github.com/gitster/git.git

Si tiene problemas intentando conectarse (Git utiliza el puerto 9418), puede intentar acceder al repositorio usando el protocolo HTTP:
git clone http://github.com/gitster/git.git

Éste ultimo método funciona incluso si estamos tras cortafuegos o similares.

Puede también consultar los contenidos del repositorio de git tanto en gitweb o en la interfaz web GitHub.

Traducido de aquí.

Deshacer los cambios locales en GIT

A menudo se puede presentar la situación en la que queremos deshacer completamente los cambios que hemos realizado en la copia actual de trabajo, hasta volver al estado que teníamos guardado en el repositorio. Sería lo equivalente al "revert" en SVN.

Para deshacer los cambios locales
git checkout .
Otros casos útiles de deshacer cambios de distinto tipo, aquí.

Ver ficheros y directorios ocultos en linux

En el terminal/consola, usar el comando "ls" con el argumento "-a" para listar todo tipo de elementos, ficheros ocultos incluidos. Los nombres de los ficheros y directorios ocultos empiezan por ".".

Listar todo en el directorio actual, incluidos ficheros y directorios ocultos.
ls -a

Todos los directorios y ficheros ocultos


Ver sólo todos los directorios y ficheros ocultos del directorio actual.
ls -a | grep "^\."

Todos los ficheros ocultos


Ver sólo todos los ficheros ocultos del directorio actual. Con -F se añade un sufijo que permite diferenciar los elementos que representan directorios de los ficheros. Con grep -v nos quedamos con los que no acaban en "/", que no son directorios y después buscamos los que empiezan por ".", que serán los ficheros ocultos.
ls -aF | grep -v "/$" | grep "^\."

Todos los directorios ocultos


Ver sólo todos los directorios ocultos del directorio actual. Ahora con grep "/$", nos quedamos sólo con los elementos que representan directorios, y de ellos elegimos sólo aquellos que empiecen por ".", los directorios ocultos.
ls -aF | grep "/$" | grep "^\."

martes, 27 de marzo de 2012

Flixel - framework gratuito para videojuegos Flash

Flixel
Flixel es una librería para programación de videojuegos de código abierto, totalmente gratuita, tanto para uso personal o comercial. Escrita completamente en ActionScript 3 por Adam “Atomic” Saltsman, y diseñada para ser utilizada con las herramientas de desarrollo gratuitas, Flixel es fácil de aprender, ampliar y personalizar. Flixel ha sido utilizado en cientos de juegos, incluyendo los nominados de IGF, juegos de Adult Swim, y en muchos experimentos vanguardistas. Muchos usuarios de Flixel han hecho su primer juego en la vida precisamente en Flixel.

miércoles, 21 de marzo de 2012

Repositorios privados gratuitos online de Git, Mercurial y Subversion(SVN)

Los servicios Bitbucket, Assembla, Unfuddle y Beanstalk ofrecen repositorios privados y públicos gratuitos online (o como ahora está de moda decir, "en la nube") para el sistema distribuido de gestión de versiones Git. Y aparte, según cada cuál también para Mercurial o Subversion(SVN).


bitbucket logoEl plan gratuito de Bitbucket (de Atlassian) ofrece:
  • Repositorios públicos y privados ilimitados (Git o Mercurial)
  • Colaboradores públicos ilimitados
  • Espacio de disco ilimitado
  • Dominios personalizados
  • Sistema de seguimiento de incidencias (Issue tracking)
  • Descargas
  • Wiki
  • Acceso seguro a través de SSL
unfuddle logoEl plan gratuito de Unfuddle ofrece:
  • Repositorios ilimitados de (Git o Subversion) (creo que, si es privado se limita a sólo uno, pero no estoy seguro)
  • 1 proyecto activo
  • Máximo 2 usuarios por cuenta
  • 200 MB de espacio de disco
  • Sistema de seguimiento de incidencias (Bug tracking)
  • Programación de hitos
  • Mensajería interna
  • 3 páginas para anotaciones
  • Rss y iCal
  • Acceso sin SSL
assembla logo
El plan gratuito de Assembla ofrece:
  • Repositorios públicos ilimitados (Git o Subversion)
  • 1 repositorio privado (Git o Subversion)
  • Colaboradores ilimitados
  • Espacio de disco de 1GB
  • Acceso seguro a través de SSL

beanstalk logo
  • 1 repositorio privado (Git o Subversion)
  • 1 sólo usuario
  • Espacio de disco de 100MB
  • Acceso seguro a través de SSL
freepository logo
  • 1 repositorios privado (Subversion)
  • 1 sólo usuario
  • Espacio de disco de ??
  • Acceso seguro a través de SSL
projectlocker logo
  • 3 Repositorios públicos o privados (Git o Subversion)
  • Máximo de 3 usuarios por cuenta
  • Espacio en disco de 300MB
  • Trac (wiki, seguimiento de incidencias, gestión del proyecto)
  • Acceso seguro a través de SSL
  • Copias de seguridad nocturnas (en la versión gratuita no se pueden descargar)
  • Publicidad
xp-dev logo
  • 2 repositorios privados (Git o Subversion o Mercurial)
  • Trac (wiki, seguimiento de incidencias, gestión del proyecto)
  • Espacio en disco de 200MB
  • Acceso sin SSL
  • Publicidad

La bombilla eterna - invento español

www.oepelectrics.com
La bombilla "eterna" inventada por un español y que vende desde su web. El informativo que anuncia con pomposidad y orgullo la noticia, no se molesta en mencionar ni el nombre del inventor, ni de la empresa, ni de la web,... Menos mal que por lo menos en la noticia en el ABC hay un link a la web de empresa. Se habrán despistado. No sé que co****s les enseñarán a los periodistas, seguramente sólo literatura, porque lo que es transmitir información útil, cero.

martes, 20 de marzo de 2012

Campeonato abierto de robótica de San Petersburgo de 2012

El pasado 18 de marzo de 2012, se ha celebrado el 6º campeonato abierto de robótica de San Petersburgo.

El programa constaba de los siguientes eventos:
  • Competiciones con las reglas propias del campeonato abierto.
  • Torneo regional encuadrado en la competición internacional de robots con las reglas de la Olimpiada Mundial de Robots, WRO 2012
  • Fútbol de robots
  • Muestra de proyectos personales.

Me sorprendió y alegró descubrir que en el liceo Físico-Matemático de San Petersburgo desde 2008 se ha instaurado un taller gratuito de robótica para niños y adolescentes de 10 a 17 años. Desconozco si aquí en España existen iniciativas similares, pero creo que se deberían poner en marcha.

Algunos vídeos:

Competición de laberinto


Seguir la línea

Máquina de pinball



Otro evento interesante de robótica que se celebrará próximamente es el RoboFest 2012, del 5 al 7 de abril, en Moscú.

martes, 13 de marzo de 2012

Añadir el botón de "Pinterest" a cada entrada de Blogger

Vamos a colocar un botón de "Pin it", con contador, a cada entrada(post) de nuestro blog en Blogger/Blogspot. Se visualizará únicamente en las páginas individuales de cada entrada(post) y no en la que se listan varias entradas. Con él permitiremos a nuestros lectores compartir nuestro post en la red social "Pinterest". Igual que seguramente ya hacemos con botones de twitter, facebook, google+,...

Ir a Diseño->Edición de HTML (En el nuevo interfaz: Plantilla -> Editar HTML)
Antes de modificarla, es muy buena idea hacer una copia de seguridad de nuestra plantilla actual.
Marcar el checkbox "Expandir plantillas de artilugios", sobre la esquina superior derecha de la ventana con el código HTML.
Buscar el siguiente tag en el código HTML:
<data:post.body/>

Éste tag es el que inserta el contenido de cada entrada en el blog. Normalmente, vamos a encontrar 2 ocurrencias de ese tag en el código. Nos vamos a quedar con la primera (desde arriba).

Pegamos el siguiente código a continuación del primer tag <data:post.body/> que hemos encontrado:

<!-- Pinterest Start -->
<b:if cond='data:blog.pageType == &quot;item&quot;'>
<div id='pin-wrapper' style='margin:5px 10px 5px 0; text-align: left;'>
<a class='pin-it-button' count-layout='horizontal' expr:href='&quot;http://pinterest.com/pin/create/button/?url=&quot; + data:post.url'>Pin It</a>
<a href='javascript:void(run_pinmarklet())' style='margin-left:-93px; width:43px; height:20px; display:inline-block;'/>
</div>
<script src='http://assets.pinterest.com/js/pinit.js' type='text/javascript'/>
<script type='text/javascript'>
function run_pinmarklet() {
var e=document.createElement(&#39;script&#39;);
e.setAttribute(&#39;type&#39;,&#39;text/javascript&#39;);
e.setAttribute(&#39;charset&#39;,&#39;UTF-8&#39;);
e.setAttribute(&#39;src&#39;,&#39;http://assets.pinterest.com/js/pinmarklet.js?r=&#39; + Math.random()*99999999);
document.body.appendChild(e);
}
</script>
</b:if>
<!-- Pinterest button End -->

Configuración del botón

El botón se puede ajustar cambiando el valor del atributo "count-layout", tomando como referencia la siguiente tabla:

Button type


count-layout value


margin-left (in line 5) value

pinterest pin-it button vertical

vertical


-46px

pinterest pin-it button horizontal

horizontal


-93px

pinterest pin-it button no count

none


-46px

Posición del botón

Los pasos anteriores son para colocar el botón en la parte inferior izquierda de cada entrada del blog. Para cambiar la posición, hacemos lo siguiente:
Para colocarlo en la parte superior de la entrada, pegar el código anterior antes del primer tag <data:post.body/>, en vez de después.

Alineación del botón

Cambiar el valor de la propiedad "text-align", en el primer
del código que hemos pegado el código HTML de la plantilla:
Para alinear a la derecha: asignarle "right";
Para centrar: asignarle "center";
Una vez que lo hemos cambiado en la plantilla, pulsamos "Guardar" y visualizamos el blog.

El botón debería estar apareciendo en la páginas individuales de cada entrada del blog.


Traducido desde aquí.

Añadir el botón de "Pin it", de Pinterest, como widget en blogger.

"Pinterest" es una red social online que se basa en compartir tablones, donde se van (pin)chando las cosas que quiere compartir cada usuario. Parecido a lo que es el muro de facebook. Está enfocada a compartir videos, imágenes,... para que al ver cada tablón sea vistoso y llamativo, parecido a un corcho lleno con fotos estáticas o no (vídeos).

A continuación explico una de las formas de conectar nuestro blog alojado en blogger, con esta red, para que los visitantes puedan difundirlo si quieren a través de ella, tal como es típico hacerlo a través de twitter, facebook,...

En éste caso vamos a colocar un botón de "pin it" genérico para todo el blog, no para una entrada individual.

Para colocar el botón "Pin it" fuera del área de los posts/entradas del blog, por ejemplo en la barra lateral(sidebar) o en el faldón(footer), copiar el siguiente código en un gadget nuevo o existente de blogger de tipo HTML/Javascript. Con esto, el botón aparecerá en todas las páginas, no sólo en las individuales de cada entrada, pero no vendrá con contador que nos indica cuántas veces nos han hecho "pin".

El código:
<a href='javascript:void(run_pinmarklet())'><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn2wDJa2XwSW2BPVkL4Lc5wGKpEHqse3agjInTXxkRSP1VevtjjB19TrkXioXgKO3Fzy0P7GZmQZZSQ6Bps5aXMAkwSLFF0g1WU3y2DqbBvv1VD0TVGgURQZaiw8EEVzygludq5hfQvXhZ/s1600/pinmask2.png" style='margin:0; padding:0; border:none;'/></a>
<script type='text/javascript'>
function run_pinmarklet() {
var e=document.createElement('script');
e.setAttribute('type','text/javascript');
e.setAttribute('charset','UTF-8');
e.setAttribute('src','http://assets.pinterest.com/js/pinmarklet.js?r='+Math.random()*99999999);
document.body.appendChild(e);http://www.blogger.com/img/blank.gif
}
</script>

Resultado:

En éste ejemplo lo he metido en un gadget de tipo HTML/Javascript que tenía en la barra lateral de éste blog.

Quizás quieras añadir un botón de pinterest para cada entrada.

martes, 6 de marzo de 2012

Guardar las configuraciones de aliases en cygwin

a) Sólo para el usuario actual

asumiendo que se usa Bash
modificar .bashrc en el directorio home

b) para todos los usuarios del pc

crear/modificar
/etc/profile.d/alias.sh

Los script en /etc/profile.d/ se ejecutan para todos los perfiles.

De esta forma, por ejemplo puedo guardar el alias que he creado para el ejecutable 'gem' (de ruby). Sin ese alias, al intentar ejecutar gem desde la consola de cygwin, me saltaba este error:
C:\Ruby193\bin\ruby.exe: No such file or directory -- /cygdrive/c/Ruby193/bin/gem (LoadError)

Así que cree un alias en cygwin, que apunta 'gem' al ejecutable:
alias gem='C:/Ruby193/bin/gem'

Para que ese alias se cargue cada vez que abro una consola de cygwin, metí su definición como script, dentro del directorio: [directorio de instalación de cygwin]/etc/profile.d/

lunes, 6 de febrero de 2012

SLF4J

La interfaz del sistema de logging contra la que se programa es: slf4j-api
Las implementaciones de esa interfaz son -> logback, slf4j-log4j,... Una vez al compilar, sólo debe haber una efectiva.

Incompatibilidad entre commons-logging y jcl-over-slf4j.


commons-logging y commons-logging-api son incompatibles con jcl-over-slf4j, o está uno o están los otros dos.

Recursos para consulta de POMs, búsqueda de artefactos de maven,...


Búsqueda en el repositorio de artefactos de maven:
search.maven.org

Otra web de búsqueda de clases, proyectos,... de Java:
www.jarvana.com

Activar el editor de POM en MyEclipse

En MyEclipse, si se quiere usar el editor de los pom.xml con sus pestañas avanzadas, se ha de activar de manera siguiente:

  • Se tiene que tener instalado el plugin de Maven para MyEclipse. En mi caso "Maven4MyEclipse".
  • Acceder al menú del pom editor en las preferencias de MyEclipse y marcar las opciones deseadas.Window-->Preferences-->MyEclipse-->Maven4MyEclipse-->Maven-->POM Editor.

Estas instrucciones son válidas para MyEclipse 8.6 Blue Edition.

También sería posible abrir el pom.xml con el editor de POM, si abrimos el fichero con "Open With" y seleccionando ese editor. Pero para no hacerlo cada vez, es mejor dejarlo configurado desde el menú que se menciona al principio.

lunes, 16 de enero de 2012

SCONS - software construction tool

Muy interesante, una herramienta de construcción de software por lo visto muy poderosa, de la que no había oido hablar antes, SCONS. Tiene soporte integrado para una gran para C, C++, D, Java, Fortran, Yacc, Lex, Qt y SWIG, y para construir documentos TeX y LaTeX. Aunque no estoy muy familiarizado con este campo, es probable que existan alternativas más interesantes, porque la web me pareció un pelín desactualizada, pero podría ser un buen punto de partida.

http://www.scons.org/