Instalando SopCast en Ubuntu

El otro día os hablaba de cómo instalar AceStream en Ubuntu y derivados, y voy a complementarlo añadiendo otro popular software para ver retransmisiones por streaming p2p: SopCast.

He testeado en un Lubuntu 15.10 de 32bits y me ha funcionado sin problema. Los comandos serían los siguientes:

#añadimos el repositorio e instalamos el ppa, sin más
sudo add-apt-repository -y ppa:lyc256/sopcast-player
sudo apt-get update
sudo apt-get install sopcast-player

Otra opción es utilizar un paquete .deb de los que hay en este enlace, aunque no lo he probado y no se qué tal funciona.

Hacer un triángulo con CSS3

¿Cómo puedo insertar la imagen de un triángulo en mi web sin usar imágenes? ¿Es posible hacerlo sólo con CSS3? En el pasado vimos como hacer un exágono o un octógono, y el triángulo es todavía más fácil:

Vamos a crear cuatro divs, cada uno de ellos para un triángulo en una dirección. Este sería el marcado HTML:

<div id="triangulo"></div>
<br/>
<div id="trianguloinvertido"></div>
<br/>
<div id="trianguloizquierda"></div>
<br />
<div id="trianguloderecha"></div>

Y ahora veamos el CSS:

#trianguloizquierda{
	  width: 0;
	  height: 0;
	  border-top: 50px solid transparent;
	  border-bottom: 50px solid transparent;
	  border-right:50px solid black;
	}

#trianguloderecha {
	  width: 0;
	  height: 0;
	  border-top: 50px solid transparent;
	  border-bottom: 50px solid transparent;
	  border-left: 50px solid black;
	}

#triangulo {
	  width: 0;
	  height: 0;
	  border-left: 50px solid transparent;
	  border-right: 50px solid transparent;
	  border-bottom: 50px solid black;
	}

#trianguloinvertido {
	  width: 0;
	  height: 0;
	  border-left: 50px solid transparent;
	  border-right: 50px solid transparent;
	  border-top: 50px solid black;
	}

En este jsfiddle le puedes echar un ojo al resultado.

Con este simple truco de CSS podrás crear botones en forma de flecha o triángulo que darán una mejor imagen a tu proyecto,pudiendo jugar con los tamaños y los colores para adaptarlos mejor a tu maquetación.

Instalar AceStream en Linux

Acostumbro a ver el Seis Naciones en el bar, en Compostela tenemos la suerte de que A Novena Porta le de preferencia al rugby sobre el resto de deportes, pero justo este sábado estoy en casa de mis padres, y quería ver los dos partidos de la tarde. Y para ello necesitaba AceStream. En Windows su instalación es la clásica «todopalante«. En Ubuntu y derivados es posible usar este software para ver streamings p2p, pero requiere instalar desde línea de comandos.

#agregamos repositorios
echo 'deb http://repo.acestream.org/ubuntu/ trusty main' | sudo tee /etc/apt/sources.list.d/acestream.list

#y la clave pública
sudo wget -O - http://repo.acestream.org/keys/acestream.public.key | sudo apt-key add -

#actualizamos apt desde el repositorio
sudo apt-get update

#e instalamos el AceStream
sudo apt-get install acestream-full

En caso de que uses ElementaryOS puedes tener un problema y que te aparezca el mensaje Error «Cannot connect to engine. Check if engine installed.» En ese caso puedes probar dos comandos para arrancar el motor de AceStream manualmente:

#prueba esto
acestreamengine --client-gtk --gui-gtk
#y si tampoco va, con esto ya debería
acestreamengine --client-console

En Firefox el plugin debería arrancar automáticamente, en Chrome creo que lo tendrías que arrancar de forma manual.

Deshabilitar el teclado de un portátil en linux

Ayer el teclado del portátil me pegó un susto muy cabrón. No tengo claro qué le pasa (hoy ha dado un poco por culo también) pero de golpe hay teclas que se «pulsan» solas. Ayer pasaba con el CTRL y hoy con la flecha derecha. La parte buena es que tenía un teclado USB, y con cierto esfuerzo logré deshabilitar el teclado para funcionar sólo con el externo. Os explico como:

Empezamos abriendo una consola de comandos, y ahí ponemos

ximput --list

Esto sacará un listado de los dispositivos de entrada del equipo, tal que así:

consola xinput

Como puedes ver en este caso es el dispositivo número 11 (no siempre es el mismo, depende de si se han conectado más dispositivos externos, por ejemplo). Entonces bastaría con un comando para deshabilitar, y otro para rehabilitar:

#este desconecta
#cambia el 11 por el número de tu dispositivo
xinput set-int-prop 11 "Device Enabled" 8 0

#este reconecta
xinput set-int-prop 11 "Device Enabled" 8 1

Esta configuración se pierde al reiniciar, no es permanente. Podrías incluir el comando en el init.d para que se ejecute en la carga… pero si has insertado un teclado USB puede que el número no coincida.

Abrir el escritorio remoto de Windows como administrador desde línea de comandos

Esta mañana me topaba con un problemilla técnico al intentar conectar remotamente con un servidor: me decía que dicho servidor no podía servir más licencias de escritorio remoto. ¡Cáspita, qué contrariedad! (eso último ha sido muy Roberto Alcázar) ¿cómo lo solucionamos?

Si lanzamos una consola de comandos podemos utilizar el comando mstsc para abrir el servicio de escritorio remoto y pasarle determinadas opciones. La clave para lo que tenía que hacer era usar el parámetro /admin.

La sintaxis de mstsc es la siguiente: mstsc [<connection file>] [/v:<server[:port]>] [/admin] [/f[ullscreen]] [/w:<width>] [/h:<height>] [/public] | [/span] [/edit «connection file»] [/migrate] [/?]

En la web de Microsoft podéis mirar más información sobre todas las opciones comentadas arriba.

Vamos con un ejemplo práctico basado en el caso que os decía antes. Vamos a suponer que la dirección del servidor al que hay que conectarse sería la 192.168.100.7 ¿cómo lo haríamos con mstsc?

mstsc /v:192.168.100.7 /admin

De esta forma ya entraríais al servidor con credenciales de administrador, desbloqueando el problema del servicio de licencias.

Facebook e Instagram convierten imágenes a ASCII

Si te interesa el tema del ASCII-art, Facebook te ofrece un interesante huevo de Pascua: conversión directa de imágenes a ASCII (e Instagram también, por cierto). Eso comentaba en Twitter Mathias Bynens, que parece ser que es quien hizo pública esta funcionalidad. Lo he comprobado y parece que sí:

ASCII-ART 1
Antes de pasarlo a ASCII era un chiste cojonudo, en serio.

No tengo muy claro si esto es parte de alguna nueva funcionalidad con la que estén experimentando para Facebook e Instagram. También os puedo comentar que no funciona con todas las fotos en Facebook, sino sólo con las que estén compartidas como Públicas, con acceso para cualquier usuario. En Instagram, de momento, sí parece funcionar con todas.

El truco es simple: click derecho sobre la foto para obtener la URL, y tras eso añades, después del .jpg, o un .txt (para ascii puro) o un .html para verlo en color.

ascii html kansas

Configurar puerta de enlace en Windows por línea de comandos

Me acabo de encontrar con un problema en un equipo con Windows 7 Pro: cada vez que este se enciende o reinicia pierde la puerta de enlace y hay que configurársela. ¿Por qué? Ni idea, pero es un coñazo. ¿Solución? He probado con el comando route add a configurar la puerta de enlace y ha funcionado. ¿Cómo se hace? Muy sencillo, desde un terminal con el comando route add -p 0.0.0.0 mask 0.0.0.0 y la ip de la puerta de enlace:

#Ejemplo práctico
#Supongamos que la puerta de enlace
#es la ip 192.168.1.1
#que es una dirección típica

route add -p 0.0.0.0 mask 0.0.0.0 192.168.1.1

En la web de Microsoft hay más información sobre el uso de route add, aquí sólo os explicaré que para este caso le ponemos la ip 0.0.0.0 y la máscara 0.0.0.0 para especificar que todas las IP pasen por la puerta de enlace definida al final. El comando route add nos permitiría definir varias puertas de enlace para varios rangos de ip sirviéndonos de esos parámetros. Pero eso son temas que ya tocaremos en el futuro.

ECMAScript 6: Funciones flecha gruesa

Seguimos la serie de artículos dedicados a ECMAScript 6, en este caso con las funciones arrow, funciones flecha o funciones de flecha gruesa. Esta novedad consiste en una sintaxis abreviada para la expresión de función. Además vinculan el valor this contextualmente.

La cuestión de la sintaxist abreviada es simple si vemos un ejemplo:

var a = [
  "Peras",
  "Manzanas",
  "Naranjas",
  "Melones"
];

//Sintaxis de toda la vida
var a2 = a.map(function(t){ return t.length });

//Sintaxis con flecha
var a2 = a.map( s => s.length );

El tema del this contextual es algo más complejo. Seguramente recuerdes que la variable this daba a veces muchos dolores de cabeza ya que pertenecía sólo a un contexto, es decir, cada función definía su propio valor de this. Vamos con un ejemplo de como sería el código old-school:

function Miembro() {
   // Este this es una instancia del constructor Miembro()
   this.experiencia = 0;
   setInterval(function aprender() {
      // Y este this de debajo sería
      //una instancia de la función aprender(),
      //por tanto no podemos usarlo fuera de
      //la función de callback
      //y nos podría generar errores
      this.experiencia++;
   }, 5000);
} 

Teníais la opción de cachear el this dentro de una variable:

function Miembro() {
   var that = this;
   that.experiencia = 0;
   setInterval(function aprender() {
      // Y este this de debajo sería
      //una instancia de la función aprender(),
      //por tanto no podemos usarlo fuera de
      //la función de callback
      that.experiencia++;
   }, 5000);
} 

Otra opción era usar la función bind() para vincular dicha función a this.

Pero con la función de flecha gruesa la cosa es mucho más simple:

function Miembro(){
  this.experiencia = 0;
  //y aquí va la magiar!!!!
  setInterval(() => {
    this.aexperiencia++; //no es un this nuevo, sino que
                       //hace referencia al this de Miembro()
  }, 5000);
}

ECMAScript 6: valores por defecto en las funciones Javascript

Muchos lenguajes permiten definir un valor por defecto en la llamada a una función, pero hasta ahora Javascript no era uno de ellos. Esto cambia con ECMAScript 6, donde podremos hacerlo al igual que en PHP o Python. Os pongo un ejemplillo simple

function EjemploJS(variable="ejemplo"){...}

Esto implicaría que si no se le pasa la variable variable entonces por defecto se aplicará el valor definido en la declaración de la función. Es bastante cómodo porque nos evita hacer pirulas tipo usar un OR cuando la variable viene vacía, que es lo que haríamos en el pasado:

function EjemploJS(variable){
    variable = variable || "ejemplo"
/*lograría el mismo efecto
pero el código es menos limpio*/
}

Próximamente seguiremos con el tema de ECMAScript 6, al que ya dedicamos antaño otra entrada.

Las palabras reservadas let y const en javascript

No conocía la existencia de let, la descubrí ayer porque había usado una variable llamada let en un artículo de 2011 que hablaba sobre cómo validar un DNI con javascript, y me comentaron «let es una palabra reservada«. Mi cara fue como ¿ein? ¿desde cuando? Así que me puse a buscar… y sí, desde la irrupción de ECMAScript 6 en junio de 2015 tenemos una palabra reservada para definir variables que es let,  otra que es const para las constantes.

Sobre const no hay mucho que decir ya que el nombre es muy descriptivo: nos permite definir una constante. ¿Qué es una constante? Pues piensa en una variable pero que sólo puede recibir un valor en el momento de su declaración y que luego ya no puede ser modificada. Te pongo un ejemplo:

/*Declaramos PI como constante*/
const PI = 3.1415926;

/*Esto daría error*/
PI = 3.1416;
/*Porque no se puede volver a dar*/
/*valor a una constante*/

Vamos ahora con let, que tiene más chicha. Citando textualmente la documentación permite declarar variables limitando su alcance (scope) al bloque, declaración, o expresión donde se está usando. ¿Qué diferencia hay con var? Que var nos permite declarar una variable global o una variable local dentro de una función, pero no nos permite limitar su ámbito a un bloque de código concreto. Veamos un ejemplo:

/*Hagamos el ejemplo al viejo estilo*/
/*usando var*/
function PruebaVar() {
  var v = 45;
  if (true) {
    var v = 64;  // es la misma variable
    console.log(v);  // imprime 64
  }
  console.log(v);  // imprime 64
}
/*vemos como el v de dentro del bloque y el de fuera son
la misma variable. Si modificamos su valor dentro del bloque
fuera también está modificado */

/*vamos con let*/
function PruebaLet() {
  let l = 45;
  if (true) {
    let l = 64;  // diferente ámbito
    console.log(l);  // imprime 64
  }
  console.log(l);  // imprime 45
}
/*Con let en cambio la variable l de fuera del
bloque y la de dentro son tomadas como variables
diferentes, y cada una conserva el valor que
se le dio en su ámbito.*/

El uso de let y const sólo está disponible en bloques envueltos en una etiqueta <script type="application/javascript;version=1.7"> o en una versión superior.