Prácticas de Calc y texto sobre celdas, funciones, etc.

Libro de referencia: Primeros Pasos Con LibreOffice

Aquí están las prácticas de Calc.
PRACTICAS 0 Funciones sencillas
Práctica 1. Rellenar series
Práctica 2. Cuentas clientela
Práctica 3. Función SI
Práctica 4. Notas de examen-1
Práctica 5. Gestión de almacén
Práctica 6. Control de pedidos en almacén-1
Práctica 7. Pedido de vino
Práctica 8. Cálculo de la letra del DNI
DatosInmobiliaria

Texto en el que aparecen más ejercicios de referencias a celdas.
Fórmulas / Referencias.

Gracias a José Luis Ulizarna García y José Fco. Belda, autores del trabajo, por «subirlo» a la red.

Un saludo.

Solucionado el problema del micro en Kazam Screencaster

Con los líos COVID19 los profes no paramos de grabar tutoriales en nuestros equipos para luego subirlos a las aulas virtuales

Siempre he utilizado Kazam, por su sencillez y potencia. Pero desde que cambié a mi nuevo portátil con Ubuntu 20.04 me daba continuamente errores y, lo peor de todo, no grababa el audio del micro.

La solución la he encontrado en https://askubuntu.com/questions/1237885/kazam-microphone-unknown:

El problema era que al acceder a PREFERENCIAS del menú de Kazam para indicarle el volumen del micro aparecía un sospechoso «Desconocido» cuando lo que debe aparecer es algo similar a esto:

¿El problema que lo causaba? que el fichero /usr/lib/python3/dist-packages/kazam/pulseaudio/pulseaudio.py realiza llamadas a la función time.clock() que ha sido eliminada de python 3.8 y cambiada por time.perf_counter()

¿La solución? pues editar /usr/lib/python3/dist-packages/kazam/pulseaudio/pulseaudio.py, con sudo por supuesto, y sustituir los time.clock() por los time.perf_counter().

Funcionando. Muchas gracias a Nishanth Murugan por indicar la solución en ask.ubuntu

Ahh, si estáis con Kazam y ya estáis toqueteando en Preferencias, os recomiendo cambiar el «GRABAR CON» que suele aparecer a RAW(AVI) por H.264

Un saludo

 

 

 

 

Dándole un nuevo uso a la Raspberry Pi Zero (Ensamblador ARM v6)

Estos días me ha dado por investigar en temas ensambladores y me he enganchado a RISC-V.

Os recomiendo este curso de Obijuan sobre RISC-V en la URJC que es una maravilla. Además de poder realizar las prácticas en la FPGA Alhambra (algo más complicado si no disponemos de este dispositivo) se puede optar por el simulador RARS que permite ir viendo los cambios que se producen en los diferentes registros del procesador de manera muy intuitiva. Los ejercicios y la forma amena y sencilla de explicar lo complicado por parte de Juan hace que se avance mucho y rápido. Es un gran trabajo.

Bien, pues me he puesto a trastear también con el ensamblador de ARM-v6, que aunque tiene un ISA diferente se puede aprovechar bastante los conocimientos adquiridos en el curso de RISC-V.

Tengo una Raspberry Pi Zero por casa que dispone de un procesador ARM-v6 y la ha configurado sin teclado, ni ratón ni conexión previa a internet para poder realizar los programas directamente sobre este dispositivo. Paso a contar cómo lo he hecho.

1º.- He instalado la versión Lite de Raspbian. He utilizado el programa Balena Etcher que no necesita ninguna instalación salvo la de descargar el programa y guardarlo en cualquier directorio de tu máquina. Si queréis más información de cómo instalar Raspbian en una Raspberry Pi podéis seguir los pasos que se indican en Configuramos Raspberry Pi 3 de este mismo blog.

2º.- Una vez creadas las dos particiones en la microSD, desconectamos la microSD de nuestro ordenador y la volvemos a conectar para poder acceder a la partición /boot

3º.- En esta partición boot, y para activar el ssh en la raspberry Pi, creamos el fichero ssh. Un fichero de texto vacío. Sí, raspbian al iniciarse y comprobar que existe este fichero activa el servidor ssh en la Raspbery Pi, fácil.

4º.- Mi Raspberry Pi Zero es el modelo antiguo que no dispone de conexión Wifi, por lo que he instalado el dispositivo EDUP EP-N8508GS y he necesitado un adaptador USB-miniUSB.

5º.- Activar la conexión Wifi en este dispositivo en la Raspberry Pi Zero también ha sido muy sencillo, basta con crear el fichero wpa_supplicant.conf también en la partición /boot. Este fichero debe contener la siguiente información:

country=ES
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
ssid="NOMBRE DE LA WIFI"
scan_ssid=1
psk="PASSWORD DE LA WIFI"
key_mgmt=WPA-PSK
}

Si quisierais poder conectaros a más de una red Wifi basta con añadir otro network={..} con la información de esa otra red

6º.- Conectamos la tarjeta microSD en la Raspberry  Pi, la alimentación y YA…

 

En la imagen también aparece el conector miniHDMI-HDMI pero en este caso no tiene ninguna utilidad

7º.- Ahora comprobamos que la conexión SSH funciona. Lo primero que tendremos que obtener es la IP donde se ha conectado la Raspberry Pi. Para eso yo utilizo el comando nmap 192.168.1.1/24 -p 22

Obviamente tendrás que cambiar la dirección de red que proporcione tu servidor dhcp y tendrás que tener instalado nmap. Esto último, y hablando de ubuntu, es muy sencillo: sudo apt install nmap

Si todo ha ido bien, debe aparecerte algo similar a esto:

En mi caso la dirección es la 158. También puedes hacer que tu servidor dhcp haga que para la mac de tu dispotivio siempre mantenga esa dirección IP lo que facilitará el resto de accesos.

Realizamos la conexión:

Os recomiendo, una vez realizada la primera conexión, ejecutar sudo raspi-config y cambiar el nombre del host así como la contraseña de acceso…

8º.- Yo trabajo con atom que permite acceder de manera remota a la Raspberry Pi desde tu ordenador de trabajo o portátil lo que hace mucho más sencillo que el tener que estar trabajando con nano todo el tiempo. Para ello se debe instalar en atom el package remote-atom

Después de esto habrá que instalar rmate. Para ello, en la Raspberry Pi, se debe ejecutar lo siguiente:

sudo curl -o /usr/local/bin/rmate https://raw.githubusercontent.com/aurora/rmate/master/rmate

sudo chmod +x /usr/local/bin/rmate

Cuando queramos acceder a un fichero guardado en la RaspberryPI desde atom:

1.- Nos conectamos a la Raspbery Pi de la siguiente manera:

ssh -R 52698:localhost:52698 pi@<direcciónip1deturaspberry>

Obviamente esto solo hay que hacerlo la primera vez que queremos conectarnos a la Raspberry PI

2.- Desde Atom accedemos al menú Packages y pinchamos en StartServer:

También habrá que hacerlo una única vez.

3.- Cada fichero que queramos abrir en la Raspberry Pi tendremos que ejecutar:

rmate <fichero>

y nos aparecerá una nueva pestaña en nuestro atom.

 

A partir de aquí empieza el trabajo con el esamblador de ARM

 

Objetivos:

1.- Conexión baremetal en la Raspberry Pi. Estoy interesado en programar sin Sistema Operativo. A ver qué tal.

2.- Realización de utilidades en ensamblador para poder acceder a ellas desde Python o cualquier otro lenguaje de alto nivel

 

Un saludo

 

 

Solución al error ATOM_DISABLE_SHELLING_OUT_FOR_ENVIRONMENT= false en atom-ide

Si has actualizado a la versión 1.48.0 de atom habrás observado que no abre el editor con la última carpeta en la que estuviste trabajando.

No solo eso, sino que aparece abierto un fichero en blanco con el extraño nombre: ATOM_DISABLE_SHELLING_OUT_FOR_ENVIRONMENT= false

Para solucionarlo debes realizar lo siguiente:

1º.- abre el fichero /var/lib/snapd/desktop/applications/atom_atom.desktop

2º.- reemplaza la línea Exec=env BAMF_DESKTOP_FILE_HINT=/var/lib/snapd/desktop/applications/atom_atom.desktop /snap/bin/atom ATOM_DISABLE_SHELLING_OUT_FOR_ENVIRONMENT=false /usr/bin/atom %F

3º.- Por Exec=env BAMF_DESKTOP_FILE_HINT=/var/lib/snapd/desktop/applications/atom_atom.desktop /snap/bin/atom %F

Y solucionado, aunque la primera vez que abras atom después del cambio siga saliendo el fichero rarito…Abre una nueva carpeta y sal de editor

 

¡¡Qué hartura de SNAP, la verdad!!

 

Un saudo

 

 

Los dos script de ficheros

Bien, os recuerdo la práctica 1:

1.- Debíamos pedir la cantidad de datos que queríamos grabar en un fichero.
2.- Ir pidiendo tantos datos como el usuario hubiera indicado en el punto 1
3.- Grabar esos datos en un fichero
4.- Cerrar el fichero y salir

La práctica 2:
1.- Mostrar en pantalla la cantidad de datos que se habían introducido
2.- Preguntar si querríamos verlos por pantalla
3.- De ser afirmativa la respuesta a la pregunta 2, mostraríamos todos los datos en pantalla

Bueno, pues la solución de la práctica 1:

FICHERO = 'primerfich.txt'
fich = open(FICHERO, 'w')

print(f"Estamos creando el fichero{FICHERO}")

#Pedimos el número de datos a introducir

#¿Para qué crees que utilizamos el control de excepciones
correcto = False
while not correcto:
    try:
        total = int(input("Número de datos a introducir: "))
        correcto = True
    except:
        correcto = False

for i in range(total):
    dato = input(f"Dato {i+1}: ")
    fich.write(dato+'\n')

fich.close()

Y la solución de la práctica 2:

FICHERO = 'primerfich.txt'
fich = open(FICHERO, 'r')

print(f"Estamos leyendo el fichero{FICHERO} para indicarte el total de datos.")
listadatos=[]
for l in fich:
    listadatos.append(l)
print(f"Hemos leído {len(listadatos)} datos")

opcion = input("¿Quieres imprimirlos?")
if opcion in ['s','S','Sí', 'Si', 'Yes','Oui']:
    for i in listadatos:
        print(i.rstrip())


fich.close()

Para el cálculo de gestión de procesos

Vamos a utilizar este script para la sesion de GESTIÓN DE PROCESOS

Un saludo

from os import system
import copy
system('clear')

print('''
PROCESOS para SMR_1 v0.1
Pide número de procesos para, a continuación, solicitar la información de dicho proceso:
    PID
    t
    t0
Una vez pedidos los procesos solicitará el algoritmo de gestión: ROUND ROBIN o FCFS
Con el algoritmo Round Robin el proceso que sale del procesador se pondrá al final de la cola
TODO: Quedaría por controlar que no haya solapes entre los procesos
''')

listaProcesos = []
diagramaGanttVistoso = ''
diagraGantTrabajo = ''

tiempoCero = False

tiempoTotal = 0

try:
    totalProcesos = int(input("Indica el total de procesos: "))
except:
    print("Debes introducir un número")

#Pedimos los procesos
for i in range(0,totalProcesos):
    PID = i
    t = int(input(f"Tiempo total del proceso {i}: "))
    tiempoTotal += t
    t0 = int(input("Instante inicial del proceso: "))
    if (t0 == 0):
        tiempoCero = True
    print(40 * '-')
    listaProcesos.append([PID, t, t0])

if tiempoCero:
    #Calculamos el total de tiempo
    totalTiempo = 0
    for i in listaProcesos:
        totalTiempo += i[1]

    #Ordenamos listaProcesos por el t0
    listaProcesos.sort(key= lambda proceso: proceso[2])
    print(40* "-")
    algoritmo = input("Introduce el tipo de algoritmo F para FCFS y R para Round Robin: ")
    print(40* "-")
    if algoritmo in ['f', 'F']:
        #Chupaoooo
        for i in listaProcesos:
            for t in range(0,i[1]):
                if diagramaGanttVistoso == '':
                    diagramaGanttVistoso += str(i[0])
                else:
                    diagramaGanttVistoso += '-' + str(i[0])
                diagraGantTrabajo += str(i[0])

    else:
        #Como la listaProcesos la vamos a ir eliminando y luego es necesaria para los cálculos, hacemos una copia
        listaProcesosAux = copy.deepcopy(listaProcesos)
        print(listaProcesos)
        instante = 0
        proceso = 0
        while len(listaProcesosAux) > 0:
            if listaProcesosAux[proceso][2] <= instante:
                if diagramaGanttVistoso == '':
                    diagramaGanttVistoso += str(listaProcesosAux[proceso][0])
                else:
                    diagramaGanttVistoso += '-' + str(listaProcesosAux[proceso][0])
                diagraGantTrabajo += str(listaProcesosAux[proceso][0])
                listaProcesosAux[proceso][1] -= 1
                if listaProcesosAux[proceso][1] == 0:
                    listaProcesosAux.remove(listaProcesosAux[proceso])
                    proceso += 1
                    instante += 1
                    if proceso >= len(listaProcesosAux):
                        proceso = 0
        print(listaProcesos)
    print(diagramaGanttVistoso)
    print(40* "-")
    completa = input("¿Quieres conocer la información de cada proceso? ")
    print(40* "-")
    if completa in ['s', 'S', 'Sí','SÍ','sí']:
        #Obtenemos la información de tf de cada proceso
        #Y el Is total
        I=0
        for i in listaProcesos:
            tf = diagraGantTrabajo.rfind(str(i[0]))
            #Recordamos que se empieza por cero...por lo tanto sumamos uno al resultado

            Ts = tf - i[2] + 1
            Te = Ts - i[1] + 1
            Is = i[1] / Ts
            I += Is
            print(f"Proceso {i[0]} ti: {i[2]} tf: {tf} Te: {Te} Ts: {Ts} Is:{Is:1.2f}")
        print(f"Indice de Servicio: { (I /len(listaProcesos)):1.2f}")

else:
    print("No hay instante cero, por lo que los resultados no serán correctos...BYE")