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.
           
       

    2015/05/22

    Sin estilos en Django admin

    Si al subir una aplicación web a tu servidor, por ejemplo en Heroku, y no están accediendo a los estilos y otros ficheros estáticos, puede deberse a una mala configuración de las variables STATIC, STATIC_URL, etc. El tema de servir este tipo de ficheros está bastante bien recogido en la documentación oficial de Django, pero siempre pueden surgir problemas.

    Si la página de administración "/admin" está estilos seguramente aparecen errores tales como:

    static/admin/css/base.css 404 NOT FOUND
    en la consola de desarrollador del navegador.

    Si tienes acceso al servidor puedes probar a importar manualmente los ficheros estáticos con el comando:

    python manage.py collectstatic --noinput
    # En Heroku, algo como...
    heroku run -a MYAPP python manage.py collectstatic --noinput
    y podrás diagnósticar mejor el problema.

    El probable que el problema sea que no existe el directorio que esté definido en settings.py como STATIC, por lo que si en el momento actual no existe, una solución sería crearlo e incluirlo en el repositorio.

    mkdir static
    touch static/empty ## debido a que GIT no lleva cuenta de carpetas vacías
    git add static
    git push -am "Added empty static folder to collect files on the server"

    Más información sobre Heroku, Django y static files

           
       

    2015/05/11

    Eliminar texto en consola al ejecutar script en sqlplus (Oracle)

    Cuando lanzamos un script muy largo a través de sqlplus del modo:
    sqlplus user/pass@db < myscript.sql
    a veces este genera un gran volumen de mensajes en consola que hacen que se pueda ralentizar el proceso. Para evitarlo, se puede apagar esta salida de texto introduciendo al comienzo del script los comandos:
    set termout off
    set feedback off
           
       

    2015/04/25

    Problemas harddisk en Windows 8

    He tenido este problema en un portatil con Windows 8.1:
    KERNEL_DATA_INPAGE_ERROR
    Aquí va lo que he hecho, al volver a arrancar:

    1. Abrir CMD.exe como administrador
    2. Revisar los eventos de sistema con
      eventvwr
    3. Ejecutar:
      DISM /Online /Cleanup-Image /RestoreHealth
    4. Ejecutar y revisar el log de:
      sfc /scannow 
    5. Hacer un chequeo de disco (en el siguiente reinicio) con:
      chkdsk C: /f /r /x

           
       

    2015/01/26

    No cerrar consola de windows al ejecutar un script

    Si tienes un script, por ejemplo de python, que quieres ejecutar en Windows con un acceso directo (asociando la ejecución con "pythonw.exe" para que se lance la consola) vemos que al hacer click sobre él se ejecuta, pero no podemos ver el resultado ya que se cierra rápidamente la terminal de línea de comandos.

    Un truco sencillo es usar el comando "pause" como última línea del script.
    Veamos un ejemplo:

    C:\Python\pythonw.exe myscript.py
    pause
    Con eso antes, tras finalizar el script de python se detiene la ejecución hasta que el usuario pulse una tecla y se puede ver la salida del programa en la consola. Esto también funciona scripts en otros lenguajes MSDOS, los .cmd".
           
       

    2014/04/11

    Ejecutar scripts con sqlplus de Oracle

    Este es un recordatorio de cómo ejecutar y poder ver el progreso de un script SQL para Oracle usando sqlplus.
    Para conectar
    sqlplus user/pass@connect
    Y una vez dentro del terminal SQL
    set timing on
    set echo on
    set serveroutput on
    @nombrescript.sql
    Con esto se verá cada sentencia ejecutada, el tiempo empleado para cada una y los dbms_output.put_line('').
           
       

    2013/06/12

    Rellenar valores vacíos de una tabla con el anterior no vacío

    Imagina que tienes un CSV con valores en una columna vacios de la siguiente forma

    FECHA;VALOR
    15/06/12;7
    18/06/12;0,5
     ;0,25
    20/06/12;1
     ;2
     ;1,5
     ;2
     ;0,25
    22/06/12;1
     ;2
     ;1
     ;1
     ;0,5
     ;1,5

    Vemos que la columna FECHA no siempre está relleno y queremos que se complete con el valor de la primera fila anterior con valor no nulo. Ahí va una solución rápida y sencilla usando el programa awk
    cat myfile.csv  | awk -F';' \ 
    #Inicializo variable que almacena el valor válido
    'BEGIN {d=""} \ 
    {if ( $1 != "" ){ 
    #Si no esta vacio asigno el valor
       d=$1; 
    }
    #Pinto el valor correcto para la primera columna
    printf d";"; 
    #y luego el resto
    for (i=2; i<NF; i++) printf $i ";"; print $NF 
    }'
           
       

    2012/10/02

    Programando tareas automáticas usando CRON

    Para automatizar tareas de un modo rápido, cron es un método genial que viene incluido en la todos los sistemas operativos GNU/Linux. Para programar tareas hay que usar el comando:
    crontab -e
    Ahi se describe la sintaxis de la programación de tareas de forma muy sencilla. Lo que no explican es cómo hacer que una tarea se repita, por ejemplo, cada 15 minutos. Es decir, ¿cómo establezco rangos temporales?. Habría que escribir algo así:
    */15 * * * * mi_tarea
    ¿Y si sólo quiero que se ejecute los días de semana laborales en horario de 9h a 14h y de 16h a 20h?. Vixie Cron admite listas de parámetros, por lo que puedo hacer esto:
    */15 9-14,16-20 * * 1-5 mi_tarea
    Más información útil aquí. NOTA: Ojo con la fecha/hora y la zona horaria de la máquina.
           
       

    2012/08/02

    VirtualBox como máquina servidora


    Hace tiempo que utilizo pequeñas máquinas virtuales para hacer pruebas de servicios con VirtualBox que tienen la verdad muchísimas ventajas, sobre todo en entornos corporativos donde no es fácil que autoricen la instalación de software continuamente.

    Ahora con la versión VirtualBox 4.1.6 en máquinas Windows, me resulta esta útil esta secuencia de comandos para habilitar el acceso por red a la máquina invitada a los puertos más comunes en mis proyectos.

    Cambiar "midebian" por el nombre de la máquina que corresponda.
    cd "C:\Archivos de programa"\Oracle\VirtualBox"
    VBoxManage modifyvm "midebian" --natpf1 "guestssh,tcp,,2222,,22"
    VBoxManage modifyvm "midebian" --natpf1 "guest80,tcp,,80,,80"
    VBoxManage modifyvm "midebian" --natpf1 "guest8080,tcp,,8080,,8080"
    VBoxManage modifyvm "midebian" --natpf1 "guest5432,tcp,,5432,,5432"
    Para ver la configuración actual incluídos estos parámetros.
    VBoxManage showvminfo "midebian"
    Recordatorio: Configuraciones de Postgresql
    Para poder conectarse desde el host a postgresql, ahí van una configuración rápida: Editar el fichero "/etc/postgresql/8.4/main/pg_hba.conf"
    # IPv4 local connections: host all all 0.0.0.0/0 md5 
    Editar el fichero "/etc/postgresql/8.4/main/postgresql.conf"
    listen_addresses = '*'
    Reiniciar el servidor postgresql:
    /etc/init.d/postgresql restart
           
       

    2012/06/23

    FLOSS, administración y soberanía

    Hace unos día leí "Stallman: "El Estado debe usar software libre para mantener su soberanía informática" y leyendo comentarios de personas haciendo "apología" de MS-Office y de Apple no alcanzo a comprender muy bien esas posturas.

    Nunca entenderé como hay personas/ciudadanos a favor de que empresas extranjeras de software privativo (que cierran el conocimiento y realizan una inversión cercana a cero en nuestro entorno) sean beneficiarias de sumas multimillonarias año tras año, de todas las administraciones públicas, empresas y particulares en prácticamente el 100% de todos los ordenadores del mundo... (imaginaos la cifra). Se aprovechan de la división interna existente en los organismos, generan dependencias, en muchos casos ejercen prácticas abusivas, hacen cautiva la información no siguiendo estándares o "ampliándolos" (rompiendo compatibilidad), hacen competencia desleal, impiden la creación de tejido tecnológico local o si lo hay lo hacen débil y supeditado a ellos, manipulan las tendencias de consumo, etc.

    Siguiendo el ejemplo de los comentarios MS-Office y Windows  están muy bien, pero OJO, es así porque se les está pagando cantidades de dinero impresionantes desde hace muchos años. Además no es que estén ofreciendo cosas extraordinarias, los usuarios estamos haciendo de testers de versión en versión, hacemos sugerencias y les damos ideas innovadoras que ellos aprovechan para luego re-vendernoslas en siguientes versiones.

    Es increible que con ese escenario tan sumamente manipulado surja software libre (FLOSS) de tanta calidad como el que tenemos, en muchos casos, altamente superior al privativo. Lo que me gustaría que la gente comprendiese es que si existiese un poco de cooperación inter-administrativa y se coordinasen fondos entre ayuntamientos, comunidades autónomas, países, etc. y dijesen que todo el software de la administración DEBE ser LIBRE, el ahorro sería de CIENTOS DE MILLONES DE EUROS año tras año, la tecnología avanzaría de forma mucho más rápida, y la riqueza derivada del desarrollo sería repartida de manera más equitativa. Con un pequeño porcentaje de la inversión que se hace actualmente en software privativo, se podrían hacer productos equivalentes en FLOSS de igual o mayor calidad y disponibles libremente para toda la sociedad.


    Que un software sea privado no es garantía de nada, más bien al contrario: nadie puede auditar internamente lo que hace ese software, los intereses de todos los usuarios están supeditados a decisiones de márketing de unos pocos, etc. Hay que recordar una cosa, el que un software tenga licencia privativa sólo tiene ventajas negativas para la sociedad, son restricciones, impedimentos, medidas de presión, etc. A menos que seas el propietario de una compañía de software privativo, no puedo comprender el interés en seguir con esta injusticia.



           
       

    2012/04/09

    Resetear sesiones de usuarios conectados a Postgresql

    Muchas veces hay usuarios que han dejado su conexión abierta y están bloqueando la base de datos impidiendo hacer algunas tareas de administración, vacuums, renames, etc.

    Para localizarlos se puede usar:

    select datname, usename, procpid from pg_stat_activity;

    Luego simplemente para eliminar todos:

    select pg_terminate_backend(procpid) from pg_stat_activity where datname='whatever';

    UPDATE: Algunos datos temporales interesantes sobre las conexiones:

    select datname, usename, procpid, xact_start, backend_start, query_start from pg_stat_activity;
    http://www.postgresonline.com/journal/archives/134-Terminating-Annoying-Back-Ends.html
           
       

    2012/04/05

    Emacs para desarrollo web

    Para no pelearse con los conflictos con los php-mode y html-mode se puede uno instalar Nxhtml que además de resolver ese problema ofrece un montón de comodidades. 

    Lo instalé siguiendo estos pasos:

    1. Descargar el fichero: web-vcs.el 
    2. Abrirlo y desde Emacs:
                  M-x eval-buffer
    3. Luego:
                 M-x web-vcs-nxhtml 
    Con esto comienza la instalación... pero finalmente me dió algunos fallos.

    Entonces lo que hice fue bajarlo en formato ZIP y seguí las instrucciones del README.

    Necesité instalar la sb-html.el en .emacs.d/site-lisp y listo!!
           
       

    2011/12/20

    Alternativa a PuTTY en windows

    Para conectarme mediante ssh/telnet en windows hasta ahora utilizaba el mítico Putty. Cumplía bastante bien su función aunque era incómodo y se volvía un poco loco si trabajaba con editores. Hoy he probado TeraTerm y me encuentro más cómodo. Recomendado! :)
           
       

    2011/11/24

    Escapar espacios en blanco en variables en Bash

    Hoy me he sentido un poco estúpido... la típica chorrada que no te acuerdas ni se te ocurre como solucionar. Lo pongo aquí etiquetado como "humor". :D

    En un script para la línea de comandos, tenía que entrar en un directorio con espacios en su nombre.

    Pues no era capaz...
    > foo="/tmp/foo bar/" 
    > cd $foo 
    bash: cd: /tmp/foo: No such file or directory 

    Intenté todas las combinaciones posible para escapar el espacio y mil trucos.

    Solución:
    > foo="/tmp/foo bar/" 
    > cd "$foo" 


    Las comillas!!!!