Quantcast
Channel: Planeta Código
Viewing all 2698 articles
Browse latest View live

Blog Bitix: Herramientas para mejorar una página web en SEO, conformidad estándares y rendimiento

$
0
0

Hay múltiples herramientas que permiten evaluar y mejorar un sitio web en la conformidad de estándares web, rendimiento y SEO. Con los resultados de estas herramientas se han de realizar correcciones en el sitio web para mejorar las páginas del sitio web. La conformidad a estándares web, rendimiento, SEO y enlaces rotos son criterios por los que los buscadores clasifican las páginas en las páginas de resultados. Con un mejor posicionamiento es posible mejorar el número de visitas que los buscadores atraen al sitio web y realizando cambios mejorar la experiencia de usuario.

HTML

Para todos los sitios web es importante y para algunos la fuente más importante de visitas que recibe un sitio web es a través de búsquedas orgánicas de buscadores como Google o como el buscador DuckDuckGo que respeta tu privacidad.

El número de visitas depende de la calidad del contenido, el número de búsquedas que coincide con ese contenido y la competencia por las palabras clave con otros sitios web o algo tan simple como el título de los artículos.

Sin embargo, otra parte para maximizar el rendimiento de un sitio web se debe a otros factores que los rastreadores e indexadores web utilizan para mostrar en las páginas de resultados de las búsquedas y su posición con otros resultados. Conviene que el HTML y CSS de la página cumpla con los estándares, tenga un buen rendimiento, la estructura de la página y contenido tenga palabras clave o no haya enlaces rotos a otras páginas o recursos en el sitio web.

Contenido del artículo

Evaluar SEO

El SEO es un arte ya que no hay una medida precisa de qué criterios emplean los buscadores para clasificar las páginas indexadas en las páginas de resultados. Sin embargo, sí hay algunas pautas que sí contribuyen a un mejor posicionamiento.

Incluir palabras clave y conocer la intención de búsqueda de los usuarios para satisfacer su búsqueda con un contenido apropiado. Asignar un título adecuado y preciso teniendo en cuenta la intención de búsqueda del usuario no mejora el SEO pero si mejora el número de clics que los usuarios lo acceden.

Los datos estructurados o enriquecidos web permiten a los buscadores mostrar en la página de resultados las páginas con un formato que destaca sobre el resto, como incluir una imagen o vídeo. Los datos enriquecidos al igual que un buen título mejoran el porcentaje de usuarios que hacen click en el resultado y por tanto ayuda a conseguir más visitas.

La herramienta Google Search Console proporciona métricas de visitas, informa de los errores que se detectan en la indexación o mejoras a realizar en las páginas asi como cuales son las principales palabras clave, artículos, tasa de clics o CTR y posición de las páginas en los resultados. Otros análisis de SEO son evaluar las páginas según las palabras clave y las pálabras clave de la competencia, algunas de estas herramientas son de pago pero ofrecen unas métricas básicas de modo gratuito.

Evaluar conformidad a estándares web

La organización W3C es la encargada de definir los estándares de la web. Cumplir los estándares es importante ya que de lo contrario es posible que algún navegador o versión de los mismo no muestre correctamente el contenido del sitio web, lo que ocasiona la pérdida de una visitas por una mala experiencia de usuario. Al mismo tiempo en caso de que el contenido de la página no cumpla los estándares los rastreadores quizá no sean capaces de indexar todo el contenido del sitio web o en la clasificación de las páginas de resultados acabe posicionado peor que otros artículos.

La W3C proporciona tres herramientas para evaluar la conformidad de una página a los estándares web para el HTML y feeds. En caso de que el sitio web genere contenido en formato amp promovido por Google hay otra herramienta para evaluar la conformidad. Conociendo los elementos en los que la página no es conforme se han de realizar cambios para solventar los errores.

Accesibilidad

Otro aspecto de conformidad de estándares que ha de ser tenido en cuenta es hacer que las páginas del sitio web sean accesibles para que el acceder a la páginas no suponga ninguna barrera a ningún usuario incluyendo a aquellos que poseen algún tipo de discapacidad. Algunas pruebas de accesibilidad es incluir un texto alternativo para todas las imágenes de la página web y que el contraste de color de la fuente y de fondo tenga un mínimo de diferencia.

Evaluar rendimiento

El tiempo que tarda en descargar una página es otro criterio que los buscadores tiene en cuenta para clasificar los resultados. Se considera como positivo para la experiencia de usuario que una página tarde el menor tiempo posible en descargarse por ello los motores de búsqueda lo tienen en cuenta en la indexación. En el tiempo de descarga influyen factores como el tamaño en KiB de la página, número de peticiones y recursos que carga la página.

Estas dos herramientas proporcionan información sobre la página, con resultado proporcionado es posible hacer modificaciones para tratar de mejorar en los puntos con peor evaluación.

Buscar enlaces rotos

Con el paso de tiempo algunos de los enlaces incluidos en los artículos quedarán rotos al cambiarlos de ubicación el propietario de esos sitios web. Que un sitio web contenga enlaces rotos proporciona una mala experiencia de usuario y posiblemente los buscadores lo tomen como un criterio negativo si el sitio web tiene muchos enlaces rotos.

De forma periódica conviene analizar el sitio web para buscar enlaces o recursos rotos. También hay herramientas para automatizar la búsqueda y con los resultados corregirlos.


Header Files: Introducción a boost::program_options

$
0
0

Introducción

Toda aplicación de C++ (y C) tienen una función que sirve de punto de entrada, es decir, es la función que el sistema operativo llama cuando ha terminado de preparar al proceso y va a comenzar la ejecución del código propiamente dicho (puede que ocurran algunas cosas antes, pero no entraremos en eso). Esta función es la tradicionalmente conocida como main, y tiene la siguiente sintaxis base:

intmain(intargc,char*argv[]){}

Donde el valor de retorno es el valor de retorno del proceso, y los dos parámetros son el número de argumentos recibidos, y una lista de dichos argumentos previamente separados por espacios. El primer argumento es el nombre del ejecutable (aunque puede variar dependiendo cómo haya sido lanzado el proceso).

C y C++ no limitan la forma de utilizar los argumentos de entrada, pero cada sistema operativo tiene sus estándares (costumbres). Por ejemplo, en Windows lo normal es usar / como prefijo para indicar opciones, mientras que Unix y Linux usan - para opciones en formato corto (una sola letra), y -- para el formato largo. Pero de nuevo, cada programador es libre de usar el formato que desee, aunque lo mejor es adherirse al estándar del sistema.

La forma de extraer e interpretar los argumentos también se deja a merced de cada programador, y normalmente es un proceso tedioso ya que hay que lidiar con listas de opciones, formato de cada una, comandos no reconocidos, argumentos inválidos, etc. Por suerte, hay algunas ayudas como getopt en sistemas GNU, QCommandLineParser de Qt, y boost::program_options, que es mi preferida y de la que hablaré hoy. Aunque no pueda cubrirla al 100%, ya que es bastante extensa, trataré de indicar algunos de los casos de uso más frecuentes.

Gestión de opciones

Antes que nada, comentar una metodología de trabajo habitual cuando se desarrolla una aplicación con argumentos por línea de comandos: delegar todo este trabajo en una clase. Esto reduce la cantidad de código en el main (recomendable), desacopla la gestión de parámetros de su interpretación, abstrae de los detalles de implementación (nombre del parámetro, biblioteca para interpretarlos, tipo de dato, gestión de errores, etc.), y centraliza toda la variabilidad propia de los parámetros de ejecución. Así, un ejemplo (aleatorio) sería:

// command_line_options.h#include <string>
structCommandLineOptions{std::stringinput_path;std::stringoutput_path;std::stringlang;interror_level=0;boolverbose=false;boolparse(intargc,char*argv[]);};
#include "command_line_options.h"intmain(intargc,char*argv[]){CommandLineOptionsoptions;if(!options.parse(argc,argv)){return1;}// Use 'options'setLanguage(options.lang);initLog(options.error_level,options.verbose);// ...}

boost::program_options

Boost, como en muchas cosas, es la gran navaja suiza de C++ (otro tanto es la biblioteca Poco, que la dejo para quien no la conozca, así como mi querido Qt). De entre todos sus módulos, suelo sacar mucho provecho de program_options, que simplifica la gestión de argumentos de entrada de un programa. A lo largo del artículo usaré el alias po para referirme a este espacio de nombres.

Su funcionamiento podríamos dividirlo en tres partes:

  • Definición de opciones
  • Análisis de los argumentos
  • Uso de las opciones

Definición de opciones

Acá listaremos todas las opciones que nuestra aplicación reconoce, indicando su nombre, tipo y descripción. Para ello usamos la clase options_description.

En el siguiente ejemplo definimos los posibles comandos -? / --help, --input / -i, --output / -o, --language, --error-level, -v / --verbose:

po::options_descriptionpo_desc("Allowed options");po_desc.add_options()("help,?","shows this help message")("input,i",po::value<std::string>()->required(),"input path")("output,o",po::value<std::string>()->required(),"output path")("language",po::value<std::string>()->default_value("en"),"UI language")("error-level",po::value<int>()->default_value(0),"error level")("verbose,v",po::bool_switch()->default_value(false),"show verbose log");

Cada opción se define con el nombre de la misma, pudiendo añadir el formato corto. A continuación se puede especificar el tipo (con un valor por defecto si fuese el caso), o si es obligatoria. Por último, se añade una descripción de la opción, que será la mostrada en la línea de comandos al solicitar la ayuda.

En lo particular me gusta darle valores por defecto a las opciones no obligatorias; de esta forma se simplifica el flujo posterior, la validación de la entrada y hace nuestro código un poco más robusto ante omisiones.

Un ejemplo de argumentos para nuestra aplicación anterior sería: app --input file.txt -o output.txt --error-level 5 -v.

Parámetros ocultos

Es posible definir los parámetros en diversos options_description. Los principales usos son el de poder discriminar cuáles se usan (por ejemplo, en base a la versión del sistema anfitrión, licencia del cliente, variables de entorno, etc.), o el de definir parámetros ocultos (ya veremos a qué me refiero).

Boost sólo puede interpretar un único conjunto de opciones, así que la solución pasa por unificar las que necesitemos como paso previo a la interpretación:

po::options_descriptionpo_desc_hidden("Hidden options");po_desc_hidden.add_options()("gold",po::bool_switch()->default_value(false),"give you a lot of gold");po::options_descriptioncmdline_options;cmdline_options.add(po_desc).add(po_desc_hidden);

Sugerencia👀

Como nota de experiencia, sugiero desactivar el formateo automático de código para esta sección, a fin de mantener cada opción en una línea. Esto mejora la lectura del códguo y mantiene más limpio el historial de cambios en el repositorio. For ejemplo, si usáis clang-format:

// clang-format offpo_desc.add_options()// ...;// clang-format on

Análisis de los argumentos

El siguiente paso es parsear (analizar gramaticalmente) la línea de comandos:

po::variables_mappo_vm;try{po::store(po::command_line_parser(argc,argv).options(cmdline_options).run(),po_vm);po::notify(po_vm);}catch(po::error&e){std::cout<<e.what()<<'\n';std::cout<<po_desc<<'\n';returnfalse;}catch(...){std::cout<<"Unknown error\n";std::cout<<po_desc<<'\n';returnfalse;}

Si la línea de comandos tiene algún error (normalmente parámetros desconocidos o formato incorrecto), capturaremos la excepción (mostrando el error si lo conocemos) y luego mostramos una ayuda para que el usuario sepa cuál es la sintaxis correcta (std::cout << po_desc << '\n'). Nótese que en esta línea no usamos cmdline_options sino po_desc, que es la que contiene la lista de opciones pública; si mostrásemos cmdline_options estaríamos revelando todas las opciones del programa (y en este ejemplo no nos interesa). Por último, indicamos que la función parse ha fallado devolviendo un false.

Uso de las opciones

Ahora tenemos la línea de comandos descompuesta en las opciones que hemos definido, y almacenadas en la variable po_vm; solamente nos queda poner los valores correctos a las variables.

Existen varias formas de acceder a estas opciones, aunque las tres más comunes son:

  • Verificando si la opción ha sido escrita por el usuario: po_vm.count("option_name") > 0.
  • Sabiendo que existe (bien por el método anterior, o porque hemos indicado que siempre tenga un valor por defecto), podemos acceder a su valor: po_vm["option_name"].as<T>, donde T es el tipo de datos que hemos indicado en la definición. Aviso⚠: acceder de esta forma a una opción no definida o sin valor lanza una excepción. Por mi parte, en lo posible trato de que todas las opciones tengan un valor por defecto
  • Asociando una opción a una variable: esta opción es muy práctica, aunque no la suelo usar simplemente porque me gusta separar mentalmente el análisis de la interpretación, sabiendo que no tengo valores a medias en caso de error. Para asociar una opción a una variable solamente tenemos que indicarlo en la definición de la opción: ("language", po::value<std::string>(&lang), "UI language").
if(po_vm.count("help")){std::cout<<po_desc<<'\n';returnfalse;}input_path=po_vm["input"].as<std::string>();output_path=po_vm["output"].as<std::string>();lang=po_vm["language"].as<std::string>();error_level=po_vm["error-level"].as<int>();verbose=po_vm["verbose"].as<bool>();

Otros tópicos

Argumentos posicionales

Los argumentos posicionales son aquellos cuya semántica viene dada por su posición en la lista de argumentos. Por ejemplo app input.txt output.txt podría tener dos argumentos posicionales, donde el primero representa al ruta del fichero de entrada y el segundo la ruta del de salida.

De nuestro ejemplo anterior, supongamos queremos que el fichero de entrada y el salida sean posicionales:

po::positional_options_descriptionpo_pos;po_pos.add("input",1);po_pos.add("output",1);

Los argumentos se seleccionan en el orden en el que se definen, y se asocian a la opción con el nombre que se indica. El número después del nombre indica cuántos argumentos de ese tipo se esperan, donde -1 indica ilimitados (como dice la lógica, no se pueden definir nuevos argumentos posicionales una vez se define uno ilimitado).

Por último, es necesario añadirlos al analizador:

po::store(po::command_line_parser(argc,argv).options(cmdline_options).positional(po_pos).run(),po_vm);

Argumentos en UNICODE

Me gustaría hacer un comentario aparte acerca de cuando los argumentos no usan una codificación ANSI: si necesitamos leer un fichero y su ruta (path) viene dado como argumento de la línea de comandos, es probable que dicha ruta contenga caracteres fuera del espectro de ANSI: vocales acentuadas, la española Ñ, caracteres en cirílico, un nombre de usuario en chino tradicional, etc. Por supuesto, aunque este quizá sea el escenario más tradicional, podríamos encontrar el mismo problema en muchos otros.

Este problema lo planteé en Stack Overflow hace ya un tiempo; expongo acá la respuesta como complemento del artículo. Importante⚠: esta solución está enfocada a Windows.

  • Cambiar el punto de entrada para que acepte cadenas de texto en UNICODE: int wmain(int argc, wchar_t* argv[]).
  • Usar boost::program_options::wvalue en lugar de boost::program_options::value cuando el argumento espere valores en UNICODE.
  • Usar un tipo de datos std::wstring para estos argumentos.
  • Usar boost::program_options::wcommand_line_parser en lugar de boost::program_options::command_line_parser para aceptar la lista de argumentos en wchar_t*.

Aun más

Este breve tutorial deja por fuera algunas otras opciones, que enumero a continuación:

  • Uso de sintaxis no estándar).
  • Permitir argumentos no registrados (por ejemplo, para re-enviarlos a otro comando).
  • Uso de argumentos provenientes del punto de entrada WinMain.
  • Validadores personalizados (por ejemplo, que sea requiera un e-mail y sea el propio Boost el que compruebe que la entrada corresponde con un formato de e-mail válido).

Estos tópicos están documentados en este anexo de Boost.

Ejemplo completo

Se puede probar la mayoría del código de este artículo en vivo.

Variable not found: Enlaces interesantes 443

$
0
0
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

Xamarin

Otros

Publicado en Variable not found.

Variable not found: ¡Variable Not Found cumple quince años!

$
0
0
15 años de Variable Not Found

Pues sí, que se dice pronto, pero hace unos días Variable Not Found cumplió quince años y, como cada aniversario, no quería faltar a la tradición de celebrarlo con vosotros.

Unas 800 semanas, 5.600 días (exceptuando vacaciones, que también las hay), intentando volcar por aquí parte de lo que voy viendo o descubriendo sobre esta profesión que tanto nos gusta. Esto ha dado para cerca de 1300 posts, que han sido consultados más de cuatro millones y medio de veces, y que cuentan con seguidores de todo el mundo, y seguimos fieles los mismos objetivos: aprender y echar una mano al que por aquí se acerque.

Y como de costumbre, aprovecharemos para comentar un poco qué tal fueron las cosas por aquí los últimos 365 días.

El blog en cifras: 2020-2021

Pues la verdad es que el último año ha ido bastante bien :)

Durante este periodo han visitado variablenotfound.com más de 129.000 usuarios únicos, lo que supone un incremento respecto al periodo anterior del 13,5%. Se han superado las 217.000 páginas vistas, prácticamente incrementando un 10% el año anterior.

Como otros años, creo que el número de visitas es más que razonable para ser un blog centrado en unas tecnologías y herramientas concretas. Teniendo en cuenta que todo el tráfico es orgánico y no dedico tiempo ni recursos a promocionar el blog, ni a hacerlo SEO friendly o a brujerías similares, creo que demasiado lejos estamos llegando :D

La vertiente social sigue siendo también bastante destacable, sumando 2.600 seguidores en las cuentas de Twitter (@jmaguilar y @variablnotfound), y superando ligeramente los 1.000 seguidores en Facebook. Además, cerca de 2.300 usuarios siguen las publicaciones del blog desde Feedly.

Las mujeres ya representan el 27% de las visitas a Variable Not Found, un 5% por encima del año pasado. Aún lentamente, pero esto demuestra que la cosa va cambiando: por poneros en contexto, cuando en 2016 celebrábamos los diez años del blog, el sexo femenino representaba sólo 17% de las visitas.

Por edades, más de la mitad de los lectores tienen menos de 35 años. Curiosamente, el número de visitantes en el rango de 18-24 ha crecido un 50% desde el año anterior. Siguen también creciendo de forma espectacular los visitantes que peinan canas, de 45-54 años (72%), 55-64 (176%) y mayores de 65 (262%), lo que demuestra que es una leyenda urbana eso de que el desarrollo sea una profesión para jovenzuelos.

Chrome mantiene el liderazgo en los navegadores, usado por cerca del 80% de los visitantes. Le siguen Firefox (8,5%) y Edge (7,23%, el doble que el periodo anterior).

El buscador de Google aporta el 90% de los usuarios. Sólo el 5% acude de forma directa y 1.6% mediante enlaces. El resto proceden de redes sociales, feeds y otras fuentes.

La mayoría de las visitas proceden de México (23,24%), seguido por España (17,5%). Los amigos Colombianos suponen ya el 11,3%, y los Argentinos han ascendido a la cuarta posición con el 9%, desplazando por poco a Perú (8.6%). Ya algo más abajo, encontramos a Chile (5,7%), Ecuador (4.3%), Costa Rica (2.81%) y Estados Unidos (2%).

Ubicación geográfica

Google siendo la principal vía de acceso a los contenidos, alcanzando el 88,1% de las visitas; el 8,8% acude al blog de forma directa, y el 1,4% llegan a través de enlaces. El resto, casi insignificante, procede de las redes sociales, feeds y otras fuentes.

En definitiva, 15 años después el blog sigue gozando de buena salud y creciendo a ritmo contenido pero, como no podía ser de otra forma, sin dejar de ser una pequeña mota de polvo en la inmensidad de la red. Estoy orgulloso del lugar al que hemos llegado juntos y feliz de poder seguir haciéndolo y de (intentar) ayudar a aquél que se nos acerque.

Muchas gracias a todos, amigos y amigas del blog, porque lo hacéis posible. Espero que sigáis por aquí al menos un año más, ayudándome a buscar la variable; yo prometo seguir intentando que os valga la pena ;)

¡Nos vemos!

Picando Código: Siete días en el Picandoverso – Mayo II: The World Warrior

$
0
0

Bienvenidos y benvenidas al primer post de Siete días en el Picandoverso en el que salí de la ciudad de Edimburgo desde que empezó esta saga. A medida que la situación va mejorando en Escocia, las restricciones se han ido levantando de a poco, y el fin de semana pasado salí de la ciudad por primera vez desde que volví de mi última visita a Uruguay en Marzo de 2020. Hace muchos años que no pasaba tanto tiempo seguido en el mismo lugar… Lo poco que salí me hizo recordar lo lindo que es Escocia y en breve estaré recorriéndola de nuevo.

Vamos con varias cosas que han sucedido en los últimos 7 días en el universo de Picando Código:

Siete días en el Picandoverso – Mayo II: The World Warrior

Ruby

💎 Publicado Rubocop v1.14. Además de muchos arreglos de bugs, incluye dos cops nuevos:

  • Bundler/GemVersion: Fuerza a que la versión de las dependencias sean o bien requeridas o estén prohibidas
  • Layout/SingleLineBlockChain: Revisa si las llamadas a métodos están encadenadas en una sola línea de bloques. Considera que un salto de línea antes del punto mejora la legibilidad del código.

También incluye soporte experimental para Ruby 3.1 como versión destino del código.

🧑‍🍳 Dos noticias de Aaron tenderlove Patterson:

💎 Está buscando feedback en un Pull Request a YAML (Psych) en Ruby: Psych.load no es seguro, sobretodo cuando se trata de datos no confiables, lo que hace que Psych.load o YAML.load sean susceptibles a una falla de Ejecución de Código Remoto (Remoto Code Execution – RCE). Su Pull Request cambia el método load por defecto por safe_load con un alias, y cambia el nombre del método viejo a unsafe_load. La respuesta de la comunidad por ahora parece positiva, así que es posible que el cambio se incluya. Al ser un cambio importante en el comportamiento, va a ser parte de una versión mayor nueva de la biblioteca.

💎 Por medio de Twitter, tenderlove también difundió el programa de recompensas Internet Bug Bounty en el que tanto Ruby como Rails pagan por encontrar problemas de seguridad.

💎 Recientemente uno de los desarrolladores de Ruby, Koichi Sasada, actualizó el debugger del lenguajeruby/debug. El reemplazo del tradicional lib/debug.rb tiene varias ventajas entre las que lista más velocidad, debugging remoto (socket de dominio UNIX, TCP/IP), extensible y está trabajando en soportar hilos y Racros, entre otros. Lo probé cuando lo descubrí y ya funciona bien para debugging normal, pero le voy a dedicar un poco más de tiempo en otro momento. Podemos leer más al respecto en su README y ver instrucciones sobre cómo instalarlo y usarlo.

💎 La gema pygments.rb envuelve el resaltador de sintaxis de Python Pygments. Cada proceso Ruby que se ejecute contiene su propio Pyton (que necesitamos tener instalado en el sistema).

💎 Steven Baker, creador de RSpec, publicó un post con su origen y buena parte de la historia de la famosa biblioteca de testing de Ruby que influyó tantos otros lenguajes y plataformas de testing. Lectura recomendada: History of RSpec.

💎 Este viernes GitHub organiza un Meetup online sobre ViewComponent. Se trata de un framework que encapsula vistas Rails. Joel Hawksley y Brian Douglas de GitHub van a estar hablando de la biblioteca. Los vi a ambos en el pasado meetup de The Ruby Galaxy y si bien no he usado Rails en un buen tiempo, algunas cosas de la implementación de ViewComponent me volaron la cabeza.

💎 Mañana hay meetup online del Scottish Ruby User Group. La charla: Ruby Archaeology con Nick Schwaderer. Nick Schwaderer es el responsable de Past Rubies, un sitio web y newsletter que resurge noticias de Ruby de tiempos pasados. En este meetup va a estar viendo algunas gemas olvidadas por un rubista en particular (🤔) y su código.

Tecnología

🌐 En el blog de Mozilla nos explican ¿Qué es una dirección IP?, cómo afecta nuestra privacidad y qué podemos hacer al respecto.

📼Este año se publicará la versión 4.0 de VLC, una de las aplicaciones de código abierto más populares del mundo, y uno de los mejores (si no el mejor) reproductores de video. La versión nueva va a estar un poco modernizada, con transparencia, íconos chatos, efectos de difuminado, una biblioteca multimedia y más fuentes online de contenido.

🛒Extensión para Chrome que recomienda negocios locales donde comprar cosas que los usuarios abren en Amazon o eBay: Buy Nearby. Siempre es buen momento para recordar que Jeff Bezos es peor que un Lex Luthor de la vida real y no debemos comprarle más a Amazon.

🔥🦊Firefox es mi navegador web preferido, disponible en todos los sistemas operativos populares, bloquea los traqueadores sociales y las cookies que te espían por defecto – Descarga Firefox

Videojuegos

Muchas noticias interesantes sobre Nintendo Switch.

🛹Se confirmó la fecha para Tony Hawk’s Pro Skater 1 + 2 en Nintendo Switch. Podremos jugarlo a partir del 25 de junio. Qué ganas de jugar este juego mientras escucho Bad Religion, Millencolin, Lagwagon, Sublime, Reel Big Fish, Goldfinger y demás 🤘

⚙ Nintendo presentó un título nuevo: Game Builder Garage, un “juego” que nos permite aprender a hacer juegos. Algo así como un Scratch pero ¿hecho por Nintendo?

💰 Con el cierre del año fiscal, se publicaron las ventas de Nintendo. El Nintendo Switch lleva casi 85 millones de unidades vendidas. Si se cumplen las proyecciones de la empresa (más de 25 millones en este año fiscal), va a sobrepasar las ventas del Nintendo Wii (101.63 millones de unidades). Nintendo volvió para quedarse…

🧟‍♂️ Vuelve uno de los juegos que tenía en mi Super Nintendo original: Zombies Ate My Neighbours. El clásico de 16 bit junto a su secuela Ghoul Patrol (¡nunca jugué este!) llegan a Nintendo Switch el 29 de junio. Qué difícil el bebé gigante… ¡Y los gusanos que salían de abajo de la tierra! ¡Y la araña gigante! 😱

YouTube Video

Películas/TV

🤠 Hace tiempo comenté en otro “7 días” sobre la serie animada de Astérix. Se viene otra serie de un personaje con el que trabajó René Goscinny, Lucky Luke. Va a ser una serie de comedia/aventura para Televisión y también va a estar producida en Francia.

📺 Miré Jupiter’s Legacy en Netflix, una serie de superhéroes basada en un cómic. Conocía el cómic original de los escoceses Millar y Quitely, pero no lo he leído. Me dejó la impresión de que el cómic seguro está mejor. Me da la sensación que gran parte de las series y películas originales de Netflix tiene algo que convierte buenas ideas y conceptos en algo que no termina de cerrar. ¿Será que usan un algoritmo para generar las series también?

🕸 Se publicó nuevo trailer de Venom: Let there be Carnage. La primera película la miré sin mucha expectativa y creo que me entretuvo en su momento, no me acuerdo. De todas formas miraré esta segunda. El trailer dice que sólo se estrenará en cines, me parece una afirmación bastante optimista y medio hasta desafiando al destino en los tiempos que corren, pero ya veremos. Me gustó Woody Harrelson en el papel de Cletus Kasady/Carnage, aparte es vegano así que lo banco 💪🌱

Picando Código

Sigo incumpliendo con eso de publicar seguido… Pero sigo escribiendo y agregando borradores al blog. Con suerte de a poco iré transformándolos en posts completos. Ideas no faltan, lo que falta es dedicarle tiempo a la escritura. Pero por lo menos le empecé a dedicar tiempo a la lectura de nuevo. Retomé un libro que había empezado en algún momento de la pandemia y abandoné (tengo unos 7 u 8 libros que empecé durante la pandemia y la ansiedad y demás me hicieron dejarlos). Pero ya empecé a seguir el ritmo y me está interesando el libro así que espero poder terminarlo y reseñarlo por acá en breve.

La foto de la imagen que acompaña a este post muestra en el horizonte la isla Bass Rock desde la costa de North Berwick al este de Escocia.

Pueden seguir los posts de Picando Código por RSS, Twitter (cuenta únicamente con posts del blog) y canal de Telegram. También estoy en Twitter y Mastodon, donde además de compartir lo que se publica en el blog publico alguna cosa más.

Otros 7 días en el Picandoverso:

El post Siete días en el Picandoverso – Mayo II: The World Warrior fue publicado originalmente en Picando Código.

Picando Código: Humble Heal: Covid-19 Bundle – paquete de videojuegos, libros y software con 100% de la recaudado yendo a organizaciones caritativas

$
0
0

Pasado un año de la pandemia global, Brasil e India están pasando por dos de los peores brotes de COVID-19 del mundo. Para ayudar con lo que se puede, Humble Bundle armó un paquete de videojuegos, libros y software. El 100% de la recaudación de las ventas del Humble Heal: Covid-19 Bundle, será destinado a las organizaciones Direct Relief, Doctors Without Borders (MSF), International Medical Corps (IMC), & GiveIndia.

Humble Heal: Covid-19 Bundle
El paquete va a estar disponible por una semana e incluye:

Juegos

  • Into The Breach
  • Baba is You
  • Bioshock Remastered
  • Euro Truck Simulator 2
  • UNDERTALE
  • Hyper Light Drifter
  • Tooth and Tail
  • The Witness
  • This War of Mine
  • Saints Row: The Third – The Full Package
  • Titan Quest Anniversary Edition
  • SUPERHOT
  • Stick Fight: The Game
  • Portal Knights
  • Wargroove
  • Brütal Legend
  • Death Squared
  • Crusader Kings Complete
  • Pinstripe
  • Teleglitch: Die More Edition
  • Dwarfs!?
  • Dead in Bermuda

Libros

  • Ultimate Sh*t Hits the Fan Survival Guide
  • You Can Do All Things
  • Coping Skills: Tools & Techniques for Every Stressful Situation
  • Unfuck Your Worth: Overcome Your Money Emotions, Value Your Own Labor, and Manage Financial Freak-outs in a Capitalist Hellscape
  • Eff This! Meditation: 108 Tips, Tricks, and Ideas for When You’re Feeling Anxious, Stressed Out, or Overwhelmed

Comics

  • Locke & Key Vol. 1: Welcome To Lovecraft
  • Red Sonja: Petitioning the Queen

Software

  • Ashampoo WinOptimizer 18
  • Ashampoo Backup Pro 14
  • Ashampoo Photo Optimizer 7
  • Music Maker: Hip Hop Edition

Entre los juegos recomiendo probar Brütal Legend y Tooth and Tail, dos juegos que están disponibles nativos para Linux. De los que no he jugado, me llaman la atención Hyper Light Drifter y Euro Truck Simulator 2. El primero por la estética y los gráficos pixelados que se ven muy bien. El segundo porque nunca probé estos simuladores de manejo y se incluyen varias ciudades europeas interesantes entre las que se encuentran Edimburgo, Glasgow y Aberdeen de Escocia. No sé si mi computadora tendrá suficiente recursos para que funcione bien, pero habrá que probar…

Steam: Todos los juegos, ebooks, comics y contenido del paquete está disponible en Steam para Windows y algunos para Mac y Linux también.

Formatos: Los cómics están disponibles en formato ePub y PDF, por lo que funcionan en computadoras, lectores electrónicos, iPads, teléfonos móviles y varios dispositivos más. Los ebooks están disponibles en PDF, MOBI y ePub, por lo que también pueden ser usados en prácticamente cualquier dispositivo de lectura electrónica.

Visita Humble Bundle

El post Humble Heal: Covid-19 Bundle – paquete de videojuegos, libros y software con 100% de la recaudado yendo a organizaciones caritativas fue publicado originalmente en Picando Código.

Picando Código: Tlatolophus galorum – nuevo dinosaurio descubierto en México

$
0
0

Esta semana se presentó el Tlatolophus galorum, un hadrosaurio descubierto, investigado y presentado al mundo por un equipo Mexicano. Es el especimen actual más completo de la familia Lambeosaurini encontrado en México, y es hermoso 😍

Tlatolophus Galorum por Luis Rey

Tlatolophus Galorum – Arte por Luis Rey

En este excepcional arte del paleo ilustrador Luis Rey podemos apreciar su parecido con el Parasaurolophus. El análisis filogenético del Tlatolophus lo asigna a la tribu Parasaurolophini, que además del Parasaurolophus incluye al Charonosaurus (China) y Blasisaurus (España), entre otros. El Parasaurolophus medía aproximadamente 10 metros de largo y su cresta característica consistía en una serie de tubos que empezaban en las fosas nasales. Habiendo escaneado el cráneo, científicos pudieron reproducir el sonido que haría al soplar aire por la cresta, y es similar al de un trombón. ¡En el Museo Nacional de Escocia hay un simulador que genera este sonido! El Tlatolophus tenía las mismas medidas, pero una cresta bastante particular.

Del paper:

En 2013, un equipo conjunto de paleontólogos de INAH y UNAM comenzaron un proyecto pare recuperar una cola semi-articulada putativa de un hadrosaurio, que fue descubierto en 2005, en los depósitos Campanianos de la Formación del Cerro del Pueblo, cerca de Presa de San Antonio, Municipio de General Cepeda, Coahuila, México del norte. Actualmente, este especimen es el Lambeosaurini más completo encontrado en México.

Se encontró el cráneo, mandíbulas y partes adicionales del esqueleto incluyendo la cola articulada. El nombre proviene de la palabra náhuatl tlatolli, que significa “palabra”, combinada con la palabra latina  lophus (“cresta”) debido al parecido de la cresta con la “palabra” glifo de la iconografía Azteca, que se asemeja a una coma inversa.

Luis Rey comenta en su blog cómo siguió instrucciones de los investigadores para la reconstrucción. Los autores e investigadores involucrados fueron: Angel Alejandro Ramírez Velasco, Felisa Aguilar, René Hernández, José Luis, Marisol Lara, Jesús Alvarado y José López, así como Ricardo Servín que está trabajando en el modelo del cráneo del dinosaurio. En ese mismo post podemos ver imágenes del cráneo fosilizado.

Cuando alguien me pregunta cuál es mi dinosaurio favorito, mi respuesta es generalmente “Parasaurolophus”. Pero con este nuevo especimen, puede que empiece a incluir también “Tlatolophus” 🙂

El post Tlatolophus galorum – nuevo dinosaurio descubierto en México fue publicado originalmente en Picando Código.

Blog Bitix: El patrón de diseño Factory, ventajas sobre new y diferencias con Builder

$
0
0

El patrón de diseño Factory es uno de los patrones dedicados a la creación de instancias. El patrón Factory proporciona varias ventajas sobre la palabra reservada new que proporcionan los lenguajes de programación orientada a objetos para la creación de instancias. Es muy utilizado en muchas librerías, en ocasiones también es necesario implementar una clase que implemente este patrón por lo que es muy útil conocer y usar este patrón en las ocasiones que sea adecuado.

Java

El patrón de diseño factoría o Factory es uno de los más empleados en multitud de ocasiones en el código propio y aunque no se implemente al ser usado en multitud de librerías también en muchos casos conviene conocer sus principios y ventajas frente a otros métodos.

El patrón de diseño Factory es uno de patrones ya identificados como útiles en los que su aplicación es adecuada. Los patrones de diseño se clasifican en las áreas funcionales de creacionales dedicados a la creación de objetos, de comportamiento centrados en la comunicación entre objetos, estructurales para mantener de forma sencilla relaciones entre entidades y finalmente los patrones de concurrencia empleados en la aplicación concurrente con múltiples hilos de ejecución.

Contenido del artículo

Las limitaciones de instanciar objetos con la palabra reservada new

Los lenguajes de programación orientada a objetos modelan los conceptos que trata una aplicación mediante clases que define las propiedades del objeto y los métodos que permiten el acceso o modifican el estado del objeto, esto proporciona encapsulación y es uno de los conceptos fundamentales de la programación orientada a objetos entre los que también se encuentran el polimorfismo, herencia y composición.

1
2
3
4
5
publicabstractclassShape{    publicabstractdoublegetPerimeter();    publicabstractdoublegetArea();}
Shape.java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
publicclassCircleextendsShape{    privatedoubleradious;    publicCircle(doubleradious){        this.radious=radious;    }    @Override    publicdoublegetPerimeter(){        return2*Math.PI*radious;    }    @Override    publicdoublegetArea(){        returnMath.PI*radious*radious;    }}
Circle.java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
publicclassSquareextendsShape{    privatedoublelength;    publicSquare(doublelength){        this.length=length;    }    @Override    publicdoublegetPerimeter(){        return4*length;    }    @Override    publicdoublegetArea(){        return2*length;    }}
Square.java

Las clases son una definición de las entidades de una aplicación en tiempo de compilación, en tiempo de ejecución un programa crea instancias individuales de las clases. En el lenguaje de programación Java para la creación de instancias de objetos se usa la palabra reservada new. Al emplear esta palabra reservada el lenguaje en tiempo de ejecución devuelve una referencia a la instancia creada, habitualmente se asigna la referencia a una variable.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
publicclassMain{    publicstaticvoidmain(String[]args){        Shapeshape1=newSquare(2d);        System.out.printf("Shape perimeter: %s%n",shape1.getPerimeter());        System.out.printf("Shape area: %s%n",shape1.getArea());        Shapeshape1=newCircle(2d);        System.out.printf("Shape perimeter: %s%n",shape2.getPerimeter());        System.out.printf("Shape area: %s%n",shape2.getArea());    }}
Main-new.java

La palabra reservada new o una equivalente es el mecanismo que emplean muchos lenguajes de programación orientados a objetos como Java y C#. Al ser un mecanismo proporcionado por el lenguaje es sencillo de utilizar en la mayoría de ocasiones.

Aunque la palabra reservada new es una opción válida para crear instancias tiene algunas limitaciones que en algunas ocasiones requieren una alternativa.

Una de sus limitaciones es que la palabra reservada new siempre devuelve una instancia del tipo concreto que explícitamente se crea, a veces el tipo concreto de la instancia no se conoce en tiempo de compilación, por ejemplo en tiempo de compilación se sabe que se necesita un Shape pero solo hasta en tiempo de ejecución no se sabe si la instancia a construir es un Square o un Circle.

Otra limitación es que el código que usa new tiene la responsabilidad de crear las instancias, a veces interesa delegar esta responsabilidad en otra clase para no repetirla múltiples veces.

Para evitar las las limitaciones de la palabra new se suele emplear alguno de los patrones creacionales, como el patrón de diseño Factory.

El patrón de diseño Factory

El patrón Factory es un patrón de diseño creacional que tiene como función crear instancias de objetos sin las limitaciones de la palabra reservada new. El patrón Factory solventa las dos limitaciones comentadas de new, pudiendo crear diferentes tipos de instancias que implementen una interfaz o hereden de una clase común, al mismo tiempo el código de creación de las instancias queda encapsulado en la clase que implementa el patrón Factory abstrayendo al código que lo usa de la responsabilidad de creación de instancias.

La creación de instancias es una de las tareas más comunes que realiza un programa, de modo que habitualmente es necesario implementar una clase factoría o en caso de usar una librería utilizar una factoría implementada por una clase de la librería. Un contenedor de IoC y su inyección de dependencias que también tienen como misión delegar en ellos la creación de instancias requieren implementar una factoría propia que el contenedor invoca.

El patrón Factory es tan simple como una clase con uno o varios métodos que devuelven la instancia que la factoría crea, el método de la factoría puede recibir parámetros. El método factoría puede ser estático si la creación de las instancias depende de únicamente los parámetros que recibe el método o el método puede ser de instancia y estar basado además de los parámetros que recibe en propiedades de la instancia de la factoría.

El patrón Factory hay dos categorías: Factory Method Pattern que se basan en un único método y Abstract Factory Pattern que son una indirección más pudiendo sustituir una implementación de factoría por otra haciendo posible devolver cada una diferentes instancias.

Como muchos patrones de diseño añade cierta complejidad en el diseño de las clases del programa con lo que su uso debe estar justificado con el objetivo de simplificar el código o la necesidad de evitar las limitaciones de la palabra new.

Diagrama de clases del patrón de diseño Factory

Diagrama de clases del patrón de diseño Factory

Diferencias con el patrón de diseño Builder

El patrón de diseño Builder es otro patrón creacional dedicado a la creación de instancias, aunque comparte objetivos las implementación es diferente del patrón Factory.

Una diferencia entre el patrón Factory y el patrón Builder es que el patrón Factory crea la instancia en un único paso con la invocación de un método de la factoría que lo devuelve inmediatamente, el patrón Builder suele requerir la invocación de varios métodos y un método final build que realiza la creación de la instancia con una API fluída.

Los Builder son objetos con estado y requieren crear una instancia de Builder, el patrón Factory no requiere crear una instancia y se puede compartir entre varios objetos que la necesitan.

Por el contrario el patrón Builder proporciona más control sobre los pasos de la creación de la instancia y proporciona más flexibilidad para variar la representación interna de la instancia creada. Otra diferencia es que el Builder crea instancias con diferente composición de objetos.

Ejemplo de patrón de diseño Factory

En el siguiente ejemplo de implementación en Java de patrón Factory Method se observa que el método factoría en función del parámetro se devuelve una instancia u otra empleando una sentencia if-else. Esta factoría además contiene otros dos métodos de factoría específicos para tipos concretos de Shape.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
publicclassShapeFactory{publicstaticShapecreate(Stringtype){       if(type.equals("square")){           returnnewSquare(1);       }elseif(type.equals("circle")){           returnnewCircle(1);       }else{           thrownewIllegalArgumentException();       }}publicstaticSquarecreateSquare(doublelength){       returnnewSquare(length);}publicstaticCirclecreateCircle(doubleradious){       returnnewCircle(radious);}}
ShapeFactory.java

La sentencia if-else hace que no se cumpla el principio O (Open-closed) de SOLID, si se añade un nuevo tipo requiere modificar el código del método en vez de proporcionar una extensión. Para evitar la sentencia if-else en una factoría hay varias opciones.

Con la incorporación de los default methods en Java el método factoría es posible implementarlo en una interfaz de Shape no requiriendo una clase ShapeFactory dedicada que lo contenga.

El siguiente programa crea una figura según el parámetro indicado que solo se conoce en tiempo de ejecución según el argumento proporcionado al lanzar el programa y una instancia de cada tipo de figura, se observa que la clase Main no utiliza directamente los constructores de ninguna figura.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
publicclassMain{    publicstaticvoidmain(String[]args){        StringshapeType=args[0];        Shapeshape1=ShapeFactory.create(shapeType);        System.out.printf("Shape perimeter: %s%n",shape1.getPerimeter());        System.out.printf("Shape area: %s%n",shape1.getArea());        Shapeshape2=ShapeFactory.createSquare(2d);        System.out.printf("Shape perimeter: %s%n",shape2.getPerimeter());        System.out.printf("Shape area: %s%n",shape2.getArea());        Shapeshape3=ShapeFactory.createCircle(2d);        System.out.printf("Shape perimeter: %s%n",shape3.getPerimeter());        System.out.printf("Shape area: %s%n",shape3.getArea());    }}
Main-factory.java

Blog Bitix: Los mejores juegos gratuitos o free to play de PC, consolas y móvil

$
0
0

Para jugar no hace falta comprar los juegos en el mismo momento en que los juegos se publican, en poco tiempo bajan de precio de forma significativa. Pero incluso hay muchos juegos de muy buena calidad que son completamente gratuitos, los hay para todas las plataformas ya sean PC, consolas e incluso teléfonos móviles. Hay juegos gratuitos de varios géneros ya sea de disparos, estrategia o rol, algunos tienen mecánicas de juegos de varios de estos géneros.

El sector de los videojuegos es más grande a nivel económico incluso que los sectores del cine y otros tipos de espectáculos deportivos con ámbito mundial. Son muchos los juegos que se lanzan a lo largo del año para las diferentes plataformas de videojuegos, ya sea en PC, consolas y más recientemente también para los dispositivos móviles o smartphones.

Una buena parte de los videojuegos tiene un precio elevado al inicio de su comercialización, sin embargo, al cabo de unos meses o un año reducen su precio considerablemente junto con los descuentos y ofertas periódicas que se publican en cada una de las plataformas.

Algunos juegos incluso son gratuitos, su modelo de negocio se basa en tener un gran número de jugadores y ofrecen compras integradas que permitan conseguir algunos recursos que proporcionen alguna pequeña ventaja o progresar más rápido. Algunos de estos juegos son conocidos como pagar para ganar o pay-to-win o pagar para progresar o pay-to-progress en los que aunque no es imprescindible, el querer ganar o progresar es más difícil o requiere mucho más tiempo a los jugadores que no realizan compras en el juego.

Hay juegos gratuitos o free-to-play para todas las plataformas en las que se pueden jugar, que sean gratuitos no quiere decir que sean peores, muchos de los free-to-play de los los incluídos en este artículo son juegos que están al mismo nivel de los juegos de pago. Además son juegos que para ampliar el número de jugadores que pueden jugarlos no tienen unos requisitos gráficos elevados.

Hay juegos gratuitos de varios géneros y objetivos aunque la mayoría tienen en común requerir jugar con otros jugadores a través de internet, en equipo contra otro grupo de jugadores y un componente de mejorar para enganchar a continuar jugando.

Algunos de estos juegos son competitivos en el que el objetivos es derrotar al equipo adversario, en los que se juega en equipo y no depende únicamente de la habilidad propia la regla más importante para afrontar las partidas es intentar hacerlo siempre lo mejor posible, por muy bueno que sea un jugador si el resto de compañeros tienen mala suerte, no son hábiles o el algoritmo de emparejamiento o match making genera una partida contra personajes que tienen ventaja es más difícil ganar y por ello no conviene frustrarse.

Contenido del artículo

Los mejores juegos gratuitos para PC y consolas

La mayoría de juegos están disponibles tanto para PC como para consolas, en algunos casos aunque el juego tenga el mismo nombre la versión para consolas es una adaptación del juego en PC ambientado en el mismo mundo pero una versión más reducida. Cada persona tiene motivos para preferir jugar en PC o jugar en consola.

De disparos

Los juegos gratuitos del género de disparos o shooters son bastante populares, hay varios gratuitos en los que juegan algunos millones de personas. Aunque se pueden jugar de forma individual o en equipo con otras personas algunos están desarrollados con la intención de jugar en equipo con amigos.

FortniteApex LegendsDestiny 2

Fortnite, Apex Legends y Destiny 2

Counter-Strike: Global OfensiveCall Of Duty®: Infinite Warfare

Counter-Strike: Global Ofensive y Call Of Duty®: Infinite Warfare

Estrategia por equipos

Estos juegos requieren jugar en equipo contra otro equipo en una batalla con un tiempo limitado de duración, en función de juego es posible elegir el personaje al que se encarna que tiene unas habilidades únicas respecto a otros personajes y que lo hace más adecuado en ciertas situaciones de batalla pero quizá más vulnerable en otras batallas o contra otros personajes.

Del juego World of Warhips he escrito un par de artículos describiendo en que consiste el juego y una pequeña guía con la estrategia básica para las batallas. Aunque los artículos tratan sobre la versión para consola que tiene varias diferencias de la versión del juego para PC, las mecánicas y estrategía es en gran medida similar.

League of LegendsDota 2World of Warships

League of Legends, Dota 2 y World of Warships

World of TanksWar Thunder

World of Tanks y War Thunder

Estrategia individual

En estos juegos se juega contra otros jugadores pero se hace en partidas uno contra uno.

HearthstoneAuto ChessMagic The Gathering

Hearthstone, Auto Chess y Magic The Gathering

Rol

El género de rol y los MMORPG es otro estilo de juegos muy popular entre los juegos gratuitos. En el aspecto de rol permiten mejorar el personaje con nuevas habilidades, subir de nivel para hacerlo más poderosas, varios tipos de personajes entre los que elegir y conseguir mejores armas y armaduras para entrar en combate con enemigos cada vez más poderosos.

Path of ExileAlbion Online

Path of Exile y Albion Online

Otros

Otros juegos muy conocidos son los siguientes, estos están en varias categorías de juegos.

DauntlessNeverwinterDungeon Defenders II

Dauntless, Neverwinter y Dungeon Defenders II

Heavy Metal MachinesRocket League

Heavy Metal Machines yRocket League

Los mejores juegos gratuitos para móvil

Los dispositivos móviles también son una plataforma utilizable para jugar y varias empresas se dedican en exclusiva a esta plataforma de juegos. Son juegos con partidas más cortas más adaptadas a jugar en momentos esporádicos, su ventaja es que se puede jugar a ellos en cualquier lugar, simplemente hace falta tener un poco de tiempo disponible.

Clash RoyaleBrawl StarsPUBG

Clash Royale, Brawl Stars y PUBG

Candy CrushClash of ClansAmong Us

Candy Crush, Clash of Clans y Among Us

Genshin ImpactPlants vs. ZombiesTeamfight Tactics

Genshin Impact, Plants vs. Zombies y Teamfight Tactics

Otros juegos con precio reducido

También hay juegos que aunque no son gratuitos al tener unos años desde su publicación en ofertas puntuales es posible comprarlos a un precio muy reducido entre 3 € y 20 €, incluso juegos que en su momento eran la última novedad muy esperada y que fueron publicados con un precio de lanzamiento de 70 €. Hay páginas que monitorizan el precio de las tiendas y permiten encontrar las mejores ofertas de juegos para PC y consola.

En las tiendas digitales de Steam, Epic Store, GOG y PS Deals es posible comprarlos y ver los juegos en oferta.

Variable not found: Enlaces interesantes 444

$
0
0
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.

    Picando Código: Boletín de ILDA – Datos: los tuyos, los míos y los de todas las personas

    $
    0
    0

    Comparto el boletín de noticias de ILDA – Iniciativa Latinoamericana por los Datos Abiertos, con noticias interesantes de Datos Abiertos y el uso de datos en México, Guatemala, Brasil y el resto de América Latina. Un recorrido en materia de datos en América Latina…

    ILDA – Iniciativa Latinoamericana por los Datos Abiertos

    Datos: los tuyos, los míos y los de todas las personas

    Los debates sobre el uso de datos, en particular datos biométricos (datos que te identifican y no puedes cambiar como tus huellas), siguen estando muy presentes en la región, como demuestra la situación de México, donde el gobierno aprobó una polémica regulación. SocialTic -una organización mexicana- lo explica de forma clara y divertida Aquí.

    Lo que no es tan divertido es la compleja situación de Guatemala en materia de acceso a la información pública, como documenta este informe de la organización Artículo 19. Acceder a datos puede seguir siendo una actividad muy riesgosa.

    En Brasil, el gobierno aprobó una nueva ley que estructura varios servicios digitales y además se prevé la posibilidad de cobrar por brindar datos públicos a entidades privadas. Esta regulación contradice los principios generales de datos abiertos y puede tener serios impactos en el desarrollo de pequeñas y medianas empresas, así como para la transparencia, como argumenta Fabro Steibel -un investigador local- en este artículo.

    Afortunadamente, varias organizaciones se opusieron y el artículo fue vetado por la Presidencia. No tuvo la misma suerte un artículo en una nueva ley de contrataciones, que dificultará el acceso a notas fiscales ya que obstaculiza los esfuerzos de usos de datos para transparentar el gasto público, como lo indica la Fundación para el Conocimiento Abierto en Brasil.

    Es cada vez más evidente que necesitamos formas integrales para pensar los datos. Por ejemplo, no pensamos demasiado en cómo se producen y se deja peligrosamente a muchas personas por fuera o se incluyen en condiciones de vulnerabilidad, como argumenta en este artículo Silvana Fumega -nuestra Directora de Investigación y Política-. A modo de ejemplo, el proyecto Libre de Ser, de Hivos América Latina, se encuentra compartiendo los primeros hallazgos del mapeo de datos sobre violencia hacia las personas LGTBIQ+, en 5 países de América Central, liderado por nuestra colega Hassel Fallas.

    Apertura, privacidad y uso de datos están conectados. En esfuerzo conjunto con una red global, ILDA ha tomado el liderazgo del Barómetro Global de Datos cuyo manual (borrador) se encuentra disponible para recibir retroalimentación. En esa misma línea, nuestros colegas de IDRC junto al Banco Mundial se encuentran promoviendo una discusión informada sobre un nuevo contrato social en la era de los datos, donde contribuimos también con este reporte.

    No todas las discusiones de datos pasan por grandes debates a nivel nacional. Abrealcaldias de la Fundación Ciudadanía Inteligente, trabaja en estrategias de apertura de municipios. Compartimos con ellos un encuentro y también parte del trabajo que Florencia Serale, Juan Belbis y Andrea Barenque produjeron sobre la implementación de estrategias de datos abiertos a nivel subnacional.

    Y con los datos, construimos cosas…

    Por otro lado, la inteligencia artificial continúa dando de qué hablar en múltiples frentes. La organización Derechos Digitales ha publicado una serie de casos de estudio sobre la intersección entre estándares de derechos humanos y usos de la Inteligencia Artificial y desde el proyecto Empatía seguimos explorando el uso de la IA en el sector público en nuestras llamadas de comunidad.

    Finalmente fue mayo y para quienes son entusiastas de la saga de Star Wars (#Maythe4thbewithyou), le dejamos un buen ejercicio de data science de ese universo. Que la fuerza les acompañe. 🙂

    Para más información de ILDA puede visitar su página web o seguirles en Twitter.

    El post Boletín de ILDA – Datos: los tuyos, los míos y los de todas las personas fue publicado originalmente en Picando Código.

    Variable not found: Crear bloques de código Razor reutilizables en Blazor con Render Fragments

    $
    0
    0
    Blazor

    Durante la implementación de páginas o componentes Blazor en archivos .razor, es relativamente frecuente encontrarse con casos en los que nos interesa reutilizar un bloque de código Razor en más de un punto. 

    Por ejemplo, observad el siguiente código:

    <h1>Todo list</h1>
    <h2>Pending tasks</h2>
    <ul>
    @foreach (TodoItem item in TodoItems.Where(i=>!i.IsDone).OrderBy(i=>i.Priority))
    {
    <li>@item.Task, owned by @item.Owner and created at @item.CreatedAt</li>
    }
    </ul>
    <h2>Finished tasks</h2>
    <ul>
    @foreach (TodoItem item in TodoItems.Where(i=>i.IsDone).OrderBy(i=>i.DateFinished))
    {
    <li>@item.Task, owned by @item.Owner and created at @item.CreatedAt</li>
    }
    </ul>

    En el código anterior, podemos ver claramente que estamos repitiendo los dos bloques de código encargados de mostrar los elementos de cada una de las listas, por lo que, si en el futuro quisiéramos cambiar la forma de mostrar un TodoItem, tendríamos que modificar el interior de los dos bloques. Es frecuente en estos casos optar por crear un nuevo componente que se encargue de ello, por ejemplo, llamado TodoListItem:

    <li>@Item.Task, owned by @Item.Owner and created at @Item.CreatedAt</li>
    @code {
    [Parameter]
    public TodoItem Item { get; set;}
    }

    De esta forma ya tendremos el código de renderización del TodoItem centralizado y podremos simplificar el bloque anterior eliminando la duplicidad:

    <h1>Todo list</h1>
    <h2>Pending tasks</h2>
    <ul>
    @foreach (TodoItem item in TodoItems.Where(i=>!i.IsDone).OrderBy(i=>i.Priority))
    {
    <TodoListItem Item="item" />
    }
    </ul>
    <h2>Finished tasks</h2>
    <ul>
    @foreach (TodoItem item in TodoItems.Where(i=>i.IsDone).OrderBy(i=>i.DateFinished))
    {
    <TodoListItem Item="item" />
    }
    </ul>

    Aunque conceptualmente la solución que hemos implementado es correcta, introduce un problema en nuestra aplicación: por el mero hecho de querer evitar la duplicación de código, estamos introduciendo en la página un número indeterminado de componentes, lo cual podría afectar drásticamente a su rendimiento.

    Por llevarlo al extremo, imaginad que esas listas tienen miles de elementos. En este caso, en nuestra página estaríamos introduciendo miles de componentes, con lo que esto implica:

    • Deberían instanciarse miles de componentes (objetos).
    • Deberían ejecutarse los eventos del ciclo de vida de cada componente al crearlos, inicializarlos, renderizarlos, etc.
    • Mientras se encuentren en la página cada componente ocuparía memoria, ya sea en cliente (Blazor WebAssembly) o en servidor (Blazor Server).

    Esto podría llegar incluso a hacer una página inutilizable, por lo que es importante disponer de otros métodos para crear y reutilizar bloques de código HTML sin necesidad de crear componentes. Esta es una de las utilidades de los render fragments.

    Introducing Render Fragments

    Los fragmentos de renderización, o render fragments, son delegados reutilizables que permiten introducir contenido en páginas u otros componentes Blazor. Los hemos visto ya algunas veces por aquí, como cuando echamos un vistazo a los componentes con cuerpo y componentes genéricos.

    Estos delegados reciben como parámetro un objeto de tipo RenderTreeBuilder, usado para configurar el contenido que deseamos insertar en la página cuando son invocados. Por ejemplo, el siguiente código muestra cómo crear un render fragment que muestra la hora actual, y cómo puede ser invocado desde el cuerpo de una página Blazor:

    @page "/time"
    <p>La hora actual es: @CurrentTime</p>
    <p>Y vuelvo a repetirla: @CurrentTime</p>
    ...
    @code {
    private RenderFragment CurrentTime = builder =>
    {
    builder.AddMarkupContent(1, "<time>" + DateTime.Now + "</time>");
    };
    }

    Podéis leer más sobre la generación de componentes usando RenderTreeBuilder en este post de Chris Sainty.

    El código anterior es lo suficientemente claro y fácil de escribir, pero aún podemos mejorarlo. Gracias a la magia del tooling de Blazor, es posible introducir código Razor directamente en el cuerpo del delegado, por lo que podríamos simplificarlo de esta forma:

    @code {
    private RenderFragment CurrentTime = __builder =>
    {
    <time>@DateTime.Now</time>
    };
    }

    Por convención, el parámetro RenderTreeBuilder del delegado debe llamarse __builder. En caso contrario, fallará en compilación.

    Estos miembros pueden ser también estáticos, por lo que podrían ser compartidos entre distintos componentes. Por ejemplo, si creásemos un archivo llamado Utils.razor con el siguiente código, todos los componentes podrían usar nuestro render fragment simplemente haciendo referencia a él a través su clase (@Utils.CurrentTime):

    @* Archivo Utils.razor *@
    @code {
    public static RenderFragment CurrentTime = __builder =>
    {
    <time>@DateTime.Now</time>
    };
    }

    Los ejemplos anteriores eran bastante sencillos, porque el contenido no dependía de ningún valor externo, pero también es posible enviar al delegado datos para que los utilice a la hora de componer la salida.

    Por ejemplo, volviendo al ejemplo con el que comenzamos este post, tiene bastante sentido enviar al delegado un objeto de tipo TodoItem para generar la descripción de cada tarea, para lo que utilizaremos en esta ocasión el tipo RenderFragment<TodoItem>:

    @code {
    private RenderFragment<TodoItem> ItemView = item => __builder =>
    {
    <li>
    @item.Task, owned by @item.Owner and created at @item.CreatedAt
    </li>
    };
    }

    La sintaxis es algo más compleja, pero básicamente se trata de un delegado que acepta un parámetro de tipo TodoItem, y retorna otro delegado, que ya es el que recibe el RenderTreeBuilder y define el contenido a retornar.

    Para utilizar este fragmento parametrizado bastaría con suministrarle el valor en el momento de realizar la llamada:

    <h1>Todo list</h1>
    <h2>Pending tasks</h2>
    <ul>
    @foreach (TodoItem item in TodoItems.Where(i=>!i.IsDone).OrderBy(i=>i.Priority))
    {
    @ItemView(item)
    }
    </ul>
    <h2>Finished tasks</h2>
    <ul>
    @foreach (TodoItem item in TodoItems.Where(i=>i.IsDone).OrderBy(i=>i.DateFinished))
    {
    @ItemView(item)
    }
    </ul>

    ¡Y esto es todo! Espero que os haya resultado interesante y os sea de utilidad para mejorar vuestras aplicaciones Blazor :)

    Publicado en: www.variablenotfound.com.

    Picando Código: Repasando a un año de pandemia

    $
    0
    0

    Repaso pandemia

    Hace poco más de un año estaba empezando a encontrarme en esta nueva situación de pandemia mundial. Aislamiento social, distanciamiento físico, y mucho tiempo encerrado en mi apartamento. Una de las tantas cosas a las que acudí para no perderme completamente en la desesperación existencial, fue aprovechar más este rincón de la internet. Empecé escribiendo un post que titulé de manera bastante directa Escribiendo en tiempos de pandemia. Me alegro de haberlo publicado porque hoy me permite recordar un poco donde estaba hace un año y ver cómo fueron cambiando las cosas. Es una de las buenas razones para tener un blog.

    En ese post decía:

    Para tratar de sobrellevar la cosa, me puse como meta empezar a escribir más seguido en este blog y publicar (porque si es por sumar cantidad de borradores, ese número está en constante aumento). Voy a tratar de publicar algo por más que no esté relacionado a lo que generalmente escribo por acá, y si eso genera algún tipo de interacción con alguien más a través del blog, mejor todavía.

    Me alegro de ver que mantuve un ritmo de escritura bastante alto. No siempre escribiendo sobre programación, software libre, la industria o lo que sea. Dada la situación actual ya me costaba lo suficiente enfocarme en el trabajo y mantener cierto tipo de orden en la vida diaria. Creo que en parte por eso a la hora de escribir tiendo a concentrarme en cosas más generales. Pero siempre que encuentro algo técnico que me motiva a escribir, como los “mini piques” que vengo publicando, lo aprovecho.

    Por si leyeron ese post en su momento y se lo estaban preguntando, al final terminé tirando la caja 🙁

    Lo que vengo considerando un éxito a nivel personal es la nueva serie de posts que denominé 7 días en el Picandoverso. Que debo recordar está basado en una idea de 2018: Siete días en el Megaverso, que a su vez es una idea robada a mi amigo Nacho Alcuri que solía escribir una columna llamada “Siete días en el multiverso”. Si bien surgió del mismo lugar, el formato mismo fue evolucionando y cambiando, pero al día de hoy llevo 16 semanas seguidas publicando al menos un post por semana en el blog gracias a esa “serie”.

    Escribir éstos posts me distrae, me da algo para hacer, y me entretiene. Hay veces que la parte que más disfruto es la de crear la imagen para el post. En 3 de los primeros posts usé imágenes de dominio público disponibles en internet como fondo general. Pero después que usé una foto de la cámara de mi teléfono, me di cuenta que era mucho mejor usar una foto mía sacada en los últimos 7 días porque es todavía más parte de mi universo. Y así además de ir reflejando lo que miraba/leía en la semana, también dejaba un registro audiovisual de lugares donde había estado. Por suerte he salido de mi apartamento todos los días, pudiendo sacar alguna foto del exterior…

    En momentos me puse más existencial y filosófico, y escribí La conciencia en la pantalla. En mis caminatas a veces me distraigo con la música, otras veces mi mente empieza a divagar y termino escribiendo posts como ese. Tendría que sacar notas o algo para escribir más de esas conversaciones que tengo conmigo mismo, por lo menos para volver a leerlas yo mismo en el futuro. Pero lamentablemente todavía no tengo la habilidad de escribir y caminar a la vez como hace cierto amigo escritor.

    En todo este tiempo escribí al menos un blog post del estilo que escribía antes, donde le dedico un buen rato de investigación y trabajo técnico. De ahí surgió este post sobre distribuciones de Emacs. Pero no fue suficiente como para sentirme satisfecho. Este tipo de posts llevan bastante tiempo y trabajo, y la mayoría mueren en mi lista de borradores antes de ser publicados. Son los posts que me dejan más conforme después de publicados, siempre aprendo escribiéndolos y si a alguien le terminan sirviendo, mucho mejor. Pero son los más difíciles de escribir por la inversión de tiempo que implican. Fueron y vinieron cientos de ideas para posts que nunca se llegaron a escribir o no alcanzaron suficiente impulso para salir de “Borradores”.

    Uno de los recursos a los que acudí ni bien empezado todo esto, era la lectura. En el “antes”, venía leyendo libros a un ritmo bastante bueno. Logré leer un par de libros empezado el aislamiento: Abolish Silicon Valley por Wendy Liu y The Power por Naomi Alderman. La crisis de los 38 por Ignacio Alcuri fue el último libro que leí justo antes que explotara la pandemia. Después de eso pasé meses en los que empezaba libros y los dejaba a los pocos capítulos, tengo algunos leídos hasta poco más de la mitad. Cuando los vuelva a leer voy a tener que empezar de cero de nuevo. Me ha costado mucho mantener la motivación en una misma cosa por tiempos prolongados. Algo que en general es difícil, estando en esta situación de ansiedad y estrés constante con incertidumbre permanente, lo hace todavía peor.

    El último libro que leí entero fue “No one is too small to make a difference” de Greta Thunberg, una colección de varios de sus discursos y es tremenda lectura. Pero creo que tiene menos de 100 hojas. Lo usé como motivación de poder terminar una lectura y lo disfruté. Pero libros más grandes se me fue complicando. Recientemente decidí intentar forzarme a leer de nuevo. La lectura es como ejercitar, se va haciendo más fácil a medida que lo hacemos consistentemente. Y creo que esta vez vengo bien, empecé una novela relativamente larga y me enganché, espero terminarla en breve y seguir con más libros. Mientras tanto leer cómics me ha ayudado.

    Los videojuegos siempre han sido otro buen escape para mí. Durante esta pandemia me pasó lo mismo que con los libros. Hubo meses o semanas en las que me sumergía en algún videojuego y lo disfrutaba por horas. Pero también he pasado semanas o meses seguidos en los que apenas juego a algo. Me gusta tanto jugar videojuegos como hablar y escribir al respecto. Podría decir que gran parte de la inspiración de tener un blog vino de crecer leyendo revistas de videojuegos y querer hacer una. Uno de los sueños cuando era chico era eventualmente “tener un trabajo escribiendo sobre videojuegos”, y en parte con el blog lo he ido cumpliendo. No es mi trabajo, pero no necesito que sea así, me alcanza con tener mi rincón en internet donde puedo escribir sobre lo que quiero y compartir el enlace con amigos con los mismos gustos y con suerte alguien más por ahí que disfrute de leerlo.

    Uno de los posts que más disfruté escribir sobre videojuegos fue A las piñas y patadas: Jugando beat ’em ups. Hablé de varios títulos que me gustan mucho, y sin duda va a haber al menos una segunda parte con el montón de juegos del género que adquirí y otros que se vienen en breve. También disfruté bastante de publicar el “mes de Street Fighter, mes en el que escribí sobre las películas y algunos de los títulos de la saga. Esto de crear un tema me pseudo-obligaba a escribir sobre un tema en particular en varias ocasiones durante el mismo mes. Y también me ayudó para la “parálisis de análisis” que me da a veces cuando quiero elegir qué juego jugar. Quedaron sin escribir posts sobre algunos de los títulos de la saga que jugué, pero Febrero de 2022 está a la vuelta de la esquina.

    Algo de lo que estoy muy agradecido con todo esto de los videojuegos es que entre el alcance del blog, y al seguir publicando posts del tema, me empezaron a contactar empresas de difusión de videojuegos para hablar sobre sus juegos. ¡El sueño se empieza a hacer más real! Para ser sincero en el blog, acepto únicamente juegos que me llaman la atención o que quiero jugar. Así que es raro que escriba sobre un juego que no me gusta o me aburra.

    A más de un año de ese primer post sobre pandemia, algunas cosas parecen estar mejorando. Pero esto todavía no se terminó, y todavía queda mucha incertidumbre por delante. Por lo pronto pienso seguir escribiendo por acá. Hace más de 10 años que este blog está online y es difícil imaginarme no tener un lugar donde escribir algo y publicarlo, aunque sea cada tanto. Disfruto la práctica de escribir y me sirve un poco de catársis. Y está bueno dejar el registro de cómo van pasando las cosas y recordar en qué estaba pensando en tal o cual momento.

    Si llegaste hasta acá, gracias por leer, cuidate y cuidá a los demás.

    El post Repasando a un año de pandemia fue publicado originalmente en Picando Código.

    Picando Código: Siete días en el Picandoverso – Mayo III: New Generation

    $
    0
    0

    Decimo séptima entrega de esta serie de posts que repasan los últimos 7 días en lo que respecta a tecnología, Ruby, Cómics, Videojuegos y demás. Esta vez desde el 12 hasta el 19 de mayo de 2021 inclusive:

    Siete días en el Picandoverso – Mayo III: New Generation

    Tecnología

    🖥KDEcambió el nombre de su paquete de aplicaciones, bibliotecas y plugins. Solía llamarse simplemenet KDE, después KDE SC, y recientemente KDE Applications. Ahora se llama KDE Gear, y recientemente publicaron un release nuevo: 21.04.1. Voy a tener que actualizar mi KDE Neon a ver qué tal estas nuevas versiones.

    ⌨System76, una de las marcas más conocidas que proveen computadoras de escritorio y laptops con Linux pre-instalado, sacó un teclado mecánico llamado “Launch”. Es completamente personalizable y configurable, funciona en Linux, Windows y macOS y es de código abierto. Se ve bastante lindo y estoy necesitando un buen teclado, pero el precio es un poco elevado, empezando en USD 285.

    🔐1Password publicó finalmente su cliente oficial para Linux. En el post comentan bastante sobre las características de la aplicación. Usé 1Password bastante en trabajos anteriores y recuerdo que me molestaba bastante no tener una aplicación nativa. Parece que no sólo publicaron la aplicación para dejar contentos a usuarios de Linux, le pusieron todo. Está desarrollada en Rust en el backend y la interfaz de usuario está escrita en React interactuando a través de Neon con el backend Rust. Está soportada en Debian, Ubuntu, CentOS, Fedora, Arch Linux, Red Hat Enterprise Linux y Snap, pero también está disponible el tar.gz. También publicaron que para devolver un poco a la comunidad de código abierto, están patrocinando algunos proyectos además de haber liberado algunas bibliotecas de desarrollo propio, y proveer el servicio de manera gratuita a proyectos de código abierto. También está disponible un post más técnico (¡con diagramas y estadísticas!): Behind the scenes of 1Password for Linux

    📷Amazon Ring es la red de vigilancia civil más grande nunca vista en Estados Unidos según The Guardian. La gente que no leyó 1984 de George Orwell sigue comprando dispositivos de vigilancia y los instala en sus hogares.

    📝 Noticias de Emacs de esta semana Emacs News.

    Ruby

    🛤 El incidente que hubo en Basecamp desencadenó en mucha charla y controversia, particularmente con Rails y su futuro. Richard Schneeman, una de las tantas personas que ha contribuido mucho a Rails, escribió un artículo explicando cómo funciona el desarrollo de Rails desde su punto de vista, y observa varias ideas al respecto: The room where it happens: How Rails gets made.

    📨 En Turbocharge HTTP Requests in Ruby, Dmitry Ishkov explica cómo mejorar los pedidos HTTP desde Ruby aprovechando la característica keep-alive de HTTP.

    Disponible nueva versión de Rubocop, 1.15 con muchos bugs corregidos y algunas mejoras.

    💎 Ruby 3.1 agrega Array.intersect? que dados 2 arrays x e y, nos permite reemplazar x.intersection(y).empty? con x.intersect?(y). Podemos leer más en este post de BigBinary, parte de su serie de posts con cosas nuevas en Ruby 3.1.

    Comics

    🟢 Ya se sabía, pero Al Ewing confirmó que el número 50 de The Immortal Hulk va a ser el final de la serie. Por un lado está bueno que haya podido contar la historia que quiso contar y la termine antes de perder calidad. Ha sido excelente desde el primer número y es una serie que recomiendo mucho. Por el lado negativo, va a ser difícil seguir una de las mejores series en la historia de Hulk para la persona a cargo de escribirlo, y me da miedo pensar quién será. Leí un comentario por ahí sin ningun fundamente que Chip Zdarsky iba a ser el siguiente autor, y me encantaría. Pero no es más que un posteo al azar por internet…

    Videojuegos

    Se siente como que hace mucho tiempo que no se agregaban títulos nuevos a la colección de NES y Super NES de Nintendo Online. Hoy Nintendo publicó el video de los títulos nuevos que se vienen el 26 de Mayo. Joe & Mac tenía idea que ya estaba, pero no, era Joe & Mac 2. Creo que lo novedoso es Magical Drop 2, un juego que nunca salió fuera de Japón. Está interesante probar juegos que nunca hubiera jugado de otra manera, pero me sigue pareciendo como que Nintendo está rascando el fondo de la olla y publicando los pocos juegos que encuentra. Podrían incluir más plataformas de Nintendo en el servicio, o títulos más conocidos. De última es gratis con el servicio Nintendo Online, pero se supone que son para justificar el precio también 🤷🏻‍♂️

    YouTube Video

    Películas/TV

    Salió un trailer de la cuarta entrega de Hotel Transylvania. Las primeras me resultaron entretenidas, así que seguramente mire esta cuando salga:

    YouTube Video

    Y hasta acá llegamos. Un “7 días” un poco corto, pero creo que me saqué las ganas de escribir esta semana con el repaso de la pandemia, que vendría a ser un post en el mismo universo que los 7 días. Porque si bien el blog Picando Código es un universo, a su vez distintos posts pertenecen a distintos universos dentro de ese mega(ultra|hiper|súper|multi)-universo. Algo así como el universo bolsillo que creó Franklin Richards a finales de los 90, creo que fue por 1997 o por ahí (no vale googlear) cuando Onslaught asesinó a los Avengers y Fantastic Four y renacieron todos en Heroes Reborn y después volvió todo a como estaba antes en Heroes Return. No confundir con el cómic actual “Heroes Reborn” de Marvel que no estoy leyendo porque me tienen cansado los mega eventos y este en particular viene de Jason Aaron en Avengers, y lo que viene escribiendo en ese título es horrible.

    Pueden seguir los posts de Picando Código por RSS, Twitter (cuenta únicamente con posts del blog) y canal de Telegram. También estoy en Twitter y Mastodon, donde además de compartir lo que se publica en el blog publico alguna cosa más.

    Otros 7 días en el Picandoverso:

    El post Siete días en el Picandoverso – Mayo III: New Generation fue publicado originalmente en Picando Código.

    Blog Bitix: Conceptos teóricos generales de los procesadores de computadora

    $
    0
    0

    Los procesadores es uno de los principales circuitos integrados que posee toda computadora. Es el encargado de ejecutar el código de los programas y gobierna el resto de componentes. A pesar de su pequeño tamaño son elementos con gran complejidad, para aumentar su rendimiento se aplican diferentes técnicas que los procesadores han incorporando de forma paulatina. Al hablar de procesadores hay varios conceptos que es necesario comprender.

    Intel

    AMD

    ARM

    Los procesadores actuales tienen una capacidad de cómputo en varios órdenes de magnitud a la de tan toso unas décadas antes. Buena parte de ese rendimiento es conseguido a través de la mejora de los procesos litográficos que permiten fabricar transistores cada vez más pequeños. Con transistores más pequeños se mejoran varios aspectos vitales de los procesadores entre ellos se reduce su consumo de energía, permiten añadir más transistores en el mismo espacio físico para implementar cachés más grandes o implementar conceptos que mejoren el rendimiento y finalmente son más baratos de fabricar.

    Desde la aparición de los circuitos integrados que sustituyeron a las válvulas de vacío, según la ley de Moore cada dos año en número de transistores que incluye un procesador se duplica, esta ley se ha estado cumpliendo hasta ahora y por consiguiente la potencia de los procesadores. Uno de los primeros microprocesadores de Intel como el 4004 tenía únicamente 2300 transistores a 10 micrómetros, un Intel Core o un Ryzen llegan superan los 2 mil millones de transistores a 7 nanómetros.

    Varios de los conceptos teóricos aplicados en los procesadores está destinado a aumentar el rendimiento en monohilo, así ha sido hasta el desarrollo de los procesadores con múltiples núcleos tanto de Intel como de AMD y también de ARM. Desde el año 2010 el aumento de rendimiento de los procesadores también se consigue mediante la inclusión de mayor número de núcleos, para tareas paralelizables. Un amyor número de núcleos consigue un aumento de rendimiento en una proporcion similar a la proporción de aumento de núcleos. Crear procesadores multinúcleo es otra forma de seguir aumentando el rendimiento de forma más sencilla que mejorando aún más el rendimiento en monohilo. Los procesadores actuales van desde los 4 núcleos hasta cantidades como 16 para ordenadores de escritorio y hasta 64 o más para computadoras destinadas a hacer funciones de servidor.

    Procesador Intel 4004Procesador Intel 8086Procesador Pentium

    Procesadores Intel 4004, 8086 y Pentium

    Procesador AMD Athlon XPProcesador Sun UltraSparc IIProcesador RISC-V

    Procesadores de AMD, Sun Ultra Sparc y SiFive RISC-V

    Los siguientes apartados son una explicación sencilla, básica y resumida de los conceptos que se utilizan en los procesadores de los que se puede. Esta información está ampliada en la wikipedia.

    Contenido del artículo

    Arquitectura

    Los computadores siguen una organización definida en el modelo de von Neumann en el que una computadora consta de:

    • Una unidad de procesamiento que contiene lógica de aritmética y los registros del procesador.
    • Una unidad de control que contiene un registro de instrucción y un contador de programa.
    • Memoria que almacena los datos y las instrucciones del programa.
    • Almacenamiento externo.
    • Mecanismos de entrada y salida.

    Esquema de computadoraArquitectura de Von Neumann

    Esquema de computadora y arquitectura de Von Neumann

    Componentes de un procesador

    Los componentes son los siguientes:

    • Caché: es una memoria pequeña comparada con la memoria principal o el almacenamiento secundario pero mucho más rápida que estas.
    • Unidades funcionales: la unidad de lógica aritmética o ALU permite realizar operaciones del cálculo matemático y binarias, la unidad de coma flotante o FPU permite realizar operaciones en coma flotante. La unidad de predicción de de saltos permite predecir cuál será el resultado de una condición, otras unidades son la unidad de generación de direcciones o AGU, la load–store unit translation lookaside buffer o TLB permite traducir direcciones virtuales a direcciones físicas y es parte de la unidad de gestión de memoria o MMU. El controlador integrado de memoria o IMC gestiona las transferencias entre la memoria principal y el procesador.
    • Registros: son unas pequeñas zonas de memoria en las que operan las instrucciones del procesador.
    • Unidad de control: es la encargada de enviar las señales a las otras unidades del procesador.

    Tamaño de palabra

    El tamaño de palabra es la unidad de datos nativa del procesador media en número bits. Los registros del procesador suelen tener tener el mismo tamaño de palabra que el procesador y la máxima cantidad de información que se suele poder transferir desde y a la memoria en una única operación coincide con el tamaño de palabra. Los procesadores x86-64 tiene un tamaño de palabra de 64 bits.

    Endianness

    La arquitectura de un procesador define cómo se almacenan los datos en memoria, puede ser de dos formas litte-endian o big-endian. En la primera el byte de datos menos significativo se almacena en la dirección de memoria más baja, por el contrario en big-endian el byte más significativo se almacena en la dirección más baja.

    Que una arquitectura de procesador elija entre estos dos tipos de endianness no es significativo, simplemente se ha de mantener de forma consistente al almacenar, cargar los datos y transmitirlos a otras computadoras.

    En el protocolo IP se utiliza big-endian, por el contrario el la mayoría de procesadores de arquitectura de procesadores como x86, ARM y RISC-V utilizan litte-endian.

    Big endianLittle endian

    Big y little endian

    Almacenamiento de computadora, NUMA y UMA

    El significado de las siglas de NUMA son Non-uniform memory access y de UMA son Uniform memory access, en el primer caso el tiempo de acceso a memoria no es uniforme y depende de la ubicación del la memoria relativa al procesador, en este caso para un procesador es más rápido acceder a su memoria local que a la memoria de otro procesador.

    Los procesadores actuales son significativamente más rápidos que la memoria principal por ello suelen tener pequeñas cachés de memoria más rápidas, al mismo tiempo se evita que varios procesadores compitan por el acceso a la memoria principal. Este modelo NUMA mejora el rendimiento pero ocasiona el problema que cuando un procesador requiere los datos de otro ocasiona que los datos han de ser movidos con una penalización en la latencia.

    AMD lo implementó el almacenamiento NUMA en los procesadores Opteron con HyperTransport e Intel con QPI.

    Memoria y jerarquía de memoria

    La memoria contiene los datos y las instrucciones de los programas, el procesador lee los datos de la memoria los carga en las cachés y los registros del procesador, realiza el cálculo deseado y los resultados son almacenados de nuevo en la memoria principal.

    Hay cuatro niveles de almacenamiento.

    • Interno: formado por los registros del procesador y sus cachés internas.
    • Memoria principal: formada por la memoria RAM volátil cuyo contenido se pierde si se apaga la computadora.
    • Secundaria: es una memoria persistente conectada a la computadora y que conserva los datos aún después de apagar la computadora.
    • Terciaria: es una memoria que se puede extraer y conectar del equipo bajo demanda.

    La memoria se puede diferenciar en las siguientes propiedades:

    • Volatilidad: si persiste al apagado de la computadora.
    • Mutabilidad: si es posible cambiar su contenido.
    • Accesibilidad: el modo de lectura permitido si es aleatorio o ha de ser secuencial.
    • Direccionamiento.
    • Capacidad: el tamaño de la memoria.
    • Rendimiento: el tiempo de acceso necesario.
    • Uso de energía.
    • Seguridad.
    • Vulnerabilidad y confiabilidad.

    La diferencia de velocidad de procesamiento de la CPU y la velocidad de acceso a la memoria principal y secundaria hace que para aumentar el rendimiento de la CPU sea necesario una memoria pequeña pero más rápida que la memoria principal en el procesador. En la jerarquía de memoria en el nivel superior su latencia es inferior, su velocidad de transferencia es mayor pero su tamaño es menor. Si la tasa de aciertos en la caché es alta el procesador aumenta significativamente al no ser penalizado por la latencia de acceso a la memoria principal.

    Jerarquía de cachéJerarquía de caché

    Jerarquía de caché

    Memoria virtual

    La memoria principal del sistema es limitada aun siendo de varias decenas de GB. La memoria virtual es una técnica que permite ampliar la memoria del sistema utilizando el siguiente nivel de la jerarquía de memoria , normalmente el almacenamiento persistente de mayor capacidad.

    El sistema operativo con ayuda de funciones de gestión de memoria implementadas en el procesador se encarga de mover fuera de la memoria principal la que no se está utilizando y de cargar en la memoria principal la que se necesite.

    Microcódigo

    El microcódigo es un software que traduce las instrucciones en operaciones a ejecutar en el chip. Esta traducción de instrucciones permite los desarrolladores de chips flexibilidad en la implementación. Por ejemplo, en una versión mejorada del chip se puede soportar el mismo conjunto de instrucciones que versiones anteriores o soportar diferentes conjuntos de instrucciones en el mismo chip.

    Arquitecturas de conjunto de instrucciones

    La arquitectura del conjunto de instrucciones o ISA es el modelo abstracto de una computadora, define los tipos de datos soportados, los registros, el hardware de soporte para la memoria principal y el modelo de entrada y salida. También forma parte el conjunto de instrucciones soportadas y su codificación binaria.

    El conjunto de instrucciones es una de las características mas relevantes de un procesador, los programas compilados a código máquina están codificados en forma binarias según las instrucciones de una ISA.

    Instrucción addi de un procesador MIPS

    Instrucción addi de un procesador MIPS

    Conjuntos de instrucciones

    El conjunto de instrucciones soportados por un procesador depende de su arquitectura. La arquitectura más popular en ordenadores de escritorio es la x86, en los dispositivos móviles como teléfonos inteligentes es ARM, otras arquitecturas alternativas son RISC-V que es una arquitectura abierta sin costes de licencia, otras son MIPS, POWER y Sparc.

    Los lenguajes de programación de alto nivel como C traducen los programas a un binario ejecutable por la computadora, Java traduce los programas en la compilación a un bytecode independendiente de la arquitectura del procesador y es en tiempo de ejecución cuando se realiza la traducción del bytecode a las instrucciones que entiende el procesador.

    Dos aproximaciones al conjunto de instrucciones son CISC que proporciona un conjunto amplio de instrucciones complejas y RISC que proporciona un conjunto reducido de instrucciones más simples. El equivalente de una instrucción CISC pueden ser varias RISC. Los procesadores CISC tienen la ventaja de hacer que los programas tengan menor tamaño pero hace que los procesadores sean más complejos, por el contrario en los procesadores RISC los programas son más grandes al necesitar más instrucciones pero los procesadores son más sencillos. La diferencia entre un procesador CISC y RISC no es muy significativa con la utilización de microcódigo.

    Las instrucciones se agrupan en las siguientes categorías:

    • Establecimiento de datos y operaciones con memoria cómo establecer un registro con un valor y mover datos de un registro a otro.
    • Operaciones aritméticas y lógicas como sumar, restar, multiplicar o dividir entre los valores de dos registros, realizar operaciones binarias o comprar dos valores.
    • Control de flujo como saltar a otro punto del programa, salto condicional o llamada a una función.
    • Instrucciones de coprocesador como cargar o almacenar datos en los registros del procesador.

    Las instrucciones single instruction multiple data o SIMD operan múltiples datos de forma paralela con una única instrucciones, esto mejora significativamente el rendimiento respecto si hubiera que ejecutar una instrucción por cada dato. Es una forma diferente de conseguir paralelismo.

    En la arquitectura x86 las instrucciones MMX, SSE y AVX son variantes de instrucciones SIMD. El primer procesador con instrucciones MMX fabricado por Intel fue el Pentium MMX. El primer procesador de Intel con instrucciones SSE fue el Pentium 3 y el primero con AVX fue a partir de la familia Sandy Bridge.

    Ciclo de ejecución del procesador

    La principal tarea de un procesador es ejecutar instrucciones, para ello el procesador sigue un ciclo de obtener la siguiente instrucción de la memoria principal según el contador del programa, decodificación en la que se determina que instrucción se ejecuta y ejecución en la que se utilizan los diferentes componentes del procesador como la unidad de lógica aritmética.

    Pipelining de instrucciones

    Los procesadores tiene varios componentes, para mantenerlos todos en funcionamiento con el objetivo de maximizar el rendimiento las instrucciones se ejecutan en varias etapas. En un momento determinado el procesador posee varias instrucciones en diferentes etapas de ejecución. Cada uno de estos pasos de ejecución es un segmento de ejecución, denominando a estos procesadores como segmentados.

    El primer procesador segmentado fabricado por Intel fue el Intel 386 con un pipeline de tres etapas.

    Un procesador como los Intel Pentium 4 llegaba a tener un pipeline de ejecución de hasta 31 etapas. El problema es que un pipeline tan largo no mejora el rendimiento cuando se producen saltos al ejecutar instrucciones condicionales y el predictor de bifurcaciones falla en el predicción, en un salto el pipeline se vacía y comienza en la primera etapa con la primera instrucción a la que se ha saltado.

    Pipeline de 4 segmentos

    Pipeline de 4 segmentos

    Hazards

    Hay varios peligros en la ejecución paralela que ha de tenerse en cuenta para un buen funcionamiento de los procesadores segmentados. Los riesgos son de tres tipos, de datos, estructurales y de control.

    En los riegos de datos una instrucción de lectura posterior a una instrucción de escritura para un dato ha de producirse después, una instrucción de lectura posterior a una de escritura para un dato ha de producirse después y dos instrucciones de escritura sobre el mismo dato ha de producirse en el mismo orden del programa.

    Los riesgos estructurales consisten en que dos instrucciones en el pipeline necesiten el mismo recurso como la ALU, en este caso las instrucciones han de esperar.

    Los riesgos de control consisten en que se hayan insertado en el pipeline instrucciones que finalmente han de descartarse por una mala predicción en un salto en el programa.

    Ejecución fuera de orden

    La ejecución fuera de orden permite aprovechar los ciclos de CPU que de otra manera no se utilizarían. Con este paradigma, el procesador ejecuta las instrucciones según la disponibilidad de los datos de entrada y las unidades de ejecución, en vez de en el orden original del programa. Esto permite evitar tiempos inactivos esperando a que la instrucción precedente se complete en el caso de que sean independientes.

    Ejecución especulativa

    La ejecución especulativa es otra optimización que permite aumentar el rendimiento que consiste en ejecutar instrucciones aún antes de saber si son necesarias.

    Los programas incluyen sentencias condicionales, en función de su evaluación el flujo del programa continúa por una rama de la condición u otra, hasta no evaluarse la condición no se sabe porque rama se continúa. La ejecución especulativa ejecuta las instrucciones de ambas ramas descartando los resultados de una cuando se conoce que rama finalmente se ha seguido.

    Esta técnica aumenta el rendimiento pero con la cual se han descubierto varios problemas relativos a la seguridad con su Explicación del fallo de seguridad Meltdown y Spectre en los microprocesadores Intel que han afectado a los procesadores que la implementaron tanto de Intel, de AMD como de ARM.

    Paralelismo

    Para aumentar el rendimiento los procesadores intentan ejecutar las operaciones de forma paralela.

    Bit

    Una forma de aumentar el paralelismo es aumentar el tamaño de palabra del procesador. Un procesador con una palabra de 8 bits necesita dos ciclos para realizar la suma de dos números de 16 bits, un procesador de 16 bits solo necesita un ciclo con lo que en la práctica es duplicar el rendimiento del procesador en este tipos de operaciones.

    Escalar y superescalar

    Un procesador escalar en todo momento solo ejecuta una instrucción, en cambio un procesador superescalar ejecutar múltiples instrucciones usando varias unidades de ejecución. Los procesadores superescalares tienen varias unidades de ejecución del mismo tipo, por ejemplo un procesador superescalar tiene varias unidades ALU o de FPU. El procesador trata de mantener cada una de estas diferentes unidades con instrucciones a ejecutar. Un procesador superescalar con dos ALU es capaz de realizar el doble de operaciones por ciclo de reloj y por tanto supone duplicar el rendimiento en este tipos de operaciones.

    El primer procesador superescalar fabricado por Intel fue el Pentium.

    Multihilo

    Un procesador con procesamiento multihilo o SMT trata de mejorar el rendimiento del procesador superescalar. Cada núcleo físico es visto por el sistema operativo como dos o más núcleos lógicos, cada procesador lógico tiene sus propios registros de control sin embargo las unidades de ejecución son compartidas por los hilos. Cada hilo puede ser detenido o interrumpido de forma independiente al resto de hilos.

    El número de hilos que permite un procesador por cada cada núcleo puede ser tan simple como dos, dependiendo de la microarquitectura del procesador pueden ser un número más grande como cuatro u ocho.

    El primer procesador con hyper-threading fabricado por fue el Intel Pentium 4.

    Los procesadores y sistemas operativos conceden a los programas un tiempo de ejecución en el procesador, transcurrido el tiempo sin interrumpidos y se continua con otro proceso, el proceso no tiene el control de cuando se interrumpe su ejecución, a este estilo de compartir el recurso del procesador se le denomina multitarea preemtiva. Incluso con la velocidad de los procesadores de mononucleo en los que solo se ejecutan un solo programa la sensación es que los programas se están ejecutando de forma paralela.

    Multinúcleo

    Un procesador con procesamiento paralelo o SMP incorpora varios núcleos físicos en el mismo procesador. Cada núcleo es independiente y ejecuta un proceso en cada núcleo de forma simultánea. En un procesador mononúcleo la programación simultánea era simulada mediante la apropiación preemptiva junto con la rapidez del procesador para en la ejecución de instrucciones y cambios de contexto de un procesador a otro.

    El primer procesador multinúcleo fabricado por Intel fue el Pentium D.

    Número de núcleos

    Los primeros procesadores tenían un único núcleo o unidad de cómputo denominados single-core, posteriormente se ha implementado en un mismo procesador varios núcleos denominados multi-core.

    Los procesadores multi-core de escritorio consumno están diseñados para ejecutar eficientemente tanto código en serie como en paralelo poniendo gran énfasis en la ejecución de un único hilo, para ello dedican espacio en el procesador para implementar ejecución fuera de orden, pipelines profundos, son superescalares y tienen cachés grandes.

    Los procesadores many-core están especializados en ejecutar gran cantidad de operaciones en paralelo, para ello tienen una gran cantidad de núcleos de computación. Si un procesador muti-core tiene unos pocos núcleos al estar limitados el número de ellos por la coherencia de la caché los procesadores many-core se cuentan por miles. Las GPU son un ejemplo del procesador many-core.

    Seguridad

    Los procesadores incluyen funcionalidades con la colaboración del sistema operativo para que la computación de los programas sea segura, con el objetivo de que un programa no se apropie de toda la capacidad de computación o que la memoria de un programa esté aislada de otros programas.

    Anillos de seguridad de un procesador

    Anillos de seguridad de un procesador

    Modo protegido

    Los procesadores incluyen un modo de ejecución con privilegios especiales que son exclusiva del sistema operativo. Algunas instrucciones solo pueden ser ejecutadas en el modo protegido por seguridad.

    El primer procesador con un modo protegido fabricado por Intel fue el 386.

    Cifrado de memoria

    Para minimizar las consecuencias de una fallo de seguridad los procesadores más recientes destinados a la computación en la nube, donde el entorno de computación es compatido aún estando en ciertamedia aislado lógicamente, también incluyen funcionalidades para cifrar completamente la memoria de los datos y programas, de modo que aunque un programa tenga acceso a la memoria de otro la información al estar cifrada no sea legible.

    Rendimiento de procesador

    El rendimiento de un procesador se mide en instrucciones por ciclo o IPC, instrucciones por segundo o IPS, operaciones de coma flotante por segundo FLOPS, rendimiento por vatio o PPW.

    Una variable que impacta en el rendimiento es el número de transistores con el que está construido el procesador, a mayor número de transistores es posible incluir cachés más grandes, mayor número de núcleos y mayor número de componentes. Sin embargo, un mayor número de transistores implica una mayor cantidad de energía consumida.

    Los diseñadores de procesadores han de encontrar un equilibrio óptimo entre número de transistores, tamaño del chip, coste de fabricación, energía consumida y disipada en forma de calor y precio del procesador.

    Una mejora de los procesos litográficos que permiten crear transistores de menor tamaño es beneficioso para los procesadores ya que mejoran el número de transistores que se pueden incluir en el procesador en el mismo espacio, hacen los procesadores más pequeños, la energía consumida y el calor disipado es menor y el precio de fabricación del procesador se abarata.

    Tipos de procesadores

    La CPU es el principal componente de una computadora que se encarga de ejecutar las instrucciones del programa, otro tipo de procesador especializado son las GPU dedicadas al procesamiento de gráficos o en tareas de inteligencia artificial. Las GPU están especializadas en ejecutar gran cantidad de operaciones de forma paralela.

    Un system on chip o SoC incluye la mayoría de componentes de un sistema es un único chip en vez de estar separados. Un SoC puede incluir tanto la CPU, la memoria, los puertos de entrada/salida y otros elementos como almacenamiento secundario, la GPU y otros elementos especializados en comunicaciones y procesamiento de datos. Esto les hace más baratos que un sistema en el que los componentes están formados por chips individuales.

    Gestión de energía

    Los procesadores para reducir su consumo de energía y el calor que dispan emplean diferetnes técnicas como variar el voltaje de funcionamiento o la frecuencia de funcionamiento.


    Variable not found: Enlaces interesantes 445

    $
    0
    0
    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 / Mobile

      Otros

      Publicado en Variable not found.

      Picando Código: Pocket Bravery – nuevo juego de pelea basado en los clásicos de los 90s como Street Fighter y King Of Fighters

      $
      0
      0

      Pocket Bravery es un juego de lucha original inspirando en los clásicos como Street Fighter, Fatal Fury y King of Fighters. Los gráficos están hechos a mano en pixel art, y la estética está influenciada por los diseños de los juegos de lucha del Neo Geo Pocket como Pocket Fighters y varios más que podemos encontrar en NEOGEO POCKET COLOR SELECTION Vol. 1.

      Está siendo desarrollado por Statera Studio, un estudio de Río de Janeiro, Brasil, y buscan financiarlo con una campaña en Indiegogo.

      Pocket Bravery

      Apunta a tener una jugabilidad dinámica y responsiva, enfocada en las animaciones de los personajes con el objectivo de obtener fluidez durante las peleas. En la página de la campaña señalan por ejemplo un ataque con 22 cuadros individuales de animación. A pesar de la inspiración en leyendas del género, Pocket Bravery fue creado para ser un juego de luchas nuevo y único, con personajes originales y un sistema de combate muy interesante.

      Hay un demo disponible en Steam, y también podemos agregarlo a nuestra wishlist. Si bien por ahora está disponible únicamente para Windows, lo pude jugar perfectamente en Linux con Proton. El demo se juega súper fluido y está bastante bueno (recomiendo mirar el video al final de este post para apreciar las animaciones). Me gustó mucho la animación de los personajes y el arte de los escenarios. Los personajes tienen mucha personalidad “local”. Se caracterizan por 4 atributos en su gameplay: fuerza, velocidad, rango y dificultad. También cuentan en la pantalla de selección con una biografía que incluye su nacionalidad, nombre completo, habilidades, arquetipo y algunos de los comandos de ataque.

      Pocket Bravery

      Los dos personajes principales parecen ser Nuno y Sebastian, un brasilero y un escocés respectivamente. La “internacionalidad” del juego se siente un poco mejor que en Street Fighter, donde el brasilero Blanka hacía ruidos y gruñidos únicamente. Hay toda una historia por detrás que incluye poderes sobrenaturales y una organización criminal global. Cada personaje cuenta también con una biografía, lo que le termina dando algo de razón al por qué estas personas deciden irse a las piñas y patadas.

      Por ahora han mostrado 10 escenarios, 6 de los cuales están basados en ubicaciones reales y nos invitan a intentar reconocerlas. Entre las pantallas a elegir se encuentran Portugal, Brasil, Escocia, Nigeria, Estados Unidos, Japón, China, India y Rusia. La de Escocia me da que está inspirada en George Square en Glasgow… Los escenarios cuentan con animaciones y variaciones para cada uno de los 3 rounds, y se diseñaron para coincidir con los personajes y la historia general del juego.

      Pocket Bravery

      Las imágenes son del demo, así que la versión final puede ser distinta. Se está desarrollando con la accesibilidad en mente desde un principio, por ejemplo con efectos para personas daltónicas. Va a estar disponible en al menos 12 idiomas incluyendo Portugués, Español e Inglés.

      En cuanto al control, usa cuatro botones con dos piñas y dos patadas. Como es tradicional, podemos realizar distintas combinaciones para ejecutar poderes especiales, super especiales y ataques finales. Además de estar tan cargado de personalidad con su estilo propio, tiene varias características que lo hacen muy interesante. Cuenta con un sistema “Elemental”, donde cada personaje tiene un elemento que representa su fuerza, física o sobrenatural. Cargando las tradicionales barras podemos ejecutar ataques elementales. También cuenta con un sistema de cancelación, para cancelar ataques especiales, y el viejo y querido “Taunt” en el que provocamos al contrincante con distintos resultados según la personalidad y relación entre los personajes.

      Va a incluir los modos de pelea clásicos: Arcade, VS, Online, Entrenamiento y Combo Maker – un nuevo modo original para enseñar a principiantes de los juegos de lucha cómo realizar combos.

      Statera nos cuenta que aproximadamente entre un 50 y 60% del contenido del juego ya está terminado. Si se logra financiar a través de la campaña de Indiegogo, se va a empezar a trabajar en el modo online a partir de Julio de este año. Y alcanzada la meta, Pocket Bravery va a ser publicado para PC (Linux, Mac y Windows), Nintendo Switch, Playstation 4 y 5, XBox One/X/S durante el segundo semestre de 2022. ¡No puedo esperar a poder jugarlo en Switch!

      Si te gustan los juegos de pelea de este estilo, te invito a sumarte a la campaña en Indiegogo. Como es tradicional hay varias metas a alcanzar con más financiación, incluyendo un sistema “Tag” (el tradicional sistema de batallas dobles popularizado por títulos como KOF) y asistentes (a lo Marvel Vs Capcom), modo historia, edición de colores de personajes, versión móvil del juego, personajes extra y más. Ya me sumé a la campaña para jugarlo en Steam cuando esté disponible, pero lo espero también para Nintendo Switch.

      YouTube Video

      El post Pocket Bravery – nuevo juego de pelea basado en los clásicos de los 90s como Street Fighter y King Of Fighters fue publicado originalmente en Picando Código.

      Variable not found: Cómo saber si un objeto no es nulo (edición C# 9)

      $
      0
      0
      .NET Core

      Hace algunos años hablábamos de que la forma más correcta de determinar si un objeto es nulo en C# era utilizando el operador is:

      var invoice = _invoiceRepository.GetById(18);
      if(invoice is null)
      {
      // Hacer algo
      }

      Como vimos en su momento, esta opción era mejor que utilizar una comparación directa como invoice == null porque el operador de igualdad podía ser sobrecargado y, por tanto, su comportamiento podría ser modificado, mientras que el operador is no es sobrecargable.

      Sin embargo, al comenzar al usar esta fórmula, encontrábamos un pequeño inconveniente cuando queríamos determinar justo lo contrario, es decir, saber cuándo un objeto no es nulo, pues la sintaxis se volvía algo más pesada:

      var invoice = _invoiceRepository.GetById(18);
      if(!(invoice is null))
      {
      // Hacer algo
      }

      La introducción de los patrones de combinación and, or y not de C# 9 nos ponen la cosa bastante más sencilla. Cuando usamos esta versión del lenguaje, podemos expresar esa comparación con algo tan elegante como lo siguiente:

      var invoice = _invoiceRepository.GetById(18);
      if(invoice is not null)
      {
      // Hacer algo
      }

      Recordad que C#9 es el usado por defecto en proyectos .NET 5, pero también podemos utilizarlo con versiones anteriores de .NET Core o .NET Framework si estamos utilizando una versión actualizada de Visual Studio y configuramos el proyecto para que use la última versión disponible, bien desde el cuadro de diálogo Propiedades del Proyecto > Build > Advanced, o bien añadiendo al .csproj las siguientes líneas:

      <Project ...>
      <PropertyGroup>
      <LangVersion>latest</LangVersion>
      </PropertyGroup>
      ...
      </Project>

      Aparte, estos patrones de combinación pueden ser utilizados en otros escenarios. Los veremos más adelante, en un post donde profundizaremos en ello :)

      Publicado en Variable not found.

      Picando Código: Mini pique: Git mv y ver la historia de archivos que movimos

      $
      0
      0

      Estoy trabajando en un cambio bastante grande en el cliente Ruby de Elasticsearch. La historia resumida es que el código de una de las gemas va a ser combinado en otra (#1274). Trabajando en ese código, moví muchos archivos de un lugar a otro, pero me resultaba importante mantener la historia o el git log de todos los archivos que moví.

      Podemos usar el comando git mv aunque es lo mismo que mover los archivos, eliminar los originales del control de versiones con git rm y agregar los nuevos. Git va a reconocer el cambio como que “renombramos” los archivos. De Git FAQ: Git tiene un comando para renombrar git mvpero es sólo por conveniencia. El efecto es indistinguible de eliminar el archivo y agregar otro con distinto nombre pero el mismo contenido.

      Ahora, después de haber movido varios archivos fui a verificar que la historia se mantuviera. Y en principio al usar git log, sólo veía desde el commit en que los había movido. Así que salí a buscar y encontré en la documentación de git log:

      –follow
      Seguir listando la historia de un archivo más allá de los renombres (funciona sólo para un archivo único).

      Así que la historia sigue estando ahí, sólo que hay que usar git log – follow archivo.

      El post Mini pique: Git mv y ver la historia de archivos que movimos fue publicado originalmente en Picando Código.

      Picando Código: Siete días en el Picandoverso – Mayo 4: el lejano y salvaje verde

      $
      0
      0

      Otra semana que pasa y se va el mes de mayo, y ya nos acercamos a la mitad de 2021. En Escocia el tiempo se olvidó que era primavera y ha habido un clima bastante particular que después de un largo invierno de encierro genera bastante mal humor. Pero se supone que se vienen días mejores. Mientras tanto es hora de golpear las teclas de mi teclado continuamente en armonía hasta formar esta manifestación de píxeles en tu pantalla a la que denomino “Siete días en el Picandoverso”. Espero que se haya entendido la referencia a Futurama en el título del post…

      Siete días en el Picandoverso - Mayo 4: en lejano y salvaje verde

      Tecnología

      👩‍💻 Un estudio de GitHub reveló que (¡sorpresa!) las interrupciones y reuniones arruinan la productividad de los programadores. Tras un estudio que probablemente no tenga demasiado peso científico debido a su corto alcance, descubrieron que: “Con interrupciones mínimas o nulas, desarrolladores tenían un 82% de chance de tener un buen día, pero cuando se les interrumpía la mayor parte del día, las chances de tener un buen día caía a 7%”.

      Otro descubrimiento que no sorprende es que odiamos las reuniones: “Con un promedio de dos reuniones al día las chances de que desarrolladores se sientan como que han progresado hacia sus metas fue de 74%, pero aumentando a un promedio de tres reuniones por día se traducía en un 14% de chance de progresar”. La noticia en The Register, y el estudio en GitHub.

      🪄🎩Se publicó la versión 3.0 de Magit: una interfaz de usuario basada en texto para Git que se concentra en flujos de trabajo optimizados. Los comando se invocan usando secuencia mnemotécnicas de teclas. Intenté usarlo por un tiempo, pero estoy tan acostumbrado a la terminal con Git que al final termino volviendo a la terminal para hacer cosas como rebases interactivos. Debería darle otra oportunidad y aprender a hacer esas cosas más complejas que git add, commit y push.

      🔗 Si usamos curl, su creador nos pide que participemos de la encuesta de curl 2021: Por octavo año consecutivo volvemos en 2021 con la encuesta anual de curl. Acaba de publicarse el formulario y amaría que gastes 10 minutos de tu ocupada vida en decirnos cómo crees que funciona curl, qué no funciona y que deberíamos hacer. No tememos traqueo en el sitio web y no tenemos métricas o medidas de uso de curl o la biblioteca libcurl. La única forma de aprender lo que los usuarios y la gente en general piensa de nosotros y cómo funciona curl es preguntando.Enlace a la encuesta.

      🔥🦊❤ En un blog post de Mozilla Hacks, cuentan cómo mejoraron la estabilidad de Firefox en Linux. Además de un montón de detalles interesantes sobre cómo obtienen la información necesaria a través de los reportes de error de los usuarios, cuentan cómo la colaboración entre distintos proyectos de software libre y código abierto resultó en mejoras de las herramientas y contribuciones entre Firefox y otros proyectos como Fedora, Debian, Mesa, GTK, glib, PCSC, SQLite y más. Una historia de amor de código abierto.

      ☠Aparentemente Internet Explorer todavía no estaba muerto. Yo creía que no existía más, sobretodo ahora que Google Chrome es el nuevo Internet Explorer 6, pero Microsoft anunció que dejará de darle soporte al navegador el 15 de junio de 2022 en favor de Microsoft Edge. Así que a partir de esa fecha, va a volver a ser cool usar Internet Explorer

      💰Se armó relajo en IRC. El staff de la red IRC de software libre y código abierto más grande del mundo, Freenode, renunció tras una adquisición hostil. Aparentemente un narcisista Trumpeano millonario dueño de un servicio de VPNs compró de manera sospechosa la red a uno de los dirigentes que no tenía realmente derecho a venderla. Yo les creo, nunca confíen en los millonarios, siempre son los malos. Una lástima porque la red Freenode ha sido una via de comunicación oficial para muchos proyectos de código abierto y software libre por muchos años. El canal #picandocodigo sigue ahí, por más que su uso haya sido muy limitado en los últimos años…

      La nueva red que busca reemplazar a Freenode se llama Libera.chat, y varios proyectos grandes ya mudaron sus canales para ahí. Podemos leer más sobre la debacle en este enlace.

      Ruby

      💎 En su serie de tips “One Ruby Thing”, Andy Croll nos cuenta cómo optar por deshabilitar el rastreo FLoC en Rails. Nos recuerda que Google es una megacorporación distópica monopólica que utiliza su dominio del mercado para enriquecer su monopolio de la publicidad online y que debemos hacer lo posible para no alimentar a la bestia. Como siempre, recomiendo pasarse a un navegador web más ético como Firefox en vez de Google Chrome.

      💎 El 8 de julio de 2021 se realiza la primera conferencia sobre el lenguaje de programación Crystal. En un tweet, se anunció que Matz va a estar dando una charla en la conferencia. “Crystal se para en los hombros de muchos gigantes, y Ruby es uno de los más altos”. Podemos comprar la entrada en este enlace.

      💎 Ya he compartido varios enlaces sobre Ractors en Ruby 3, pero otra característica nueva es la clase Fiber::SchedulerInterface. Nos permite escribir schedulers más avanzados basados en bucles de eventos para entrada y salida sin bloquear en Ruby (a lo frameworks como EventMachine). Recientemente resurgió un artículo muy bueno sobre el tema Ruby 3.0 and the new FiberScheduler interface. Mientras leía esto me colgué a probar cosas y tengo algunas ideas para implementar más cosas, tengo investigación por delante…

      💎🧑‍🚀 Mañana 27 de mayo es el último jueves del mes, por lo que vuelve Ruby Galaxy: el meetup virtual de Ruby. Se va a transmitir a través de su canal de Twitch a las 19:00 UTC. Todavía no estaban anunciadas las charlas cuando escribí esto, pero de todas formas voy a estar en el stream y comentando en el chat.

      Videojuegos

      🦔 Parece que Sonic va a tener un video para mostrar novedades que se vienen como parte del 30º Aniversario de Sonic. El jueves 27 de mayo podemos sintonizar a youtube.com/sonic y twitch.tv/sonic a las 11:00 AM (Ciudad de México) / 1:00 PM (Buenos Aires) para una primera vista a los próximos proyectos, colaboraciones y eventos. Podemos seguir a Sonic en Twitter en sus cuenta para para Latinoamérica.

      🍌 Se subió a archive.org la iso de un DVD llamado “The Future of Videogames Vol. 1”, basado en E3 2001. Cuenta con un montón de trailers en una resolución bastante buena de 720x480. Habrá que descargar ese ISO a ver qué más trae. Entre los trailers se encuentra el de Donkey Kong Racing, un juego originalmente desarrollado para Game Cube pero que fue cancelado tras la compra de Rare por Microsoft:
      YouTube Video

      🎮 He estado jugando Mega Man Zero en Mega Man Zero Legacy Collection en Nintendo Switch. Ya me queda poco para terminarlo, pero siento que tengo que compartir este Honest Trailer del juego.

      Películas/Televisión

      📺 Netflix presentó una imagen de la serie animada MECH CADETS, basada en los cómics de Boom! StudiosMech Cadet Yu por Greg Pak y Takeshi Miyazawa. Va a ser producida por Boom! Studios, el estudio japonés Polygon Pictures Inc. y Aaron Lam (escritor y productor ejecutivo). Vendrá acompañada de otras dos series y películas de creadores asiático-americanos.

      🎥 Marvel publicó el primer trailer de la película The Eternals, y se ve muy bien. Esperemos que se pueda ir a ver al cine:
      YouTube Video

      Picando Código

      Los posts de Picando Código pueden seguirse por:

      También estoy en Twitter y Mastodon, donde además de compartir lo que se publica en el blog publico alguna cosa más.

      7 días en el Picandoverso recientes:

      El post Siete días en el Picandoverso – Mayo 4: el lejano y salvaje verde fue publicado originalmente en Picando Código.
      Viewing all 2698 articles
      Browse latest View live