Variable not found

Enlaces interesantes 537

septiembre 25, 2023 06: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

Machine learning / IA / Bots

Web / HTML / CSS / Javascript

Visual Studio / Complementos / Herramientas

.NET MAUI / Xamarin

Otros

Publicado en Variable not found.

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

Juanjo Navarro

Pequeño selector de sesiones para .ssh/config

septiembre 22, 2023 06:29

Un pequeño selector de sesiones para ssh, por si a alguien le pudiese ser útil. Sirve para seleccionar fácilmente la máquina a la que queremos conectarnos de entre las que tenemos configuradas en .ssh/config.

Es una sencilla función para bash, simplemente añadirla a .bashrc:

hosts() {
  local host_list=`grep "Host .*$1.*" $HOME/.ssh/config | awk '{print $2}' | sort `
  clear
  local result=$(DIALOGRC="$HOME/.dialogrc_hosts" dialog --clear --output-fd 1 --no-items --menu "Host" 0 0 0 $host_list)
  clear
  if [[ ! -z $result ]]
  then
    ssh $result
  fi
}

Una vez instalada la función, podemos ejecutar hosts para obtener un diálogo donde elegir el host al que nos queremos conectar:

Diálogo 12

Podemos filtrar el listado de elementos que se nos muestra, por ejemplo ejecutando hosts bbdd:

Diálogo 2

Finalmente, si preferimos que el diálogo se muestre sin colores, crear este fichero .dialogrc_hosts en el directorio del usuario:

# Set aspect-ration.
aspect = 0

# Set separator (for multiple widgets output).
separate_widget = ""

# Set tab-length (for textbox tab-conversion).
tab_len = 0

# Make tab-traversal for checklist, etc., include the list.
visit_items = OFF

# Shadow dialog boxes? This also turns on color.
use_shadow = OFF

# Turn color support ON or OFF
use_colors = ON

# Screen color
screen_color = (BLACK,BLACK,OFF)

# Shadow color
shadow_color = (BLACK,BLACK,OFF)

# Dialog box color
dialog_color = (BLACK,WHITE,OFF)

# Dialog box title color
title_color = (BLACK,WHITE,OFF)

# Dialog box border color
border_color = (BLACK,WHITE,OFF)

# Active button color
button_active_color = (WHITE,BLACK,ON)

# Inactive button color
button_inactive_color = dialog_color

# Active button key color
button_key_active_color = button_active_color

# Inactive button key color
button_key_inactive_color = (BLACK,WHITE,OFF)

# Active button label color
button_label_active_color = (WHITE,BLACK,OFF)

# Inactive button label color
button_label_inactive_color = (BLACK,WHITE,OFF)

# Input box color
inputbox_color = dialog_color

# Input box border color
inputbox_border_color = dialog_color

# Search box color
searchbox_color = dialog_color

# Search box title color
searchbox_title_color = title_color

# Search box border color
searchbox_border_color = border_color

# File position indicator color
position_indicator_color = title_color

# Menu box color
menubox_color = dialog_color

# Menu box border color
menubox_border_color = border_color

# Item color
item_color = dialog_color

# Selected item color
item_selected_color = button_active_color

# Tag color
tag_color = title_color

# Selected tag color
tag_selected_color = button_label_active_color

# Tag key color
tag_key_color = button_key_inactive_color

# Selected tag key color
tag_key_selected_color = (WHITE,BLACK,ON)

# Check box color
check_color = dialog_color

# Selected check box color
check_selected_color = button_active_color

# Up arrow color
uarrow_color = (GREEN,WHITE,ON)

# Down arrow color
darrow_color = uarrow_color

# Item help-text color
itemhelp_color = (WHITE,BLACK,ON)

# Active form text color
form_active_text_color = button_active_color

# Form text color
form_text_color = (WHITE,BLACK,ON)

# Readonly form item color
form_item_readonly_color = (BLACK,WHITE,ON)

# Dialog box gauge color
gauge_color = title_color

# Dialog box border2 color
border2_color = dialog_color

# Input box border2 color
inputbox_border2_color = dialog_color

# Search box border2 color
searchbox_border2_color = dialog_color

# Menu box border2 color
menubox_border2_color = dialog_color

Utiliza la utilidad dialog por lo que es necesario instalarla desde nuestro gestor de paquetes si no está ya instalada.

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

Picando Código

Usar List Category Posts en WordPress para listar sub-páginas

septiembre 18, 2023 09:00

WordPress

WordPress

Hace un tiempo tenía instalado en este blog el plugin de WordPress Subpage Listing. Es un plugin bastante simple que permite listar las sub-páginas de una página. Dada una página superior con páginas anidadas, si poníamos el siguiente comentario en el contenido: <!--%subpages%--> se generaba una lista de las páginas anidadas con enlaces a cada una.

Usaba este plugin en páginas como Acerca De, donde listo la Política de Privacidad, Licencia y más, que son páginas anidadas de "Acerca De". Sin embargo, el plugin ha sido completamente abandonado con la última actualización hace 11 años. Así que en su momento lo desinstalé y me puse a pensar en una alternativa. Las opciones con una funcionalidad tan simple eran las siguientes:

  • Buscar e instalar otro plugin que haga lo mismo
  • Implementar la funcionalidad yo mismo en mi sitio o creando otro plugin
  • Encontrar una solución con otro plugin que escribí hace años 😅

Tan solo tener que pensar en la solución, me cayó la solución obvia de usar mi plugin de WordPress List Category Posts. Este plugin list los posts dada una categoría. Pero seteando el tipo de post, también podemos listar páginas y posts (o páginas) anidados. Así que con el siguiente shortcode, pude reemplazar la funcionalidad del plugin Subpage Listing con un plugin que ya tenía instalado: &lsqbcatlist post_type=page post_parent=ID&rsqb. El valor de post_parent es el ID de la página. Al editar una página lo vemos en el URL. En un blog convencional sin cambios a las URLs por defecto de WordPress, veríamos algo como wp-admin/post.php?post=2&action=edit, donde el 2 sería el ID de la página.

Otra de las funcionalidades de List Category Posts que quería compartir por acá. Seguramente agregue esta información a la wiki, ya que generalmente las consultas que llegan sobre cómo usar el plugin se pueden resolver con más ejemplos. Y nunca está demás agregar información extra a la documentación de tu proyecto software libre 👍

El post Usar List Category Posts en WordPress para listar sub-páginas fue publicado originalmente en Picando Código.

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

Variable not found

Enlaces interesantes 536

septiembre 18, 2023 06:05

Enlaces interesantes

La verdad es que este año me ha dado algo de pereza volver a abrir el blog después de este periodo veraniego de descanso. Aunque disfrute escribiendo y compartiendo información, mantener esto medio vivo requiere esfuerzo y tiempo, que obviamente dejo de dedicar a otras cosas que también me gustan 🙂

Pero bueno, la cuestión es que por aquí andamos de nuevo, listos para inaugurar oficialmente la temporada 2023-2024. ¿Y qué mejor forma de hacerlo que con una nueva recopilación de enlaces interesantes? ¡Pues vamos allá!

Por si te lo perdiste...

.NET Core / .NET

ASP.NET Core / ASP.NET / Blazor

Azure / Cloud

Conceptos / Patrones / Buenas prácticas

Data

Machine learning / IA / Bots

Web / HTML / CSS / Javascript

Visual Studio / Complementos / Herramientas

.NET MAUI / Xamarin

Publicado en Variable not found.

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

Picando Código

Wing it! Nueva película animada de Blender Studio

septiembre 14, 2023 10:00

Wing It! es el 15° proyecto de la iniciativa Open Movies de Blender, estrenada el pasado 12 de setiembre de 2023. La meta de estos proyectos es mejorar las posibilidades de Blender, el software libre de gráficos 3D, producción de video y más. Blender Studio es su plataforma de publicación de todo lo producido por el equipo en cuanto a películas y capacitación. Usan Blender rigurosamente y trabajan en conjunto con el equipo de desarrolladores de Blender, ayudando a planear, diseñar y testear características nuevas del software.

En este proyecto se concentraron específicamente en desafiar los límites de producción de animación 2D/3D, explorando el rendering no foto realístico y flujos de trabajo estilizados. Los resultados son muy buenos. En el sitio web de Blender Studio, así como en YouTube, comparten videos a lo largo de la producción. Son muy interesantes, está muy bueno ver el "detrás de cámaras", ver cómo se va formando el resultado final de a poco y cómo trabajan con Blender. Con una membresía de Blender Studio podemos acceder tanto a los recursos generados durante la película como entrenamiento. Es una muy buena forma de financiar éstas películas y avanzar el desarrollo de Blender.

La película explora la relación entre un perro y un gato intentando viajar al espacio. Es una divertida historia corta al estilo Tom & Jerry y similares. Se puede apreciar el uso de animación 3D con 2D con un resultado final bien cercano a los dibujos animados más clásicos:

YouTube Video

El post Wing it! Nueva película animada de Blender Studio fue publicado originalmente en Picando Código.

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

Picando Código

¡Feliz día del programador!

septiembre 13, 2023 08:00

¡Feliz día del programador! Hoy 13 de setiembre es el día número 256 (28) del año por ser la cantidad de valores representables en un byte de datos (13/9 en los años comunes y 12/9 años bisiestos). Por esto se festeja el día del programador. En el blog lo festejo haciendo un repaso de cosas relacionadas a la programación. Me saltié un par de años, la última vez que "celebré" el día del programador fue en 2019. Pero vamos con un breve comentario de cosas de programadores…

Día del Programador

En breve voy a cumplir 4 años programando en Elastic. Me uní al equipo de clientes como desarrollador Ruby, donde se desarrollan los clientes oficiales para Elasticsearch y otros productos. Al principio me encargué de mantener el cliente oficial de Elasticsearch en Ruby. Pero he ido sumando más proyectos y tareas, incluyendo bastante trabajo en automatización, scripting y más. En este trabajo he escrito bastante código Ruby, Bash, y he enfrentado varios desafíos técnicos interesantes.

En lo que respecta a mi tiempo libre, ya no soy aquel joven que aprovechaba cualquier rato para aprender cosas de programación y experimentar con tecnologías nuevas. El trabajo es bastante estresante, así que rara vez me veo usando una computadora fuera del horario de trabajo. No saben lo que me cuesta sentarme en la laptop a escribir posts como éste estos días… Estoy aprovechando para leer (libros, cómics y revistas de videojuegos), jugar Nintendo y disfrutar del aire libre.

A pesar de esto, sí pasé un poco de tiempo estudiando algo relacionado a la programación recientemente. Estuve haciendo unos cursos muy básicos de desarrollo de videojuegos con Godot. Godot es un motor de videojuegos libre y multiplataforma desarrollado inicialmente en Argentina. Me resultó extremadamente entretenido e interesante. Ya tengo un cuaderno dedicado exclusivamente a apuntes de Godot e ideas de juegos que quiero desarrollar. Espero entrarle más a esto, aunque sea como hobby. Me fascinan todos los aspectos del desarrollo de un videojuego: el arte, sonido, diseño y programación.

No sé si quiero perfilar mi carrera de programador para el lado de los videojuegos. Es un tema que me ha apasionado mucho desde que tengo uso de razón. Pero la famosa frase "encuentra un trabajo haciendo algo que te guste, y nunca vas a tener que trabajar un día en tu vida" en mi caso con la programación fue "encuentra un trabajo haciendo algo que te guste, y te dejará de gustar". Todo culpa de los malditos capitalistas. No quiero lo mismo con los videojuegos que tanto disfruto…

Ojalá eventualmente tenga que escribir un post promocionando uno de mis proyectitos desarrollados en Godot 😁

Hay un lenguaje de programación que me ha llamado la atención ultimamente, Julia. Julia es un lenguaje de programación dinámico, de alto nivel, con soporte para concurrencia, paralelización y computación distribuida, entre otros. Parece que se usa bastante para análisis numérico, visualizaciones y otras cosas científicas interesantes. En agosto estuvo en el top 20 de lenguajes de programación del índice TIOBE. La popularidad tampoco es algo que importe tanto, pero es bueno saber que hay mercado a la hora de aprender un lenguaje nuevo. A ver si antes del próximo día del programador escribo algún proyecto con Julia.

Otra cosa que espero en algún momento sentarme a escribir al respecto es que recientemente compré una Raspberry Pi 4. La inspiración vino de un post de mi amigo Maxi que viene usando una Raspberry Pi 400 como su computadora personal principal. Espero en breve escribir al respecto.

Espero que disfruten el día del programador, y si tienen ganas de comentar en qué andan o qué cosa nueva han aprendido recientemente, los comentarios están abiertos.

El post ¡Feliz día del programador! fue publicado originalmente en Picando Código.

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

Navegapolis

Origen de scrum más allá de los mitos

septiembre 04, 2023 10:28

Es fácil determinar quién creó el modelo de procesos CMMI o el de escalado de agilidad SAFe —por ejemplo—. La Universidad Carnegie Mellon desarrolló CMMI y Dean Leffingwell es el creador de SAFe. Son sus autores y por lo tanto los propietarios de todos los derechos. Ellos definen cómo es cada modelo y sólo ellos los pueden modificar o decidir si otros pueden hacerlo.

¿Se puede decir lo mismo de scrum? ¿Es un modelo con autoría y propiedad o una corriente emergente, colaborativa y compartida?

Hay quien afirma que los autores de scrum fueron Hirotaka Takeuchi y Ikujiro Nonaka en 1986, al identificar en el artículo “The New New Product Development Game”(1) los principios del modo de trabajo incipiente, al que expontáneamente estaban dando forma los equipos de empresas como 3M, Fuji, Honda o HP .
En los años 80, los ingenieros de muchas empresas, descontentos de los modelos de producción basados en ciclos de cascada, desarrollaban —en ambientes de trabajo flexibles y colaborativos— un patrón iterativo con solapamiento de fases, que Nonaka y Takeuchi identificaron y bautizaron con el término “scrum”, palabra empleada en rugby para definir la formación de los jugadores al disputar la pelota.

Es importante entender que Nonaka y Takeuchi identificaron, dieron nombre y visibilidad al concepto, pero no lo crearon.

Scrum, no es una metodología diseñada y difundida verticalmente, desde arriba hacia abajo; desde la autoría de una universidad, un comité de estandarización o un investigador reconocido. Scrum emergió desde la abajo, impulsado y construido horizontalmente por la comunidad profesional. Es un ejemplo brillante de conocimiento abierto que a diferencia de los modelos de conocimiento acotado o cerrado no tiene un propietario que lo define. Es de dominio público.

También se afirma que los creadores de scrum fueron Peter DeGrace y Leslie Hulet Stahl en 1990 al presentar en su libro “Wicked Problems, Righteous Solutions”(2) scrum como una propuesta de desarrollo iterativo, basado en los principios de Nonaka y Takeuchi.

Muchos, sin embargo, afirman que los autores de scrum son Jeff Sutherland y Ken Schwaber, porque en 1995 presentaron su propia interpretación de scrum en el congreso OOPSLA(3); otro marco de desarrollo iterativo basado en los principios identificados por Nonaka y Takeuchi, con un ciclo formado por tres estadíos: “prejuego, juego de iteraciones y postjuego”

Pero lo cierto es que hoy el estándar generalizado de scrum, es muy diferente a las primeras propuestas de los años 90, porque desde su origen como antítesis al desarrollo en cascada, surgida en empresas innovadoras de los años 80, scrum es un conocimiento profesional, emergente y abierto que se viene enriqueciendo de forma continua con la convergencia de ideas y prácticas aportadas desde la comunidad ágil.

La reducción de las iteraciones, desde las duraciones iniciales de 1 o 2 meses, a las actuales de una o dos semanas, la incorporación de las reuniones retrospectivas, el refinado de la pila de producto, las diferentes prácticas y aportaciones para estimar las tareas e historias de usuario o para no estimarlas en absoluto, las propuestas de tableros kanban de gestión visual y un largo etcétera, son ejemplos de cómo de forma continua, la comunidad ágil viene madurando y enriqueciendo scrum.

Pensar en un autor y en una “guía oficial” es un error. Es considerar cerrado y propietario, a un conocimiento colaborativo y abierto. Al hacerlo lo encorsetamos y le cortamos las alas, ignorando que es de dominio público, fruto de la inteligencia colectiva aportada desde la comunidad ágil.

Actualmente se ofrece formación y difusión de scrum desde las dos perspectivas: la de conocimiento propietario y la de conocimiento abierto. Posiblemente, las más conocidas entre las que enseñan scrum como un modelo propietario y cerrado, sean las dos que se anuncian como autoras del mismo: Scrum.org y Scruminc. Y posiblemente la más conocida que enseña scrum como un modelo de conocimiento abierto sea Scrum Manager, con la que obviamente me identifico.

A medida que avanzamos en el campo de la agilidad, es esencial entender que cada ruta de aprendizaje ofrece su propio conjunto de ventajas y perspectivas. Que la diversidad de enfoques da riqueza y versatilidad a scrum como marco de trabajo.

Para quienes prefieren un camino estructurado con una definición acotada de scrum, organizaciones como scrum.org o scruminc (y otras muchas) proporcionan un marco con una definición acotada que puede funcionar como un sólido punto de partida. Esta perspectiva puede ser especialmente útil para aquellos que empiezan en scrum o que buscan una base sólida y comúnmente reconocida, bien para usarla directamente o bien como punto de partida de su propio “shu ha ri”.

Por otro lado, para aquellos que ven scrum como conocimiento “commons“, emergente y evolutivo, plataformas como Scrum Manager ofrecen un conocimiento abierto.

Reconocen que scrum es un punto de partida y que su verdadera potencia se desarrolla cuando los equipos comprenden la agilidad y aprenden a desprenderse del marco técnico estándar y a modelar el propio, con las prácticas más adecuadas a sus necesidades específicas y contextos únicos.

En última instancia, la elección de una u otra perspectiva, dependerá de las necesidades, el contexto y la filosofía del individuo o equipo en cuestión. Lo más importante es que, independientemente del camino elegido, continuemos respetando el espíritu de mejora continua y colaboración que está en el corazón de scrum.

(1) Hirotaka Takeuchi & Ikujiro Nonaka, 1986 “The New New Product Development Game”, Harvard Business Review.
(2) Peter DeGrace & Leslie Hulet Stahl, 1990 “Wicked Problems, Righteous Solutions”(págs. 153-157), 1990, Prentice Hall.
(3) Scrum Development Process, 1995, Ken Schwaber OOPSLA Business Object Design and Implementation Workshop.

La entrada Origen de scrum más allá de los mitos se publicó primero en Navegápolis.

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

Una sinfonía en C#

Cómo enviar datos desde .NET a Prometheus

septiembre 04, 2023 12:00

Introducción

Prometheus es un sistema de monitoreo de código abierto que nos permite almacenar series de tiempo de datos numéricos. Es muy utilizado para monitorear aplicaciones y servicios en producción. En este caso vamos a ver cómo enviar datos desde una aplicación .NET a Prometheus.

Agregar el paquete NuGet

Utilizaremos https://github.com/prometheus-net/prometheus-net en nuestra aplicación .NET.

Y agregaremos el siguiete código

    internal class Program
    {
        static void Main(string[] args)
        {

            using var server = new KestrelMetricServer(port: 1234);
            server.Start();

            // Generate some sample data from fake business logic.
            var recordsProcessed = Metrics.CreateCounter("sample_records_processed_total", "Total number of records processed.");


            _ = Task.Run(async delegate
            {
                while (true)
                {
                    // Pretend to process a record approximately every second, just for changing sample data.
                    recordsProcessed.Inc();

                    await Task.Delay(TimeSpan.FromSeconds(1));
                }
            });

            Console.WriteLine("Listening on port 1234");
            Console.ReadLine();
        }
    }

Con este tenemos por un lado las métricas por defecto que nos da Prometheus y por otro lado una métrica que nosotros creamos llamada sample_records_processed_total que es un contador que incrementa cada segundo.

Configurar Prometheus para que lea nuestros datos


global:
  scrape_interval: 5s
  evaluation_interval: 5s

scrape_configs:
- job_name: 'my_net_application'
  static_configs:
  - targets: ['host.docker.internal:1234']

Llamaremos a este archivo prometheus.yml y se copiará en la carpeta donde Prometheus busca su configuración.

Ejecutar Prometheus desde Docker

version: "3.7"
services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
    ports:
      - 9090:9090
    restart: always

En el comando command le indicamos a Prometheus que lea la configuración desde el archivo prometheus.yml que montamos en el volumen, éste es el archivo que creamos en el paso anterior.

Ejecutar nuestra aplicación .NET

Ejecutamos la aplicación y vemos que Prometheus está leyendo los datos que enviamos desde nuestra aplicación.

Dejo el código de ejemplo por acá https://github.com/leomicheloni/prometheus-net-sample

Enjoy.

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

Blog Bitix

Desempaquetado de altavoz inteligente Amazon Echo (4ª generación)

agosto 31, 2023 11:00

Ya tenía un altavoz Echo de 3ª generación ubicado en la habitación pero me viene bien tener un segundo altavoz en el salón para escuchar música, así que me he hecho con un segundo altavoz Echo en este caso de 4ª generación. Con Amazon Prime y Amazon Music les doy un buen uso. El Echo de 4º tiene algunas diferencias notables para el que las use respecto al de 3ª.

Continuar leyendo en Blog Bitix

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

Blog Bitix

Desempaquetado altavoz inteligente Amazon Echo (4ª generación)

agosto 31, 2023 11:00

Ya tenía un altavoz Echo de 3ª generación ubicado en la habitación pero me viene bien tener un segundo altavoz en el salón para escuchar música, así que me he hecho con un segundo altavoz Echo en este caso de 4ª generación. Con Amazon Prime y Amazon Music les doy un buen uso. El Echo de 4º tiene algunas diferencias notables para el que las use respecto al de 3ª.

Continuar leyendo en Blog Bitix

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

Blog Bitix

Desempaquetado y análisis de televisión smart tv Samsung 43QN90B

agosto 30, 2023 02:30

Finalmente he comprado una televisión, ahora con Amazon Prime y para ver contenido por streaming es algo que puedo darle el uso que merece. Tras unos días y ver televisión y alguna película la calidad de la Samsung 43QN90B por la que he optado ofrece una calidad de imagen excelente llamándome mucho la atención en la buena calidad de negros. Aunque cualquier cosa mejor de la que venía iba a ser una mejora notable pero su panel VA y el mini led dan una una imagen en calidad significativamente mejor que se agradece en las películas incluso comparando con el panel IPS del monitor BenQ PD2700Q que tengo para el ordenador.

Continuar leyendo en Blog Bitix

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

Picando Código

Mod Kit 8BitDo para el control de Nintendo 64

agosto 26, 2023 08:40

8BitDo empezó a vender mod kits para controles de Nintendo 64. El kit cuenta con dos componentes principales que podemos comprar por separado. El primero es el mod kit + rumble pack, la placa de circuito impreso y un Rumble Pack que además incluye el puerto USB-C para cargar el control y botones extra. La modificación convierte al control de Nintendo 64 en un control Bluetooth compatible con Switch y modo "Android".

Es el equivalente al control de Nintendo 64 que ofrece Nintendo Online, que sólo se puede comprar siendo miembros de Nintendo Online y pasa más tiempo fuera de stock que disponible. Lo que lo convierte en una mina de oro para revendedores sin escrúpulos en sitios web de subasta.

Encargué un kit ni bien me enteré que estaban disponibles. La primera parte del kit, el PCB + Rumble Pack, se empezó a mandar en Agosto y la recibí esta semana. Incluye el Rumble Pack, PCB, cable USB-C para cargar y un destornillador Phillips del tamaño de los tornillos del control de Nintendo 64.

8BitDo Mod Kit for Original N64 Controller

En preparación, conseguí un control de Nintendo 64 original barato en un sitio online de subastas, porque no vamos a sacrificar uno de los controles que tenemos en uso del Nintendo 64… Sabía que no quería otro control gris (aunque me gusta bastante el original) y ya tengo mi preferido Atomic Purple. Terminé comprando uno rojo, que además del precio, me da esa estética "Nintendo".

Nintendo 64 - Control rojo

Salió bastante barato, y me sorprendió el relativo buen estado de la palanquita para el precio. No funciona perfecto, y se le nota el desgaste y seguro sería una desventaja jugando Mario Kart 64 o F-Zero X. Pero por lo menos no está deshecha y colgando… ¡Seguimos esperando el Santo Grial de las palanquitas!

Con todos los materiales listos, es hora de seguir las instrucciones del mod kit y abrir el control original sacándole todos los tornillos. Si son como yo, ya han anulado más de una garantía abriendo dispositivos para ver cómo funcionan por dentro y volviéndolos a armar con distintos grados de éxito. Pero en el caso que no, las instrucciones son bastante claras y todo está diseñado para volver a encajar donde debe ir. Así que no hay por qué tener nervios, sólo tener cuidado de no hacer mucha fuerza al montar/desmontar partes y demás, porque algunas piezas pueden romperse.

Control de Nintendo 64 abierto

Como siempre, cada vez que abrimos un dispositivo es recomendable darle una limpieza. Sobretodo cuando se trata de dispositivos comprados por ahí. Mi "kit de limpieza" incluye cotonetes (hisopos o bastoncitos de algodón) con agua tibia, un cepillo de dientes viejo, algún desinfectante, trapo o toallas de papel y en algunos casos extremos productos de limpieza del tipo cremoso que ayudan a quitar manchas o el tinte amarillento en algunos plásticos.

Con el desgaste de los años, el plástico que alberga las distintas partes de la palanquita puede ser una pesadilla:

Palanquita Nintendo 64 horror

Con suerte tendremos un reemplazo para esto en breve…

Al sacar el PCB original, hay que tener cuidado con dos componentes en particular: La placa del botón Z, que está enganchada al contenedor negro de la palanquita, pero podemos abrir con mucho cuidado (lo digo por experiencia 😅) un poco los dos plásticos que lo sostienen. Y desconectar el cable de la palanquita que en esta ocasión no necesitó mucho esfuerzo por suerte.

Componentes Nintendo 64 interior

Una vez desarmado, tenemos nuestro control listo para recibir su nuevo y reluciente PCB de 8BitDo:

Control Nintendo 64 al desnudo

Y así como sacamos el PCB original, colocamos el PCB nuevo, la tapa para el lugar de donde salía el cable y acomodamos las partes de los botones Z, L y R:

8BitDo N64 Mod Kit instalado

Después de armado y atornillado todo de nuevo, instertamos el Rumble Pack, presionamos Start en el control y está listo para conectarlo al Nintendo Switch. Debemos presionar el boton de "pairing" del Rumble Pack, ir a "Change Grip/Order" de los controles en el Nintendo Switch, y lo detecta casi inmediatamente como control de Nintendo 64:

Nintendo Switch con Nintendo 64

Ya podemos jugar Super Mario 64 en nuestro Nintendo Switch con el control original 🙂

Nintendo Switch Super Mario 64

La tapa donde salía el cable tiene un LED rojo que se prende cuando ponemos a cargar el control, bastante cool (y casualidad que combina con mi nuevo control rojo):

Control Nintendo 64 cargando

Moviendo el Switch en el Rumble Pack a modo "Android", lo podemos usar perfectamente en Linux:
Gamepad Nintendo 64 en Linux

Al tener un número limitado de botones, en algunos juegos vamos a tener que remapear los comandos. Pero está muy bueno jugar con un control de Nintendo 64 juegos en Steam, o si queremos usar un emulador 👀

El mes que viene, 8BitDo empieza a enviar la segunda parte de este Mod, el "Hall Effect Joystick". La palanca de mando analógica o como la llamé toda la vida: "la palanquita". Esta es la pieza clave del control del Nintendo 64, ya que es la que sufre el mayor desgaste de uso y afecta de manera más seria la jugabilidad. 8BitDo asegura que este nuevo diseño "puede aumentar considerablemente la vida del joystick y la experiencia de usarlo".

Por ahora la mejor alternativa que he encontrado es SteelSticks64. Dato curioso, cuando fui agregado a la lista de "Early Adopters" de SteelSticks, fui el número 42. Pero no sé si se siguen produciendo, y tenían un precio que daba miedo. Hace un tiempo escribí sobre otras opciones en Reparando el control del Nintendo 64, pero lamentablemente la campaña de ENKKO en Kickstarter no se realizó. De todas formas hay varias alternativas (algunas listadas en ese Kickstarter mismo), pero los precios también son bastante altos comparados a los 20 dólares de 8bitDo.

Cuando reciba la palanquita de 8BitDo y la pruebe en mi nuevo control, volveré a escribir al respecto. Le tengo fe, 8BitDo tiene buenos productos y el precio es accesible en comparación a las alternativas que hablaba antes. Esperemos que con suerte sea la solución que llevo tantos años esperando para revivir los controles de Nintendo 64 🙌

El post Mod Kit 8BitDo para el control de Nintendo 64 fue publicado originalmente en Picando Código.

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

Una sinfonía en C#

Cómo recuperar un branch git en Azure DevOps

agosto 22, 2023 12:00

Introducción

En el post anterior vimos cómo recuperar un repositorio Git que ha sido borrado en Azure Devops. En este caso vamos a ver cómo recuperar un branch que ha sido borrado.

El método fácil

Existe ya un método dentro del portal de Azure DevOps para recuperar un branch borrado. Para ello, vamos a la pestaña Repos y seleccionamos el repositorio donde estaba el branch. Si recordamos el nombre del branch borrado solo tenemos que buscar el branch del siguiente modo:

Buscamos el branch por nombre y vemos que aparece debajo en la lista de branches borrados, haciendo click en los puntos de la derecha podemos restaurarlo mediante la opción Restore. Y voilá, ya tenemos nuestro branch de vuelta.

No sabemos el nombre del branch que fue borrado

En el caso que no recordemos exactamente el nombre no podemos buscarlo, pero podemos mediante git obtener el listado de branches borrados y restaurar el que queramos.

Disclaimer: Este método solo funciona si hicimos checkout del branch en el repo que queremos recuperar el nombre.

Para ello, vamos a nuestro repositorio local y ejecutamos el siguiente comando:


git reflog

Esto nos va a mostrar el listado de commits que hemos hecho en nuestro repositorio local, incluyendo los que hemos hecho en branches que ya no existen.

Con esto vamos a Azure DevOps y buscamos el branch por nombre y lo veremos para recuperarlo igual que en el método anterior.

Enjoy.

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

Navegapolis

Libro: Agilidad, perspectiva y principios del desarrollo ágil.

agosto 18, 2023 08:51

Comparto el libro con los temas que he impartido estos años en CESTE.

Espero que os resulte útil.

Podéis emplearlo libremente con los términos de la licencia CC BY NC o también comprar una licencia para actividades comerciales.

Descargar

La entrada Libro: Agilidad, perspectiva y principios del desarrollo ágil. se publicó primero en Navegápolis.

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

Una sinfonía en C#

Cómo recuperar repositorios git en Azure DevOps

agosto 08, 2023 12:00

Aclaración, este método solo funciona durante 30 días después del borrado.

Introducción

Bien, en este post vamos a ver cómo recuperar un repositorio git que hemos borrado en Azure DevOps. Estos repositorios se mantienen en un Recycle Bin durante 30 días, pasado ese tiempo, se borran definitivamente.

Recuperar repositorio

Para hacerlo tendremos que utilizar la API de Azure DevOps. Para ello, vamos a utilizar Postman.

Obtener token

Lo primero que tenemos que hacer es obtener un token para poder acceder a la API. Para ellos vamos a ir a nuestro perfil y crear un token (PAT).

Con permisos para lo que necesitamos, en este caso, repositorios.

Copiamos el token y lo guardamos en un lugar seguro (si lo olvidamos, tendremos que crear otro).

Consultar repositorios usando la API

Ahora vamos a consultar los repositorios que tenemos en nuestra organización. Para ello, vamos a utilizar la siguiente URL:

//_apis/git/repositories/?api-version=7.0

En mi caso es:

https://dev.azure.com/leomicheloni/test_git/_apis/git/repositories/?api-version=7.0

y usaremos basic auth con nuestro usuario y el token que acabamos de crear. Para ellos tenemos que ir a la pestaña Authorization y seleccionar Basic Auth, o crear el header manualmente con el usuario y el token. Por ejemplo:

usuario@email.com:PAT

En base 64 y lo ponemos como header anteponiendo la palabra Basic.

Authorization: Basic dXNlcm5hbWVAZW1haWwuY29tOlBBVA==

Bien, con esto obtenemos los repositorios actuales.

Consultar repositorios borrados

En este caso la url es:

//_apis/git/recycleBin/repositories/?api-version=7.0

Y el resto es igual que antes. En este caso no hay nada.

{
    "value": [],
    "count": 0
}

Así que borramos un repositorio y volvemos a consultar.

Recuperar repositorio

Lo que tenemos que hacer es copiar el id del repositorio borrado y hacer estaba vez un PATH.

//_apis/git/recycleBin/repositories/[REPO_ID]?api-version=7.0

En mi caso:

https://dev.azure.com/leomicheloni/test_git/_apis/git/recycleBin/repositories/a852e4c3-7ebc-4915-ae2a-e673d79b60eb?api-version=7.0

Adcionalmente tenemos que indicar content-type: application/json y colocar en el body:

{
    "deleted": false
}

Ejecutamos el PATCH con la misma autenticación y voilá, ya tenemos el repositorio de vuelta.

Enjoy!

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

Picando Código

Las ventas de Nintendo – casi 130 millones de consolas y 18.51 millones de Tears of the Kingdom en menos de 2 meses

agosto 03, 2023 11:00

Están disponibles los resultados de ventas de Nintendo al 30 de junio de 2023. El Nintendo Switch viene bajando el ritmo de ventas desde su pico en 2021, pero en el último año financiero vendió casi 18 millones de consolas. A la fecha, se registran 129,53 millones de unidades vendidas de la consola Nintendo Switch, y 1.088,35 millones de unidades de software.

Nintendo Switch

La consola Wii fue otro de los éxitos recientes de Nintendo, la veíamos en todos lados y parecía que toda persona en el mundo tenía una. En comparación, durante su tiempo Wii vendió 101,63 millones de unidades de hardware y 921,85 unidades de software. La familia Nintendo DS 154,02 millones de unidades de hardware y 948,76 unidades de software (que se miden aparte del 3DS con 75,94 millones y 391,59 millones respectivamente).

Así que los números del Switch son bastante impresionantes, y es posible que todavía alcance los números del Nintendo DS para convertirse en la consola más vendida por Nintendo. Si bien ya lleva 6 años en el mercado, y nunca han parado los rumores de un "Switch 2″ (propongo "Super Nintendo Switch" o "Nintendo Ultra Switch" como alternativas), todavía tiene un rato más de vida. Y ya es la consola que más software ha vendido, siendo la primera en alcanza mil millones.

The Legend Of Zelda: Tears Of The Kingdom, publicado el 12 de Mayo de 2023, alcanzó 18,51 millones de unidades vendidas al 30 de junio. Son menos de dos meses y ya se encuentra entre los 10 títulos más vendidos en la historia del Nintendo Switch. Aparentemente rompió un par de récords en cuanto a velocidad de venta. Como referencia, The Legend Of Zelda: Breath of the Wild, que también salió para Wii U (aunque no creo que haya perdido más que un par de millones como mucho al Wii U) lleva vendidas 30,65 millones de copias en los 6 años de vida del Switch. En menos de dos meses, la secuela lleva vendida más de la mitad! Es un juego excelente que mejora en gran parte todo lo bueno de Breath of the Wild. Ya consumió unas 100 horas de mi vida, por lo que decidí darme un recreo para jugar Pikmin 4 y algún que otro beat ‘em up…

El top 10 de ventas del Nintendo Switch hasta junio de 2023:

  • Mario Kart 8 Deluxe – 55,46 millones
  • Animal Crossing: New Horizons – 42,79 millones
  • Super Smash Bros. Ultimate – 31,77 millones
  • The Legend of Zelda: Breath of the Wild – 30,65 millones
  • Super Mario Odyssey – 26,44 millones
  • Pokémon Sword/Pokémon Shield – 25,92 millones
  • Pokémon Scarlet/Pokémon Violet – 22,66 millones
  • Super Mario Party – 19,39 millones
  • The Legend of Zelda: Tears of the Kingdom – 18,51 millones
  • New Super Mario Bros. U Deluxe – 16,17 millones

Pokémon sigue vendiendo como pan caliente con cada nueva versión. En lo personal el último que jugué fue Pokémon Shield, y la verdad no me enganchó tanto como otros. El sistema de batalla tiene ese toque adictivo/nostálgico que mantiene la esencia de la primera generación a la que tantas horas le dediqué. Pero lo dejé después de terminar la historia principal. Pero los títulos nuevos Scarlet/Violet siguen subiendo en el ranking y en breve se viene DLC, así que seguramente muevan algunos millones más. Quedan también algunos títulos importantes en Switch antes de fin de año. Estoy seguro que Super Mario Bros. Wonder particularmente va a entrar en el ranking, sin dudas vendiendo más que New Super Mario Bros. Deluxe. Qué raro no ver Super Mario 3D World/Bowser’s Fury en el ranking. En lo personal me gustó mucho más que Super Mario Odyssey, pero también lo había jugado ya en Wii U.

Es difícil que saquen a Mario Kart 8 Deluxe del primer puesto, y el DLC ha sido excelente, agregando un montón de pistas tanto completamente nuevas como de títulos anteriores (incluyendo la versión móvil Mario Kart Tour). Ese y Super Smash Bros. Ultimate son los dos títulos que me han hecho reconsiderar mi suscripción a Nintendo Online (que no pago desde hace como 2 años), solamente para jugar un poco más en línea. Es difícil imaginar a dónde va a ir Nintendo con próximos títulos en esas dos franquicias.

Como comentaba, todavía quedan algunos títulos buenos por publicarse antes de fin de año. Y la consola sucesora del Switch no ha sido anunciada todavía oficialmente. Así que seguirá vendiendo más. En lo personal tengo muchas horas de juegos por delante con mi Switch todavía, así que no tengo apuro por el Super Nintendo Switch. Espero que cuando lo anuncien salga de pique con un juego de F-Zero, uno de Star Fox y a esta altura habrá que asumir que Metroid Prime 4 sale en la próxima generación de consolas Nintendo.

El post Las ventas de Nintendo – casi 130 millones de consolas y 18.51 millones de Tears of the Kingdom en menos de 2 meses fue publicado originalmente en Picando Código.

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

Picando Código

Nuevo libro de Cory Doctorow – The Internet Con: How To Seize the Means of Computation

agosto 02, 2023 09:00

The Internet Con: How to Seize the Means of Computation

The Internet Con: How to Seize the Means of Computation

El próximo libro de Cory Doctorow es The Internet Con: How To Seize the Means of Computation (La Estafa de la Internet: Cómo apoderarse de los medios de computación): Un manual para desmontar las Big Tech que traza un plan detallado y listo para ejecutar para desmierdificar la internet.

En palabras del autor: Es la destilación de más de 20 años de lucha activista defendiendo los derechos humanos online, en las salas de gobiernos, en la red, y en las calles. Es un  set de recetas listas para usar distintos tipos de "interoperabilidad" (la habilidad de modificar servicios existentes con plug-ins, mods, etc) para facilitar el escape de los jardines amurallados de Big Tech, y para hacer la vida más segura de gente que no está lista para salirse.

Un manual para desmontar a Big Tech

Así es como mueren las plataformas: primero, son buenas con sus usuarios; luego abusan de sus usuarios para mejorar las cosas para sus clientes comerciales; finalmente, abusan de sus clientes comerciales para obtener todo el valor para sí mismos. Luego, mueren.

Estamos en las etapas finales de la mierdificación. Cada plataforma se está transformando en una montaña de mierda. Es hora de dejar de intentar resolver cómo salvar a las plataformas. Es hora de empezar a evacuarlas. ¿Cómo? Con interoperabilidad. Conectamos servicios nuevos -mejores, gestionados por cooperativas, organizaciones sin fines de lucro, startups, comunidades, colaboradores individuales – a los silos. Explotamos salidas en los jardines amurallados. Hacemos posible dejar la plataforma sin perder las cosas que usan para mantenerte prisionero. Te devolvemos la autodeterminación que es tu derecho de nacimiento, que las plataformas te robaron.

Puedes dejar la plataforma de medio de comunicación social – pero continuas intercambiando mensajes con la familia, amigos, comunidades y clientes que se quedan atrás. Puedes dejar la plataforma móvil, pero mantienes los medios, aplicaciones, y contactos que te encadenaban a ella. Puedes abandonar Audible – pero mantener tus libros.

A lo que las plataformas arden, los creadores de políticas a seguir luchan por una respuesta. Algunos de ellos siguen intentando que las plataformas se empiezan a comportar mejor. Están equivocados. El problema con Mark Zuckerberg no es que sea la persona equivocada para estar a cargo de la vida en línea de cuatro mil millones de personas – es que nadie debería tener ese trabajo. No necesitamos arreglar a Zuck.

Necesitamos abolir a Zuck.

Este es un libro que entrega una receta detallada de política a seguir para construir rutas de evacuación para las plataformas, usando interoperabilidad. Es un libro que explica qué deberían ser esas políticas a seguir, cómo obtenerlas, y cómo administrarlas para que las companías de tecnología no puedan escabullirse del anzuelo o hacer trampa hacia la gloria (de nuevo).

¡Es un libro que explica cómo podemos detener la marea de mierdificación y apoderarse de los medios de computación!

Kickstarter

Como hizo con el audiolibro de Attack Surface, inició una campaña en Kickstarter para financiar su producción de manera independiente: Amazon no va a vender el audiolibro. No llevan ninguno de mis audiolibros, porque me niego a dejarlos bloquear los libros a las aplicaciones de Amazon, para siempre. Ninguno de mis libros se vende con Digital Rights Management (DRM). Es el cifrado que tranca a un archivo digital a la plataforma de un vendedor. Amazon lo sabe.

La campaña en Kickstarter ya tiene más de 6 veces el monto inicial de USD 10.000 para financiar el proyecto. Así que definitivamente va a ser financiado, y todavía quedan 19 días de campaña. Según Doctorow, el libro tapa dura ya está impreso y en almacenes, el audiolibro ya está grabado y en su mayoría masterizado.

El audiolibro es leído por Cory Doctorow mismo. Podemos escuchar una muestra en la página del proyecto en Kickstarter. "Este es un libro para la gente que quiere destruir a las grandes empresas de tecnología", empieza diciendo. Cuéntenme  🙋

El audiolibro se ofrece sin DRM, sin términos y condiciones, y puede reproducirse en cualquier dispositivo o reproductor. Lo compraste, es tuyo. Lo mismo con el ebook, se ofrece para descargar en formats epub y pdf. Por último, la opción por la que fui yo, se ofrece el formato tradicional tapa dura publicado por Verso.

Ver la campaña en Kickstarter.

El día que conocí a Cory Doctorow en persona

Este año no sólo leí dos libros de Cory Doctorow: Attack Surface y Red Team Blues. Sino que además tuve el gusto de verlo en persona en Cymera, el festival de literatura de ciencia ficción, fantasía y horror en Edimburgo. Después de ver el afiche en un par de las tiendas de libros que visito frecuentemente, compré entradas para su charla con Nina Allan e Ian MacDonald.

La charla fue súper interesante, con personas con perspectivas bastante distintas. Después de la charla, los autores se encontraban en mesas para firmar sus ejemplares. En ese momento, Cory Doctorow estaba promocionando su más reciente libro, Red Blue Teams. Si bien lo había leído recientemente, decidí llevar otro de sus ejemplares. Fue difícil decidir, pero creo que Radicalized es posiblemente mi libro favorito del autor.

Así que me puse a hacer cola en su mesa, hasta que llegué con mi ejemplar tapa dura de Radicalized a conocer a Cory Doctorow. No soy muy de conocer a gente famosa, y las experiencias que he tenido generalmente no me afecta mucho "su fama" (mucho menos soy de sacarme foto, creo que se necesita una autoestima para eso). Pero en ese momento mi cerebro se apagó y me absorbieron los nervios. Creo que se dió cuenta -o será porque está súper acostumbrado a hablar con nerds con ansiedad social como yo- y empezó a hablarme y preguntarme cosas enseguida y la charla empezó a fluir. Hice un comentario algo así como "perdón que traje Radicalized y no Red Team Blues, pero me gustó más" y me aseguró que no había problema.

Conversé muy poco pero la charla fue súper interesante y amena. Quedé contento de aprender que es una persona completamente normal, simpática y amable, coherente con lo que escribe. Y ahora tengo mi copia de Radicalized leída y con dedicatoria personal por el autor 🙂

Cory Doctorow - Radicalized firmado

Podemos seguir a Cory Doctorow en su blog personal, donde además lista varias formas más de seguirlo en línea.

El post Nuevo libro de Cory Doctorow – The Internet Con: How To Seize the Means of Computation fue publicado originalmente en Picando Código.

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

Navegapolis

Origen de scrum

julio 27, 2023 02:34

Descargar texto de la referencia

El término scrum sólo se empleaba para definir la formación de los jugadores de rugby al disputar la pelota. En 1986(1) Hirotaka Takeuchi e Ikujiro Nonaka lo usaron metafóricamente en la expresión “Moving the Scrum Downfield” para referirse al modo de desarrollo que mostraba 6 características:

1.- Inestabilidad inherente.
2.- Equipos autoorganizados.
3.- Solapamiento de las fases de desarrollo.
4.- Multiaprendizaje.
5.- Control sutil.
6.- Transferencia organizativa del conocimiento.

Muchos pensábamos, que los creadores de una propuesta de desarrollo iterativo, tomando el nombre de scrum con este sentido metafórico fueron Jeff Sutherland y Ken Schwaber en 1995(3).
Parece que no. Que no fueron ellos, que el origen de un modo de desarrollo iterativo con este nombre y sentido se debe a Peter DeGrace y Leslie Hulet Stahl, en 1990, en su libro “Wicked Problems, Righteous Solutions”(2).

(1) Hirotaka Takeuchi & Ikujiro Nonaka, 1986 “The New New Product Development Game”, Harvard Business Review.
(2) Peter DeGrace & Leslie Hulet Stahl, 1990 “Wicked Problems, Righteous Solutions”(págs. 153-157), 1990, Prentice Hall.
(3) Scrum Development Process, 1995, Ken Schwaber OOPSLA Business Object Design and Implementation Workshop.

La entrada Origen de scrum se publicó primero en Navegápolis.

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

info.xailer.com

Xailer y Linux: Instalación de WSL

julio 24, 2023 05:36

Como os comentamos en nuestro último artículo, uno de nuestros objetivos para las futuras versiones de Xailer era la posibilidad de crear ejecutables y librerías para Linux en 64 bits. No se trataría de ejecutables con su propio entorno gráfico al estilo de Windows, sino que se trataría de aplicaciones que principalmente estarían pensadas para ser utilizadas como CGIs . Es decir, para ser utilizadas desde entornos Web principalmente.

Básicamente en la web y desde el lado del servidor hay dos formas de realizar aplicaciones (back-end): Utilizando guiones / scripts que se ejecutan en lenguajes como PHP, Python o Node.js o utilizando ejecutables cerrados que pueden ser elaborados en cualquier lenguaje que cree ejecutables para el sistema operativo anfitrión del servidor web. Ambos sistemas, tienen sus ventajas y sus inconvenientes.

Los guiones o scripts tienen la gran ventaja de que son tremendamente sencillos de crear y modificar ya que sólo hace falta un simple editor de texto para trabajar. Cualquier modificación que realice en el guion, después de ser grabado, ya se puede observar en la página Web. No hay compilación, ni enlazado y aunque su velocidad de ejecución es muy baja con respecto a un ejecutable, el hecho de tener cargado en memoria del servidor todo el motor de ejecución del script hace que los tiempos de ejecución sean muy asumibles. Las aplicaciones tipo CGI son muy rápidas en su ejecución comparadas con los guiones , pero están penalizadas por su tiempo de carga, que lógicamente es mayor que el de un guion cuyo motor de ejecución está siempre cargado en memoria. No obstante, este problema se ha solucionado gracias a la aparición de FastCGI. Tanto es así, que incluso motores como el de PHP, se pueden ejecutar en modo FastCGI para evitar los problemas que pudieran surgir por guiones maliciosos o mal realizados, sin que ello suponga una perdida de velocidad.

Las aplicaciones tipo CGI han de ser compiladas y enlazadas creando un ejecutable que puede ser autónomo o dependiente de librerías externas. Y esto que puede parecer una desventaja con respecto a los guiones o scripts, pero es en realidad su mayor ventaja, por varios motivos:

  • Propiedad intelectual: Nuestra propiedad intelectual del código incluido en las aplicaciones queda asegurado al no estar los fuentes del mismo disponibles en el servidor. No sólo la propiedad intelectual está en peligro cuando todo el código está disponible en el servidor , si los scripts se ejecutan en un servidor que tiene acceso nuestro cliente es imposible controlar su buen uso o por ejemplo establecer un sistema de licencias por uso del mismo.
  • Seguridad: Es infinitamente más sencillo ‘hackear‘ un servidor web que utilice motores de scripting como PHP a uno que no lo utilice. Un ‘hacker‘ que consiga subir un archivo al servidor con código malicioso, que es sencillamente, texto plano, puede llegar a conseguir que dicho archivo sea ejecutado por el motor PHP (por ejemplo) y se apoderé completamente de la máquina. Los agujeros de seguridad existentes en todo el software de gestión de contenidos que se basan en dicho motores de script tienen que estar constantemente actualizándose para contrarrestar todas las amenazas que reciben. Este problema no existe con los CGIs.
  • Depuración: La depuración de aplicaciones basadas en scripts son realmente una pesadilla ya que ni siquiera existe un corrector sintáctico del código. Es decir, si hace falta un ‘;’ para indicar fin de instrucción y no lo ponemos, no nos enteraremos hasta que se ejecute en el servidor y normalmente lo único que recibiremos de respuesta es una página en blanco y poco más. Si llamamos a una función que no existe o nos olvidamos de cerrar un bloque IF..ENDIF, exactamente igual. En las aplicaciones CGIs nos aseguramos que el código ha sido compilado y enlazado sin problemas y por lo tanto los errores que podamos tener son sólo errores de ejecución. En la mayoría de los lenguajes de programación que realizan CGIs es necesario utilizar un sistema de ‘Logs‘ para poder depurar las aplicaciones y saber hasta que punto se han ejecutado correctamente o conocer valores de variables internas. En Xailer hemos conseguido depurar cualquier aplicación CGI de la misma forma que se depura cualquier otro tipo de aplicación de escritorio y todo sin salir del IDE. Xailer es capaz de ejecutar cualquier CGI y mostrarlo en su navegador interno, pudiendo poner puntos de ruptura, ejecución paso a paso e inspección de variables. Esto sólo es posible realizarlo creando CGIs tipo Windows. Los CGIs que cree tipo Linux se mostrarán en el IDE pero no tendrán las ventajas de depuración de los CGIs de Windows.

El proyecto está bastante avanzado y en la versión Beta actual de Xailer ya es posible crear aplicaciones para Linux en 64 bits directamente desde el IDE de Xailer y sin tener que salir de nuestro cómodo sistema operativo Windows para nada. No obstante, necesitaremos poder compilar y enlazar nuestros programas en Linux y para ello habrá que instalar algún software adicional (gratuito), que a continuación os explico.

En este primer artículo os vamos a explicar como instalar lo estrictamente necesario para poder crear y ejecutar nuestros CGIs creados para Linux en nuestra propia maquina sin tener que depender de servidores en la nube. Para ello deberemos instalar WSL (Subsistema de Windows para Linux). Necesitareis Windows 10 o Windows 11 y os adelanto que no es nada exigente con los requisitos de máquina por lo que os animo a instalarlo aunque vuestro hardware no sea muy potente. Igualmente, es muy poco exigente en cuanto a los recursos que usa. WSL es realmente un gran acierto por parte de Microsoft. En este enlace de nuestro Wiki tenéis toda la información necesaria para instalar WSL.

El siguiente artículo os mostraremos lo fácil que es crear un CGI desde el propio IDE de Xailer. ¡Estad atentos!

Un saludo

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

IOKode

¿Deben pagarse las pruebas técnicas?

julio 24, 2023 02:50

NOTA IMPORTANTE: Esta entrada es opinión y, en cierta manera puede ser considerada opinión de ámbito político. En ningún caso espero que se esté de acuerdo conmigo.

NOTA Esta entrada viene a raíz de una conversación en Twitter entre Elisa, Javier y yo. Recomiendo leer la conversación completa.

Hace unos días afirmaba Elisa en Twitter que las pruebas técnicas deberían de pagarse por ser trabajo. A esta afirmación respondió Javier exponiendo su experiencia y opinión haciendo pruebas técnicas y bueno, pues yo he querido meterme también en el meollo exponiendo tanto mi experiencia como opinión. Sin embargo, dado que esta da para bastante más que un tweet, pues he decidido escribirla aquí.

Creo que es importante aclarar que Elisa es diseñadora gráfica mientras Javier y yo somos programadores debido a que el mercado es muy diferente y, por lo tanto, me atrevería a decir que las pruebas que solemos encontrarnos los programadores van a tener una condiciones muy diferentes a las que se suele encontrar un diseñador. Hablo de condiciones “laborales” en el contexto de la prueba, no del contenido de la misma, ya que es obvio que a un diseñador no vas a ponerle la misma prueba que a un programador.

Creo (y digo creo, porque desconozco por completo el mercado actual, tanto hacía programadores como diseñadores) que se podría decir que las condiciones para los diseñadores son peores que para los programadores.

El precio del tiempo

Javier dice que existen pruebas de unas pocas horas hasta otras pruebas que se pueden extender varios días y considera que las pruebas largas deben ser pagadas. Elisa afirma que nunca ha hecho una prueba que no sean mínimo cuatro días.

Personalmente, creo que el tiempo es algo muy valioso de una persona y me gustaría que todo el tiempo de una persona fuese pagado, pero la realidad no siempre es tan sencilla.

Coste de hacer las pruebas

Imaginemos que una empresa tiene un presupuesto de 100 ¤ al mes para pagar un nuevo empleado, empieza el proceso de selección y paga 10 ¤ a cada candidato, en la que se presentan 10 candidatos. El coste de este proceso (además del tiempo del personal que está entrevistando en vez de produciendo) sería de 10 ¤ por candidato x 10 candidatos = 100 ¤.

Esto podría suponer que no pueda incorporar al candidato elegido hasta un mes después de finalizar el proceso ya que no tendrían presupuesto para ello. En algunos casos, puede que incluso el candidato elegido hubiese preferido no cobrar por la prueba técnica y haber entrado a trabajar un mes antes.

Este coste tendría además un coste lineal por cada candidato extra presentado, pudiendo hacer inviable probar más de n candidatos y con ello, perjudicar a todos los que se han quedado fuera.

Con esto quiero llegar a la conclusión que, lo que en principio parece beneficiar al candidato, en algunos casos puede ser perjudicial para el mismo.

NOTA: Por favor, que nadie me diga que con 100 euros o dólares mensuales no se puede vivir. No he dicho euros en ningún momento, son unidades monetarias genéricas y utilizo números bajos para simplificar. Además el coste de vida es muy entre individuos y depende de las necesidades específicas de cada uno.

Mi experiencia haciendo pruebas técnicas

Personalmente no he hecho muchas pruebas técnicas y, las que he hecho, han sido cortas.

La prueba más larga que hice tardé aproximadamente unas seis horas en hacerla y fue para la agencia de viajes Destinia (fui contratado, aunque no pasé el periodo de prueba y duré algo menos de dos meses).

Cuando hice las pruebas no me sentí en ningún momento “explotado”, hice ejercicios de clase con una duración bastante más alta y, en el peor de los casos, la prueba me habría servido para aprender, por lo que siempre me los he tomado como tal, como un ejercicio más.

También he de decir que cuando hice las pruebas apenas tenía experiencia (Destinia fue mi primer empleo), por lo que esa sensación en aquel momento tenía sentido. Hoy en cambio, las verías como una parte más del proceso de selección y valoraría si me interesaría hacerla en base a si hacer la prueba sale a cuenta a cambio del puesto que se ofrece (normalmente sí, ya que en caso de que no saliese a cuenta sería por otros motivos, raro sería que el motivo para descartar un puesto sea la prueba).

Libertad contractual

Algo importante a destacar es que la prueba técnica es en realidad un contrato entre dos partes y como tal, una parte se compromete a hacer algo similar a lo que haría en el trabajo y la otra parte se compromete a evaluar sus capacidades a través de esta prueba.

Como cualquier otro contrato, este puede llevar todo tipo de cláusulas diferentes:

  • El candidato podrá o no utilizar como portfolio lo hecho en la prueba.
  • La empresa pagará o no al candidato por la realización de la prueba.
  • El candidato pagará o no a la empresa por la realización de la prueba.
  • La empresa podrá o no utilizar el contenido hecho por el candidato en la prueba.
  • etc. etc.

La libertad de las partes de introducir o excluir las cláusulas que determinen así como la obligación de todas las partes del cumplimiento de estas es algo esencial para que el mercado funcione.

¿Utilizar el material de la prueba?

Dejando de lado el hecho de que esto debería de determinarse antes de la realización de la pruebo y, desconociendo otros sectores, lo cierto es que en el mío la utilización por parte de la empresa es algo muy complicado.

Por lo general, el código que un programador escribirá irá condicionado por el código existente del proyecto y sus APIs, que irá conociendo a medida este se integre en el equipo y que, salvo caso muy raros y muy bien documentos, no utilizará en una prueba técnica.

Por otra parte, si la prueba consiste en realizar un pequeño software desde cero, poca cosa útil se puede hacer durante el tiempo que dura una prueba, haciendo inviable que la empresa pueda utilizarlo para nada.

Por supuesto, entiendo que esto no tiene porque ser aplicable a otros sectores, no sé como funcionan las pruebas técnicas en el sector del diseño gráfico, que es el sector al que pertenece Elisa.

Conclusión

La conclusión de todo esto es que no puede decirse que las pruebas deben de pagarse sí o sí, o que no deben de pagarse nunca. Depende del contexto sobre el que se realice la prueba.

En cualquier caso, espero que nunca se legisle para obligar a las empresas a tener que pagar las pruebas técnicas a los candidatos, porque esto además de que puede hacer daño tanto a las empresas como a los candidatos, se trata de reprimir la libertad contractual (ya bastante reprimida) haciendo el mercado laboral cada vez más inflexible.

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

Header Files

Complejidad algorítmica (parte I)

julio 17, 2023 07:00

Introducción

Sin entrar a filosofar demasiado, podríamos decir que para que un determinado código pueda considerarse bueno, hacen falta cinco cosas:

  • Hacer lo que tiene que hacer, es decir, cumplir con los requerimientos.
  • No hacer lo que no debe hacer (no tener errores, ser seguro, ser fiable).
  • Hacerlo eficientemente, con el menor consumo de recursos posible.
  • Acoplarse correctamente al resto del sistema, sin interferir con otras aplicaciones.
  • Ser entendible tanto por el equipo actual como por el del futuro (expresividad y documentación).

Así como en otras ocasiones hemos hablado mucho del último punto, hoy (y en futuras entregas) lo haremos del tercero: eficiencia, y más específicamente de un aspecto del rendimiento llamado complejidad algorítmica. Aunque este tema ha sido abordado por numerosos autores de una forma mucha más profunda de lo que lo haremos acá, el objetivo de estas entradas es introducir el concepto y su importancia, así como dar ejemplos y guías rápidas de uso que nos permitan sacar provecho del mismo en nuestros proyectos.

Complejidad algorítmica

El concepto de complejidad algorítmica se refiere a cómo se comporta un determinado código cuando el conjunto de datos sobre el que opera crece (se dice que su tamaño tiende a infinito). Es decir, nos habla principalmente de la escalabilidad del código, y también, aunque de forma indirecta, de su eficiencia.

La complejidad algorítmica suele evaluarse considerando dos aspectos: el temporal (tiempo de ejecución) y el espacial (memoria requerida). Aunque trataremos de abordar ambos a lo largo de estas entregas, nos centraremos en el análisis de tiempo, pudiéndose tomar la teoría y aplicarla directamente al espacial la gran mayoría de las veces.

Para realizar este análisis necesitaremos una forma de indicar la complejidad obtenida, y lo haremos utilizando la notación asintótica, más específicamente de la O grande (aunque existen otros tipos).

Notación asintótica O grande

Esta notación indica una cota máxima en la complejidad de un algoritmo. Indica, grosso modo, cómo es el comportamiento de un algoritmo (en tiempo o espacio) a medida que crece el conjunto de datos. No se expresa en unidades de tiempo (o de memoria) específicas, ni siquiera en términos de instrucciones, ya que dependen de muchos factores (compilador, flags utilizados, arquitectura, hardware disponible, entorno, etc).

Tampoco es un análisis detallado del número de operaciones que un algoritmo realiza, o de los bytes que consume, sino un resumen de su tendencia principal. Así, un algoritmo que sume elemento a elemento dos vectores, y otro que realice 514 operaciones por cada par de elementos, tendrá la misma notación O grande (en este caso O(n), pero eso lo veremos en breve). ¿Por qué? Porque a medida que el conjunto de datos crece, los detalles de implementación tienen cada vez menos impacto frente al comportamiento general del mismo. (Obviamente, esto no quita que a la hora de comparar exhaustivamente dos algoritmos o implementaciones no debamos tomar en cuenta estos detalles, pero en esta serie nos centraremos en lo antes expuesto.)

La notación O grande busca pues describir, con sencillez, este comportamiento, de forma que podamos hacernos una idea del rendimiento de un algoritmo y poder realizar comparaciones entre distintas soluciones. Algunos de los tipos principales son (en orden de mejor a peor):

  • O(1): constante (el tiempo o espacio requerido no se ve afectado por el tamaño del conjunto de datos). Ejemplos son el acceso a un arreglo o vector de datos, consultas a tablas hash, y búsqueda de máximo o mínimo en un conjunto ordenado.
  • O(log n): logarítmico (normalmente se descartan secciones completas del conjunto de datos durante el procesamiento). El tipo de algoritmo más conocido de este orden son las búsquedas dicotómicas (o binarias).
  • O(n): lineal (seguramente el caso más trivial, recorrer los datos un número constante de veces). Se identifican rápidamente por la presencia de un bluce for del tipo for (size_t i = 0; i < N; ++i) (o variantes).
  • O(n log n): cuasi-lineal. La gran mayoría de algoritmos de ordenación eficientes (tales como quick-sort) tienen esta complejidad.
  • O(n2): cuadrático (recorrer el conjunto de datos por cada elemento del mismo). Suelen consistir en un par de bucles anidados y, en muchos casos, corresponden a la versión más directa (y no optimizada) de un algoritmo.
  • O(n3): cúbico. Análogamente al cuadrático, encontramos tres bucles anidados. Estos casos son raros de ver de forma directa y suelen aparecer disfrazados como la aplicación, a modo de subrutina, de un algoritmo cuadrático a cada elemento de un conjunto de datos.
  • O(2n): exponencial. Un ejemplo son las búsquedas de caminos óptimos por fuerza bruta.

Rendimiento promedio, mejor y peor caso

Lo más normal es medir el rendimiento de un algoritmo en los casos más comunes. Aún así, muchos algoritmos se comportan de forma más eficiente en determinadas situaciones. Por ejemplo, algunos algoritmos de ordenanamiento (entre ellos el infame algoritmo de la burbuja) pueden llegar a ser O(n) sobre conjuntos previamente ordenados. Así mismo, puede pasar que haya casos en los que el rendimiento decaiga dramáticamente (por poner otro ejemplo interesante, el quick-sort puede llegar a ser O(n2) si el conjunto está ordenado de forma inversa).

El conocimiento del comportamiento del algoritmo en todos estos casos nos proporcionará una guía útil para elegir el más acorde a nuestras necesidades.

Ejemplo

Para entenderlo mejor, veamos cómo se comportarían un grupo de funciones, todas calculando el mismo resultado pero cada una con una complejidad media diferente. Ya mencionamos anteriormente que la complejidad algorítmica no está asociada a tiempos específicos, pero ilustrar con algunos números reales siempre ayuda a entender mejor el concepto. Supongamos que para el caso básico (N=1) todas las variantes tardasen 0,1us (venga, un tiempo a primera vista ridículamente pequeño). Ahora, midamos (desde un punto de vista teórico y simplista) cuánto tardarían en ejecutarse estos algoritmos para N=100, N=10.000 y N=1.000.000:

Complejidad 1 100 10.000 1.000.000
O(1) 0,1us 0,1us 0,1us 0,1us
O(log n) 0,1us 0,6us 1,3us 2us
O(n) 0,1us 10us 1ms 100ms
O(n log n) 0,1us 66us 13,3ms 2s
O(n2) 0,1us 1ms 10s 27,8h
O(n3) 0,1us 100ms 27,8h 3.171y
O(2n) 0,1us 🌌 🤯 🤯

Nota: En este caso el algoritmo exponencial no nos serviría más que para conjunto de unas pocas unidades

Aunque pareciese que incluso los cuatro primeros tienen un rendimiento más que decente, tenemos que ponerlos en contexto. Para operaciones que se realizan una única vez, o muy esporádicamente, tiempos de hasta unos pocos segundos pueden ser aceptables (guardar un fichero, la generación de miniaturas de un álbum de fotos, preparar un documento para su impresión, precalcular tablas de valores). Por otro lado, si la operación debe ser realizada continuamente, o forma parte de un flujo de trabajo más largo, es probable que se convierta en nuestro cuello de botella y debamos buscar una alternativa.

Imaginemos que esta función es la encargada de calcular la colisión entre el personaje de un videojuego y su entorno, y donde N es la cantidad de polígonos en la escena. Si queremos un juego fluido deberíamos entonces realizar este cálculo un mínimo de 60 veces por segundo. Así, si tenemos 10.000 polígonos (algo bastante flojo hoy en día), podemos aproximar el tiempo requerido:

  Tiempo por fotograma 60Hz
O(1) 0,1us 6us
O(log n) 1,3us 78us
O(n) 1ms 60ms
O(n log n) 13,3ms 798ms

Vemos que el algoritmo O(n log n) se queda atrás ya que consume casi todo el tiempo disponible en un segundo, y aún quedan otras tareas por hacer (IA, renderizado, sonido, comunicaciones…). Pero es que aunque se pusiese en un hilo dedicado, la detección de colisiones suele ser un cálculo bloqueante de otras tareas, tales como interacción con objetos, recibir daño, restringir el movimiento. Así que incluso en el caso del O(n) estaríamos consumiendo el 6% de nuestro valioso tiempo en esto antes de poder proseguir con otros cálculos. Por último, suponer un escenario de sólo 10.000 polígonos es, hoy en día, hablar de un juego bastante sencillote. En entornos más exigentes (más de 1 millón de polígonos), la solución de orden lineal se mostraría inficiente también.

Complejidad espacial

La tabla anterior mostró la eficiencia de ejecución de un algoritmo. A la hora de hablar de complejidad espacial, tenemos que hacer hincapié en que la gran mayoría de las veces se refiere al espacio requerido por las estructuras auxiliares, no por el conjunto de datos en sí que, obviamente, tendrá que contener los datos que necesite (dejaremos de lado técnicas de compresión o de control de redundancias).

Así pues, imaginemos que tenemos una colección de objectos de clase C, donde cada uno ocupa 20 bytes y, para simplificar, asumamos que la alineación de memoria es siempre perfecta. Dicha colección debe ser procesada por diversos algoritmos, cada uno con una complejidad espacial diferente (no pasaré de O(N2), ya que suele ser el peor caso asociado). Para ilustrar el caso haremos los cálculos suponiendo un overhead de un objeto auxiliar (20B):

  1 1.000 1.000.000
O(1) 20B 20B 20B
O(log n) 20B 200B 400B
O(n) 20B 20KB 20MB
O(n log n) 20B 4MB 8GB
O(n2) 20B 20MB 20PB

Vemos claramente cómo no suelen ser viables algoritmos que requieren más de O(n) espacio adicional. Esto sin entrar en detalles tales como el tiempo que conlleva la reserva de memoria ni el patrón de accesos a todos los datos (caché).

Conclusiones

En esta primera entrega hemos expuesto las nociones de la complejidad algorítmica: notación O grande, complejidad temporal y espacial; y mostrado su impacto mediante ejemplos realistas.

Como guía rápida, en general debemos evitar cualquier algoritmo de orden cuadrático y superior en aquellos escenarios donde el conjunto de datos sea grande. En una entrega futura detallaremos la complejidad de algunos algoritmos conocidos así como diversas técnicas de optimización que podemos utilizar.

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

Blog Bitix

Desempaquetado del ratón inalámbrico Logitech Signature M750

julio 15, 2023 01:00

Tras probar un ratón inalámbrico de los baratos pasado un tiempo me quedé con muy malas impresiones por la perdida de conectividad principalmente que era muy molesta. Pasé a un ratón con cable más fiable y tras 5 años el botón derecho me ha empezado a fallar y reconocer el clic aleatoriamente. Tras estar usando un Apple Magic Mouse que generalmente me ha funcionado bien en cuanto a conectividad he vuelto a darle una nueva oportunidad a un ratón inalámbrico pero ya de más calidad, finalmente he elegido el Logitech Signature M750. En el artículo hago un análisis del ratón y mis primeras impresiones.

Continuar leyendo en Blog Bitix

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

Variable not found

await Task.Delay(5_184_000_000);

julio 12, 2023 06:05

Playa de Costa Ballena

Si sois habituales del blog, probablemente ya sabréis lo que os voy a decir ;)

Como todos los años por estas fechas, empieza el periodo vacacional y aprovecharé para bajar un poco el ritmo, descansar unos días y disfrutar de familia y amigos. 

Por tanto, dejaré el blog en modo de bajo consumo hasta bien entrado septiembre, cuando, ya con las pilas recargadas, volveré al ataque con nuevos artículos y enlaces interesantes. Eso sí, durante este periodo seguiré echando el ojo periódicamente a comentarios o mensajes que me dejéis, aunque no los responderé con la misma celeridad que en otras épocas del año.

Aprovecho para desearos a todos un feliz verano y que disfrutéis de las vacaciones. ¡Nos vemos a la vuelta!

Publicado en Variable not found.

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

Variable not found

Enlaces interesantes 535

julio 10, 2023 06: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

Machine learning / IA / Bots

Web / HTML / CSS / Javascript

Visual Studio / Complementos / Herramientas

.NET MAUI / Xamarin

Otros

Publicado en Variable not found.

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

Variable not found

¡Microsoft MVP 2023-2024!

julio 07, 2023 06:00

MVP

Por decimotercer año consecutivo, me complace enormemente informaros de que Microsoft ha tenido a bien reconocerme de nuevo como MVP (Most Valuable Professional) en tecnologías de desarrollo. ¡13 años ya, uau! ¡Pero si el primero parece que fue ayer!

Muchas gracias al increíble equipo de Microsoft que hay detrás de este programa por haberme honrado con este reconocimiento, y especialmente a nuestra gran Cristina González por su dedicación, cercanía y ponérnoslo todo tan fácil cuando la necesitamos.

También agradeceros a vosotros, mis queridos amigos, que sois los que con vuestras visitas, lecturas, comentarios y apoyo incondicional hacéis que este sueño siga siendo posible año tras año.

¡Nos vemos por aquí!

Publicado en Variable not found.

» 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