Archivos en la Categoría: Educacion

Java: Getting Memory Usage with MemoryMXBean

Estoy madurando una idea y me he encontrado con una de las muchas perlas de JMX de Java, la MemoryMXBean:

MemoryMXBean mbean = ManagementFactory.getMemoryMXBean();
System.out.println("HeapUsage: " + mbean.getHeapMemoryUsage());
System.out.println("NonHeapUsage: " + mbean.getNonHeapMemoryUsage());

El resultado:

HeapUsage: init = 16777216(16384K) used = 7772720(7590K) 
           committed = 16252928(15872K) max = 1037959168(1013632K)

NonHeapUsage: init = 2359296(2304K) used = 15099032(14745K) 
              committed = 15327232(14968K) max = -1(-1K)

Referencias:
java.lang.management.ManagementFactory

Amazon: Protect Instance Metadata and User Data

Es una practica extendida almacenar las credenciales en el “user-data”, el problema es que desde una instancia de EC2 cualquier usuario de la maquina, autorizado o no, puede acceder a estos datos.

Ejemplo:

curl http://169.254.169.254/latest/user-data

Una regla de iptables para evitar estos accesos, salvo para el usuario “root” (uid=0):

iptables -A OUTPUT \
  -d 169.254.169.254/32 -p tcp --dport 80 \
  -m owner ! --uid-owner 0 \
  -j REJECT --reject-with tcp-reset

References:
EC2 – Instance Metadata and User Data
The best method for passing AWS credentials as user data to an EC2 instance?

Disponibilidad / Availability

Una pequeña chuleta con los porcentajes de disponibilidad y el tiempo de caida asociado:

Availability	Downtime
---------------------------------------------------
97% 			10d 22h 48m
98% 			7d 7h 12m
99% 			3d 15h 36m		***
99,5%			1d 19h 48m
99,9% 			8h 45m 36s		***
99,95%			4h 22m 48s
99,96%			3h 30m 14s
99,97%			2h 37m 41s
99,98%			1h 45m 7s
99,99%			52m 34s			***
99,999% 		5m 15s			***
99,9999%	 	32s				***
99,99999%		3s				***

Amazon: Simple WhatIsMyIP with Lambda and API-Gateway

Un ejemplo de como montar un sencillo WhatIsMyIP usando Amazon Lambda con el Backend de NodeJS y API-Gateway.

El código del Lambda (Runtime: NodeJS, Handler: index.handler, Role: Basic Execution Role):

exports.handler = function(event, context) {
    context.succeed({ "ip": event.ip });
};

Aunque para que sea funcional tienes que publicarlo a través de API-Gateway. Crear un resource, por ejemplo “text” y un metodo (GET). Tambien hacen falta algunas configuraciones de integración:

Integration Request (Content-Type: application/json, Mapping Template):

{
"ip" : "$context.identity.sourceIp"
}

Integration Response (Status 200, Content-Type: text/plain, Mapping Template):

#set($inputRoot = $input.path('$'))
$inputRoot.ip

Method Response (Status 200, Content-Type: text/plain, Model: Empty).

Si prefieres respuestas json en realidad es más sencillo aún, podrías ahorrarte la customización de la parte del Integration Response y el Method Response (Por defecto los mime-types ya son application/json y el Integration es Output passthrough).

Solo tienes que publicarla en un stage (“prod” por ejemplo) y al invocar la URL con curl tendrás algo como esto:

# curl -sL https://xxxxxxxxxx.execute-api.eu-west-1.amazonaws.com/prod/text
219.12.34.56

NOTA-1: Si clonas un API, es posible que deje de funcionar (bug?) y tendrás que ir al “Integration Request” y volver a asignar la función, aunque aparezca la correcta, para que le asigne los permisos de ejecución.
NOTA-2: Si vas a usar Lambdas o API-Gateway para datos “binarios” (todo lo que no sea texto, de momento no está soportado), verás tus datos corromperse.

Referencias:
API-Gateway Developer Guide
API-Gateway Developer Guide: Mapping Template Reference
Lambda Developer Guide

PPP: Connection broken

Hoy voy a contar una historia de terror informático, de esas que recuerdan el día en que a Enjuto Mojamuto se le fue Internet.

El Jueves 10, víspera de festivo en Barcelona, llegué a casa del trabajo… Internet no funcionaba (conexion de Fibra/FTTH -Movistar-). Por suerte con el Tethering de Android tenía un acceso alternativo desde el portatil mientras solventaba el problema (aunque andar cambiando de la LAN al 3G era bastante tedioso).

Como buen “friki” miré mi Uptime Robot; la conexión se había caido a las 12:20PM (media mañana). Ese día hubo tormenta, asi que temía que se me hubiera quemado el router, hubiera caido un arbol y roto las lineas, una excabadora, o vete a saber…
Leer más de esta entrada

OpenSSH: Speed UP SSH Connections

Para acelerar las conexiones recurrentes en OpenSSH:

En el cliente:

# /etc/ssh/ssh_config
Host *
    ControlMaster auto
    ControlPath /dev/shm/.ssh-mux_%u_%r@%h:%p
    ControlPersist 600
    # You can set this to "no" if you trust your LAN/DNS
    CheckHostIP no

En el server:

# /etc/ssh/sshd_config
UseDNS no

Rerefencias:
ssh_config
sshd_config

Networking: Local Network Addresses

Estos son los rangos que se pueden usar en una red local (IPv4):

  • 10.0.0.0/8 (255.0.0.0) [ 10.0.0.0 – 10.255.255.255 ]
  • 172.16.0.0/12 (255.240.0.0) [ 172.16.0.0 – 172.31.255.255 ]
  • 192.168.0.0/16 (255.255.0.0) [ 192.168.0.0 – 192.168.255.255 ]

Referencia: Wikipedia

Java: Skeleton for Workers / Batch processing

Un pequeño esqueleto que persigue:

  1. Que no se coma la CPU.
  2. Que no se coma el espacio el disco soltando trazas de fallo.
  3. Que ante una excepcion “extraña” no se muera el worker.
@Override
public void run() {
	int c = 0;
	while (!isShutdown()) {
		if ((++c % 10000) == 0) { // Anti cpu eater
			intrSleep(1);
		}
		try {
			// ... do things
		} catch (ControlledException e) {
			// ... do things
			log.error("ControlledException: " + e.toString(), e);
			intrSleep(100); // Anti disk space eater
		} catch (Exception e) {
			// ... last resort
			log.error("Unknown Exception: " + e.toString(), e);
			intrSleep(100); // Anti disk space eater
		}
	}
}
private static void intrSleep(final long millis) {
	try {
		Thread.sleep(millis);
	} catch (InterruptedException e) {
		Thread.currentThread().interrupt();
	}
}

Java: JavaStack artifacts Available in Maven Central

Ya se han liberado los primeros artefactos (librerías de proposito general) de JavaStack en Maven Central:

  • packer:1.1.1 > Libreria de Serializacion de datos (compresion, encriptacion,…). Similar a Kryo.
  • mapexpression:1.0.2 > Evaluador de Expresiones para usar en placeholders como ${name}.
  • stringproperties:1.0.1 > Properties con Features extra (${placeholders}).
  • kvstore:1.0.0 > Un NoSQL / Map Key-Value (disco y memoria).
  • standalone-preferences:1.0.4 > Implementacion del API de Preferences en Filesystem.
  • figaro:1.0.0 > Sistema de mensajes asincronos In-process / EventBus / ActorModel. Similar a Kilim, µJavaActors, Akka.

Todos estos artefactos siguen la misma filosofía: Zen, KiSS

Maven Central: org.javastack

Java: Generating CIDR InetAddress

Una pequeña chuleta para generar una “NetMask” desde un CIDR en Java:

import java.net.InetAddress;

public static InetAddress getAddressByCIDR(final int bits, final boolean ipv6) {
	final int totalBits = (ipv6 ? 128 : 32);
	if (bits < 0 || bits > totalBits)
		throw new IllegalArgumentException("Illegal CIDR prefix");
	final byte[] bytes = new byte[totalBits >> 3];
	for (int offset = 0; offset < bits; offset++) {
		bytes[offset >> 3] |= (1 << (7 - (offset & 7)));
	}
	try {
		return InetAddress.getByAddress(bytes);
	} catch (UnknownHostException e) {
		throw new RuntimeException(e);
	}
}

Referencias:
CIDR

A %d blogueros les gusta esto: