Linux Center Valencia - Elementos filtrados por fecha: Septiembre 2018

Google en Android, un tema para muchos complicado de tratar, ya que Android es propiedad de Google, si bien Android (o AOSP mejor dicho) es FOSS, Google incluye su bloatware (o sus Google Apps) en sus terminales y suele hacer tratos con las compañías que fabrican y venden smartphones o dispositivos con Android, para que traigan esas apps preinstaladas, más que eso, no se pueden desinstalar del terminal salvo que tengas acceso root o conectes al PC y realices una serie de comandos en terminal, cosa que no está al alcance de todos, siendo realistas. La cosa es que Google no recomienda para nada hacer root y lo tienen todo lo capado que pueden en Android, para evitar que los usuarios tomen el control absoluto de su terminal y puedan hacer lo que les venga en gana, que entraña riesgos, desde luego, pero también permite desinstalar por completo el bloatware de la compañía de Internet.

Lo que hoy os vengo a contar es más que nada mi experiencia en casi 1 año completo desde que me desvinculé de Google por completo en mi smartphone con Android, sin root, lo más que se puede hacer (desde Android 6.0 en adelante) es deshabilitar las apps de Google, todas salvo la molesta Google Play Services, un verdadero dolor de cabeza para los preocupados por la autonomía de su terminal, la privacidad y que no quieren que Google meta sus narices en ellos.

Antes de meternos a faena, quisiera comentar un poco debido a que me surgió esta idea o di este cambio de mentalidad. Hace más o menos 1 año, (creo que era el verano de 2016), estaba tan tranquilamente usando mi smartphone, cuando de repente noté que había una notificación de descarga en la barra de notificaciones, desplegué la cortina y vi que se estaba instalando una app llamada Google Play Services for Instant Apps o Instant Apps, algo así, una app que me sonaba haber leído en una noticia que era algo relacionado con una nueva funcionalidad y posibilidad que iba a permitir Google Play Store de manera próxima (haría 1 semana que había leído ese artículo). Pues bien, desinstalé esta app, sin problemas. No sé si fue a la mañana siguiente, desenchufé mi smartphone del cargador, lo encendí, cuando terminó el proceso de arranque, introduje mi PIN, activé el Wi-Fi, y para mi desagrado, volví a ver la notificación de proceso de descarga, de nuevo las Instant Apps. A mi impresión, Google se estaba "burlando" de mí y de todos los usuarios que estuvieran recibiendo eso, algo que ya sabía, como es que Google puede remotamente instalar, desinstalar, hacer y deshacer como deseé en nuestros terminales que corren Android con sus servicios instalados y ejecutándose, así como que tengan añadida su cuenta o más de una cuenta Google en el sistema. Debido a esto me puse a investigar sobre opciones, posibles alternativas, es esto en esencia lo que os voy a contar en este artículo.

Vamos pues a ello.

- Google Play Store. La tienda oficial de Android, propiedad de Google, con un catálogo amplísimo, tanto apps de calidad, que cumplen con su función, como malware, como en todas las plataformas líderes por cuota de mercado y de usuarios. Me enteré al tiempo de desinstalarla y deshacerme de Google (cosa que hice sobre Diciembre de 2017), que desde hará no sé cuanto ahora, tiene anuncios, por si fuera poco con tener unas políticas abusivas, encima la quieren rentabilizar, pero bueno, eso es decisión de Google y de si sus usuarios están dispuestos a tragar con ello, yo tras las malas experiencias, decidí cortar. F-Droid es para mí la única alternativa viable, ya que tanto es FOSS la propia app, como la web, todas las apps que tiene en su catálogo. Sin duda, están trabajando duro en ella, cuando yo la instalé creo que hacía poco que había salido la versión 1.0 estable, si bien el proyecto data de Septiembre de 2010, pero a día de hoy (27 de Septiembre de 2018), ya están en la versión 1.4 estable, con mejoras en la interfaz, haciéndola más intuitiva, bonita y agradable, al mismo tiempo que elegante, en mi opinión. Sin duda, si usas Android, un must have. Si por algún motivo, necesitas apps de Play Store, no tienes que pasar por el arco de Google, tienes alternativas disponibles en F-Droid, como Yalp Store, que es una forma de acceder al amplio repo de Play Store, de forma anónima, ya que no usas cuenta de Google, (no tienes porque, aunque puedas), sin las limitaciones de Google, descargas la app que sea de los servers de Google en formato APK y la puedes instalar sin problemas.

- Google Chrome. Uno de los peores enemigos para la privacidad de la compañía y de los más usados, su alta cuota en Android seguramente venga por el acuerdo que he comentado antes con las compañías fabricantes y vendedoras de smartphones y terminales con Android preinstalado, así como que Google lo mete con calzador junto a sus Google Apps en todo terminal que puede. La alternativa aquí es clara para mí, Firefox for Android, si bien se nota que Mozilla no ha dedicado los esfuerzos que hubiera requerido esta app, sigue siendo una buena opción, puesta en modo mantenimiento por la fundación Mozilla a inicios de Julio de 2018, se espera una revolución y un cambio importante para 2019, no se tienen fechas todavía, pero tengo esperanzas en que mejoren, pero mi elección es un fork de Firefox for Android, cosecha propia de los creadores de F-Droid, llamado Fennec F-Droid, siendo Firefox for Android, pero con las opciones de telemetría desactivadas por defecto.

- Google Search. Sin duda, el ojito derecho de Google. Triunfa sea la plataforma que sea, es con lo que empezaron y es con lo que siguen. Seguro que hay varias opciones que desconozco, puesto que nunca he usado esta app en Android, no le veo especial sentido, pero igual que yo uso DuckDuckGo en Firefox, tanto en GNU/Linux como en Android, digo yo que habrán alternativas para el sistema operativo móvil.

- Google Docs/Sheets, vamos, Google Suite. En Android está LibreOffice también, en F-Droid está, aunque está ahora mismo en alpha la versión 6.0, pero estar está.

- Google Maps. Fácil esta decisión. OSM, (OpenStreetMaps), es lo más conocido y la alternativa evidente. En F-Droid tenemos unas cuantas apps que hacen uso de OSM para servir mapas y un servicio similar a Google Maps. Por mentar alguno, yo diré OsmAnd+.

- YouTube. De los servicios más usados, tras el buscador de Google, como tal. Esta es muy clave, NewPipe es a todas luces mi favorita de las que he probado. No permite cuenta Google, es un cliente para YouTube ligero, con suscripciones locales, playlists locales, reproductor en 2º plano, cosa que aún hoy día la app oficial de YouTube no posee, tema oscuro desde hace al menos 9 meses, que es desde cuando la probé e instalé por primera vez, reproductor popup, descarga de vídeo, audio, en diferentes formatos, calidades, bitrate, en general me parece tremenda la app, la mejor opción para consumir contenido de la plataforma. Ah, se me olvidaba, por si a alguien le resulta interesante esto, no tiene anuncios.

He de decir un par de cosas para finalizar esta pequeña aportación, no soy una persona que utilice el smartphone para multitud de usos, de hecho, me gusta tener delimitado el uso que le doy a cosas que considero que las puedo realizar igual, mejor o más cómodamente que en el PC, puesto que si tengo que elegir, obviamente prefiero el PC.

Actualmente sólo tengo 1 app no FOSS en mi smartphone y esta es Nova Launcher, bueno, siendo exactos, tengo 2, Nova Launcher y Nova Launcher Prime. Esto es sencillo, he probado un par o tres de launchers de los que hay en F-Droid, si bien para vosotros quizás sean suficientes e incluso maravillosos, para mi costumbre de tener el box casi vacío, el escritorio sin nada más que el box de apps y lanzar todas las apps que puedo con gestos sobre el escritorio, no he encontrado aún reemplazo para Nova Launcher Prime. Pero lo bueno, es que en su momento me puse en contacto con TeslaCoil Software (los creadores y desarrolladores de Nova Launcher) y al verificar que soy propietario de una licencia vía Play Store, generando y adjuntando el documento que lo acredita, la compra de la app en Play Store, me dieron un enlace para descargar ambas apps, fuera de Play Store, sin necesidad alguna de depender de la store de Google. He de añadir que el launcher que más me gustó de los que probé y al que más futuro le veo, si es que el desarrollo sigue avanzando, (porque parece que es un proyecto bastante pequeño y tienen una frecuencia de actualización bastante espaciada), es OpenLauncher.

En mi caso personal, ya puedo decir claramente que no sólo no me ha supuesto un problema dejar de usar Google en mi smartphone, más bien viceversa, uní esto a dejar de usar WhatsApp, desinstalándola de mi terminal, lo cual entre todo, acabó repercutiendo en un incremento de la autonomía real de mi terminal, de manera notable. Creo sinceramente que cualquiera puede dejar de depender de Google, si se preocupa un poco y se molesta en probar cosas nuevas.

Por supuesto, menciono a LineageOS, el plan que tengo para mi OnePlus One, que actualmente corre la ROM Stock que venía de cuando lo compré, CyanogenOS 13.1.2, en cuanto adquiera un nuevo terminal, que en mi lista de prioridades está que tenga soporte oficial de LineageOS, como requisito imprescindible e innegociable. Esta custom ROM comunitaria, además de ser FOSS, respetuosa con el usuario, viene sin nada de Google, luego permite con MicroG (implementación FOSS de las GApps) o con las tradicionales GApps instalar todo lo de Google, pero eso ya queda a decisión del usuario, eso para mí es algo vital, que el usuario sea el que tenga el poder de elección. Ya que si bien en mi caso, con OnePlus y CyanogenOS, me venía exclusivamente el bloatware de Google, estoy seguro que la mayoría de vosotros, tendréis mucho más, ya sea con Huawei, Xiaomi, HTC, Samsung, Lenovo, Motorola, etc.

Nada más que añadir, salvo que si tenéis alguna aportación, duda, opinión de lo que os ha parecido el artículo, cualquier cosa, me lo dejéis en los comentarios, porque como he dicho, no soy ningún veterano, soy y me consider un novato aún en este mundo, pero si que siempre he sentido una especial curiosidad por tratar de sacar el máximo partido al hardware, al software, tratar de investigar, aprender, buscar nuevas apps, nuevo software que se adapte a mí, no que yo me adapte a él.

Espero que os haya sido de utilidad y espero poder seguir aportando algo a la comunidad. Porque tanto GNU/Linux como Android, que no es GNU/Linux pero si que es Linux, es comunidad y ahí creo que reside uno de sus mayores fuertes y ventajas.

Un enorme abrazo a todos ^^.

Publicado en Software
Lunes, 24 Septiembre 2018 16:07

WordPress Multisite

El pasado sábado 22 de Septiembre se realizó en nuestras instalaciones el curso "WordPress Multisite".

WordPress Multisite es una de las funcionalidades más desconocidas de este CMS y permite abordar de manera creativa y sencilla una gran cantidad de proyectos. Además, es clave para negocios de mantenimiento web (el propio Automattic tiene un multisite para WordPress.com) escalables en el tiempo y fácilmente mantenibles.
Borja nos contó qué características tiene y qué tipo de negocios se pueden crear con esta increíble funcionalidad.

Aquí os dejamos el vídeo del curso completo:

Vídeo del curso

Coméntalo en el foro

Impartido por: Borja López

borja lopezBorja es organizador y dinamizador de comunidades tecnológicas de Valencia (WordPress y PrestaShop son dos ejemplos de ello), y consultor y desarrollador de proyectos online basados en WordPress.
Website Twitter

Estoy haciendo una serie de tutoriales de GIMP 2.10 y quería mostrar cómo van cambiando las imágenes al cambiar los valores de los deslizadores de las distintas herramientas que forman GIMP.

Una opción es capturar la pantalla con recordMyDesktop o ffmpeg y colgarlo tal cual. El problema de esto es que el entorno de GIMP ocupa un espacio que hace que la imagen se vea pequeña. Así que prefiero hacer un efecto PiP (Picture in Picture). Es decir, superponer una imagen, en este caso, la caja de la herramienta sobre otra imagen más grande, en este caso, la imagen que va cambiando según los valores dados en la caja de la herramienta.

Podría capturar la pantalla y con un editor de vídeo, por ejemplo, Kdenlive, duplicar la pista y hacer dos "crops": uno con la imagen y otro con la herramienta, superponer ambas y montar el vídeo. Aparte de que el proceso de edición es farragoso, debería también hacer muchas veces clic con el ratón. Demasiado trabajo... seguro que ImageMagick me permite hacer el mismo resultado con menos esfuerzo. Veamos cómo hacerlo:

1.- Para el primer ejemplo, he cogido la primera herramienta del menú de Color de GIMP. Y me aparece que los deslizadores van del -100 al 100. Así que, en lugar de hacer 201 clic con el ratón, voy a hacer un bucle con una secuencia del 0 al 200.

2.- En cada iteración voy a capturar la pantalla completa con import y hacer dos recortes con crop, por un lado, la imagen que va cambiando y por otro, la herramienta de turno, en este caso, "Balance de color".

3.- Como quiero que el vídeo esté en formato HD, paso la imagen a un tamaño de 1920x1080 píxeles.

4.- Superpongo las imágenes con composite y hago clic para aumentar el valor.

5.- Le digo a ffmpeg que haga un vídeo con todos los fotogramas

6.- Y borro las imágenes sobrantes

Ya he escrito previamente sobre todas las instrucciones de este script a excepción de xdotool, que es un comando para simular el manejo del ratón a través de línea de comandos. Permite cliquear con los distintos botones, mover la ruleta, mover el cursor, hacer doble clic... En este caso, como únicamente quiero que haga un clic con el botón izquierdo, usaré:

xdotool click 1

 

Así es como queda el script:

#!/bin/bash

for i in $(seq 0 200)
do
    import -w root pantallazo.png
    convert pantallazo.png -crop 1308x735+172+214 lienzo$1$i.png
    convert pantallazo.png -crop 412x501+1497+242 -background Transparent -gravity Center -extent 600x600  deslizador$1$i.png

    convert lienzo$1$i.png -resize 1920x1080 base.png
    composite -gravity SouthEast  deslizador$1$i.png base.png png:-
xdotool click 1
done | ffmpeg -f image2pipe -i - videos/$1.mp4

rm lienzo*
rm deslizador*

Y así queda el resultado:

Publicado en Multimedia
Jueves, 13 Septiembre 2018 17:08

Trabajar con fechas en Bash

Para trabajar con fechas y con horas en un script, o en la consola, tenemos el comando date. Veamos su uso y algunos de sus parámetros más usuales.

Si únicamente escribimos date, nos devuelve el día de la semana indicado con tres caracteres; el mes, indicado de nuevo con tres caracteres; la hora completa con hora, minutos y segundos; el huso horario de nuestro ordenador y el año actual.

Parámetros usuales:

date +%H -> indica la hora (sin minutos) actual

date +%M -> indica los minutos actuales

date +%H:%M -> indica la hora y minutos actuales

date +%d -> indica qué día del mes es hoy
date +%m -> indica el mes actual en número

date +%B -> indica el mes actual en letras, con la palabra completa

date +%Y -> indica el año actual

Ejemplo:

echo "Hoy es el "$(date +%D)" de "$(date +%B)" de "$(date +%y)

Truco para usar date

Puede que te preguntes si te tienes que aprender todas esas opciones para hacer un uso eficaz de date. No. No hace falta. GNU/Linux es un sistema que permite optimizar todos los recursos... incluída la memoria de los usuarios. Con un sencillo script, podemos indicarle a un array que incluya las letras mayúsculas, a otro que incluya las minúsculas, concatene ambos arrays y lo recorra devolviendo el restultado de pasarle esos parámetros a date.

Hecho esto, lo ejecutamos y vemos qué parámetros son los que más nos interesan... incluso vemos qué letras no son parámetros de date.

Aquí dejo el script:

#!/bin/bash

minusculas=({a..z})
mayusculas=({A..Z})
letras=($(echo ${minusculas[*]}) $(echo ${mayusculas[*]}))

for i in $(seq 0 ${#letras[*]})
do
    echo "date +"${letras[$i]}"%: "$(date +%${letras[$i]})
done

Publicado en Programación

Podemos descargar en nuestro ordenador todos los tuits de un usuario de Twitter pinchando uno a uno, dándole botón derecho y guardando la página... o haciendo un pequeño script. 

Veamos paso a paso cómo hacerlo:

Acotar la búsqueda

Vamos a usar la cuenta de @LinuxCenterEs como ejemplo, así que vamos a mirar cuándo se unió a twitter, a qué fecha estamos y usaremos esos dos datos para delimitar el rango temporal desde donde hay que descargar.

Para saber la fecha actual, usaremos date.

Para saber la fecha en la que se unió un usuario a Twitter, tenemos que mirar en el código fuente. Para saber qué cadena buscamos, vamos a mirar primero la fecha en el perfil del usuario:

fechatwitter.png

 

Después buscamos esa cadena en el código fuente y miramos a qué clase o div pertenece:

clasetwitter.png

 

Y comprobamos si esa clase se utiliza únicamente para ese dato:

unacierto.png

Ya tenemos la pista con la que extraer la cadena de la fecha en la que se unió el usuario a Twitter.

Ahora tenemos que descargar la página, buscar la línea y extraer únicamente la cadena:

#!/bin/bash

wget https://twitter.com/$1 -O $1.html

lineafecha=$(cat $i.html | grep "ProfileHeaderCard-joinDateText js-tooltip u-dir")

echo $lineafecha

 

Voy a comprobar si funciona hasta aquí:

 

Por ahora parece que vamos bien. Ahora vamos a limpiar la cadena.

Ojo, tenemos que limpiar acorde con el idioma de nuestro sistema. Si, por ejemplo, tuviésemos el sistema en inglés, la cadena es distinta:

 

Veamos cómo llevamos el script hasta ahora:

#!/bin/bash

wget https://twitter.com/$1 -O $1.html

lineafecha=$(cat $i.html | grep "ProfileHeaderCard-joinDateText js-tooltip u-dir")

mescomienzo=$(echo $lineafecha | cut -d " " -f 13)
anocomienzo=$(echo $lineafecha | cut -d " " -f 15 | cut -d "<" -f 1)

case $mescomienzo in
enero)
    mescomienzo="01"
;;
febrero)
    mescomienzo="02"
;;
marzo)
    mescomienzo="03"
;;
abril)
    mescomienzo="04"
;;
mayo)
    mescomienzo="05"
;;
junio)
    mescomienzo="06"
;;
julio)
    mescomienzo="07"
;;
agosto)
    mescomienzo="08"
;;
septiembre)
    mescomienzo="09"
;;
octubre)
    mescomienzo="10"
;;
noviembre)
    mescomienzo="11"
;;
diciembre)
    mescomienzo="12"
;;
esac


mesfinal=$(date +%m)
anofinal=$(date +%Y)

echo "Las fechas a buscar son desde el "$mescomienzo" de "$anocomienzo" hasta el "$mesfinal" de "$anofinal

 Y veamos si funciona bien:

 

Pues parece que vamos por buen camino. Así que seguimos:

Ahora que ya sabemos las fechas que hemos de recorrer, vamos a ver cómo explotar este dato, tal como adelanté en un hilo de twitter: https://twitter.com/hacemoswebserie/status/1040037466802151426

Antes de seguir, comentaré que la cadena para hacer una búsqueda de los tuits que un determinado usuario de Twitter ha publicado entre dos fechas es:

"https://twitter.com/search?q=From%3A"$1"%20since%3A"$anocomienzo"-"$mescomienzo"-"$diacomienzo"%20until%3A"$anofinal"-"$mesfinal"-"$diafinal"&src=typd"

Y siempre es así. Simplemente cambiando las variables. Pero lo mejor de todo, es que todas las redes sociales siguen patrones similares, por lo que este tutorial es extrapolable a cualquier otra red social o cualquier otra búsqueda dentro de Twitter.

Y una advertencia, a veces si hacemos muchas descargas desde una misma IP o desde un mismo navegador, puede que nos bloquee ese servidor las descargas y no sirva nuestro script. Varias soluciones para esto:

  • Usar Tor para usar distintas IPs.
  • Lanzar varios scripts desde distintos ordenadores con distintas IPs (mejor si usamos servidores desde distintos puntos del planeta).
  • Ir cambiando de "user agent", es decir, cambiar la cabecera de wget para que se haga pasar por otro navegador. Tenemos un enorme listado de cabeceras en la página http://www.useragentstring.com/

Pero si vamos a hacer un uso moderado, como en este ejemplo en el que descargarnos los tuits de un único usuario, no debería darnos más problema que no nos deja descargar con wget si no le indicamos un "user agent" distinto.

Así que le indicaremos a wget que, por ejemplo, usamos Firefox con Windows. Lo haremos con: wget --user-agent="Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.2.3) Gecko/20100401 Lightningquail/3.6.3"

Y nos quedaría un script así:

#!/bin/bash

lineafecha=$(cat $i.html | grep "ProfileHeaderCard-joinDateText js-tooltip u-dir")

mescomienzo=$(echo $lineafecha | cut -d " " -f 13)
anocomienzo=$(echo $lineafecha | cut -d " " -f 15 | cut -d "<" -f 1)

case $mescomienzo in
enero)
    mescomienzo="01"
;;
febrero)
    mescomienzo="02"
;;
marzo)
    mescomienzo="03"
;;
abril)
    mescomienzo="04"
;;
mayo)
    mescomienzo="05"
;;
junio)
    mescomienzo="06"
;;
julio)
    mescomienzo="07"
;;
agosto)
    mescomienzo="08"
;;
septiembre)
    mescomienzo="09"
;;
octubre)
    mescomienzo="10"
;;
noviembre)
    mescomienzo="11"
;;
diciembre)
    mescomienzo="12"
;;
esac


mesfinal=$(date +%m)
anofinal=$(date +%Y)


for a in $(seq $anocomienzo $anofinal)
do
    for m in $(seq 1 12)
    do
            if [ $m -lt 10 ]
            then
                m="0"$m
            fi
            cadena="https://twitter.com/search?q=From%3A"$1"%20since%3A"$a"-"$m"-01%20until%3A"$a"-"$m"-31&src=typd"
            wget --user-agent="Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.2.3) Gecko/20100401 Lightningquail/3.6.3" $cadena -O "tuits-"$m"-"$a".html"

    done
done

Sobre esta base, podemos seguir evolucionando, como definir que el primer año sólo descargue a partir del mes de comienzo, que el último año sólo descargue hasta el mes de final, que descargue los tuits día a día... Eso a gusto de cada uno.

En cuanto a usos, una vez descargados todos los tuits, podemos analizar las candenas con múltiples fines, desde hacer análisis de mercados, comprobar el número de adjetivos, sustantivos, pronombres... que utiliza ese usuario, o, por ejemplo, saber cuántas veces nos cita ese usuario:

Veamos cómo se porta LinuxCenterEs conmigo:

#!/bin/bash

let contador=0

for i in $(ls *.html)
do
    let nominaciones=$(cat $i | grep -c hacemoswebserie)
    let contador=$contador+$nominaciones
    let nominaciones=0
done

echo "Te han citado "$contador" veces."

 

Veamos si funciona:

nominaciones.png

 

Y como funciona todo hasta aquí, aquí dejo el artículo. Ahora es tarea de cada usuario el adaptar este artículo a sus intereses. Las bases están sentadas... que la evolución haga el resto.

 

Publicado en Programación
Miércoles, 12 Septiembre 2018 20:31

Generar números aleatoriamente con shuf

Ya hemos visto que, dado que %$valor lo que hace es calcular el resto de la división entre la cifra que precede a % (dividendo) y la cifra que sucede a % (divisor), $RANDOM%limitesuperior no vale para generar números aleatorios de forma fideligna (a no ser que seamos trileros, pero en este caso no buscamos una verdadera aleatoriedad).

También hemos visto que shuf sí que sirve para crear órdenes aleatorios. Y ahora vamos a ver cómo usar shuf para generar números aleatorios.

Lanzamiento a cara o cruz de una moneda (aleatoriedad entre dos valores)

Veamos cómo usar shuf en el primer ejemplo que usé en contra de $RANDOM: una aleatoriedad dos valores. Pero antes de ello, vuelvo a remarcar que shuf no genera nada, sino que hace un orden aleatorio de una lista. Así que primero hay que generar una lista y luego ordenar aleatoriamente con shuf.

¿Qué formas podemos generar una lista?

Veamos varias formas de hacerlo:

En un fichero auxiliar:

#/bin/bash

let comienzo=0
let final=1

for i in $(seq $comienzo $final)
do
    echo $i >> numeros.txt
done

Y ahora podemos ejecutarlo y luego ordenar con shuf. Veamos a ver si la aleatoriedad es tal:

 

En este pantallazo vemos que de 12 tiradas, han salido siete veces 0 y cinco veces 1. Está dentro de la normalidad. Pero vamos a ver qué ocurre si tiramos mil veces la moneda:

#/bin/bash

let ceros=0
let unos=0

for i in $(seq 1 1000)
do
    let moneda=$(shuf -n1 numeros.txt)
    if [ $moneda -eq 0 ]
    then
        let ceros++
    else
        let unos++
    fi
done

echo "El número de ceros que ha salido es: "$ceros
echo "El número de unos que ha salido es: "$unos

Y lo comprobamos (vuelvo a poner pantallazo para que se vea que no hay trampa ni cartón):

comprobacionconfichero.png

 

¡Incluso me ha llegado a dar un empate de 500 a 500!

Visto que shuf es más válido en este caso, vamos a ver cómo generar una lista aleatoria con shuf. Compruebo en el mismo script para evitar hacer un artículo excesivamente largo:

#/bin/bash

let ceros=0
let unos=0

for i in $(seq 1 1000)
do
    numeros=$(shuf -i 0-1)    
    if [[ ${numeros:0:1} == "0" ]]
    then
        let ceros++
    else
        let unos++
    fi
done

echo "El número de ceros que ha salido es: "$ceros
echo "El número de unos que ha salido es: "$unos

listaconshuf.png

 

Funciona... y de nuevo hemos tenido un empate a 500 en una tirada.

Pero ahora te puedes preguntar, por qué si existe el parámetro -i en shuf para generar una lista con orden aleatorio y el parámetro -n para extraer un número determinado de elementos, ¿por qué no lo usas en la misma línea?

No te falta razón para pensarlo, pero quería mostrar distintas formas de lanzar la moneda. Y hacer un artículo evolutivo que acabase con la mejor opción:

#/bin/bash

let ceros=0
let unos=0

for i in $(seq 1 1000)
do
    numeros=$(shuf -i 0-1 -n 1)    
    if [[ $numeros == "0" ]]
    then
        let ceros++
    else
        let unos++
    fi
done

echo "El número de ceros que ha salido es: "$ceros
echo "El número de unos que ha salido es: "$unos

listaconshufin.png

Y vuelve a funcionar... incluso me ha dado otro empate a 500.

¿Y si en lugar de tirar a cara o cruz hacemos un rango mayor, por ejemplo de 0 a 1000?

Simplemente le cambiamos el rango en -i. Y si además, para comprobar si funciona, vamos a aumentar el número de tiradas.

#/bin/bash

let ceros=0
let quinientos=0
let miles=0

for i in $(seq 1 10000)
do
    numeros=$(shuf -i 0-1000 -n 1)    
    if [[ $numeros == "0" ]]
    then
        let ceros++
    elif [[ $numeros == "500" ]]
    then
        let quinientos++
    elif [[ $numeros == "1000" ]]
    then
        let miles++
    fi
done

echo "El número de ceros que ha salido es: "$ceros
echo "El número de quinientos que ha salido es: "$quinientos
echo "El número de miles que ha salido es: "$miles

Y al probarlo, da unos resultados tales como:

 

 

delunoalmil.png

 

Que son unos resultados que son totalmente coherentes dentro de lo que es la aleatoriedad por lo que podemos decir que la mejor forma para generar un número aleatorio en Bash es

shuf -i $limiteinferior-$limitesuperior -n 1

Publicado en Programación
Miércoles, 12 Septiembre 2018 00:02

Aleatoriedad con shuf

En tres artículos he estado argumentando en contra del uso de $RANDOM para generar números aleatorios:

El mito de $((RANDOM%$limitesuperior))
Más sobre la "aleatoriedad" de $RANDOM
Dados cargados en $RANDOM

Pero es poco honesto criticar algo sin aportar una solución, así que aquí voy a explicar el uso de shuf y en otro artículo explicaré varias formas de usar shuf para generar números aleatorios.

El uso de shuf

shuf se puede usar para ordenar aleatoriamente un fichero de texto:

shuf fichero.txt

shuf.png

Como vemos al usar cat, las palabras de fichero.txt tenían un orden que, al usar shuf, han cambiado de orden.

También shuf permite seleccionar X elementos de una lista. Ya lo hemos usado otras veces, como al elegir aleatoriamente una tipografía o un color con ImageMagick. Pero veamos con el ejemplo anterior:

shuf -n2 fichero

Con el parámetro -n$numerodelineas muestra el número de líneas incado como valor a -n.

Otra forma de usar shuf es recibiendo una lista desde la salida de otro fichero.

Veamos un ejemplo creando una serie de ficheros en un directorio y luego seleccionando uno al azar recogiendo con shuf la salida de ls.

 

Otro parámetro muy interesante es -o para especificar un fichero donde guardar la salida de shuf. Evolucionemos la instrucción anterior:

ls | shuf -o ordenaleatorio.txt

Publicado en Programación
Lunes, 10 Septiembre 2018 13:15

BASH: El poder de la terminal y el scripting

El pasado sábado 08 de Septiembre se realizó en nuestras instalaciones el curso "BASH: El poder de la terminal y el scripting".

En el curso aprendimos a realizar:
 - Personalizacion de la terminal con bash
 - Scripts que no requieran interaccion
 - CLI
 - GUI
 - Uso del comando Sed

Bash (Bourne-again shell) es un programa informático, cuya función consiste en interpretar órdenes, y un lenguaje de consola. Es una shell de Unix compatible con POSIX y el intérprete de comandos por defecto en la mayoría de las distribuciones GNU/Linux, además de macOS. También se ha llevado a otros sistemas como Windows y Android. (+info sobre BASH wikipedia)

Aquí os dejamos el vídeo del curso completo:

Vídeo del curso

Coméntalo en el foro

Impartido por: Raúl Rodrigo

Desarrollador oficial de la distribucion LliureX desde 2009 con alguna que otra incursion a la empresa privada, llevo entregado toda mi vida profesional al software libre. Desarrollo en python sobre ubuntu por profesion y en JS y sobre Arch linux por aficion..

Twitter

Ya hemos visto cómo unir imágenes con -delay para crear un gif animado. Pero -delay, que es muy sencillo de usar, no permite definir cuántas veces queremos que se repita el bucle ni la velocidad a la que queremos que se muestren las imágenes que forman la animación.

Para estas dos funcionalidades tenemos:

-loop que permite definir el número de veces que queremos que se repita una determinada animación. Le indicamos el número de veces que queremos que se repita. Y si queremos que se repita infinitas veces, se lo indicamos con 0.

-delay que establece la velocidad a la que se mostararán las imágenes en centésimas de segundo. Es decir, si queremos que entre imagen e imagen pase un segundo, le indicaremos 100.

Así:
convert -delay 10 -loop 0 param* param.gif

Si quieren ver diversas fórmulas para crear imágenes que van mutando y luego unirlas en ficheros gif, pueden leer este hilo de Twitter:

https://twitter.com/hacemoswebserie/status/1037884393430429699

Supongamos que tenemos una serie de imágenes que queremos unir consecutivamente formando entre todas una animación en un único fichero gif. La forma más sencilla de hacerlo con ImageMagick es indicando a convert las imágenes que queremos unir, usando el parámetro -adjoin y diciéndole el fichero donde las queremos unir. Por ejemplo:

convert comp* -adjoin espaciosdecolor.gif

Con esto tendríamos un gif animado.

Si quieren ver cómo hice un gif con -adjoin y las imágenes generadas al descomponer una imagen en todos los canales de todos los espacios de color que utiliza ImageMagick y luego usarlos como máscaras para componer nuevas imágenes en dos colores, pueden leer este hilo de Twitter:

https://twitter.com/hacemoswebserie/status/1038386517935370241

 

Publicado en Multimedia
Página 1 de 2

¡Atención! Este sitio usa cookies y tecnologías similares.

Si no cambia la configuración de su navegador, usted acepta su uso. Saber más

Acepto

Vea nuestra política de cookies y enlaces de interés aquí