viernes, marzo 06, 2020

Recetas de uso de jq

jq es una utilidad de línea de comandos cuya misión es procesar flujos de datos en json, con la misma facilidad y potencia que ofrecen utilidades como sed o awk para procesar ficheros de texto. El autor de tiene publicado un excelente manual (enlace a la versión 1.5) sobre como usarlo.

Esta va a ser una de esas entradas dinámicas, donde quiero ir anotando como hacer ciertas tareas con jq. Puesto que no es una utilidad que uso todos los días, no me se la sintaxis de memoria, pero de vez en cuando necesito realizar ciertas operaciones y no me acuerdo exactamente sintaxis y como hacerla. Así que he decido hacer esta entrada de recetas de uso de jq. Espero que os sirva

Modificar el valor de una clave en un array

Supongamos que tenemos un array de objetos JSON y queremos realizar cierta operación matemática con el valor de una de sus clave. Por ejemplo supongamos que tenemos el siguiente array de objetos json en nel fichero ejemplo1.json y queremos modificar el valor de cada clave "key" en cada objeto dividiéndola por 1000. Además, queremos pasar a mayúsculas el valor de la clave value. Queremos después de la operación generar un array resultante.

{
  "result": [
    {
      "time": 1000,
      "value": "Uno"
    },
    {
      "time": 2000,
      "value": "Dos"
    },
    {
      "time": 3000,
      "value": "Tres"
    }
  ]
}

Si el fichero json anterior es ejemplo1.json , se podría realizar la operación con jq de la siguiente manera:

cat ejemplo1.json | jq  -r '.result[]|{time:(.time/1000), value:.value|ascii_upcase}'| jq --slurp .

El resultado de la operación será el siguiente:

[
  {
    "time": 1,
    "value": "UNO"
  },
  {
    "time": 2,
    "value": "DOS"
  },
  {
    "time": 3,
    "value": "TRES"
  }
]

viernes, enero 31, 2020

_JAVA_OPTIONS

Hasta la versión 8 del JDK de Oracle, existe una variable de entorno que permite pasar opciones a la máquina virtual java directamente (en la versión 9 del JDK , se ha procedido a documentar y estandarizar JDK_JAVA_OPTIONS). ¿Qué utilidad tiene? Poder pasar parámetros a la máquina virtual java que no se puede pasar a través de la línea de comandos, por diversos motivos. Al menos, la versión 8 del JDK va a leer el contenido de la variable del entorno y usará las opciones que se le pase durante la ejecución.

En mi caso, la uso para establecer el locale con el que va a correr toda la máquina virtual. Es muy útil, por ejemplo, cuando se están construyendo un software con ayuda de maven y queremos que todas las veces que se invoque la máquina virtual tenga ciertos parámetros, sin necesidad de modificar los pom.xml. Ejemplo:

env _JAVA_OPTIONS="-Duser.language=en_US" mvn clean install

miércoles, enero 22, 2020

Una curiosidad del netcat (nc)

Llevo la tira de años usando netcat, esa estupenda navaja suiza para enredar con todo lo relacionado con TCP/IP. También es cierto que hace algún tiempo que no desciendo a los andurriales de la captura de paquetes y tcpdump. Hace unos días estaba depurando una aplicación que recibía paquetes de syslog (normalmente UDP, puerto 514), y me encontré que recibía unas "X" no esperadas cuando insertaba comandos y tres paquetes udp más de la cuenta. Es decir algo como:

$ echo "<1>Hola" | nc -v -u 192.168.1.1 514

Si activo la captura con tcpdump (es un Mac) veo salir lo siguiente por la interfaz de red:

bash-3.2# tcpdump -n  -i en0 port 514
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes
00:44:30.342306 IP 192.168.1.53.65436 > 192.168.1.1.514: [|syslog]
00:44:30.342309 IP 192.168.1.53.65436 > 192.168.1.1.514: [|syslog]
00:44:30.342309 IP 192.168.1.53.65436 > 192.168.1.1.514: [|syslog]
00:44:30.342309 IP 192.168.1.53.65436 > 192.168.1.1.514: [|syslog]
00:44:30.343969 IP 192.168.1.53.65436 > 192.168.1.1.514: SYSLOG kernel.alert, length: 8

¿Cuatro paquetes UDP?. ¿Para mandar una simple línea?. ¿Cuál es el motivo?. Repitamos, pero ahora sin la opción -v

$ echo "<1>Hola" | nc -u 192.168.1.1 514
bash-3.2# tcpdump -n  -i en0 port 514
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes
00:51:13.207774 IP 192.168.1.53.60478 >nbsp;192.168.1.1.514: SYSLOG kernel.alert, length: 8

Es decir, ocurre por el parámetro -v. Según la página de manual, lo único que hace es dar más información.

-v      Have nc give more verbose output

Si os vais al código fuente del netcat que usa OS X - en este ejemplo el usaro es de la versión 10.14, veréis que la causa de los paquetes extras tiene que ver con el flag -v y esta función:

int
udptest(int s)
{
    int i, ret;

    for (i = 0; i <= 3; i++) {
        if (write(s, "X", 1) == 1)
            ret = 1;
        else
            ret = -1;
    }
    return (ret);
}

jueves, diciembre 26, 2019

¡Feliz Navidad!

Un poco más tarde este año, os deseo a todos una Feliz Navidad y que podráis disfrutar en compañía de vuestra gente

sábado, diciembre 07, 2019

Equipaciones contra el cambio climático

Hoy he leído la noticia que el Real Madris usará su tercera equipación - verde - en su partido contra el Real Club Deportivo Español de Barcelona , en apoyo a la actual The UN Climate Change Conference, que se celebra en Madrid. Sólo quiero dejar constancia aquí del sistema de calefacción del césped del estadio Santiago Bernabeu, para que veamos como muchos - en este caso el Madrid - se están aputando a la magnífica campaña de relaciones públicas que está siendo esto de la cumbre del clima. Porque claro, supongo que todas esas lámparas y sistemas de calefacción del césped utilizan oompa loompas dándole a bicicletas a pedales para generar la electricidad.

O dejar de fletar aviones charter para sus desplazamientos y recurrir a trenes, por ejemplo. Porque al final, si algo me está quedando medianamente claro de todo este asunto es que los sacrificios los tenemos que hacer la gente de a pie. La élite, puede seguir usando esos medios contaminantes porque ellos lo valen.

PD: Estimados madridistas, he puesto este ejemplo porque es el que me he encontrado hoy leyendo las noticias: hay infinidad de cosas que las empresas que están patrocinando el COPS25, podrían hacer para permitir menos emisiones, como un plan generalizado de teletrabajo y no lo hacen.