2022/10/28

Vim recordatorio de cosas útiles

El editor Vim siempre suele estar disponible en cualquier servidor remoto. Es muy recomendable manejarse con cierta soltura con este programa para poder configurar un fichero, analizar logs, etc.

Pero además es que Vim puede ser una herramienta muy completa y conveniente para programadores sin necesidad de tener un IDE.

Hay mucha documentación y tutoriales de comandos básicos, pero aquí quiero poner los que más utilizo (y que se me suelen olvidar):

Grabar macros: 

q<letra> : empezar grabación de macro en asociada a <letra>

q: terminar grabación

@<letra>: ejecuta la macro

<number>@@: ejecuta la ultima macro varias veces

https://vim.fandom.com/wiki/Macros


Seleccionar texto:

Usar "modo visual" con la letra "v".


Copiar a clipboard:

You could yank the text into the + (plus) register, that is mapped to the system clipboard. Just select the text in the mode you like and then type:

"+y


Abrir en una determinada línea:

vim +<num_linea> file.txt

VIM Y PYTHON

Si el plugin JEDI está yendo muy lento o causando cierres abruptos probar a deshabilitarlo:

let g:pymode_rope = 0
let g:jedi#completions_enabled = 0

Más datos sobre configuración de JEDI: https://pythonrepo.com/repo/davidhalter-jedi-vim-python-editor-plugins

       
   

2022/02/14

Python instalar paquetes propios en local

Si empiezas a estructurar el código de un proyecto en "packages" que pueden ser compartidos entre varios proyectos, pero todavía están en un estado de desarrollo que hace que haya cambios constantes en todos, ¿cómo puedo hacer para tener todo actualizado?

Mejor que estar copiando código o ficheros todo entre proyectos, o haciendo enlaces a directorios, puedes plantear el instalar en local (para ese entorno) los paquetes.

Convertir código en un package

Para hacer un package importable habría que:
  1. Tener todo el código con funcionalidad a importar dentro de una carpeta. P.e. "myproject"
  2. En el directorio padre de crear un fichero "setup.py"
  3. El fichero "setup.py" deberá tener la información necesaria para poder llevar a cabo la importación. P.e:
    from setuptools import setup
    
    setup(name='myproject',
          version='0.1',
          description='myproject does amazing things!',
          url='https://myuser@github.com/myuser/myproject.git',
          author='My Name',
          author_email='myuser@gmail.com',
          license='MIT',
          packages=['myproject'], ##
          zip_safe=False)
    
  4. Ejecutar `python -m pip install -e path_a_myproject` lo que creará un symlink que hará que lso cambios que se ejecuten el local estarán disponibles para todos los proyectos.
Además estos paquetes locales pueden ser incluidos de ese modo en el fichero "requeriments.txt". Para esto hay que tener en cuenta que la ruta es relativa al directorio desde donde se ejecuta "pip install -r" (no la ruta del fichero .txt). 

Más info: 
       
   

2016/01/15

Diferencias entre scripts Bash (gnu/linux) y Batch (windows)

Si estás acostumbrado a un lenguaje de scripting y tienes que trabajar en otro resulta muy engorroso y desesperante. 

Para echar una mano en este cambio, me ha sido muy útil el anexo de la guía "Advanced Bash-Scripting Guide" siguiente:


En ella, el autor Mendel Cooper expone mediante una tabla las equivalencias de palabras clave, sintaxis básica, variables y operadores. También se recogen equivalencias de programas o comandos básicos para mover y renombrar ficheros, listar un directorio, etc.

 Ánimo!
       
   

2015/09/11

Copiar archivos con conexiones lentas (windows)

La alternativa libre y válida para GNU/Linux, Mac y Windows es sin duda usar RSync, pero si estás en un windows desde Windows Vista, microsoft incorporado robocopy.exe como parte de la instalación estándar. La herramienta robocopy de línea de comandos es realmente útil para la copia masiva de ficheros en entornos windows, pudiendo programar con muchas opciones las copias, sincronizar carpetas, etc...

Entre las virtudes de este programa frente a una simple copia de ficheros con la interfaz de usuario o el comando "copy" están:

  • Posee un indicador de progreso de la copia.
  • Es tolerante a interrupciones en la copia de archivos.
  • Realiza reintentos automáticos si no se puede acceder a un archivo.
  • Permite copiar grandes cantidades de archivos.
  • Duplica información como propiedades, atributos, datos del propietario, fechas, etc. así como los permisos del archivo.

  • Una de las características más interesantes es el parámetro /IPG o Inter Packet Gap, que permite definir un tiempo en milisegundos entre cada paquete enviado. Esto permite que optimizar mucho el uso del ancho de banda en redes lentas o con problemas de conexión para no interferir en otros procesos. Para calcular mejor cómo configurar este parámetros IPG puede ser de utilidad el artículo "Copy files on slow links" y sobre todo su calculadora que me he permitido incorporar aquí traducida al español:

    Calculadora Robocopy IPG
    Tamaño
    Velocidad
    Valor IPG
    Paquetes
    Retardo (hh:mm:ss)
    Tiempo de copia (hh:mm:ss)
    Tiempo Total (hh:mm:ss)


    Para ver todos los parámetros que la herramienta ofrece visitar la página de documentación de microsoft sobre robocopy.
           
       

    2015/07/22

    Tamaño usado y libre de una base de datos Oracle

    Si no eres DBA de una base de datos Oracle y necesitas obtener el tamaño actual de un tablespace puedes obtenerlo con la consulta SQL siguiente:
    SELECT TABLESPACE_NAME,TO_CHAR(SUM(NVL(BYTES,0))/1024/1024/1024, '99,999,990.99') AS "USED SPACE(IN GB)"
     FROM USER_SEGMENTS
     GROUP BY TABLESPACE_NAME
    El valor de espacio libre disponible se obtiene con (sustuir 'MyDbName' con lo que corresponda):
    SELECT TABLESPACE_NAME,SUM(BYTES)/1024/1024 "FREE SPACE(MB)"
     FROM USER_FREE_SPACE
     where TABLESPACE_NAME in ('MyDbName')
     GROUP BY TABLESPACE_NAME;
           
       

    2015/07/17

    Averiguar versión, distribución y kernel desde consola en sistema GNU/Linux

    Para averiguar rápidamente la información de una máquina Linux, lo más sencillo es desde una terminal ejecutar:

    cat /etc/*-release

    Para tener más información del kernel usado, ejecuta:

    uname -a
           
       

    2015/06/03

    Compilar automáticamente Vistas y procedimientos en Oracle

    En ocasiones en bases de datos Oracle donde se almacenan procedimientos y vistas (sobre todo cuando hay relaciones entre estos elementos) pueden producirse errores que provocan que una compilación defectuosa incluso con elementos que estaban correctos.

    En algunos casos estas "descompilaciones" de VIEWs y PROCEDUREs se dan con cierta frecuencia y generan el malfuncionamiento de la base de datos y las aplicaciones que la usan. No he conseguido determinar porqué se produce este fenómeno, pero al menos he visto el modo de poder detectarlo. Para los schemas de BD "MYSCHEMA1" y "MYSCHEMA2":

    
    -- CHECK invalid views 
    --  and 
    -- invalid procedures (MYSCHEMA1, MYSCHEMA2)
    
    
    SELECT OBJECT_NAME, OBJECT_TYPE, owner 
    FROM all_objects 
    WHERE object_type in ('PROCEDURE', 'VIEW') 
    AND owner in ('MYSCHEMA1' , 'MYSCHEMA2') 
    AND status = 'INVALID' 
    ; 
    
    exit;
    

    Una vez detectado los errores de compilación se puede forzar la ejecución de una compilación con la sentencia:

    
    -- Recompile invalid views
    --  and
    -- Recompile invalid procedures
    
    begin
      FOR cur IN (SELECT OBJECT_NAME, OBJECT_TYPE, owner
      FROM all_objects
      WHERE object_type in ('PROCEDURE', 'VIEW')
      AND owner in ('MYSCHEMA1', 'MYSCHEMA2')
      AND status = 'INVALID' ) LOOP
    BEGIN
      if cur.OBJECT_TYPE = 'PACKAGE BODY' then
        EXECUTE IMMEDIATE 'alter ' || cur.OBJECT_TYPE || ' "' || cur.owner || '"."' || cur.OBJECT_NAME || '" compile body';
      else
        EXECUTE IMMEDIATE 'alter ' || cur.OBJECT_TYPE || ' "' || cur.owner || '"."' || cur.OBJECT_NAME || '" compile';
      end if;
    EXCEPTION
      WHEN OTHERS THEN NULL;
    END;
    end loop;
    end;
    /
    exit;
    
    
    Uniendo estas 2 sentencias en un script y programando la tarea en CRON con cierta frecuencia, se puede actuar sin intervención humana sobre este problema automáticamente.