Weblogs Código

Blog Bitix

Qué es la variable PATH del sistema y cómo cambiarla en GNU/Linux

enero 23, 2021 11:30

Linux

Al ejecutar un comando en la terminal el intérprete de comandos de GNU/Linux lo busca en los directorios especificados en la variable de entorno del sistema PATH, esta variable de entorno contiene una lista de directorios separados por el caracter : en la que se busca por orden. Al instalar un paquete seguramente el programa ejecutable se instale en /usr/bin, directorio que por defecto está incluido en la variable PATH.

En algún caso quizá nos interese instalar un programa ejecutable propio, un caso puede ser que la distribución usada no disponga del paquete del programa o esté en una versión antigua y se desee una más nueva. Como ejemplo usando Arch Linux mi caso ha sido con las herramientas de HashiCorp como Consul, Vault y Nomad para las que de algunas no está en los repositorios oficiales sino que está en los repositorios de los usuarios AUR.

Las herramientas que está desarrolladas con el lenguaje Go suelen un único binario que no tienen más dependencias. Basta con copiar ese binario al directorio /usr/local/bin/ que está destinado a que los usuarios instalen sus propios binarios sin entrar en conflicto con los que los paquetes instalan. El directorio /usr/local/bin/ es otro de los directorios incluídos en los directorios de búsqueda de la variable PATH.

Otra posibilidad es modificar la variable PATH del sistema y añadir el directorio que deseemos, por ejemplo, se puede crear el directorio ~/Software/bin. El intérprete de comandos cuando el usuario introduce un comando lo busca en orden en los directorios especificados por la variable PATH, ya sea un binario o un script ejecutable de un intérprete de comandos como Bash.

Este es parte del contenido de la variable PATH del sistema en Arch Linux (los tres puntos es contenido que he omitido). Las distribuciones GNU/Linux suelen instalar los binarios de los programa ejecutables en los directorios /usr/local/sbin con los binarios para el usuario root y /usr/bin es donde los paquetes ubican sus binarios y programas ejecutables. En el directorio /usr/local/bin el usuario puede ubicar sus propios binarios sin que entren en conflicto con los instalados por los paquetes.

1
2
$ echo $PATH

echo-path.sh
1
2
...:/usr/local/bin:/usr/local/sbin:/usr/bin:...

echo-path.out

Dado que el programa que manualmente se ubica en el directorio para binarios de los usuarios /usr/local/bin o en un directorio propio no proviene de un paquete cuando se publique una nueva versión es el usuario el que ha de actualizar a la nueva versión descargando de nuevo el binario y copiarlo de nuevo al directorio.

La variable PATH se configura en el script de inicialización del intérprete de comandos, el de Bash es el archivo oculto .bashrc ubicado en el directorio de inicio del usuario, en mi caso en /home/picodotdev/.bashrc. El archivo .bashrc sirve también para Personalizar el prompt del sistema del intérprete de comandos Bash y el caso de utilizar el sistema de control de versiones Git para Personalizar el prompt del intérprete Bash con información de estado del repositorio git.

» Leer más, comentarios, etc...

Blog Bitix

En Java, ¿los argumentos se pasan por valor o por referencia?

enero 22, 2021 03:30

Java

En el lenguaje de programación Java los punteros no existen de la misma forma que en otros lenguajes como C o C++. En Java existen los punteros o referencias pero no son libres de apuntar a cualquier dirección de memoria del programa, en C y C++ lenguajes más destinados a la programación de sistemas y cercanos al lenguaje de la máquina ofrecen manipulación de punteros pudiendo obtener un puntero con la dirección de memoria de una variable.

En el lenguaje Java los punteros realmente son vistos simplemente como variables, no es posible obtener un puntero a la dirección de memoria de una variable, únicamente permite copiar o duplicar el valor de una variable en otra variable. Otra diferencia está en que en Java los argumentos de los métodos siempre se pasan por valor, en C y C++ los argumentos se pueden pasar por valor o por referencia.

Estas diferencias de Java con los lenguajes C y C++, hacen de Java un lenguaje más sencillo en la sintaxis, seguro y menos propenso a errores, por otro lado, la manipulación de punteros en C y C++ es útil en la programación de sistemas por ser un modelo similar al empleado por la CPU en su funcionamiento.

El paso por valor de los argumentos en Java

En Java todos los argumentos se pasan por valor. El paso por valor de los argumentos de un método en Java tiene varias consecuencias. El paso por valor significa que al método en la variable del argumento le llega una copia del valor en el caso de un tipo primitivo de datos o una copia del puntero a la dirección de memoria del objeto. En el paso por referencia el argumento contiene un puntero con la dirección de memoria de la variable. En el paso por valor al asignar un valor a la variable del argumento no modifica el valor de la variable usada para invocar al método, esto ocurre tanto para argumentos de tipo primitivo y para objetos.

Paso de argumentos por referencia y paso por valor

Paso de argumentos por referencia y paso por valor

La palabra reservada final en los argumentos sirve para impedir asignar un nuevo valor a una variable, una variable final es una variable cuyo valor es una constante ya que en caso de intentar asignar a la variable un nuevo valor el compilador produce un error de compilación. La variable no pude cambiar de valor, sin embargo, si la variable es una referencia a un objeto el objeto si puede cambiar de estado, para que un objeto no pueda cambiar ha de ser inmutable.

Algunas clases como la clase String en Java son inmutables, esto significa que al manipular el objeto se devuelve una nueva instancia de la clase en vez de modificar la original. En Java para manipular un String y obtener la misma referencia en vez de una nueva instancia hay que utilizar la clase StringBufffer o StringBuilder. Algunas instancias de listas obtenidas con la API de colecciones son inmutables como List.of, y sus métodos add y remove lanzan la excepción en caso de ser invocados.

Ejemplo práctico del paso por valor

En este programa aunque a las variables de los argumentos x, y y w se les asigne un nuevo valor las variables a, b y c usadas en la invocación del método continúan teniendo el mismo valor. Las variables de los argumentos se pasan por valor, sin embargo, los objetos a los que apuntan esas variables si son mutables y son modificados en el método los cambios son visibles en el ámbito de invocación con la variable utilizada como argumento.

La lista de la variable d es modificada por el método, se corresponde con la variable z, y esos cambios son visibles en el ámbito de d, al contrario de las otras variables que aunque se les asigna un nuevo valor en el método fuera de él conservan su valor original aún después de la invocación del método. Esto ocurre porque en el caso de d se ha modificado el objeto mutable al cual tanto d y z apuntan.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {

     public static void method(int x, String y, List<String> w, List<String> z) {
         x = 999;
         y = "Hola Mundo!";
         w = List.of("Hola", "mundo", "!");
         z.addAll(List.of("Hola", "mundo", "!"));
    }

    public static void main(String[] args) {
        int a = 1;
        String b = "Hello World!";
        List<String> c = Arrays.asList("Hello", "World", "!");
        List<String> d = new ArrayList(List.of("Hello", "World", "!"));
        
        Main.method(a, b, c, d);
        
        System.out.println("a: " + a);
        System.out.println("b: " + b);
        System.out.println("c: " + c);
        System.out.println("d: " + d);
    }
}
Main.java
1
2
3
4
a: 1
b: Hello World!
c: [Hello, World, !]
d: [Hello, World, !, Hola, mundo, !]
System.out
Terminal

Puedes probar en tu equipo el ejemplo ejecutando el siguiente comando:
java Main.java

» Leer más, comentarios, etc...

Bitácora de Javier Gutiérrez Chamorro (Guti)

MVP calculadora en C++ Builder

enero 22, 2021 12:04



Después de mi C++ Builder in the requirements, una de las tareas que se nos encargó como Most Valuable Professional (MVP) de Embarcadero, fue la de crear una calculadora y grabar esa actividad en vídeo. Ello permitirá ver cómo se usan las herramientas y cómo mejorarlas. Siendo la mayoría MVP de Delphi, me apetecía mucho …

MVP calculadora en C++ Builder Leer más »



Artículo publicado originalmente en Bitácora de Javier Gutiérrez Chamorro (Guti)

» Leer más, comentarios, etc...

Picando Código

CFP Day: Día Global de Llamado a Propuestas por la Diversidad reprogramado para el 20 de febrero de 2021

enero 22, 2021 10:03

El Día Global de Llamado a Propuestas por la Diversidad (del inglés “Global Diversity CFP Day”) fue reprogramado para el 20 de febrero. Iba a realizarse mañana sábado 23 de enero, pero debido a algunas dificultades que ya han sido resueltas, se reprogramó para más adelante.

Si alguna vez pensaron en dar charlas en una conferencia y no sabían por dónde empezar, ésta es la oportunidad ideal. ¡Hay un taller en español!

El anuncio:

Durante la organización del Día Global de Llamado a Propuestas por la Diversidad 2021 han habido algunas dificultades para hacer del evento tan asombroso como necesita ser.

La buena noticia es que éstas dificultades han sido resueltas, sin embargo el evento ha sido reprogramado para alcanzar éstos altos estándares definidos por el equipo.

Ahora el Día Global de Llamado a Propuestas por la Diversidad se llevará a cabo el 20 de Febrero de 2021 y ¡esperamos que aún así puedas estar!

Apreciamos que esto es una gran decepción, especialmente tan cerca del evento y pedimos disculpas por los inconvenientes y la desilución.

Todos los y las integrantes en el equipo de oradores y organización siguen con mucha emoción de ayudarte a comenzar tu viaje hacia presentar en una conferencia, ver tus futuras charlas y aprender de tí.

Esperamos conocerte el 20 de Febrero 👋

Nos vemos pronto,
Equipo del día Día Global de Llamado a Propuestas por la Diversidad

The post CFP Day: Día Global de Llamado a Propuestas por la Diversidad reprogramado para el 20 de febrero de 2021 first appeared on Picando Código.

» Leer más, comentarios, etc...

Picando Código

Mini pique – Rake

enero 21, 2021 12:00

En rake: Cuando usamos rake -T para listar las tareas rake, se muestra sólo la primera oración de la descripción de cada tarea. Pero usando rake -D podemos ver la descripción completa.

The post Mini pique – Rake first appeared on Picando Código.

» Leer más, comentarios, etc...

Picando Código

Game Boy Color Lux – publicidad de un producto ficticio de Nintendo

enero 20, 2021 12:30

Presentación del Game Boy Color Lux. Excelente video, nada que envidiarle a una presentación profesional de un nuevo producto. Hecho por Daniel Cervantes en su tiempo libre:

Game Boy Color Lux es un producto imaginario, Nintendo nunca sacó un Game Boy Color retroiluminado. Sí existió el Game Boy Light, pero fue lanzado exclusivamente en Japón, una versión retroiluminada pero monocromático como el Game Boy común y el Game Boy Pocket. De todas formas, hoy en día podemos obtener un Game Boy Color con una pantalla retroiluminada gracias a distintos mods, ya sea comprando el kit e instalándolo si contamos con cierta habilidad y paciencia, o pagando un poco más por un Game Boy ya modificado.

El Game Boy Color fue y sigue siendo una de las consolas a las que más cariño les tengo, y a la que más horas le dediqué en su momento jugando Zelda, Pokémon y más. Hoy por hoy no lo tengo conmigo en Escocia, pero sí tengo mi Game Boy Advance con modificación de pantalla retroiluminada con el que cada tanto me pongo a jugar juegos de Game Boy. Si bien el Nintendo Switch es la consola portátil del momento, siempre voy a tener un lugar en mi tiempo de juego para los 8 bits 🙂

Daniel tiene otros trabajos muy buenos en su canal en Vimeo, incluyendo Super Metroid reinventado y un modelado 3D de un cartucho de NES.

The post Game Boy Color Lux – publicidad de un producto ficticio de Nintendo first appeared on Picando Código.

» Leer más, comentarios, etc...

Variable not found

Iterar con foreach sobre cualquier tipo de objeto con C#9

enero 19, 2021 07:05

.NET Core

Leyendo las novedades de C# 9, hay una que pasa casi completamente desapercibida pero que me ha llamado la atención: la posibilidad de convertir prácticamente cualquier tipo en enumerable.

La magia consiste en que, a partir de esta versión, se podrá recorrer con un foreach objetos que, o bien implementen IEnumerable o directamente el conocido GetEnumerator(), como lo hacen los arrays o strings, o bien existe un método extensor con el mismo nombre declarado sobre el tipo.

En el blog de Lukáš Lánský encuentro un ejemplo terrorífico, pero a la vez extremadamente clarificador de la potencia de esta posibilidad:

public static class VonNeumannExtensions
{
public static IEnumerator<int> GetEnumerator(this int number)
{
for (var i = 0; i < number; i++)
{
yield return i;
}
}
}

¡Yep! Acabamos de definir el extensor GetEnumerator() sobre el tipo int, lo que quiere decir que ahora podemos recorrerlo con un con  foreach() con total naturalidad:

public class Program
{
public static void Main()
{
foreach (var i in 5) // WTF?
{
Console.WriteLine(i);
}
}
}

Seguro que podéis imaginar el resultado que se mostrará en consola:

0
1
2
3
4

Visto esto, seguro que podemos imaginar otros usos. Por ejemplo, ¿quién no ha querido alguna vez recorrer un rango de valores de esta forma tan limpia?

foreach (var i in 0..9)
{
Console.Write(i);
}
// Output: 0123456789

Pues bastaría con crear el correspondiente extensor para el tipo Range:

public static class RangeExtensions
{
public static IEnumerator<int> GetEnumerator(this Range r)
{
for (int i = r.Start.Value; i <= r.End.Value; i++)
{
yield return i;
}
}
}

Otro ejemplo: imaginad que tenemos una clase Invoice a cuyo código no tenemos acceso, pero deseamos poder recorrer sus líneas de detalle usando foreach. Sería tan sencillo como crear un extensor como el siguiente:

public static class InvoiceExtensions
{
public static IEnumerator<InvoiceLine> GetEnumerator(this Invoice invoice)
{
return invoice.GetLines().GetEnumerator();
}
}

Y a partir de este momento, ya podríamos hacerlo sin problema:

var invoice = _invoices.GetById(18);
foreach (var line in invoice)
{
Console.WriteLine($"{line.Description}, {line.Items} items");
}

¿Utilidad real y práctica de esto? Pues creo que escasa para la mayoría de los mortales. Supongo que habrá algunos escenarios en los que el esfuerzo de haber añadido esta característica al compilador merezca la pena, pero en el día a día creo que no es algo que vayamos a tener que utilizar muchas veces.

Si tenéis interés, podéis echar un vistazo a la entrada en Github donde se discute la funcionalidad y se proponen varios escenarios de uso relacionados con tuplas y tipos genéricos.

En cualquier caso, curioso sí que es ;)

Publicado en Variable not found.

» Leer más, comentarios, etc...

info.xailer.com

Mejoras en nuestro editor gratuito xEdit

enero 18, 2021 04:41

Con la presentación de Xailer 7 hemos decidido incluir en el paquete de instalación nuestro editor gratuito xEdit que incorpora toda la funcionalidad a nivel de editor de código del IDE de Xailer, como puede ser el propio Intellisense.

xEdit es un editor de programación especialmente adaptado para ser utilizado con Harbour. Se puede usar con absolutamente cualquier entorno de desarrollo que utilice Harbour o xHarbour como compilador de lenguaje xBase. Incorpora un sistema de configuración de entornos que permite trabajar con distintos tipos de proyectos de forma muy sencilla.

Con esta nueva versión de xEdit incluimos algo muy demandado entre los usuarios que lo utilizan y que es una de las grandes estrellas de nuestro entorno de programación Xailer: Nos referimos al depurador de Xailer.

La nueva versión de xEdit incorpora la capacidad de depurar absolutamente cualquier tipo de proyecto. Junto con los binarios del programa, ahora se entregan dos librerías: libXailerDebug.a y XailerDebug.lib. La primera debe de usarse si se utiliza el compilador C de MinGW y la segunda si se utiliza Borland C++. Adicionalmente se entrega un documento PDF de nombre XailerDebug.pdf con información de como usarlo.

Podéis descargar la última versión de xEdit desde la siguiente dirección:

Área de descargas de Xailer

Espero que os guste.

Un cordial saludo

» Leer más, comentarios, etc...

Picando Código

A las piñas y patadas: Jugando beat ’em ups

enero 18, 2021 11:00

Los beat ’em ups (también conocidos como brawlers), son juegos de acción donde generalmente manejamos a un personaje que va siendo atacado por hordas de enemigos y tenemos que vencerlos a las piñas y patadas. Podemos usar armas de los enemigos vencidos o encontramos armas en la escena, así como comida u otros ítems para recuperar energía. Tuvieron su época dorada en las décadas de 1980 y 1990, con sagas como Double Dragon, Streets of Rage, Final Fight y más.

Es uno de mis géneros favoritos y seguramente se deba a que empecé a jugar videojuegos en esa época donde eran tan populares. Cuando iba a las maquinitas (salón recreativo, arcades, o como le llames en tu versión de español), los beat ’em up eran de los juegos más fáciles de arrancar y entretenidos de jugar. Digamos que perdonaban más que juegos de lucha como Street Fighter II, y resultaban mucho más llamativos que juegos más “puzzle” como Pac-Man o Snow Bros. Los gráficos eran espectaculares para la época, sprites grandes y variedad de enemigos en escenarios con un montón de píxeles de distintos colores.

De mis primeros tiempos recuerdo poner varias fichas en las máquinas de Golden Axe, The Simpsons, Captain Commando, Cadillacs & Dinosaurs y más. Como buen niño de los 90’s, caí víctima de la Tortu-manía, y un título que jugaba bastante era Teenage Mutant Ninja Turtles de Konami. Gastábamos fichas en las maquinitas y en casa jugábamos al port Teenage Mutant Ninja Turtles II: The Arcade Game en el NES (o Family en nuestro caso que era la versión pirata más económica para la familia Latinoamericana). El NES también tuvo sus éxitos dentro del género con los ports de Double Dragon, los Battletoads (responsables de varios controles rotos con su pantalla de las navecitas), entre otros.

Otro gran recuerdo que tengo es de la navidad o cumpleaños de mi primo (las dos fechas están muy cerca) donde recibió un Super Nintendo de regalo. El primer juego que jugamos fue Teenage Mutant Ninja Turtles: Turtles in Time. Si recuerdo bien, lo empezamos a jugar y no paramos hasta que lo terminamos. Fue también el primer título de Super Nintendo que agregamos al cuaderno donde llevábamos el registro de todos los juegos que habíamos terminado. Es una lástima que las Tortugas Ninja estén en algún tipo de limbo legal o algo así en lo que respecta a videojuegos, estaría genial poder volver a jugar Turtles in Time de manera legal en cualquiera de las plataformas, o un título nuevo dentro del género.

Después de esos inicios, seguí jugando varios títulos del estilo cuando podía a lo largo de mi “carrera” gamer. Hoy en día tenemos un montón de opciones, particularmente para Nintendo Switch.

Fernando KunioEn parte gracias a las vacaciones que me tuve que tomar a fin de año, me puse a jugar varios juegos que tenía pendientes terminar. Y lo que empezó probando Fight ‘N Rage, (que por si no leyeron el enlace, tiene una versión física disponible, yo ya encargué la mía 😁) en Steam, continuó con una seguidilla de títulos del género. Después de probar Fight N’ Rage y confirmar que me gustaba, lo dejé. Me decidí a esperar a obtener la versión física para jugarlo mejor en mi Nintendo Switch.

Un tiempo antes había estado jugando Cadillacs and Dinosaurs, lo que me hizo mirar con ganas nuevamente a Capcom Beat ‘Em Up Bundle: un compilado para Nintendo Switch con Final Fight, Captain Commando y más. Capcom tuvo su buena época de beat ’em ups, perfeccionaron el género y presuntamente provocaron la bancarrota de Technos Japón con Final Fight. Así que agregué el compilado de Capcom a mi lista, habrá que revivir esos clásicos.

Comento algunos de los juegos que jugué, en el orden cronológico en el que los fui jugando:

River City Girls

Entre los títulos pendientes en Nintendo Switch, estaba River City Girls. Se trata de un beat ’em up spin-off de la franquicia Kunio-Kun, donde asumimos el rol de Misako o Kyoko (que habían aparecido ya en algún título anterior). Las chicas tienen que rescatar a sus novios Kunio y Riki. Me gustan mucho la serie de Kunio-Kun, que nos ha dado grandes títulos como Nintendo World Cup, River City Ransom, Crash ‘n’ the boys Street Challenge y más.

Visualmente el juego es espectacular, pixelart moderno muy bien hecho con buenas animaciones y variedad de enemigos y escenarios. La música no se queda atrás. Mi versión de Limited Run Games vino con un CD con la banda sonora original y la verdad está bastante bien. Les recomiendo mirar la introducción, un tema pop punk con toda la fuerza.

El juego sufre un poco en el diseño en la jugabilidad y tuve una conversación súper interesante al respecto en Twitter con Rod_F. Twitter saca lo peor de la humanidad. Pero cuando está bueno (como en este caso), está muy bueno y terminás hablando de diseño de videojuegos con un diseñador de videojuegos.

Mi primer comentario era respecto a éste título y Streets of Rage 4, que de repente están diseñádos más para jugar de manera cooperativa para que se haga más llevadero. Hablando del diseño en sí, me imagino debe ser difícil encontrar un balance entre suficientemente fácil y desafiante para que no se vuelva aburrido. Asumo en general que los beat ’em up se disfrutan más compartiendo un sillón con más gente (o parados frente al monitor de un Arcade como en los viejos tiempos 😭). Y debe resultar más fácil porque hay más de una persona para luchar contra la misma cantidad de enemigos.

Pero el tema es la progresión de la dificultad que creo me pareció alta al arranque y no que fuera aumentando progresivamente. También puede ser un tema de falta de práctica en el género. A medida que fui jugando mas beat ’em ups, iba encontrando cosas en común y trayendo experiencia de títulos anteriores que me ayudaban a que fuera más fácil. Si sacara alguna conclusión de esto, es que este tipo de juego se vuelven más entretenidos con un poquito de práctica.

Al igual que en River City Ransom original, River City Girl tiene un poco de RPG. Podemos entrar en tiendas y comprar comida, ataques nuevos, ítems o vestimenta que le mejoran atributos de ataque/defensa y demás a los personajes. Cada personaje va aumentando de nivel también. En principio podemos elegir únicamente a las dos protagonistas pero hay al menos 2 más que podemos desbloquear terminando la historia. Lástima que al empezar a usar otros personajes en la misma historia empiezan en nivel 1. Pero es una buena excusa para iniciar la historia de cero con personajes nuevos. A lo largo del juego vamos a encontrar 25 estatuas “Sabu”. Si las rompemos todas ganamos algún premio que todavía no conozco porque no he buscado todas las estatuas. 

Un tema que me genera un poco de molestia de algunos juegos es cuando agregan una mecánica para la cual no están diseñados. Por ejemplo, si los controles están diseñados más tirando a un juego de pelea que de plataformas (beat ’em ups irían por ese lado), no sería ideal tener un nivel donde el desafío sea saltar plataformas. El control seguramente no esté tan pulido para la parte de plataformas como para la parte de peleas.

En el caso de River City Girls creo que hay dos niveles donde sufre de esto. El más molesto es una de las jefas de final de nivel. Se ganó mi premio al jefe de final de nivel más injusto/peor diseñado de todos los beat ’em up que he jugado, potencialmente de todos los juegos que he jugado. Hibari es creo que la tercera o cuarta jefa del juego y por su culpa abandoné el juego en frustración la primera vez que lo arranqué. Durante las vacaciones decidí que no me iba a impedir disfrutar del resto así que me armé de paciencia y eventualmente la pude derrotar. Hibari es como un jefe con lo peor de los jefes de Mega Man, y nada de lo bueno. Nos hace muchísimo daño, incluso hay un ataque que nos puede enganchar en una cadena y matar de un sólo golpe. Y nuestros golpes no le hacen demasiado daño. Habiendo terminado el juego, es sin duda la más difícil y frustrante.

River City Girls: Hibari

Hibari en River City Girls: premio a la jefa de final de nivel más injusta/peor diseñada de todos los beat ’em up (potencialmente de todos los juegos) que he jugado

Una vez vencida Hibari, el resto de los jefes tienen distintos niveles de dificultad, pero ninguno se le acerca al nivel de frustración de Hibari. Debo decir también que disfruté el resto del juego a pesar de este pequeño gran obstáculo.

La historia se va desarrollando en parte con animación y diálogos, y en parte con cómics. No se destaca por una historia súper atrapante, pero como que esa producción le agrega valor. Intentando no quemar la historia del final para quienes lo vayan a jugar, digamos que para mí lo mejor es la satisfacción de haber terminado el juego (y los personajes extra).

River City Girls es un juego entretenido al que volveré a jugar, y a pesar del detalle de esta jefa en particular (si precisan ayuda, puedo mandar piques), es disfrutable y vale la pena. Buenos gráficos, buena banda sonora, aunque no sé si pasará a la historia como un clásico del género.

Streets Of Rage 4

Streets Of Rage 4 es el primer título de la saga después de más de dos décadas. Tenía el desafío de homenajear y continuar el legado, pero actualizarlo a hardware y audiencias modernas, y creo que cumplió. Tiene unos gráficos impresionantes con personajes dibujados a mano y mucho detalle en la animación. Cuando lo miraba en fotos y videos, no me terminaba de convencer. Pero al jugarlo en el Nintendo Switch en el televisor se despejaron todas las dudas, está excelente. Es la prueba más evidente que el género no tiene que pasar a 3D y está bien quedándose en 2D.

Los escenarios y la música crean una ambientación que combina bien el aire nostálgico a finales del siglo pasado pero modernizado. Son variados y muy pintorescos, si tuviera algo para criticarle es que hay varios elementos en pantalla con los que no podemos interactuar pero que me gustaría fuera posible al menos golpearlos. Pero tiene suficiente detalle y cuidado como para dejarme más que conforme.

Streets of Rage 4

Streets of Rage 4

Lo primero que me costó de Streets of Rage fue acostumbrarme al hecho de que no se puede correr presionando para adelante dos veces como en tantos otros beat ’em ups. Más adelante descubrí que esto es más bien parte de las fortalezas del juego. Pero a ese detalle se le suma que Axel Stone, el personaje principal, tiene la agilidad de Homero Simpson con las piernas fracturadas. Por esto mi reacción inicial fue un poco negativa debido al control. Floyd Iraia también es bastante lento, hasta más lento, pero tiene bastante fuerza y alcance con brazos mecánicos. Blaze Fielding es bastante más ágil pero tampoco puede correr apretando para adelante dos veces.

La primera vuelta de la historia, elegí a Axel porque “es el principal”. Pero probando los demás personajes pude apreciar que cada uno tiene un estilo de juego realmente distinto, lo cual le agrega bastante diversión (¡algunos sí corren!). Por ahora mis personajes favoritos son Adam Hunter, su hija Cherry Hunter y Axel Stone de Streets of Rage 3. Podemos desbloquear los personajes de los Streets of Rage anteriores en toda su pixelada gloria, hasta alcanzar el total de 17 personajes. Cherry además de súper ágil tiene re buenos ataques con su guitarra eléctrica y puede correr apretando dos veces para adelante. Adam también pseudo corre al apretar dos veces para adelante, pero es más un “da unos pasos rápido y se queda” que “correr”, pero tiene más ataque. Axel de SoR 3 es Axel ¡pero con la habilidad de correr!

En general el control se siente bastante distinto a los beat ’em up de Capcom por ejemplo, pero es una particularidad de la saga. Tiene su estilo de control particular. Los personajes más lentos, a mi gusto, son más incómodos de usar. Y esto se complementa con algo que a veces me molesta un poco del juego que son los “golpes bajos”. Hay juegos en los que me doy cuenta cuando pierdo o me atacan porque soy malo (Street Fighter II te estoy mirando), me falta práctica, o estoy en un nivel demasiado difícil para mi habilidad. Pero otras se siente súper injusto, como que no te da el tiempo/velocidad para esquivar ataques o hay ataques que son golpes bastante bajos y “tramposos”.

Esto fue una impresión inicial que me hizo frustrar un poco. Pero a medida que fui jugando más, se fue haciendo cada vez menos importante. Todavía me molesta, pero no me frustra tanto como al principio. Así que es una mezcla de que me faltaba práctica y que hay veces que los ataques son realmente injustos (como los bastardos que simplemente cruzan la pantalla con un cuchillo en la mano y si estás en medio de una acción, no hay forma de esquivarlos).

A pesar de las críticas, es un juego bastante entretenido. La variedad de personajes y que me resulte tanto más o menos cómodo usar personajes distintos implica que están diseñados de manera de agregarle diversidad a la forma de jugar. Está bueno que la diferencia entre personajes a elegir vaya más allá de la paleta de colores, por lo que cada persona tendrá personajes que le queden más cómodo que otros. Y yo mismo voy variando para volver  a jugarlo con distintos protagonistas. El jefe Max por ejemplo: con Axel le gané a fuerza bruta, perdiendo vidas hasta que logré sacarle toda la energía. Con Cherry le gané sin perder ninguna vida porque la forma de jugar se adapta mucho más a mí.

En conclusión hay que aceptar que el control es distinto a los beat ’em up que venía jugando, y era cuestión de acostumbrarse. Una mecánica que queda bastante bien aprendida con SoR es la de esquivar enemigos en el eje Y, caminar para arriba y abajo para mantenerse fuera del alcance de los ataques enemigos y poder atacarles. Esto nos va a servir en todos los beat ’em up que juguemos.

Empecé jugándolo en dificultad media y después probé con fácil. Si fuera a empezar de cero otra vez, recomendaría empezar en fácil y una vez que le agarramos la mano y encontramos al protagonista que mejor manejamos, pasar a dificultad media. A veces el mayor desafío nos puede frustrar, y la idea es divertirnos, y no hay vergüenza en jugar un juego con dificultad “fácil”, por algo está ahí.

He vuelto a jugar la historia principal y el modo Arcade (lo mismo, pero sin continues), y lo seguiré haciendo (mínimo hasta obtener todos los personajes escondidos). También finalmente pude jugar en modo cooperativo. Jugué con un amigo en línea y confirmé que este tipo de juegos es bastante más divertido con alguien más. SoR 4 soporta hasta 2 jugadores online y hasta 4 en local. Debe estar genial jugarlo en local, gritándote y planeando con amigos. ¡Ya se podrá!

Dado el éxito en ventas y que fue el regreso después de muchos años a SoR, me puse a investigar si habría un Streets of Rage 5. En un Ask Me Anything de Reddit, los desarrolladores comentaron que tienen muchas ideas y definitivamente quieren agregar más contenido al juego en el futuro, pero en ese momento todavía no habían tomado una decisión y seguían trabajando en mejorar lo que ya hay. Respecto a una secuela comentaron que todavía no lo han discutido por esta misma razón (concentrarse en SoR4) pero también señalaron que estaban trabajando en tres proyectos similares que no han sido anunciados todavía (uno podría ser Pharaoh: A New Era, anunciado en agosto de 2020).

De ese mismo AMA, encontré este artículo bastante interesante del blog de PlayStation que vale la pena compartir: How Streets of Rage’s iconic characters were redesigned for the PS4 sequel

Streets of Rage 4 es un excelente beat ’em up al que sigo jugando y recomiendo probar.

River City Ransom: Underground

Dejando descansar al Nintendo Switch, volví a River City Ransom: Underground en Steam. Esperé este juego con mucha expectativa cuando se anunció su Kickstarter. Por alguna razón una vez que salió y lo pude jugar, no me enganchó tanto. Esas cosas dependen mucho del momento en que me encuentro cuando sale un juego, y con los Kickstarter muchas veces las demoras previas y las expectativas muy altas desencantan del resultado final. Pero en este caso se suma también que el producto inicial tenía bastantes errores que afectaban la experiencia. Esos errores se fueron arreglando con parches así que funciona bastante mejor ahora.

River City Ransom: Underground

River City Ransom: Underground

Volví a arrancar la historia de cero y encontré que el control, los gráficos y la música estaban excelentes. Tal cual lo que esperaría de una secuela a River City Ransom después de tantos años.  Lamentablemente una vez más llegué a un momento donde no estaba tan enganchado y volví a abandonarlo después de un par de horas. Creo que en parte está el hecho de que los juegos que termino jugando más horas en la computadora son los que se juegan mejor con mouse y teclado (mis más jugados en Steam por horas son Cities: Skylines, la serie de Kingdom Rush y Prison Architect).

Por curiosidad me fijé si existía la posibilidad de que publicaran este título en Nintendo Switch, y lamentablemente no creo que pase. Parece que el estudio no tuvo fondos para portarlo, pasaron por algunos problemas financieros cuando el juego fue retirado de Steam por unos problemas de derechos con la música. Finalmente, los desarrolladores pasaron a otros proyectos, por lo que imagino que para que haya un port a Switch, algún otro estudio debería comprar los derechos y encargarse de la publicación, pero no sé lo suficiente del tema.

Creo que no le he dedicado el tiempo que se merece, tiene todo para ganarme, pero es cuestión de dedicarle más tiempo…

River City Ransom

River City RansomUno de los títulos que no podía faltar en mi colección de Switch es Kunio-kun: The World Classics. Este compilado incluye todos los títulos de la saga Kunio-Kun publicados en Famicom, sus versiones localizadas para América y los primeros tres títulos de Double Dragon publicados en NES. Es la edición física publicada en Asia, pero incluye menúes y demás en inglés. Varios de los títulos fueron publicados únicamente en japonés.

Recientemente fue localizado para el resto del mundo con el nombre Double Dragon & Kunio-kun: Retro Brawler Bundle. Es la misma colección con la particularidad de que los textos de los juegos que están únicamente en japonés fueron traducidos al inglés por primera vez. Hay varios juegos que se hacen bastante difíciles de jugar sin saber japonés, así que me encantaría volver a comprarlo. Pero por ahora sólo está disponible en versión digital, y el precio es bastante elevado…

De todas formas tengo las versiones americanas de los juegos de Kunio y  varios de los que se encuentran en japonés igual se dejan jugar. Entre las versiones americanas, está River City Ransom. Si bien lo había jugado mucho en mi querido NES, es de esos títulos que tenía pendiente terminar. Fue interesante ir de juegos más modernos a este de la época 8-bits. Potencialmente gracias a eso pude apreciarlo mejor. El control es genial, y eso que cuenta con sólo dos botones A y B para patadas y puñetazos. Para saltar tenemos que presionar los dos a la vez. Así y todo se siente genial, simple pero funcional.

La historia no es algo demasiado profundo, pero cuenta con una personalidad y un humor bastante particular. Los nombres de las pandillas, los diálogos de los pandilleros y demás, bastante divertido. Tiene varios aspectos de RPG. Al derrotar pandilleros van dejando monedas que podemos usar para aumentar nuestras estadísticas: ataque con armas, defensa, piña, patada, etc. Y también podemos comprar ataques más fuertes e ítems que aumentan permanentemente las estadísticas de nuestro personaje.

Es relativamente corto, pero súper disfrutable. Una vez adquiridos Stone Hands y Dragon Feet, los poderes que reemplazan al puño y patada común, se va haciendo todavía más ágil. Recordé que la razón principal por la que no lo terminé en su momento fue que llegué a River City High, la secundaria donde nos enfrentamos a los jefes finales, pero no pasaba nada. La movida ahí es que tenemos que vencer a ciertos jefes y en cierto orden antes de llegar a estas puertas. Sólo tenemos que prestar atención a los diálogos cuando vencemos a los jefes, que nos dicen quién es el siguiente y dónde se encuentra.

River City Ransom es un clásico que cualquier persona que disfrute de los beat’em ups debería jugar. Al tenerlo fresco en la memoria, me dieron más ganas de volver a jugar River City Ransom: Underground con una nueva perspectiva. Definitivamente lo voy a hacer y darle el tiempo que se merece.

Y más…

Probé los Double Dragon de NES y me resultaron bastante crudos, creo que me quedo con Battletoads. Podría probar Double Dragon Neon que se publicó en Nintendo Switch recientemente y se ve bastante moderno. Mi lista incluye por ahora -además de River City Ransom: Underground– los títulos de Capcom Beat ‘Em Up Bundle. También podría volver a jugar River City: Tokyo Rumble en Nintendo 3DS. Lo terminé en su momento, pero no he vuelto a jugar en años.

En breve debería recibir de Limited Run Games – Jay and Silent Bob: Mall Brawl para Switch. Es un brawler estilo 8-bit en uno de los mejores universos cinematográficos, el View Askewniverse. Los reviews en Steam son generalmente positivos, así que le tengo fe. El juego fue desarrollado por el mismo estudio que viene desarrollando Jay and Silent Bob: Chronic Blunt Punch, un brawler un poco más moderno que ojalá salga también para Nintendo Switch.

Otro título que salió recientemente para Switch y estoy esperando la versión física es Scott Pilgrim Vs. The World: The Game. Lo pedí por Limited Run Games, así que con suerte en algún momento este año lo pueda jugar.

Los beat ’em ups son clásicos y muy divertidos, incluso de a períodos cortos de tiempo si no tenemos mucho tiempo para invertir en ellos. Si bien hay varios títulos modernos y muy buenos, se siente como que el género todavía puede ser aprovechado más. Seguiré probando cada título que me llame la atención. Tengo la impresión de que el género podría desarrollarse más y sacar ventaja de los mejores elementos de cada beat ’em up que vino antes. O de repente es la crisis de la edad que me hace creer que por haber jugado muchos videojuegos tengo la capacidad de desarrollar uno y es lo que lleva a que existan tantos estudios de desarrollo de videojuegos indie 😆

Seguiré escribiendo al respecto…

Fernando: BARF!
The post A las piñas y patadas: Jugando beat ’em ups first appeared on Picando Código.

» Leer más, comentarios, etc...

Variable not found

Enlaces interesantes 427

enero 18, 2021 07:05

Enlaces interesantes

Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)

Por si te lo perdiste...

.NET Core / .NET

ASP.NET Core / ASP.NET / Blazor

Azure / Cloud

Conceptos / Patrones / Buenas prácticas

Data

    Web / HTML / CSS / Javascript

    Visual Studio / Complementos / Herramientas

    Xamarin

    Otros

    Publicado en Variable not found.

    » Leer más, comentarios, etc...

    Blog Bitix

    Documentación para registrar las decisiones de arquitectura en software e infraestructura

    enero 16, 2021 07:00

    Las tareas de un programador no consisten únicamente en escribir líneas de código o de un arquitecto decidir que usar o no usar y como. Una tarea importante de un programador o un arquitecto debe ser también escribir o mantener documentación actualizada. La arquitectura empleada en una aplicación permite conocer cuáles son sus componentes y piezas específicas de las que se compone sin tener que analizar el código fuente. La arquitectura de una aplicación puede ser de muchas formas, las decisiones de arquitectura también son un aspecto susceptible de ser documentadas, que permitan conocer cuáles fueron las motivaciones para elegir entre unas opciones y otras y que cambios de arquitectura ha sufrido una aplicación y por que motivos.

    Al desarrollar una aplicación desde cero se han de tomar numerosa decisiones relativas a la arquitectura de la aplicación. Desde que lenguaje de programación a usar, que tecnología cómo que base de datos, si va a utilizar mensajes, el conjunto de librerías, si va a estar implementada con DDD o arquitectura hexagonal, que funcionalidades se implementan y como, como se va a hospedar y con que infraestructura entre muchas otras decisiones. La documentación es importante para conservar y transmitir el conocimiento sin tener que analizar el código fuente de la aplicación, ya sea de los componentes de arquitectura y cómo interactúan entre ellos o cuales son los requerimientos de un determinado proyecto para iniciarlo.

    La arquitectura de una aplicación y los componentes de los que está formada una aplicación suelen documentarse con un esquema gráfico. Pero el esquema gráfico muestra únicamente la situación actual de la arquitectura y no es suficiente para conocer las motivaciones y requerimientos que han intervenido para optar por esa arquitectura y no otra, o los cambios que se han realizado en la arquitectura con el paso del tiempo.

    Siempre se quiere tener documentación actualizada con la información que se necesita, a nadie le apetece extraer información a partir de código fuente ya que esto requiere mucho tiempo e impreciso. Querer documentación no es lo mismo que querer escribirla, pero normalmente es de gran ayuda para otros o para uno mismo en el futuro. Y no solo es escribirla sino también mantenerla actualizada.

    Documentación Architecture Decision Records

    La documentación de decisiones de arquitectura o Architecture Decision Records (ADR) es una colección de documentos que recogen individualmente cada una de las decisiones de arquitectura tomadas. Los ADR pueden ser simplemente un documento en Google Docs, una Wiki o una colección de documentos de texto en formato markdown. Como toda documentación esta requiere mantenimiento para que esté completa y no quede desfasada con el paso del tiempo, de modo que ha de sar fácil de mantener, accesible para su edición y tener visibilidad en la organización para encontrarla fácilmente.

    Estas son siglas relacionadas con la documentación ADR:

    • AD: architecture decision, es una decisión de arquitectura tomada
    • ADR: architecture decisión record, es el registro con información relacionada de una AD.
    • ASR: architecturally-significant requirement, es un requerimiento destacado que influye en un AD.
    • ADL: architecture decision log, son el conjunto de los ADR.
    • AKM: architecture knowledge management

    En los documentos ADR tienen las siguientes propiedades:

    • Fecha: cuando el AD ha sido tomada.
    • Razones: explicar las razones para tomar una determinada AD incluyendo los ASR.
    • Específico: cada ADR debe tratar un AD específico.
    • Inmutabilidad: los AD deben ser inmutables, no se ven afectados por decisiones futuras.

    Cada ADR además puede recoger información de contexto, ya sea por la situación de una organización, prioridades de negocio o características o habilidades de los equipos. También pueden recoger otras informaciones como consecuencias de una AD, ya que las decisiones de arquitectura suele tomarse antes de implementarlas que riesgos tiene y que asunciones se están haciendo, ante esos riesgos que mitigaciones son posibles en caso de tener que optar por un cambio, que otras decisiones de arquitectura candidatas se han evaluado y por que se han descartado, o un análisis de arquitecturas por las que se han optado en otras organizaciones ante problemas similares.

    Estos son algunos apartados de un ADR:

    • Fecha
    • Contexto
    • Decisión
    • Consecuencias
    • Riesgos
    • Mitigaciones
    • Candidatos evaluados
    • Asunciones
    • Restricciones
    • Argumentos

    Un buen ejemplo de Architecture Decision Records son los documentos de especificaciones JEP de Java que incluyen un resumen, objetivos, motivaciones y una descripción detallada de la proposición.

    Decisiones de arquitectura tomadas en mi blog

    Utilizando como ejemplo mi blog a lo largo de los años he tenido que tomar varias decisiones que podrían ser de arquitectura. Entre Blogger, el generador estático de sitios web con Hugo y quizá en un futuro con AWS las cosas han cambiado mucho en mi blog, sin embargo, no he recogido en ningún documento específico cuáles son las decisiones en cada uno de esos cambios y los motivos.

    El siguiente no sigue ninguna plantilla en concreto en los enlaces de referencia se incluyen algunas de ejemplo. Cualquier cosa relevante en la arquitectura es candidato a ser incluido en el ADR.

      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
     49
     50
     51
     52
     53
     54
     55
     56
     57
     58
     59
     60
     61
     62
     63
     64
     65
     66
     67
     68
     69
     70
     71
     72
     73
     74
     75
     76
     77
     78
     79
     80
     81
     82
     83
     84
     85
     86
     87
     88
     89
     90
     91
     92
     93
     94
     95
     96
     97
     98
     99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    
    # Creación blog
    
    Fecha: 2010
    
    ### Contexto
    
    Quiero un blog personal para escribir artículos técnicos relacionados con Java, de software libre y GNU/Linux y otros
    artículos relacionados con la programación.
    El mantenimiento no ha de ser complicado y el coste bajo o ninguno.
    
    ### Decisión
    
    Uso Blogger como plataforma para tener un blog. Es rápido de tener, sencillo de usar y no
    requiere conocimientos.
    
    ### Alternativa a Blogger
    
    Fecha: 2013-12
    
    ### Contexto
    
    Editar y publicar artículos con Blogger requiere un esfuerzo significativo. Personalizar la plantilla de Blogger no es
    sencillo y propenso a errores.
    Es difícil gestionar recursos de los artículos como imágenes y gestionar los enlaces entre los artículos.
    
    Candidatos: Pelican, Octopress.
    
    ### Decisión
    
    Cambio al generador estático Octopress y muevo el blog a GitHub Pages. Selecciono Octopress por tener documentación
    específica para GitHub Pages.
    No migro los artículos de Blogger a Octopress ya que requiere mucho esfuerzo.
    
    ---
    
    # Alternativa a Octopress
    
    Fecha: 2015-05
    
    ### Contexto
    
    La instalación de la herramienta Octopress no es sencilla y es propensa a errores en local en las actualizaciones.
    Octopress usa Ruby que no dominio de modo que los errores no se cual es el problema para solucionarlo rápidamente,
    al mismo tiempo son poco descriptivos.
    
    Candidatos: Hugo
    
    ### Argumentos
    
    Hugo es un único binario fácil de instalar, es un generador estático de sitios web equivalente a Octopress pero mucho
    más rápido en la generación del sitio, tiene numerosas opciones de personalización y buena documentación.
    
    ### Decisión
    
    Empiezo a usar Hugo
    
    ### Riesgos
    
    He de migrar el contenido de los artículos de Octopress a Hugo. El número de artículos a migrar es manejable y al estar
    ambos en formato _markdown_ no se requieres grandes cambios.
    
    ---
    
    # Alternativa a Gists
    
    Fecha: 201?
    
    ### Contexto
    
    Los trozos de código fuente que incluyo en los artículos los llevo almacenando como Gist de GitHub. Esto es parte del
    contenido del artículo que está externalizado fuera.
    
    ### Acciones
    
    Extraer el contenido de los Gist con un _script_ y ubicarlos como contenido de los artículos según la estructura de
    directorios requerida por Hugo. Usar el editor para buscar y reemplazar en el contenido de los artículos de Gist al
    contenido local.
    
    ### Decisión
    
    Sustituir Gist por contenido local en el blog usando las facilidades de Hugo, _shortcodes_.
    
    ---
    
    # Diseño adaptable
    
    Fecha: 2019-05
    
    ### Contexto
    
    El blog no es adaptable a diferentes tipos de pantalla, los bloques de publicidad solo se muestran
    en la parte superior del artículo.
    
    ### Decisión
    
    Hacer que el contenido del artículo tenga más anchura, sea adaptable y que un bloque de publicidad siga al contenido
    al hacer _scroll_.
    
    ---
    
    # Hospedaje en la nube y dominio propio
    
    Fecha: 2021?
    Estado: Proposición
    
    ### Contexto
    
    Con el objetivo de aprender sobre computación en la nube, evaluar si migrar el blog a una nube. Y comprar un
    dominio propio para independizarlo de la plataforma de hospedaje.
    
    Candidatos: AWS, Linode o Digital Ocean.
    
    ### Argumentos
    
    AWS tiene unos costes más variables que Linode o Digital Ocean pero algo más barato con un plan
    de varios años, AWS es una opción más útil en ofertas de trabajo.
    
    ### Riesgos
    
    El coste del blog con GitHub Pages es cero, el blog genera ingresos suficientes para cubrir los costes
    de su hospedaje en la nube y el coste de un dominio propio. Con GitHub Pages no se requiere administrar
    ni mantener infraestructura propia. Una nube requiere infraestructura propia y mantenerla.
    
    Minimizar el impacto en el SEO, redirigiendo el tŕafico actual al nuevo dominio y haciendo que los buscadores
    consideren el nuevo dominio como el canónico.
    
    ### Mitigaciones
    
    En caso de que administrar infraestructura propia requiera tiempo o sea poco fiable una opción
    es usar CloudFront + S3 en vez de CloudFront + EC2. El coste de S3 será algo más barato que usar EC2.
    Durante el primer año la capa gratuita de AWS cubre la mayor parte de los costes. Con un dominio propio
    en caso necesario quizá pudiese volver a GitHub Pages.
    
    ### Decisión
    
    Migrar el contenido a una nube y adquirir un dominio propio.
    adr.markdown

    » Leer más, comentarios, etc...

    Blog Bitix

    Analítica web con Matomo como alternativa a Google Analytics

    enero 15, 2021 04:00

    Matomo es una alternativa a Google Analytics con funciones similares que cubren las necesidades de la mayoría de sitios web. Es software libre con algunas funciones premium que requieren comprar una licencia anual de uso. Matomo se puede hospedar on-premise que requiere administrar esa infraestructura o en la nube ofrecida por la propia Matomo. En el artículo muestro en un ejemplo como empezar a usar Matomo en un sitio web con Docker.

    Matomo

    La analítica web permite obtener valiosa información y datos de un sitio web, de los usuarios y de su comportamiento. Estos datos e información sirven para tomar decisiones basadas en parte datos en vez de únicamente en opiniones e intuiciones. Cuantas son las visitas de un sitio web, qué páginas son las más visitadas, cuánto tiempo permanecen los usuarios en una página, que días de la semana y a que horas hay más visitas, que navegador, sistema operativo y dispositivo usan los usuarios, un ordenador o dispositivo móvil, cuáles son los sitios de referencia y mucha otra información.

    La herramienta de analítica web más utilizada es Google Analytics. En el artículo Analítica web en el servidor sin JavaScript en el cliente con GoAccess comentaba algunos motivos para usar o no usar Google Analytics.

    Los motivos para usar Google Analytics están en que es gratuita, fácil de instalar en un sitio web, tiene gran cantidad de funcionalidades básicas y avanzadas que cubren las necesidades de cualesquiera usuarios y no requiere mantener infraestructura propia. Los motivos en contra de usar Google Analytics están en que los datos de un sitio web y de los usuarios es recogido por una tercera parte que establece su propia licencia al servicio y los datos, lo que afecta a la privacidad de los usuarios.

    Matomo, una alternativa a Google Analytics

    Matomo es una de las herramientas como alternativa a Google Analytics. Tiene funciones equivalentes a las de Google Analytics, tiene una licencia software libre y es posible instalarlo en infraestructura propia para controlar los datos de los sitios web sin depender de una tercera parte. Matomo también ofrece la posibilidad de usarlo hospedado y administrado en su modelo cloud ofrecido por Matomo.

    Algunas funciones de Matomo son métricas en tiempo real, seguimiento con eventos y de contenido, informes personalizados, dimensiones y variables personalizadas, geolocalización, segmentación de usuarios, transiciones de páginas y estadísticas sobre la página, velocidad el sitio web y páginas, seguimiento de campañas, tracking de eventos y tag manager entre otras

    Aunque Matomo es software libre con las funciones anteriores incorporadas para tener acceso a otras funciones requieren una suscripción para usu uso. Algunas de las funciones premium son mapas de calor o heatmaps en la interacción en una página, pruebas A/B, informes personalizados, analítica de formularios y medios, funnels, flujo de usuarios o autenticación con SAML. Al igual que Google Analytics para realizar la analítica web Matomo requiere insertar un pequeño script de JavaScript en el HTML de todas las páginas de los sitios sitio web. El script es proporcionado por Matomo al crear el sitio web.

    Las funciones premium se pueden adquirir de forma individual las que se usen o todas en forma de paquete en la tienda de Matomo. El paquete de funciones premium tienen un coste de algo más de 1K €/año para 4 usuarios. El coste de la versión cloud varía en función del número de visitas partiendo de los 29 €/mes hasta las 50K páginas vistas a los 239 €/mes para 1M de páginas vistas. Hay precios para webs con más tráfico y se ofrece casi un 20% de descuento al pagar de forma anual.

    Ejemplo de sitio web con Matomo

    Matomo requiere una base de datos MySQL o MariaDB para persistir los datos de analítica. En este ejemplo uso Docker con un archivo de Docker Compose para iniciar los contenedores de una base de datos MySQL, el servidor de Matomo y un servidor proxy con Nginx. La versión de MySQL con la que es compatible Matomo es la 5.7 o superior.

    En el archivo de Docker Compose se define los tres servicios, se configuran unos volúmenes de datos compartidos entre el servidor web y el servidor de Matomo y dos archivos donde se definen algunas variables de entorno tanto para la base de datos MySQL como para la configuración de Matomo.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    
    version: '3'
    
    services:
      mysql:
        image: mysql:5.7
        command: --max-allowed-packet=64MB
        volumes:
          - mysql:/var/lib/mysql
        env_file:
          - ${PWD}/database-mysql.env
    
      matomo:
        image: matomo:fpm-alpine
        links:
          - mysql
        volumes:
          - ${PWD}/config:/usr/share/nginx/config:rw
          - matomo:/var/www/html
        env_file:
          - ${PWD}/database-matomo.env
    
      nginx:
        image: nginx
        volumes:
          - ${PWD}/matomo.127.0.0.1.xip.io.conf:/etc/nginx/conf.d/matomo.127.0.0.1.xip.io.conf:ro
          - ${PWD}/www.127.0.0.1.xip.io.conf:/etc/nginx/conf.d/www.127.0.0.1.xip.io.conf:ro
          - matomo:/var/www/html:ro
          - ${PWD}/www:/var/nginx/html/www
        ports:
          - 80:80
        depends_on:
          - matomo
    
    volumes:
      mysql:
      matomo:
    
    
    docker-compose.yml
    1
    2
    3
    4
    
    MYSQL_ROOT_PASSWORD=mysql
    MYSQL_DATABASE=matomo
    MYSQL_USER=matomo
    MYSQL_PASSWORD=matomo
    database-mysql.env
    1
    2
    3
    4
    5
    6
    
    MATOMO_DATABASE_HOST=mysql
    MATOMO_DATABASE_DBNAME=matomo
    MATOMO_DATABASE_USERNAME=matomo
    MATOMO_DATABASE_PASSWORD=matomo
    MATOMO_DATABASE_ADAPTER=mysql
    MATOMO_DATABASE_TABLES_PREFIX=matomo_
    database-matomo.env

    En Nginx se configuran dos sitios web virtuales, un sitio web en el que realizar la analítica web y otro para el sitio web para la herramienta Matomo.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    server {
        listen 80;
        server_name www.127.0.0.1.xip.io;
    
        location / {
            root   /var/nginx/html/www;
            index  index.html index.htm;
        }
    }
    
    www.127.0.0.1.xip.io.conf
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    
    upstream php-handler {
    	server matomo:9000;
    }
    
    server {
    	listen 80;
    	server_name matomo.127.0.0.1.xip.io;
    
    	add_header Referrer-Policy origin; # make sure outgoing links don't show the URL to the Matomo instance
    	root /var/www/html; # replace with path to your matomo instance
    	index index.php;
    	try_files $uri $uri/ =404;
    
    	## only allow accessing the following php files
    	location ~ ^/(index|matomo|piwik|js/index|plugins/HeatmapSessionRecording/configs).php {
    		# regex to split $uri to $fastcgi_script_name and $fastcgi_path
    		fastcgi_split_path_info ^(.+\.php)(/.+)$;
    
    		# Check that the PHP script exists before passing it
    		try_files $fastcgi_script_name =404;
    
    		include fastcgi_params;
    		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    		fastcgi_param PATH_INFO $fastcgi_path_info;
    		fastcgi_param HTTP_PROXY ""; # prohibit httpoxy: https://httpoxy.org/
    		fastcgi_pass php-handler;
    	}
    
    	## deny access to all other .php files
    	location ~* ^.+\.php$ {
    		deny all;
    		return 403;
    	}
    
    	## disable all access to the following directories
    	location ~ /(config|tmp|core|lang) {
    		deny all;
    		return 403; # replace with 404 to not show these directories exist
    	}
    	location ~ /\.ht {
    		deny all;
    		return 403;
    	}
    
    	location ~ js/container_.*_preview\.js$ {
    		expires off;
    		add_header Cache-Control 'private, no-cache, no-store';
    	}
    
    	location ~ \.(gif|ico|jpg|png|svg|js|css|htm|html|mp3|mp4|wav|ogg|avi|ttf|eot|woff|woff2|json)$ {
    		allow all;
    		## Cache images,CSS,JS and webfonts for an hour
    		## Increasing the duration may improve the load-time, but may cause old files to show after an Matomo upgrade
    		expires 1h;
    		add_header Pragma public;
    		add_header Cache-Control "public";
    	}
    
    	location ~ /(libs|vendor|plugins|misc/user) {
    		deny all;
    		return 403;
    	}
    
    	## properly display textfiles in root directory
    	location ~/(.*\.md|LEGALNOTICE|LICENSE) {
    		default_type text/plain;
    	}
    }
    
    
    matomo.127.0.0.1.xip.io.conf

    Matomo requiere una configuración inicial, en el ejemplo se accede a Matomo en la dirección http://matomo.127.0.0.1.xip.io. En la configuración se solicita configurar un sitio web y se proporciona el script a insertar en las páginas del sitio web.

    Configuración inicial de Matomo

    Configuración inicial de Matomo

    Para que tome los datos de analítica del sitio web hay que insertar el script proporcionado en todas la páginas devueltas por el sitio web. Este es la página HTML de ejemplo mínima con el script insertado y el envío de un evento cuando se pulsa un botón.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="utf-8">
        <title>Index</title>
    
        <!-- Matomo -->
        <script type="text/javascript">
          var _paq = window._paq = window._paq || [];
          /* tracker methods like "setCustomDimension" should be called before "trackPageView" */
          _paq.push(['trackPageView']);
          _paq.push(['enableLinkTracking']);
          (function() {
            var u="//matomo.127.0.0.1.xip.io/";
            _paq.push(['setTrackerUrl', u+'matomo.php']);
            _paq.push(['setSiteId', '1']);
            var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
            g.type='text/javascript'; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
          })();
        </script>
        <!-- End Matomo Code -->
    
        <script type="text/javascript">
          function onClickButton() {
            _paq.push(['trackEvent', 'Index', 'Click', 'Send Event']);
          }
        </script>
      </head>
      <body>
        <p>Hello Matomo!</p>
        <p><a href="#" title="Send event" onclick="onClickButton();">Send event</a></p>
      </body>
    </html>
    
    index.html

    Web con analítica de Matomo

    Web con analítica de Matomo

    Matomo recibe los datos de analítica de las páginas desde el navegador de los usuarios cuando las páginas web son accedidas. Entre las funciones incluidas en Matomo están los paneles de Visitantes, Adquisición, Comportamiento, Objetivos y Mercado.

    Analítica web con Matomo Analítica web con Matomo

    Analítica web con Matomo Analítica web con Matomo

    Analítica web con Matomo
    Terminal

    El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando siguiente comando:
    docker-compose up

    » Leer más, comentarios, etc...

    Picando Código

    Mini pique – Tmux: Nombrar ventanas

    enero 14, 2021 12:00

    Desde que empecé a usar tmux, es una de las herramientas esenciales en mi día a día. De a poco he ido aprendiendo más cosas, y esto es algo que me ha sido bastante útil. Esto es el comando para renombrar una ventana que me ayuda a ver en la pestaña de tmux qué hay en esa terminal. Tenemos que usar el atajo de teclado que tengamos configurado como prefijo (por defecto Ctrl + b) seguido de la coma:
    Ctrl b ,

    En mi caso tengo el prefijo mapeado a Ctrl + a porque acostumbrado a Emacs me es mucho más difícil navegar el texto en la terminal sin Ctrl + b que es equivalente a la tecla del teclado.

    The post Mini pique – Tmux: Nombrar ventanas first appeared on Picando Código.

    » Leer más, comentarios, etc...

    Juanjo Navarro

    Pequeñas lecciones de diseño

    enero 12, 2021 08:30

    Erik D. Kennedy está dejando en su Twitter algunos tips sobre diseño de interfaces que resultan muy interesantes y útiles.

    Y si te interesa el diseño de tipos de letra, Grilli Type está dejando un curso sobre diseño de tipos también en Twitter.

    » Leer más, comentarios, etc...

    Variable not found

    Top ten 2020 en Variable not found

    enero 12, 2021 07:44

    Top ten 2020 en Variable not found

    Pues parece que por fin hemos conseguido quitarnos de encima el nefasto 2020, y afrontamos un nuevo año con la esperanza de que sea, al menos, algo mejor que el anterior. Os deseo a todos que así sea; sobre todo que la salud os acompañe a vosotros y los que os rodean, y que esto permita que seáis felices tanto en lo personal como en lo profesional.

    Y dicho esto, llega la hora de acudir a las tradiciones: el repaso de los posts más visitados durante el año que acabamos de dejar atrás, donde, como podemos ver, Blazor ha entrado con bastante fuerza :)

    Top ten 2020 en Variable not found

    Comenzando por el décimo puesto, encontramos el post cómo mostrar el número de usuarios conectados a una aplicación Blazor Server, en tiempo real, un interesante ejercicio que nos ayudaba a comprender cómo funcionan los circuitos de Blazor Server y cómo sacar partido a los componentes internos que nos permiten introducirnos en su ciclo de vida.

    La novena posición la ocupa nuestro amigo Mario, protagonista del post incluir recursos estáticos en una Biblioteca de Clases Razor (RCL), donde lo usábamos para crear un componente Razor reutilizable que mostraba al simpático personaje correteando por la pantalla.

    Continuamos con Blazor gracias a la serie sobre los mecanismos de interoperación con Javascript de este framework. En concreto, el post Cómo invocar métodos de instancia C# desde Javascript con Blazor es el que más vistas ha tenido, probablemente por su atractiva propuesta ;)

    La posibilidad de publicar aplicaciones .NET Core en modo auto-contenido y en un único archivo no ha pasado desapercibida para los lectores del blog. Por ello, el post publicación self-contained y single-file en .NET Core, aparece ocupando la séptima posición del ranking anual.

    Muy cerca del anterior en número de visitas, encontramos la respuesta a una pregunta relativamente frecuente a la hora de desarrollar aplicaciones .NET: ¿Usar try/catch es malo para el rendimiento?. Una respuesta con demostración incluida, gracias al imprescindible BenchmarkDotnet.

    La basura que va dejando en vuestro equipo las distintas versiones y revisiones de .NET Core conforme evoluciona el producto también parece haberos preocupado o, al menos, os ha llamado la atención. La aparición de una herramienta para limpiarlas fácilmente fue el detonante para escribir el post desinstala fácilmente versiones antiguas de .NET Core con "dotnet-core-uninstall".

    AddMvc(), AddControllers(), AddControllersWithViews(), AddRazorPages()... ¿qué es todo eso?, ya en quinta posición de la lista, intentaba aclarar qué eran esos nuevos métodos que aparecían en el intellisense a la hora de registrar los servicios de MVC o Razor Pages a partir de la llegada de ASP.NET 3.0.

    En tercera y cuarta posición respectivamente encontramos dos post muy relacionados. En el primero de ellos, describiendo APIs ASP.NET Core con Swagger, veíamos los conceptos básicos de OpenAPI y el uso de Swashbuckle para describir nuestras APIs creadas con ASP.NET Core. En el segundo, cómo documentar y generar código cliente de nuestras APIs utilizando Swagger/OpenAPI, revisábamos cómo sacar partido de dicha descripción, generando automáticamente la documentación de la API e incluso código cliente para acceder a ella.

    A cierta distancia de los anteriores, ya en segundo puesto, tenemos la solución a un error que frecuentemente encontramos al desarrollar aplicaciones ASP.NET Core con Visual Studio e IIS Express. El post cómo solucionar el error "Unable to connect to web server 'IIS Express'" en Visual Studio describe paso a paso qué hacer cuando nos topamos con este incómodo inconveniente al ejecutar las aplicaciones.

    And the winner is...

    Y por último, el indiscutible vencedor del año: ¿qué es Blazor, eso de lo que todo el mundo habla?. Este post intentaba despejar dudas en un momento en el que la palabra "Blazor" empezaba a sonar más de la cuenta y a despertar el interés de muchos desarrolladores, entre los que, por supuesto, me incluyo.

    Para acabar, me gustaría también hacer una mención especial a ¡Toma las riendas! ¡Conviértete en Desarrollador 10x Certificado!, el post publicado el 28 de diciembre que, si bien no ha conseguido entrar en el ranking, se ha quedado bien cerca a pesar de haber tenido pocos días para acumular visitas. Me he divertido mucho escribiéndolo, leyendo las respuestas y comentarios que me han llegado por diversas vías, y comprobando que algunos incluso habéis traducido los textos en japonés para ver qué ponía :D

    ¡Vamos a por 2021!

    Publicado en Variable not found.

    » Leer más, comentarios, etc...

    proyectos Ágiles

    Modelo mental #2: GESTIÓN POR MIEDO VS CREAR UN ENTORNO SEGURO.

    enero 12, 2021 05:00

    • La gestión por miedo lleva a una empresa a resultados por debajo de sus posibilidades.
    • Crear un entorno seguro libera el potencial de la organización, moviliza la inteligencia colectiva y fomenta probar y aprender.
    • Si te conviertes en carcelero obtendrás prisioneros… que querrán huir.
    • Si te conviertes en líder conseguirás seguidores… que a su vez liderarán.

    Este modelo mental se encuentra explicado en los slides de más abajo 👇 y en el siguiente vídeo: https://youtu.be/n7d6lJY5_ps?t=1704

    Este modelo mental se puede utilizar en un workshop con un equipo o con managers. La idea es ir explicando paso a paso el modelo mental (mejor si es con una pizarra blanca en función de las aportaciones del grupo), con preguntas (“¿que creéis que es necesario para…?”, “¿Alguna vez os ha pasado …?”, “¿Cuándo habéis visto que esto funciona y por qué?”). De este modo entre los asistentes se genera una conversación de aprendizaje: van explicando cómo ven el modelo, se cuentan historias sobre lo que les ha sucedido, que les ha funcionado (o no), cómo el contexto ha influido, etc. De este modo se enseñan unos a otros, ya que cada persona es capaz de percibir los modelos desde ángulos diferentes.

    Modelos mentales:

    Artículos relacionados

    » Leer más, comentarios, etc...

    Blog Bitix

    Estrategia de batalla básica en el juego World of Warships Legends

    enero 10, 2021 08:00

    El juego World of Warships es un juego de estrategia en el que la habilidad en el manejo del mando o disparo no es tan importante para ser un jugador que tenga un nivel por encima de la media. Otra parte importante de este juego es el juego en equipo en la que cada miembro según clase de barco y características ha de desempeñar su papel para que el equipo consiga la victoria. Conocer la misión de cada barco, las características de barco propio y del contrario junto con otras nociones básicas como que objetivos enemigos son los prioritarios, dónde posicionarse y que errores comunes no cometer también contribuyen a ser un mejor jugador.

    Los juegos competitivos individuales o en equipo con y contra otros jugadores a través de internet son una modalidad de juegos diferentes a los más tradicionales individuales contra la inteligencia artificial de los enemigos controlados por la computadora. A día de hoy la inteligencia artificial implementada en los enemigos está a mucha distancia de la inteligencia de un ser humano, la forma de hacer más difícil a un enemigo controlado por la computadora es dándole más puntos de vida, más velocidad o mayor habilidad en el disparo pero estos siempre siguen la misma estrategia de combate, en cuento a aprendizaje un ser humano aprende rápidamente sus comportamientos y mecánicas que en buena parte dejan de ser un reto.

    Un atractivo de los juegos donde los enemigos están controlados por otras personas es precisamente que la inteligencia de los enemigos en general es mayor que la que un desarrollador es capaz de implementar. Esto hace de los juegos un reto mayor y más divertidos.

    Dado que los juegos competitivos donde los enemigos son otras personas requieren de personas hace que muchos de estos juegos sean gratuitos de jugar o free-to-play para que haya un importante número de jugadores que generen la posibilidad de crear batallas. Al mismo tiempo dado que el juego marca unos objetivos pero el reto está en batir al rival se requiere que cada jugador cumpla el papel designado para él en el juego para que suponga un reto para todos y el juego cumpla su propósito de ser divertido.

    Algunos juegos competitivos son completamente individualistas, otros se juegan en equipo. En estos segundos es crucial el juego en equipo y cumplir con el papel asignado, de no hacerlo genera frustración en el resto de compañeros que se están esforzando para ganar la batalla. Los juegos suelen emparejar a jugadores del mismo nivel para que el reto sea lo más parecido para todos. Puede ocurrir que a veces simplemente cometemos un error o el enemigo tiene algo de suerte y la batalla resulta en una derrota, en estos casos no hay nada que reprochar, sin embargo, en ocasiones algunos jugadores parece que van a hacer misiones individuales en vez jugar en equipo para ganar la batalla o no hacen su cometido según papel, en estos casos genera frustración en el resto de jugadores del equipo que se están esforzando por ganar la batalla.

    Por ello es fundamental tener unas nociones básicas sobre estrategia según el juego que se juega, algunas reglas de estrategia se aprenden jugando, otras es de mucha ayuda leer alguna guía o seguir algún canal de jugadores muy experimentados que comparten sus conocimientos y lecciones aprendidas para el resto de jugadores.

    Imagen inicial del juego World of Warships en PlayStation 4

    Imagen inicial del juego World of Warships en PlayStation 4

    Contenido del artículo

    Estrategia básica

    En el juego hay una estrategia básica independiente del tipo de barco con el que se juegue. Como juego en equipo la primera regla es jugar en equipo, actuar en formaciones, cubrir y dar soporte a los aliados, no exponerse individualmente o asumir riesgos innecesarios, conocer la situación de la batalla de los enemigos y aliados, designar un objetivo preferente y disparar al mismo enemigo que los compañeros. Esto en conjunto aumenta las posibilidades de victoria en la batalla.

    Muchos juegos para coordinarse entre miembros del mismo equipo ofrecen un sistema de comunicación que es de gran ayuda utilizar. En el caso de World of Warships están las opciones de solicitar la captura de la base, notificar de un objetivo estratégico preferentes al que disparar, retroceder, solicitar soporte o he sido detectado lo que puede alertar de la presencia de un destructor cerca.

    Mensajes de comunicaciones Mensajes de comunicaciones

    Mensajes de comunicaciones

    Según la batalla el juego tiene diferentes objetivos, dominación o capturar la base enemiga. Normalmente las batallas se ganan por eliminar a todos los jugadores del equipo rival pero esto es propiciado en parte por obligar al equipo rival a exponerse. En el caso de dominación en el que otro forma habitual de victoria es a los puntos, si el equipo rival o nuestro equipo no reacciona en no mucho tiempo a las capturas del otro equipo al final se pierde a los puntos, en el caso de dominación quizá se gane por eliminación de todos los rivales pero la situación que en algunos casos ha provocado esto es por obligación a exponerse.

    En el caso de captura de la base enemiga, su captura significa la victoria. Por lo que igualmente iniciar la captura de la base enemiga obliga a reaccionar el equipo contrario que puede ocasionar hacerle exponerse, dividir las fuerzas que otorga superioridad al equipo contrario al tener que retroceder para impedir la captura.

    Objetivos según tipo de navío

    Objetivos de los destructores

    La principal característica de los destructores es su bajo radio de distancia en la que son detectados, esto les dota de un buen nivel de ocultamiento. Por el contrario son el tipo de barco que menos puntos de vida tiene con lo que han de tratar de no ser detectados. Es la unidad más importante en el juego y determinante para el éxito de una batalla.

    Por su buen nivel de ocultamiento sus objetivos principales son capturar bases, detectar o pintar a barcos enemigos que permite al resto del equipo conocer la posición de los enemigos sin estar los compañeros detectados y detectar y contrarrestar a los destructores enemigos. Aunque los destructores al estar dotados de torpedos con un buen alcance es el archienemigo de los acorazados, el objetivo de los destructores de atacar a acorazados no es su objetivo prioritario ya que realmente los acorazados son la unidad menos importante del juego, son más importantes los objetivos anteriores mencionados.

    Los torpedos son más fáciles de utilizar contra los acorazados pero tienen otras utilidades tácticas, otros usos que se les puede dar a los torpedos es para cubrir zona con ellos que impida al equipo enemigo acercarse a riesgo de sufrir un impacto, a veces no es mala idea lanzarlos en su dirección conociendo que hay enemigos cerca aún sin saber su posición exacta. Aunque los cruceros y otros destructores son suficientemente ágiles para esquivar torpedos de destructores y están dorados de sonar para detectarlos a mayor distancia arriesgarse a sufrir un pacto de torpedo supone el hundimiento del barco o quedarse con tan pocos puntos de vida que en una salva enemiga suponga el hundimiento.

    Hay algunos destructores con algo mejor que la media o el mejor nivel de ocultamiento. Algunos son más torpederos, con más lanzaderas, menor tiempo de recarga y hacen más daño por impacto de torpedo. Otros destructores son más cañoneros que igual no tienen tantos torpedos pero sus cañones tienen un tiempo de recarga más bajo o hacen más daño. Según la orientación del destructor dentro de los objetivos generales de todos los destructores serán algo más efectivos si se aprovechan sus virtudes en la que más destacan. Si el destructor es más cañonero que el rival su estrategia será algo más encontrar a los destructores rivales y hundirlos, si tiene más ocultación capturar bases y sin son más torpederos utilizarlos para cubrir zonas o atacar a acorazados desprevenidos o aislados.

    Aunque los destructores tienen el mejor nivel de ocultamiento que los hace difíciles de detectar, dada la importancia de estos a nivel estratégico suelen ser el objetivo preferente de todo barco que lo tiene a tiro. La forma que tienen los destructores de protegerse al ser detectados es utilizando el humo para ocultarse, despintarse y buscar una nueva posición en la que combatir de nuevo sin estar detectado.

    Humo de destructor y de algunos cruceros

    Humo de destructor y algunos cruceros

    Objetivos de los cruceros

    Los cruceros son la unidad media del juego. Son ágiles, veloces, un tiempo de recarga de los cañones bajo comparado con los acorazados, unos cañones relativamente potentes e incluso similares a los de algunos acorazados. Son una unidad polivalente aunque frágil expuesta a un acorazado.

    Sus funciones principales es la de dar apoyo a los destructores aliados, perseguir o localizar destructores enemigos sin apoyo, en algunas ocasiones realizar capturas de bases, intentar permanecer el mayor tiempo con vida o buscar coberturas detrás de islas desde la que disparar estando oculto sin ningún riesgo.

    Los cruceros tienen como punto débil las ciudadelas que al exponerse de forma completamente lateral se arriesgan de ser hundidos de una salva o quedar con muy pocos puntos de vida por ellos han de buscar cobertura o permanecer alejados de ellos. Los cruceros tienen un radio de detección relativamente alto suelen ser una de las unidades detectadas primero en las partidas que se suelen adelantar antes en el inicio del juego por ser más rápidos que los acorazados.

    Dada la polivalencia de los cruceros algunos están más orientados a atacar destructores u otros cruceros, a disparar munición HE que cause incendios en los acorazados, algunos tiene cañones comparables a algunos acorazados con los que son muy efectivos contra otros cruceros e incluso acorazados, por su tiempo de recarga más bajo que los acorazados pero algunos con calibre similar a estos también son una unidad peligrosa para otros cruceros.

    Después de los destructores los cruceros son el siguiente objetivo prioritario en el juego y en cuanto son detectados una vez los cañones de los acorazados giran para apuntarles reciben las salvas, más si tienen el lateral expuesto. Tienen pocos puntos de vida comparado con el daño que hacen los acorazados cuando impactan en la ciudadela de modo que han de intentar recibir poco daño o no ser el objetivo primario. Algunos capitanes tiene una habilidad que permite saber cuantos enemigos los tienen seleccionado como objetivo, esto permite intentar hacer maniobras evasivas o disparar con tranquilidad sabiendo que no se es el objetivo primario para ningún enemigo.

    Habilidad ingenio útil en cruceros Habilidad ingenio útil en cruceros

    Habilidad ingenio útil en cruceros

    Objetivos de los acorazados

    Los acorazados son la unidad pesada del juego, con más puntos de vida, con los cañones de mayor calibre y de largo alcance. Por el contrario son menos ágiles y tienen una velocidad máxima menor que los hacen más vulnerables a los torpedos.

    Al contrario que los destructores o en ocasiones los cruceros su objetivo principal no es realizar capturas de bases enemigas. Sin embargo, sirven para impedir la de los enemigos aún estando en la zona de captura si estos están detectados y en el radio de alcance al causar el reinicio de la captura si el barco que está capturando recibe un impacto. Impiden el libre movimiento de los cruceros y con su largo radio de acción un control táctico del mapa sin necesidad de estar desplazándose continuamente a máxima velocidad. Se basan más en tener una buena posición en el mapa que en el movimiento.

    Por lo general son efectivos contra los cruceros por sus ciudadelas vulnerables, otros acorazados también son objetivos si están expuestos de forma completamente lateral que también se arriesgan a sufrir impactos en la ciudadela. Generalmente, en los acorazados se utiliza siempre munición AP incluso contra los destructores en los que los impactos serán sobre penetraciones pero seguirán causando un daño significativo comparado con los puntos de vida de los destructores.

    Junto con exponerse de forma completamente lateral a otros acorazados, los incendios de algunos cruceros que están especializados en provocar son un riesgo. Un incendio no es peligroso estando con prácticamente la totalidad de los puntos de vida e incluso dos durante un poco de tiempo ya que tiene la habilidad de reparación que les permite recuperar gran parte de los puntos de vida perdidos por incendio. Una amenaza más grave es una inundación causada por el impacto de un torpedo, una inundación al igual que los incendios causan la pérdida constante de puntos de vida pero en algo mayor número por segundo y durante algo más de tiempo, por ello una inundación obliga casi siempre a utilizar un consumible de reparación, si el consumible de reparación no está disponible por haber sido utilizado con anterioridad y está en periodo de recarga la pérdida de puntos de la inundación al cabo de unas cuanta decenas de segundos puede causar el hundimiento del acorazado.

    Otras nociones comunes básicas de estrategia

    Defensa contra torpedos

    Los acorazados en solitario son un objetivo sencillo para el destructor, un acorazado no tiene forma de detectar un destructor si el capitán del destructor no quiere. Son lentos y poco maniobrables que los hace más vulnerables a los torpedos.

    Hay algunas formas de defenderse de los destructores y de los torpedos. Una es protegerse detrás de islas que impida que los torpedos tengan una línea de impacto. En mar abierto es poner rumbo en dirección contraria a la posición estimada del destructor enemigo de modo que los torpedos no lleguen a alcanzar al acorazado entre lo que que el acorazado se desplaza y antes de que el torpedo llegue a su alcance máximo. En caso de necesidad de tener que dirigirse por obligación a un punto determinado en dirección o en el radio de acción del destructor como una zona de captura hay que emplear tácticas de evasión maniobrando cada 30 o 40 segundos dependiendo del tiempo de recarga de torpedos del destructor enemigo, cambiando el rumbo y velocidad para que el indicador de previsión de impacto que tienen los destructores al lanzar los torpedos no sea preciso. Finalmente, otra táctica para protegerse de los torpedos es no exponer el lateral completo del acorazado poniendo la proa o la popa en dirección a los torpedos de esta forma el número de impactos en vez de ser dos o más habitualmente será uno.

    Indicador de impacto de torpedos Indicador de impacto de torpedos Indicador de impacto de torpedos

    Indicador de impacto de torpedos

    Otra forma de defensa contra los torpedos es conociendo cuando el destructor los está lanzando. Los torpedos se lanzan por los laterales de modo que si un destructor gira para ponerse de forma lateral puede ser indicativo de que los está lanzando o si está girando para alejarse de que ya los ha lanzado y ahora intenta ocultarse. Al mismo tiempo lanzar los torpedos en los destructores requiere cambiar entre los cañones y la lanzadera de torpedos de modo que si un destructor está disparando con los cañones y deja de disparar con cadencia de recargar es indicativo de que el enemigo ha lanzado o está lanzando los torpedos.

    Tener el conocimiento de cuando un destructor es probable que haya lanzado torpedos permite maniobrar cambiando de dirección o velocidad para cambiar la ubicación prevista de impacto que ha tenido el destructor, la maniobra permite esquivarlos. Si un destructor al que se dispara no dispara es que está tramando algo malo, que es que está lanzando torpedos, el momento para conocer que los ha lanzado es cuando empieza a girar momento en el que hay que cambiar de rumbo y cambiar de velocidad.

    Selección de objetivos

    Una parte importante en la táctica es la selección de objetivos. Por norma general, los objetivos por orden de prioridad son los destructores, luego los cruceros con radar por su peligro para los destructores aliados que los permite detectar por un periodo breve de tiempo pero aún estando a largas distancias, luego los cruceros y finalmente el tipo de barco menos importante son los acorazados aún siendo estos los que más puntos de vida tienen y aún siendo estos los que tienen los cañones de mayor calibre. Los otros tipos de barcos son más importantes tácticamente y más fáciles de eliminar por tener menor número de puntos y blindaje que los acorazados.

    Después de seguir estas prioridades el siguiente punto en la selección de objetivos es coordinarse con los aliados para disparar todos a mismo barco para eliminarlo los más rápido posible, esto quita cañones al enemigo y tener mayor número de barcos que el enemigo otorga ventaja en el potencial daño causado por minuto lo que ayuda a aumentar aún más la ventaja. De este modo es recomendable utilizar las comunicaciones para señalar el objetivo prioritario al resto de aliados.

    Las excepciones a la regla general de selección de objetivos son las oportunidades puntuales, como un crucero o acorazado expuesto de forma completamente lateral que permite tener grandes posibilidades de hacer impactos en las ciudadelas. O enemigos que están a muy pocos puntos de vida que al rematarlos los elimine del juego, menos cañones enemigos, el fuego aliado se puede concentrar más en disparar al resto, tomar mejores posiciones y un barco enemigo menos es eliminar su radio de pintado de barcos aliados.

    Selección de objetivo

    Selección de objetivo

    Posicionamiento y fuego cruzado

    Los destructores y cruceros tienen buena movilidad por el mapa, durante los 15 minutos de la partida tiene tiempo de cambiar de posición varias veces. Los acorazados por el contrario no tienen tanta movilidad y se basan más en tomar una posición inicial en la que tener un buen ángulo de disparo según las islas del mapa para buscar coberturas, los puntos calientes como las zonas de captura donde normalmente se dirigen los barcos y la experiencia de partidas anteriores sabiendo que posiciones son las utilizadas por los enemigos.

    Al usar un acorazado e incluso los cruceros no hace falta estar navegando a máxima velocidad en todo momento, solo al principio para tomar una posición. Los acorazados se basan más en tomar una buena posición, moverse para angularse bien a los enemigos y estar cubierto con las islas de proyectiles y torpedos. Si ya no hay ningún enemigo a distancia de disparo entonces sí, han de moverse para buscar una nueva posición.

    En el posicionamiento hay que coordinarse en cierta medida con los aliados, principalmente no estar todos apelotonados en un único cuadrante lo que facilita la selección de objetivos y posicionamiento al enemigo. En ocasiones conviene tener cierta separación con los aliados para tratar de encontrar situaciones de fuego cruzado, aquellas en las que el enemigo recibe salvas desde puntos diferentes lo que les obliga a tener expuesto a unos u otros el lateral del barco o les requiere emplear tiempo en el giro de torretas para apuntar a unos u a otros.

    El juego en las batallas normales suele desplegar a los aliados y a los enemigos tanto en el modo dominación como en captura la base en tres bandos. El bando del medio suele dividirse o desplazarse hacia uno de los lados, ya que dirigirse al centro del mapa es precisamente quedar bajo una posición de fuego cruzado. El objetivo según el sitio en que se aparezca es ganar ese lado al bando contrario que en el modo dominación suele ser capturar la base de ese lado.

    Ganar el lado de la batalla según despliegue Ganar el lado de la batalla según despliegue

    Ganar el lado de la batalla según despliegue

    Errores comunes

    Hay varios errores comunes que no pocos jugadores suelen cometer y que hay que conocerlos para no cometerlos uno mismo. Cometer estos errores significa en ocasiones la diferencia entre la victoria o la derrota, y ver que un jugador los está cometiendo no sienta bien a uno mismo y supongo al resto de compañeros del equipo, más en las batallas clasificatorias o ranked. En arenas bajas quizá está justificado ya que algunos serán jugadores inexpertos que aún no conocen todas las estrategias básicas, no está justificado en una arena alta del juego en la que ya hay que haber jugado bastante para llegar a ella.

    Un error básico es iniciar una batalla y luego no jugar o tardar mucho en empezar a moverse. En WoW Legends las batallas son de 9 jugadores por equipo, con un jugador menos se nota la diferencia, más si el jugador ausente es un destructor y es el único destructor aliado. El juego no lo penaliza y las batallas requieren un tiempo de preparación pero para la buena salud del juego es conveniente entrar en una batalla solo cuando se esté preparado.

    Por repetirlo este es un juego de equipo, un jugador por muy bueno que sea en ningún caso puede enfrentarse solo a varios rivales. Entrar en combate contra varios rivales sin apoyo o en inferioridad, en una situación de inferioridad lo habitual es perder el enfrentamiento.

    Pensar que cualquier destructor, crucero o acorazado se enfrenta en igualdad de condiciones a cualquier otro destructor, crucero o acorazado. Cada barco tiene sus propias características en múltiples variables como calibre y tiempos de recarga de cañones, puntos de vida, blindaje, torpedos, distancia de combate óptima u ocultamiento por mencionar nas pocas. Un destructor cañonero es capaz de destruir a un destructor torpedero en un enfrentamiento directo, con lo que la estrategia del destructor torpedero es evitar los enfrentamientos directos sin apoyo. La misma situación ocurre en los cruceros y acorazados.

    En los destructores un error muy habitual es ver uno que se pasa toda la partida intentando torpedear un acorazado en vez de realizar los objetivos más importantes del juego para los destructores, capturar bases, detectar y destruir otros destructores. Quizá ese destructor tenga una la batalla un rendimiento demás de 100K de daño causado y sin embargo resultar que la batalla se pierde. Una acorazado consciente de que un destructor le está intentando torpedear también tiene estrategias para defenderse. El daño de los destructores una vez cumplidos sus objetivos de capturar bases y la batalla balanceada a favor empiezan a hacer daño hacia la mitad y final de la partida.

    Los acorazados son lentos y tienen un tiempo de recarga de sus baterías principales de casi medio minuto. Aún así intentar cargar con un destructor o un crucero a un acorazado para intentar torpedarle es un error que en la mayoría de ocasiones se tiene las de perder en el enfrentamiento. Los acorazados tienen buen armamento secundario y una salva de un acorazado a una distancia corta para la mayoría de los destructores es la destrucción aún con la vida completa, los cruceros son también fáciles para la mayoría de acorazados.

    En el fragor de los combates a veces uno pierde la noción de que está pasando en el resto del mapa, se tiene visión de túnel. Salvo en los enfrentamiento directos la mayor parte del juego es estar observando el minimapa, las posiciones de los enemigos o sus últimas posiciones conocidas y la situación de los aliados. Cada cierto tiempo aprovechando entre recarga y recarga conviene observar el minimapa para conocer la situación táctica de la batalla. Ayuda a saber si está en ventaja, se puede cargar, si se está en desventaja y conviene retroceder, mantener la posición o moverse para ayudar en otra parte del mapa.

    Supervivencia

    La supervivencia en una partida de los destructores y cruceros es fundamental para acabar las partidas en las posiciones altas de la tabla y para ayudar a los acorazados como apoyo dándoles visión. Los destructores aúnque tiene un buen ocultamiento una vez descubiertos son el objetivo prioritario para defenderse la forma que tiene de defenderse es salir del rango de visión, protegerse detrás de una isla si le da tiempo o más habitualmente utilizar una pantalla de humo para despintarse y reiniciar el enfrentamiento sin estar avistado.

    La estrategia de los cruceros para sobrevivir las partidas o durante más tiempo es no exponerse a los acorazados detrás de una isla y con la habilidad ingenio que indica cuantos enemigos nos tienen como objetivo realizar maniobras de evasión. El mayor peligro de los cruceros son los acorazados y su punto débil las ciudadelas si exponen el lateral completo. Un crucero para enfrentarse a un acorazado la estrategia que ha de utilizar es ponerse en dirección de fuga, entre los límites de alcance de disparo y visibilidad sin disparar. En un enfrentamiento a un acorazado cambiar de rumbo y velocidad en sus momentos de disparo da una oportunidad de sobrevivir o hacer más daño al acorazado que el acorazado a él.

    Los acorazados han de ser conscientes de la ubicación de los destructores para no ser sorprendido para una salva de torpedos que le resulte imposible de esquivar y volver a puerto. En caso de enfrentarse a un destructor utilizar las tácticas para defenderse de los torpedos.

    Características del rival

    Los mejores jugadores, con mayor conocimiento y mayor experiencia además de las reglas básicas tácticas teóricas anteriores, además tienen en cuenta que barco tienen y los aliados, por que barcos está formado en equipo rival o contra qué barco se están enfrentando en un combate uno a uno.

    Saber si un acorazado tiene unos cañones de un calibre suficiente como para hacerle overmatch, hacer daño ignorando las reglas de rebotes según el ángulo de impacto, si el destructor enemigo es más cañonero o torpedero que el propio para conocer quien tiene la ventaja a cañones en un combate directo, saber si un crucero tiene radar o está equipado con torpedos que los hacer peligros a cortas distancias son factores a conocer que ayudan a la supervivencia.

    También, conocer la distribución de los puntos de blindaje y posición de las ciudadelas, o saber si el barco está especializado en causar incendios con facilidad, también denominados como HE spammers, a barcos vulnerables a ellos.

    Blindaje de un acorazado

    Blindaje de un acorazado

    Barcos de las diferentes naciones

    Los niveles de las arenas de los barcos con los que se juega normalmente son los de la 5, 6 y 7. Son los de la 5 son los más rentables en cuanto a recompensa de moneda para comprar más barcos y los de la 7 son los de la arena más alta.

    Obtener los barcos requiere avanzar en las ramas de investigación e ir adquiriendo los barcos poco a poco. Suele ser más recomendable desarrollar varias naciones al mismo tiempo que desarrollar una única nación exclusivamente hasta el nivel superior. Desarrollar varias naciones al mismo tiempo permite conocer sus virtudes y defectos para enfrentarse a ellos en un combate directo o cuando están en el equipo rival.

    Algunas naciones tienen ciertas características comunes a su rama de barcos:

    • Alemana: son barcos polivalentes, sus destructores son un intermedio entre cañoneros y torpederos, los cruceros tiene poco blindaje pero tiene torpedos y un sonar con un alcance superior a la media. Los acorazados no tienen los cañones de mayor calibre ni el mayor blindaje pero tienen muchos puntos de vida y destacan por sus armas secundarias lo que los hace más efectivos cortas distancias, están más destinados contra cruceros que contra acorazados.
    • Americana: los destructores americanos son más cañoneros que torpederos, los cruceros no tiene torpedos pero tiene una parábola que les permite disparar a barcos aún estando detrás de islas. Los acorazados tienen un buen blindaje y cañones de buen calibre efectivos contra cruceros y acorazados.
    • Japonesa: los destructores tiene dos ramas una más torpederos y otra más cañoneros, sus torpedos destacan por hacer mayor número puntos de daño, más lanzaderas, menor tiempo de recarga de torpedos y tener mejor ocultamiento que otras naciones. En sus acorazados destaca el Yamato que tiene los cañones de mayor calibre del juego capaz de hacer overmatch y ciudadelas a otros acorazados aún no teniendo el lateral expuesto.
    • Británica: los destructores británicos son más cañoneros siendo capaces de disparar los torpedos en salvas o de uno en uno en vez de solo en salvas como otros destructores. Sus cruceros solo tienen munición AP pero aún así es efectiva contra los destructores. Sus acorazados son lentos y poco maniobrables, su munición HE tiene una probabilidad muy alta de causar incendios e incluso de hacer ciudadelas, son capaces de hundir destructores de una sola salva a distancias cortas y una alta capacidad de reparación del daño causado por los incendios.

    Uso de recursos

    Al final de cada batalla, con las misiones semanales o de varias semanas se obtienen diversos recursos con los que comprar nuevos barcos y subir el nivel de los capitanes. Los recursos más valiosos por ser más difíciles de conseguir o requieren más tiempo para conseguirlos son las insignias y las recomendaciones.

    Los capitanes permiten subir de nivel con experiencia de capitán, órdenes de promoción, en los niveles superiores se requieren insignias y en nivel legendario requieren recomendaciones. Al decidir en qué capitán gastar esos valiosos recursos es recomendable no hacerlo hasta conocer cuales tiene las mejores habilidades e inspiraciones para otros capitanes. Algunos capitanes son comúnmente utilizados como inspiración en muchos otros capitanes, los más utilizados son los que tendrá mayor preferencia para gastar los recursos. Por ejemplo, el ocultamiento para reducir el radio de visibilidad es una habilidad muy útil para los destructores por lo que el capitán alemán Erich Bay es un buen capitán a utilizar como inspiración en otros capitanes de cualesquiera otras naciones. Otros capitanes también tienen habilidades base útiles para los cruceros y acorazados con lo que también son comunes utilizarlos como inspiración en muchos otros capitanes.

    Subir un capitan al nivel 7 no cuestan muchas órdenes de promoción y permite al capitán adquirir la primera inspiración, la segunda inspiración se permite en el nivel 11 de capitán sin tampoco costar muchas órdenes de promoción, subir un capitán a partir hasta el nivel 12 cuesta una cantidad significativa de órdenes de promoción, del nivel 14 hasta el 16 cuestan insignias que son mucho más difíciles de conseguir. Otra forma de mejorar los capitanes es el nivel legendario con recomendaciones personales que también son muy difíciles de conseguir.

    Capitán destructor Capitán crucero Capitán acorazado

    Capitanes adecuados para cada tipo de barco según su habilidad base

    Canales de YouTube sobre el juego

    Algunos de estos canales son del juego en PC pero dado que en gran parte las mecánicas son las mismas se aplican las mismas reglas de estrategia. Algunos youtubers comparten vídeos de las partidas que juegan a las que les añaden comentarios con lecciones sobre estrategia, toma de decisiones y errores cometidos.

    Toxicidad

    En la versión de consola dado la limitada forma de comunicación la toxicidad no es elevada, salvo por el chat de voz que algún iluminado que no tiene nada mejor que hacer que culpar con tono de enfadado y reproche a otro de la derrota o de que ha resultado hundido por no darle ayuda, en la versión para PC además dado que tiene un chat de texto puede darse en alguna ocasión alguna situación desagradable. Siguiendo estas reglas tácticas de juego que hacen del juego lo entretenido que es, y coordinandose con el resto de aliados no debería ser uno el que reciba estos mensajes tóxicos.

    Es un juego competitivo, hay jugadores muy buenos, quizá con mayores niveles de comandantes o que tienen mejores elecciones de comandantes, aunque es complicado no hay que frustrarse, analizar si en la partida hemos cometido un error e intentar mejorar para las siguientes. Incluso los mejores jugadores y youtubers pierden y su ratio de victorias aunque quizá algo superior a la media también sufren derrotas habitualmente, ya que por muy bueno que sea uno como este juego es un juego de equipo si el equipo no sigue las reglas tácticas básicas es muy difícil que individualmente uno consiga la victoria. Y supongo que en los emparejamientos el juego implementa algún algoritmo para balancear las partidas.

    Proporción de victorias Proporción de victorias

    Proporción de victorias

    Diferencias con la versión de PC

    Portaaviones

    Los portaaviones existen ya en la versión para PC y está previsto que se añadan al juego para consola lo que cambiará la estrategia en el juego significativamente. Los aviones de los portaaviones hacen que los destructores sean más fácilmente detectables y los barcos hayan de maniobrar más para evitar los ataques de los aviones bombarderos o torpederos.

    Submarinos

    Otra pieza de las batallas navales son los submarinos. En la versión de PC se están probando y buscando formas de añadirlos de modo que no desequilibran el juego y sean divertidos de jugarlos. Este nuevo tipo de barcos es otra forma distinta de juego que también cambia las estrategias básicas.

    » Leer más, comentarios, etc...

    Picando Código

    Día Global de Llamado a Propuestas por la Diversidad en las conferencias

    enero 08, 2021 02:41

    El sábado 23 de enero de 2021 se realiza el Día Global de Llamado a Propuestas por la Diversidad. El objetivo del evento es alentar y ayudar a personas que quieran iniciarse dando presentaciones en conferencias. Mediante talleres, ayuda a personas de grupos subrepresentados o marginados a crear sus propuestas.

    ¿Integras un grupo subrepresentado o marginado?
    ¿Siempre has querido convertirte en orador/a de conferencias técnicas?
    ¡Que 2021 sea el año que conviertas tu sueño en realidad!
    Regístrate para un taller en tu región el Sábado, 23 de enero de 2021.

    Esta va a ser la cuarta edición anual y obviamente se va a realizar en línea. La entrada es libre y gratuita, el único requisito es adherir al Código de Conducta. Va a haber una edición en español liderada por Elizabeth Portilla.

    La información:

    Sábado, 23 de enero de 2021

    El sábado 23 de enero de 2021 vamos a tener la cuarta edición del día global de llamado a propuestas por la diversidad – ¡esta vez en línea!

    Va a haber 6 transmisiones alrededor del mundo alentando y asesorando a principiantes en presentaciones a armar tu primera propuesta de presentación y compartir tu perspectiva individual sobre cualquier tema de interés para personas en la industria de la tecnología.

    Cada transmisión tendrá oradores expertos y expertas con experiencia compartiendo su experiencia de:

    • armar una propuesta para presentación
    • crear esa biografía tan importante
    • planear y estructurar tu presentación
    • dar tu presentación
    • ¡y un montón de consejos y sugerencias!

    Temas

    Éstas sesiones no tienen lenguaje, framework o proceso específico como foco. Aunque tu presentación no esté relacionada a la tecnología ¡queremos darte soporte también! En resumen, si hay algo que quieras gritar al mundo estamos aquí para ayudarte a llegar hasta ahí, independientemente de los límites de la tecnología o comunidades.

    Visita el sitio de Global Diversity CFP Day en español

     

    The post Día Global de Llamado a Propuestas por la Diversidad en las conferencias first appeared on Picando Código.

    » Leer más, comentarios, etc...

    Blog Bitix

    Analítica web en el servidor sin JavaScript en el cliente con GoAccess

    enero 07, 2021 09:30

    Google Analytics es la herramienta más utilizada para implementar la funcionalidad de analítica en un sitio web. Es fácil de usar, de implementar, no requiere mantenimiento de infraestructura propia, es gratuita, ofrece numerosas funcionalidades que ayudan enormemente a obtener información del sitio web, de los usuarios, obtener informes. Sin embargo, Google Analytics es una tercera parte con la que se comparte la información del sitio web que supone una pérdida de privacidad y protección de datos del sitio web y requiere instalar un script de JavaScript que ralentiza la carga de las páginas web. GoAccess ofrece analítica web en tiempo real que al contrario que Analytics obtiene los datos únicamente desde el lado del servidor basándose en los archivos del log del servidor web, es software libre y es utilizable sin necesidad de involucrar a terceras partes.

    GoAccess

    La analítica web es una funcionalidad imprescindible en la mayoría de sitios públicos accesibles desde internet web incluso en aquellos privados. La analítica web es una funcionalidad que proporciona valiosa información acerca del sitio web, desde número de visitas en determinados periodos de tiempo así como información de los usuarios y la interacción de estos con el sitio web.

    La información proporcionada por la analítica web ayuda a la toma de decisiones basadas en datos observando el comportamiento de los usuarios en el sitio web con métricas que permiten conocer cuales son las páginas más visitas, en cuales permanecen más tiempo, que versión de navegador web usan, cuales son los países de los usuarios, cuál es el tráfico por hora del día, las fuentes del tráfico, sitios web de referencia, tráfico según días de la semana, ciertas fechas señaladas, periodos de vacaciones u cualesquiera otras formas de conocimiento interesantes para el negocio.

    Contenido del artículo

    Google Analytics, la herramienta más utilizada para hace analítica web

    La herramienta más utilizada para hacer analítica web es Google Analytics, es gratuita, fácil de instalar en un sitio web y tiene gran cantidad de funcionalidades básicas y avanzadas que cubren las necesidades de cualesquiera usuarios. Almacena la información recogida a lo largo del tiempo que es consultable con posterioridad incluso pasados varios años de forma muy flexible con diferentes criterios de búsqueda y filtros, también ofrece varios paneles para observar el tráfico en tiempo real.

    Goolge Analytics

    Goolge Analytics

    Basta con tener una cuenta de Google para tener acceso a Google Analytics. Para integrarlo en un sitio web únicamente requiere insertar el script de JavaScript proporcionado por Google Analytics al configurar el sitio web en todas las páginas del sitio web. Este script se ejecuta en el navegador del usuario, recopila información y la envía a Google para su procesamiento y generación de la analítica web.

    1
    2
    3
    4
    5
    6
    7
    8
    
    <!-- Google Analytics -->
    <script>
    window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
    ga('create', 'UA-XXXXX-Y', 'auto');
    ga('send', 'pageview');
    </script>
    <script async src='https://www.google-analytics.com/analytics.js'></script>
    <!-- End Google Analytics -->
    
    google-analytics-script.html

    El principal inconveniente de Google Analytics es introducir una tercera parte en la relación entre el sitio web y el usuario, una tercera parte que recoge métricas del sitio web e información de los usuarios. Los sitios web han de tener en cuenta que han de cumplir con las regulaciones y leyes como la GDPR en Europa en el tratamiento de la información de los usuarios para para proteger la privacidad de los usuarios que algunas empresas ponen en riesgo si no fuera por esas leyes que impiden o ponen límites a la recopilación de datos bajo penas de importantes multas, utilizar cookies de seguimiento que permiten identificar a los usuarios de forma inequívoca o el tratamiento de información personal. Leyes que afectan también a la propia Google junto a otras empresas como Amazon, Facebook o Twitter de EEUU con unas regulaciones más permisivas, las leyes les afecta por ejemplo impidiendo transferir los datos de los usuarios europeos fuera de Europa.

    La privacidad del los usuarios ya es un buen motivo para utilizar una alternativa a Google Analytics. Otro motivo es que el script de Google Analytics se ejecuta en el navegador del usuario y afecta en una pequeña medida al rendimiento en la carga de la página web.

    Otros sitios web privados de una intranet u aquellos que tienen interés en proteger la privacidad de sus usuarios prefieren utilizar otras herramientas para realizar analítica del sitio web que no involucren terceras partes.

    GoAccess, una alternativa de analítica

    GoAccess es una pequeña utilidad que cubre una pequeña parte de la funcionalidad de analítica de un sitio web, en concreto ofrece la analítica en tiempo real de uno o múltiples sitios web, Matomo es una alternativa equivalente a Google Analytics que ofrece las funcionalidades de tracking de eventos y tag manager. Sus características principales son que es una herramienta sencilla y pequeña, no requiere insertar ningún script en las páginas del sitio web, no involucra terceras partes y es software libre.

    Para realizar la analítica web no requiere insertar ningún script de JavaScript en el cliente lo que mejora el tiempo de carga de las páginas. La analítica la hace completamente en el lado del servidor analizando los archivos de log de acceso y errores del servidor web. Soporta los servidores web más utilizados como Nginx y Apache HTTPD.

    GoAccess permite obtener información de analítica en tiempo real del número de usuarios, que navegadores utilizan, URLs solicitadas, distribución de las peticiones en el tiempo, navegadores y sistemas operativos de los usuarios, sitios y URLs de referencia, palabras clave de búsqueda, códigos de estado HTTP, geolocalización, … Ofrece dos interfaces distintas, una basada en una interfaz de terminal y otra basada en una interfaz web.

    Analítica de sitio web con GoAccess en un servidor web Nginx

    En el ejemplo de uso de GoAccess para realizar analítica web de un servidor web y acceder a las dos interfaces que ofrece utilizo la herramienta Docker que evita tener que instalar estas herramientas de forma directa en la computadora, hace fácil su instalación, prueba, uso y eliminación de la computadora local una vez evaluada la herramienta. En el ejemplo el servidor web que he utilizado ha sido Nginx para Apache HTTPD se sigue el mismo principio de proporcionar a GoAccess los archivos de log de acceso al servidor web.

    Para realizar el ejemplo son de utilidad los siguientes otros artículos en los que me he apoyado para crear este.

    Lo primero es crear una imagen de Docker con GoAccess, la imagen oficial de Docker para GoAccess es allinurl/goaccess, sin embargo esta no me ha funcionado y he tenido que crear una propia basada en Ubuntu. El archivo Dockerfile para crear la imagen de Docker con GoAccess y el comando para construirla son los siguientes.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    FROM ubuntu:20.04
    MAINTAINER picodotdev <pico.dev@gmail.com>
    
    RUN apt-get -y update && apt-get -y install goaccess
    
    VOLUME /var/www/goaccess
    EXPOSE 7890
    
    CMD ["/bin/goaccess"]
    
    Dockerfile
    1
    2
    
    #!/usr/bin/env bash
    docker build -t "picodotdev/goaccess:1.0" docker/
    
    docker-build.sh

    Una vez construida la imagen de GoAccess se almacena en el repositorio local de imágenes.

    1
    2
    
    $ docker images
    
    
    docker-images.sh
    1
    2
    3
    4
    5
    
    REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
    picodotdev/goaccess   1.0       677276d5bc0d   37 minutes ago   102MB
    allinurl/goaccess     latest    e48d0ac2f6d1   11 hours ago     14.3MB
    nginx                 latest    ae2feff98a0c   3 weeks ago      133MB
    ubuntu                20.04     f643c72bc252   6 weeks ago      72.9MB
    docker-images.out

    Nginx también tiene su propia imagen de Docker, en este caso utilizo la imagen oficial del servidor web. Se requiere iniciar dos contenedores de Docker, uno para el servidor web Nginx con varios volúmenes de datos configurados enlazados con los directorios de la máquina anfitrión para proporcionarle los archivos de configuración para los servidores web virtuales de un sitio web a analizar, el servidor virtual de la interfaz web de GoAccess y para compartir con GoAccess los archivos de log dal servidor web. El segundo contenedor es el de GoAccess utilizando la imagen propia también con varios volúmenes de datos configurados, entre ellos el del directorio con los archivos de log de acceso del servidor web.

    La configuración de Nginx incluye servidores web virtuales y configuración de proxy con WebSockets para ofrecer las métricas en tiempo real desde la interfaz web.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    
    log_format nginx_vcombined '$host:$server_port ' '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"';
    
    server {
        listen 80;
        server_name www.127.0.0.1.xip.io;
    
        access_log /var/log/nginx/nginx-access.log nginx_vcombined;
        error_log /var/log/nginx/nginx-error.log;
    
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }
    }
    
    www.127.0.0.1.xip.io.conf
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    log_format goaccess_vcombined '$host:$server_port ' '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"';
    
    server {
        listen 80;
        server_name goaccess.127.0.0.1.xip.io;
    
        access_log /var/log/nginx/goaccess-access.log goaccess_vcombined;
        error_log /var/log/nginx/goaccess-error.log;
    
        location /report.html {
            root   /usr/share/goaccess/html;
        }
    
        location / {
    	proxy_pass http://goaccess:7890;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
    	proxy_set_header Host $host;
    	proxy_set_header X-Real-IP $remote_addr;
    	proxy_set_header X-Forwarded-Proto https;
        }
    }
    
    
    goaccess.127.0.0.1.xip.io.conf

    En el archivo de configuración de GoAccess o en la configuración desde la linea de comandos se especifican varias propiedades de configuración.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    port 7890
    ws-url goaccess.127.0.0.1.xip.io:80
    
    log-format VCOMBINED
    log-file /var/log/nginx/nginx-access.log
    log-file /var/log/nginx/goaccess-access.log
    
    output /usr/share/goaccess/html/report.html
    real-time-html true
    
    
    goaccess.conf

    Ambos contenedores están definidos en un archivo de Docker Compose.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    version: "3.9"
    services:
      goaccess:
        image: picodotdev/goaccess
        ports:
          - "7890"
        volumes:
          - ${PWD}/goaccess.conf:/etc/goaccess/goaccess.conf
          - ${PWD}/nginx/log:/var/log/nginx:ro
          - ${PWD}/nginx/goaccess:/usr/share/goaccess/html
        command: ["--no-global-config", "--config-file=/etc/goaccess/goaccess.conf"]
      nginx:
        image: nginx
        ports:
          - "80:80"
        volumes:
          - ${PWD}/www.127.0.0.1.xip.io.conf:/etc/nginx/conf.d/www.127.0.0.1.xip.io.conf:ro
          - ${PWD}/goaccess.127.0.0.1.xip.io.conf:/etc/nginx/conf.d/goaccess.127.0.0.1.xip.io.conf:ro
          - ${PWD}/nginx/log:/var/log/nginx
          - ${PWD}/nginx/goaccess:/usr/share/goaccess/html:ro
        depends_on:
          - goaccess
    
    docker-compose.yml
    1
    2
    
    $ docker-compose up
    
    
    docker-compose-up.sh

    GoAccess se puede iniciar individualmente para acceder a su interfaz basada en la terminal.

    1
    2
    3
    
    $ docker run -it --rm \
        -v "${PWD}/nginx/log:/var/log/nginx" \
        picodotdev/goaccess:1.0 goaccess --no-global-config --log-format=VCOMBINED /var/log/nginx/nginx-access.log /var/log/nginx/goaccess-access.log
    
    goaccess-run.sh

    Una vez los contenedores están en ejecución es posible acceder a las interfaces que ofrece GoAccess y observar las métricas que ofrece del acceso a los sitios web.

    1
    2
    
    $ docker ps
    
    
    docker-ps.sh

    Interfaz de terminal

    La interfaz de terminal o consola no requiere herramientas adicionales, desde la propia terminal es posible acceder a la información de analítica. Hay que ejecutar el comando de GoAccess, al usar Docker desde dentro de su contenedor.

    1
    2
    3
    
    $ docker run -it --rm \
        -v "${PWD}/nginx/log:/var/log/nginx" \
        picodotdev/goaccess:1.0 goaccess --no-global-config --log-format=VCOMBINED /var/log/nginx/nginx-access.log /var/log/nginx/goaccess-access.log
    
    goaccess-run.sh

    Es posible navegar entre los diferentes paneles de analítica pulsando varias teclas, la tecla de navegación están documentadas en una ventana de ayuda a la que se accede con la tecla ?, en la ayuda están indicadas el reto de teclas de navegación en la interfaz.

    Interfaz consola de analítica GoAccess

    Interfaz consola de analítica GoAccess

    Interfaz de navegador web

    La interfaz de terminal no es la más cómoda de usar ni más accesible de forma remota, por ello GoAccess también proporciona una interfaz web accesible con un navegador web.

    Para ello genera un archivo html de informe con los datos que se ha de servir desde un servidor web y ofrece un servidor con WebSockets para las métricas en tiempo real. En el ejemplo su dirección de acceso con el navegador http://goaccess.127.0.0.1.xip.io/report.html, la interfaz se actualiza con analítica de acceso del servidor web Nginx del sitio web http://www.127.0.0.1.xip.io/.

    Sitio web con Nginx Interfaz web de analítica GoAccess Interfaz web de analítica GoAccess

    Sitio web e interfaz web de analítica GoAccess
    Terminal

    El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando siguiente comando:
    ./docker-compose up

    » Leer más, comentarios, etc...

    Header Files

    ¡Feliz año!

    enero 05, 2021 10:45

    A todos los lectores de HeaderFiles un feliz año nuevo, lleno de salud, bendiciones y buenos momentos.

    He adelantado unas horas el regalo de Reyes, ya que como podréis ver el blog cuenta con un look&feel diferente: he migrado el sitio a GitHub Pages con lo que disfrutaréis de mejores tiempos de carga, y yo aprovecharé para trastear con Jekyll, además de ahorrarme un tanto de euros al año… Porque ya sabéis lo que dicen, año nuevo, hosting nuevo 😉.

    » Leer más, comentarios, etc...

    Metodologías ágiles. De lo racional a la inspiración.

    Marco Scrum

    enero 04, 2021 12:35

    Marco de Scrum Curso de Scrum: Contactanos si estás interesado. ¡Aquí puedes ver el último video sobre Scrum en 9 minutos que hemos publicado!

    » Leer más, comentarios, etc...

    Metodologías ágiles. De lo racional a la inspiración.

    Agile Fluency Model en castellano

    enero 04, 2021 12:34

    He publicado el modelo de fluidez ágil en castellano. Este modelo desarrollado por James Shore y Diana Larsen proporciona una interesante perspectiva sobre el camino al agilismo por los equipos. Modelo de fluidez ágil.

    » Leer más, comentarios, etc...

    Metodologías ágiles. De lo racional a la inspiración.

    Scrum master a tiempo completo: 42 Tareas

    enero 04, 2021 12:32

    Uno de los artículos que más referencio en mi curso de Scrum cuando hablo de las labores del Scrum Master es: 42-tasks-for-a-scrum-masters-job. Por alguna razón, todo el mundo parece entender que el Product Owner es un trabajo a tiempo completo, o ser miembro de un equipo también, pero que probablemente el rol del Scrum Master puede ser realizado a media jornada o incluso menos. El scrum master

    » Leer más, comentarios, etc...

    info.xailer.com

    Nuevo Browser en Xailer 7

    enero 03, 2021 12:36

    Xailer 7 incorpora un nuevo control tipo Browser, diseñado desde cero, en el que se han incorporado casi todas las funcionalidades del antiguo Browser, se han añadido nuevas y se ha incorporado el diseño moderno de Windows 10.

    Estas son algunas de las importantes características que incorpora en el nuevo Browser:

    • Editores de celdas especializados para cada tipo de datos
    • Ordenación automática sobre cualquier columna
    • Filtrado automático por una o varias columnas
    • Cabeceras de columnas: Es posible introducir una cabecera que abarque a varias columnas
    • Agrupaciones por todas las columnas que se requiera, pudiendo mostrar en la cabecera o pie de cada agrupación cualquier datos de acumulación, máximos, mínimos, medias o contadores de cualquiera de las columnas de una forma tremendamente sencilla
    • Potente gestión de eventos que permite adaptar la visualización de las columnas completamente a sus necesidades
    • Fondo transparente. Lo cual le permite poner una imagen como fondo del control
    • Modificación del alto de la fila por el propio usuario
    • Barras de desplazamiento (Scroll) escamoteables al estilo de Windows 10

    El nuevo Browser utiliza de forma más ortodoxa las barras de desplazamiento, tanto la vertical como la horizontal, a diferencia del clásico Browse.

    A diferencia del Browser clásico, este nuevo control no tiene una versión específica para ser usada con tablas DBF. En dichos casos, deberá traspasar los datos de la tabla, bien a una matriz o un dataset en memoria (TMemDataset) y lógicamente, en ambos casos, será responsabilidad del programador la actualización de los datos del Browser con la tabla DBF subyacente.

    Se ha realizado un gran esfuerzo con este nuevo Browse y esperamos que sea de vuestro agrado. Os animamos a que empecéis a usarlo en vuestros nuevos proyectos.

    Un saludo

    » Leer más, comentarios, etc...

    Header Files

    Bloqueando señales en Qt

    diciembre 29, 2020 11:52

    En entradas anteriores hemos visto cómo realizar una conexión entre una señal y un slot en Qt (1 y 2). Ahora bien, hay casos en los que no deseamos que el slot sea llamado al emitirse la señal, como por ejemplo si debemos actualizar programáticamente una propiedad de un widget en base a un cambio en el estado de nuestro modelo, pero hacerlo haría que el modelo volviese a cambiar ya que el widget ha emitido una señal de cambio. Para ello algunos widgets proveen dos señales diferentes para estos casos, una que se emite siempre que se cambia el valor (ya sea mediante acción directa del usuario con el widget, o bien programáticamente), y otra señal que se emite sólo cuando el cambio se genera desde el interfaz de usuario. En este caso, es fácil hacer la separación.

    Desafortunadamente, no todos los controles nos dan las mismas facilidades. Por ejemplo, los sliders sólo proporcionan la señal valueChanged, que se genera tanto al cambiar el valor del slider programáticamente como al hacerlo por interfaz de usuario. En estos casos, es fácil caer en una cascada recursiva de llamadas, en una serie de acciones duplicadas (con el respectivo impacto en el rendimiento) o, para evitar esto último, en un diseño poco elegante y legible, en el que dar un valor al slider implica implícitamente ejecutar una serie de acciones (en el slot). Esto último puede ser peligroso si la conexión ejecuta el slot de forma asíncrona, lo que lleva a un código más oscuro y críptico, con truquillos (chapuzas) tales como actualizar manualmente el bucle de eventos con el fin de que dicho slot se ejecute.

    Pues bien, una forma de evitar esto es desconectando temporalmente al widget para que dicha señal no ejecute ningún slot. Desafortunadamente esto no siempre es sencillo por varias razones: hay que volver a conectar las señales (que pueden ser varias, y con varios slots cada una), puede que haya señales que sólo se conectan bajo determinadas circunstancias (por lo que tendríamos que duplicar la lógica de conexión, y extraerla a una función, de nuevo, no siempre es posible), o tendríamos que guardar las conexiones y estar activándolas y desactivándolas cada vez.

    Todo esto suena muy complicado para algo tan simple. ¿Y si hubiera una forma de hacer el cambio de estado sin que se emitiese ninguna señal, y ahorrarnos tanto lío?

    ¡Pues resulta que la hay! Es el método blockSignals que todo QObject tiene. Basta con activar el bloqueo antes de cambiar el estado, y desactivarlo al finalizar:

    ui.slider->blockSignals(true);
    ui.slider->setValue(0);
    ui.slider->blockSignals(false);
    // call here the slot, if necessary
    

    Este método tiene la sencillez y expresividad que buscábamos: es rápido, no necesita que almacenemos listas de conexiones, ni que tengamos que modificar nuestro código en varios sitios si conectamos una nueva señal del widget, ni tener que hacer peripecias con el bucle de eventos, a la vez que deja muy patente lo que estamos haciendo. Por contraparte, esta técnica obviamente tiene la desventaja de que bloquea todas las señales (actualmente no hay forma de bloquear una señal en concreto), pero en el tipo de escenario que hemos comentado no suele ser un problema.

    A partir de Qt 5.3 está disponible la clase QSignalBlocker, que facilita este proceso mediante el uso del RAII, a la vez que garantiza que las señales son restauradas incluso ante una excepción.

    Para el que quiera profundizar un poco más sobre el tema, le recomiendo esta pregunta de Stack Overflow donde explican y discuten estas soluciones.

    » Leer más, comentarios, etc...

    Meta-Info

    ¿Que es?

    Planeta Código es un agregador de weblogs sobre programación y desarrollo en castellano. Si eres lector te permite seguirlos de modo cómodo en esta misma página o mediante el fichero de subscripción.

    rss subscripción

    Puedes utilizar las siguientes imagenes para enlazar PlanetaCodigo:
    planetacodigo

    planetacodigo

    Si tienes un weblog de programación y quieres ser añadido aquí, envíame un email solicitándolo.

    Idea: Juanjo Navarro

    Diseño: Albin