Lunes 05 de diciembre de 2016

Gaspar Fernández

Gaspar Fernández
Poesía Binaria

Operador coma. Cómo incorporarlo a nuestro día a día con muchos ejemplos en C

photo-1477413114673-6708cad13418
Seguro que lo has visto cientos de veces por ahí, pasando desapercibido en multitud de programas hechos en C. Es más, incluso el primer día que empezaste a ver programación os visteis las caras y casi no te diste cuenta. Incluso puede que lo hayas utilizado sin siquiera ser consciente de lo que hace en realidad.

Otros muchos sí que sabréis de qué va este operador, y me gustaría que los que sí sabéis de qué va, sugirierais más ejemplos en los comentarios.

Para situarnos

Seguramente hayas utilizado la coma en varias situaciones como por ejemplo la creación de variables del mismo tipo:

1
2
3
4
5
int main ()
{
  int a=2, b=1, c, d, e=4;
  int f, g, h=f=g=2;
}

O en declaraciones y llamadas a funciones:

1
2
3
4
5
6
7
8
9
10
11
int funcion(int a, int b)
{
  ...
}

int main()
{
  int a=2, b=3;
  funcion(a, b);
  return 0;
}

Pero este símbolo tiene muchos más usos en C, C++ y otros lenguajes derivados (Java, Perl o Javascript, por ejemplo) en los que podemos utilizarlo como algo más que un simple separador y con el que podemos ahorrar muchas líneas de código.

Para probar estos programas

Si queréis probar todos los ejemplos que muestro en el post, no tenéis más que copiar y pegar en vuestro editor favorito y compilar con vuestro compilador preferido. Yo utilizo GCC (no hace falta ninguna biblioteca ni nada):

gcc -o compilado fuente.c

¿ Para qué vale el operador coma ?

Este operador se utiliza generalmente para evaluar varias expresiones dentro de la misma línea de código. Es, además, el operador con menor preferencia de todos. Esto último quiere decir que asignaciones, operaciones matemáticas, lógicas, direccionamiento, ternarios, etc; se ejecutarán antes que la coma y esto nos puede llevar a pensar que no funciona bien, pero tiene su lógica. Además, una vez que hemos ejecutado todas las expresiones que están separadas por coma de izquierda a derecha, devolveremos como resultado el valor de la última (la que más a la derecha estará).

1
2
3
4
int main()
{
   expresión1, expresión2, expresión3;
}

Como todos los elementos de un lenguaje, pueden ser utilizados con buenos o males fines. Por un lado, podemos hacer un código muy críptico con este operador, y hacer que el próximo que se siente a analizar nuestro código lo pase mal para entender qué estamos haciendo, y todo para ahorrar unas cuántas líneas de código. Aunque también puede utilizarse con buenos fines, y hacer que todo se entienda mucho mejor.

Como consejo para beneficiarnos en la legibilidad y el mantenimiento del código, debemos utilizar el operador coma para ejecutar expresiones que estén relacionadas, incluso que para ejecutar las expresiones de la derecha sea necesario que las de la izquierda se hayan ejecutado antes, ya que si vamos a ejecutar cosas que no tienen nada que ver, es mejor separarlas con punto y coma (;) y ponerlas en otra línea, por el bien de los que vayan a leer nuestro código en el futuro.

Aunque la mejor forma de conocer el funcionamiento es este operador es viendo ejemplos y jugando con ellos. Así que vamos a ver una buena selección de ejemplos para empezar a poner en práctica ya. He de decir que la coma siempre hace lo mismo, todos estos son diferentes escenarios donde podemos hacerlo, no estamos inventando nada en cada uno de los ejemplos.

La coma en asignaciones

1
2
3
4
5
6
7
8
9
#include <stdio.h>

int main()
{
  int a;
  a = 1, 2, 3, 4;
  printf ("a = %d\n", a);
  return 0;
}

Este código puede parecer (y de hecho lo es) una tontería y no sirve para nada. Pero nos ayuda a comprender la preferencia de los operadores. En realidad, si hacemos un programa y ponemos un 7;, éste compilará bien, aunque será cosa del compilador ignorar lo que hemos hecho, ya que no estamos haciendo nada con ese valor. En realidad, en este código estamos evaluando las expresiones:

  • a = 1
  • 2
  • 3
  • 4

Por lo que el resultado será:

a = 1

¿No dije yo antes que el valor devuelto era el de la derecha? Y, ¿el de la derecha no es el 4? Sí, pero si vemos las expresiones, la primera es a=1, por lo que se realiza dicha asignación. Sería distinto decir lo siguiente:

1
2
3
4
5
6
7
8
9
#include <stdio.h>

int main()
{
  int a;
  a = (1, 2, 3, 4);
  printf ("a = %d\n", a);
  return 0;
}

Esto sí que devolverá 4

Modificando los valores dentro de la igualación

Podemos intentar cosas como:

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main()
{
    int a=3, b=4;
    int c=(a*=a, b*=b, a+b);

    printf ("a=%d\nb=%d\nc=%d\n", a, b, c);
    return 0;
}

Es decir, aqui, hemos cogido a y la hemos multiplicado por sí misma, b también, y luego en c hemos metido a y b (que ahora son los cuadrados de los originales). Como resultado, hemos modificado las tres variables.

Intercambiando valores en una sola línea

Tenemos dos valores (a y b) y queremos que b sea a y a sea b. (Podemos ver algunas técnicas aquí). Aunque esto podemos resumirlo en una línea de esta manera:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main()
{
    int temp;
    int a=33, b=22;

    a=(temp=a,b),b=temp;

    printf ("a = %d\nb = %d\n", a, b);
}

Necesitaríamos una variable temporal, declarada (temp), pero lo demás sería ejecutar las expresiones:

  • temp = a
  • a=b
  • b=temp

En un orden determinado y con una preferencia determinada.

Un ejemplo para explotarnos la cabeza

Veamos ahora:

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main()
{
    int a=1;
    int b=(a++, a++, a++);

    printf ("a=%d\nb=%d\n", a, b);
    return 0;
}

¿Cuánto debe valer a y b? La lógica nos diría que a y b valen lo mismo, 4. Pero no es así. A termina valiendo 4, es cierto, porque inicialmente vale 1 y lo incrementamos 3 veces (1 + 1 + 1 + 1 = 4), bien. Pero ¿b? En realidad, las expresiones se evalúan todas, pero a++ en realidad es un post-incremento, esto es, que primero devolverá el valor y luego incrementará, por lo que antes del tercer incremento a vale 4 y es lo que llega a b. Después de esto se incrementará.

Operación pop_first() en listas enlazadas

Una de las posibles operaciones es la extracción del primer elemento de la lista. Es decir, devolvemos el valor del primer elemento y lo quitamos al mismo tiempo de la lista. Imaginemos que nuestra lista está formada por (TNodo)s y éstos tienen un TDato (que podrá ser un entero, una cadena, un struct, etc):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct TNodo
{
  TDato dato;
  struct TNodo* sig;
}

TDato pop_first(TLista** lista)
{
  TDato dato;
  TLista _lista = *lista;
  TNodo sig = _lista->sig;

// Aquí a dato le asignamos el dato que hay actualmente en la lista, luego liberamos la lista y apuntamos lista al siguiente nodo.
  dato = _lista->dato, free(*lista), *lista=sig;
  return dato;
}

Cálculo de salarios

Imaginémonos que vamos a calcular el salario de un empleado. Éste es el salario base + 0.1 * años de antigüedad * salario base + bonificación. Eso sí, cada una de las variables (salario base, antigüedad y bonificación debe obtenerse con llamadas a varias funciones), podríamos hacer lo siguiente:

1
2
3
4
5
6
int main()
{
  double base, bonificacion;
  unsigned years;
  double salario = (base = get_salario_base(), years=get_antiguedad(), bonificacion = get_bonificacion(), base + base*years*0.1 + bonificacion);
}

Otro ejemplo curioso más

#include

int main()
{
int i, j;

j = 10;
i = (j++, j+100, 999+j);

printf (“i=%d\nj=%d\n”, i, j);
return 0;
}
¿ Y el resultado ?

i=1010
j=11

Esto es así porque el j++ se ejecuta (por lo que j vale 11 ya. La segunta expresión j+100 no hace nada, se ejecuta, pero no se guarda en ningún lado (seguramente un compilador listo la ignore), la última expresión 999+j será la que de verdad se guarde en i, por tanto i=999+11 = 1010.

Resolviendo una ecuación de segundo grado

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <math.h>

int main()
{
  double a = 1;
  double b = -5;
  double c = 6;
  ddouble sq, x1, x2;

  x1 = (sq = sqrt(b*b-4*a*c), a=a*2, (-b+sq)/a);
  x2 = (-b-sq)/a;

  printf ("x1 = %lf\n", x1);
  printf ("x2 = %lf\n", x2);
  return 0;
}

En este código vemos cómo para calcular la primera solución, evaluamos varias expresiones seguidas:

  • sq = sqrt(b*b-4*a*c)
  • a=a*2
  • (-b+sq)/a

Y a la variable x1 le asignamos este último valor. En este caso, vemos que las tres expresiones deben ejecutarse en este orden ya que hay dependencias de unas sobre otras. Si cambiamos el orden puede ser fatal y no se ejecutará bien nuestro código.
Para compilar esto, se debe incluir la biblioteca matemática (en gcc es utilizando -lm).

Inicializando estructuras

Este ejemplo está pensado como algo más complejo. Imaginemos que hemos creado una lista enlazada, o una lectura desde archivo (primero tenemos que abrir el archivo antes de leer). Es decir, antes de poder obtener el valor, tenemos que llamar a una función:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>

int estructura = 20;

void inicializa(int **a)
{
    /* Aquí iría un malloc(), metemos datos en la estructura, etc */
    *a = &estructura;
}

int main()
{
    int *a = NULL;

    int valor = (inicializa(&a), *a);

    printf ("valor = %d\n", valor);
  return 0;
}

Es más, fijaos que inicializa() es de tipo void y no devuelve ningún valor. El compilador podía quejarse al querer dar ese valor a una variable de tipo entero, pero como en realidad el valor que se le da es el de *a, no hay ningún problema.

O con ficheros:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main()
{
    FILE *f;
    int valor;
    int ok = (f = fopen("valor.txt", "r"), fscanf(f, "%d", &valor), fclose(f));
   
    printf ("valor = %d\n", valor);
  return 0;
}

Hay que tener en cuenta que esto son sólo ejemplos, en la práctica puede que todo no sea tan fantástico y debamos hacer comprobaciones de error. Por ejemplo, en el ejemplo anterior (de ficheros), sería más conveniente utilizar && en lugar de , así cuando falla la expresión de más a la izquierda, no se ejecutan las siguientes.

Comas dentro de un bucle for

Muchos de los que empiezan a programar en C, separan las expresiones del bucle for con comas, cuando en realidad es con punto y coma. Es decir:

1
2
3
4
for (inicialización ; finalización ; seguimiento)
{
  ...
}

Pero utilizar comas aquí tiene utilidades bien distintas, por ejemplo cuando intervienen varias variables en el bucle, cuando debemos inicializar dos variables, en lugar de inicializar una variable y luego hacer el for, podemos hacer:

1
2
3
4
5
  int i, j;
  for (i=0, j=0 ; i< 10; ++i)
  {
     ...
  }

Para complicar esto, podemos contar 20 con dos variables, una desde 0 a 19 y otra desde 19 hasta 0:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main()
{
    int i, j, total=20;

    for (j=total-1, i=0; i<total; ++i, --j)
        printf ("i = %d - j = %d\n", i, j);

  return 0;
}

Comas dentro de un bucle while

Vamos, con otro pequeño ejemplo. Un típico ejercicio de adivinar un número:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    srand(time(NULL));
    int numero=1+rand()%10;
    int input=0;

    while (input!=numero)
        {
            printf ("Introduce un número: ");
            scanf("%d", &input);
        }

    printf("Has acertado!\n");
  return 0;
}

Que podemos escribir de la siguiente forma:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
  int numero=(srand(time(NULL)), rand()%10), input=0;

  while (printf ("Introduce un número: "), scanf("%d", &input), input!=numero);

  printf("Has acertado!\n");
  return 0;
}

En este caso, dentro del while, hemos incluido varias expresiones:

  • printf (“Introduce un número: “)
  • scanf(“%d”, &input)
  • input!=numero

Siendo la última de éstas la que en realidad sirve como condición del while.

Leyendo un archivo (Unix)

Una lectura de fichero utilizando la biblioteca (unistd), podemos escribirla así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
    int f;
    char c;
    int ok;
    f = open("coma.c", O_RDONLY);
    while ((ok = read(f, &c, 1))>0)
        printf ("%c", c);
   
  return 0;
}

Aunque podemos escribirla también así, utilizando el operador coma:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
    int f;
    char c;
    int ok;
    f = open("coma.c", O_RDONLY);
    while (ok = read(f, &c, 1), ok>0)
        printf ("%c", c);
   
  return 0;
}

Pero, por ejemplo, si queremos que el bucle pare cuando encontremos un carácter punto y coma ‘;’, podemos hacer esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
    int f;
    char c;
    int ok;
    f = open("coma.c", O_RDONLY);
    while (ok = read(f, &c, 1), ok>0 && c!=';')
        printf ("%c", c);
   
  return 0;
}

Comas en condicionales

En este caso, estaremos evaluando alguna expresión o ejecutando una función por ejemplo, antes de preguntar por la condición. Por ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#include <stdlib.h>

int pregunta_edad()
{
    int res = 0;

    while (printf ("¿Cuántos años tienes? "),
                 scanf("%d", &res),
                 res<1)
        {
            if (res<1)
                printf ("No me mientas!!\n");
        }
   
    return res;
}

int main()
{
    int edad;

    if (edad=pregunta_edad(), edad<18)
        printf ("Espera %d años antes de volver\n", 18-edad);
    else if (edad==18)
        printf ("Perfecto, tienes 18\n");
    else
        printf ("Sabes que podias haber entrado hace %d años?\n", edad-18);
  return 0;
}

Aunque es verdad que el condicional también podía haberse expresado como:

1
  if ((edad=pregunta_edad())<18)

evitando así repetir la variable. Aunque con la coma podríamos incluir más expresiones para ejecutar, incluyendo operaciones y varias asignaciones:

1
  if (precio = calcula_coste_pedido(&pedido), financiacion = calcula_financiacion(precio, usuario), financiacion.ok)

En este ejemplo, podemos ver cómo evaluar si el usuario de una tienda online puede optar por financiación de su pedido. Para ello, utilizamos la función calcula_coste_pedido, a la que le pasamos un struct (por ejemplo) con información del pedido y calcula su precio total. Luego la variable financiacion (que es otro struct) se rellenará con datos gracias a calcula_financiacion() a la que le pasamos el precio y el usuario (nuestra tienda ofrece condiciones especiales a ciertos usuarios) y luego devolvemos financiacion.ok (un campo de nuestro struct).

Dentro de un return

Utilizar este operador dentro de un return es de los usos más comunes, y es que muchas veces, antes de salir de una función debemos realizar pequeñas tareas, llamar a otras funciones, liberar memoria y cosas del estilo.
En este ejemplo, vamos a utilizar strtok(), una función conocida por arruinar las cadenas originales que le pasamos, es decir, cuando utilizamos strtok() la cadena original se modifica. Por tanto, si queremos que ésta no cambie, debemos hacer una copia y aplicar strtok() a la cadena copiada, luego podremos hacer lo que queramos con ella:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

int cuenta_palabras(char* cadena)
{
   const char s[2] = " ";
   char *token;
     char *copia=(char*)malloc(strlen(cadena)+1);
     strcpy(copia, cadena);
     
     int tokens=0;
   token = strtok(copia, s);
   
   while( token != NULL )
   {
         tokens++;    
         token = strtok(NULL, s);
   }
     
     return free(copia), tokens;
}

int main()
{
   char str[] = "Poesía Binaria. http://totaki.com/poesiabinaria Aprendiendo a utilizar el operador coma.";
     printf ("Cuenta palabras: %d\n", cuenta_palabras(str));

     printf ("Str: %s\n", str);
   return 0;
}

Como vemos, en el mismo return de la función cuenta_palabras(), hacemos free(copia) para liberar memoria de la cadena copiada y luego devolvemos tokens. Podíamos hacerlo en dos líneas, pero lo hacemos en una. Es más free() es void.

Para evitar tener que abrir bloques

Esto es más pereza que otra cosa. Mientras en varios manuales de estilo (depende de las aplicaciones o del grupo que vaya a programar) se recomienda abrir y cerrar llaves siempre que estemos ante un bloque aunque sólo sea de una línea (cosa que en C es opcional), otros prefieren no usar llaves si no es necesario para así evitar que el número de líneas crezca.
Aunque hay veces que vamos a realizar acciones comunes, y podemos pensar que son un poco tontas, como por ejemplo mostrar un mensaje de error en pantalla y devolver un código (de error):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>

int analiza_datos(int a, int b)
{
    if (a==b)
        return printf("Son iguales\n"), 0;
    else if (a<b)
        return printf("a<b\n"), 1;
    else
        return printf ("a>b\n"), 2;
}

int main()
{
    printf ("=%d\n", analiza_datos(1, 2));
    printf ("=%d\n", analiza_datos(2, 2));
    printf ("=%d\n",analiza_datos(2, 1));
    return 0;
}

Si miramos la función analiza_datos(), vemos que en lugar de abrir llaves y poner un printf() y return x lo ponemos todo en la misma línea.

Llamadas a funciones

Bueno, llegamos a un punto peliagudo, porque tal vez tomemos las cosas muy a la ligera en ocasiones. Tenemos que tener especial cuidado en este punto, cuando toque pasar valores a funciones y queramos meter el operador coma para modificar ciertos valores. Lo que está claro es que cuando vayamos a utilizar el operador, debemos poner las expresiones entre paréntesis , porque de otro modo la coma actuará como separador. Por ejemplo si tengo esta función:

1
2
3
4
int funcion(int a, int b)
{
    printf ("a = %d\nb = %d\n", a, b);
}

No puedo hacer lo siguiente cuando vaya a llamarla:

1
funcion(a, b+=3, b);

Porque estaré diciendo que hay tres argumentos, y la función sólo admite dos.

Lo que sí podemos hacer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int funcion(int a, int b)
{
    printf ("a = %d\nb = %d\n", a, b);
}

int main()
{
    int a=3;
    int b=2;
    funcion (a, (b+=a, b));
    printf ("a en main = %d\n", a);
    printf ("b en main = %d\n", b);
}

En este caso:

a = 3
b = 5
a en main = 3
b en main = 5

Si hemos estado atentos no habrá sido muy difícil intuir el resultado.

Cuidado con este caso!!

Aunque, ¿qué pasaría si utilizo a en todos los valores?

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int funcion(int a, int b)
{
    printf ("a = %d\nb = %d\n", a, b);
}

int main()
{
    int a=3;

    funcion (a, (a+=3, a));
    printf ("a en main = %d\n", a);
}

Podemos pensar que se llamará a la función con los valores 3 y 6, pero depende del compilador, porque los dos argumentos, al fin y al cabo son a. Si el compilador, a medida que va haciendo las operaciones va recopilando los argumentos, sí sucederá así, se llamará a la función con 3 y 6. Pero si por el contrario primero se hacen las operaciones, y luego se van enviando los resultados como los diferentes argumentos, terminaremos enviando dos 6, ya que primero se hace el a+=3 y luego se llama a mi_funcion(a, a). Es cierto que la coma tiene la menor preferencia posible, pero cuando encontramos la coma (separadora de argumentos) normalmente estaremos hablando de cosas distintas, por lo que contarían como instrucciones aparte y en cierto modo se reinician las preferencias.

¿Se te ocurren más ejemplos?

Si tienes más ejemplos, o alguna cuestión relacionada, ¡no dudes en poner un comentario!

Foto: Providence Doucet

The post Operador coma. Cómo incorporarlo a nuestro día a día con muchos ejemplos en C appeared first on Poesía Binaria.

Baltasar Ortega

Baltasar Ortega
KDE Blog

Nace Colaboratorio, el nuevo blog colaborativo GNU/Linux

Hoy me complace hacer una entrada sobre un nuevo proyecto colaborativo vinculado al Software Libre pero que no ha nacido dentro de la Comunidad KDE. De la mano de nueve personas comprometidas con el Software libre nace Colaboratorio, el nuevo blog colaborativo GNU/Linux que viene para quedarse en la blogosfera. Es el momento de recibirlo con un fuerte aplauso y de ponerlo en nuestros favoritos.

Nace Colaboratorio, el nuevo blog colaborativo GNU/Linux

Hace algún tiempo leí en un par de artículos en el magnífico blog La Sombra del Helicóptero, que su creador Enrique Bravo quería iniciar el proyecto de crear un blog sobre GNU/Linux colaborativo. Me pareció una gran idea y para mis adentros le deseé toda la suerte del mundo aunque tuve mis dudas ya que esto que parece tan sencillo en realidad no lo es.

No es solo cuestión de convencer a diversos autores a escribir en un solo sitio sino que se necesita algo que en muchas ocasiones no se tiene: tiempo compartido para coordinarse.

Por ello me complace conocer que ha tenido éxito en su iniciativa y que el pasado 1 de diciembre fue anunciado el nacimiento del proyecto Colaboratorio que inicia su andadura con 9 colaboradores y una pequeña avalancha de artículos variados.

Tras leer la entrada de Enrique Bravo en su blog, me dispuse a ver el nuevo blog, dirigiéndome a la Editorial donde se recoge el espíritu del proyecto:

colaboratorio“Colaboratorio es un proyecto colectivo. En él participamos nueve personas hasta el momento, alguna de las cuales seguramente ya conoces. Decimos hasta el momento porque no tenemos inconveniente en que esa cuenta siga subiendo.

El nombre parece hecho a medida aunque llegó a nosotros de forma fortuita; digamos que fue encontrado sin buscarlo. Queríamos que el proyecto contara con colaboración entre personas diversas y experimentación, hacer cosas diferentes a lo visto hasta ahora, lo que le confería un poco la cualidad de laboratorio. Así que el significado de “colaboratorio” nos viene como un guante.

Queremos empezar realizando un despliegue básico e ir creciendo a medida que controlemos lo que ofrecemos. Tenemos algunas sorpresas en hibernación, pero preferimos sacarlas cuando nuestro bloque principal, el blog, esté perfectamente elaborado y con un funcionamiento de reloj.”

Como no podía ser de otra forma, Colaboratorio ya ha publicado un buen número de artículos, la mayoría de presentación que vale la pena leer para conocer a las personas que hay detrás del proyecto.En resumen, nuevo blog sobre GNU/Linux que destaca por ser un proyecto colaborativo potenciado por un veterano del medio y que ya debería estar en vuestra lista de favoritos o en vuestro lector de RSS.

¡Larga vida a Colaboratorio!

Asociación LiGNUx: Podcast Linux: GNU/Linux para tus oídos

Domingo 04 de diciembre de 2016

Liher Sanchez

Liher Sanchez
El blog de Liher

¿Que es la caché del navegador? ¿La debes borrar?

Llevo un tiempo haciendo webs y el otro día estaba haciendo una con mi pareja a mi lado. Me surgió un problemilla y me puse a hablar con ella sobre el tema de la caché del navegador explicándole cómo, en algunas ocasiones, me había jugado alguna mala pasada, y lo que hacía ahora para que no me volviese a pasar. Me surgió la idea de escribir un artículo en el cual explicaría este tema y aquí está, os voy a hablar de lo que es la caché del navegador y si la debes borrar o no, o mas bien de los pros y las contras de borrarlo.

Antes de nada quiero daros todos los datos necesarios para que podáis tomar la decisión de borrar o no la caché de vuestro navegador por vosotros mismos.

Lo primero que deberíais saber es que es la caché del navegador web. Cuando estamos navegado por Internet y visitando páginas web se está descargando información a nuestro ordenador. Para aquellos que no tengáis conocimientos de diseño web os lo explico más en detalle.

Cuando entras en una web ves unas serie de cosas, entre ellas están los textos, imágenes, botones, formularios y un sinfín de cosas que podemos encontrarnos. Todo eso se organiza mediante dos lenguajes de marcado, el HTML y el CSS. Entonces, cuando accedemos a una web se descargan los archivos HTML y CSS, en ellos hay texto, etiquetas y propiedades. Hoy en día el archivo HTML define la estructura de la web y el CSS las disposición de los elementos como el texto y las imágenes. El CSS también define tamaños de texto o imágenes, colores y se pueden hacer algunos efectos con CSS.

Además de los archivos HMTL y CSS, se descargan las imágenes. Una web también puede contener archivos PHP, Javascript y mas. Estos ya son archivos en los cuales hay ordenes en esos lenguajes de programación. No quiero liar mas la madeja, pero el HTML, CSS, PHP y Javascript pueden estar mezclados entre si.

De todas formas, la idea con la que os tenéis que quedar es que cuando entramos a una web se descargan a nuestro ordenador esos archivos y las imágenes. Ahora bien, ¿que pasa si todos los días accedemos a una misma web? Os pongo un ejemplo. Supongamos que entras todos los días a este blog para ver si hay algún articulo nuevo, no tiene sentido que todos los días tu ordenador descargue toda la web, ya que hay partes que no varían, por ejemplo, el logo de parte superior izquierda de la página principal. Siempre es igual, por lo que seria mas rápido que el archivo de imagen que contiene ese logo estuviese en tu ordenador, de esa forma cuando accedas a la pagina principal el logo no se descargaría de mi web si no que se mostraría el que tienes en tu ordenador. Si esto lo trasladamos a toda la web y a todas las webs que visitas habitualmente, son muchos megabytes.

Para evitar ese trafico innecesario, los navegadores web guardan los archivos que no varían en un directorio y eso es lo que denominamos caché del navegador.

Ya hemos visto la ventaja que supone que nuestro navegador tenga caché. El caché de navegador supone un problema muy claro, y es que ocupa espacio en nuestro disco duro, pero esto es un problema relativo. Por ejemplo, en mi portátil tengo un disco SSD principal de 250 GB, en ese disco solo tengo Ubuntu 16.04 instalado con sus programas y archivos. Ahora mismo tengo ocupados 45 GB de esos 250 y el caché del navegador Chrome, que es el que uso siempre ocupa unos 600MB. Bien es cierto que hace unas 3 semanas que formateé el ordenador por completo y el caché no ocupa mucho, pero teniendo en cuenta que tengo unas 205GB libres en mis disco duro, esos 600 MB o 0,6 GB suponen muy poco problema. Con el tiempo el cachè va creciendo pero con las capacidades de los discos duros hoy en día no va a suponer un problema serio.

Si quieres saber el tamaño del caché de tu navegador es muy fácil, en mi caso uso Ubuntu Tweak, tiene un apartado en el cual puedes limpiar tu ordenador. Os lo muestro en la siguiente imagen:

 

cache navegador ubuntu

 

Como podéis ver el tamaño del caché del navegador ocupa casi 600MB. Al ver su tamaño, si se el espacio libre que tengo en mi disco duro, puedo decidir si es un problema y si lo necesito borrar para recuperar ese espacio. En mi caso sería absurdo borrar el caché del navegador y recuperar 0,6 GB teniendo mas de 200Gb libres en el disco duro, y mas teniendo en cuenta que tener esos archivos en la caché del navegador hacen que al navegar por Internet vaya mas rápido.

La caché presenta un problema para diseñar webs y es que cuando estás haciendo una, y haces modificaciones puede que al intentar ver el resultado al momento, se muestre lo que tienes en caché y no se aprecien los cambios. Para ello es necesario limpiar la caché del navegador habitualmente, incluso varias veces en el mismo día, para ver los cambios que haces. Por eso yo uso el Firefox para ver la web que estoy haciendo, y el Chrome para hacer los cambios, según lo que este haciendo.

Un saludo a todos.

Baltasar Ortega

Baltasar Ortega
KDE Blog

Tiled Menu, otro lanzador de aplicaciones – Plasmoides de KDE (68)

Aunque Plasma 5 está  bien dotado en cuanto a lanzadores de aplicaciones nunca está de más tener alternativas para personalizar nuestro entorno de trabajo. Por ello os presento Tiled Menu, un lanzador de aplicaciones a lo Windows para Plasma que puede adaptarse a los gustos de ciertos usuarios.

Tiled Menu, una lanzador de aplicaciones a lo Windows para Plasma

Las posibilidades de personalización de Plasma 5 en cuanto a lanzadores de aplicaciones son variadas: el lanzador tradicional, una versión reducida y el lanzador de aplicaciones a pantalla completa.

No obstante, ZREN pensó que todavía le faltaba otro inspirado en Windows. De esta forma ha creado Tiled Menu, un lanzador de aplicaciones que muestra en una columna todas las aplicaciones que tengamos instaladas en nuestro ordenador, primero las más ejecutadas y después ordenadas alfabéticasmente. También nos muestra otra columna donde se encuentran nuestras aplicaciones favoritas utilizando iconos bastante más grandes.

Tiled Menu,

Personalmente, he probado el lanzador Tiled Menu en mi KDE Neon y no me acaba de gustar, pero creo que está muy bien tener alternativas y, además, también creo que el proyecto es muy joven y que con el debido feedback podría convertirse en la cuarta opción de lanzador de aplicaciones que viniese en futuros Plasma.

Y si os gusta, lo que digo siempre: recompensad a los creadores con “me gusta”, “likes” o “+” y no olvidéis compartir.

Más información: KDE Store

 

¿Qué son los plasmoides?

Para los no iniciados en el blog, quizás la palabra plasmoide le suene un poco rara pero no es mas que el nombre que reciben los widgets para el escritorio Plasma de KDE.

En otras palabras, los plasmoides no son más que pequeñas aplicaciones que puestas sobre el escritorio o sobre una de las barras de tareas del mismo aumentan las funcionalidades del mismo o simplemente lo decoran.

Asociación LiGNUx: Hacer screen-cast en GNU/Linux

Sábado 03 de diciembre de 2016

Asociación LiGNUx: Tutorial para instalar la versión de mantenimiento del kernel Linux 4.8.12
Baltasar Ortega

Baltasar Ortega
KDE Blog

Lanzado Marble Maps 1.0 beta para Android

La invasión de las aplicaciones KDE en el mundo de los teléfonos inteligentes se inició hace unos meses . De esta forma, poco a poco tenemos más programas de KDE Comminity en su repositorio de aplicaciones de Google Play. Así que me complace compartir con todos vosotros que ha sido lanzado Marble Maps 1.0 beta para Android para que tengamos una alternativa de calidad a Google Maps.

Lanzado Marble Maps 1.0 beta para Android

Lanzado Marble Maps 1.0 beta

La ciudad de Kkarlsruhe según Marble Maps.

El pasado 27 de noviembre, en el blog de  Dennis Nienhüser, fue anunciado oficialmente el lanzamiento de Marble Maps 1.0 beta y ya está disponible en Google Play para descargarse e instalarse en vuestro teléfono Android.

Los propios desarrolladores aprovechan la ocasión para agradecer el trabajo a todo el mundo que ha hecho posible este lanzamiento, el cual nos presenta un mapeado completo para Alemania, para una buena parte de los otros países europeos y EEUU, y para más de 200 ciudades alrededor del mundo.

De momento, con Marble Maps podrás:

  • Visualización de localizaciones geográficas gracias a OpenStreetMaps
  • Búsqueda de ciudades, calles y POI (Puntos de interés)
  • Navegación GPS guiada con voz

Y, con toda probabilidad, pronto se añadirán nuevas funcionalidades.

Por cierto, por si no queréis utilizar los servicios de Google Play también os podéis descargar la aplicación directamente en APK. Y si, ya se está pidiendo que esté en F-Droid.

Las otras aplicaciones KDE para Smartphones

Como comentaba en la introducción, Marble Maps no es la primera aplicación KDE que desembarca en Android. La Comunidad KDE tiene su propia sección en Google Play en la puedes encontrar joyas como:

  • KDE Connect, para conectar tu móvil con tu Plasma.
  • KStars Lite, para tener tu observatorio planetario de bolsillo.
  • Minuet, para aprender música.
  • KAlgebra, tu calculadora hipervitaminada.
  • Behaim Globe, un globo terràqueo histórico.
  • Kirigami Gallery, el creador de aplicaciones para Android.

 

Viernes 02 de diciembre de 2016

Miguel Parada

Miguel Parada
Ubuntizando.com

Mi propia tienda online con WooCommerce

“Hoy me monto una tienda online.” Así comienza todo. Con la actual crisis económica muchas personas son empujadas a emprender poniendo todo su empeño y voluntad en sacar adelante sus proyectos pero vender no es fácil y estar disponible 24 horas puede ser agotador salvo que abras una tienda online, que es la opción más popular para tener presencia y seguir vendiendo incluso mientras duermes.

En el mercado existen multitud de alternativas. Seguro que os suenan nombres como PrestaShop o Magento. Opciones muy completas pero que pueden hacerse un poco grandes para pequeños proyectos además de la barrera que representa su configuración y puesta en marcha por una persona con bajos conocimientos técnicos.

 

screenshot-6

Si conoces WordPress también existen alternativas para poder crear tu propia tienda en línea. La más conocida es WooCommerce y quizá la más sencilla de usar. Además se puede personalizar tanto como queramos y su ritmo de actualización es muy rápido por lo que no tendrás problemas en adaptar tu tienda a la normativa vigente o añadir funcionalidades que los clientes demandan.

WordPress es también una plataforma que particularmente me gusta y es muy fácil encontrar temas gratuitos o de pago compatibles con WooCommerce facilitando la integración como quien calza un guante.

La instalación de WooCommerce se realiza como un plugin más con dos clics y sin saber nada de programación, en el escritorio de WordPress realizamos todas las operaciones, y su configuración nos puede llevar tan solo unos minutos gracias a su asistente. Además si ya tienes un blog funcionando es la mejor forma de integrar todo y no complicarnos usando plataformas separadas y si tienes alguna duda, todas las herramientas de SEO también sirven para tu tienda online. Si has manejado WordPress la primera sensación que tienes con WooCommerce es la de sentirse como en casa y si estás cómodo para qué cambiar. 🙂

Además WooCommerce es libre y gratuito, más de 10 millones de descargas lo posicionan como el sistema de comercio electrónico más utilizado, muy por delante de Magento. Cuenta con una API REST para que aquellos que lo prefieran puedan crear otras aplicaciones usando WooCommerce como base. Y ya por último, usando el plugin WPML podemos internacionalizar nuestra tienda al completo, incluyendo tantos idiomas como necesitemos (Klingon incluido).

Mi propia tienda online con WooCommerce

Dicho esto nos ponemos manos en la masa. ¿Qué necesitamos para pasar a la acción? Lo primero que necesitamos tener es un sitio WordPress funcionando alojado en un servicio de hosting propio. La versión de WordPress.com no sirve que que no ofrece esa opción. En otras palabras. Podemos optar por contratar un alojamiento Web, descargar e instalar la última versión de WordPress desde “wordpress.org” o utilizar los servicios de instalación automatizada de nuestro proveedor.

En las instalaciones que hago suelo recomendar el hosting de Siteground, porque además de ofrecer en todos sus planes un año de dominio gratuito y su canal de atención en castellano 24×7 cuenta con un asistente que permite instalar tu WordPress a golpe de clic y tener todo listo en menos de 5 minutos. Otra de las razones es que ofrecen un hosting de alto rendimiento gracias a sus discos SSD y su servicio SuperCacher para acelerar la carga de tu web. Esto es un detalle importante, algunas personas que conozco optaron en su momento por hostings “económicos” pero incapaces de mover su sitio web. A nadie nos gusta esperar y que una tienda cargue lento solo ayuda a que busquemos en otro lugar a la primera oportunidad. En ese sentido SiteGround ofrece un excelente ratio velocidad precio. Pero para mi lo más importante, además, es que ofrece un wildcard SSL gratuito al contratar el plan GrowBig o GoGeek. En otras palabras, tenemos nuestro certificado SSL desde el minuto uno, gratis y listo para ofrecer la máxima confianza a nuestros clientes durante el proceso de compra.

woo4

La instalación de WooCommerce en nuestro WordPress es muy sencilla. Solo tenemos que acceder como administradores a nuestro sitio y en el apartado de “Plugins” seleccionar “Añadir nuevo” y buscar WooCommerce para realizar su instalación. Luego su asistente nos pedirá instalar las “WooCommerce Pages” que son una serie de páginas predefinidas para poder trabajar con WooCommerce y tras esto continuar con su configuración.

woo3

Eso me recuerda que el hosting WooCommerce de SiteGround es una buena solución para evitarnos este paso. Sus diferentes planes, en función del tamaño, demanda y tráfico estimado de la tienda que planeas crear, incluyen un asistente que permite la instalación y configuración en un solo paso. Es decir, cuando entremos en nuestro hosting veremos nuestra tienda online a pleno rendimiento y a pocos pasos de configuración para dejarlo todo personalizado como queremos.

En nuestro escritorio encontraremos en el menú de la derecha el apartado de Ajustes de WooCommerce. En General podemos cambiar nuestras opciones generales (Ubicación principal, lugares de venta, notificaciones, moneda, etc). En general la forma con la que trabajaremos con WooCommerce es muy similar a lo que ya conocemos de WordPress, por lo que todo será familiar.

screenshot-1

Cuando terminemos de configurar nuestras preferencias pasamos al siguiente paso. Vamos a añadir nuestro primer producto. Igual que en una entrada de nuestro blog al seleccionar “Productos” y luego “Añadir producto”, en el título de la entrada añadimos el nombre del producto, en su cuerpo la descripción, imágenes e imágen destacada y en la zona inferior para campos personalizados añadimos la información propia del producto como su precio. Y ya terminamos creando y seleccionando su categoría y etiquetas relacionadas para que nuestros visitantes puedan encontrar el producto con más facilidad. Guardamos y repetimos para cuantos productos necesitemos.

Si hemos terminado ya solo queda entrar en nuestra web como un usuario más y disfrutar del trabajo hecho y nuestra tienda online.

screenshot-5

¿Tenemos nuestro primer pedido? WooCommerce nos lo notificará o podemos gestionar nuestros pedidos en la sección de “Pedidos” y enviar nuestro producto a su destino. Y ya sabes lo que dicen “Cliente contento, vuelve dos veces”.

La entrada Mi propia tienda online con WooCommerce aparece primero en Ubuntizando.com.

Jueves 01 de diciembre de 2016

Las fuentes tipográficas Accanthis

Este artículo es parte de la serie Recomendando fuentes tipográficas ARKANDIS Digital Foundry (ADF) ofrece varias tipografías con licencia libre (generalmente, GPL 2 con cláusula de excepción para fuentes) con diseños muy interesantes. El proyecto no se actualiza mucho, pero parece estar (más o menos) vivo, por lo que hoy presento una de sus fuentes […]
Luis Vilchez

Luis Vilchez
El blog de Jabba

Pillars of Eternity, el heredero espiritual de Baldur's Gate para OSX y Linux

Hablar de Baldur’s Gate es hablar del gran clásico entre los clásicos de los juegos de rol computerizado. Su legado y su influencia están muy presentes en gran cantidad de los títulos que conforman el panorama del videojuego actual. Un juego con una profundidad, libertad y capacidad de personalización nunca vistas hasta entonces. Un juego que muchos tenemos como uno de los mejores -sino el mejor- RPG de la historia.


Quince años después Pillars of Eternity pretende devolvernos la magia, la ambientación, la jugabilidad y esa aura cautivadora y mítica propia de los grandes clásicos del género; un deleite para los sentidos de los veteranos en los juegos de rol y una experiencia inigualable para los recién llegados. Me han bastado unas semanas perdiéndome virtualmente por el mundo de Eora para confirmar que Pillars of Eternity es la oportunidad de volver a revivir un JUEGAZO infinity engine de corte clásico como los de antaño. Un juego que rezuma a Baldur's Gate del bueno por los cuatro costados. ¿Y sabéis lo mejor? Con versiones nativas para OSX y... ¡Linux!

Es de recibo decir que gran parte de la culpa de todo esto la tienen los fans y el modelo kickstarter que sus creadores usaron para financiar el proyecto (por aquel entonces bajo el nombre de Project Eternity). El resultado ha sido un RPG de corte occidental distribuido por Paradox Interactive y desarrollado por Obsidian Entertainment, creadores de sagas como Fallout, IceWind Dale o Neverwinter Nights, además del citado Baldur’s Gate.

Como en Baldur's Gate, la primera cosa que hay que hacer en Pillars of Eternity es crear un personaje. Aspectos como las diferentes ventajas e inconvenientes de cada raza, los atributos, las clases, las limitaciones de atributo por clase, las alineaciones morales, las habilidades complementarias, afinidad de armas, selección de conjuros, clases duales... habrá que tenerlos muy en cuenta antes incluso de comenzar la "aventura". Y seguramente no es el sistema de creación de personajes más amplio de la historia del género, pero sí es MUY completo. Incluso me atrevo a decir que podrá parecer algo complejo para los recién llegados pero hará las delicias de los veteranos del género. A fin de cuentas aprender forma parte de la esencia del rol y eso pasa por cosas como la creación de nuestro personaje. A continuación os dejo un vídeo para que lo veáis en acción.


En otras plataformas no sé, pero en Linux sin duda estamos ante el juego del año :)
Miguel Parada

Miguel Parada
Ubuntizando.com

Tienes razones de sobra para usar GNU/Linux

En esta ocasión me toca hablar de sistemas operativos y se pueden destacar tres: GNU/Linux, Microsoft Windows y Mac OS X. Sin lugar a dudas el mejor de ellos y el que más conviene es GNU/Linux y voy a dar 10 razones:

  1. Costo: La mayoría de las distribuciones de GNU/Linux son gratuitas y se pueden instalar en la cantidad de máquinas que se desee de manera gratuita y legal, en cambio por ejemplo para Windows hay que pagar por una licencia para cada computadora (que dicho sea de paso no es nada barata) para usar el sistema de manera legal. Sobre Mac OS X puedo decir que solo se puede usar legalmente en computadoras marca Apple donde ya viene preinstalado.

  2. Restricciones: GNU/Linux al ser software libre me da la libertad de hacer lo que quiera (es decir que puedo ver, estudiar y mejorar su código fuente, hacer copias y redistribuirlo cuanta veces quiera, etc.) en cambio los otros sistemas en cuestión, como en el caso de Windows, lo puedo usar pero bajo ciertos términos o condiciones y obviamente no puedo tener acceso a su código fuente ni mucho menos modificarlo (vale aclarar que ciertas partes de MAC OS X son de licencia libre por lo que seria un híbrido en donde ciertas partes si tienen restricciones y otras no).

  3. Instalación: En GNU/Linux la instalación fue mejorada y es muy fácil instalar el sistema operativo al igual que sucede con Microsoft Windows en donde casi todo es “pulsar siguiente” y hoy en día existe una tienda en las mayorías de las distribuciones Linux que me permiten instalar un programa de manera muy sencilla con solo pulsar un botón. Otro punto a favor aquí en GNU/Linux es que la instalación es muy veloz.

  4. Compatibilidad: GNU/Linux cuenta con una gran base de datos de drivers que hace que la mayoría del hardware sea detectado y reconocido y no hace falta por lo general como sucede en Windows que no se reconoce algún dispositivo y hay que estar buscando determinados controladores para poder instalarlo. MAC OS X como ya viene preinstalado en las máquinas de marca Apple no tiene grandes problemas o inconvenientes con esto.

  5. Interfaz Gráfica: En GNU/Linux existe una gran variedad de escritorios de usuario (GNOME, KDE, XFCE, entre otros) para elegir y de esta manera sentirse cómodo y a gusto. En cambio en Windows y Mac OS X la interface es limitada al que traiga la versión que se instalo.

  6. Programas: La ventaja en GNU/Linux radica en que cuando instalamos el sistema ya viene preinstalado un conjunto de programas plenamente útiles ya desde un primer momento sin versiones de prueba, a diferencia de Windows en donde después de instalar el sistema hay que conseguir e instalar una suite ofimática, un buen navegador, un buen reproductor multimedia y muchos programas mas. También debo decir que si bien existen programas famosos que son privativos y no tienen su versión nativa para GNU/Linux existe una alternativa libre para cada uno y que ademas por medio de “emuladores” se puede correr una versión que no sea nativa.

  7. Estabilidad: Siempre fue muy pero muy buena en GNU/Linux ya que la hereda de Unix a diferencia de Microsoft Windows en donde son muy propensos los cuelgues del sistema. MAC OS X en este sentido es mejor a Windows y mas estable.

  8. Rendimiento: Se puede decir que GNU/Linux siempre fue rápido y bueno administrando los recursos a diferencia de sistemas de Microsoft en donde determinadas versiones como por ejemplo Windows Vista era realmente muy malo administrando los recursos y por ende esto hacia que la computadora sea muy lenta.

  9. Seguridad: No caben dudas que en este aspecto GNU/Linux es ampliamente superior a los otros sistemas ya que tiene otro nivel de seguridad en el cual se pide el password para cada acción critica que se requiera y ademas la gran cantidad de amenazas (llámese virus, gusanos o troyanos) que hay para Windows no lo afecta. En MAC OS X la seguridad también es buena ya que la cantidad de amenaza informáticas no es mucha a diferencia de Microsoft Windows en donde como ya dije anteriormente posee muchas amenazas y ademas tiene un nivel de seguridad muy débil.

  10. Uso: Linux es un sistema que se usa bastante en SmarthPhone y en aparatos electrónicos inteligentes así como en el 98% de los servidores y mainframes (supercomputadoras) del mundo. También en sectores delicados o lugares críticos es muy común su uso por lo estable y seguro que resulta, como por ejemplo se lo usa para el control del tren bala de Japón, el tráfico de San Francisco, la bolsa de valores de New York, los sistemas de control aéreo y reactores nucleares, etc. Hasta las películas de Hollywood utilizan GNU/Linux para realizar sus efectos especiales.

    gnulinux-logo

Vale decir que tampoco todo es “color de rosas” y hay aspectos pendientes en los cuales GNU/Linux esta en deuda o puede mejorar:

  1. Juegos: Es un punto que si bien viene en crecimiento y cada vez se le da más soporte y hay más títulos para GNU/Linux, se puede decir que el soporte de tarjetas gráficas y hardware de empresas que se dedican a esta industria lo dan principalmente para la plataforma Windows y que además este es el sistema preferido por los “gamers” ya que posee una cantidad mayor de juegos y funcionan hasta ahora con mejor rendimiento en varios casos.

  2. Manejo: El manejo de una computadora con Microsoft Windows es muy fácil e intuitivo ya que es más conocido a diferencia de GNU/Linux en donde el usuario debe adaptarse y acostumbrarse a usarlo. Pero esto es así debido a la imposición del mercado cuando Windows dominaba el mercado, a mucha gente le cuesta cambiar a algo nuevo. Aquí también dependerá de la distribución de GNU/Linux ya que existen algunas como Ubuntu y Mint donde es sencillo su manejo y otras que por el contrario son más complicadas de usar para el usuario promedio.

  3. Accesibilidad: Más del 90% de las computadoras personales de escritorio usan como sistema Microsoft Windows por defecto y por lo tanto es mucho más común encontrarse con computadoras que posean ese sistema operativo, aunque como nombré anteriormente en servidores, tablet o celulares inteligentes es más usado Linux.

Pero a pesar de esto último que vimos queda a la vista que GNU/Linux es muy superior a los otros sistemas y que desde mi punto de vista es el futuro.

La entrada Tienes razones de sobra para usar GNU/Linux aparece primero en Ubuntizando.com.

Liher Sanchez

Liher Sanchez
El blog de Liher

La tecnoclogia es nuestra amiga

Hoy en día vivimos en una sociedad en la cual estamos rodeados de tecnología allá donde miremos. Según como la usemos puede ser muy beneficiosa o no. Os quiero hablar un poco de sus bondades y cómo nos puede servir para nuestro bien. Os contaré una experiencia personal en la que me ha sido de gran ayuda y otra en la cual la tecnología me hubiese venido de perlas, de haber sabido que había un aparato como ese.

Muchas veces no sabemos que hay herramientas que la tecnología nos brinda y que pueden sernos de gran utilidad. Siempre hay personas muy “avispadas” que le sacan provecho, por ejemplo, los falsificadores de billetes. Gracias a los escaners e impresoras que hay hoy en día es relativamente fácil, consiguiendo el papel adecuado, lograr muy buenas falsificaciones de cualquier billete. Por suerte para todo el mundo también hay empresas que nos ayudan proporcionándonos algún utensilio que nos ayude. En este caso, por ejemplo, podríamos dotarnos de un detector de billetes falsos, en el enlace podéis ver uno muy sencillo de usar y muy efectivo que hará que estemos protegidos ante aquellos listillos que quieran colarnos un billete falso. Por supuesto que hay muchos inventos de este tipo que nos pueden hacer la vida mas fácil.

 

detector-billetes-falsos

 

Hace un mes, mas o menos, tuve que hacer un bizcocho, pero como podía comer de él una persona celiaca tuve que hacerlo con ingredientes sin gluten. Como nadie de mi familia es celiaco, nunca me había visto en la tesitura de tener que comprar alimentos sin gluten. Cuando fui al supermercado me encontré con que, en algunos alimentos, no se indicaba ni que tenia gluten ni que no lo tenia, por lo que no sabia si podía usarlos. Gracias al personal del supermercado y a San Google, aclaramos todas nuestras dudas. Al buscar por Internet me encontré con un artículo en el cual se hablaba de un invento, una máquina que sirve para detectar si un alimento tiene gluten, os dejo aquí el enlace para que lo podáis leer. Alguien cercano a mí tiene una hija celiaca y, en varias ocasiones, le había oído hablar de los problemas que tiene debido a ello, seguro que una maquina como la que os he comentado le vendría genial. En una ocasión, un amigo fue con su familia a comer en un restaurante, tenia una hija celiaca, y al preguntar por la comida le dijeron que no tenia gluten. Pues resulta que, alguno de los alimentos si debía tenerlo y a su hija le sentó muy mal la comida, seguro que habrían agradecido tener una maquina como esta.

 

detector-gluten-comidas

 

Otro invento que vendría genial para muchas cosas es una máquina que han creado los investigadores de Universidad de California en San Diego en colaboración con la Universidad de Toronto. Se trata de una máquina que, mediante las expresiones faciales es capaz de distinguir si se esta fungiendo dolor o no, aunque se puede usar para detectar otro tipo de “simulaciones”.

Otra herramienta que nos brinda la tecnología y que nos puede resultar muy útil, lo digo por experiencia propia viendo los resultados, es Google Translator. Muchos dirán que es un simple traductor, pero podemos ir mas allá con el. Puedes aprender como pronunciar una frase en inglés, por poner un ejemplo, ya que si decimos dicha frase por el micrófono del ordenador, Google Translator, la muestra escrita. De esa forma podemos aprender a pronunciar bien. Además, si escribimos una frase en castellano y la traducimos al inglés, podemos escuchar como se pronunciaría y, repitiéndola, podemos aprender a pronunciarla bien nosotros. Si esto lo usamos bien podemos ayudar a nuestros hijos si tienen problemas con el inglés, o cualquier otro idioma. Como ya he dicho antes, la tecnología bien usada ayuda mucho.

Solo quería contaros esto, y mis experiencias en dos de los casos para mostraros que la tecnología puede ser nuestra amiga, si la usamos adecuadamente, ya que nos puede facilitar mucho la vida.

Un saludo a todos.

Miércoles 30 de noviembre de 2016

Raúl González Duque

Raúl González Duque
Linux – Mundo Geek

Cómo crear un pendrive USB bootable con Ubuntu en Windows

Tener un USB con Ubuntu siempre listo en el bolsillo puede ser muy útil para solucionar problemas con Windows, eliminar virus, realizar operaciones seguras en Internet, o simplemente para jugar un poco con Linux.

Para crear una unidad USB arrancable con Ubuntu me gusta utilizar Rufus, que es gratuita, muy ligera, rápida y cuenta con versión portable. Además de Rufus, sólo necesitaremos una ISO de Ubuntu y un pincho USB con al menos 2GB de espacio, que debe estar vacío, o no importarte mucho su contenido, porque se formateará durante el proceso.

Conecta el pincho USB a tu equipo y ejecuta Rufus.

En “Dispositivo” selecciona tu pincho USB.

Marca la opción “Crear disco de arranque con:”, selecciona “Imagen ISO”, y haz clic sobre el icono del CD Rom para abrir un diálogo en el que buscar la imagen ISO que has descargado

USB booteable Ubuntu

Pulsa el botón “Empezar”. Te avisará de que necesita descargar un par de archivos de Internet, pulsa en “Sí”.

Cuando te pregunte por el modo de escritura de la imagen, selecciona “Escribir en modo Imagen ISO (Recomendado)”.

A continuación te avisará de que va a proceder a formatear el dispositivo USB. Haz clic en “Aceptar” para empezar el proceso.

Skype disponible para Linux

Hace al menos una década, era impensable que la compañía de Microsoft, encargada de la creación de Windows y siempre en continua disputa con sus competidores, en especial Linux, terminara admitiendo su derrota y el gran potencial de éste último. Con las nuevas tecnologías que han ido surgiendo en el mundo de la programación y por ende en el del software, Linux se ha hecho todavía si

Primer RC para Krita 3.1

Con una semana de atraso, pero igual andando adelante a todo ritmo llega hoy el primer «release candidate» de Krita 3.1: Krita 3.1 Release Candidate Como siempre, desde el anuncio se puede descargar el programa para las distintas plataformas soportadas. En Linux tenemos el paquete «appimage» al cual solo tenemos que darle permisos de ejecución […]

Martes 29 de noviembre de 2016

Gaspar Fernández

Gaspar Fernández
Poesía Binaria

Pasa tu web a HTTPS utilizando Let’s encrypt manual o automáticamente, tú decides

photo-1461685265823-f8d5d0b08b9b

La web no fue diseñada pensando en la seguridad, es decir, la comunicación se realiza de forma plana y cualquiera que pueda pinchar la línea puede ver los mensajes que pasan, el origen y el destino, y no hace falta ser un crack, sólo instalar un programa como Wireshark. Afortunadamente ahora tenemos HTTPS, es el mismo protocolo web, pero utilizando una capa de seguridad que cifra la comunicación entre las dos partes (nuestro navegador y el servidor) y hace que sea muy complicado que alguien que pueda interceptar la comunicación sepa qué estamos hablando.

La seguridad es muy importante hoy en día, ya que en casi todo tipo de páginas se intercambian datos sensibles, ya sean usuarios y contraseñas, direcciones de correo, datos personales, datos bancarios, o incluso datos que no queremos que sepa alguien (alguna foto comprometida, análisis clínicos, conversaciones, etc). Y actualmente, es muy cómodo transmitirlo todo sobre HTTP, ya que hacemos que un navegador sea capaz de tratar con los datos haciendo posible que muchos tipos de aplicaciones (móviles y de escritorio) puedan acceder fácilmente a la información. Antes se creaban aplicaciones específicas y protocolos propietarios cada vez que se trataba un tipo de información, y por supuesto, la seguridad había que programarla aparte. Ahora simplemente, los programadores incluyen una biblioteca de comunicación HTTP(s).

Google lleva tiempo amenazando con bajar el prestigio de webs sin HTTPS

Google empezó hace unos años penalizando un poco a páginas que no utilizaban HTTPS y pedían datos sensibles (tenían campos password, básicamente). Ahora mismo, las páginas que incluyen una capa de seguridad tienen premio en los posicionamientos. El problema es que HTTPS al mismo tiempo que cifra la comunicación, crea una verificación y da confianza al usuario dando validez al servidor al que accedemos diciendo que somos quien decimos ser. Por ejemplo, podemos hacer una página de phising con el aspecto de la página de un banco, pero el certificado no podrá nunca decir que somos ese banco (¿quién mira el certificado?). En este caso el navegador nos suele avisar, y no debemos aceptar los certificados a la ligera.
El tema, es que hasta el año pasado, tener un certificado para cifrar la conexión costaba dinero, un certificado que estuviera autorizado, claro. Es verdad que los hay muy baratos (4€/año), pero es un coste que si gestionas muchas webs se va multiplicando. Aunque también existen certificados que cuestan miles de euros, y todo tiene un motivo. Por supuesto, nos podíamos crear un certificado nosotros mismos, aunque todos los navegadores verían advertencias, porque nadie dice que nosotros seamos de confianza, y no hemos pagado por nuestra confianza.

Cuando pides un certificado, normalmente la empresa a la que lo pides realiza unas pruebas verificando quién eres, y que no haces cosas ilegales con tu sitio. Dependiendo del coste del certificado el examen puede ser más exhaustivo y tardar más. Los certificados más sencillos, sólo verifican tu IP, tu dominio y poco más. Los hay que te piden documentos de empresa para certificar quién eres, incluso identificación de empleados, responsables, documentos firmados que hay que remitir por correo y ellos guardarán bajo llave. Hay certificados como los EV (Extended Validation, validación extendida), que son los que solemos ver en los bancos, en los que la barra de direcciones aparece en verde y aparecen en el certificado más datos sobre el nombre de la organización, con el fin de dar confianza al usuario, ¡Eres quien dices ser!
Además, cuanta más verificación haya en ese certificado, mayor será la indemnización en caso de haber un problema. Dicha indemnización es al usuario afectado, por ejemplo, si han suplantado su identidad o le han robado información y es culpa del certificado o de que no se podía confiar en la empresa que han verificado (ellos no habrían hecho bien su trabajo diciendo que eres quien dices ser y que tienes un sitio legítimo). Esto no cubriría en principio fugas de información de la empresa.

También tenemos los certificados Wildcard que valen para cubrir un subdominio completo, por ejemplo todos los subdominios que haya bajo totaki.com (loquesea.totaki.com , privado.totaki.com , nube.totaki.com, etc) y suelen ser bastante caros aunque no tengan validación extendida. Pero suele ser más barato que comprar un certificado para cada uno de tus subdominios (si necesitas cierto nivel de confianza).

¿Qué diferencia hay entre Let’s Encrypt y un certificado de pago?

Let’s Encrypt es un certificado cuya intención es cifrar la comunicación. Por ejemplo si tienes un blog, o un pequeño sistema de usuarios y quieres que los datos se transmitan de forma segura, o dar un poco de confianza al usuario están muy bien. No son de validación extendida, ni lo pretenden, porque es un sistema automático sin intervención humana por parte de Let’s Encrypt. Pero conseguimos una conexión cifrada, gratuita y Google no nos penaliza tanto (aunque puede que algún navegador o S.O. antiguo sí lo haga, pero no nos debería quitar el sueño). Eso sí, Let’s Encrypt verifica que el dominio que estamos certificando corresponde con el servidor en el que estamos.

Los certificados de pago, normalmente nos dan algo de soporte técnico por chat, o por teléfono, y nuestros datos suelen ser archivados por un humano (no siempre, los de 4€ ni eso).

Si no tienes acceso SSH al servidor

Si no dispones de conexión SSH a tu servidor. Tendrás que decirle a tu proveedor de hospedaje que te instale el certificado para tu web. De todas formas, Let’s encrypt está empezando a ser bastante famoso y muchos proveedores lo ofrecen de forma gratuita en sus paneles de control. Es cuestión de probarlo en tu web y con tu configuración actual, porque tal vez no haya ningún problema y lo puedas activar.

Eso sí, tienes que tener cuidado con la versión HTTP. Es interesante hacer que la versión HTTP redirija a HTTPS para que no haya contenidos duplicados, y sobre todo para que no haya ninguna cookie perdida que haga que un usuario identificado deje de estarlo al entrar en otra versión de la página. Debemos controlar dónde apuntan todos nuestros enlaces, pero muchas veces es casi imposible.

Instalación de certbot

Dependiendo de nuestra distribución, la instalación o el nombre del paquete varía. En muchos sitios lo veremos como certbot, en otros python-certbot, en otros se llama python-letsencrypt, por lo que podemos buscar el paquete por esos nombres. Por ejemplo en Debian 8, tenemos que buscar en los backports, añadiendo:

deb http://ftp.fr.debian.net/debian jessie-backports main
deb-src http://ftp.fr.debian.net/debian jessie-backports main

En /etc/apt/sources.list o en un archivo dentro de /etc/apt/sources.list.d/

Para ver la instalación detallada, podemos ir a esta página donde seleccionamos la distribución y el servidor web, porque aquí pondré un ejemplo directo para Apache sobre Debian Jessie (Debian 8):

sudo apt-get install python-certbot-apache -t jessie-backports
; …
; …
; Decimos que sí. Y después de instalar muchos paquetes y ver muchas letras…
; …
; …

Modo automático con certbot

Yo no soy muy fan de estos métodos automáticos que cambian cosas milagrosamente en el servidor. Creo que muchas veces estos sistemas tocan cosas que no deben y, aunque los buenos sistemas mantienen copias de lo archivos originales, nos suelen dar más de un susto. De hecho, Let’s Encrypt me ha dado ya algún susto en un servidor que gestiono.

Pero claro, si acabas de instalarlo todo en el servidor, sólo tienes una web o no te importa que ocurra un susto y con ello problemas de downtime o de certificados en tu sitio, puedes probar este método.

sudo certbot

o

sudo certbot --apache

Listo! Él ya se encarga. Nos hará ciertas preguntas e instalará el certificado donde corresponde. En teoría, aunque los ficheros de configuración los dejará un poco feos (sin anidados ni nada), además, aunque incluye configuraciones recomendadas para muchos escenarios, puede que machaque algunas configuraciones que ya tenemos.
En realidad certbot nos ahorra todo el tema de creación de claves, sign requests, envío a la autoridad para que lo firme, instalación de certificado y configuración de seguridad lo que muchas veces es de agradecer.

Pero la cosa no termina aquí, deberás mirar también el apartado de auto-renovación, ya que los certificados caducan a los 3 meses.

Certbot, con configuración manual

Para ello, tenemos que ejecutar certbot con los siguientes argumentos:

sudo certbot --apache certonly -d [dominio]

O si es la primera vez que lanzamos un certificado, tendremos que aceptar la licencia y dar una dirección de correo para incidencias, todo eso nos lo puede pedir de forma interactiva, pero si queremos automatizar el proceso no puede ser interactivo, por ello ejecutaremos lo siguiente:

sudo certbot --apache --agree-tos --email [mi_direccion@de_correo] certonly -n -d [dominio]
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org
Obtaining a new certificate
Performing the following challenges:
tls-sni-01 challenge for [dominio]
Waiting for verification…
Cleaning up challenges
Generating key (2048 bits): /etc/letsencrypt/keys/0000_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0000_csr-certbot.pem

Adicionalmente se pueden añadir dominios con todos los -d [dominio] que queramos. Dichos dominios serán VirtualHosts que tengamos hechos y se obtendrán a partir del ServerName. Por supuesto, los certificados pueden ser para un subdominio o un sub-sub dominio.

Con esto, hemos creado los certificados necesarios para correr el sitio web. Ahora, en Apache, debemos ir a nuestro virtualhost que se llamará por ejemplo certest.totaki.com y estará en el archivo /etc/apache2/sites-available/certest.totaki.com.conf (el archivo puede llamarse como quieras, pero me gusta poner nombres coherentes):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<VirtualHost *:80>
    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.
    ServerName certest.totaki.com

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.
    #LogLevel info ssl:warn

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual host. For example the
    # following line enables the CGI configuration for this host only
    # after it has been globally disabled with "a2disconf".
    #Include conf-available/serve-cgi-bin.conf
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>

Las últimas líneas de Rewrite son las que debemos añadir, haciendo que cuando alguien se conecte desde HTTP le redirija automáticamente a la versión HTTPS del sitio. Ahora bien, en otro fichero aparte dentro de /etc/apache2/sites-available/ (podemos llamarlo certest.totaki.com-ssl) o, si lo preferimos, podemos añadirlo en el mismo archivo: /etc/apache2/sites-available/certest.totaki.com debemos crear el virtualhost seguro, añadiendo lo siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<IfModule mod_ssl.c>
        <VirtualHost *:443>
                # The ServerName directive sets the request scheme, hostname and port that
                # the server uses to identify itself. This is used when creating
                # redirection URLs. In the context of virtual hosts, the ServerName
                # specifies what hostname must appear in the request's Host: header to
                # match this virtual host. For the default virtual host (this file) this
                # value is not decisive as it is used as a last resort host regardless.
                # However, you must set it for any further virtual host explicitly.
                ServerName certest.totaki.com

                ServerAdmin webmaster@localhost
                DocumentRoot /var/www/html

                # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
                # error, crit, alert, emerg.
                # It is also possible to configure the loglevel for particular
                # modules, e.g.
                #LogLevel info ssl:warn

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                # For most configuration files from conf-available/, which are
                # enabled or disabled at a global level, it is possible to
                # include a line for only one particular virtual host. For example the
                # following line enables the CGI configuration for this host only
                # after it has been globally disabled with "a2disconf".
                #Include conf-available/serve-cgi-bin.conf

                #   SSL Engine Switch:
                #   Enable/Disable SSL for this virtual host.
                SSLEngine on

                # Include certificate file and key
                SSLCertificateFile /etc/letsencrypt/live/certest.totaki.com/fullchain.pem
                SSLCertificateKeyFile /etc/letsencrypt/live/certest.totaki.com/privkey.pem

                # intermediate configuration, tweak to your needs
                SSLProtocol             all -SSLv3
                SSLCipherSuite          ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
                SSLHonorCipherOrder     on
                SSLCompression          off
                SSLOptions +StrictRequire

                Header always set Strict-Transport-Security "max-age=15768000"
        </VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
</IfModule>

Si ponemos la configuración del virtualhost seguro junto con la del inseguro será más fácil activar y desactivar webs con un sólo a2ensite/a2dissite. Es también una buena práctica, siempre que tengamos tiempo, verificar las nuevas configuraciones SSL gracias a Mozilla SSL Configuration Generator. Aquí tendremos muchas combinaciones de Servidores y versiones de software que nos ayudarán a mantener nuestro servidor seguro. Eso sí, cuanto más actualizado esté el servidor, mejores algoritmos de cifrado tendremos disponibles.

Auto renovación del certificado

Estos certificados duran unos tres meses. Y esto es bueno, normalmente los certificados pagados suelen durar un año, y cuando ocurren cosas como el bug Heartbleed, que nos obligó a renovar todos los certificados que teníamos, se nos fastidiaron todos los planes a los que trabajamos en seguridad. De hecho, puede suceder que haya vulnerabilidades no conocidas por los desarrolladores o por los administradores de sistemas que puedan ser explotados si nuestros certificados están demasiado tiempo sin cambiarse. Además, ya que han desarrollado un método automático para la renovación de estos certificados, ¿por qué no aprovecharlo?

Para ello tenemos que ejecutar el comando:

sudo certbot renew --dry-run

Incluso podemos poner un cron para que cada semana verifique esto, renovando todos los dominios que tengamos a punto de expirar (certbot considera por defecto que está a punto de expirar cuando faltan 10 días). Y si hemos tenido algún problema con esto, recibiremos un correo, adicionalmente, yo me envío también el resultado de esta tarea cron con MAILTO=:

sudo crontab -e

Así editamos las tareas de root y añadimos:

# m h dom mon dow command
30 4 * * 1 certbot renew –dry-run

Para ejecutar todos los lunes a las 04:30 (suponemos que a esa hora no hay nadie que pueda ver un posible microcorte en el servicio).

Buenas prácticas

Aquí detallo algunas buenas prácticas que van surgiendo con los años y que considero interesantes.

Renovando certificados

Certbot permite la ejecución de scripts antes, durante y después de las renovaciones. Es decir, antes de pedir un certificado, podremos ejecutar un programa, tras cada renovación (imaginad que renovamos varios certificados) ejecutaremos otro programa y al final, ejecutaremos otro. Para ello, nos proporciona los siguientes modificadores:

sudo certbot renew --dry-run --pre-hook “/usr/local/bin/renew_antes” --post-hook “/usr/local/bin/renew_final” --renew-hook “/usr/local/bin/renew_entre”

Con esos scripts podemos hacer un log, enviar correos, establecer notificaciones o incluso recargar la configuración de servicios. Por ejemplo, cuando el certificado lo utilice también NodeJs o Nginx podemos hacer:

sudo certbot renew --dry-run --post-hook “npm restart”

Aunque lo suyo es crear un pequeño script que cargue el servicio por si tenemos que ejecutarlo con un determinado usuario o ejecutarlo en una determinada ruta.

Configuración de SSL común

Algo que nos puede ayudar a la hora de mantener Apache es crear una configuración propia y común para todos los sitios alojados en el servidor. En lugar de modificar los ficheros de configuración de Apache, podemos crear una configuración propia en la que podemos incluir ajustes sobre SSL, seguridad y demás. Además, a la hora de llevarnos la configuración a otro servidor (o por si tenemos que hacer una actualización grande), no nos afectaría mucho, ya que ese fichero nadie lo va a tocar.

Para ello, debemos crear un fichero en /etc/apache2/conf-available/ y lo llamamos, por ejemplo, poesia.conf:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<DirectoryMatch "/\.svn">
   Require all denied
</DirectoryMatch>
<DirectoryMatch "/\.git">
   Require all denied
</DirectoryMatch>
ServerToken Prod
ServerSignature Off
Header set X-Content-Type-Options: "nosniff"
Header set X-Frame-Options: "sameorigin"
Header set X-XSS-Protection "1; mode=block"
# OCSP Stapling, only in httpd 2.3.3 and later
SSLUseStapling          on
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
SSLStaplingCache        shmcb:/var/run/ocsp(128000)
# intermediate configuration, tweak to your needs
SSLProtocol             all -SSLv3
SSLCipherSuite          ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
SSLHonorCipherOrder     on
SSLCompression          off
Timeout 180
TraceEnable Off
FileETag MTime Size
#FileETag None

Y podemos incluir muchas cosas más. Por ejemplo, la configuración de protocolo SSL podemos incluirla en ese fichero y quitarla de los VirtualHosts. Además, podemos activar y desactivar con a2enconf/a2disconf.

Verificar datos de nuestro certificado

Está bien saber cómo está el certificado de vez en cuando, así que:

sudo  openssl x509 -noout -text -in /etc/letsencrypt/live/certest.totaki.com/cert.pem

Nos va a dar mucha información útil.

Utilizar sólo recursos seguros

Todas las URLs que carguemos desde nuestra web deberán ser HTTPS, imágenes, scripts, estilos, tipos de letra, etc. Por eso tenemos que asegurarnos de ello. Y por eso es una mala idea meter las URLs a mano en el código de la web. Debemos tener en cuenta también los recursos que utilicemos desde CDN, por ejemplo jquery, y scripts por el estilo, cuya URL debería empezar ahora por https:// o simplemente por // (donde aprovechará el protocolo desde el que accedemos a la web principal).
El objetivo es evitar el candado naranja que nos indica que hay recursos no seguros. Además, aunque redirijamos a HTTPS todos los HTTP, no es plan de hacer que el navegador acceda a cada URL por HTTP y luego por HTTPS gracias a la redirección, porque tendríamos el doble de hits y estaríamos desperdiciando recursos de nuestro servidor.

Probar la seguridad de tu certificado

Es muy importante probar desde fuera que todo va bien, haciendo algo de auditoría a nuestra web. Para ello podemos utilizar los siguientes servicios:

Estos sitios suelen estar al día en cuanto a vulnerabilidades de cifrado y negociación y nos darán pistas de cómo hacer más segura la comunicación con nuestro servidor.

Más información

Instalando el certificado SSL en el blog, para instalarlo en nginx.
Let’s Encrypt, certificados SSL libres y gratis para asegurar tu web con HTTPS, con consejos para utilizarlo en WordPress y cambiar tu web a HTTPs.
Foto: Matthew Henry

The post Pasa tu web a HTTPS utilizando Let’s encrypt manual o automáticamente, tú decides appeared first on Poesía Binaria.

Lunes 28 de noviembre de 2016

José María Morales Vázquez

José María Morales Vázquez
tecnología – Un lugar en el mundo…

Centralizando los datos de munin de varios servidores

herramientas Hemos hablado bastante por aquí en los últimos años acerca de munin. No en vano se trata de una de mis herramientas de monitorización favorita. Vamos a completarlas con alguna cosa más.

Cuando queremos monitorizar varios servidores diferentes, lo más cómodo es verlos todos en la misma página del navegador. Para ello hacemos lo siguiente:

En primer lugar, recordad que munin tiene dos módulos diferentes: munin y munin-node. En el artículo inicial de esta “saga” instalábamos tres paquetes: munin, munin-node y munin-plugins-extra. Ahora instalaremos los tres sólo en la máquina que centralizará los datos de la monitorización. Esta máquina se configurará igual que vimos ya en su día y debe de contar con un servidor web, intérprete de php y todo lo que ya hablamos en su momento. En las máquinas que solamente queremos monitorizar sólo instalaremos los dos paquetes finales (munin-node y munin-plugins-extra).

En todas las máquinas (salvo la que centralizará la comunicación) tendremos que editar el fichero /etc/munin/munin-node.conf. En este fichero nos aseguraremos de que aparecen dos líneas como estas:

host_name nombre2.midominio.net
allow 33.44.55.66

Donde 33.44.55.66 es la IP de la máquina que centralizará la monitorización de munin y nombre2.midominio.net será el nombre con el que queremos que aparezca esta máquina en nuestro panel de monitorización. Una vez hecho esto reiniciamos el daemon de munin-node: systemctl restart munin-node

En la máquina donde queremos ver las gráficas editamos el fichero /etc/munin/munin.conf y escribimos algo como esto:

[nombre1.midominio.net]
    address 127.0.0.1
    use_node_name yes

[nombre2.midominio.net]
    address 11.22.33.44
    use_node_name yes

[nombre3.midominio.net]
    address 55.66.77.88
    use_node_name yes

El primer bloque (nombre1.midominio.net) corresponde a la máquina en la que estamos editando el fichero y por eso usamos 127.0.0.1 como dirección. Cada uno de los otros corresponde con una de las máquinas cuya información queremos recoger y centralizar en esta.

Por defecto las máquinas aparecerán en el panel de monitorización en orden alfabético. Si queremos alterar dicho orden debemos de introducir una nueva directiva:

[midominio.net;]
        node_order nombre2.midominio.net nombre1.midominio.net nombre3.midominio.net

Ojo al punto y coma final de la directiva que es importante para que funcione. Luego reiniciamos el daemon munin (systemctl restart munin).

Ahora, cuando entremos en nuestra página de monitorización veremos en la sección overview una línea llamada midominio.net y luego otra por cada una de las máquinas monitorizadas:

Página de Overview de munin con varios servidores

Y si pulsamos en la línea correspondiente a midominio.net veremos los datos de todos los servidores ordenados en columnas:

Página de monitorización de munin con varios servidores

Y ya. La próxima entrada que hagamos sobre esto irá sobre la posibilidad de que munin realice notificaciones en caso de error o de exceder de ciertos límites. Si, si, yo tampoco lo sabía, pero se puede 😉

Artículo Original: .

Este artículo pertenece a Un lugar en el mundo... Si quieres ver actualizaciones y comentarios interesantes visita el texto original en: Centralizando los datos de munin de varios servidores || Hospedado en un Cloud VPS de Gigas.

Domingo 27 de noviembre de 2016

Miguel Parada

Miguel Parada
Ubuntizando.com

Mejora tu formación con los cursos de OpenWebinars y llévate un 20% de descuento

OpenWebinars es una plataforma abierta de formación en línea que cuenta en la actualidad con más de 30 cursos temáticos para ayudarte en tu formación. Además de una oferta constante de pequeños talleres y cursos para aquellos que no tenemos mucho tiempo para profundizar en materias pero que por el motivo que sea nos interesa mantenernos al tanto de sus novedades a modo de formación continua.

Como estamos todavía de Black Friday y a punto de arrancar el Cyber Monday OpenWebinars presenta un descuento especial de un 20% para aquellas personas que se suscriban a su oferta anual que ofrece acceso sin límites a todos los cursos disponibles. La oferta es por tiempo limitado, quedan cerca de 24 horas para su finalización y por 232€ representa un ahorro de 50€. ^_^

openwebinars

La entrada Mejora tu formación con los cursos de OpenWebinars y llévate un 20% de descuento aparece primero en Ubuntizando.com.

Sábado 26 de noviembre de 2016

David González

David González
Blog Bitix

Guardar contraseñas de forma segura con KeePassX

KeePassX

La mayor parte de servicios usan aún como forma de autenticación el método de usuario y contraseña. Si la contraseña proporcionada conocida solo por su usuario es correcta el sistema confía en que el usuario es quien dice ser. Las contraseñas debería ser difíciles de averiguar, se recomienda que tenga una longitud mínima de 8 caracteres y que contenga letras en minúscula y mayúscula, números y símbolos, sin embargo, cuanto más fuerte y difícil sea de averiguar más difícil será recordarla. Además, idealmente se debe utilizar una contraseña distinta en cada servicio para evitar que descubierta la contraseña por un fallo de seguridad en cualquiera de en los que se use pueda accederse a todos los otros servicios que use ese usuario utilice, por lo que el número de contraseñas a recordar pueden ser numerosas de modo que muchos usuarios terminan usando la misma contraseña en varios servicios con el riesgo que conlleva. Dado que recordar una contraseña fuerte para cada servicio es difícil y mantenerlas guardadas en un archivo de texto o en un papel no es lo más recomendable podemos usar un programa que las almacene.

Uno de estos programas es KeePassX, básicamente es una base de datos de contraseñas que se almacenan de forma segura y cifrada y protegidas por una contraseña maestra. La información básica que podemos guardar es el nombre del servicio y su URL, el usuario que usamos en ese servicio y la contraseña. Con KeePassX podemos crear grupos de contraseñas que nos permitan buscarlas de forma más sencilla.

Instalado el paquete de KeePassX de nuestra distribución GNU/Linux o el binario para nuestro sistema operativo lo primero que deberemos hacer es crear una base de datos que protegeremos con una contraseña maestra, podemos guardar la base de datos en un archivo en la ubicación que deseemos.

Lo siguiente será crear una entrada con el usuario y contraseña de un servicio.

Una vez almacenada la credencial podemos copiar al portapapeles el usuario y contraseña de esa credencial para usarla en el servicio. También podremos ver la contraseña no protegida con asteriscos sino los caracteres originales.

KeePassX es una herramienta que no tiene más complejidad, podemos asociar alguna información más a la credencial con atributos adicionales y archivos adjuntos pero no es imprescindible.

Si somos nosotros los que implementamos un servicio con el método de autenticación de usuario y contraseña deberíamos almacenar las contraseñas de forma segura usando «password salted hasing».

Otras formas de guardar las contraseñas es en un archivo cifrado con GPG que desciframos cuando queramos usar alguna contraseña o en un sistema de archivos cifrado como con EncFS que lo montamos para acceder a archivo de texto con las contraseñas.

KeePassX posee una utilidad para generar contraseñas únicas para cada servicio con cierta complejidad, podemos variar la longitud, si incluye símbolos, y mayúsculas y minúsculas. StrongPassowrdGenerator en una página web con la que podemos generar contraseñas usando estas mismas preferencias desde el navegador.

Viernes 25 de noviembre de 2016

David González

David González
Blog Bitix

Instalar programas con Homebrew en macOS

Para no tener que descargar binarios e instalarlos manualmente y estar pendiente de nuevas versiones que se publiquen en un futuro en macOS está Homebrew. Homebrew es un gestor de paquetes similar a los existentes en las distribuciones GNU/Linux con el que podremos buscar software, instalar, actualizar, ver que hemos instalado, cuales están desactualizados, iniciar y parar servicios y desinstalar los paquetes o programas. Esta es una guía básica sobre como instalar software en macOS con Homebrew y como instalar iTerm2 que es una mejor terminal que la propia del sistema con iterm.

Apple
macOS

Como nuevo usuario de mi primer mac he tenido que empezar instalando los programas que voy a usar. Una de las cosas buenas de las distribuciones GNU/Linux es la forma de obtener e instalar programas. Cada distribución de GNU/Linux tiene su repositorio de paquetes y programas de los que el gestor de paquetes obtiene e instala. Los gestores paquetes se encargan de instalar, actualizar y desinstalar cada paquete junto las dependencias que requiera. Con el gestor de paquetes y desde la terminal es posible instalar múltiples programas rápidamente con un comando. En Windows y macOS los programas se instalan descargando un binario y ejecutándolo que inicia un asistente. Instalar programas de esta forma en Windows y macOS tiene los inconvenientes de que hay que hay que ir a la página oficial de programa y descargar el último binario disponible, además cuando se publique una nueva versión hay que descargar el nuevo binario y volverlo a instalar, también es una fuente de introducción de virus si se descarga e instala el software de fuentes no confiables. En GNU/Linux el gestor de paquetes se encarga de actualizar los paquetes y programas que estén desactualizados cuando haya nuevas versiones.

En macOS existe un gestor de paquetes similar a los existentes en GNU/Linux, Homebrew se define así mismo como el gestor de paquetes que le falta a macOS. Con Homebrew podemos instalar los programas y mantenerlos actualizados sin tener que estar observando cuando se publica una nueva versión de cada programa. Con Homebrew también podremos instalar muchos de los comandos que están disponibles en GNU/Linux como wget, cmus, gimp, … Hombrew Cask es un añadido que proporciona los mismo para los binarios de los programas de macOS. Con estas dos herramientas podemos instalar y mantener actualizado la mayor parte del software que utilicemos.

Para instalar Hombrew ejecutamos el siguiente comando en la terminal:

El siguiente comando nos permitirá instalar versiones anteriores a las últimas, por ejemplo, Java 7:

Lo siguiente será buscar los programas que queramos:

Para instalar Firefox, Google Chrome, VirtualBox, Docker, Java 8 y Java 7, Atom e iTerm2:

Algunos otros programas que podemos instalar si programamos son:

Con jenv podemos cambiar entre las versiones de Java 8 y Java 7:

Los servicios como MySQL o Redis podemos iniciarlos y pararlos, además de ver cuales hemos instalado:

También podemos listar que paquetes y programas tenemos instalados:

Para ver que programas y paquetes tenemos desactualizados:

Para actualizar todos los paquetes desactualizados o actualizar uno individualmente:

Si queremos mantener desactualizado un paquete podemos fijar la versión que tengamos instalada:

Y para desinstalar paquetes:

La terminal incluida de serie en macOS es muy básica por ello mucha gente suele instalar una más avanzada como iTerm2. iTerm2 añade funcionalidades como pestañas y podemos dividir una terminal horizontal y verticalmente. También se puede instalar oh-my-zsh que permite gestionar la configuración del intérprete de comandos zsh pudiendo añadir temas para modificar el prompt del sistema o cambiarlo según la información del directorio actual, por ejemplo, si estamos en un directorio de git veremos en que rama estamos y si hay cambios realizados.

Terminal iTerm2
David González

David González
Blog Bitix

Mi primer Mac, yo usuario de GNU/Linux

Hace ya más de un lustro pase de usar Windows a usar GNU/Linux incluso en el trabajo, ahora por motivos laborales no me queda opción que usar un Mac, el primer Mac que usaré. En casa a nivel personal seguiré usando la distribución Arch Linux y antes de empezar a usar un Mac seguirá siendo así, ¿usar un Mac me hará cambiar de opinión y usaré un producto de Apple incluido a nivel personal en un futuro?

Apple
macOS

Hasta el momento en el trabajo podía usar GNU/Linux como sistema operativo, concretamente la distribución Arch Linux con GNOME y Docker para el entorno de desarrollo. Sin embargo, algunos cambios han hecho que tuviese que elegir entre Windows que no uso desde hace ya más de un lustro o macOS que usaría por primera vez. Dado que macOS es más similar a GNU/Linux por seguir ambos la filosofía Unix al final opté por un Mac como prácticamente la totalidad de mis compañeros de trabajo. Una razón es que muchas de las herramientas y comandos que están disponibles en GNU/Linux lo están también en macOS.

Usar un Mac por primera vez es algo relevante desde el punto de vista tecnológico para alguien que le gusta la tecnología. Este artículo lo escribo para mi yo futuro de dentro de unos años para ver si la preferencia del software libre y GNU/Linux que tengo ahora no se ve doblegada en parte por Apple y morderé la manzana más después de escribir cosas como Sobre los ínfimos impuestos que paga Apple o Como sería si Microsoft, Apple y Linux… .

Nunca he usado un producto de Apple salvo tocarlos un poco en las tiendas y es que convencido del software libre y el alto precio que tienen nunca he estado atraído por la marca de la manzana mordida, así que comienzo completamente desde cero empezando por tener que aprender de nuevo muchos de los atajos de teclado y combinaciones de teclas. Simplemente por curiosidad conseguí usar macOS en una máquina virtual con VirtualBox que es posible tanto en Windows como en GNU/Linux.

Una de las cosas que me gustaba de Arch Linux es su modelo rolling release de modo que en cada actualización del sistema con pacman -Syu tenía las últimas versiones de cada programa y paquete, esto hace que no necesite reinstalar cada nueva versión ni tuviese que preocuparme de las versiones de los programas, lo único que sabía es que siempre tenía la última versión. Hasta ahora iba por 3 años desde que instalé Arch Linux por última vez. Por lo poco que me he informado en los Mac existe Homebrew y Homebrew Cask que es un gestor de paquetes similar a la forma de distribuir software con los gestores de paquetes de las distribuciones GNU/Linux. Casi todo el software que he necesitado está disponible en Homebrew incluyendo Java 8, Java 7, Firefox, Google Chrome, MySQL, Docker, VirtualBox, Git o atom incluidos programas como vim, gimp, cmus o meld.

El Mac que usaré no es de los últimos con panel táctil en la parte superior del teclado ese que ha eliminado una tecla física tan importante también para los desarrolladores como la tecla escape. El precio del modelo de principios de 2015 está valorado en unos $2000 junto con otros $120 en adaptadores y periféricos, tiene buenas especificaciones siendo un producto de gama alta con sobre todo SSD, pantalla y touchpad y aunque 16 GiB son suficientes es extraño que en ningún modelo de MacBook Pro aún no haya opción de instalar 32 GiB para los usuarios más exigentes. Aún así por ese precio uno adquiere varios portátiles como los Slimbook y el último pasados unos años tendrá mejores especificaciones en varios aspectos que cualquier Mac actual.

En mis primeras horas de uso de un Mac destacaré la pantalla retina, su gran resolución de 2560x1600 hace que el texto y las imágenes se vean muy bien sin notar los píxeles, teniendo un monitor de 23” con resolución 1920x1080 o una pantalla de portátil de 14” de resolución 1600x900 las diferencias son claras. Aún así esto es a costa de que la resolución equivalente en un PC sea aproximadamente de 1280x800 en la configuración por defecto haciendo que parezca que entran pocas cosas en la pantalla, otras resoluciones equivalentes seleccionables son 1680x1050, 1440x900, 1280x800 y 1024x640. El touchpad también parece ser otra característica diferenciadora y destacable aunque aún no conozco muchos de los gestos que permite. La interfaz de escritorio de macOS y de GNOME es similar en muchos aspectos con la barra superior, el lanzador de aplicaciones Launchpad, la vista de ventanas Dashboard y la vista de actividades de GNOME.

Yo futuro, ¿habrás caído en la tentación? ¡Resiste! No olvides y piensa por que empezaste a usar GNU/Linux y por que seguiste usando Arch Linux… por aprender, por el software libre, por la privacidad, por no pagar costosas licencias de software privativo o usar cracks, por no tener software espía, por ser el dueño del equipo y no de la marca cuando decida dejar de darle soporte…

Por lo menos ahora podré hablar con un poco más de criterio cuando lo haga sobre Apple y sus productos, como macOS, los MacBook, los adaptadores y periféricos como el Magic Mouse. El siguiente paso es cómo instalar software en macOS con Homebrew.

Información del sistema y escritorio de macOS

Jueves 24 de noviembre de 2016

LaTeX/LyX: primer línea de un párrafo en versalitas

Una alternativa a utilizar letras capitulares para iniciar un párrafo luego de un título (hablamos sobre ellas aquí, aquí y, en forma indirecta, aquí) es que la primera línea del primer párrafo se encuentre toda ella en versalitas: El único modo de obtener este efecto en forma (semi) automática con LaTeX que he encontrado es […]
Liher Sanchez

Liher Sanchez
El blog de Liher

Ya esta mi página publicada, mis dudas

Hace justo un par de meses anuncié que iba a dedicarme a hacer paginas web. Desde entonces he estado preparando algunas cosas, entre ellas la pagina web personal que iba a usar para enseñar a los potenciales clientes y para intentar darme a conocer como diseñador web freelance en Internet. He estado pensando en muchas de las cosas que rodean a lo que quiero hacer, pero sin duda, una de las que mas me preocupa es como llevar todo lo referente a gestión financiera, ya que apenas poseo conocimientos al respecto. He estado mirando y pensando en varias opciones y una de ellas es adquirir alguno de los programas de gestión comercial que existen en Internet, concretamente he estado mirando unos de una empresa llamada Pentagest.  Me ha gustado mucho la web que tienen y ofrecen servicios tanto para empresas como para pequeños emprendedores, que es mi caso.

 

pentagest

 

He estado mirando un paquete llamado EBP Gestión comercial emprendedor en linea, con ese software, se puede llevar un pequeño negocio sin problemas, puedes llevar todo lo relacionado con tus clientes, proveedores, presupuestos, facturas y demás historias. Ademas de su precio veo varias ventajas de servicios de desarrollo de software Pentagest :

  • Al ser online, puedo acceder a toda la información en cualquier momento y lugar
  • Diseño intuitivo
  • Servicio de atención al cliente. Ante cualquier duda te solucionan el problema vía mail, teléfono o redes sociales

Como dan la opción de descargar una versión de prueba, lo voy a tantear.

Por otro lado os quería pedir ayuda y opinión es sobre la web personal que he hecho, la podéis visitar haciendo click en el siguiente enlace:

Mi objetivo era crear una pagina web sencilla donde los potenciales clientes puedan conocerme rápidamente. Hay un apartado que esta por terminar y es “Trabajos realizados”, donde me queda por poner algunas webs mas, eso lo iré haciendo con el paso de los días. De paso me gustaría, si podéis, que me deis vuestra opinión sobre como funciona la adaptabilidad en tablets y móviles, las pruebas que yo he hecho han sido satisfactorias, pero siempre viene bien corroborarlo.

 

lihersanchez

 

Y poco mas tengo que deciros por ahora. Solo que estoy muy nervioso y que tengo muchas ganas, ademas tengo algunos clientes con los que estoy “peleándome” y puede que me salgan ya entre 3 y 5 webs para hacer. Ojala todo salga bien y pueda colgar también esas webs en la sección de trabajos realizados y pueda darme de alta como autónomo para hacer todo por su camino.

Llevo mucho tiempo escuchando a gente de mi alrededor preguntarme que porque no me dedico a esto de los ordenadores con los conocimientos y experiencia que tengo. Me he decidido y solo deseo que todo salga bien, seria genial poder vivir de arreglar ordenadores y hacer webs, algo que llevo mucho tiempo pensando pero no terminaba de decidir si tirarme o no a la piscina.

También aprovecho a pediros ayuda y consejo sobre como empezar como freelance, cualquier consejo o ayuda sera siempre bienvenido y os lo agradecería.

Un saludo a todos.

Miércoles 23 de noviembre de 2016

Zorin OS, la alternativa libre definitiva a Windows 10

Son miles los usuarios que cada día descubren Linux o Unix, por un motivo u otro. De hecho el software libre cada día se está extendiendo un poco más, no sólo entre la gente que se dedica al sector informático, sino también a los usuarios de ordenador personal. El mayor temor de el paso a Linux, es pensar que no se va a saber utilizar correctamente, que es muy diferente al Windows al que
Gaspar Fernández

Gaspar Fernández
Poesía Binaria

Primeras decisiones para crear tu tienda online con WooCommerce

photo-1441984904996-e0b6ba687e04_2
Hoy en día, si queremos montar una tienda online tenemos un mundo de posibilidades. Lo primero será decidir si la vamos a montar nosotros o vamos a recurrir a una empresa o a personal especializado para ello. Todo depende del tiempo, dinero y conocimientos que tengamos para ello y de lo sinceros que hayamos sido con nosotros mismos en esos tres factores.
Como primera posibilidad, empezaré por la más dura, programar nuestra tienda, a mano, como unos valientes que somos y llevamos toda la vida programando o al menos el número de horas que hemos programado en nuestra vida se acerca a las 6 cifras (10h al día durante unos 11 años), aún así, seguramente nos basemos en algún framework para nuestro lenguaje de servidor preferido. Lo mejor y lo peor de este método es que si tenemos un problema, los únicos culpables somos nosotros, y puede que surjan muchos problemas. Otro factor positivo es que si nos embarcamos en un proyecto así vamos a aprender muchísimo y eso siempre es bueno. Lo malo, es que también vamos a tardar mucho, además, vamos a entrar en tiendas de la competencia que van a tener muchas cosas chulas, las querremos tener y podemos tardar mucho tiempo en implementarlas.

Otra posibilidad es utilizar un software de tienda online ya hecho y aquí soy siempre partidario de utilizar software libre o de código abierto, como Magento[1], Prestashop, OpenCart u otros muchos. Vamos a ir algo más rápido, todo el núcleo de nuestra tienda estará ya programado y es algo que tienen en común todas las tiendas. Gestión de categorías, productos, páginas estáticas, clientes, carro de la compra, envíos, pagos, facturación y más. Prácticamente tendremos que elegir un tema, buscar algunos plugins útiles (los hay gratis y de pago) y meter nuestros productos… Lo malo es que nos va a tocar programar, da igual cómo nos pongamos, pero al menos una línea de código tendremos que editar y lo malo es que para editar ese código tendremos que aprender un poco cómo funcionan dichas tiendas en línea por dentro. En mi caso particular, he utilizado Magento y al principio es un poco lioso cómo está programado.

He querido separar otra opción más, relacionada con la anterior: utilizar WordPress + WooCommerce[2]. Además, es la opción que recomiendo si no te quieres calentar mucho la cabeza. Primero porque es ligero, como WordPress y segundo porque es fácil de programar y de gestionar. Si has utilizado WordPress sabrás categorizar y gestionar productos, envíos, clientes y demás; y si has tocado alguna vez algo de código en WordPress, habrás visto que es muy fácil y además podrás aprovecharte del ecosistema WordPress, es decir, podrás utilizar shortcodes en los productos, utilizar plugins de WordPress y utilizar WP-CLI[3] para automatizar el proceso. Ni que decir tiene que a estas alturas toda tienda en línea que se precie tiene también un blog, y ya que tenemos WordPress instalado podemos utilizar éste para todo, y así tendremos el mismo look&feel sin que nos cueste mucho.

La ventaja de usar una solución libre o de código abierto

Personalmente creo que una solución libre siempre será más segura ya que, al estar su código disponible, todo el mundo puede ver sus fallos, y cualquiera puede aportar soluciones a muchos de los problemas que puedan surgir. Al mismo tiempo, muchas personas podrán colaborar en el desarrollo y la documentación de la plataforma. Con lo que tendremos en nuestras manos una aplicación muy robusta y muy probada.
Aunque pueda parecer contradictorio, las soluciones privativas (no nos permiten ver su código, ni mucho menos mejorarlo, suele ser ilegal hacer copias de ellas…), no suelen ser más seguras porque el número de personas que mire es mucho menor; es más, a veces suele haber problemas conocidos que tardan años en solucionarse.

Por otro lado, tenemos que tener presente el hecho de que libre no significa gratis. Aunque mucho software libre nos lo podemos descargar y utilizar sin restricciones, en ocasiones puede que tengamos que pagar por él (no es el caso de WordPress + WooCommerce, pero sí de algunos plugins); en muchos de los casos los plugins serán nuestros y podremos hacer lo que queramos con ellos, tal vez hayamos pagado por un periodo de soporte en el que recibiremos actualizaciones de los mismos. También puede darse el caso de que tengamos que pagar por WordPress + WooCommerce + plugins + configuración, en ese caso estaremos pagando por el trabajo de la persona que nos monta la tienda en línea, es decir estamos pagando por el tiempo invertido y los conocimientos de la persona que nos da el producto listo para utilizar y a nuestro gusto y no por el software.

Sobre Woocommerce

¿Quieres instalar un WordPress con Woocommerce en un tiempo récord? Contamos con que el directorio www que vamos a crear es donde nuestro servidor lee la web, accedemos por SSH a nuestro server y nos ponemos a teclear:

# Creamos base de datos y contraseña para mi base de datos
mysql -uroot -p
CREATE SCHEMA MyShop;
Query OK, 1 row affected (0.01 sec)
GRANT ALL PRIVILEGES ON MyShop.* TO ‘shopdbuser’@’10.1.1.%’ IDENTIFIED BY ‘internalpassword';
QUIT
Bye
# Descargamos e instalamos WordPress
wp core download --path=www --locale=es_ES
Creating directory ‘/var/www/myshop.com/www/’.
Downloading WordPress 4.6.1 (es_ES)…
Success: WordPress downloaded.
wp core config --dbname=”MyShop” --dbuser=”shopdbuser” --dbpass=”internalpassword” --dbhost=”localhost” --dbprefix=”shop_” --locale=es_ES
Success: Generated ‘wp-config.php’ file.
wp core install --url=”http://myshop.com/” --title=”Mi tienda online” --admin_user=admin --admin_password=”contraseña” --admin_email=”mi@correo.com”
Success: WordPress installed successfully.
# Instalamos y activamos WooCommerce
wp plugin install woocommerce
wp plugin activate woocommerce
# En muchos proveedores, es necesario establecer los permisos correctos para que todo vaya bien
sudo find -type d -exec chmod 775 {} \;
sudo find -type f -exec chmod 664 {} \;
sudo chown -R www-data *

Lo primero que hemos hecho ha sido crear una base de datos y un usuario (muchos proveedores ya nos dan esto), lo siguiente es configurar WordPress con dicha base de datos y establecer un usuario de administración (admin y contraseña no son buenas credenciales de acceso, sed originales). Lo siguiente será entrar en nuestro panel de administración dentro de nuestrodominio.com/wp-admin e identificarnos. Desde el minuto cero, Woocommerce nos guiará en la configuración:
Screenshot 17-11-2016-191140

Ya sólo nos quedará ponernos a insertar productos, para lo que nos puede ayudar un plugin como woocommerce-csvimport[4] y configurar las pantallas y textos de nuestra web (quiénes somos, política de cookies, envíos y demás textos legales). Ya que estamos sobre WordPress, y es muy fácil de manejar, podremos conseguirlo en muy poco tiempo y además podremos utilizar todas las ventajas de edición que nos proporciona WordPress: inserción de shortcodes en las páginas, inserción de vídeo, tweets y mucho más de una forma muy visual y atractiva. Además, disponemos de un gran catálogo de extensiones que podemos configurar tanto para WooCommerce (para el caso de productos, envíos, pagos, etc) como para WordPress (por si queremos botones sociales, cajas de Twitter, Facebook, caché de páginas, seguridad, etc).

Por si fuera poco, si te apetece o necesitas escribir algo de código, aprender cómo hacerlo es muy fácil y tenemos mucha documentación en los codex de WordPress[5] y de WooCommerce[6]. Admás, si quieres empezar a crear plugins para WordPress puedes empezar por aquí[7].

Alojamiento para tu tienda

Todo proyecto online necesita un alojamiento. Esto será un equipo informático conectado a Internet de alta velocidad las 24h, generalmente estos ordenadores suelen estar en centros de datos que realmente cuidan los equipos que mantienen controlando tanto temperatura, humedad y acceso físico entre otros. Además, los equipos suelen ser grandes y tener servicios de alimentación alternativa (por si se va la luz o hay variaciones en la línea), servicios de Internet alternativos (por si se desconecta de la red) y mantenimiento (personal que cambia los equipos si fallan, vigila ataques, hace copias de seguridad, etc); por eso no es buena idea alojar una web en un ordenador de casa (para hacer experimentos está bien, pero no para nuestro negocio).

Todo aquel que monta un negocio online, quiere que vaya bien, empieza con muchísima ilusión y considera su tienda como si fuera un hijo. Y como tal, no queremos que le falte de nada, y que tenga siempre buena salud, y cuando se pone malo, nos desesperamos y somos capaces de movilizar a medio Internet para recuperarlo. El hosting WooCommerce de SiteGround está aquí para ayudarnos. Por un lado, nos proporcionan tres planes que se adaptan a nuestras necesidades: tal vez al principio no tengamos muchas visitas, pero con el tiempo iremos creciendo, así nuestro hospedaje se adaptará a nosotros. Además:

  • Nos proporcionan un certificado SSL (recuerda que Google lleva un año penalizando webs no seguras y Chrome 56, en 2017, marcará las webs que no sean HTTPS como inseguras[8]).
  • Seguridad y actualizaciones de parte de SiteGround: Ellos se encargan de que tengamos todo actualizado, no entren intrusos y nuestro servicio se encuentre online todo el tiempo. Nosotros sólo tendremos que preocuparnos de vender, actualizar stock y ¡dar mucha guerra en redes sociales para que nuestros clientes conozcan que tenemos Black Friday!)
  • Si tenemos algún problema, les podemos llamar a cualquier hora (24×7) o contactar por chat. Por mi experiencia siempre que he hablado con ellos han sido muy amables y muy rápidos.
  • ¡¡Tenemos SSH!! Yo sin una terminal no sé vivir y si de verdad aprecias tu tiempo, te lo recomiendo, gracias a WP-CLI se pueden realizar muchísimas tareas de mantenimiento sobre WordPress en un tiempo récord. Además tener SSH nos puede ayudar a hacer algunos tipos de importaciones, descargas masivas de imágenes y automatizar procesos que a golpe de ratón serían eternos.
  • Almacenamiento SSD, PHP7 y mucho más para que tu web vuele.
  • Y mucho más…

Referencias

Al ser un post patrocinado, he decidido incluir todos los enlaces al final. Así los enlaces a la marca van primero, que seguro que le gusta a los buscadores.

Foto: Clark Street Mercantile

The post Primeras decisiones para crear tu tienda online con WooCommerce appeared first on Poesía Binaria.

Domingo 20 de noviembre de 2016

Usando Iron, un web framework para Rust

Rust cada día atrae a más desarrolladores. Es eficiente y es robusto. Mozilla ha sido la principal impulsora de este lenguaje para ser usado en entornos tan complejos como el propio Firefox.

Hoy vamos a introducirnos en el mundo del desarrollo web con Rust. Cuando la gente oye desarrollo web normalmente se piensa en lenguajes como PHP, Python, Ruby o JavaScript. Estos son lenguajes con los que es rápido desarrollar algo, aunque son mucho menos eficientes y es más fácil cometer errores debido a que son interpretados directamente. Un paso por encima tenemos a Java y C#, que cubren en parte las carencias de los otros lenguajes mencionados. Ha llegado la hora de hablar de Rust. Si bien es cierto que hay web frameworks en C++, nunca han sido muy populares. ¿Será Rust la opción que finalmente nos permita tener aplicaciones web con una eficiencia nativa?

Existen varios web frameworks en Rust, para este tutorial vamos a usar Iron, el más popular según Crates.io.

ironframework

Crear proyecto e instalar Iron

Lo primero que hay que hacer es crear un nuevo proyecto en Rust, lo hacemos gracias a Cargo.

cargo new --bin MundoRust

cd MundoRust

Ahora editamos el fichero Cargo.toml para añadir las dependencias que vamos a usar.

[package]
name = "MundoRust"
version = "0.1.0"
authors = ["Adrián Arroyo Calle"]

[dependencies]
iron = "0.4.0"
router = "0.4.0"
staticfile = "0.3.1"
mount = "0.2.1"

Ahora obtenemos las dependencias especificadas con Cargo.

cargo run

Hola Mundo con Iron

Vamos a empezar a programar en Rust. Vamos a hacer una simple aplicación que devuelva “Hola Rustáceos” por HTTP.

Editamos el archivo src/main.rs

extern crate iron;

use iron::prelude::*;

fn hola(_: &mut Request) -> IronResult<Response> {
    Ok(Response::with((iron::status::Ok, "Hola Rustaceos")))
}

fn main() {
    Iron::new(hola).http("0.0.0.0:80").unwrap();
}

holarustaceos

Usando router para el enrutamiento

Hemos hecho un pequeño servidor HTTP con Iron. Pero nos falta algo, que sea capaz de manejar rutas. Que miweb.com/hola no sea lo mismo que miweb.com/adios. Iron por defecto no trae enrutador, pero es muy habitual usar Router, que ya hemos instalado antes por conveniencia.

extern crate iron;
extern crate router;

use iron::prelude::*;
use router::Router;

fn get_page(r: &mut Request) -> IronResult<Response>{
    let path = r.url.path();
    Ok(Response::with((iron::status::Ok, format!("Hola, peticion GET {}",path[0]))))
}

fn submit(_: &mut Request) -> IronResult<Response>{
    Ok(Response::with((iron::status::Ok, "Peticion POST")))
}

fn main() {
    let mut router = Router::new();

    router.get("/:page", get_page, "page");
    router.post("/submit", submit, "subdmit");

    Iron::new(router).http("0.0.0.0:80").unwrap();

}

getiron

Archivos estáticos

Para gestionar los ficheros estáticos vamos a usar staticfile y mount, otras dos librerías para Iron.

extern crate iron;
extern crate router;
extern crate staticfile;
extern crate mount;

use iron::prelude::*;
use router::Router;
use staticfile::Static;
use mount::Mount;

fn get_page(r: &mut Request) -> IronResult<Response>{
    let path = r.url.path();
    Ok(Response::with((iron::status::Ok, format!("Hola, peticion GET {}",path[0]))))
}

fn main() {
    let mut router = Router::new();

    router.get("/:page", get_page, "page");

    let mut mount = Mount::new();
    mount.mount("/public",Static::new("static/"));
    mount.mount("/",router);

    Iron::new(mount).http("0.0.0.0:80").unwrap();
}

ironstaticfile

 

Hemos dado nuestros primeros pasos en Iron, un web framework para Rust. Iron es completamente modular y soporta muchas más cosas que aquí no hemos visto. Gran parte de su funcionalidad se implementa a través de middleware, como en otros web frameworks populares.

 

 

 

La entrada Usando Iron, un web framework para Rust aparece primero en Blog - Adrianistan.eu.

Jueves 17 de noviembre de 2016

BlogDRAKE: Resumen de Reunion del 16 de Noviembre

Miércoles 16 de noviembre de 2016

Cuatro alternativas a la consola de Linux

Linux está basado en los sistemas operativos tipo UNIX que se basan en el software totalmente libre, como todos los sistemas operativos basados en éste, hay que pasar muchas horas delante de una consola o terminal para trabajar en modo texto. Ya seas usuario normal o administrador de sistemas no te vas a librar de pasar por este trance para realizar cualquier operación de configuración o

Sábado 12 de noviembre de 2016

Pedro L. Lucas

Pedro L. Lucas
Cartas de Linux

Ejecuta un comando de forma automática cada vez que guardes un archivo

A veces hay que escribir comandos en consola para compilar o procesar unos archivos que se han modificado. Es tremendamente útil que esta operación se haga de forma automática. Por ejemplo, se están editando unos archivos en LATEX, cada vez que guardemos el archivo podemos conseguir que se genere el PDF correspondiente y nos lo muestre de forma totalmente automática.

Este proceso se puede automatizar usando el comando inotifywait. Este comando nos avisa de las modificaciones que se produzcan en el o los archivos que se le indiquen. Para usarlo, se puede usar un script como el que se muestra a continuación. En archivo se introduce el nombre del archivo que se quiere vigilar. En comando el comando que se ejecutará cada vez que haya una modificación:

b=0
inotifywait -m --event modify archivo | while read a ;
do
  if [[ $b -eq 0 ]] ; then
    b=1
  else
    echo $a
    comando
    b=0
  fi
done

Tecleando en un terminal:

man inotifywait

Tendremos disponible la documentación en la que se puede encontrar más opciones y ejemplos  de uso.


Martes 08 de noviembre de 2016

Raúl González Duque

Raúl González Duque
Linux – Mundo Geek

¿Cuántos usuarios de Linux se necesitan para cambiar una bombilla?

Sea merecida o no, lo cierto es que los usuarios y desarrolladores de GNU/Linux tenemos fama de arrogantes, extremistas y de perdernos en los detalles. Desde el Proyecto GNU se toman con humor estos estereotipos calculando cuántos usuarios de Linux se necesitarían para cambiar una bombilla.

  • 1 para publicar un hilo en la lista de correo informando de que la bombilla se ha fundido
  • 1 para sugerir reiniciar la bombilla usando la línea de comandos
  • 1 para quejarse de que el usuario rompiera la bombilla
  • 1 para preguntar qué bombilla se debería instalar
  • 1 para aconsejar que no se use la palabra “fundida” para referirse a una bombilla rota, porque puede interpretarse que la bombilla se ha prendido fuego, en lugar de haberse estropeado por un exceso de corriente eléctrica
  • 25 para sugerir todos los tipos de bombilla imaginables
  • 5 para para decir que la bombilla fundida es un fallo de origen
  • 1 novato para sugerir instalar una bombilla de Microsoft
  • 250 usuarios para inundar el correo del susodicho novato
  • 300 para decir que la bombilla de Microsoft se pondría azul y tendrías que reiniciarla constantemente para que volviera a funcionar
  • 1 antiguo usuario de GNU/Linux, que todavía frecuenta el foro, para sugerir una iBombilla de Apple, que tiene un diseño fresco e innovador y sólo cuesta 250$
  • 20 para decir que las iBombillas no son libres, y que tienen muchas menos funcionalidades que una bombilla estándar 20 veces más barata
  • 15 para sugerir una bombilla nacional
  • 30 para decir que las bombillas nacionales son copias de las bombillas extranjeras y que no ofrecen nada nuevo
  • 23 para discutir si la bombilla debe ser blanca o transparente
  • 1 para recordar a todo el mundo que el nombre correcto es GNU/Bombilla
  • 1 para decir que las bombillas son sólo para usuarios de Window$ y los usuarios de GNU/Linux de verdad no tienen miedo a la oscuridad
  • 1 para anunciar finalmente el modelo de la bombilla elegida
  • 217 para descartar el modelo escogido y sugerir otro
  • 6 para quejarse de que el modelo elegido tiene elementos propietarios, y que debería usarse otro
  • 20 para decir que una bombilla 100% libre sería incompatible con el interruptor
  • Los mismos 6 anteriores para sugerir cambiar el interruptor por uno compatible
  • 1 para chillar “¡DEJAD DE DISCUTIR Y CAMBIAR LA P*#@!%¡# BOMBILLA DE UNA VEZ, POR EL AMOR DE DIOS!”
  • 350 para preguntar al usuario anterior a qué Dios se refiere, y si tiene pruebas empíricas de su existencia
  • 1 para explicar cómo funciona la electricidad y por qué una bombilla eléctrica es ineficiente
  • 1 para decir que no se puede confiar en una bombilla fabricada por una corporación y que deberíamos confiar en bombillas hechas por la comunidad
  • 1 para publicar un enlace a un archivo ODF explicando cómo construir una bombilla desde cero
  • 14 para quejarse del formato del archivo anterior, pidiendo que se envíe en txt o LaTeX
  • 5 para decir que no les gustó la decisión y van a hacer forks de la instalación eléctrica de la casa para instalar una lámpara mejor
  • 1 para publicar una serie de comandos a introducir para cambiar la bombilla
  • 1 para comentar que ejecutó los comandos y obtuvo un mensaje de error
  • 1 para aconsejar que los comandos deberían ejecutarse como root

Y finalmente:

  • El padre del usuario original, que mientras todos estaban discutiendo, se acercó a la tienda y compró la bombilla más barata que vendían

Lunes 07 de noviembre de 2016

Raúl González Duque

Raúl González Duque
Linux – Mundo Geek

Los 10 comandos más útiles de Linux

CommandlineFu es una web donde los usuarios pueden enviar sus comandos Linux favoritos, añadir comentarios, y votar los comandos enviados por otros usuarios; un recurso imprescindible si queréis convertiros en verdaderos expertos en el uso de la consola. Y para muestra, un botón: estos son los 10 comandos más votados por sus usuarios.

sudo !!

Ejecuta el último comando introducido como root.

python -m SimpleHTTPServer

Inicia un servidor web que sirve los archivos del directorio actual en http://localhost:8000

^foo^bar

Ejecuta el último comando, reemplazando el texto “foo” por “bar”

Ctrl + X, Ctrl E

Invoca un editor de textos en el que poder escribir el comando que vamos a ejecutar. El comando se ejecutará una vez se cierre el editor

Alt + .

Inserta el último argumento utilizado en el punto en que esté situado el cursor

reset

Resetea la consola

mount | column -t

Muestra los puntos de montaje actuales con un formato amigable para la lectura

echo “ls -l” | at midnight

Ejecuta un comando en el momento indicado

curl ip.appspot.com

Descarga el documento de http://ip.appspot.com para mostrar la IP externa del equipo

man ascii

Muestra la página de ayuda con la tabla de caracteres ASCII

Sábado 05 de noviembre de 2016

Usar la vulnerabilidad DirtyCoW para convertirse en root en Linux

Hace ya unas semanas salió a la luz la vulnerabilidad conocida como DirtyCoW, registrada bajo el nombre de CVE-2016-5195. Esta vulnerabiliad permite a cualquier usuario con acceso a la máquina de forma limitada llegar a convertirse en root y tomar el control total de la máquina. Tal y como nos decía La Mirada del Replicante:

Clasificada de forma oficial como CVE-2016-5195 y descubierto por Phil Oester –un experto en seguridad y desarrollador de Linux–, Dirty COW (copy-on-write) permite una escalada de privilegios de forma remota o local.

….

La vulnerabilidad ha estado presente durante muchos años (desde la versión 2.6.22 del kernel, liberada en 2007) e incluso Linus fue consciente de ella en su momento.

Hoy vamos a ver como aprovechar esta situación. Válida para todos los sistemas con kernel Linux, incluido Android (aunque allí el procedimiento no es tan sencillo).

dirty-cow

Comprobando requisitos

En primer lugar la vulnerabilidad requiere disponer de acceso a la máquina con un usuario no-privilegiado. Puede ser de forma local o remota vía SSH, pero este requisito ya hace que a muchos servidores no les afecte de manera directa.

La vulnerabilidad además ya se encuentra parcheada en muchas distros GNU/Linux y no se podrá realizar. Es por tanto requisito que la versión del kernel esté entre 2.6.22 y 4.4.26. Puedes comprobar la versión del kernel con el comando uname.

uname -a

Descargando el exploit

Ahora el siguiente paso es descargar el exploit. Yo voy a usar el exploit diseñado por Gabriele Bonacini y que lo podéis descargar desde GitHub, bien con un fichero ZIP o bien mediante el programa Git. Puedes descargarlo desde la línea de comandos así:

wget -O dirtycow.zip https://github.com/AdrianArroyoCalle/CVE-2016-5195/archive/master.zip

unzip dirtycow.zip

cd CVE-2016-5195-master

Ahora debemos compilar el pequeño programa en C++ que se ha descargado. Simplemente escribimos en la terminal:

make

Ejecutando el exploit

Ya estamos listos para ejecutar el exploit. Abrimos desde la terminal el programa que acabamos de compilar.

./dcow

Este exploit, si funciona correctamente, nos dirá por pantalla que la contraseña del root es dirtyCowFun. Si tarda demasiado el programa entonces el exploit no ha funcionado. ¿Qué es lo que ha hecho? Aprovechando la vulnerabilidad Dirty CoW ha logrado cambiar, solo en memoria, el contenido del archivo /etc/passwd, que es donde Linux guarda las contraseñas. Este cambio como repito solo se produce en la memoria, pues el archivo físico en el disco sigue inalterado. Si reiniciamos la máquina habrá que repetir el proceso. Esto tiene la gravedad de que es fácil no darse cuenta de si la vulnerabilidad ha sido explotada, el atacante simplemente reinicia la máquina con reboot y la contraseña del root vuelve a su estado habitual.

Sabiendo esto, ya podemos escribir con total seguridad

su

Y cuando nos pregunte la contraseña, escribimos dirtyCowFun.

Enhorabuena, si has llegado hasta aquí conseguiste escalar privilegios y ya eres root. Ahora no seas demasiado malo, te recuerdo que un gran poder conlleva una gran responsabilidad.

La entrada Usar la vulnerabilidad DirtyCoW para convertirse en root en Linux aparece primero en Blog - Adrianistan.eu.

Jueves 03 de noviembre de 2016

Tutorial de WebExtensions (II) – Popup y Tabs

Continuamos con el tutorial de WebExtensions, hoy veremos un elemento muy útil para muchas extensiones que es el popup.

¿Qué es el popup?

El popup es un panel desplegable que se acciona al pulsar un botón de acción. Este panel es una página HTML que puede contener código JavaScript.

popup

El popup es el elemento que permite al usuario un mayor control sobre la extensión y es ideal tanto para mostrar información como para contener acciones. De hecho, WebExtensions limita el número de botones de acción que puede crear una extensión a uno. Si queremos simular tener más botones deberemos usar un popup que despliegue un pequeño menú.

Definir el popup en manifest.json

Para definir el popup tenemos que indicar la ubicación del fichero HTML correspondiente al popup.

	"browser_action" : {
		"default_icon" : "icons/icono_guay.png",
		"default_title" : "Mi PopUp guay",
		"default_popup" : "popup/index.html"
},

Con eso ya tenemos definido el popup. Se mostrará el botón en la barra superior y al hacer click se abrirá el popup.

El PopUp en sí

El PopUp es un fichero HTML sin el mayor misterio. Para definir el tamaño del PopUp usaremos CSS:

body{
    width: 400px;
    height: 400px;
}

Y el navegador adaptará el PopUp a esas dimensiones. A ese archivo HTML le podemos añadir archivos JavaScript mediante el procedimiento habitual en la web, vía una etiqueta script. Lo interesante viene en estos archivos de JavaScript pues cuentan con más privilegios. Desde ellos podemos acceder a las APIs retringidas a extensiones así como librarnos de limitaciones impuestas a las webs (como la política que bloquea los XMLHttpRequests ejecutados a dominios ajenos a nuestra página).

Para usar las APIs restringidas debemos pedir permiso en el fichero manifest.json. Por ejemplo, vamos a jugar con las pestañas. Para ello usamos los permisos tabs y activeTab.

    "permissions" : ["tabs","activeTab"],

Tabs (pestañas) en WebExtensions

La API se encuentra en chrome.tabs y dispone de varios métodos y eventos. Vamos a ver los más importantes:

  • chrome.tabs.query – Obtener información de las pestañas
    • Este método es muy flexible, lo podemos comparar a hacer un SELECT en SQL, pues obtiene una lista de pestañas que cumplen los parámetros que hemos indicado. Por ejemplo para comprobar la pestaña actual, usaremos la propiedad active:
      chrome.tabs.query({"active": true},function(tabs){
          var tab = tabs[0];
          // tab es la pestaña actualmente activa 
      });
      

      Otra opción muy interesante es para averiguar que pestañas tienen abierta una URL que cumple un patrón. Además los parámetros de búsqueda se pueden combinar:

      chrome.tabs.query({"url" : "*://*.adrianistan.eu/*", "status" : "loading", "muted" : true},function(tabs){
        // tabs (que puede estar vacío) contiene todas las URL que estan en un adrianistan.eu (subdominios incluidos),
        // se encuentran cargando
        // y el usuario ha silenciado su sonido
      });
      
  • chrome.tabs.create – Permite crear nuevas pestañas
    • Su uso básico es muy simple
      chrome.tabs.create({"url" : "https://blog.adrianistan.eu/"},function(tab){
        // tab es la pestaña creada
      });
      
  • chrome.tabs.executeScript – Esta función permite inyectar a la pestaña un script de contenido (Content Script).
    • Ahora no vamos a entrar en como se realizaría la comunicación entre los scripts Background y los Content. El código se puede pasar por una cadena de texto o por un archivo, siendo preferible esta última opción. Se puede especificar además cuando queremos que se ejecute dentro del ciclo de carga de la pestaña.
      chrome.tabs.executeScript(tab.id (opcional), {"code" : "alert('Hola');"},function(){
      
      });
      
      O
      
      chrome.tabs.executeScript({"file" : "miarchivo.js", "runAt" : "document_start"},function(){
      
      });
      
  • chrome.tabs.insertCSS – Permite inyectar CSS en la pestaña
    • Su uso es exactamente igual al de chrome.tabs.executeScript
      chrome.tabs.insertCSS({"file" : "misestilos.css"},function(){
      
      });
      
  • chrome.tabs.sendMessage – Enviar un mensaje a la pestaña
    • Hasta ahora no hemos visto la separación entre background y content scripts. Esta función permite enviar datos desde los scripts background a los content, que tendrán una función de escucha. La menciono, pero lo veremos más adelante en profundidad.

Por último, veamos algunos de los eventos que puede generar la API.

  • chrome.tabs.onUpdated – Es llamado cada vez que una pestaña sufre una modificación en sus datos (cambio de URL, quitar el sonido, finalizar una carga, etc)
    • Es muy posible que necesitemos filtrar el contenido que nos da, para fijarnos si se ha producido en una URL que nos interesa o en alguna condición relevante. Eso no obstante, es responsabilidad del programador.
      chrome.tabs.onUpdated.addListener(function(tabId,changeInfo,tab){
        // el objeto changeInfo presenta una estructura similar al de búsqueda con chrome.tabs.query
        // este objeto solo contiene valores para aquellos parámetros que han cambiado
        // con tab podemos acceder a la pestaña al completo
      });
      

Con esto ya podemos hacer extensiones interesantes, la APIs de PopUp y de Tabs son de las más usadas en WebExtensions.

La entrada Tutorial de WebExtensions (II) – Popup y Tabs aparece primero en Blog - Adrianistan.eu.

Lunes 31 de octubre de 2016

BlogDRAKE: ¡Un fondo de pantalla a lo Halloween!

Domingo 30 de octubre de 2016

Marcelo Fortino

Marcelo Fortino
Fortinux

Tutorial usar git-annex para sincronizar archivos entre dispositivos GNU/Linux

Tutorial usar git-annex como repositorio de archivos Una forma de tener nuestros archivos sincronizados entre el notebook, desktop y otros dispositivos es usar como herramienta git-annex. Git-annex gestiona archivos con Git sin verificar el contenido de los mismos. Esto permite trabajar con archivos grandes usando repositorios sincronizados.

Sábado 29 de octubre de 2016

BlogDRAKE: Lista de soluciones a USB lentos cuando se copian uno o varios archivos grandes de mas de una Giga.

Domingo 16 de octubre de 2016

Marcelo Fortino

Marcelo Fortino
Fortinux

Tutorial instalar Plone CMS en Ubuntu server

En este tutorial veremos como podemos instalar el gestor de contenidos Plone en un servidor Ubuntu 14.04 o 16.04. Plone es un gestor de contenidos basado en el servidor de aplicaciones Zope que es bastante utilizado como Intranet en gobiernos y empresas, entre ellos, el gobierno brasileño, la universidad de Oxford (Reino Unido) o Google.

Sábado 01 de octubre de 2016

David Moreno

David Moreno
dm's blog

Thanks Debian

I sent this email to debian-private a few days ago, on the 10th anniversary of my Debian account creation:

Date: Fri, 14 Aug 2015 19:37:20 +0200
From: David Moreno 
To: debian-private@lists.debian.org
Subject: Retiring from Debian
User-Agent: Mutt/1.5.23 (2014-03-12)

[-- PGP output follows (current time: Sun 23 Aug 2015 06:18:36 PM CEST) --]
gpg: Signature made Fri 14 Aug 2015 07:37:20 PM CEST using RSA key ID 4DADEC2F
gpg: Good signature from "David Moreno "
gpg:                 aka "David Moreno "
gpg:                 aka "David Moreno (1984-08-08) "
[-- End of PGP output --]

[-- The following data is signed --]

Hi,

Ten years ago today (2005-08-14) my account was created:

https://nm.debian.org/public/person/damog

Today, I don't feel like Debian represents me and neither do I represent the
project anymore.

I had tried over the last couple of years to retake my involvement but lack of
motivation and time always got on the way, so the right thing to do for me is
to officially retire and gtfo.

I certainly learned a bunch from dozens of Debian people over these many years,
and I'm nothing but grateful with all of them; I will for sure carry the project
close to my heart — as I carry it with the Debian swirl I still have tattooed
on my back ;)

http://damog.net/blog/2005/06/29/debian-tattoo/

I have three packages left that have not been updated in forever and you can
consider orphaned now: gcolor2, libperl6-say-perl and libxml-treepp-perl.

With all best wishes,
David Moreno.
http://damog.net/


[-- End of signed data --]

I received a couple of questions about my decision here. I basically don’t feel like Debian represents my interests and neither do I represent the project – this doesn’t mean I don’t believe in free software, to the contrary. I think some of the best software advancements we’ve made as society are thanks to it. I don’t necessarily believe on how the project has evolved itself, whether that has been the right way, to regain relevancy and dominance, and if it’s remained primarily a way to feed dogmatism versus pragmatism. This is the perfect example of a tragic consequence. I was very happy to learn that the current Debian Conference being held in Germany got the highest attendance ever, hopefully that can be utilized in a significant and useful way.

Regardless, my contributions to Debian were never noteworthy so it’s also not that big of a deal. I just need to close cycles myself and move forward, and the ten year anniversary looked like a significant mark for that.

Poke me in case you wanna discuss some more. I’ll always be happy to. Specially over beer :)

Peace.

Martes 13 de septiembre de 2016

Gorka Urrutia

Gorka Urrutia
Nideaderedes

Nuevos capítulos de la serie Eloquent (Laravel)

Esta semana he subido a Gulvi dos nuevos capítulos del curso de Eloquent (el ORM de Laravel):

Y también tenéis un nuevo vídeo de introducción a Eloquent.

Gulvi

Lunes 05 de septiembre de 2016

José María Morales Vázquez

José María Morales Vázquez
tecnología – Un lugar en el mundo…

Probando el Aruba Cloud Server Smart de 1€

hosting Por fin he tenido tiempo de hacer una primera prueba medianamente seria con mis nuevos VPS de Aruba y, para matar dos pájaros de un tiro, he instalado una instancia de Chamilo LMS para evaluar si me sirve como aula virtual para el curso de este año. He usado el VPS más pequeño de la familia: el de 1Gb de RAM y 1 core de CPU por 1€ al mes. Además, si funcionan bien el hecho de que ofrezcan dos meses gratis me permitirá usarlo con mis alumnos para algunas prácticas sin necesidad de que realicen desembolso alguno. Si, los que tenemos poco tiempo disponible tenemos que aprovechar al máximo el que tenemos 🙂

No voy a describir todo el proceso en detalle y con pantallazos porque es bastante fácil e intuitivo (casi siempre) y si ya has trabajado con algún otro VPS no tendrás problemas. Lo primero que tienes que elegir una vez has hecho login es el datacenter dentro del cual quieres crear tu máquina. Yo escogí uno de los dos italianos porque es un Tier IV y eso mola y porque tiene un 100% de uptime desde su creación en 2011. Posiblemente el francés me daría mejores respuestas desde nuestro país, pero ya tendré tiempo de probarlo. Luego eliges el tamaño de VPS y el sistema operativo a instalar y a esperar. Aquí me he encontrado los dos primeros “inconvenientes”. Por un lado, dentro la lista de sistemas operativos a elegir sólo hay tres opciones de 32 bits (os recuerdo que instalar un sistema operativo de 64 bits en una máquina con menos de 4 gigas de RAM es bastante ineficiente): debian 7, CentOS 6 y Ubuntu 12.04, todas ellas obsoletas… Así que como mi idea era trabajar con Debian 8 instalé la versión de Debian 7 32 bits con idea de usar luego el procedimiento estándar de upgrade. En una máquina nueva y sin dependencias ni software actualizado no debería de dar problemas y, efectivamente, no lo hizo.

El segundo inconveniente fue que la creación de la máquina virtual tardó más de lo que me esperaba. Alrededor de una hora o tal vez algo mas. Ya sabeis como es la impaciencia en estas cosas. Nos pasamos meses pensando en cambiar de hosting y en elegir el adecuado y luego queremos una instalación en segundos 🙂 Pero una vez instalada todo fue como la seda. Hice un login en mi Debian 7, seguí el procedimiento que he enlazado antes y todo listo. Y este es el aspecto que presenta el panel de control web de la VPS (Como siempre, pulsa sobre las imágenes para verlas con mayor calidad):

Panel de control de Aruba Cloud

Como se aprecia, la solapa de “Edit/Upgrade” aparece deshabilitada. Esto es debido a que sólo se puede actualizar la máquina cuando está apagada y, según pone en las FAQs, hacia un modelo mayor.

La primera comparación inevitable con mi anterior hosting es la relativa a los componente virtualizados. Para evaluar esto de forma gráfica instalé phpsysinfo. Estos son los resultados obtenidos:

phpsysinfo en el Aruba Cloud Smart de 1Gb

Y estos los de mi hosting de Gigas (con dos cores y 4 Gigas de RAM). Como se ve, la CPU virtualizada en Aruba Cloud es superior a la que nos proporciona Gigas. Ya veremos si esto se mantiene (o mejora) cuando probemos un VPS de dos cores.

phpsysinfo en el VPS de Gigas

Para monitorizar los recursos he instalado munin y por el momento todo parece muy estable. Lógicamente la máquina apenas ha tenido uso estos días, así que no hay sorpresas con esto. Ya os contaré que tal va cuando se enfrente a una carga moderada:

munin en el Aruba Cloud Smart de 1Gb

Y poco mas. Lo siguiente será trasladar este blog a un VPS más robusto o, incluso, haciendo una separación en dos capas. Ya veré. Y queda pendiente también que os cuente mis primeras impresiones con Chamilo y la configuración necesaria para que funcione con nginx, que no es trivial. Para la próxima. Salud y bienvenidos de vuelta al curso 😉

Artículo Original: .

Este artículo pertenece a Un lugar en el mundo... Si quieres ver actualizaciones y comentarios interesantes visita el texto original en: Probando el Aruba Cloud Server Smart de 1€ || Hospedado en un Cloud VPS de Gigas.

Martes 30 de agosto de 2016

Gorka Urrutia

Gorka Urrutia
Nideaderedes

Gulvi – la web para desarrolladores web

Ya se acerca el fin del veranito. Es una época en parte triste porque se acaban los paseos por la playa, las noches de fiestuqui, el calorcito, y todo lo bueno que nos trae. Pero también es una época emocionante porque es cuando suelen aparecer un montón de proyectos nuevos.

Así que, entre barbacoa y barbacoa, este verano he estado preparando uno de mis nuevos proyectos: Gulvi.com una plataforma de formación online para desarrolladores web.

En esta plataforma comparto mis conocimientos y experiencia como desarrollador de un montón de años. Está centrada, sobre todo, en PHP y Laravel (que es el framework que más uso desde hace ya un tiempo) pero hay otro montón de temas que voy a tratar:

El sistema de aprendizaje será a través de vídeos, artículos, ejemplos de código y recomendaciones.

Gulvi - formación para desarrolladores web

Gulvi – Vitaminas para desarrolladores web

Lunes 29 de agosto de 2016

Juanje Ojeda

Juanje Ojeda
Nada de particular

Ser menos sedentarios en esta vuelta al cole

Como ya comenté en la entrada anterior, me estoy centrando en la salud y en la manera de hacer que la gente (sobre todo frikis sedentarios como yo :-P ) mejore su salud.

Últimamente escribo bastante sobre el tema, en el otro blog, pero me gustaría hacer un pequeño resumen y enlazar directamente aquellos artículos que puedan ser más útiles, para ahorrarles tiempo.

En el artículo «Saliendo del sedentarismo», planteo 3 ejercicios muy concretos y fáciles poner en marcha para empezar.
Buscando ser lo más efectivos posibles, busqué aquellos tres «ejercicios» que consiguieran mayores resultados, con el menos esfuerzo.

En el artículo se explican y se enlazan también otros artículos que desarrollan dichos ejercicios.

Otro artículo que les puede interesar, no sólo para empezar a ser menos sedentarios, sino para empezar cualquier objetivo que se planteen es el de «Sedentarios Anónimos».

Explica algunas estrategias muy concretas que pueden ayudarnos a no desistir por el camino y a conseguir llegar a nuestra meta.

Con esto tienen suficiente para hacer una vuelta al cole menos sedentaria y mejorar su salud en este nuevo «curso» ;-)
David Moreno

David Moreno
dm's blog

Webhook Setup with Facebook::Messenger::Bot

The documentation for the Facebook Messenger API points out how to setup your initial bot webhook. I just committed a quick patch that would make it very easy to setup a quick script to get it done using the unreleased and still in progress Perl’s Facebook::Messenger::Bot:

use Facebook::Messenger::Bot;

use constant VERIFY_TOKEN => 'imsosecret';

my $bot = Facebook::Messenger::Bot->new(); # no config specified!
$bot->expect_verify_token( VERIFY_TOKEN );
$bot->spin();

This should get you sorted. What endpoint would that be, though? Well that depends on how you’re giving Facebook access to your Plack’s .psgi application.

Domingo 21 de agosto de 2016

David Moreno

David Moreno
dm's blog

WIP: Perl bindings for Facebook Messenger

A couple of weeks ago I started looking into wrapping the Facebook Messenger API into Perl. Since all the calls are extremely simple using a REST API, I thought it could be easier and simpler even, to provide a small framework to hook bots using PSGI/Plack.

So I started putting some things together and with a very simple interface you could do a lot:

use strict;
use warnings;
use Facebook::Messenger::Bot;

my $bot = Facebook::Messenger::Bot->new({
    access_token   => '...',
    app_secret     => '...',
    verify_token   => '...'
});

$bot->register_hook_for('message', sub {
    my $bot = shift;
    my $message = shift;

    my $res = $bot->deliver({
        recipient => $message->sender,
        message => { text => "You said: " . $message->text() }
    });
    ...
});

$bot->spin();

You can hook a script like that as a .psgi file and plug it in to whatever you want.

Once you have some more decent user flow and whatnot, you can build something like:



…using a simple script like this one.

The work is not finished and not yet CPAN-ready but I’m posting this in case someone wants to join me in this mini-project or have suggestions, the work in progress is here.

Thanks!

Sábado 30 de julio de 2016

José María Morales Vázquez

José María Morales Vázquez
tecnología – Un lugar en el mundo…

Aruba Cloud: Nos mudamos de hosting

hosting Pues eso, que tenemos mudanza en ciernes. Llevo ya casi cuatro años en Gigas y sigo tan contento como el primer día, conste. Más si cabe. Pero en Aruba Cloud me han ofrecido un bono gratuito de prueba y voy a aprovechar para hacer algunos cambios.

Aruba es una empresa de hosting con datacenters en Italia, Francia, Reino Unido y la República Checa y distintos niveles de servicio que empiezan desde 1€/mes por una máquina con 1 core y 1 Giga de RAM. Ya iremos contando por aquí lo que vamos haciendo, pero valga esta entrada como propósito de intenciones… 😉

NOTA: De cara al público tienen también un servicio de prueba gratuita que te permitiría probar uno de estos VPS de 1€/mes durante dos meses.

Artículo Original: .

Este artículo pertenece a Un lugar en el mundo... Si quieres ver actualizaciones y comentarios interesantes visita el texto original en: Aruba Cloud: Nos mudamos de hosting || Hospedado en un Cloud VPS de Gigas.

Lunes 25 de julio de 2016

Ramón Ramón Sánchez

Ramón Ramón Sánchez
Software Libre y Comunicación

Los datos abiertos generan transparencia, riqueza y empleo

Las políticas de datos abiertos, fruto del esfuerzo de organizaciones sociales y administraciones públicas ha supuesto una revolución en cuanto a la apertura de información, y lo que es más importante, a la generación de valor en torno a datos que hasta no hace mucho apenas se les daba uso. Existen en la actualidad más de 2500 portales de datos... Leer más »

La entrada Los datos abiertos generan transparencia, riqueza y empleo aparece primero en Software Libre y Comunicación.

Sábado 23 de julio de 2016

Ramón Ramón Sánchez

Ramón Ramón Sánchez
Software Libre y Comunicación

¡Cuidado con el “secuestro digital”! 3 medidas para proteger tus cuentas de redes

Hace un par de semanas el director de una cadena de restaurantes llegó a nosotros desesperado. Su anterior Community Manager había dejado la empresa y se había llevado las claves de las cuentas de redes sociales y de los correos a las cuales estaban vinculadas. El hombre estaba ¡ilocalizable!             La solicitud del cliente fue:... Leer más »

La entrada ¡Cuidado con el “secuestro digital”! 3 medidas para proteger tus cuentas de redes aparece primero en Software Libre y Comunicación.

Miércoles 20 de julio de 2016

Ramón Ramón Sánchez

Ramón Ramón Sánchez
Software Libre y Comunicación

¿Windows 10? Una última oportunidad para tu viejo ordenador, se llama Linux y no te cuesta dinero.


Warning: preg_replace(): Unknown modifier '/' in /home/bftlcbcg/public_html/blog/wp-content/plugins/jetpack/class.photon.php on line 346

¿Windows 10? Una última oportunidad para tu viejo ordenador, se llama Linux y no te cuesta dinero. Tienes un ordenador al que le tienes cariño, has trabajado con él durante años, tienes en él tu software instalado, todo funciona bien para ti, no necesitas cambiarlo. Pero, la edad no perdona a los sistemas operativos, si tienes Windows XP, Windows Vista,... Leer más »

La entrada ¿Windows 10? Una última oportunidad para tu viejo ordenador, se llama Linux y no te cuesta dinero. aparece primero en Software Libre y Comunicación.

Martes 12 de julio de 2016

Gorka Urrutia

Gorka Urrutia
Nideaderedes

Programación orientada a objetos en PHP 5: Herencia

Otra entrega más del curso de programación orientada a objetos en PHP. Estoy trabajando en el vídeo, estará listo en un par de días.

 

Programación orientada a objetos en PHP 5: Herencia

 

Domingo 03 de julio de 2016

Juanje Ojeda

Juanje Ojeda
Nada de particular

Cambio de profesión

El 8 de noviembre del año pasado cumplí 38 años y me siento mejor de lo que me sentía con 20, así que estoy muy contento :-)

Además, celebré mi cumpleaños regalándome un cambio de profesión. He vuelto a una de mis 2 grandes pasiones, el cuerpo humano y la educación física.

Después de estar un tiempo reciclándome (hace 15 años que estudié Ciencias de la Actividad Física y del Deporte y han cambiado muchas cosas desde entonces...) y dedicándome a mejorar mi salud, me decidí a tirarme a la piscina y dejar los ordenadores para dedicarme a las personas.

Hacía mucho que no estaba tan motivado con algo :-)

Ya llevo casi un año metido en esa aventura y cada día más motivado. Aprendo mucho cada día e intento compartir ese conocimiento en mi nuevo blog profesional:
Juanje Ojeda

La mayoría de mis clientes son personas con mi antiguo perfil. Personas sedentarias que trabajan todo el día con ordenadores y que les cuesta encontrar tiempo y fuerza de voluntad para tomar las riendas de su salud.
Incluso he empezado a ayudar de forma remota a antiguos compañeros de trabajo y gente del gremio. Es lo bueno de Internet y las nuevas tecnologías :-P
Entrenamiento online

Espero seguir así de contento e ilusionado con esta nueva etapa durante mucho tiempo. Pero si no es así, al menos lo intenté y lo disfrutaré mientras dure :-)

Sábado 02 de julio de 2016

Pedro L. Lucas

Pedro L. Lucas
Cartas de Linux

Probando Wayland en Ubuntu 16.04

Hasta ahora para dibujar ventanas en Linux usabamos X11. El protocolo X11 data de mediados de los 80. Esta escala temporal en el mundo de la informática es una barbaridad, por lo que alguien pensó que era hora de actualizarlo.

Wayland va a ser la nueva forma que vamos a tener de dibujar ventanas en Linux. Viene incluido de serie en Ubuntu 16.04 y ya puede ser probado.

Lo primero que hay que hacer es instalar los paquetes necesarios. Para ello se ejecuta:

sudo apt-get install weston 
sudo apt-get install qtwayland5 
sudo apt-get install xwayland libreoffice-gtk3

Una vez instaladas las dependencias necesarias, se procede a configurar Weston. Weston es la implementación por defecto de cómo debería ser un entorno de escritorio bajo Wayland.

Con nuestro editor de texto favorito se va a crear el archivo “~/.config/weston.ini”:

[core]
modules=xwayland.so,cms-colord.so
shell=desktop-shell.so
#gbm-format=xrgb2101010

[shell]
#background-image=/usr/share/backgrounds/gnome/Aqua.jpg
#background-color=0xff002244
#background-type=tile
#panel-color=0x90ff0000
panel-location=top
#locking=true
#animation=zoom
#startup-animation=fade
#binding-modifier=ctrl
#num-workspaces=6
#cursor-theme=whiteglass
#cursor-size=24

#lockscreen-icon=/usr/share/icons/gnome/256x256/actions/lock.png
#lockscreen=/usr/share/backgrounds/gnome/Garden.jpg
#homescreen=/usr/share/backgrounds/gnome/Blinds.jpg
#animation=fade

[launcher]
icon=/usr/share/icons/gnome/24x24/apps/utilities-terminal.png
path=/usr/bin/weston-terminal

[launcher]
icon=/usr/share/pixmaps/firefox.png
path=/usr/bin/firefox


[input-method]
#path=/usr/lib/weston/weston-keyboard
path=/bin/ls


#[output]
#name=LVDS1
#mode=1680x1050
#transform=90
#icc_profile=/usr/share/color/icc/colord/Bluish.icc

#[output]
#name=VGA1
#mode=173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync
#transform=flipped

#[output]
#name=X1
#mode=1024x768
#transform=flipped-90

[libinput]
enable_tap=true

#[touchpad]
#constant_accel_factor = 50
#min_accel_factor = 0.16
#max_accel_factor = 1.0

[keyboard]
keymap_layout=es

[screen-share]
#command=/usr/bin/weston --backend=rdp-backend.so --shell=fullscreen-shell.so --no-clients-resize

Ahora sí. Vamos a ejecutar Wayland. Para ello pulsamos la combinación de teclas “Ctr+Alt+F1”, entraremos en modo consola. Siempre podemos volver al modo gráfico con “Ctr+Alt+F7”. Nos autentificamos y escribimos en el terminal:

weston-launch

Por ahora sólo podemos lanzar terminales, para poder ejecutar otras aplicaciones se abre un terminal dentro de Wayland y se debe escribir:

export QT_QPA_PLATFORM=wayland-egl
export GDK_BACKEND=wayland
export QT_QPA_PLATFORMTHEME=fusion
export QT_STYLE_OVERRIDE=fusion
export SAL_USE_VCLPLUGIN=gtk3

Con esta configuración podemos lanzar aplicaciones desde ese terminal. Vamos a notar diferencia entre las aplicaciones GTK3, Qt5 y X11. Las aplicaciones GTK3 y Qt5 se ejecutarán en modo Wayland nativo. Para las X11 se creará una ventana dentro de Weston, al estilo que usan los Mac. Por ejemplo, se puede ejecutar LibreOffice con el comando “lowriter”. Se puede navegar por Internet con el comando “webbroser”.

Weston trabaja mucho con las combinaciones del teclado, al estilo de Unity. Las más interesantes son:

Ctr + Alt + borrar → Salir de Weston

Super + tab → Cambiar de ventana

Super + rueda del ratón → Zoom

Super + Alt + rueda del ratón → Cambiar opacidad de la ventana

Super + k → Cerrar ventana

Super + s → Hacer captura de pantalla

Super + r → Hacer un vídeo de la pantalla

Toda la configuración de Weston se puede encontrar en el archivo “~/.config/weston.ini”. Para ver el manual de este archivo, se puede usar el comando “man weston.ini”. Aquí se cambian cosas como pueden ser la resolución de la pantalla, el idioma del teclado o la imagen de fondo.

El consumo de RAM es bajo. Una sesión recién abierta de Weston consume 82 Mb. Comparando con X11, una sesión recién iniciada de Openbox consume 96 Mb. Para hacer esta prueba he parado lightdm usando el comando “service lightdm stop”. Como Weston es un gestor de ventanas ligero, por eso lo comparo con Openbox.

He notado que se puede trabajar bajo Wayland, llegando a lanzar documentos de LibreOffice bajo Wayland y trabajar sin problemas. Pero la integración de las aplicaciones con Wayland está todavía muy verde. Supongo que con el tiempo esto se solucionará. De hecho, no he sido capaz de ejecutar Firefox, que suelta una extraña ventana de error. Las ventanas de las aplicaciones GTK3 y Qt5 tienen decoraciones diferentes. La decoración de la ventana también es diferente cuando se lanza una aplicación X11 pura o una aplicación de Weston pura. Por ahora me voy a quedar con X11, pero Wayland será una opción interesante cuando en un futuro se mejore la integración de las aplicaciones.


Viernes 01 de julio de 2016

Marcelo Fortino

Marcelo Fortino
Fortinux

Ubuntu como entorno de programación y diseño web – PARTE VII

Ubuntu como entorno de programación y diseño web - PARTE VII. Otras herramientas útiles. Palabras claves: programación web, diseño web, entorno de desarrollo, Ubuntu, front-end developer, full-stack developer.

Lunes 20 de junio de 2016

Pedro L. Lucas

Pedro L. Lucas
Cartas de Linux

Mini-manual sobre el formato PDF

Este es un pequeño manual sobre el formato PDF. En la red se pueden encontrar bibliotecas para manejar dicho formato, pero el objetivo un pequeño manual es permitirnos crear nuestros propios archivos PDF usando nuestro editor de textos favorito.

Los ejemplos los podéis descargar desde el siguiente enlace:

https://drive.google.com/folderview?id=0B1x9hVRJS4GmdUZpeVpYR1YzSjQ&usp=sharing

La referencia del formato se puede encontrar en al dirección:

http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_reference_1-7.pdf

Desde ahí pos podemos descargar el manual de referencia del lenguaje. Es muy extenso. Pero en este documento vamos a ver las bases más simples y lo usaremos como apoyo.

2 La codificación: ¡No es UTF!

A la hora de escribir desde cero un archivo PDF, es necesario usar la codificación correcta. Para empezar, ¡el UTF no está soportado directamente! El formato PDF soporta varias codificaciones a la hora de escribir sus archivos. Para no complicarnos usaremos la codificación Windows-1252 que los PDF reconocen con el nombre WinAnsiEncoding.

Si usamos Gedit para editar hay que guardar el archivo con “Guardar como” y dará opción a cambiar la codificación de caracteres. Deberemos añadir la Occidental Windows-1252.

También se puede usar el comando “iconv” de Linux.

3 “Hola mundo” en PDF

Una vez puesta la codificación correcta al documento, es hora de escribir nuestro primer archivo “hola_mundo.pdf” (no os preocupéis que después se analizará línea a línea):

%PDF-1.4
1 0 obj
<< /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >>
endobj
2 0 obj
<< /Type /Outlines /Count 0 >>
endobj
3 0 obj
<< /Type /Pages
/Kids [ 5 0 R
 ]
/Count 1
>>
endobj
4 0 obj
<< /Type /Font
/Subtype /Type1
/Name /F1
/BaseFont /Helvetica
/Encoding /WinAnsiEncoding
>>
endobj
5 0 obj
<< /Type /Page
/Parent 3 0 R
/MediaBox [ 0 0 595 842 ]
/Contents 6 0 R
/Resources <<
/Font << /F1 4 0 R
 >>
>>
>>
endobj
6 0 obj
<< /Length 97 >>
stream
0.0 0.0 0.0 rg 0.0 0.0 0.0 RG
1 w
BT 283 559 Td /F1 10 Tf (Hola mundo)Tj
ET
endstream
endobj
xref
0 7
0000000000 65535 f
0000000009 00000 n
0000000074 00000 n
0000000120 00000 n
0000000180 00000 n
0000000287 00000 n
0000000416 00000 n
trailer
<< /Size 7
/Root 1 0 R
>>
startxref
541
%%EOF

En el código del PDF se aprecia que la primera línea es “%PDF-1.4”. Debe ser siempre así e indica que la versión del formato Pdf es la 1.4. Si pusiera “%PDF-1.7”, la versión sería la 1.7.

El archivo está dividido en objetos, veremos unas líneas en las que hay escrito “1 0 obj”, “2 0 obj”, “3 0 obj”,… Estas líneas indican el comienzo de un objeto. El objeto acaba siempre con “endobj”. Los objetos están numerados y la numeración no se debe repetir. No puede haber dos objetos “1 0 obj” en el mismo documento. Después usaremos estos números para llamar a un objeto desde otro.

Los objetos pueden representar páginas, tipos de letra, dibujos, textos,…

Vamos a fijarnos en el objeto “6 0 obj”:

6 0 obj
<< /Length 97 >>
stream
0.0 0.0 0.0 rg 0.0 0.0 0.0 RG
1 w
BT 283 559 Td /F1 10 Tf (Hola mundo)Tj
ET
endstream
endobj

Este objeto contiene un stream (flujo de datos) y su sintaxis es la siguiente:

n n obj
<< /Length bytes del stream >>
stream
...
endstream
endobj

Es decir, que después de “/Length” hay que poner el número de bytes que ocupa el texto que está entre stream y endstream. En el “6 0 obj” hay 97 bytes entre stream y endstream.

Dentro del objeto “6 0 obj” hay un comando con la forma “(Hola mundo)Tj” es evidente que es el texto que se está dibujando, podríamos modificar el texto a mostrar y tocaría variar el valor de “/Length” según los bytes que ocupe el stream.

Vamos a seguir viendo los objetos de hola_mundo.pdf:

  • 1 0 obj

1 0 obj
<< /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >>
endobj

Es un catálogo, viene a indicar en que objeto se pueden encontrar las páginas del documento “3 0 obj”. “2 0 obj” hace referencia a un contorno (“/Outline”).

  • 2 0 obj

2 0 obj
<< /Type /Outlines /Count 0 >>
endobj

Por ahora, lo vamos a ignorar. Dentro del catálogo “1 0 obj” es opcional.

  • 3 0 obj

3 0 obj
<< /Type /Pages
/Kids [ 5 0 R
 ]
/Count 1
>>
endobj

Este objeto del tipo “Pages”, páginas, y es un índice de los objetos en los que se representan las páginas del documento. Con “/Kids” se indican los objetos que contienen las páginas. En este caso sólo el objeto “5 0 obj” es una página. “/Count” es el número de páginas del documento. En este caso sólo hay una.

Para poner, por ejemplo, dos páginas una en el objeto “5 0 obj” y otra en el objeto “7 0 obj” se debería cambiar por:

3 0 obj
<< /Type /Pages
/Kids [ 5 0 R
7 0 R
 ]
/Count 2
>>
endobj
  • 4 0 obj

4 0 obj
<< /Type /Font
/Subtype /Type1
/Name /F1
/BaseFont /Helvetica
/Encoding /WinAnsiEncoding
>>
endobj

Este es un objeto de tipo “/Font” y representa un tipo de letra. En este caso concreto es un tipo de letra “/Helvetica” al que vamos a referirnos en el documento como “/F1” (“/Name /F1”). A partir de ahora, cuando se vaya a escribir un texto y le indiquemos que es el tipo “/F1” se buscará el objeto “4 0 obj” y se pondrá un tipo de letra “/Helvetica”.

Se puede cambiar “/Helvetica” por otros tipos de letra.

Por defecto, los visores de archivos PDF deberían tener los tipos de letra:

/Times-Roman

/Times-Bold

/Times-Italic

/Times-BoldItalic

/Helvetica

/Helvetica-Bold

/Helvetica-Oblique

/Helvetica-BoldOblique

/Courier

/Courier-Bold

/Courier-Oblique

/Courier-BoldOblique

/Symbol

/ZapfDingbats

Por lo que no hará falta incrustarlos en el documento y se podrán hacer documentos más ligeros.

El formato PDF nos permite usar otros tipos de letra que se incrustan en el archivo, pero esto rebasa los límites de este manual.

Hay que definir un objeto de tipo “/Font” por cada tipo de letra que se vaya a usar en el documento.

  • 5 0 obj

5 0 obj
<< /Type /Page
/Parent 3 0 R
/MediaBox [ 0 0 595 842 ]
/Contents 6 0 R
/Resources <<
/Font << /F1 4 0 R
 >>
>>
>>
endobj

Este es un objeto de tipo página (/Page). Tiene una serie de requisitos importantes:

  1. Debe indicar cuál es su objeto padre que le referencia. Es este caso es el objeto “3 0 obj”: /Parent 3 0 R

  2. Tamaño de la página en puntos. Para pasar de mm a puntos usaremos la fórmula x*210.0/74.0. De puntos a mm x*74.0/210.0. En este caso es un A4 con un tamaño de 595×842 puntos: /MediaBox [ 0 0 595 842 ]

  3. Contenidos de la página. En este caso la página va a contener al objeto “6 0 obj” que es el que va a escribir el texto: /Contents 6 0 R

  4. Por último, otros recursos que se van a necesitar para dibujar los elementos de la página como pueden ser los tipos de letra. En este caso se ha indicado que se va a usar el tipo de letra /F1 que se encuentra en el objeto “4 0 obj”:

/Resources <<
/Font << /F1 4 0 R
 >>
>>
>>

Si se necesitasen más tipos de letra en esta página, sólo habría que añadirlos haciendo referencia a su nombre y objeto:

/Resources <<
/Font << /F1 4 0 R
/F2 9 0 R
 >>
>>
  • 6 0 obj

6 0 obj
<< /Length 97 >>
stream
0.0 0.0 0.0 rg 0.0 0.0 0.0 RG
1 w
BT 283 559 Td /F1 10 Tf (Hola mundo)Tj
ET
endstream
endobj

Este es un objeto stream que ya se ha visto antes. Más adelante veremos los comandos de dibujo. No hace falta decir que es el que dibuja el texto “Hola mundo”.

  • xref

Índice de los objetos. Debe indicar el número de objetos que tiene el documento (se le va a sumar uno, por eso pone xref y a continuación 0 7). Después siempre vamos a poner “0000000000 65535 f”. A continuación se van a poner los bytes que hay desde el comienzo del archivo a la posición del objeto, por ejemplo, hasta el objeto “0 1 obj” hay 9 bytes, hasta el objeto “2 0 obj” hay 74,…

xref
0 7
0000000000 65535 f
0000000009 00000 n
0000000074 00000 n
0000000120 00000 n
0000000180 00000 n
0000000287 00000 n
0000000416 00000 n
trailer
<< /Size 7
/Root 1 0 R
>>
startxref
541

Después de localizar todos los objetos, viene el “trailer” en el que se indica cuantos objetos hay “/Size 7” (recordad que en este caso son 6 más uno) y se debe indicar cuál es el objeto donde se guarda el catálogo del documento (/Root 1 0 R) que en nuestro caso es el objeto “1 0 obj”.

Las últimas líneas:

startxref
541

Indican cuántos bytes hay desde el comienzo del documento hasta la referencia de objetos xref.

Como os podéis imaginar los lectores del Pdf deberán leer el archivo de atrás a hacia delante para localizar el de xref y tener así el índice con los objetos y su posición en el documento.

  • %%EOF

La última línea indica el final del documento PDF.

Como se puede apreciar el formato Pdf no está diseñado para escribirlo a mano por un humano, pues hay que ir contando bytes. Es ideal para crear desde algún lenguaje de programación.

Truco: Para no tener que andar contando bytes se puede usar el comando “wc -c” desde un terminal lo ejecutamos en Linux y vamos pegando el texto que nos interese. Pulsando Ctrl+D nos indicará el número de bytes que ocupa el texto que hayamos pegado.

Nota: Hay que recordar que los saltos de línea también ocupan bytes.

4 Dibujando

Vamos a fijarnos ahora en el siguiente ejemplo, llamado “dibujos-1.pdf”. Concretamente nos vamos a fijar en el objeto “6 0 obj” que es el que ha incluido la página y está dibujando objetos:

%PDF-1.4
1 0 obj
<< /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >>
endobj
2 0 obj
<< /Type /Outlines /Count 0 >>
endobj
3 0 obj
<< /Type /Pages
/Kids [ 5 0 R
 ]
/Count 1
>>
endobj
4 0 obj
<< /Type /Font
/Subtype /Type1
/Name /F1
/BaseFont /Helvetica
/Encoding /WinAnsiEncoding
>>
endobj
5 0 obj
<< /Type /Page
/Parent 3 0 R
/MediaBox [ 0 0 595 842 ]
/Contents 6 0 R
/Resources <<
/Font << /F1 4 0 R
/F2 7 0 R
 >>
>>
>>
endobj
6 0 obj
<< /Length 316 >>
stream
0.0 0.0 0.0 rg 0.0 0.0 0.0 RG
1 w
1 0.5 0 rg 1 0.5 0 RG
 100 742 m 200 642 l S
0.5 0.5 0.5 rg 0.0 0.5 0.0 RG
5 w
20 822 m 40 822 l 30 792 l h S
70 822 m 90 822 l 80 792 l h f
120 822 m 140 822 l 130 792 l  S
BT 100 742 Td /F1 10 Tf (Hola mundo)Tj
0 -10 TD (Adios mundo)Tj
ET
BT 100 642 Td /F2 12 Tf (Hola mundo)Tj
ET
endstream
endobj
7 0 obj
<< /Type /Font
/Subtype /Type1
/Name /F2
/BaseFont /Helvetica-Bold-Oblique
/Encoding /WinAnsiEncoding
>>
endobj
xref
0 8
0000000000 65535 f
0000000009 00000 n
0000000074 00000 n
0000000120 00000 n
0000000180 00000 n
0000000287 00000 n
0000000426 00000 n
0000000792 00000 n
trailer
<< /Size 8
/Root 1 0 R
>>
startxref
912
%%EOF

Este PDF dibuja la siguiente composición.

Vamos a analizar el objeto “6 0 obj” y concretamente el contenido de su stream que es el que realiza el dibujo:

6 0 obj
<< /Length 316 >>
stream
0.0 0.0 0.0 rg 0.0 0.0 0.0 RG
1 w
1 0.5 0 rg 1 0.5 0 RG
 100 742 m 200 642 l S
0.5 0.5 0.5 rg 0.0 0.5 0.0 RG
5 w
20 822 m 40 822 l 30 792 l h S
70 822 m 90 822 l 80 792 l h f
120 822 m 140 822 l 130 792 l  S
BT 100 742 Td /F1 10 Tf (Hola mundo)Tj
0 -10 TD (Adios mundo)Tj
ET
BT 100 642 Td /F2 12 Tf (Hola mundo)Tj
ET
endstream
endobj

Dentro del stream nos encontramos los siguientes comandos que pasamos a analizar:

  • 0.0 0.0 0.0 rg 0.0 0.0 0.0 RG

rg sirve para seleccionar el color de relleno de las figuras y RG el color de la línea que dibuja el borde de la figura. Está en formato RGB de forma que el primer número indica el nivel de rojo, el segundo de verde y el tercero de azul. Cada color se expresa con un número de 0 a 1. Así “0 0 0 rg” indica que se va a rellenar de color negro, “1 0 0 rg” de color rojo y “0.3 0.3 0.3 rg” de un color gris oscuro.

  • 1 w

Ancho de línea en puntos. En este se ha seleccionado un ancho de línea de 1 punto.

  • 1 0.5 0 rg 1 0.5 0 RG

Esta línea vuelve a cambiar el color a naranja tanto en el relleno como en las líneas.

  • 100 742 m 200 642 l S

Estos comandos sirven para dibujar una línea recta o un conjunto de líneas rectas. Con “100 742 m” le estamos indicando que la línea va a partir de la posición (100,742), el origen de coordenadas se coloca en la esquina inferior izquierda del papel.

El comando “100 742 m” sólo va a colocar el primer punto de la línea, pero no va a dibujar nada. Con el siguiente comando “200 642 l” le vamos a indicar que dibuje una línea desde la posición anterior a la posición (200,642).

Es decir, el comando “m” coloca el primer punto y el comando “l” dibuja las líneas. Se pueden encadenar varios comandos “l” que irán construyendo una poli-línea. Como se ve en:

20 822 m 40 822 l 30 792 l h S
70 822 m 90 822 l 80 792 l h f
120 822 m 140 822 l 130 792 l  S

Si nos fijamos, vemos que tienen letras al final (h, S, f) cuyo significado es el siguiente:

  • h: Significa que se va a cerrar el línea uniendo el último punto dibujando con el primero.

  • f: Indica que se va a dibujar una figura rellena. Por ejemplo, si dibujamos un triángulo, este triángulo se va rellenar con el color indicado por “rg”.

  • S: Indica que se van a dibujar las líneas que se definen. El color de la línea viene dado por el comando “RG”. Podríamos rellenar una figura pero no dibujar las líneas de los bordes.

  • BT 100 642 Td /F2 12 Tf (Hola mundo)Tj
    ET

Todo los que va desde “BT” hasta “ET” indica que se va a dibujar un texto. En este caso se usará “Td” para colocar la posición del texto. “100 642 Td” coloca el texto en la posición (100,642).

“Tf” se usa para indicar el tipo de letra que previamente se habrá definido en otro objeto. El objeto que define la página tiene que hacer referencia a todos los tipos de letra que se van a usar en la página (ver el objeto “5 0 obj”). Así “/F2 12 Tf” indica que se va a usar el tipo de letra “/F2” con tamaño 12.

“Tj” dibuja el texto. “(Hola mundo)Tj” indica que el texto que se tiene que escribir es “Hola mundo”.

Si sólo se va a dibujar una línea de texto con “Tj” nos vale, pero si se van a dibujar más líneas a continuación, se usa “TD” para indicar la posición relativa respecto de la línea anterior a la que se debe dibujar la siguiente línea. Debemos recordar que si queremos dibujar una línea debajo otra deberemos poner valores negativos. Así el siguiente texto dibujará dos líneas de texto con tipografía “/F1” tamaño 10 en la posición (100,742):

BT 100 742 Td /F1 10 Tf (Hola mundo)Tj
0 -10 TD (Adios mundo)Tj
ET

Como vemos la segunda línea está a una distancia 10 hacia abajo de la primera, “0 -10 TD” indica que el desplazamiento es (0,-10).

Existen una serie de caracteres de escape. Por ejemplo, si queremos escribir un paréntesis veremos que nos dará error pues lo confunde con el paréntesis de cierre del comando “Tj”. Para ello escribiremos:

\( para el símbolo (

\) para el símbolo )

\\ para el símbolo \

En la página 224, apartado 4.4 y del manual:

http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_reference_1-7.pdf

Se pueden encontrar otras formas de dibujo como pueden ser las curvas.

5 Transformaciones

Los dibujos que se hagan se pueden transformar haciendo deformaciones, ampliaciones, reducciones,…

Se usarán matrices para realizar dichas transformaciones. Concretamente serán las matrices que tengan la forma:

a b 0
c d 0
e f 1

Claro que representar una matriz de esta forma es muy complejo a la hora de hacerlo con un texto plano, por lo que los elementos de la matriz se escribirán de la forma:

a b c d e f

Así para hacer una traslación se usará la matriz:

1 0 0 1 x y

donde x e y será la distancia que se va a trasladar.

Para una ampliación o reducción se usará:

x 0 0 y 0 0

donde x e y son los factores que se van a ampliar en el eje x y en el eje y.

Para una rotación se usará:

cos(φ) sin(φ) -sin(φ) cos(φ) x y

Donde φ es el ángulo que se va a girar y x e y son las coordenadas el origen.

Antes de hacer una transformación es necesario guardar el estado, se hace con el comando “q”, y al finalizar de realizar la transformación recuperar el estado anterior, se hace con el comando “Q”.

Se usará el comando “cm” para indicar la matriz de transformación que se va a emplear.

Por ejemplo, para dibujar un texto girado 45º:

6 0 obj
<< /Length 165 >>
stream
0.0 0.0 0.0 rg 0.0 0.0 0.0 RG
1 w
q
 0.7071067811865476 0.7071067811865475 -0.7071067811865475 0.7071067811865476 100 742 cm
BT 0 0 Td /F1 10 Tf (Hola mundo)Tj
ET
Q
endstream
endobj

Vemos que primero se guarde el estado con “q”. Se introduce la matriz de transformación. Hay que fijarse que se ha cambiado el origen de coordenadas, por ello el texto se dibuja en la posición (0,0), y al final aparece en la posición (100,172) que es el origen de coordenadas que se había seleccionado en la matriz. La matriz de transformación se puede apreciar que es:

0.7071067811865476 0.7071067811865475 -0.7071067811865475 0.7071067811865476 100 742 cm

que es justo la que se ha descrito para un giro. En el ejemplo, “dibujos-3.pdf” se puede ver este ejemplo de rotación.

6 He abierto un PDF cualquiera y no entiendo los contenidos de un objeto con un stream

Por lo que se ha contado hasta ahora en el manual, deberíamos poder descargar un PDF cualquiera de Internet, abrirlo con nuestro editor de texto favorito y leerlo. Pero si lo hacemos, nos encontraremos con algo similar a:

4 0 obj <<
/Length 698       
/Filter /FlateDecode
>>
stream
xÚuTÛrÚ0#}ç+ôhÏÄÂ+Ë–Õ§æB&I/¡´ÓÉäÁÁ"x‚Áµ0L~¾+­!&M##‰½œ=»:#°#?ÀÒ˜')S ¸Ò1›•ƒ°s<
 Û###ô‚N¦ƒá9¤,æZ©„Mç#N¢5—R±iÎî¼qmªºXù‘ðZ?à‚ûmå#¸˜Æ8«ò0Äy¯.Fc²4#¸4ä#Èzñ{<º¡íÏÑÍäòú»?½#Œ¦ƒ?{®;#	O

Si nos fijamos, hay una serie de diferencias en este stream. El contenido del stream es ilegible para un humano. Esto es debido a que está comprimido en formato zip para reducir su tamaño. Esto se indica en “/Filter /FlateDecode”.

A parte de “/FlateDecode” el manual de referencia describe otras codificaciones que se pueden usar, como puede ser codificación en hexadecimal,…

7 Dibujo de elipses y circunferencias

En este formato no se pueden dibujar directamente circunferencias o elipses. La siguiente función en Python muestra los cálculos necesarios para dibujarlas:

def elipse(self, x, y, w, h, stroke_ok = False, fill_ok = True):
        y = self.alto - y - h / 2
        x = x - w / 2
        kappa = 0.5522848
        ox = (w / 2) * kappa
        oy = (h / 2) * kappa
        xe = x + w
        ye = y + h
        xm = x + w / 2
        ym = y + h / 2
        text = '{x0} {y0} m {x1} {y1} {x2} {y2} {x3} {y3} c '.format(x0=x, y0=ym, x1=x, y1=ym - oy, x2=xm - ox, y2=y, x3=xm, y3=y)
        text += '{0} {1} {2} {3} {4} {5} c '.format(xm + ox, y, xe, ym - oy, xe, ym)
        text += '{0} {1} {2} {3} {4} {5} c '.format(xe, ym + oy, xm + ox, ye, xm, ye)
        text += '{0} {1} {2} {3} {4} {5} c '.format(xm - ox, ye, x, ym + oy, x, ym)
        if stroke_ok:
            text += b" S"
        if fill_ok:
            text += b" f"
        return text

8 Ejemplo de documento con varias páginas

Este es un ejemplo de varias páginas en el que se tratan de mostrar las diversas formas de dibujar que se pueden encontrar en un PDF (“dibujo-2.pdf”):

%PDF-1.4
1 0 obj
<< /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >>
endobj
2 0 obj
<< /Type /Outlines /Count 0 >>
endobj
3 0 obj
<< /Type /Pages
/Kids [ 5 0 R
7 0 R
9 0 R
 ]
/Count 3
>>
endobj
4 0 obj
<< /Type /Font
/Subtype /Type1
/Name /F1
/BaseFont /Helvetica
/Encoding /WinAnsiEncoding
>>
endobj
5 0 obj
<< /Type /Page
/Parent 3 0 R
/MediaBox [ 0 0 595 842 ]
/Contents 6 0 R
/Resources <<
/Font << /F1 4 0 R
 >>
>>
>>
endobj
6 0 obj
<< /Length 290 >>
stream
0.0 0.0 0.0 rg 0.0 0.0 0.0 RG
1 w
BT 100 742 Td /F1 10 Tf (Página 1:)Tj
0 -10 TD (Dibujo de líneas)Tj
ET
 150 692 m 200 642 l S
0.5 0.5 0.5 rg 0.5 0.5 0.5 RG
5 w
20 622 m 40 622 l 30 592 l h S
70 622 m 90 622 l 80 592 l h f
0 0 0 rg 0 0 0 RG
1 w
100 542 m 200 542 l 200 442 l 100 442 l h S
endstream
endobj
7 0 obj
<< /Type /Page
/Parent 3 0 R
/MediaBox [ 0 0 595 842 ]
/Contents 8 0 R
/Resources <<
/Font << /F1 4 0 R
 >>
>>
>>
endobj
8 0 obj
<< /Length 495 >>
stream
0 0 0 rg 0 0 0 RG
1 w
BT 100 742 Td /F1 10 Tf (Página 2:)Tj
0 -10 TD (Dibujo de curvas)Tj
ET
250.0 542.0 m 250.0 486.77152 272.38576 442.0 300.0 442.0 c 327.61424 442.0 350.0 486.77152 350.0 542.0 c 350.0 597.22848 327.61424 642.0 300.0 642.0 c 272.38576 642.0 250.0 597.22848 250.0 542.0 c  f
350.0 442.0 m 350.0 414.38576 372.38576 392.0 400.0 392.0 c 427.61424 392.0 450.0 414.38576 450.0 442.0 c 450.0 469.61424 427.61424 492.0 400.0 492.0 c 372.38576 492.0 350.0 469.61424 350.0 442.0 c  S
endstream
endobj
9 0 obj
<< /Type /Page
/Parent 3 0 R
/MediaBox [ 0 0 595 842 ]
/Contents 10 0 R
/Resources <<
/Font << /F1 4 0 R
/F2 11 0 R
/F3 12 0 R
/F4 13 0 R
/F5 14 0 R
 >>
>>
>>
endobj
10 0 obj
<< /Length 359 >>
stream
0 0 0 rg 0 0 0 RG
1 w
BT 100 742 Td /F1 10 Tf (Página 3:)Tj
0 -10 TD (Dibujo de Texto)Tj
ET
BT 100 642 Td /F2 12 Tf (Tipo de letra Helvetica-Bold tamaño 12)Tj
ET
BT 100 592 Td /F3 10 Tf (Tipo de letra Courier tamaño 10)Tj
ET
BT 100 542 Td /F4 10 Tf (Tipo de letra Times-Bold tamaño 10)Tj
ET
BT 100 492 Td /F5 10 Tf (Tipo de letra Times-Italic tamaño 10)Tj
ET
endstream
endobj
11 0 obj
<< /Type /Font
/Subtype /Type1
/Name /F2
/BaseFont /Helvetica-Bold
/Encoding /WinAnsiEncoding
>>
endobj
12 0 obj
<< /Type /Font
/Subtype /Type1
/Name /F3
/BaseFont /Courier
/Encoding /WinAnsiEncoding
>>
endobj
13 0 obj
<< /Type /Font
/Subtype /Type1
/Name /F4
/BaseFont /Times-Bold
/Encoding /WinAnsiEncoding
>>
endobj
14 0 obj
<< /Type /Font
/Subtype /Type1
/Name /F5
/BaseFont /Times-Italic
/Encoding /WinAnsiEncoding
>>
endobj
xref
0 15
0000000000 65535 f
0000000009 00000 n
0000000074 00000 n
0000000120 00000 n
0000000192 00000 n
0000000299 00000 n
0000000428 00000 n
0000000768 00000 n
0000000897 00000 n
0000001442 00000 n
0000001616 00000 n
0000002026 00000 n
0000002139 00000 n
0000002245 00000 n
0000002354 00000 n
trailer
<< /Size 15
/Root 1 0 R
>>
startxref
2465
%%EOF

Martes 31 de mayo de 2016

GUbuntu.es: El repositorio más rápido
GUbuntu.es: Bienvenido

Jueves 19 de mayo de 2016

Ramón Miranda

Ramón Miranda
Ramon Miranda

BTR. Diseño de Logotipo para Grupo de deportistas.

Hola a Todos! desde hace algún tiempo que vengo interesándome por el deporte a varios niveles y de ese interés nace la colaboración con el grupo BTR para el cual diseñé este logotipo. Os dejo con el resultado final y más adelante publicaré el making off que de seguro os va a sorprender

Logotipo BTR (Bike·Trail·Run) Formato Horizontal Banner y formato vertical

Y esta es la aplicación desarrollada para la camiseta.


Sergio García Mondaray

Sergio García Mondaray
yakiboo.net

Wedding Invitations Templates For Word 2016

Wedding Invitation Templates Word   Wedding Invitation Collection S8SxdIZq

Wedding Invitation Templates Word Wedding Invitation Collection

Free Wedding Invitation Websites   Wedding Invitation Collection 9G8KhxDr

Free Wedding Invitation Websites Wedding Invitation Collection

Example Of Wedding Invitation Card   Wedding Invitation Collection PoE7HUl3

Example Of Wedding Invitation Card Wedding Invitation Collection

Free Wedding Invitations Templates For Word 2016 wwwroselliacom lxwsmhfH

Free Wedding Invitations Templates For Word 2016 wwwroselliacom

wedding invitation background free download   weddingbackgroundclub 8aEESrcD

wedding invitation background free download weddingbackgroundclub

Wedding Invitation Templates Word Wedding Invitation Collection

Sergio García Mondaray

Sergio García Mondaray
yakiboo.net

Vintage Invitation Templates 2016

Free Download Templates For Vintage Wedding Invitations CNJzrUaO

Free Download Templates For Vintage Wedding Invitations

Vintage Graduation Invitation   Printable Graduation Announcement   A 5wJ3gBCw

Vintage Graduation Invitation Printable Graduation Announcement A

Vintage Wedding Invitations 2015 2016 Fashion 2016 eFZGJM6X

Vintage Wedding Invitations 2015 2016 Fashion 2016

2016 Cheap New Gold Wedding Invitations Vintage Hollow Lace Laser Cut x9q76JwK

2016 Cheap New Gold Wedding Invitations Vintage Hollow Lace Laser Cut

Simple Wedding Invitation Template Invitation Templates mHIyzaem dr6eLvZa

Simple Wedding Invitation Template Invitation Templates mHIyzaem

Free Download Templates For Vintage Wedding Invitations

Sergio García Mondaray

Sergio García Mondaray
yakiboo.net

Vintage Invitation Templates 2016

Free Download Templates For Vintage Wedding Invitations CNJzrUaO

Free Download Templates For Vintage Wedding Invitations

Vintage Graduation Invitation   Printable Graduation Announcement   A 5wJ3gBCw

Vintage Graduation Invitation Printable Graduation Announcement A

Vintage Wedding Invitations 2015 2016 Fashion 2016 eFZGJM6X

Vintage Wedding Invitations 2015 2016 Fashion 2016

2016 Cheap New Gold Wedding Invitations Vintage Hollow Lace Laser Cut x9q76JwK

2016 Cheap New Gold Wedding Invitations Vintage Hollow Lace Laser Cut

Simple Wedding Invitation Template Invitation Templates mHIyzaem dr6eLvZa

Simple Wedding Invitation Template Invitation Templates mHIyzaem

Free Download Templates For Vintage Wedding Invitations