Gestión de fotografías – ordenar las fotos por fechas

Un esquema de fotos debe ser simple:

  • Todos los dispositivos móviles (teléfono,tablet) suben a un sitio común.
  • Ese sitio común se debe organizar igual, en mi caso carpetas por año, y dentro de cada año, carpeta con año mes día. Es decir YYYY/YYMMDD-id

Para ello, llevo años usando el script photosort que crea carpetas leyendo los metadatos de la foto de los archivos exif: https://github.com/mangelajo/photosort.

Las instrucciones llevan a instalar con pip, pero en Debian 12.6, al intentar ejecutarlo, manda ya a usar pipx https://packages.debian.org/buster/pipx. Además, el sistema debe contar con las utilidades de exiftool para poder ver la fecha de modificación de cada foto en los metadatos del exif:

apt install libimage-exiftool-perl
apt-get install pipx
pipx install photosort

con todo esto bien escrito, llegamos a un punto muerto:

File "/usr/local/bin/photosort", line 33, in
sys.exit(load_entry_point('photosort==2021.1.4', 'console_scripts', 'photosort')())
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/photosort-2021.1.4-py3.11.egg/photosort/photosort.py", line 135, in main
exif.start()
File "/usr/local/lib/python3.11/dist-packages/photosort-2021.1.4-py3.11.egg/photosort/exif.py", line 11, in start
et.start()
^^^^^^^^
AttributeError: 'ExifTool' object has no attribute 'start'

Cliente de nextcloud con letras ínfimas

El cliente de nextcloud se carga con un tamaño de letra pequeño, que impide directamente leer los mensajes. Muchos post, ligan esto a la librería Qt, pero, en mi PC, esto no funcionó.

Resulta que está unido a la configuración del grub. Por lo que si las variables de grub no tienen una resolución definida, carga que no se puede leer.

Archivo /etc/default/grub

The resolution used on graphical terminal

GRUB_GFXMODE=1280x800x16
GRUB_GFXPAYLOAD_LINUX=keep

Cambios en /etc/grub.d/00-header

if [ “x${GRUB_GFXMODE}” = “x” ] ; then GRUB_GFXMODE=auto ; fi
if [ “x${GRUB_GFXMODE}” = “x” ] ; then GRUB_GFXMODE=1280x800x16; fi
if [ “x${GRUB_GFXPAYLOAD_LINUX}” = “x” ] ; then GRUB_GFXPAYLOAD_LINUX=1280x800x16; fi
(….)
set gfxmode=${GRUB_GFXMODE}
set gfxpayload=keep

Versión OS: Debian. Grub 2.04.

nextCloud: request entity too large

If you are willing to upload files larger than 511 MB, please check this guide:

https://docs.nextcloud.com/server/9/admin_manual/configuration_files/big_file_upload_configuration.html#configuring-your-web-server

If even your 2MB files fail, check all size limits in the following settings files:

.htaccess

root@f3d81bd814d4:/# grep upload /var/www/html/.htaccess 
php_value upload_max_filesize 511M 
php_value upload_max_filesize 511M

Nginx conf

If it is running, you should have /etc/nginx/nginx.conf file, where client_max_body_size needs to be configured to, at least, 512M

root@f3d81bd814d4:/# find . | grep nginx| xargs grep size | grep -v '#' 
./usr/src/nextcloud/core/doc/admin/_sources/installation/nginx.rst.txt: client_max_body_size 512M; 
./usr/src/nextcloud/core/doc/admin/_sources/installation/nginx.rst.txt: client_max_body_size 512M; 
./usr/src/nextcloud/core/doc/admin/installation/nginx.html: <span class="kn">client_max_body_size</span> <span class="s">512M</span><span class="p">;</span> 
./usr/src/nextcloud/core/doc/admin/installation/nginx.html: <span class="kn">client_max_body_size</span> <span class="s">512M</span><span class="p">;</span> 
./var/www/html/core/doc/admin/_sources/installation/nginx.rst.txt: client_max_body_size 512M; 
./var/www/html/core/doc/admin/_sources/installation/nginx.rst.txt: client_max_body_size 512M; 
./var/www/html/core/doc/admin/installation/nginx.html: <span class="kn">client_max_body_size</span> <span class="s">512M</span><span class="p">;</span> 
./var/www/html/core/doc/admin/installation/nginx.html: <span class="kn">client_max_body_size</span> <span class="s">512M</span><span class="p">;</span>

Nextcloud configuration

Settings > Administration > Settings > Basic settings

File handling


With PHP-FPM it might take 5 minutes for changes to be applied.

Imprimir pdf en modo espejo en linux

Los driver de impresión compatibles con HP en linux, no tienen modo espejo (o mirror) para imprimir. Sólo tienen opción para hacer una impresión en orden inverso de las páginas.

La impresión en modo espejo, es necesaria si vamos a usar la tinta de nuestra impresora, para transferirla sobre otra superficie. La impresión deberá estar invertida, para que la transferencia sea legible.

OPCIÓN 1: En svg con inkscape

  1. En el canvas de inkscape, se seleccionan los textos a invertir, y con la herramienta selección > reflejo horizontal se invierten todos los elementos seleccionados.
  2. Imprimir el resultado.

OPCIÓN 2: En pdf con un editor de textos

Para conseguir una impresión invertida, el mecanismo es el siguiente:

  1. Crear el documento
  2. Guardar en pdf. Este pdf no estará invertido.
  3. Inventirlo mediante convert:
convert -flop archivo1.pdf archivo1_invertido.pdf

Simple logging en python.

Tras muchas idas y venidas con la gestión de logs en python, he llegado a este tutorial de python que resume bastante bien la gestión más básica que se puede hacer en una aplicación con los logs:
En mi caso, los requisitos son:
– El log se guarda en fichero.
– El fichero debe rotar.
– Desde cualquier clase del workspace se puede acceder al log

import logging
import logging.handlers as handlers
 
# Se le puede poner cualquier nombre

logger = logging.getLogger(‘mi_app_name’)
logger.setLevel(logging.INFO)


#Log handler to file:
logHandler = handlers.RotatingFileHandler(‘mi_archivo_salida.log’, maxBytes=1000, backupCount=2)
logHandler.setLevel(logging.INFO)
# output format
formatter = logging.Formatter(‘%(asctime)s – %(name)s – %(levelname)s – %(message)s’)
logHandler.setFormatter(formatter)


logger.addHandler(logHandler)


# Comprobar que todos los logs van al mismo fichero:
logger.info(“Primer mensaje al log de tipo INFO”)
logger.error(“Primer mensaje al log de tipo ERROR”)
En cada clase que se vaya a usar el log, se instancia en el init, y luego se usa como un atributo de la clase:

class ejemplo:
“”” Clase de ejemplo para ver el log “””


def __init__(self):
“””Inicializa el objeto “””
self.logger = logging.getLogger(‘mi_app_name’) # Configurar el log.
 
     def metodo1. (self):
“”” Metodo 1 “””

self.logger.info(‘Mensaje de ejemplo 1’)

 
 
Para saber mucho más sobre los logs en python: https://docs.python.org/3/howto/logging-cookbook.html

Despliegue Apache Hadoop sobre Debian

Despliegue de Apache hadoop sobre Debian con un nodo único.

Esta guía particulariza la instalación sobre un servidor Debian, actualizando las rutas y valores que en la guía original de Hadoop, es necesario cambiar para que funcione.

Instalación de paquetes previos

 sudo apt-get install -y ssh rsync

Instalación de los paquetes propios de Apache Hadoop 2.9 (versión estable:

wget http://apache.uvigo.es/hadoop/common/stable/hadoop-2.9.0.tar.gz ;
# Descomprimir:
tar -xvzf hadoop-2.9.0.tar.gz ;
# Moverlo a /usr/bin
sudo mv hadoop-2.9.0 /usr/bin/hadoop-2.9.0 ;
# Creo un enlace, para no tener que buscar las rutas:
sudo ln -s /usr/bin/hadoop-2.9.0/bin/hadoop /usr/bin/hadoop

Configuración del entorno

Cambiar en la configuración, la ruta donde tengamos en nuestro sistema java.

whereis java; 
medit /usr/bin/hadoop-2.9.0/etc/hadoop/hadoop-env.sh
# set to the root of your Java installation
 export JAVA_HOME=/usr/bin/java

Iniciar Hadoop

Al haber creado ya un enlace durante la instalación, es suficiente con invocar hadoop de la siguiente manera:

hadoop

Desinstalación

rm -rf /usr/bin/hadoop-2.9.0
rm -rf /usr/bin/hadoop

Más información: https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/SingleCluster.html

Editar pdf multipágina en linux / Debian con master pdf editor

Descarga de paquetes

Descarga de paquete .deb de Master PDf editor

Instalación a través de dpkg:

dpkg -i master-pdf-editor-4.3.10_qt5.amd64.deb

Dependencias:

Requiere tener una versión de librerías QT 5.4.1 o superior.

Python: Encoding latin-1 utf-8

#!/usr/bin/python
# coding: latin-1

If script is stored in utf-8, a u character has to appear before any utf-8 strings, as in following example:

#!/usr/bin/python
# coding: utf-8

(....)

ws.write_string ("B6",u'Ñéñººª')

For cygwin users, python should be manually pointed at windows python available.

 ln -s  /cygdrive/c/Python27/python.exe /usr/bin/python

If encoding is not set up:

$ python fmyscript.py
  File "fmyscript.py", line 20
SyntaxError: Non-ASCII character '\xc3' in file ficha_conecta.py on line 20, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

To learn more about encoding: https://www.python.org/dev/peps/pep-0263/

 

 

Python: problemas con tildes, ñ, acentos, etc.

#!/usr/bin/python
# coding: latin-1

Si elegimos usar UTF-8, en todas las cadenas que vayan a tener un carácter especial se debe especificar una U delante de la cadena:

#!/usr/bin/python
# coding: utf-8

(....)

ws.write_string ("B6",u'Ñéñººª')

Si el script va a ejecutarse desde cygwin, es necesario apuntar /usr/bin/python a la versión del sistema:

 ln -s  /cygdrive/c/Python27/python.exe /usr/bin/python

Si en los scripts de python, no está bien especificado el tipo de caracteres de los fuentes, ante cualquier carácter especial del castellano aparece el siguiente error:

$ python fmyscript.py
  File "fmyscript.py", line 20
SyntaxError: Non-ASCII character '\xc3' in file ficha_conecta.py on line 20, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

Para saber más:  https://www.python.org/dev/peps/pep-0263/

Python 2.7. Instlar pypdfocr en windows

Si al instalar pypdfocr en windows 7, da un error de compilación

$ pip2.exe  install pypdfocr

(...)
Installing collected packages: PyYAML, argh, pathtools, watchdog, httplib2, oauth2, evernote, pypdfocr
  Running setup.py install for PyYAML: started
    Running setup.py install for PyYAML: finished with status 'error'
    Complete output from command c:\python27\python.exe -u -c "import setuptools, tokenize;__file__='c:\\cygwin\\tmp\\pip-build-k7lz4j\\PyYAML\\setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record c:\cygwin\tmp\pip-nggirp-record\install-record.txt --single-version-externally-managed --compile:
    running install
    running build
    running build_py
    creating build
    creating build\lib.win32-2.7
    creating build\lib.win32-2.7\yaml
    copying lib\yaml\composer.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\constructor.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\cyaml.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\dumper.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\emitter.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\error.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\events.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\loader.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\nodes.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\parser.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\reader.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\representer.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\resolver.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\scanner.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\serializer.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\tokens.py -> build\lib.win32-2.7\yaml
    copying lib\yaml\__init__.py -> build\lib.win32-2.7\yaml
    running build_ext
    creating build\temp.win32-2.7
    creating build\temp.win32-2.7\Release
    checking if libyaml is compilable
    error: [Error 2] El sistema no puede encontrar el archivo especificado

    ----------------------------------------
Command "c:\python27\python.exe -u -c "import setuptools, tokenize;__file__='c:\\cygwin\\tmp\\pip-build-k7lz4j\\PyYAML\\setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record c:\cygwin\tmp\pip-nggirp-record\install-record.txt --single-version-externally-managed --compile" failed with error code 1 in c:\cygwin\tmp\pip-build-k7lz4j\PyYAML\

Es necesario instalar tal y como comentan en stackoverflow vc  para windows :

Microsoft Visual C++ Compiler for Python 2.7

Una vez instalado, vc for Python, debe estar accesible desde el path. Desde command :

cmd_python_pypdfocr