11 de diciembre de 2018

La notación O grande con ejemplos en JavaScript

Después de mi anterior post sobre complejidad computacional, hoy voy a hablar de la notación O grande, que es una notación matemática que nos ayuda a describir el comportamiento de un algoritmo "al límite" en función de sus elementos de entrada N.

Algunos de los órdenes más utilizados en análisis de algoritmos, en orden creciente, están resumidos en la siguiente tabla:

notación nombre
O(1) constante
O(log n) logarítmico
O(n) lineal
O(n log n) lineal logarítmico
O(n^2) cuadrático
O(2^n) exponencial
O(n!) factorial
A continuación tenéis un vídeo en inglés en dónde se explica la notación O grande y como saber el orden de un algorítmo estudiando su código con reglas sencillas. Luego yo después muestro varios ejemplos de algoritmos de distintos tipos de orden.



Ejemplo de un algoritmo de orden O(1)

Imaginemos un programa que dado un número N, saca dicho número por pantalla. Para simular que el programa hace "algo", antes de sacar dicho número por pantalla, vamos a hacer que llame a una función llamada "retraso" que cree un array con los 999.999 primeros números naturales.

function retraso() {
    let max = 999999;
    let array = new Array(max);
    for (let index = 0; index < array.length; index++) {
        array[index] = index;
    }
}

function ejecutar(n) {
    let inicio = new Date();
    retraso();
    console.log(n);
    let fin = new Date();
    let miliseconds = fin.getTime() - inicio.getTime();
    console.log(miliseconds + " miliseconds");
}

ejecutar(10);
ejecutar(1000);
ejecutar(100000);
ejecutar(10000000);
El programa lo ejecutamos para N=10, N=1.000, N=100.000 y N=10.000.000, sacando por pantalla en cada caso el número de milisegundos que ha tardado en ejecutarse.

10
11 miliseconds
1000
5 miliseconds
100000
6 miliseconds
10000000
5 miliseconds
Como vemos, este algoritmo es de orden O(1), constante, pues da igual el número de entrada, siempre va a tardar más o menos lo mismo en ejecutarse.

Ejemplo de un algoritmo de orden O(log N)

Imaginemos el mismo programa de antes, solo que ahora guarda en un array la división de N por 2, y luego la división del resultado obtenido por 2, y así sucesivamente hasta que el resultado sea menor que 1. Para simular que el programa hace "algo", antes de asignar un número al array, vamos a hacer que llame a una función llamada "retraso" que cree un array con los 999.999 primeros números naturales.

function retraso() {
    let max = 999999;
    let array = new Array(max);
    for (let index = 0; index < array.length; index++) {
        array[index] = index;
    }
}

function ejecutar(n) {
    let inicio = new Date();
    let array = [];
    let resultado = n;
    while (resultado > 1) {
        retraso();
        resultado = resultado / 2;
        array.push(resultado);
    }
    let fin = new Date();
    let miliseconds = fin.getTime() - inicio.getTime();
    console.log(n);
    console.log(miliseconds + " miliseconds");
}

ejecutar(10);
ejecutar(1000);
ejecutar(100000);
ejecutar(10000000);
El programa lo ejecutamos para N=10, N=1.000, N=100.000 y N=10.000.000, sacando por pantalla en cada caso el número de milisegundos que ha tardado en ejecutarse.

10
22 miliseconds
1000
47 miliseconds
100000
84 miliseconds
10000000
127 miliseconds
Como vemos, este algoritmo es de orden O(log N), logarítmico, pues el tiempo de ejecución depende logarítmicamente del número de entrada (si multiplicamos N por 100 el tiempo de ejecución aproximadamente solo se duplica).

Ejemplo de un algoritmo de orden O(N)

Imaginemos el mismo programa de antes, solo que ahora guarda un array con los N primeros números naturales. Para simular que el programa hace "algo", antes de asignar un número al array, vamos a hacer que llame a una función llamada "retraso" que cree un array con los 999.999 primeros números naturales.

function retraso() {
    let max = 999999;
    let array = new Array(max);
    for (let index = 0; index < array.length; index++) {
        array[index] = index;
    }
}

function ejecutar(n) {
    let inicio = new Date();
    let array = new Array(n);
    for (let index = 0; index < n; index++) {
        retraso();
        array[index] = index;
    }
    let fin = new Date();
    let miliseconds = fin.getTime() - inicio.getTime();
    console.log(n);
    console.log(miliseconds + " miliseconds");
}

ejecutar(1);
ejecutar(10);
ejecutar(100);
ejecutar(1000);
El programa lo ejecutamos para N=1, N=10, N=100 y N=1.0000, sacando por pantalla en cada caso el número de milisegundos que ha tardado en ejecutarse.

1
7 miliseconds
10
49 miliseconds
100
584 miliseconds
1000
6076 miliseconds
Como vemos, este algoritmo es de orden O(N), lineal, pues el tiempo de ejecución depende directamente del número de entrada (si multiplicamos N por 10 el tiempo de ejecución también se multiplica aproximadamente por 10).

Ejemplo de un algoritmo de orden O(N^2)

Imaginemos el mismo programa de antes, solo que ahora guarda un array con todas las combinaciones de multiplicar todos los números naturales igual o menor que N. Para simular que el programa hace "algo", antes de asignar un número al array, vamos a hacer que llame a una función llamada "retraso" que cree un array con los 999.999 primeros números naturales.

function retraso() {
    let max = 999999;
    let array = new Array(max);
    for (let index = 0; index < array.length; index++) {
        array[index] = index;
    }
}

function ejecutar(n) {
    let inicio = new Date();
    let array = new Array(n*n);
    for (let i = 0; i <= n; i++) {
        for (let j = 0; j <= n; j++) {
            retraso();
            array.push(i*j);
        }
    }
    let fin = new Date();
    let miliseconds = fin.getTime() - inicio.getTime();
    console.log(n);
    console.log(miliseconds + " miliseconds");
}

ejecutar(2);
ejecutar(4);
ejecutar(8);
ejecutar(16);
El programa lo ejecutamos para N=2, N=4, N=8 y N=16, sacando por pantalla en cada caso el número de milisegundos que ha tardado en ejecutarse.

2
46 miliseconds
4
125 miliseconds
8
487 miliseconds
16
1702 miliseconds
Como vemos, este algoritmo es de orden O(N^2), cuadrático, pues el tiempo de ejecución depende cuadráticamente del número de entrada (si multiplicamos N por 2 el tiempo de ejecución se multiplica aproximadamente por casi 4).
Leer más

10 de diciembre de 2018

Introducción a la complejidad computacional


La teoría de la complejidad computacional trata de clasificar los problemas que pueden, o no pueden ser resueltos con una cantidad determinada de recursos (tiempo y memoria).

A grandes rasgos, la teoría de la complejidad computacional trata de clasificar los problemas que pueden, o no pueden ser resueltos por una computadora.

Máquina de Turing

Una máquina de Turing es un dispositivo teórico que manipula símbolos sobre una tira de cinta de acuerdo a una tabla de reglas.

El estudio de sus propiedades abstractas ha servido de base para mucho desarrollo teórico en las ciencias de la computación y en la teoría de la complejidad.

A continuación tenéis un vídeo en dónde se explica qué es una máquina de Turing.



Algoritmo

Un algoritmo es un conjunto prescrito de instrucciones o reglas bien definidas, ordenadas y finitas que permiten llevar a cabo una actividad mediante pasos sucesivos que no generen dudas a quien deba hacer dicha actividad.​

Dados un estado inicial y una entrada, siguiendo los pasos sucesivos se llega a un estado final.

A continuación tenéis un vídeo en dónde se explica qué es un algoritmo.



Tiempos polinómicos

Cuando el tiempo de ejecución de un algoritmo se puede expresar usando una fórmula polinómica, se dice que dicho problema se puede resolver en un tiempo polinómico.

Estos son "buenos" algoritmos.

Tiempos exponenciales

Cuando el tiempo de ejecución de un algoritmo no se puede expresar usando una fórmula polinómica, se dice que dicho problema es de tiempo exponencial.

Cuando un problema solo se puede resolver mediante algoritmos exponenciales, se dice que es intratable.

Problemas de clase NP

La clase de complejidad NP consta de los problemas "verificables" en tiempo polinómico, es decir, dada una posible solución, esta se puede verificar en un tiempo polinómico por una máquina de Turing.

A grandes rasgos, NP corresponde a la clase de problemas que, de manera realista, se pueden verificar con una computadora.

Problemas de clase P

La clase de complejidad P contiene a aquellos problemas que se pueden resolver en tiempo polinómico por una máquina de Turing.

A grandes rasgos, P corresponde a la clase de problemas que, de manera realista, se pueden resolver con una computadora.

Los problemas de clase P siempre son de clase NP (si lo podemos resolver en tiempo polinómico, también podemos verificarlo en tiempo polinómico).

Problemas NP-Completo

La clase de complejidad NP-Completo consta de los problemas "verificables" en tiempo polinómico, pero que no se ha encontrado un algoritmo que pueda resolver dicho problema en tiempo polinómico por una máquina de Turing.

A grandes rasgos, NP-Completo corresponde a la clase de problemas que se pueden verificar de forma sencilla, pero solo se pueden resolver por fuerza bruta.

Los problemas de clase NP-Completo siempre son de clase NP.

El problema ¿P=NP?

La pregunta ¿P=NP? es uno de los 7 problemas del milenio.

Si P=NP, cualquier problema polinómicamente verificable (NP) se podría resolver polinómicamente (P).

Esto quiere decir que podríamos pues resolver los problemas de clase NP-Completo de forma polinómica.

A continuación tenéis un vídeo en dónde se explica qué es eso del problema P versus NP.



En mi siguiente artículo hablo sobre la notación O grande con ejemplos en JavaScript.
Leer más

7 de noviembre de 2018

Instalacíón y configuración de MySql Server en Ubuntu 18.04


MySQL Server es un servidor de gestión de bases de datos relacionales con licencia GPL (Software Libre).

Para instalar el servidor MySQL en un Ubuntu hay que ejecutar el siguiente comando:

sudo apt install mysql-server
Para configurar el servidor de MySQL lo mejor es ejecutar el siguiente comando:

sudo mysql_secure_installation
El comando anterior irá haciendo distintas preguntas de seguridad. Iremos presionando "Y" y luego "ENTER" para aceptar los valores predeterminados. Salvo cuando nos pregunta por la contraseña de root del servidor MySQL (que podemos poner la misma que la del Ubuntu).

Luego tenemos que cambiar el método de autenticación del usuario root del servidor MySQL, así que nos conectamos con el siguiente comando:

sudo mysql
Cambiamos el método de autenticación del usuario root del servidor MySQL de "auth_socket" a "mysql_native_password" con el siguiente comando (hay que poner el password que hemos puesto antes):

mysql > ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Luego recargamos los privilegios del servidor de MySQL con el siguiente comando:

mysql > FLUSH PRIVILEGES
Por último nos desconectamos de MySQL Server con el siguiente comando:

mysql > exit
Leer más

4 de noviembre de 2018

Cómo cambiar el tamaño del disco duro virtual de Virtual Box


En este post explico como cambiar el tamaño del disco duro virtual de Virtual Box:

1.- Apagar la máquina virtual.

2.- Seleccionar la máquina virtual y pinchar sobre "Configuración".

3.- Luego ir a la sección "Almacenamiento".

4.- Seleccionar el archivo VDI para ver la ruta física del sistema host en donde está guardado como se se indica en la imagen del post.

En mi caso, como trabajo con Ubuntu como sistema host, la ruta es "/home/adolfo/VirtualBox VMS/Ubuntu/", pero supongo que en Windows será algo como "c:\Users\Usuario\VirtualBox VMS\Ubuntu\".

5.- Abrir una terminal. En Ubuntu se hace presionando "control + alt + t", pero en Windows tendrás que buscar el programa "cmd", o el programa "powershell".

6.- Con el comando "cd" que funciona tanto en Windows como en Linux, nos posicionamos en la carpeta del punto 4.

7.- Ejecutamos el siguiente comando:

VBoxManage modifyhd <ruta-archivo.vdi> --resize <tamaño-en-MB>

Ese comando redimensiona el disco duro virtual <ruta-archivo.vdi> a un tamaño de <tamaño-en-MB>.
Leer más

8 de octubre de 2018

¿Qué es Ethereum? ¿Qué es un smart contract o contrato inteligente? ¿Qué es una ÐApp o aplicación descentralizada?


Bitcoin ha sido la primera blockchain, pero desde su creación han aparecido muchas otras, cada una con diferentes características y protocolos. Una de las más importantes es Ethereum, creada por Vitalik Buterin en 2014.

¿Qué es Ethereum?

Es una blockchain pública que tiene la particularidad de permitir la ejecución de código y guardar estructuras de datos de forma descentralizada.

¿Cómo funciona Ethereum?

Ethereum funciona gracias a una máquina virtual llamada Ethereum Virtual Machine (EVM) que ejecuta bytecode de forma descentralizada. Los desarrolladores escriben programas en lenguajes de programación de alto nivel de tipo Turing completo, como Solidity. Estos programas, llamados Smarts Contracts, son compilados a dicho bytecode y subidos a la red de Ethereum, donde pueden ser ejecutados por cualquier persona. Toda ejecución dentro de la red de Ethereum consume un determinado Gas que tiene un coste que se paga en Ethers, la moneda de Ethereum, como incentivo a los mineros en forma de comisión.

¿Qué ventajas tiene Ethereum?

La ventaja de Ethereum con respecto a otras blockchains es que no es necesario construir una nueva blockchain para cada nueva aplicación pues Ethereum permite el desarrollo potencial de cualquier tipo de aplicación descentralizada. Actualmente existen distintas blockchains que, como Ethereum, permiten ejecutar código de forma descentralizada, pero Ethereum es la más madura de todas ellas.

¿Qué desventajas tiene Ethereum?

Ethereum, al igual que el resto de blockchains, si lo comparamos con el software “tradicional”, es lento, y tiene problemas de escalabilidad. Parte de estos problemas se solucionan utilizando blockchains privadas o mixtas. Actualmente todas las blockchains están intentando solucionar estos problemas, pero no parece que la solución vaya a llegar en breve.

¿Qué es un smart contract o contrato inteligente?

Un smart contract o contrato inteligente es un programa informático imparable e inmutable que se ejecuta de forma autónoma y descentralizada dentro de una blockchain.

¿Qué características tiene un smart contract o contrato inteligente?

Imparable

Una vez subido a una blockchain va a poder ejecutarse siempre, a no ser que haya sido programado para dejar de hacerlo. Un contrato inteligente no puede ser censurado por entidad alguna.

Inmutable

Una vez subido a una blockchain, tanto si funciona correctamente como si no, ya no se puede modificar. Si se quiere añadir una funcionalidad nueva es necesario subir un nuevo contrato.

Autónomo

Una vez subido a una blockchain no necesita ningún servidor para poder ser ejecutado pues lo hace en la propia blockchain.

Descentralizado

Una vez subido a una blockchain no necesita ningún tercero de confianza para ser interpretado, simplemente cada vez que se lance ejecutará las instrucciones en él programadas.

Confiable

Al estar almacenados en una blockchain, la trazabilidad de los datos generados por los contratos inteligentes es muy confiable.

¿Qué es una ÐApp o aplicación descentralizada?

Una ÐApp (se escribe con esta Ð extraña) o aplicación descentralizada es una aplicación que no depende de un sistema central si no que interactúa con uno o varios contratos inteligentes alojados en una blockchain.

¿Qué diferencias existen entre una ÐApp o aplicación descentralizada y una aplicación web tradicional?

La arquitectura de una aplicación web tradicional consiste en:
  1. por un lado, el front-end, que se corresponde con la interfaz gráfica de la aplicación, que se suele programar con HTML, CSS y JavaScript y que se suele ejecutar en un navegador web;
  2. y por otro lado, el back-end, que se corresponde con la parte del servidor, osea con:
    1. los servicios web, que se suelen programar con Java, .NET, PHP, Python, Ruby, etc.;
    2. y las bases de datos en donde se guardan los datos.
La arquitectura de una aplicación descentralizada se diferencia en que en este caso el back-end se corresponde con la blockchain en donde:
  1. se ejecutan los contratos inteligentes que serían como los servicios web tradicionales;
  2. y se guardan los datos en forma de transacciones en la propia blockchain.

Imagen. Arquitecturas de una aplicación web tradicional y de una ÐApp o aplicación descentralizada.

Ver también

Bibliografía

Leer más

5 de octubre de 2018

¿Qué es Bitcoin? ¿Qué es una Blockchain? ¿Qué es el minado? ¿Qué mecanismos de consenso existen? ¿Qué tipos de blockchain existen?


Bitcoin nace en 2009 de la mano de Satoshi Nakamoto, siendo este último un seudónimo, por lo que se desconoce la verdadera identidad de su creador o creadores.

¿Qué es Bitcoin?

Bitcoin es un protocolo y una red entre pares distribuida que conforman un ecosistema de dinero digital, en donde los usuarios poseen claves privadas alojadas en sus wallets que les permiten transferir sus fondos a otros usuarios.

¿Cuales son las características de Bitcoin?

Una de las principales características del Bitcoin es que es descentralizado, es decir carece de una entidad central que lo gestione, y las transacciones no necesitan de un tercero de confianza para ser verificadas.

Otra de las principales características del Bitcoin es que guarda un histórico difícilmente falsificable de todas las transacciones realizadas.

¿Qué es una blockchain?

Bitcoin se sustenta en la tecnología de blockchain, que es una estructura de datos en forma de cadena de bloques, en donde cada bloque tiene información relativa al bloque anterior, de manera que la información contenida en un bloque sólo puede ser editada modificando todos los bloques anteriores. Esta propiedad permite la implementación de un registro contable difícilmente falsificable con un histórico de todas las transacciones realizadas.

Además, gracias al minado, la integridad de los datos es verificada por todos los participantes de la red sin necesidad de recurrir a una entidad de confianza que centralice la información.


Imagen. Cómo funciona la Blockchain para realizar pagos.
(Fuente: https://miethereum.com/blockchain/)

¿Qué es el minado?

A la generación de nuevos bloques en una blockchain se le denomina proceso de minado. Todos los miembros de la red pueden participar en este proceso. A los que lo hacen se les denomina mineros. El problema surge a la hora de elegir cuál de los distintos bloques generados por los mineros es el correcto. Para ello se utilizan los mecanismos de consenso.

¿Qué mecanismos de consenso existen?

Existen diferentes mecanismos de consenso, siendo los dos principales los siguientes:

Mecanismo de consenso de prueba de trabajo

El mecanismo de consenso usado en Bitcoin y en la mayoría de las blockchains es el de prueba de trabajo, también denominado PoW, del inglés Proof-of-Work. Consiste en imponer para el minado del siguiente bloque de la cadena, la resolución de un problema que conlleva un gasto computacional elevado, pero que, a su vez, una vez resuelto, la verificación del mismo es casi inmediata. El primer minero que resuelve dicho problema es recompensado con un incentivo.

El mayor problema de este mecanismo de consenso es su elevado gasto energético.

Mecanismo de consenso de prueba de participación

Para intentar solucionar los problemas de PoW, surgen los mecanismos de consenso de prueba de participación, también denominados PoS, del inglés Proof-of-Stake. En este caso, la probabilidad de minar un bloque y conseguir el incentivo correspondiente es directamente proporcional a la cantidad de monedas que uno tiene acumuladas.

El problema más importante de este mecanismo, es que no sirven para alcanzar el consenso en caso de una bifurcación de la cadena, puesto que los mineros podrían seguir minando en ambas cadenas al no suponerles un gasto extraordinario. Para mitigar este tipo de problemas se suelen utilizar técnicas que perjudican de alguna forma a los mineros que intentan bifurcar la cadena.

¿Qué tipos de blockchain existen?

Según el acceso a los datos, existen tres tipos de blockchains:

Blockchains públicas

Están accesibles para cualquier usuario. Las más conocidas son Bitcoin y Ethereum.

Blockchains privadas

No están abiertas al público, solo se puede acceder a ellas por invitación. La más conocida es Hyperledger.

Blockchains mixtas

Son una combinación de las públicas y las privadas. Solo se puede ser minero por invitación, pero todas las transacciones son públicas.

Ver también

Bibliografía

Leer más

30 de septiembre de 2018

Qué hacer después de una instalación mínima de Ubuntu 18.04

Acabo de hacer una instalación mínima de Ubuntu 18.04 y he ido apuntando los pasos que ido dando justo después a modo de recordatorio para mi para una futura instalación, pero espero que sea de utilidad a otras personas.

  1. Enlazo mi propio post con las nuevas teclas rápidas de Ubuntu 18.04, pues algunas han cambiado con respecto a versiones anteriores.
  2. Enlazo mi propio post con la configuración de escritorio de Ubuntu 18.04 que he utilizado.
  3. Enlazo mi propio post con la configuración de Firefox que he utilizado.
  4. Enlazo mi propio post con la instalación de software que he utilizado.
Leer más

Instalación de software después de una instalación mínima de Ubuntu 18.04

Acabo de hacer una instalación mínima de Ubuntu 18.04 y estoy recopilando el software que he instalado justo después a modo de recordatorio para mi, pero espero que sea de utilidad a otras personas.

  1. Enlazo mi propio post en donde explico cómo instalar y configurar ZSH y Oh My ZSH en Ubuntu.

  2. Instalar y configurar el control de versiones Git:

    • Primero instalarlo:

      $ sudo apt install git
    • Luego configurarlo:

      $ git config --global user.name "Tu Nombre"
      $ git config --global user.email tu@mail.com
    • Y finalmente configurar tus claves SSH.

  3. Instalar las net-tools que es donde viene, entre otros, el famoso ifconfig:

    $ sudo apt install net-tools
  4. Instalar el gestor de contraseñas PasManGen:

    • Primero descargarlo:

      $ git clone git@github.com:pasmangen/pasmangen.github.io.git
    • Luego se abre el index.html desde el navegador.

  5. Enlazo mi propio post en donde explico cómo instalar Docker en Ubuntu.

  6. Instalar el generador de slides y libros a partir de ficheros Markdown MarkdownSlides:

    • Primero descargarlo:

      $ git clone git@github.com:asanzdiego/markdownslides.git
    • Luego compilar la imágen de Docker:

      $ docker build -t asanzdiego/markdownslides .
    • Luego añadir el comando al fichero ~/.bashrc o ~/.zshrc:

      function markdownslides() {
        docker run --rm -it -v "${PWD}":/home/markdownslides-master/"${PWD##*/}" asanzdiego/markdownslides ./build.sh "$@"
      }
    • Bonus track: comanado para eliminar los containers e imagenes de docker::

      function rmdocker() {
        # Delete all containers
        docker rm $(docker ps -a -q)
        # Delete all images
        docker rmi $(docker images -q)
      }
  7. Añadir una función que utilizo mucho con Git al fichero ~/.bashrc o ~/.zshrc:

    function gitpush() {
      git status
      read -p "Do you want to continue? [y|*N*]: " OPTION
      if [[ "${OPTION}" = "y" ]]; then
        read -p "Write the commit message: " MESSAGE
        git add . && \
        git commit -m "${MESSAGE}" && \
        git push origin master
      fi
    }
  8. Instalar el editor Visual Studio Code:

    $ curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
    $ sudo install -o root -g root -m 644 microsoft.gpg /etc/apt/trusted.gpg.d/
    $ sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list'
    $ sudo apt install apt-transport-https
    $ sudo apt update
    $ sudo apt install code # or code-insiders
  9. Instalar el navegador Chromium:

    $ sudo apt install chromium-browser
  10. Instalar el paquete ofimático de Libre Office:

    • Primero instalar el paquete propiamente dicho:

      $ sudo apt install libreoffice
    • Luego instalar los paquetes de idiomas:

      $ sudo apt install libreoffice-help-es libreoffice-l10n-es
    • Luego instalar los diccionarios para la corrección ortográfica:

      $ sudo apt install hunspell-es aspell-es
    • Luego instalar los icono breeze:

      $ sudo apt install libreoffice-style-breeze
    • Para terminar configurar los iconos desde Herramientas > Opciones > LibreOffice > Ver > Etilo de iconos.

  11. Instalar el convertidor de formatos ssconvert que viene con la hoja de cálculo gnumeric:

    $ sudo apt install gnumeric
  12. Instalar el editor de imágenes GIMP y varios plugins que uso a veces:

    $ sudo apt install gimp gimp-plugin-registry
  13. Instalar el reproductor de vídeo VLC:

    $ sudo apt install vlc
  14. Instalar el capturador de pantallas Shutter:


  15. Instalar el programa para escanear simple-scan:

    $ sudo apt install simple-scan
  16. Instalar el editor de vídeo Kdenlive:

    $ sudo apt install kdenlive
  17. Instalar la herramienta de screencasts Kazam:

    $ sudo apt install kazam
  18. Instalar la herramienta Vokoscreen que uso para capturar la webcam:

    $ sudo apt install vokoscreen
  19. Instalar el configurador de teclas rápidas AutoKey:

    $ sudo apt install autokey-gtk
Leer más

Configuración de Firefox

Acabo de hacer una instalación de Ubuntu 18.04 y estoy recopilando ciertas cosas a modo de recordatorio para mi, pero espero que sea de utilidad a otras personas. En este caso la configuración de Firefox:

  1. General > Inicio > Restaurar sesión previa - seleccionado
  2. General > Archivo y aplicaciones > Descargas > Preguntar siempre donde guardar archivos - seleccionado
  3. General > Aplicaciones > mailto > GMail - seleccionado
  4. Buscar > Buscador predeterminado > DuckDuckGo - seleccionado
  5. Privacidad y seguridad > Formularios y contraseñas > Preguntar para guardar contraseñas e inicios de sesión de sitios web - no seleccionado
  6. Privacidad y seguridad > Formularios y contraseñas > Protección contra el rastreo > Siempre - seleccionado
  7. Luego instalo 2 extensiones: la de buffer y la de MetaMask
Leer más

29 de septiembre de 2018

Configuración del escritorio de Ubuntu 18.04


Acabo de hacer una instalación de Ubuntu 18.04 y han cambiado algunas opciones de configurarción, así que pongo aquí la nueva configuración que he usado yo a modo de recordatorio para mi, pero espero que sea de utilidad a otras personas.

  1. Abrir la configuración y cambiar:
    • El fondo de esritorio:
    • El tamaño de los iconos del dock a 32:
    • En dispositivos, activar la luz noctura del monitor de forma automática:

  2. Instalar el configurador de escritorio gnome-tweak-tool:

    sudo apt install gnome-tweak-tool
  3. Instalar la extensión gnome-shell-extension-system-monitor que nos permite ver el estado (CPU, RAM, Red, Disco, etc.) en la barra superior de herramientas:

    sudo apt install gnome-shell-extension-system-monitor
  4. Abrir la aplicación retoques (gnome-tweak-tool):
    • Apariencia > Temas > Aplicaiones > Radiance:
    • Barra superior > Reloj > Fecha activada:
    • Extensiones > Activar "System-monitor":
    • En configuración de la extensión de "system-monitor", cambiar los colores a tonos de grises, cambiar el ancho del gráfico a 32, seleccionar "Mostrar en el menú" a todo, y seleccionar "Mostrar" a CPU, Memoria, Intercambio, Red, Disco y Temperatura (está última el "Estilo mostrado" a modo numérico:
    • Ventanas > Botones de la barra de título > Colocación > Izquierda:
Leer más