Etiquetas

555 74HC04 74HC14 74HC165 74LS04 acentos ADC10 Amstrad archivo arduino aristóteles armbian array ass at backup base64 bash Basho bc beethoven Biblia blog bucle c c++ c++11 c++17 C005 cadena Carmina Burana casting CD4017 CD4040 Cine clases Colores connect Consolación a Helvia Consolación a Marcia Consolación a Polibio constante corsair CPC Cristal 32Khz css cursor mouse cut daemon date dead keys Debian directorio disco duro DS32kHz electricidad Electrónica ensamblador entryList epicureismo Estadística estoicismo felicidad ffmpeg filePath filosofia Filosofía firefox flac for fstab funcion Gargantúa gastronomía gilgamesh Ginott gmp gpt grep gtts Hobbes hotkeys html imagemagick inline Javascript kde kernel modulos latex ldr lib-notify Linux Literatura ludoteca macro mapa de bits Matroska mega Microsoft Word Milan Kundera mkvextract mkvinfo mount mp3 mplayer MSP430 msp430F5529 MSP432 Multimedia Musica oop orange_pi pato PIR PL9823 Platón poesía POO en C++ pulseaudio puntero PWM pygame pyqt python QAction qApp QApplication QByteArray QDialog Qdir QFile QFileDialog QImage qlabel QList QListWidget QMessagebox QMouseEvent qpainter QPalette QPixmap QProcess QRegularExpression QRegularExpressionMatchIterator QString QStringList Qt qt5 QToolbar quijote QVector qwidget R Rabelais ratón relé Resonador cerámico samba San Agustín screen Séneca signal slot smart smartctl sox srt static const stdarg.h subtítulos Symbian tar teléfonos móviles temperatura temperatura cpu Temporizador tesseract Timer timestamp Trigonometría tts tutorial uid unicode user USI va_arg va_end va_list va_start velocidad ventilador Voltaire wallpaper xboxdrv xinput xrandr Z80 zip

jueves, mayo 18, 2023

Diferencia entre acceder a a los elementos de un QVector con [] frente a usar el método at(). Puntero a un elemento de un QVector

QVector::at(int i) const devuelve una referencia constante al elemento en la posición <i>, no un puntero. No se puede obtener directamente un puntero al elemento utilizando este método.

El operador de índice [] devuelve una referencia (no constante) al elemento.Hay que tener en cuenta que este método no realiza ninguna verificación de rango. Si el índice está fuera del rango válido del QVector, el comportamiento es indefinido y puede causar errores en tiempo de ejecución. Es conveniente verificar el rango antes de devolver el puntero.

MiContainer * at(int idx) { return &_db[idx];} // funciona

MiContainer * at(int idx) { return &_db.at(idx);}// no funciona

error: invalid conversion from ‘const FunctionContainer*’ to ‘FunctionContainer*’ [-fpermissive]

 

 

Versión con verificacion de rango:

MiContainer * at(int idx) {
    assert(idx>=0 && idx<_db.size(); //verificación de rango durante el desarrollo
    return &_db[idx];
}

domingo, abril 30, 2023

Obtener la lista de usuarios y el pid en linux

Respuesta concisa:

 cut -d: -f1,3 /etc/passwd


-d: El delimitador de campo es ':'

-f1,3. Interesan los campos 1 y 3.

/etc/passwd guarda todos los usuarios del sistema.

compilar con la libreria gmp y c++

En el cpp:

#include <iostream>
#include <gmpxx.h>

 y a lo hora de compilar:

 g++ -o tst01 tst01.cpp -lgmpxx -lgmp

miércoles, abril 26, 2023

Relación entre archivos se texto y audio.

La posibilidad de crear archivos de texto puedan ser leídos en voz alta por una voz artificial, plantea la duda de cual es la relación entre el tamaño de un texto y el tamaño de un archivo de audio generado por una voz artificial.

Una  solución gratuita para textos pequeños la ofrece la API de Google para Text-to-Speech.

Se puede utilizar con python con el proyecto gTTS.

Pero ahora que existe una forma de convertir archivos de texto en archivo de audio, sería interesante conocer la relación entre el tamaño del texto y la características del archivo MP3 generado. Como estamos en el siglo XXI y la era de la IA, aquí dejo lo que le pregunté a chatGPT y lo que contestó:

PREGUNTA:

Con estos datos muestra las formulas que permiten calcular  tamaño de archivo de audio y duración de audio a partir del tamaño del texto


muestra 1: onda.txt
40.5 kb texto
15.4 mb audio
duración: 1h 07 minutos

muestra 2: pajaro.txt
19.9 kb texto
6.1 mb audio
duración: 26 minutos

muestra 3:ciclope.txt
60.2 kb texto
18.3 mb audio
duración : 1h 20 minutos


RESPUESTA:

Para calcular el tamaño del archivo de audio y la duración del audio a partir del tamaño del texto, primero necesitamos establecer relaciones entre los datos proporcionados. Vamos a utilizar las tres muestras proporcionadas para crear proporciones entre texto, audio y duración:

Muestra 1:
Texto: 40.5 KB
Audio: 15.4 MB
Duración: 1 h 7 min = 67 min

Muestra 2:
Texto: 19.9 KB
Audio: 6.1 MB
Duración: 26 min

Muestra 3:
Texto: 60.2 KB
Audio: 18.3 MB
Duración: 1 h 20 min = 80 min

    Proporción entre tamaño del texto y tamaño del archivo de audio:
    Para cada muestra, calcularemos la proporción entre el tamaño del texto y el tamaño del archivo de audio.

Muestra 1: (15.4 MB * 1024 KB/MB) / 40.5 KB ≈ 391.11
Muestra 2: (6.1 MB * 1024 KB/MB) / 19.9 KB ≈ 314.57
Muestra 3: (18.3 MB * 1024 KB/MB) / 60.2 KB ≈ 311.96

La proporción no es constante entre las muestras, pero podemos tomar un promedio de las tres proporciones para obtener una relación aproximada:

Promedio de proporciones ≈ (391.11 + 314.57 + 311.96) / 3 ≈ 339.21

Entonces, podemos usar la siguiente fórmula aproximada para calcular el tamaño del archivo de audio a partir del tamaño del texto:

Tamaño del archivo de audio ≈ (Tamaño del texto) * 339.21


    Proporción entre tamaño del texto y duración del audio:
    Para cada muestra, calcularemos la proporción entre el tamaño del texto y la duración del audio.

Muestra 1: 67 min / 40.5 KB ≈ 1.65 min/KB
Muestra 2: 26 min / 19.9 KB ≈ 1.31 min/KB
Muestra 3: 80 min / 60.2 KB ≈ 1.33 min/KB

De nuevo, la proporción no es constante, pero podemos tomar un promedio de las tres proporciones para obtener una relación aproximada:

Promedio de proporciones ≈ (1.65 + 1.31 + 1.33) / 3 ≈ 1.43 min/KB

Entonces, podemos usar la siguiente fórmula aproximada para calcular la duración del audio a partir del tamaño del texto:

Duración del audio ≈ (Tamaño del texto) * 1.43 min/KB

Recuerda que estas fórmulas son aproximadas y pueden no ser precisas para todos los casos, ya que las proporciones pueden variar dependiendo de la naturaleza de los datos y otros factores como la tasa de bits, frecuencia de muestreo y codificación utilizada.

A esto añado que la sintesis de voz de Google habla muy despacio y no he sido capaz de que hable más rápido. Una posible solución seria acelerar el tempo el archivo con sox. 

sox <filein.mp3> <fileout.mp3> tempo 1.33 

parece dar buen resultado, pero eso va con gustos y es sólo una idea.

sábado, abril 22, 2023

cuadro de dialogo yes-no

 


    QString txtDlg = QString ("¿Desea eliminar el capítulo %1?").arg(this->spinCap->value());
    QString dlgTitle = "Eliminar capítulo";
    int result = QMessageBox::question(this,dlgTitle,txtDlg,
    QMessageBox::Yes | QMessageBox::No, //botones
    QMessageBox::No                   // Botón predeterminado (en este caso, "no")
);

if (result == QMessageBox::Yes) {
    // El usuario ha pulsado "sí"
} else {
    // El usuario ha pulsado "no"
}


Nueva sintasix para signals y slots en Qt5

Las dos maneras de conectar un QAction con un slot:

1. Moderna sintaxis de conexiones tipo-safe (seguras) introducida en Qt5, utilizando punteros a funciones miembro.


connect(_actionBorrar, &QAction::triggered, this, &MainWindow::borrarChapter);

&QAction::triggered: Es un puntero a la función miembro triggered de la clase QAction.

&MainWindow::borrarChapter: Es un puntero a la función miembro borrarChapter de la clase MainWindow. borrarChapter es un slot personalizado que contiene el código que se ejecutará cuando se conecte a una señal y esta se emita

Con la nueva sintataxis en la declaracion de la clase los bloques signals: y public slots: son opcionales. Las señales no tienen que estar bajo una etiqueta signals, pero deben ser declaradas como funciones miembro sin implementación.


Ventajas sobre la sintaxis antigua:

    Verificación en tiempo de compilación: Si la señal o el slot no existen o no coinciden en sus tipos de argumentos, el compilador generará un error. Esto ayuda a detectar errores antes de que se ejecute el programa.
    Mayor legibilidad: Al utilizar punteros a funciones miembro, queda más claro qué función de qué objeto se está conectando.
    Soporte para funciones lambda: Con esta sintaxis, puedes conectar una señal directamente a una función lambda en lugar de tener que definir un slot separado.


2. Tradicional sintaxis de conexiones basadas en macros:


connect(_actionBorrar, SIGNAL(triggered()), this, SLOT(borrarChapter()));

Desventajas en comparación con la sintaxis tipo-safe:

  •     Verificación en tiempo de ejecución: Si la señal o el slot no existen o no coinciden en sus tipos de argumentos, el error solo se detectará en tiempo de ejecución, lo que puede dificultar la depuración y aumentar la probabilidad de errores.
  •     Menos legibilidad: Las macros SIGNAL() y SLOT() hacen que el código sea menos claro y más difícil de entender en comparación con la sintaxis basada en punteros a funciones miembro.
  •     No hay soporte para funciones lambda: Esta sintaxis solo permite conectar señales a slots definidos previamente en una clase.


martes, abril 18, 2023

Comprobar se un QString está vacio.

Dos formas de expresión

1. if (saveFilename.isEmpty()) return;

2.  if (saveFilename=="") return;

La diferencia.

 La función "isEmpty()" es una función de la clase QString que verifica si la cadena de texto está vacía o no. Esta función se recomienda para verificar si un QString está vacío.

Por otro lado, la expresión saveFilename=="" es una comparación de cadenas de texto que compara explícitamente el QString con una cadena de texto vacía. Esta comparación también funciona, pero no es la forma recomendada de verificar si un QString está vacío.

La principal diferencia entre ambas expresiones es que la función "isEmpty()" es más eficiente, ya que utiliza una verificación interna de la longitud de la cadena de texto. En cambio, la comparación de cadenas de texto saveFilename=="" realiza una comparación explícita y requiere más tiempo de ejecución.

Además, también es posible que la comparación explícita saveFilename=="" no funcione correctamente en algunas situaciones si el QString contiene caracteres especiales o espacios en blanco. Por lo tanto, en general, es mejor utilizar la función "isEmpty()" para verificar si un QString está vacío.

Añadir un archivo de texto a los recursos de un proyecto en Qt

1. Preparación

Guardar el archivo en un subdirectorio del proyecto:
<directorio del proyecto>/recursos/template01.html


2. Crear archivo .qrc

Click derecho en el proyecto en la ventana del navegador y seleccionar add new...
En la ventana add new:
    Qt - Qt Resource File
En la ventana Qt resource File - Location
    name: <El nombre del archivo de recursos> p.j. "templates.qrc" que se ubicará debajo de Resources como Resources/templates.qrc
    path: <la del proyecto>

3. Añadir el archivo .html

Click derecho sobre templates.qrc. Seleccionar add existing files...

El archivo aparece en templates.qrc/recursos/templat01.html

Acceso al archivo:
QString filename = ":/recursos/template01.html";

4. La siempre olvidada forma de cargar archivos de texto dentro de un QStringList

Para leer el archivo:
QFile file(filename);
QStringList lstret;

if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) assert(false);

while (!file.atEnd()) {
    QByteArray line = file.readLine();
    process_line(line);

}

Bucle for con la sintaxis de C++11

 Formas de imprimir el contenido de un QStringList

1. La clasica

// Recorre la lista y muestra cada elemento
for (int i = 0; i < lista.size(); ++i) {
    QString elemento = lista.at(i);
    qDebug() << elemento; // Imprime el elemento en la consola
}

2. Sintaxis "for range" de C++11


a) Puede valer

for (QString elemento:lstTemplate)
{
    qDebug() << Q_FUNC_INFO << elemento;
}

Esta versión tiene la desventaja de que realiza una copia de cada elemento de la lista, lo que puede tener un impacto en el rendimiento si la lista es grande o si se está realizando operaciones costosas en cada elemento.

b) Mejor pero más largo

for (const QString &elemento : lstTemplate) {
    qDebug() << Q_FUNC_INFO << elemento;
}


 Observaciones:

  •  "const QString &elemento" en lugar de "QString elemento" evita la copia de los elementos en cada iteración del bucle for.
  •  El operador "&" se utiliza para declarar "elemento" como una referencia constante al tipo de dato que contiene la lista, en este caso QString.


Al utilizar una referencia constante, se evita la copia de los elementos y se mejora el rendimiento del programa si la lista es grande o si se está realizando operaciones costosas en cada elemento.

lunes, abril 17, 2023

Añadir una segunda toobar

 En el constructor:

1) Crear una nueva instancia de la clase QToolBar.

 QToolBar * secondBar = new QToolBar(this);

 

2)  (opcional) Crear un la QLabel y ponerla en la toolbar, por hacer algo

 QLabel *label1 = new QLabel("Label de ejemplo");

 secondBar->addWidget(label1);
 

3) Añadir la toobar a la ventana.

addToolBar(secondBar);

Ejemplo de cómo crear una acción en una barra de herramientas en una aplicación de Qt

Creación de un botón en el toolbar con tres lineas en el contructor: 

   QAction *action1 = new QAction("Abrir", this);
    ui->mainToolBar->addAction(action1);
    connect(action1, &QAction::triggered, this, &MainWindow::openFile);

 

 

1) QAction *action1 = new QAction("Abrir", this);

Se crea una nueva acción con el nombre "Abrir" y se asigna a la variable action1. El this pasado como segundo parámetro es un puntero al objeto que está creando la acción. En este caso, se asume que es la ventana principal (MainWindow) de la aplicación.

 

2)  ui->mainToolBar->addAction(action1);

Se agrega la acción action1 a la barra de herramientas principal (mainToolBar) de la ventana principal (ui).

 

3) connect(action1, &QAction::triggered, this, &MainWindow::openFile);

Se conecta la señal triggered de la acción action1 con la ranura openFile() en la ventana principal (MainWindow). Cuando se activa la acción, se llamará a la función openFile() en la ventana principal.

Observar que la funcion MainWindow::openfile() se conecta como  &MainWindow::openFile. Esto se debe a que connect recibe como parámetro la dirección de la memoria de la función.

Nota: Para acceder a los metodos del qaction fuera del constructor, hay que declararlo en la clase, fuera del constructor.

en mainwindow.h:

 QAction *action1;

en el constructor: 

action1 = new QAction("Abrir", this);

y en cualquier funcion se utliza:

action1->setEnabled(false);

Nota 2: Se puede declarar en el constructor, pero al QAction hay que darle un nombre con setObjectName() y hay que buscarlo  con ui->mainToolBar->findChild<QAction*>(<nombre>).

sábado, marzo 25, 2023

Un script para crear imagenes con texto utilizando imagemagick 6.9

Aquí se utiliza una versión antigua de imagemagick

Version: ImageMagick 6.9.10-23 Q16 x86_64 20190101 https://imagemagick.org

El script:

convert -gravity center -background transparent -fill black -size 80x40 -pointsize $POINT_SIZE -density 20 caption:"Retroceso" retroceso.png
convert -gravity center -background transparent -fill black -size 80x40 -pointsize $POINT_SIZE caption:"Avance" avance.png
convert -gravity center -background transparent -fill black -size 80x40 -pointsize $POINT_SIZE caption:"Reset" reset.png


El resultado:




 Tres imágenes de muestra.


Extraer en memoria un archivo de texto contenido en un zip utilizando python

 1. Ver el contenido del archivo zip:

from zipfile import ZipFile

filename = "zip4.zip"

# obtencion <class 'zipfile.ZipFile'>
zFile = ZipFile(filename)


print (type (zFile))

for name in zFile.infolist():
print (name)

 

2. Guardar el archivo contenido en una clase 'bytes'.

Más información sobre la clase bytes.

t2 ='a_una carpeta/act.txt'

with zFile.open(t2) as myfile:
content = myfile.read()

3. Ver el contenido del archivo:

print ("tipo:" + str(type(content)))
print (content)

4. Alternativamente, para descomprimirlo en el disco duro:


zFile.extract("a_un texto.txt", "/tmp")
zFile.extract("a_una carpeta/en_carpeta_texto1.txt","/tmp")

sábado, marzo 18, 2023

Ocultar un div y su contenido en html utilizando css

 Esto parece que funciona:

#contenedor {
display:none;
}

Variables globales en javascript.

0. El donde

Esto vale cuando el javascript está en el archivo HTML

 

1. El cómo.

  • Las variables globales se declaran con 'let', fuera de las funciones y debajo de

<script type="text/javascript" >

 

  • Las variables que hacen referencia a valores se pueden declarar así:

let bloqueVisible = 0;
let maxBloqueVisible = 4;

 

  • Las que hacen referencia a elementos del documento HTML se declaran sin valor y se les pone el valor en la función que se llama al cargar la página (onload="algo())" en la etiqueta del body.
let buffer;
let display;
 let child;

 

  • En la función que se ejecuta en la carga de la página:
buffer = document.getElementById("container2");
display = document.getElementById("container");
child = document.getElementById("div1");

 

  •     Y ya se pueden utilizar en todas las funciones:
display.appendChild(child);
buffer.appendChild(child);


lunes, marzo 06, 2023

Configuracion muy básica de samba

 1. El archivo de configuración

/etc/samba/smb.conf

 2. Modificar a conveniencia

....

3. Reiniciar el servicio

smbd restart

domingo, marzo 05, 2023

Un QMessagebox en 3 lineas

 

    QMessageBox msgBox;
    msgBox.setText("Un mensajebox en 3 lineas.");
    msgBox.exec();
 
 
Relacionada:
Qmessagebox con acentos 
QMessageBox más completo 

sábado, marzo 04, 2023

Crear una clase derivada de QImage

0. La idea

La idea es crear una clase derivada de QImage llamada MiQImage

1. En miqimage.h

#include <QWidget>

// Clase derivada de QImage class MiQImage : public QImage { public: // El constructor de la clase derivada sólo necesita el ancho y alto. MiQImage(int w, int h);
private: };

 
2. En miqimage.cpp
 
#include "miqimage.h"

// Llamada al constructor de QImage, pasandole el tamaño y el formato harcoded MiQImage::MiQImage(int w,int h): QImage(w,h,QImage::Format_RGB32) { }
3. Uso en MainWindow
 
· Crear una variable:
MiQImage * image;

// Asignar tamaño y rellenar con un color 

image =new MiQImage(640,480); image->fill(Qt::red);

 
4. Para mostrar en pantalla hay que convertir miqimage en un QPixmap y ponerlo en un QLabel
 

    QPixmap pix = QPixmap::fromImage(*image);
    ui->label->setPixmap(pix);
 
 
 Recordar 
  ·que QImage no derivea de QObject, no tiene signals ni slots.
  ·que MiQImage necesita ser inicializada con un tamaño, que sino no aparece nada en la pantalla  

miércoles, enero 11, 2023

Creación de un script en bash para facilitar la comprensión de la salida de smartctl, paso a paso,

Recuerda:


0. Objetivo

El comando smartctl tiene un gran número de parámetros y muestra una gran cantidad de información. Este script ejecuta smartctl con los parámetros necesarios y muestra una información básica. 

En la presente entrada se muestra todo el proceso de creación del script en bash, la utilización de funciones, condiciones, redirección y el uso de las instrucciones smartctl, grep y cut.

Advertencia: Este script se ha escrito con pocos conocimientos de bash y muchas consultas a google. Parece funcionar en Debian 10 Buster  (v10.13 del 10 de septiembre de 2022)

 

1. El esqueleto de una función en bash

#!/bin/bash

hello_word() {
    echo "hola"
}

hello_word

1.1 Funciones en bash

  • La función no lleva consta de un nombre seguido de un paréntesis vacío y el código de la función entre llaves. 
  • Los parámetros de la función se acceden mediante $1, $2, etc.
  • Las llamadas a la función no utilizan paréntesis.
  • La función se llama simplemente con su nombre.
  • Los parámetros se añaden a continuación del nombre, sin paréntesis
  • Hay que tener cuidado con los espacios en la instrucción if

if [ $? == 0 ];


2. Detección de la presencia de los discos duros

Para detectar la presencia del disco duro se hace un ls al dispositivo y se examina el resultado devuelto en la variable de bash $?. Si  el dispositivo existe se devolverá 0, de lo contrario, un valor distinto corresponde al código de error.

detect_hds() {
    echo "Buscando sda"
    ls /dev/sda &> /dev/null
    echo $?
    echo "Buscando sdb"
    ls /dev/sdb &> /dev/null
    echo $?
    echo "Buscando sdc"
    ls /dev/sdc &> /dev/null
    echo $?
    echo "Buscando sdd"
    ls /dev/sdd &> /dev/null
    echo $?
}

detect_hds

 

3. Añadiendo la instrucción if 

Un bloque if muy básico. La instrucción ls devuelve un código de error 0 en caso de éxito. Aquí se examina el valor devuelto.

    if [ $? == 0 ];
    then
        echo "OK"
    else
        echo "No detectado"
    fi


4. Simplificación de la función utilizando un parámetro

El tamaño de la función llamando a la función con un parámetro que contenga el dispositivo.

#!/bin/bash

La función no lleva los parámetros en la declaración. Internamente se llaman $1, $2, ...

detect_hd() {
    ls "$1"  &> /dev/null
    if [ $? == 0 ];
    then
        echo "$1 OK"
    else
        echo "$1 No detectado"
    fi
}

El parámetro va a continuación del nombre de la función, sin paréntesis.
detect_hd /dev/sda
detect_hd /dev/sdb
detect_hd /dev/sdc
detect_hd /dev/sdd

 

5. Comprobar la salud del disco duro con smartctl

La respuesta más sencilla de smartctl se obtiene con el parámetro -H. Obtener esta linea:

SMART overall-health self-assessment test result: PASSED

tranquilizará todos los espíritus inquietos.

    if [ $? == 0 ];
    then
        #echo "$1 OK"
        smartctl -H "$1" |grep health
    else
        echo "$1 No detectado"
    fi


6. Obtener las horas de uso del disco duro

Como curiosidad, obtener el resultado del atributo  Power_On_Hours.

6.1. GREP: obtención de la linea que contiene el atributo  Power_On_Hours

Obtener de smartctl  con -A <dispositivo> la lista de atributos  y extraer con grep el que interesa. En este caso, el nombre del dispostivo /dev/sdx se sutituye por el primer parámetro de la función ($1).

LINE=`smartctl -A $1 | grep "Power_On_Hours"`

6.2 CUT: obtención del dato con el número de horas

Tenemos en $LINE una serie de palabras separadas por espacios (parámetro -d '<espacio>'). La que nos interesa obtener es la que ocupa la posición (parámetro -f10).

HOURS=`echo  $LINE  |cut -d ' ' -f10`

 

7. El resultado final

#!/bin/bash

detect_hd() {
    ls "$1"  &> /dev/null
    if [ $? == 0 ];
    then
        #Obtención de datos
        DEVICE=`smartctl -i "$1" | grep "Device Model"`
        MODEL=`smartctl "$1" -i |grep "Model Family"`
        POW=`smartctl -A $1 | grep "Power_On_Hours"`
        HOURS=`echo  $POW  |cut -d ' ' -f10`
        HEALTH=`smartctl -H "$1" | grep health`

        echo "+--------------------------------------"
        echo "|Linux Device:     $1"
        echo "|$MODEL"
        echo "|$DEVICE"
        echo "|Power on hours:   $HOURS"
        echo "|$HEALTH"
        echo "+--------------------------------------"
    else
        echo "$1 No detectado"
    fi
    echo
}

detect_hd /dev/sda
detect_hd /dev/sdb
detect_hd /dev/sdc
detect_hd /dev/sdd

8. Ejecutar desde el escritorio KDE

8.1 Ejecutar smartctl como root

Esto se puede hacer de muchas maneras. Una de ellas es crear un segundo script llamado launcher.sh:

#! /bin/bash
su - -c /home/user/mismart.sh
read -p "Press Enter to continue"

8.2 Añadir un lanzador de apliciones al escritorio

 URL konsole -e /home/user/launcher.sh

Permisos: marcar es ejecutable



martes, diciembre 06, 2022

Script en Linux para realizar una copia de respaldo comprimida en Mega

 0. La idea

Al instalar la aplicación de escritorio de Mega se crea un directorio  MEGAsync que automáticamente se sincroniza con la nube. El objetivo es comprimir el directorio deseado y guardar el archivo en ese directorio para que automáticamente se guarde en la nube. El script se ejecuta manualmente, a sí que la copia de respaldo se realiza cuando lo desea el usuario. Cada archivo comprimido tiene un nombre diferente, así que se pueden guardar varias versiones del directorio y borrar las versiones antiguas cuando lo desee el usuario.


1. El comando date para obtener la fecha del sistema

FECHA=`date "+%y%m%d-%H%M%S"`


2.1 Construir el nombre del archivo comprimido

El nombre del archivo de destino consistirá en "test_AAMMDD-HHMMSS.tar.gz", que además de contiene el momento de creación.

DEST="test_${FECHA}.tar.gz"

 

2.2 Añadir la ruta del directorio que se sincroniza con la nube

LONG_DEST="/home/user/MEGAsync/${DEST}"


3. El directorio del que se desea la copia de respaldo

  • Si se desea la ruta completa:

 ORIGEN="/home/user/Documentos/qt/test"

  • Dependiendo de la localización del script, la ruta relativa es simplemente el nombre del directorio:

ORIGEN="test"

 

4. El comando de compresión

tar -zcvf "$LONG_DEST" "$ORIGEN"

 

5. El comando de descompresión

Con suerte nunca será necesario


Enlaces

Para entender el comando date

Para entender el comando tar