Instalar Sopcast en Ubuntu

En los últimos tiempos las aplicaciones P2P como eMule, Ares, Napster o Kazaa se han extendido y reproducido por internet como la pólvora.

A pesar de las continuas críticas sobre su legalidad frente a los derechos de autor, las numerosas ventajas que ofrecen este tipo de software hacen que se haya convertido en una importante fuente de innovaciones para la red. Este tipo de tecnología ha dado fruto a redes de intercambio de ficheros como Gnutella o eDonkey2000, a redes de telecomunicación a través de internet como Skype, e incluso a redes de transmisión audiovisual a través de internet como Sopcast o PPLive.

A la tecnología que utiliza el P2P para la transmisión y difusión de contenidos audiovisuales a través de internet se la llama P2PTV.

Sopcast (también llamado SopPlayer) es una aplicación P2PTV libre y gratuita que ofrece la posibilidad de ver y emitir televisión/radio por internet. Está disponible para plataformas Windows y Linux, y posee una amplia lista de canales fácilmente actualizable, así como la posibilidad de importar otros encontrados en la red.

La principal ventaja que lo ha hecho expandirse ampliamente es la buena calidad de emisión que ofrece. Aunque, al tratarse de tecnología P2P, la calidad depende de la conexión a internet y de la cantidad de usuarios que están viendo el canal, el método de transmisión que utiliza le permite minimizar los fallos y conseguir altas resoluciones.

Los canales para Sopcast se difunden a través de enlaces de tipo "sop://..." que podemos encontrar en páginas web, correos electrónicos,... Aunque la cantidad de canales permanentes en castellano es escasa en comparación con los transmitidos en inglés, chino o japonés, este formato está ampliamente extendido para la transmisión de eventos deportivos puntuales (sobre todo fútbol) casi en cualquier idioma. Es uno de los formatos más extendidos en la red para ello y si estamos buscando un canal que transmita un determinado evento es fácil toparnos con la necesidad de tenerlo instalado en nuestro equipo.

Para tenerlo en Ubuntu y mantenerlo actualizado deberemos añadir un repositorio que lo incluya (no hay repositorio oficial) y luego instalarlo desde allí:
Tipo: Binario y Fuente
URI: http://ppa.launchpad.net/ferramroberto/sopcast/ubuntu
Distribución: maverick
Componentes: main
Llaves GPG: 3ACC4965 (Fecha 03-03-2010)

  1. Abrimos una terminal (aplicaciones->Accesorios->Terminal).
  2. Añadimos el repositorio:
    NOTA: Recuerda que con la instrucción "add-apt-repository ppa:..." las llaves GPG públicas para tener acceso a dicho repositorio cada vez que lo necesitemos son importadas automáticamente.
     ~$ sudo add-apt-repository ppa:ferramroberto/sopcast
  3. Actualizamos la lista de paquetes y claves disponibles en los repositorios:
     ~$ sudo apt-get update
  4. Instalamos el programa:
     ~$ sudo apt-get install sopcast-player
Con eso nos queda instalado el programa. Para abrirlo y usarlo lo encontraremos en Aplicaciones->Sonido y Video->Sopcast Player.


Salu2,
elSant0

Instalar Spotify en Ubuntu

Para quien no lo sepa, Spotify es una aplicación streaming que permite escuchar temas musicales obtenidos de un amplio catálogo, ofrecido por la empresa de mismo nombre, en el que se incluye música de los artistas más representativos (del presente y del pasado).

Se pueden realizar búsquedas por artista, álbum o listas de reproducción creadas por los propios usuarios del programa. Esto quiere decir que los usuarios pueden crear listas de reproducción y compartirlas o editarlas junto con otros usuarios.

La principal baza de este software es precisamente su modo de compartir listas y selecciones musicales (además de la cantidad de música ofrecida). Tantos las pistas individuales como las listas de reproducción, pueden ofrecer un vínculo (para correos electrónicos, mensajería instantánea, páginas web,...) y, si el beneficiario sigue dicho vínculo, la lista se descargará en el cliente Spotify del destinatario.

El programa fue lanzado a finales de 2008 en el mercado europeo y a lo largo de 2009 se fué implantando en otros países. Se ha extendido rápidamente por todo el mundo y ha conseguido una cuota de mercado muy amplia en poco tiempo. Eso ha hecho que se haya extendido por muchas plataformas. Por ejemplo, hay versiones para Windows, Mac OS y Linux; se integra perfectamente con Last.fm; y también se encuentra disponible una versión móvil para Android, iOS y Symbian.

El gran incoveniente que presenta para los usuarios es que no es un software totalmente libre y por ello hay 4 tipos de licencias de uso:
  • Versión Open: Es gratuita y abierta a todo el mundo, pero sólo permite 20 horas de producción mensuales. Se financia por la publicidad que ofrece de forma esporádica el reproductor.
  • Versión Free: Es gratuita y no tiene límite de tiempo de reproducción, pero para obtener este tipo de licencia es necesaria una invitación especial, las cuales son controladas por la empresa distribuidora. Al igual que la versión Open, es financiada por la publicidad que ofrece de forma esporádica el reproductor.
  • Versión Unlimited: Se obtiene al pagar una cuota. Es igual que la versión Free, pero sin publicidad.
  • Versión Premium: Se obtiene al pagar una cuota. Además de no imponer límites de reproducción y dar una mayor calidad de reproducción, permite escuchar algunas novedades antes de su lanzamiento y todas antes que los usuarios Open y Free. También permite su uso en móviles con iOS (IPhone), Android y Symbian incluso sin conexión a la red.
A mi personalmente este hecho me hace mantenerme reacio a su uso y decantarme por alternativas totalmente gratuitas, pero muchos compañeros y amigos se han convertidos en usuarios habituales y me han pedido ayuda en su instalación sobre Ubuntu.

Para quien desee tenerlo instalado en Ubuntu y mantenerlo actualizado deberá añadir el repositorio oficial y luego instalarlo desde allí:
Tipo: Binario y Fuente
URI: http://repository.spotify.com
Distribución: stable
Componentes: non-free
Llaves GPG: 4E9CFF4E (Fecha 23-06-2010)

  1. Vamos a Aplicaciones->Centro de software de Ubuntu y en la ventana abierta clicamos sobre la pestaña Editar->Origenes del software....
  2. Sobre la nueva ventana vamos a la pestaña Otro software y allí damos al botón Añadir....
  3. Se abrirá una nueva ventana solicitando la línea APT, que será:
    deb http://repository.spotify.com stable non-free
    Donde, como se puede ver:
    • deb indica el tipo de repositorio (binario y fuente).
    • http://repository.spotify.com es la URI.
    • stable es la distribución.
    • non-free Es el grupo de componentes a instalar.
  4. Damos a Añadir Origen y luego a Cerrar.
  5. Ya hemos añadido el repositorio, ahora falta añadir las llaves GPG públicas para tener acceso a dicho repositorio cada vez que lo necesitemos. Para ello, abrimos una terminal (aplicaciones->Accesorios->Terminal) y hacemos:
     ~$ gpg --keyserver wwwkeys.de.pgp.net --recv-keys 4E9CFF4E
    Lo cual devolverá un mensaje parecido a este:
    gpg: solicitando clave 4E9CFF4E de hkp servidor wwwkeys.de.pgp.net
    gpg: clave 4E9CFF4E: «Spotify Public Repository Signing Key » sin cambios
    gpg: Cantidad total procesada: 1
    gpg:              sin cambios: 1
    
    Y tras el cual haremos:
     ~$ gpg --export 4E9CFF4E |sudo apt-key add -
    Que deberá devolver el mensaje "OK".
  6. Ahora recargamos la lista de paquetes y claves disponibles en los repositorios:
     ~$ sudo aptitude update
  7. Y ya podemos instalar el programa:
     ~$ sudo apt-get install spotify-client-qt spotify-client-gnome-support
Ya tenemos Spotify instalado. Para abrirlo y usarlo lo encontraremos en Aplicaciones->Sonido y Video->Spotify.


Salu2,
elSant0

Papa Noël no pudo acabar su ruta este año

Si alguien se quedó sin regalos estas navidades aquí podéis ver el motivo:



Salu2,
elSant0

Preparados para las Cuadrántidas

De nuevo anuncio una nueva lluvia de estrellas que llegará en los próximos días. Esta vez se trata de las Cuadrántidas.

Son una lluvia de estrellas fugaces que se produce todos los años entre el 28 de diciembre y el 13 de enero aproximadamente. En esta ocasión el día de máxima actividad será el 3 de enero, y los momentos de máximo explendor ocurrirán en torno a las 24:00 (hora UTC), por lo que desde Europa podremos disfrutarlas de pleno; no así en América, donde la luz solar todavía puede interferir.

Las Cuadrántidas son una lluvia de meteoros curiosa, incluso por su nombre. En 1795, el astrónomo francés Jérôme Lalande nombró a una nueva constelación, a la que llamó Quadrans Muralis (que es el nombre de un instrumento para medir las posiciones de las estrellas que él usaba). Entre 1820 y 1830 los observadores del cielo cayeron en cuenta de que, sobre esa zona celeste, había un incremento de estrellas fugaces en los primeros días del año y, en 1839, se percataron de que se trataba de un fenómeno periódico (algo extraño, ya que la mayoría de fenómenos periódicos de este tipo son conocidos desde la antigüedad). Como el radiante de la nueva lluvia de meteoros se encontraba en Cuandrans Muralis, se le dió el nombre de lluvia de meteoros Cuandrántidas. Sin embargo, en 1922, un grupo de astrónomos se reunió para crear la lista oficial de 88 constelaciones conocidas hasta hoy día. Cuadrans Muralis no se incluyó en esa lista, de manera que las Cuadrántidas llevan el nombre de una constelación que ya no existe. Su radiante se localiza actualmente en la constelación de Boötes (el Pastor, o el Boyero), junto a la Osa Mayor.

Desde su descubrimiento los astrónomos han buscado el cometa que dió origen a la lluvia. Algunos autores propusieron al cometa C/1490 Y1 como su cuerpo precursor, pero estudios recientes en 2008 lo desmienten. En 2003, el astrónomo Peter Jenniskens sugirió que podrían estar vinculadas al planeta menor 196256, descubierto por él mismo y situado a la derecha de la órbita que da origen a las Cuadrántidas. Según él, tanto los meteoroides cuadrántidos como el planeta menor, pueden ser fragmentos de un progenitor original desconocido. Algunos científicos creen que ese planeta menor es en realidad un cometa viejo extinto, y otros opinan que podría ser parte del ya mencionado cometa C/1490 que fué visto desde China, Korea y Japón en 1490 y en 1491; que quizás ese cometa se rompió y algunos pedazos se convirtieron en los meteoroides Cuadrántidos.

A diferencia de otras lluvias de meteoros cuya actividad se extiende por varias semanas, las Cuadrántidas presentan un excelente pero brevísimo show de dos o tres horas. Y, aunque en algunas ocasiones han llegado a presentar máximos de hasta 200 meteoros por hora (como en 1909), en otras apenas llegan a los 20. En general, las Cuadrántidas son sutiles, tenues y lentas (con meteoros de unos 41km/s); pero con bólidos que pueden ser espectaculares por su brillo.

Pueden ser vistas sólo desde el hemisferio norte, y una gran ventaja para quienes deseen disfrutarlas es que su radiante se sitúa en una región del cielo que permanece sobre el horizonte toda la noche. A continuación dejo una imagen que ayudará a encontrarlas en el firmamento:



Salu2,
elSant0

Feliz Navidad 2010

Para tod@s aquell@s que celebráis estas fechas os deseo


Y para los que no, un toque de humor:




Salu2,
elSant0

Poner bombillas de colores intermitentes en la cabecera del blog

Como ya anuncié hace unos días, estoy dando a la web un toque especial para estas fechas y esta vez he añadido una fila de bombillas intermitentes sobre la cabecera del blog:
Este hack lo saqué de El Escaparate de Rosa (que a su vez lo obtuvo de snowysites.com).

En mi caso he sustituido el enlace que Rosa proporcionaba por el propio código para así evitar dependencias de webs ajenas.

Veamos como conseguir tal efecto en nuestro blog:
  1. Vamos a Personalizar y luego a Diseño->Edición de HTML. Entonces damos a Expandir plantillas de artilugios.
  2. Ahora, en el código de nuestra plantilla buscamos la siguiente etiqueta:
    </head>
  3. Y justo antes de la misma pegamos el siguiente código:
    <script type='text/javascript'>  
     //<![CDATA[
      eval(function(p,a,c,k,e,d)
      {
       e=function(c)
       {
        return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))
       };
       if(!''.replace(/^/,String))
       {
        while(c--)
        {
         d[e(c)]=k[c]||e(c)
        }
        k=[function(e){return d[e]}];
        e=function()
        {
         return'\\w+'
        };
        c=1
       };
       while(c--)
       {
        if(k[c])
        {
         p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])
        }
       }
       return p
      }
      ('(o(){b m=0;b j=0;b 7=c B();b 5=c B();5[0]=c q();5[0].w=p;5[0].h=t;5[0].l=\'16\';5[1]=c q();5[1].w=p;5[1].h=t;5[1].l=\'1d\';5[2]=c q();5[2].w=p;5[2].h=t;5[2].l=\'X\';5[3]=c q();5[3].w=p;5[3].h=t;5[3].l=\'1f\';O=o(){A(b 6 19 7){b d=(6%4);k(7[6].n.e.18(\'G\')==-1){7[6].n.e=5[d].v.e}Q{7[6].n.e=5[d].z.e}}};N=o(6){b d=(6%4);b K=((6%2)?\'17\':\'G\');7[6]=c q();7[6].a=8.H(\'1b\');7[6].a.g.1e=\'15\';7[6].a.14=\'J\'+6;7[6].a.g.Y=W;7[6].a.g.V=\'Z\';7[6].a.g.10=((6-1)*5[d].w)+\'y\';7[6].a.g.13=5[d].w+\'y\';7[6].a.g.11=5[d].h+\'y\';7[6].a.1j=5[d].l+\'J\';7[6].n=8.H(\'1t\');7[6].n.g.1s=\'1r\';7[6].n.e=1v(\'5[\'+d+\'].\'+K+\'1x.e\');7[6].a.E(7[6].n);8.f.E(7[6].a)};R=o(){1p=1q;A(b i=0;i<5.1i;i++){5[i].z=c L(5[i].w,5[i].h);5[i].z.e=\'F://C.D.I/P/\'+5[i].l+\'1k.S\';5[i].v=c L(5[i].w,5[i].h);5[i].v.e=\'F://C.D.I/P/\'+5[i].l+\'1m.S\'};k(9.8.T>m)m=9.8.T;k(9.8.u.s>m)m=9.8.u.s;k(9.8.f.s>m)m=9.8.f.s;k(9.8.U>j)j=9.8.U;k(9.8.u.r>j)j=9.8.u.r;k(9.8.f.r>j)j=9.8.f.r;8.f.g.1n=\'1o\';b M=1l.1h(j/p);A(b i=1;i;lt;=M;i++)N(i);1y(\'O();\',1w)};x=o(){k((1g 8.f!=\'1u\')&&(8.f!=1a))R();Q 1c(\'x();\',12)};x()})();',62,97,'|||||light_types|light_id|lights|document|window|elm|var|new|cur_light|src|body|style|||browser_w|if|color|browser_h|img_elm|function|30|Object|clientWidth|clientHeight|31|documentElement|off_image||_lights_wait_for_body|px|on_image|for|Array|s3|amazonaws|appendChild|http|off|createElement|com|light|cur_light_status|Image|top_amount|_create_light|_blink_lights|snowysites|else|_start_lights|png|innerHeight|innerWidth|top|10001|yellow|zIndex|0px|left|height|100|width|id|absolute|red|on|indexOf|in|null|DIV|setTimeout|green|position|blue|typeof|ceil|length|className|_top_on|Math|_top_off|paddingTop|31px|_snowylights_started|true|none|border|IMG|undefined|eval|500|_image|setInterval'.split('|'),0,{})) 
     //]]>
     </script>
  4. Salimos guardando los cambios y ya podemos comprobar el efecto en el blog.



Salu2,
elSant0

Usar "Google Sites" para almacenar los scripts externos de nuestra web

Como ya sabréis muchos de los que administráis blogs en Blogger, una de las desventajas que este sistema opone es la imposibilidad de almacenar scripts fuera de la plantilla. Es por ello que nos quedan 3 opciones:
  1. Resignarnos a no usar scripts ajenos a Blogger.
  2. Almacenar los scripts dentro de la plantilla, haciéndola extensa y aumentando la dificultad de cualquier cambio que deseemos hacer posteriormente. Además de no permitir el almacenaje de variablesde datos universales para cualquier acceso (blogger no almacena variables ajenas en sus servidores, por lo que no podremos tener valores globales en el tiempo, como contadores,...).
  3. Almacenar los scripts en un lugar fuera del blog y desde la plantilla enlazar a dichos sitios.
En mi caso, hasta ahora, elegí la segunda opción para casi todo. Así evitaba al máximo la dependencia de sitios ajenos al blog. Pero mi plantilla me empieza a parecer demasiado larga y, a pesar de mantenerla estupéndamente etiquetada y comentada, empiezan a ser engorrosos los cambios.

Es por eso que desde hoy he tomado la decisión de pasarme a la 3ª opción: almacenar los scripts en un lugar externo.

Como siempre, las posibilidades son numerosas, pero lógicamente si el "almacén" está en manos del mismo que vela por el hospedaje del blog mejor. Es decir, vamos a ver como aprovechar los servicios que brinda Google para almacenar nuestros scripts.

Google ofrece la aplicación online gratuita Google Sites. Esta aplicación permite crear un sitio web o una intranet de forma sencilla. Permite reunir en un único lugar y rápidamente información variada (vídeos, calendarios, presentaciones, archivos adjuntos, texto,...).

Aprovechándonos de eso vamos a crear un web site en internet y allí vamos a alojar nuestros ficheros con los scripts. Veamos como hacerlo:
  1. Primero entramos en la página https://sites.google.com/site y nos logueamos con nuestro correo electrónico y contraseña de Google (los mismo que usamos para Blogger).
  2. Una vez dentro clicamos sobre Crear un sitio nuevo.
  3. En la nueva página web abierta configuraremos los siguientes valores:
    • Elegir una plantilla: En nuestro caso no es relevante, podemos elegir, por ejemplo, "Plantilla en blanco".
    • Indica el nombre de tu sitio: Para evitar posteriores confusiones pondremos el nombre de nuestro blog (en mi caso, "el Blog de elSant0")
    • Tu sitio se ubicará en esta URL: esta será la URL donde quedarán alojados los scripts (en mi caso "https://sites.google.com/site/elblogdeelsant0").
    • Más opciones: Aquí configuraremos una breve descripción del sitio (por ejemplo "site para almacenaje del blog.") y marcaremos la opción "Sólo las personas que especifique pueden ver este sitio." para que los scripts sólo estén disponibles para el uso del blog.
    Por último introduciremos el código de seguridad mostrado y daremos a Crear sitio.
  4. Ahora pasaremos a la página principal del nuevo web site creado. En la parte superior derecha veremos la opción + Crear página. La seleccionamos y a continuación configuramos las siguientes opciones:
    • Nombre: Le daremos el nombre identificativo "scripts".
    • Colocar la página en el nivel superior: Con ello daremos una ruta bastante identificativa a los scripts.
    Y damos a Crear página.
  5. Tras eso se abrirá la página donde añadiremos los scripts que desemos. Para ello, clicamos sobre Archivos adjuntos, seleccionamos el fichero en nuestra máquina que contiene el script (por ejemplo, "scriptdeprueba.js") y damos a Aceptar. Si todo va bien, en unos instantes veremos en el margen superior del navegador el mensaje "Fichero adjuntado con éxito".
  6. Ahora damos a Guardar en la parte superior derecha de la página. Ya tenemos almacenado el script y está listo para ser usado en el blog.
    En este ejemplo la ruta del script será:
    https://sites.google.com/site/elblogdeelsant0/scripts/scriptdeprueba.js
    Como se puede ver está formada por 3 partes:
    • https://sites.google.com/site/elblogdeelsant0/: Es la ruta del web site donde se almacenarán los scripts. Se configuró en el punto 3.
    • /scripts/: Es la subpágina del web site donde adjuntaremos los scripts. Se configuró en el punto 4.
    • scriptdeprueba.js: Es el nombre del fichero que contiene el script. Fue dado al crear el fichero en nuestra máquina y subido en el paso 5 con dicho nombre.
Cuando deseemos subir nuevos scripts bastará con entrar de nuevo a https://sites.google.com/site logueándonos con nuestro correo electrónico y contraseña de Google (los mismo que usamos para Blogger), clicar sobre la página "scripts" (en la columna de la izquierda) y adjuntar el nuevo fichero.

Espero que os resulte tan practico como a mi.


Salu2,
elSant0

¿Qué móvil comprar?

En los últimos años el avance en los teléfonos móviles está siendo demoledor. Estamos viendo como un terminal de última generación en poco más de 12 meses queda completamente obsoleto respecto a sus sucesores.

Eso no se convierte en una preocupación a no ser que seas un geek de la telefonía, te guste vacilar de teléfono, o intentes sacar el máximo rendimiento de tu móvil. Pero estamos viendo como los teléfonos incorporan tantas nuevas opciones y funciones que, en la mayoría de los casos, desconocemos la totalidad de cosas qué podemos hacer con ellos, o incluso no sabemos ni utilizarlos. Y cuando por fin nos empezamos a familiarizar con su interfaz, entonces, toca cambiarlo.

Pero la odisea no acaba ahí. Hoy, cuando vas a adquirir un nuevo teléfono ya resulta casi obligación adquirir un smartphone. Es decir, uno de esos móviles, casi siempre de pantalla táctil o con teclado QWERTY, que suelen incluir, entre otras cosas:
  • Un organizador personal completísimo(agenda, notas,...)
  • Conexión WIFI y un navegador de internet
  • Un gestor de correo electrónico
  • Posibilidad de instalar programas para incrementar el procesamiento de datos y la conectividad
  • Acelerómetros y algunos programas de navegación
  • Programas para leer documentos en formatos que antes eran exclusivos de ordenadores (.pdf, .doc,...)
  • Gestión multitarea
  • ...

Está claro que la elección puede ser toda una aventura, más si tenemos en cuenta que la cantidad de modelos disponibles empieza a ser abrumadora.

Uno de los aspectos más importantes que debemos tener en cuenta a la hora de adquirir uno de estos teléfonos es el sistema operativo, ya que determina cómo funcionará el dispositivo y qué aplicaciones se pueden utilizar.

Hasta hoy, los principales sistemas operativos incluídos en smartphone son 5: Android, IOS4, RIM, Symbian OS y Windows Phone. Veamoslos más detenidamente para saber por cual decantarnos.


  1. Andoid:

    Android es el sistema operativo de Google. En poco tiempo se ha convertido en uno de los grandes y viene instalado en muchos smartphones de diferentes marcas (HTC, Samsung, Motorola,...). Tal ha sido su impacto que incluso se está haciendo un gran hueco de mercado en otros dispositivos como tabletPC's, netbooks,...

    Rasgos que te pueden interesar de Android: Siendo un sistema "libre" y con una cantidad de aplicaciones disponibles cada vez más grande, Android es ya una de las principales plataformas elegidas por los desarrolladores para lanzar nuevas aplicaciones. Podemos encontrar un amplio catálogo de aplicaciones disponibles en "Android Market".

    Lo mejor de Android: Android es libre. ¿Qué quiere decir eso? Pues que puedes personalizar tu teléfono al máximo y modificar funciones del teléfono simplemente instalando una aplicación. En definitiva, se trata de una ventaja tanto para los que desarrollan sus aplicaciones como para sus usuarios.
    Otro tanto a favor de Android es la confianza que está recibiendo de los fabricantes. Gracias a ello, la oferta de teléfonos con Android es amplia y la oferta es variada tanto en marcas como en precios. Esto permite adquirir fácilmente un nuevo modelo con Android que se adapte a nuestras necesidades cuando nos cansemos del usamos ahora.

    Lo peor de Android: Uno de los aspectos negativos de Android es su fragmentación; aunque va mejorando, actualizar el sistema operativo a nuevas versiones no es tan sencillo como, por ejemplo, con un iPhone. También comparando con iPhone, la cantidad de juegos disponible para Android es menor.

    Elige un teléfono con Android si...: Quieres un teléfono de última generación con muchas aplicaciones a elegir, gran potencial y que te permita elegir entre una amplia variedad de marcas, modelos y precios. La configuración es muy sencilla y las aplicaciones desarrolladas por Google, como Gmail, funcionan de maravilla. Tanto para uso personal como profesional.

  2. IOS4:

    IOS4 es el sistema operativo incluido en todos los Iphone 4. Si eres uno de los tantos seguidores de este teléfono, ese será tu sistema operativo.

    Rasgos que te pueden interesar de IO4: Diseño atractivo, potencia, capacidad multimedia y un excelente y amplio surtido de aplicaciones accesible desde su "App Store".

    Lo mejor de IO4: Buen diseño, funcionalidad, facilidad de uso y la variedad de aplicaciones y juegos que lo convierten en un referente. Perfecta integración con servicios en la nube y equipos de sobremesa, especialmente Mac. Fácil gestión de correo, redes sociales...

    Lo peor de IO4: El sistema de Apple es cerrado, lo que quiere decir que hay menos posibilidades de cambiar la forma de funcionar del teléfono y un control más rígido de las aplicaciones publicadas. Además, si quieres disfrutar de un iPhone, sólo te queda desembolsar un precio bastante alto puesto que sólo hay un fabricante y un modelo. Las mayoría de aplicaciones también son de pago, por lo que tocará pagar por casi todo.

    Elige un teléfono con IO4 si...: Quieres un excelente smartphone a pesar del precio; eres fan de Iphone o incluso de Mac; tienes prioridad por la música, fotos, vídeo y juegos; usas iTunes.

  3. RIM:

    El sistema RIM es el que va metido en los dispositivos BlackBerry, que son conocidos como los smartphones tradicionalmente más cercanos al mundo profesional; aunque, actualmente, los modelos de Blackberry cuentan con todo lo que se puede esperar de un móvil moderno, no sólo para el trabajo, sino también para uso personal.

    Rasgos que te pueden interesar de RIM: Esta claramente orientado a su uso profesional como gestor de correo electrónico y agenda. Presta especial atención a la sincronización con el correo, el calendario, tareas, notas y contactos de Microsoft Exchange Server, además de ser compatible también con Lotus Notes y Novell GroupWise. Podemos encontrar el catálogo de aplicaciones disponibles en "Blackberry World".

    Lo mejor de RIM: Perfecto para el uso de correo electrónico. Destaca también por los aspectos de seguridad y por los teclados QWERTY que suelen incluir los dispositivos (al estilo de un teclado de PC), diseñados para permitir una escritura rápida.

    Lo peor de RIM: No se puede comparar su tienda de aplicaciones con las de Android o iTunes (IOS4). Tampoco existen grandes posibilidades de elección en cuanto a dispositivos y el potencial multimedia no es su fuerte principal.

    Elige un teléfono con RIM si...: Vives enganchado a tu correo electrónico y quieres un teclado real para escribir. Aunque para uso personal es muy válido, Blackberry es un smartphone tradicionalmente orientado al entorno empresarial.

  4. Symbian OS:

    Es el sistema que incluyen casi todos los teléfonos de la marca finlandesa Nokia, la cual ha sido referencia durante años. Además también ha sido incluido en ocasiones en terminales de otras marcas como Sony Ericsson, Motorola o BenQ.

    Rasgos que te pueden interesar de Symbian: Symbian, convertido ya en sistema abierto, ha perdido terreno respecto a Android y IOS4, pero sigue protagonista en los segmentos de gama media y baja. Se puede integrar con diferentes sistemas gráficos, lo que permite cambiar su apariencia fácilmente para adaptarlo a unos u otros terminales. Puedes encontrar multitud de aplicaciones en su "OVI Store".

    Lo mejor de Symbian: Symbian ha sido siempre fiable e innovador. Con fuerte énfasis en las funciones básicas de telefonía y multimedia de sus dispositivos, también cuenta con un amplio mercado de aplicaciones externas y con una tremenda variedad de dispositivos disponibles.
    Se trata de una excelente opción para conseguir terminales de gama media y baja, gracias a su fiabilidad, una cantidad razonable de buenas aplicaciones, posibilidades multimedia y al precio asequible de muchos de sus modelos.

    Lo peor de Symbian: Hay muchas y muy buenas aplicaciones para Symbian, pero no se puede comparar con la cantidad de oferta de nuevas aplicaciones de la competencia (Android o IOS4). En los últimos tiempos, tiene un aparente menor rendimiento respecto a otros sistemas operativos debido a que las prestaciones de los terminales donde se incluye suelen ser menos potentes.

    Elige un teléfono con Symbian si...: Quieres un teléfono más moderno que tu viejo modelo pero no necesitas mil aplicaciones. Un terminal medio con Symbian suele estar orientado a escuchar música, hacer fotos y llamar... ¿necesitas más? Por otro lado, la renovación prevista para Symbian merece atención y puede dar buenos frutos también en modelos punteros.

  5. Windows Phone:

    Windows Phone es el sistema operativo de Microsoft para dispositivos móviles. Su predecesor (Windows Mobile) había perdido gran cuota de mercado en los últimos años, lo que ha llevado a una total renovación que le ha dado muy buenas críticas.

    Rasgos que caracterizan a Windows Phone: Con un buen puñado de aplicaciones ya disponibles parece que poco a poco va a ir entrando en la competición con los otros grandes; aunque todavía es pronto para saber si será así. De momento dan muchas facilidades en su portal "Windows Phone en movimiento".

    Lo mejor de Windows Phone: Un diseño moderno, práctico, atractivo y con características innovadoras que han sorprendido a más de uno. Cuenta con una gran inversión y el resultado es un sistema moderno y capaz. Es totalmente compatible con el resto de sistemas Windows y demás software de Microsoft.

    Lo peor de Windows Phone: La variedad de móviles todavía no es amplia, aunque está en crecimiento. Por otra parte, al llegar algo más tarde que el resto, la cantidad de aplicaciones disponibles en estos momentos es baja, aunque están facilitando el trabajo a los desarrolladores para llenar el hueco rápidamente.

    Elige un teléfono con Windows Phone si...: Quieres un smartphone avanzado y con el sello de Windows, capacidades multimedia y entorno personalizable a medida. Promete mucho y su potencial está aún por descubrir.

De momento eso es todo. Espero sirva de ayuda.


Salu2,
elSant0

Optimizar la interfaz gráfica de Ubuntu para Netbook de pequeña pantalla

NOTA: El siguiente tutorial está indicado para la interfaz de usuario Gnome Panel, incluída por defecto hasta Ubuntu 10.10. En Ubuntu 11.04 y posteriores la interfaz por defecto es Unity, por lo que el tutorial pierde su validez.

Hace ya un par de añitos que trabajo con mi pequeño netbook Asus EeePC 1000H y durante todo ese tiempo he tenido que optimizar la interfaz gráfica para conseguir aprovechar al máximo la pequeña pantalla de 10" que trae (con resolución máxima de 1024x600píxeles).

Resulta que últimamente algunos amigos han migrado también sus propios netbook a Ubuntu y me han pedido ayuda para conseguir una interfaz acorde a sus pequeños monitores (de entre 9 y 11" y resoluciones de 800x600 a 1024x600).

Asi que aquí dejo una serie de trucos y opciones que a mi me han venido muy bien para sacar mejor rendimiento a estas pequeñas pantallas y reducir todo lo posible cada área ocupada por herramientas del sistema:
  • Ajuste del tamaño de las fuentes

    La experiencia me dice que podemos trabajar hasta con fuentes de tamaño 7. Tamaños menores se vuelven ilegibles.

    Para configurar el tamaño de las fuentes haremos lo siguiente:
    1. Vamos a Sistema->Preferencias->Apariencia.
    2. Nos dirigimos a la pestaña Tipografías.
    3. Cambiamos el tamaño de todas las tipografías a 7.
    4. Elegimos el renderizado Mejores formas.
    5. Cerramos.

  • Ajuste del tamaño y ocultación de los paneles

    La experiencia me dice que el grosor mínimo de los paneles es 18 píxeles, por lo que ese será el valor que pondremos. También permitiremos la ocultación automática.

    Para hacer todo esto:
    1. Clicamos con el botón derecho sobre el panel superior y damos a Propiedades.
    2. Marcamos la opción Ocultar automáticamente.
    3. Cambiamos el Tamaño a valor 18.
    4. Damos a Cerrar.
    5. Repetimos los pasos anteriores sobre el panel inferior.

    Ahora, vamos a acelerar la ocultación y muestreo de los paneles (a mi me resultaba muy lento para trabajar):
    1. Pulsamos [ALT]+[F2] para abrir el lanzador de aplicaciones.
    2. Introducimos el siguiente comando para abrir el editor de configuración de Gnome y pulsamos Ejecutar:
    3. En la ventana que se acaba de abrir hay un árbol de directorios en la parte derecha. Vamos a la ruta "/apps/panel/toplevels/". Cada uno de los directorios allí contenidos corresponde a un panel. Si tenemos los mismos paneles que fueran creados durante la instalación de Ubuntu, los directorios serán:
      • "bottom_panel_screen0"
      • "top_panel_screen0"
    4. Al pulsar sobre dichos directorios se muestran configuraciones de los paneles en la parte derecha de la ventana. Para aumentar la velocidad de ocultación modificaremos las siguientes propiedades para cada panel:
      • enable_animations [DESACTIVADO] -> Para evitar la demora por el efecto animado.
      • hide_delay [0] -> Es el tiempo que se retrasará la ocultación del panel. Yo lo puse a 0.
      • unhide_delay [0] -> Es el tiempo que se retrasará el muestreo del panel tras colocar el mouse en el margen correspondiente. También le di valor 0.
    5. Una vez hechos los cambios cerramos la ventana y ya tenemos los paneles configurados
    6. Cerramos las ventanas.

  • Applet para reducir el espacio usado en el panel superior

    El menú principal de Gnome ocupa mucho espacio en el panel, pero podemos cambiarlo por otro más compacto y que ofrece las mismas funcionalidad. Para ello cambiaremos el applet "Barra de menús" por el applet "Menú principal".

    Para hacerlo:
    1. Clicamos con el botón derecho sobre el applet "Barra de Menús" que se encuentra en el panel superior y damos a Quitar del panel.
    2. Ahora clicamos con el botón derecho sobre el panel y damos a Añadir al panel....
    3. Seleccionamos "Menu Principal".
    4. Damos a Añadir.
    5. Clicamos en Cerrar.
    6. Movemos el menú al extremo izquierdo del panel (clic botón derecho, desmarcar Bloquear el panel y luego Mover).

  • Otros applets interesantes

    Existen otros applets interesantes que podemos usar. Por ejemplo, uno llamado "Global menú", que muestra la barra de menús de cada aplicación dentro del panel de Gnome. De esta manera ahorraremos el espacio que ocupa esta barra en cada aplicación. Además este applet también sirve como lista de ventana y cambiador de aplicaciones, ahorrando aún más espacio en el panel.

    Otro applet práctico es "Windows Applets", que muestra la barra de título y los botones de control de la ventana activa dentro del panel de Gnome. De esta manera ahorraremos el espacio que ocupa esta barra en cada aplicación.

    Yo habitualmente no uso estos applets porque, debido a que no tienen un soporte oficial estable, están sujetos a constantes cambios según la versión de Ubuntu que usemos.

    Algunos de ellos han empezado a incluirse en la versión Ubuntu Remix lanzada para netbooks.
  • Activación de "Pantalla completa" mediante tecla rápida para todas las aplicaciones posibles

    Algunos programas tienen la opción de ejecutarse a pantalla completa ahorrando así espacio. Para activar esta función en todas las aplicaciones y asignarle la combinación de teclas [Alt]+[F11] haremos:
    • Si nuestro gestor de ventanas es Metacity, introduciremos por consola la orden:
      ~$ gconftool-2 --set /apps/metacity/window_keybindings/toggle_fullscreen --type string "F11" 
    • Si nuestro gestor de ventanas es Compiz, haremos desde el menú: Sistema->Preferencias->Administrador de Opciones CompizConfig->Acciones del administrador de ventanas extra->Habilitar o deshabilitar Pantalla completa->[alt]+[F11]

Supongo que habrán muchos más cambios de configuración prácticos posibles, pero de momento estos son los que a mi me parecen más prácticos. Si tenéis alguna sugerencia no dudéis en comentarlo.


Salu2,
elSant0

Copos de nieve en tu web

Bueno, ya se acercan las navidades y he pensado en darle un toque un poco especial al blog para estas fechas. Ya habréis notado esos copitos de nieve que van cayendo y posándose sobre la base del navegador y pronto veréis algún que otro toque personal más.

Algunos me habéis pedido que explique como conseguir estos efectos, así que vamos a verlo. Pero antes de hacerlo voy a dar las gracias al Escaparate de Rosa, ya que este efecto lo saqué de allí.

Bueno y ahora vamos con el tutorial:
  1. Vamos a Personalizar y luego a Diseño->Edición de HTML y damos a Expandir plantillas de artilugios.
  2. En el código buscamos la siguiente etiqueta:
    <head>
    Y justo antes pegamos el siguiente script:
    
    <!-- INICIO CODIGO AÑADIDO PARA AÑADIR COPOS DE NIEVE CAYENDO-->
     <script type="text/javascript">
      //<![CDATA[
       /*
       DHTML Snowstorm! OO-style Jascript-based Snow effect
       ----------------------------------------------------
       Version 1.4.20091115 (Previous rev: v1.3.20081215)
       Code by Scott Schiller - http://schillmania.com
       ----------------------------------------------------
       Initializes after body onload() by default (via addEventHandler() call at bottom.)
       To customize properties, edit below or override configuration after this script
       has run (but before body.onload), eg. snowStorm.snowStick = false;
       */
       var snowStorm = null;
    
       function SnowStorm()
       {
        // --- PROPERTIES ---
        this.flakesMax = 150;          // Limit total amount of snow made (falling + sticking)
        this.flakesMaxActive = 64;         // Limit amount of snow falling at once (less = lower CPU use)
        this.animationInterval = 33;        // Theoretical "miliseconds per frame" measurement. 20 = fast + smooth, but high CPU use. 50 = more conservative, but slower
        this.flakeBottom = null;          // Integer for Y axis snow limit, 0 or null for "full-screen" snow effect
        this.targetElement = null;          // element which snow will be appended to (document body if null/undefined) - can be an element ID string, or a DOM node reference
        this.followMouse = true;          // Snow will change movement with the user's mouse
        this.snowColor = '#fff';          // Don't eat (or use?) yellow snow.
        this.snowCharacter = '&bull;';         // &bull; = bullet, &middot; is square on some systems etc.
        this.snowStick = true;           // Whether or not snow should "stick" at the bottom. When off, will never collect.
        this.useMeltEffect = true;          // When recycling fallen snow (or rarely, when falling), have it "melt" and fade out if browser supports it
        this.useTwinkleEffect = false;         // Allow snow to randomly "flicker" in and out of view while falling
        this.usePositionFixed = false;         // true = snow not affected by window scroll. may increase CPU load, disabled by default - if enabled, used only where supported
        // --- less-used bits ---
        this.flakeLeftOffset = 0;          // amount to subtract from edges of container
        this.flakeRightOffset = 0;          // amount to subtract from edges of container
        this.flakeWidth = 8;           // max pixel width for snow element
        this.flakeHeight = 8;           // max pixel height for snow element
        this.vMaxX = 5;            // Maximum X velocity range for snow
        this.vMaxY = 4;            // Maximum Y velocity range
        this.zIndex = 0;            // CSS stacking order applied to each snowflake
        // --- End of user section ---
        // jslint global declarations
        /*global window, document, navigator, clearInterval, setInterval */
        var addEvent  = (typeof(window.attachEvent)=='undefined'?function(o,evtName,evtHandler) { return o.addEventListener(evtName,evtHandler,false); }:function(o,evtName,evtHandler) { return o.attachEvent('on'+evtName,evtHandler); });
        var removeEvent = (typeof(window.attachEvent)=='undefined'?function(o,evtName,evtHandler) { return o.removeEventListener(evtName,evtHandler,false); }:function(o,evtName,evtHandler) { return o.detachEvent('on'+evtName,evtHandler); });
       
        function rnd(n,min)
        {
         if (isNaN(min)) min = 0;
         return (Math.random()*n)+min;
        }
        function plusMinus(n) { return (parseInt(rnd(2),10)==1?n*-1:n); }
    
        var s = this;
        var storm = this;
        this.timers = [];
        this.flakes = [];
        this.disabled = false;
        this.active = false;
    
        var isIE = navigator.userAgent.match(/msie/i);
        var isIE6 = navigator.userAgent.match(/msie 6/i);
        var isOldIE = (isIE && (isIE6 || navigator.userAgent.match(/msie 5/i)));
        var isWin9X = navigator.appVersion.match(/windows 98/i);
        var isiPhone = navigator.userAgent.match(/iphone/i);
        var isBackCompatIE = (isIE && document.compatMode == 'BackCompat');
        var noFixed = ((isBackCompatIE || isIE6 || isiPhone)?true:false);
        var screenX = null;
        var screenX2 = null;
        var screenY = null;
        var scrollY = null;
        var vRndX = null;
        var vRndY = null;
        var windOffset = 1;
        var windMultiplier = 2;
        var flakeTypes = 6;
        var fixedForEverything = false;
        var opacitySupported = (function()
        {
         try   { document.createElement('div').style.opacity = '0.5'; }
         catch (e) { return false; }
         return true;
        })();
        var docFrag = document.createDocumentFragment();
        if (s.flakeLeftOffset === null)  s.flakeLeftOffset = 0;
        if (s.flakeRightOffset === null) s.flakeRightOffset = 0;
        this.meltFrameCount = 20;
        this.meltFrames = [];
        for (var i=0; i<this.meltFrameCount; i++) this.meltFrames.push(1-(i/this.meltFrameCount));
        this.randomizeWind = function()
        {
         vRndX = plusMinus(rnd(s.vMaxX,0.2));
         vRndY = rnd(s.vMaxY,0.2);
         if (this.flakes)
         {
          for (var i=0; i<this.flakes.length; i++)
          {
           if (this.flakes[i].active) this.flakes[i].setVelocities();
          }
         }
        };
    
        this.scrollHandler = function()
        {
        // "attach" snowflakes to bottom of window if no absolute bottom value was given
         scrollY = (s.flakeBottom?0:parseInt(window.scrollY||document.documentElement.scrollTop||document.body.scrollTop,10));
         if (isNaN(scrollY)) scrollY = 0; // Netscape 6 scroll fix
         if (!fixedForEverything && !s.flakeBottom && s.flakes)
         {
          for (var i=s.flakes.length; i--;)
          {
           if (s.flakes[i].active === 0) s.flakes[i].stick();
          }
         }
        };
    
        this.resizeHandler = function()
        {
         if (window.innerWidth || window.innerHeight)
         {
          screenX = window.innerWidth-(!isIE?16:2)-s.flakeRightOffset;
          screenY = (s.flakeBottom?s.flakeBottom:window.innerHeight);
         }
         else
         {
          screenX = (document.documentElement.clientWidth||document.body.clientWidth||document.body.scrollWidth)-(!isIE?8:0)-s.flakeRightOffset;
          screenY = s.flakeBottom?s.flakeBottom:(document.documentElement.clientHeight||document.body.clientHeight||document.body.scrollHeight);
         }
         screenX2 = parseInt(screenX/2,10);
        };
    
        this.resizeHandlerAlt = function()
        {
         screenX = s.targetElement.offsetLeft+s.targetElement.offsetWidth-s.flakeRightOffset;
         screenY = s.flakeBottom?s.flakeBottom:s.targetElement.offsetTop+s.targetElement.offsetHeight;
         screenX2 = parseInt(screenX/2,10);
        };
    
        this.freeze = function()
        {
         // pause animation
         if (!s.disabled) s.disabled = 1;
         else    return false;
         for (var i=s.timers.length; i--;) clearInterval(s.timers[i]);   
        };
    
        this.resume = function()
        {
         if (s.disabled)  s.disabled = 0;
         else    return false;
         s.timerInit();
        };
    
        this.toggleSnow = function()
        {
         if (!s.flakes.length) s.start();  // first run
         else
         {
          s.active = !s.active;
          if (s.active)
          {
           s.show();
           s.resume();
          }
          else
          {
           s.stop();
           s.freeze();
          }
         }
        };
    
        this.stop = function()
        {
         this.freeze();
         for (var i=this.flakes.length; i--;) this.flakes[i].o.style.display = 'none';
         removeEvent(window,'scroll',s.scrollHandler);
         removeEvent(window,'resize',s.resizeHandler);
         if (!isOldIE)
         {
          removeEvent(window,'blur',s.freeze);
          removeEvent(window,'focus',s.resume);
         }
        };
        this.show = function() { for (var i=this.flakes.length; i--;) this.flakes[i].o.style.display = 'block'; };
        this.SnowFlake = function(parent,type,x,y)
        {
         var s = this;
         var storm = parent;
         this.type = type;
         this.x = x||parseInt(rnd(screenX-20),10);
         this.y = (!isNaN(y)?y:-rnd(screenY)-12);
         this.vX = null;
         this.vY = null;
         this.vAmpTypes = [1,1.2,1.4,1.6,1.8]; // "amplification" for vX/vY (based on flake size/type)
         this.vAmp = this.vAmpTypes[this.type];
         this.melting = false;
         this.meltFrameCount = storm.meltFrameCount;
         this.meltFrames = storm.meltFrames;
         this.meltFrame = 0;
         this.twinkleFrame = 0;
         this.active = 1;
         this.fontSize = (10+(this.type/5)*10);
         this.o = document.createElement('div');
         this.o.innerHTML = storm.snowCharacter;
         this.o.style.color = storm.snowColor;
         this.o.style.position = (fixedForEverything?'fixed':'absolute');
         this.o.style.width = storm.flakeWidth+'px';
         this.o.style.height = storm.flakeHeight+'px';
         this.o.style.fontFamily = 'arial,verdana';
         this.o.style.overflow = 'hidden';
         this.o.style.fontWeight = 'normal';
         this.o.style.zIndex = storm.zIndex;
         docFrag.appendChild(this.o);
    
         this.refresh = function()
         {
          if (isNaN(s.x) || isNaN(s.y)) return false; // safety check
          s.o.style.left = s.x+'px';
          s.o.style.top = s.y+'px';
         };
         this.stick = function()
         {
          if (noFixed || (storm.targetElement != document.documentElement && storm.targetElement != document.body)) s.o.style.top = (screenY+scrollY-storm.flakeHeight)+'px';
          else
          {
           if (storm.flakeBottom) s.o.style.top = storm.flakeBottom+'px';
           else
           {
            s.o.style.display = 'none';
            s.o.style.top = 'auto';
            s.o.style.bottom = '0px';
            s.o.style.position = 'fixed';
            s.o.style.display = 'block';
           }
          }
         };
         this.vCheck = function()
         {
          if (s.vXgt;=0 && s.vX<0.2)  s.vX = 0.2;
          else if (s.vX<0 && s.vX>-0.2) s.vX = -0.2;
          if (s.vY>=0 && s.vY<0.2)  s.vY = 0.2;
         };
         this.move = function()
         {
          var vX = s.vX*windOffset;
          s.x += vX;
          s.y += (s.vY*s.vAmp);
          if (s.x >= screenX || screenX-s.x < storm.flakeWidth) s.x = 0;// X-axis scroll check
          else if (vX < 0 && s.x-storm.flakeLeftOffset<0-storm.flakeWidth) s.x = screenX-storm.flakeWidth-1; // flakeWidth;
          s.refresh();
          var yDiff = screenY+scrollY-s.y;
          if (yDiff<storm.flakeHeight)
          {
           s.active = 0;
           if (storm.snowStick) s.stick();
           else     s.recycle();
          }
          else
          {
           if (storm.useMeltEffect && s.active && s.type < 3 && !s.melting && Math.random()>0.998)
           {
            // ~1/1000 chance of melting mid-air, with each frame
            s.melting = true;
            s.melt();
            // only incrementally melt one frame
            // s.melting = false;
           }
           if (storm.useTwinkleEffect)
           {
            if (!s.twinkleFrame)
            {
             if (Math.random()>0.9) s.twinkleFrame = parseInt(Math.random()*20,10);
            }
            else
            {
             s.twinkleFrame--;
             s.o.style.visibility = (s.twinkleFrame && s.twinkleFrame%2===0?'hidden':'visible');
            }
           }
          }
         };
         this.animate = function()
         {
          // main animation loop
          // move, check status, die etc.
          s.move();
         };
         this.setVelocities = function()
         {
          s.vX = vRndX+rnd(storm.vMaxX*0.12,0.1);
          s.vY = vRndY+rnd(storm.vMaxY*0.12,0.1);
         };
    
         this.setOpacity = function(o,opacity)
         {
          if (!opacitySupported) return false;
          o.style.opacity = opacity;
         };
    
         this.melt = function()
         {
          if (!storm.useMeltEffect || !s.melting) s.recycle();
          else
          {
           if (s.meltFrame < s.meltFrameCount)
           {
            s.meltFrame++;
            s.setOpacity(s.o,s.meltFrames[s.meltFrame]);
            s.o.style.fontSize = s.fontSize-(s.fontSize*(s.meltFrame/s.meltFrameCount))+'px';
            s.o.style.lineHeight = storm.flakeHeight+2+(storm.flakeHeight*0.75*(s.meltFrame/s.meltFrameCount))+'px';
           }
           else s.recycle();
          }
         };
    
         this.recycle = function()
         {
          s.o.style.display = 'none';
          s.o.style.position = (fixedForEverything?'fixed':'absolute');
          s.o.style.bottom = 'auto';
          s.setVelocities();
          s.vCheck();
          s.meltFrame = 0;
          s.melting = false;
          s.setOpacity(s.o,1);
          s.o.style.padding = '0px';
          s.o.style.margin = '0px';
          s.o.style.fontSize = s.fontSize+'px';
          s.o.style.lineHeight = (storm.flakeHeight+2)+'px';
          s.o.style.textAlign = 'center';
          s.o.style.verticalAlign = 'baseline';
          s.x = parseInt(rnd(screenX-storm.flakeWidth-20),10);
          s.y = parseInt(rnd(screenY)*-1,10)-storm.flakeHeight;
          s.refresh();
          s.o.style.display = 'block';
          s.active = 1;
         };
         this.recycle(); // set up x/y coords etc.
         this.refresh();
        };
    
        this.snow = function()
        {
         var active = 0;
         var used = 0;
         var waiting = 0;
         var flake = null;
         for (var i=s.flakes.length; i--;)
         {
          if (s.flakes[i].active == 1)
          {
           s.flakes[i].move();
           active++;
          }
          else if (s.flakes[i].active === 0) used++;
          else waiting++;
          if (s.flakes[i].melting) s.flakes[i].melt();
         }
         if (active<s.flakesMaxActive)
         {
          flake = s.flakes[parseInt(rnd(s.flakes.length),10)];
          if (flake.active === 0) flake.melting = true;
         }
        };
    
        this.mouseMove = function(e)
        {
         if (!s.followMouse) return true;
         var x = parseInt(e.clientX,10);
         if (x<screenX2) windOffset = -windMultiplier+(x/screenX2*windMultiplier);
         else
         {
          x -= screenX2;
          windOffset = (x/screenX2)*windMultiplier;
         }
        };
        this.createSnow = function(limit,allowInactive)
        {
         for (var i=0; i<limit; i++)
         {
          s.flakes[s.flakes.length] = new s.SnowFlake(s,parseInt(rnd(flakeTypes),10));
          if (allowInactive || i>s.flakesMaxActive) s.flakes[s.flakes.length-1].active = -1;
         }
         storm.targetElement.appendChild(docFrag);
        };
    
        this.timerInit = function()
        {
         s.timers = (!isWin9X?[setInterval(s.snow,s.animationInterval)]:[setInterval(s.snow,s.animationInterval*3),setInterval(s.snow,s.animationInterval)]);
        };
    
        this.init = function()
        {
         s.randomizeWind();
         s.createSnow(s.flakesMax); // create initial batch
         addEvent(window,'resize',s.resizeHandler);
         addEvent(window,'scroll',s.scrollHandler);
         if (!isOldIE)
         {
          addEvent(window,'blur',s.freeze);
          addEvent(window,'focus',s.resume);
         }
         s.resizeHandler();
         s.scrollHandler();
         if (s.followMouse) addEvent(document,'mousemove',s.mouseMove);
         s.animationInterval = Math.max(20,s.animationInterval);
         s.timerInit();
        };
       
        var didInit = false;
        this.start = function(bFromOnLoad)
        {
         if (!didInit)   didInit = true;
         else if (bFromOnLoad) return true; // already loaded and running
         if (typeof s.targetElement == 'string')
         {
          var targetID = s.targetElement;
          s.targetElement = document.getElementById(targetID);
          if (!s.targetElement) throw new Error('Snowstorm: Unable to get targetElement "'+targetID+'"');
         }
         if (!s.targetElement) s.targetElement = (!isIE?(document.documentElement?document.documentElement:document.body):document.body);
         if (s.targetElement != document.documentElement && s.targetElement != document.body) s.resizeHandler = s.resizeHandlerAlt; // re-map handler to get element instead of screen dimensions
         s.resizeHandler(); // get bounding box elements
         s.usePositionFixed = (s.usePositionFixed && !noFixed); // whether or not position:fixed is supported
         fixedForEverything = s.usePositionFixed;
         if (screenX && screenY && !s.disabled)
         {
          s.init();
          s.active = true;
         }
        };
        function doStart() { s.start(true); }
        if (document.addEventListener)
        {
         // safari 3.0.4 doesn't do DOMContentLoaded, maybe others - use a fallback to be safe.
         document.addEventListener('DOMContentLoaded',doStart,false);
         window.addEventListener('load',doStart,false);
        }
        else addEvent(window,'load',doStart);
       } 
       snowStorm = new SnowStorm();
      //]]>
     </script>
     <!-- FIN CODIGO AÑADIDO PARA AÑADIR COPOS DE NIEVE CAYENDO-->
    
  3. Con eso basta, pero también podemos cambiar algunos aspectos de configuración como el número de copos. Para ello buscamos dentro del nuevo código añadido la siguiente línea:
    this.flakesMax = 150;
  4. Salimos guardando los cambios y ya podemos comprobar el efecto en el blog.
Y eso es todo. Es bastante fácil.


Salu2,
elSant0

Mixxx, mezclando música en Ubuntu

Hace bastante tiempo que ando buscando un software totalmente libre que implemente todas las facilidades que suele requerir para su gestión musical cotidiana una cafetería, un bar o un disco-pub.

Entre esas cualidades se encuentran:
  • La gestión de listas que evite crear selecciones musicales a cada momento.
  • La mezcla automática que evite silencios durante la reproducción y suavice los cambios de pistas de audio.
  • La posibilidad de pre-escucha, a través de auriculares, que permita oir y seleccionar pistas mientras se está reproduciendo otra en abierto.
  • La posibilidad de ecualizar el sonido y modificar su volumen cómodamente.
  • Poder modificar la velocidad de reproducción.
  • Una administración de la música que permita realizar búsquedas rápidamente.
  • Poder realizar una mezcla musical en cualquier momento.
  • Que el sistema se mantenga muy estable para evitar problemas inesperados.
  • Poder trabajar con las principales tarjetas y dispositivos de audio del mercado sin problemas.
  • ...

Para ello existen multitud de software de pago, más o menos profesionales,que implementan todas esas funciones y muchas más. Algunos son BPM-Studio, VirtualDJ, PCDJ, Traktor, Serato,... Pero como ya dije, todos ellos son software privativo y en su mayoría tambien necesitan de sistemas operativos de pago para correr (Windows o MacOsX). Sin embargo, mi búsqueda está orientada a evitar todo eso y hasta ahora no estaba satisfecho con ninguna de las alternativas encontradas.

Estos días me estoy llevando una grata sorpresa al probar de nuevo un software que hace algún tiempo descarté por considerar que todavía era inmaduro e incompleto. Estoy hablando de Mixxx, un programa relativamente sencillo (si lo comparamos con la mayoría de este tipo),con el cual es posible obtener resultados suficientemente profesionales.

Resulta que hace poco más de un mes que fue lanzada su versión 1.8, donde muchos de sus principales impedimentos fueron corregidos y por tanto, a mi gusto, ya está listo para cubrir medianamente bien ese hueco de mercado que mencionaba al inicio del post.


Está desarrolado por una comunidad de programadores y Djs y es el fruto de mucho tiempo de estudio y esfuerzo. Además de todas esas cualidades mencionadas antes, también permite grabar sesiones, usar múltiples dispositivos, sincronizar velocidad de 2 pistas simultáneas, bucles,...

Para quien esté interesado en probarlo,está disponible en los repositorios de Ubuntu, dentro de Aplicaciones->Centro de software de Ubuntu, pero explicaré como añadir su repositorio oficial e instalarlo desde allí para conseguir su última versión y además mantenerlo actualizado a la última mediante actualizaciones automáticas:
  1. Abrimos una Terminal (Aplicaciones->Accesorios->Terminal).
  2. Añadimos el repositorio de Mixxx a nuestra lista de "repos":
    ~$ sudo add-apt-repository ppa:mixxxdevelopers/ppa
    INFO ASOCIADA AL REPOSITORIO:
    Tipo: Binario y Fuente
    URI: http://ppa.launchpad.net/mixxxdevelopers/ppa/ubuntu
    Distribución: maverick
    Componentes: main
    Llaves GPG: E8EF47D2 (Fecha 28-09-20010)
  3. Actualizamos la lista de paquetes disponibles accesibles desde nuestra máquina:
    ~$ sudo apt-get update
  4. Instalamos los paquetes necesarios:
    ~$ sudo apt-get install mixxx libportaudio2
Con eso queda instalada la última versión del software en nuestra máquina. Ahora recuerda cambiar el skin poniendo el que más se ajuste a tus necesidades y gusto y a disfrutarlo.


Salu2,
elSant0