Categorías
hoy aprendí ...

… a ordenar archivos en carpetas según el patrón de nombre

Descargando un montón de referencias desde Instagram usando esta maravillosa extensión, Instagram Download Button, me llené de archivos JPG y MP4 y se hacía necesario ordenarlos en carpetas.

El patrón es que todos los archivos tienen en la primer parte del nombre la perfil de Instagram y luego la fecha y hora original del posteo seguidos de un choclazo de números, así que tendría que ser «relativamente» sencillo poder encarpetarlos identificando el perfil.

nombre_perfil-YYYYMMDD_HHMMSS-XXXXXXXXX….. [jpg|mp4]

Buscando en encontré varias propuestas aproximadas para hacer algo como lo que quería

Y la opción ganadora

Extract part of a file name in bash

Específicamente esta respuesta que utiliza el comando SED. La única condición es que la primera parte no sean numeros.

El escenario

I have a folder with lots of files having a pattern, which is some string followed by a date and time:

BOS_CRM_SUS_20130101_10-00-10.csv (3 strings before date)
SEL_DMD_20141224_10-00-11.csv (2 strings before date)
SEL_DMD_SOUS_20141224_10-00-10.csv (3 strings before date)

I want to loop through the folder and extract only the part before the date and output into a file.

Output
BOS_CRM_SUS_
SEL_DMD_
SEL_DMD_SOUS_

La propuesta

Assuming you wont have numbers in the first part, you could use:

$ for i in *csv;do  str=$(echo $i|sed -r 's/[0-9]+.*//'); echo $str; done
BOS_CRM_SUS_
SEL_DMD_
SEL_DMD_SOUS_

Prueba

Cuando hice la prueba, solo mostrando el resultado del SED, funcionaba casi como lo deseaba, con el único tema que era que procesaba algunos archivos con otros patrón de nombre (que no eran necesarios) y los que si debía procesar dejaba el guión del medio.

Ejemplo:

almendromaestro-20220602_195749-285312905_1062446314350240_327302066906487345_n.jpeg

> almendromaestro-

Mi modificación a la RegExp

Agregar un guión que aparece antes de la regla para la fecha, así sólo busca los archivos que se aproximan al patrón.

sed -r 's/-[0-9]+.*//'

y pasó el testeo!

Script terminado

Básicamente hace un loop en todos los archivos que haya en la carpeta, separa el nombre y la almacena en STR (y lo mostramos para ir viendo el progreso), usa eso para verificar que si no existe una carpeta la crea, y luego mueve el archivo a la carpeta.

#!/bin/sh

for i in *.*
do
  str=$(echo $i|sed -r 's/-[0-9]+.*//'); 
  echo $str;
  if [ ! -d $str ]; then
      mkdir $str
  fi
  mv $i $str
done

Y chau!

Categorías
hoy aprendí ...

… a reparar unos errores en GIT al hacer push

Quise realizar un push a un repositorio remoto y me soltó un error que nunca había visto:

remote: error: refs/tags/v2.0 does not point to a valid object!

Pensé que se trataba de algún archivo en el disco remoto que se había corrompido, pero cuando hice la prueba con otro repositorio obtuve un error similar (lo trato más abajo).

Lo que pude averiguar es que la referencia del tag v2.0 no apuntaba bien. La solución no está confirmada pero hice:

  • prune en el repo remoto
  • gc tambien en el remoto, aunque me soltaba un error también relacionado con el tag v2.0
  • desde el repo local borré el tag remoto
  • hice un prune y gc (me dio error)
  • luego el push del tag local al repo remoto y funcionó.

En el caso del otro repositorio el problema eran ramas y no etiquera, y varias.

Aquí lo que me funcionó fue: en el repo remoto editar el archivo packed-refs y eliminar las referencias de las ramas indicada, correr un prune y luego en un gc. En el repo local facer un prune y un fetch. Y funcionó.

No estoy totalmente seguro pero hay pasos que me parece que no hace falta.

Chau.

Categorías
hoy aprendí ...

… a recuperar mis escritorios en W10 y darle una patada al Task View

Resulta que a pesar de tener que trabajar en Windows 10 había logrado organizar el tema de los múltiples escritorios para ayudarme a focalizar el trabajo según el tema con la ayuda de Windows 10 Virtual Desktop Enhancer, una aplicación que le agregaba mejoras a los paupérrimos escritorios virtuales (virtual desktops) que traía el sistema operativo ¡en pleno 2019! Nada de fondos personalizados o la posibilidad de darles nombres. Había que recurrir a soluciones de terceros.

El W10VDH ya no tenía soporte ni desarrollo desde fines del 2018 pero funcionaba muy bien hasta hace poco, cuando hubo una actualización de Windows que de repente había habilitado el Task View, Historial, Cortana, y otras «mejoras» más. Pasó que de repente cuando cambiaba de escritorio no me cambiaba el fondo, ni me mostraba el nombre, y al hacer WIN+TAB para tener la vista general de las ventana, me habían cambiado todo de lugar, y aparecía lo de la actividad reciente con el Historial. WTF!

La solución que encontré para poder trabajar como venía haciendo fue:

  1. Encontrar un fork más actualizado del Windows 10 Virtual Desktop Enhacer: https://github.com/vlwkaos/win10-virtual-desktop-enhancer
  2. Descargar el repositorio y ubicar los nuevos scripts en la carpeta donde tenía corriendo el ejecutable original del Windows 10 Virtual Desktop Enhacer.
  3. Desactivar la tecla TaskView de la barra, Cortana, y el Historial.
Categorías
hoy aprendí ...

… a agregar un botón de compartir

Amiguito SHARE para meter como link y que en dispositivo lance las opciones de compartir.

if(navigator.share !== undefined) {
    document.addEventListener('DOMContentLoaded', e => {
      var shareBtn = document.querySelector('div.share a');
      shareBtn.addEventListener('click', clickEvent => {
        clickEvent.preventDefault();
        navigator.share({title: document.title, text: window.location.href, url: window.location.href})
          .then(() => console.log('Successful share'),
           error => console.log('Error sharing:', error));
      });
    });
}

Esta joyita la encontré en https://paul.kinlan.me/navigator.share. ¡Gracias!

Le hice una modificación para tratar de incorporarlo en el plugin Storefront Product Share combinando algo de PHP y agregando:

		<div class="storefront-product-sharing">
			<ul>
				<li class="twitter"><a href="<?php echo esc_url( $twitter_url ); ?>" target="_blank" rel="noopener noreferrer"><?php _e( 'Share on Twitter', 'storefront-product-sharing' ); ?></a></li>
				<li class="facebook"><a href="<?php echo esc_url( $facebook_url ); ?>" target="_blank" rel="noopener noreferrer"><?php _e( 'Share on Facebook', 'storefront-product-sharing' ); ?></a></li>
				<li class="pinterest"><a href="<?php echo esc_url( $pinterest_url ); ?>" target="_blank" rel="noopener noreferrer"><?php _e( 'Pin this product', 'storefront-product-sharing' ); ?></a></li>
				<li class="email"><a href="<?php echo esc_url( $email_url ); ?>"><?php _e( 'Share via Email', 'storefront-product-sharing' ); ?></a></li>
        <li class="share-redes"><a href="#"><i class="fas fa-share-alt-square"></i> Compartir</a></li>
			</ul>
		</div>
    <script>
      if(navigator.share !== undefined) {
        document.addEventListener('DOMContentLoaded', e => {
          var shareBtn = document.querySelector('.share-redes a');
          shareBtn.addEventListener('click', clickEvent => {
            clickEvent.preventDefault();
            navigator.share({
              title: '<?php echo $product_title; ?>', 
              text: '<?php echo $product_url; ?>', 
              url: '<?php echo $product_url; ?>'
            })
            .then(() => console.log('Successful share'),
            error => console.log('Error sharing:', error));
          });
        });
      } else {
        console.log('Share API no soportado');
        var shareBtn  = document.querySelector('.share-redes');
        shareBtn.textContent = '';
      }
    </script>

Categorías
hoy aprendí ...

… a complicar las cosas en una hoja de cálculo

Necesitaba indicar una celta de manera «dinámica», es decir, formando el nombre dependiendo de la combinación del contenido de otras celdas.

Lo que tenía es una serie de datos encolumnados y totales parciales cada cierta cantidad regular de celdas. Me interesaba tener luego un resumen de esos totales parciales para confeccionar una tabla.

Por ejemplo: en la la página datos tiene la columna A y cada 20 filas hay un total parcial, entonces en la tabla de resumen (que está en otra hoja llamada resumen) la celda en fila 1 tiene que tomar los datos de $datos.A20, la fila 2 tiene que tomar los datos de $datos.A40, y así.

La solución que encontré es utilizar la función ADDRESS que permite indicar el nombre usando datos. Buscando ejemplos prácticos encontré https://forum.openoffice.org/es/forum/viewtopic.php?f=21&t=8091

Encontré esto otro que podría resultar interesante también aunque no lo puse en práctica: https://help.libreoffice.org/6.1/es/text/scalc/guide/value_with_name.html

Otra cosa interesante es: https://blog.open-office.es/calc/lista-desplegable-condicionada-en-openoffice-libreoffice-calc

Me falta completar con la solución que usé