Weblogs Código

Adrianistán

Alojando una web en IPFS

septiembre 24, 2018 09:38

En el primer post vimos como interactuar con IPFS de forma sencilla. Ahora vamos a dar un paso más y vamos a alojar una web en IPFS, aprovechando todas las ventajas de escalabilidad y disponibilidad que nos ofrece la red. Para ello usaremos además otro protocolo llamado IPNS, que sería similar a DNS pero en la red IPFS.

Las páginas ideales para IPFS actualmente son las que siguen el JAMstack, es decir, uso extensivo de JavaScript en el cliente, que podrá conectarse a APIs para obtener/actualizar información. Las APIs no tienen por qué ser centralizadas, ya que JavaScript con WebRTC puede buscar peers, posibilitando APIs descentralizadas.

Generando el contenido estático

El primer paso será generar el contenido estático de la web. Para ello existen herramientas muy conocidas como Jekyll, Hugo o Pelican.

No nos vamos a alargar más en esto, ya que cada herramienta tiene sus pasos. El resultado final será una carpeta con ficheros HTML, CSS, fuentes, imágenes y JavaScript.

Subir a IPFS

Teniendo el nodo IPFS en funcionamiento, subimos la carpeta del modo habitual, en mi caso, voy a subir la página que está en http://adrianistan.eu .

ipfs add -r adrianistan.eu/

Y anotamos el último hash.

Comprobamos que la web es accesible, tanto desde la gateway del nodo, como una externa:

Tanto en el nodo local como en uno externo, la web carga perfectamente con el hash

IPFS tiene direccionamiento por contenido

En el post anterior mencionamos que IPFS direcciona por contenido gracias a los hashes. Esto tiene unas consecuencias interesantes. Por ejemplo, si se añade un archivo duplicado a IPFS, este tiene exactamente la misma dirección, ya que comparten hash. Por otro lado, los documentos no se pueden actualizar, porque entonces su hash cambia. Sin embargo en una web queremos cambiar contenido, ahí entra en acción IPNS.

IPNS, gestión de nombres para IPFS

IPNS es un protocolo parecido en intenciones a DNS que redirige un ID única al hash correspondiente en ese momento. Registramos el hash de la web actual en IPNS.

ipfs name publish HASH

Ahora sí, el hash IPNS puede publicarse por la red, ya que siempre apuntará a la última versión de la web.

Para acceder a recursos a través de IPNS tenemos que cambiar de protocolo, en vez de /ipfs/HASH, tenemos que poner /ipns/HASH. Vale tanto para comandos como para las gateways HTTP.

https://cloudflare-ipfs.com/ipns/QmYDVeoadAzk9ZW6zwJK3E3KHrA1LWLveEdqUv4XAcCjKa/

En cualquier momento podemos comprobar a que dirección IPFS apunta el hash IPNS:

ipfs name resolve QmYDVeoadAzk9ZW6zwJK3E3KHrA1LWLveEdqUv4XAcCjKa

Para actualizar el contenido simplemente se vuelve a repetir el paso de ipfs name publish. IPFS automáticamente modificará la redirección de IPNS.

Los contenidos antiguos no desaparecen, pero pueden no ser accesibles ya que ningún nodo tenga copia de ellos.

DNSLink

Aún así, ir dándole a la gente un hash IPNS es demasiado complicado. Afortunadamente, podemos usar el DNS tradicional para indicar una ruta IPNS y así, como veremos, facilitar bastante las cosas.

Para ello añadimos un campo TXT en los DNS de nuestro dominio. El contenido es el siguiente:

dnslink=/ipns/HASH

Con esto podremos usar /ipns/dominio.com en la red IPFS. Pero todavía hace falta un cliente IPFS.

Afortunadamente, podemos redirigir mediante CNAME a una gateway HTTP de confianza y ¡la web funcionará correctamente! Para ello hay que crear un campo TXT en el subdominio _dnslink con el mismo contenido que el anterior.

Todas las gateways de IPFS soportan DNSLink para que la transición a IPFS sea lo más transparente posible.

Así, finalmente la página carga con un dominio normal y corriente en un navegador normal y corriente.

Fijaos en la URL

De hecho, vosotros mismos podéis acceder:

http://adrianistan.yayeyo.ga

IPFS Companion

Si usamos mucho IPFS, puede que nos interese una extensión que maneje el protocolo ipfs:// . Tanto en Firefox como en Chrome existe IPFS Companion, una extensión que nos permite acceder a contenido IPFS de forma sencilla.

Servicio systemd

Por último, quiero dejar el servicio de systemd necesario para tener el nodo IPFS funcionando constantemente en nuestro ordenador. En este caso, IPFS lo instalé vía Snap.

[Unit]
Description=IPFS daemon

[Service]
ExecStart=/snap/bin/ipfs daemon
Restart=on-failure

[Install]
WantedBy=default.target

sudo cp ipfs.service /etc/systemd/user/

sudo systemctl --user start ipfs.service
sudo systemctl --user enable ipfs.service

Y con esto ya tendríamos suficiente como para jugar con IPFS un buen rato.

La entrada Alojando una web en IPFS se publicó primero en Adrianistán.

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

Picando Código

2 paquetes de ebooks interesantes: Learn you some Code y Game Development by Pack

septiembre 24, 2018 08:14

La gente de Humble Bundle tiene 2 paquetes de ebooks bastante interesantes. Los ebooks están disponibles en PDF, ePUB y MOBI, por lo que pueden ser leídos en casi cualquier dispositivo. Como se acostumbra en los paquetes Humble Bundle, además de elegir el precio, podemos elegir dónde destinamos el dinero que pagamos, incluyendo una organización de beneficencia.

En el primer bundle se trata de Electronic Frontier Foundation, la fundación sin fines de lucro que defiende nuestros derechos en el mundo digital. Activistas, abogados y tecnólogos que luchan en las cortes y el congreso para proteger la privacidad y libre expresión en línea en todo el mundo. El segundo beneficia a Code.org, fundación sin fines de lucro dedicada a expandir la participación en ciencias de la computación habilitándola en más escuelas, y aumentando la participación de mujeres y estudiantes de color.

Los paquetes:

Humble Book Bundle: Game Development and Learn you some CodeGame Development by Packt – Un paquete con 25 libros sobre desarrollo de videojuegos, incluyendo uno sobre Godot, el motor de desarrollo de videojuegos software libre. Quedan 6 días para comprarlo:

Game Development by Packt

Pagando el monto mínimo de USD 1, obtenemos: Creating a Game with Blender Game Engine, Mastering SFML Game Development, Game Physics Cookbook, Basics of Coding with Unreal Engine 4 y Beginning C++ Game Programming

Pagando USD 8 o más, también obtenemos: Practical Game AI Programming, Modern OpenGL C++ 3D Game Tutorial Series & 3D Rendering, Mastering Unreal Engine 4.x Game Development, Virtual Reality Blueprints, Building a Character using Blender 3D, Unity 2017 Mobile Game Development, Unity 2017 Game Optimization, Practical Game Design y Learning C# 7 By Developing Games with Unity 2017

Pagando USD 15 o más, el paquete incluye: Vulkan Cookbook, Godot Engine Game Development Projects, Swift 3 Game Development, Mastering Unity 2017 Game Development with C#, Getting Started with Unity 2018, Unity 2017 Game AI Programming, Unity 2017 2D Game Development Projects, Unity Virtual Reality Projects, Learning C++ by Creating Games with Unreal Engine 4, Game Development Patterns and Best Practices y Learning C# by Developing Games with Unity

Visita Humble Book Bundle: Game Development

Humble Book Bundle: Learn You Some Code

Learn you some Code tiene algunos títulos muy interesantes a partir de los USD 8, los leería todos. Los de Haskell y Lisp son clásicos (el de Haskell lo empecé alguna vez…). Quedan 13 días para comprarlo:

Humble Book Bundle: Learn You Some Code

Pagando el monto mínimo de USD 1, obtenemos: Automate the Boring Stuff with Python: Practical Programming for Total Beginners, The Linux Command Line: A Complete Introduction, The Book of F#: Breaking Free with Managed Functional Programming, Learn Java the Easy Way: A Hands-On Introduction to Programming y Perl One-Liners: 130 Programs That Get Things Done

Pagando USD 8 o más, también obtenemos: Ruby Under a Microscope: An Illustrated Guide to Ruby Internals, Learn You Some Erlang for Great Good!: A Beginner’s Guide, Learn You A Haskell for Great Good!: A Beginner’s Guide, Clojure for the Brave and True: Learn the Ultimate Language and Become a Better Programmer y Land of Lisp: Learn to Program in Lisp, One Game at a Time!

Pagando USD 15 o más, el paquete incluye: Python Crash Course: A Hands-On Project-Based Introduction to Programming, Python Playground: Geeky Projects for the Curious Programmer, Think Like a Programmer: An Introduction to Creative Problem Solving, The Book of R: A First Course in Programming and Statistics y Wicked Cool Shell Scripts: 101 Scripts for Linux, OS X, and UNIX Systems

Visita Humble Book Bundle: Learn you some Code

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

Variable not found

Enlaces interesantes 331

septiembre 24, 2018 08:50

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

Por si te lo perdiste:

.NET / .NET Core

ASP.NET / ASP.NET Core

Azure / Cloud

Data

HTML / CSS / Javascript

Visual Studio / Complementos / Herramientas

Xamarin / Cross-platform

Otros

Publicado en Variable not found.

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

Blog Bitix

Recargar sin reiniciar la configuración de una aplicación Spring Boot con Spring Cloud Config

septiembre 22, 2018 10:50

Spring
Java

No es raro la necesidad de querer cambiar algunos valores de la configuración de una aplicación sin ningún cambio adicional en el código. Normalmente la configuración se externaliza en un archivo de texto en un determinado formato como properties o yaml que se lee al iniciarse la aplicación pero que al querer hacer cambios y hacerlos efectivos requiere reiniciar la aplicación.

Para evitar la caída de servicio en un reinicio de aplicación requiere tener varias instancias de la aplicación, ir sacando del balanceador las instancias para que no le soliciten nuevas peticiones, reiniciarlas y añadirlas de nuevo al balanceador si se hace balanceo de carga en el servidor o reiniciar las aplicaciones progresivamente si se hace en el cliente. Y esto con todas las instancias del servicio. Spring Cloud Config y Spring Boot entre sus funcionalidades de configuración posee una que consiste en recargar la configuración o ciertas partes de la misma. Para ello Spring Boot Actuator ofrece un endpoint con el que disparar la recarga.

En el siguiente ejemplo de microservicio que posee una clase de configuración con algunas propiedades. El valor de estas propiedades se utilizan para el resultado de una acción en un endpoint del servicio.

Iniciada la aplicación que requiere iniciar previamente el servicio de registro y descubrimiento y el servidor de configuración, la aplicación al iniciarse obtiene su configuración del servidor de configuración. Si se cambia la configuración de la variable config.key la aplicación no obtendrá el valor actualizado hasta que se invoque el endpoint http://localhost:8080/actuator/refresh. Para que Spring Boot recargue la configuración es necesario anotar con @RefreshScope la clase de configuración. Invocado el endpoint de recarga de configuración la aplicación toma de nuevo los nuevos valores del servicio de configuración.

En una aplicación orientada microservicios es muy posible que haya múltiples instancias del mismo servicio y para recargar la configuración de cada uno de ellos hay que hacerlo de forma individual con su endpoint de recarga de configuración. Dado el número de microservicios y su ubicación distribuida hacerlo de forma individual es un inconveniente.

Para resolver este inconveniente integrando Spring Cloud Bus en las aplicaciones es posible recargar la configuración de todos los microservicios haciendo una única llamada al endpoint http://localhost:8090/monitor indicando el servicio a actualizar su configuración lo que es independiente del número de instancias y de su ubicación. Integrar Spring Clud Bus requiere disponer de una instancia de mensajes como RabbitMQ e incluir como dependencia tanto en el servidor de configuración como en el servicio la dependencia spring-cloud-starter-bus-amqp. Para esta comunicación de mensajes Spring Cloud Config crea en RabbitMQ una cola de mensajes que empieza por springCloudBus.

Los pasos para probar estas funcionalidades con Spring Cloud Bus en una o varias varias instancias son iniciar una instancia o más del servidor de registro y descubrimiento, iniciar una o más instancias del servidor de configuración, iniciar una o varias instancias del servicio todas las instancias en un puerto y terminal diferente, invocar el servicio cuyo valor de respuesta depende de una propiedad de configuración, modificar el valor de la propiedad de configuración, recargar la configuración e invocar de nuevo el servicio para comprobar que el nuevo valor se ha hecho efectivo.

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando el comando ./gradle-run-1.sh && ./curl-1.sh.

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

Blog Bitix

Recargar la configuración sin reiniciar una aplicación Spring Boot con Spring Cloud Config

septiembre 22, 2018 10:15

Spring
Java

No es raro la necesidad de querer cambiar algunos valores de la configuración de una aplicación sin ningún cambio adicional en el código. Normalmente la configuración se externaliza en un archivo de texto en un determinado formato como properties o yaml que se lee al iniciarse la aplicación pero que al querer hacer cambios y hacerlos efectivos requiere reiniciar la aplicación.

Para evitar la caída de servicio en un reinicio de aplicación requiere tener varias instancias de la aplicación, ir sacando del balanceador las instancias para que no le soliciten nuevas peticiones, reiniciarlas y añadirlas de nuevo al balanceador si se hace blalanceo de carga en el servidor o reiniciar las aplicaciones progresivamente si se hace en el cliente. Y esto con todas las instancias del servicio. Spring Cloud Config y Spring Boot entre sus funcionalidades de configuración posee una que consiste en recargar la configuración o ciertas partes de la misma. Para ello Spring Boot Actuator ofrece un endpoint con el que disparar la recarga.

En el siguiente ejemplo de microservicio que posee una clase de configuración con algunas propiedades. El valor de estas propiedades se utilizan para el resultado de una acción en un endpoint del servicio.

Iniciada la aplicación que requiere iniciar previamente el servicio de registro y descubrimiento y el servidor de configuración, la aplicación al iniciarse obtiene su configuración del servidor de configuración. Si se cambia la configuración de la variable config.key la aplicación no obtendrá el valor actualizado hasta que se invoque el endpoint http://localhost:8080/actuator/refresh. Para que Spring Boot recargue la configuración es necesario anotar con @RefreshScope la clase de configuración. Invocado el endpoint de recarga de configuración la aplicación toma de nuevo los nuevos valores del servicio de configuración.

En una aplicación orientada microservicios es muy posible que haya múltiples instancias del mismo servicio y para recargar la configuración de cada uno de ellos hay que hacerlo de forma individual con su endpoint de recarga de configuración. Dado el número de microservicios y su ubicación distribuida hacerlo de forma individual es un inconveniente.

Para resolver este inconveniente integrando Spring Cloud Bus en las aplicaciones es posible recargar la configuración de todos los microservicios haciendo una única llamada al endpoint http://localhost:8090/monitor indicando el servicio a actualizar su configuración lo que es indenpendiente del número de instancias y de su ubicación. Integrar Spring Clud Bus requiere disponer de una instancia de mensajes como RabbitMQ e incluir como dependencia tanto en el servidor de configuración como en el servicio la dependencia spring-cloud-starter-bus-amqp. Para esta comunicación de mensajes Spring Cloud Config crea en RabbitMQ una cola de mensajes que empieza por springCloudBus.

Los pasos para probar estas funcionalidades con Spring Cloud Bus en una o varias varias instancias son iniciar una instancia o más del servidor de registro y descubrimiento, iniciar una o más instancias del servidor de configuración, iniciar una o varias instancias del servicio todas las instancias en un puerto y terminal diferente, invocar el servicio cuyo valor de respuesta depende de una propiedad de configuración, modificar el valor de la propiedad de configuración, recargar la configuración e invocar de nuevo el servicio para comprobar que el nuevo valor se ha hecho efectivo.

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando el comando ./gradle-run-1.sh && ./curl-1.sh.

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

Blog Bitix

Desempaquetado y análisis de teclado y ratón inalámbrico V7 CKW200 en español

septiembre 21, 2018 07:00

Videoseven

Aún estoy esperando a que Intel comercialice en España como decía en un artículo anterior entre las opciones que he evaluado los Intel NUC Bean Canyon para comprar nuevo equipo. La espera se me está haciendo un poco larga pero en teoría a mediados de octubre los empezarán a enviar desde la página especializada SimplyNUC y posiblemente hasta noviembre o diciembre no aparezcan a la venta en Amazon que es donde en principio lo compraré o más o menos al mismo tiempo en PcComponentes.

Pero mientras tanto otras cosas que necesito es un monitor 2K de 27 pulgadas que como primera opción tengo el Benq PD2700Q con un precio de 337€ pero lo he visto en algunos momentos a 275€, si lo vuelvo a ver a ese precio será el que compre aún no teniendo todavía el NUC. Ese monitor u otro modelo muy similar de Benq GW2765HT la mayor diferencia entre estos dos monitores es que este último no ofrece puertos USB pero tiene conexión VGA aunque no le veo mucho sentido en un monitor 2K por ser menor que la nativa del monitor ya que el VGA solo ofrece como máximo una resolución de 1920x1080.

Aparte de la memoria, el SSD para el NUC y tras cosas de menor importancia que ya comentaré otras piezas que me faltan son un teclado y un ratón que finalmente ya he adquirido. He visto bastantes modelos con diferentes características entre ellos principalmente los de la marca Logitech por ser una marca de reconocido prestigio en cuanto a periféricos para ordenadores. Tenía pensado adquirir un modelo de teclado y ratón con cable muy básico aunque suficiente para mis usos el Logitech MK120 pero finalmente me he decidido por uno muy similar aunque inalámbrico, el Videoseven (V7) modelo CKW200 que también está disponible en formato con cable.

Pasados unos meses de uso veré si ha sido buena decisión por su fiabilidad y el incordio que supone cambiar de pilas si es muy habitualmente, con las recargables no me supondrá un gasto adicional recurrente que hay que tener en cuenta en el coste del teclado y ratón, también al precio de las pilas no recargables o regarcables si se le suma el del cargador aunque como uso pilas recargables para otro tipo de aparatos electrónicos (relojes, mandos a distancia, …) este último es un gasto compartido.

Con cable o inalámbrico

Salvo por la diferencia de cable e inalámbrico tanto el de Logitech como de Videoseven son muy similares y el precio del V7 solo es unos pocos euros superior y ambos muy económicos. Las razones por la que finalmente he optado por un inalámbrico han sido tres: no tener cables que molesten en la mesa por comodidad y al mismo tiempo para facilitar la limpieza de la mesa, dado que el NUC solo tiene 4 puertos USB ocupar solo uno con el receptor de radio frecuencia de teclado y ratón en vez de dos si fuesen con cable y tener algo de movilidad o mayor libertad de movimiento ya que quizá vea alguna película desde la cama en vez desde la mesa de escritorio y así pueda manejar el ordenador desde algo más de distancia. La marca Videoseven no la conocía hasta hace poco que me he encontrado con algunos de sus productos, en Amazon todavía para el teclado y ratón no tiene comentarios ni he encontrado un desempaquetado ni unboxing en YouTube para conocer más detalles, creo que seré el primero en evaluar el producto.

En principio evalué teclado y ratón con cable más que inalámbrico por la fiabilidad de la conexión, según la experiencia de algunos usuarios en los comentarios de Amazon varios son los que indican que la conectividad a veces se pierde y es molesto al teclear y manejar el ratón. Llevo usando un Magic Mouse 2 de Apple que funciona por Bluetooth perfectamente sin haber experimentado hasta el momento ningún tipo de fallo por conectividad, esto me daba cierta confianza en que los inalámbricos funcionasen bien. Otro aspecto a tener en cuenta sobre los inalámbricos es que requieren de baterías en forma de pilas AA y AAA que según el fabricante duran entre 8 y 12 meses para el teclado y 6 meses para el ratón.

Hay teclados y ratones que funcionan por Bluetooth pero no funcionan hasta que se inicia el sistema operativo lo que les hace no aptos para modificar los valores de la BIOS/UEFI. La ventaja que tienen es que los Bluetooth no requieren receptor y son utilizables por tablets o televisión. Los basados en radio frecuencia son más comunes para ordenadores.

Supongo que depende del uso, el Magic Mouse 2 que tiene una batería recargable de casi 2000 mAh me dura unas 3-4 semanas usándolo de forma intensiva todos los días tanto para trabajar entre semana como el fin de semana entre 5 y 9 horas diarias. Una pila recargable AA de Amazon Basics que es la que usan tanto el ratón de Logitech como el de Videoseven tiene una capacidad de 1900 mAh. Con el uso que le doy la pila del ratón supongo que me durará algo más de tiempo que una carga del Magic Mouse 2 pero no creo que me dure esos 6 meses que indica el fabricante, el Magic Mouse lo uso para trabajar y el ratón solo a nivel personal lo que es durante menos tiempo. Una vez lo use mediré lo que dura la pila de ratón. Por la duración de las pilas del teclado no me preocupo tanto ya que en este las pilas sí durarán varios meses.

En cuanto a usabilidad no noto retraso en las acciones por el hecho de que sean inalámbricos, la respuesta en la acción es instantánea tal como lo es en un teclado y ratón con cable. Es muy cómodo poder mover o levantar el teclado o ratón sin la ataduría del cable. Habiéndolo probado en un Mac el teclado y ratón son reconocidos sin ningún tipo de problema incluyendo la disposición de teclas de la disposición español y multimedia, en otros sistemas operativos es igual y no requiere ningún tipo de configuración en el sistema, es conectar el adaptador USB y usar.

No se por que hay que elegir entre con cable o inalámbrico, ¿no hay todavía un modelo de teclado y ratón que soporte los dos modos de funcionamiento y que sea el usuario el que decida como quiere usarlos? Si con la fiabilidad del cable o con la comodidad del inalámbrico en cada momento.

El teclado CKW200

El teclado CKW200 es un teclado completo tradicional con teclado numérico y teclas dedicadas Inicio, Fin, Avance Página, Retroceso Página, Suprimir e Insertar muy útiles al manejar documentos y editar archivos de texto que en muchos teclados de portátiles y más compactos no poseen por ahorrar espacio. También posee teclas dedicadas de flechas que en los portátiles suelen tener un tamaño más pequeño y son más incómodas de pulsar. Como programador estas teclas me resultan muy útiles para seleccionar código desde la posición del cursor al inicio o final, mover el cursor al final de la linea o al inicio, etc… También posee teclas especiales de función para silenciar, bajar y subir el volumen, teclas multimedia y de aplicaciones muy cómodas para hacer esas funciones directamente desde el teclado sin usar la interfaz gráfica del entorno de escritorio, el Logitech MK120 no posee estas teclas de función y es otro motivo por haberme decantado por el modelo de V7.

Las teclas no son en forma de isla sino que son como en la generación anterior de teclados y tienen el inconveniente de que entre los huecos de las teclas se suele acumular suciedad y polvo y no son muy fáciles de limpiar, en los teclados en formato isla se acumula menos suciedad. No posee florituras adicionales como retroiluminación para las teclas útil en condiciones de baja luz ni tampoco adornos como teclas RBG con efectos lumínicos, a un teclado con este precio no se le pueden pedir esas cosas hay que ir a teclados de mayor precio para encontrar esas funciones si se echan de menos que no son más que un añadido estético.

Un detalle importante de este teclado es que los caracteres y símbolos de las teclas está impresas mediante el proceso UV coating que consiste en que están impresas o protegidas mediante un proceso de luz ultravioleta. Esto es una gran característica ya que evita que en el caso de ser pintura el dibujo de las telas desaparezca por el uso debido a la grasa de los dedos y suciedad. Varios usuarios se quejan de esto en algunos modelos incluso de los que están en los primeros puestos de ventas en Amazon.

El teclado posee un indicador de batería entre los LED indicadores de estado, se enciende al conectar las pilas no se si indicará también el nivel bajo de las dos pilas AAA que usa.

El ratón CKW200

El ratón posee tres botones, izquierdo, derecho y el de la rueda de desplazamiento pero no posee botones de desplazamiento lateral. Es de tamaño normal no reducido, ergonómico con la palma de la mano y simétrico apto para diestros y zurdos. Dado que V7 es una empresa nueva en el mercado su modelo de teclado es del 2017 más reciente que otros muchos modelos que pueden ser incluso tan viejos como del 2013, 2015 o 2016.

El ratón posee botón de encendido y apagado pero el teclado no. El ratón posee una función de ahorro de energía con la que al cabo de un minuto la luz óptica que detecta el movimiento empieza a parpadear cada medio segundo, al cabo de 8 minutos la luz se paga completamente y el ratón entra en reposo para ahorrar batería y que dure más tiempo. Con solo hacer clic el ratón sale del estado de reposo y el sensor de movimiento se enciende. Por otro lado si el ratón detecta que el ordenador se ha apagado también entra en modo reposo lo que es muy útil para ni siquiera tener que apagar el ratón manualmente con su interruptor.

El ratón entre una pila AA y el sensor de movimiento posee un hueco para insertar el adaptador USB de como una forma de guardarlo y que no se pierda si se transporta.

Desempaquetado

Una vez más al igual que en otros análisis de productos que hago incluyo fotos mejores que las que proporciona el propio fabricante hechas por mi ya antiguo móvil. Me parece increíble que a estas alturas den tan poca importancia a esto ya que los usuarios utilizan la red para informarse en los productos con comentarios de Ámazon y vídeos de YouTube, fotos del fabricante que debería tener la información más fiable y detallada, incluyendo fotos de gran calidad y numerosas. No indica dimensiones reales del teclado y ratón, solo del paquete.

El teclado tiene una dimensiones de 45x14,5 centímetros de ancho y largo respectivamente, el ratón 7x12 centímetros de ancho y largo. Tanto el teclado como ratón y pilas estaban en la caja protegidos con una bolsa de plástico para evitar rayaduras. El adaptador para que el ordenador reciba la señal de teclado y ratón es muy pequeño y pasa casi despercibido conectado en el puerto USB. Se incluye en la caja una pila AA y dos AAA para poder usar el teclado y ratón desde el primer momento lo cual es de agradecer.

La caja, manual y pilas incluídas
El teclado
El ratón y el adaptador

Conclusión

Es un teclado y ratón básico pero yo no le pido más, de plástico pero con un buen acabado, estética cuidada sin ninguna extrabagancia y ligero. Posee pestañas para aumentar la inclinación de las teclas. Por lo que he probado hasta el momento durante unos días el teclado y ratón funciona correctamente la mayor parte del tiempo sin embargo en algún momento puntual el teclado y ratón han perdido la conexión algunas veces. La mayor parte de las veces la conexión se recupera sola en unos pocos segundos, el ratón queda como muerto ya que la luz óptima de movimiento se apaga. Si su funcionamiento es como hasta ahora estaré contento con la compra y habrá sido buena pero si las conexiones son frecuentes y no se recupera pronto me será un poco molesto y no acabaré tan contento.

Llevo usándolo unos días pero se me está haciendo más cómodo el teclado completo que el reducido por ahorrar espacio de los portátiles, sobre todo las teclas de las flechas y de inicio, fin, avance página y retroceso página, también la tecla de suprimir y borrar. El adaptador USB no se calienta y según se enciende el ordenador el teclado y ratón son usables. Quitando las desconexiones en su uso normal funciona perfectamente. Las pulsaciones de teclas y clic del ratón hace algo de ruido pero nada fuera de lo normal. No hay retraso entre la pulsación de la tecla y movimiento del ratón y la detección en el ordenador.

Como defectos están las desconexiones esporádicas que he tenido y que el ratón solo es de tres botones y no de 5, no tiene desplazamiento horizontal que otros ratones tienen moviendo la rueda el ratón hacia los lados. Quizá el ratón estaría mejor que tuviese dos pilas AA en vez de solo una para que la batería le durase más tiempo y hubiese que cambiar las pilas con menor frecuencia. Esto haría que el ratón pesase más pero no creo que fuese un inconveniente grande, con una pila es bastante ligero. Es curioso que el teclado que gasta menos pilas tenga dos AAA (de 750 mAh si son recargables) y el ratón solo una.

Por el motivo de la perdida de conexión no lo recomiendo para los juegos pero ni este modelo ni ningún otro inalámbrico que quizá funcionen más fiablemente pero no serán perfectos en este sentido, para los juegos es más recomendable un teclado y ratón con cable.

Según está indicado en la descripción de los huecos para las pilas el teclado y ratón funcionan con pilas de 1,5v pero los estoy usando con las pilas recargables de Amazon Basics que son de 1,2v y están funcionado sin problema.

Alfombrilla para teclado y ratón

Al mismo tiempo que he comprado el teclado y ratón he comprado una alfombrilla de 70cm de ancho por 30 cm de alto en la que colocar tanto ratón como teclado que está ribeteada con hilo para mayor duración, esto protegerá la mesa del movimiento de ratón que con el tiempo se desgastaría.

Alfombrilla, teclado y ratón

Pilas recargables y cargador

Para no incurrir en mayores gastos adicionales por tener que sustituir pilas cada cierto tiempo, sobre todo para el ratón, usaré pilas recargables de Amazon Basics tanto AA como AAA y un cargador con pantalla similar a este que adquirí hace tiempo para cargarlas, posee un indicador de la carga de la pila a medida que se carga y soporta múltiples tipos de pilas. Amazon Basics tiene un cargador sencillo pero aconsejo adquirir uno equivalente al que tengo yo con pantalla o mejor aún con la función de descarga de pila para prolongar más tiempo la vida útil de las pilas, no son mucho más caros que el de Amazon y la pantalla resulta muy útil. Unas pilas las usaré y tendré otras en reserva para poner de repuesto en cuanto las que estoy usando se gasten así no tendré que esperar mucho a que se carguen ya que tardan varias horas.

Otras opciones según preferencias

Modelos de teclados y ratones hay muchos, hay paquetes que incluyen ambos o se venden por separado. Si no tienes las preferencias claras puedes empezar por consultar la clasificación de los teclados y ratones según el número de ventas que puede ser un indicador de popularidad y buena relación calidad/precio. Como decía hay con cable, inalámbricos, formato isla, gota, ergonómico, compactos, teclados completos, ligeros con panel táctil integrado, adaptados para Smart TV, más económicos, de precio significativo, … aquí pongo algunos de los otros que he mirado.

De entre todos estos y otros de la lista de más vendidos por una cosa u otra al final elegí el Videoseven CKW200 de este artículo, ya sea por los comentarios de los clientes de Amazon o por su diseño y estética.

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

Blog Bitix

Desempaquetado y análisis de teclado y ratón inalámbrico V7 CKW200

septiembre 21, 2018 07:00

Videoseven

Aún estoy esperando a que Intel comercialice en España como decía en un artículo anterior entre las opciones que he evaluado los Intel NUC Bean Canyon para comprar nuevo equipo. La espera se me está haciendo un poco larga pero en teoría a mediados de octubre los empezarán a enviar desde la página especializada SimplyNUC y posiblemente hasta noviembre o diciembre no aparezcan a la venta en Amazon que es donde en principio lo compraré o más o menos al mismo tiempo en PcComponentes.

Pero mientras tanto otras cosas que necesito es un monitor 2K de 27 pulgadas que como primera opción tengo el Benq PD2700Q con un precio de 337€ pero lo he visto en algunos momentos a 275€, si lo vuelvo a ver a ese precio será el que compre aún no teniendo todavía el NUC. Ese monitor u otro modelo muy similar de Benq GW2765HT la mayor diferencia entre estos dos monitores es que este último no ofrece puertos USB pero tiene conexión VGA aunque no le veo mucho sentido en un monitor 2K por ser menor que la nativa del monitor ya que el VGA solo ofrece como máximo una resolución de 1920x1080.

Aparte de la memoria, el SSD para el NUC y tras cosas de menor importancia que ya comentaré otras piezas que me faltan son un teclado y un ratón que finalmente ya he adquirido. He visto bastantes modelos con diferentes características entre ellos principalmente los de la marca Logitech por ser una marca de reconocido prestigio en cuanto a periféricos para ordenadores. Tenía pensado adquirir un modelo de teclado y ratón con cable muy básico aunque suficiente para mis usos el Logitech MK120 pero finalmente me he decidido por uno muy similar aunque inalámbrico, el Videoseven (V7) modelo CKW200 que también está disponible en formato con cable.

Pasados unos meses de uso veré si ha sido buena decisión por su fiabilidad y el incordio que supone cambiar de pilas si es muy habitualmente, con las recargables no me supondrá un gasto adicional recurrente que hay que tener en cuenta en el coste del teclado y ratón, también al precio de las pilas no recargables o regarcables si se le suma el del cargador aunque como uso pilas recargables para otro tipo de aparatos electrónicos (relojes, mandos a distancia, …) este último es un gasto compartido.

Con cable o inalámbrico

Salvo por la diferencia de cable e inalámbrico tanto el de Logitech como de Videoseven son muy similares y el precio del V7 solo es unos pocos euros superior y ambos muy económicos. Las razones por la que finalmente he optado por un inalámbrico han sido tres: no tener cables que molesten en la mesa por comodidad y al mismo tiempo para facilitar la limpieza de la mesa, dado que el NUC solo tiene 4 puertos USB ocupar solo uno con el receptor de radio frecuencia de teclado y ratón en vez de dos si fuesen con cable y tener algo de movilidad o mayor libertad de movimiento ya que quizá vea alguna película desde la cama en vez desde la mesa de escritorio y así pueda manejar el ordenador desde algo más de distancia. La marca Videoseven no la conocía hasta hace poco que me he encontrado con algunos de sus productos, en Amazon todavía para el teclado y ratón no tiene comentarios ni he encontrado un desempaquetado ni unboxing en YouTube para conocer más detalles, creo que seré el primero en evaluar el producto.

En principio evalué teclado y ratón con cable más que inalámbrico por la fiabilidad de la conexión, según la experiencia de algunos usuarios en los comentarios de Amazon varios son los que indican que la conectividad a veces se pierde y es molesto al teclear y manejar el ratón. Llevo usando un Magic Mouse 2 de Apple que funciona por Bluetooth perfectamente sin haber experimentado hasta el momento ningún tipo de fallo por conectividad, esto me daba cierta confianza en que los inalámbricos funcionasen bien. Otro aspecto a tener en cuenta sobre los inalámbricos es que requieren de baterías en forma de pilas AA y AAA que según el fabricante duran entre 8 y 12 meses para el teclado y 6 meses para el ratón.

Hay teclados y ratones que funcionan por Bluetooth pero no funcionan hasta que se inicia el sistema operativo lo que les hace no aptos para modificar los valores de la BIOS/UEFI. La ventaja que tienen es que los Bluetooth no requieren receptor y son utilizables por tablets o televisión. Los basados en radio frecuencia son más comunes para ordenadores.

Supongo que depende del uso, el Magic Mouse 2 que tiene una batería recargable de casi 2000 mAh me dura unas 3-4 semanas usándolo de forma intensiva todos los días tanto para trabajar entre semana como el fin de semana entre 5 y 9 horas diarias. Una pila recargable AA de Amazon Basics que es la que usan tanto el ratón de Logitech como el de Videoseven tiene una capacidad de 1900 mAh. Con el uso que le doy la pila del ratón supongo que me durará algo más de tiempo que una carga del Magic Mouse 2 pero no creo que me dure esos 6 meses que indica el fabricante, el Magic Mouse lo uso para trabajar y el ratón solo a nivel personal lo que es durante menos tiempo. Una vez lo use mediré lo que dura la pila de ratón. Por la duración de las pilas del teclado no me preocupo tanto ya que en este las pilas sí durarán varios meses.

En cuanto a usabilidad no noto retraso en las acciones por el hecho de que sean inalámbricos, la respuesta en la acción es instantánea tal como lo es en un teclado y ratón con cable. Es muy cómodo poder mover o levantar el teclado o ratón sin la ataduría del cable. Habiéndolo probado en un Mac el teclado y ratón son reconocidos sin ningún tipo de problema incluyendo la disposición de teclas de la disposición español y multimedia, en otros sistemas operativos es igual y no requiere ningún tipo de configuración en el sistema, es conectar el adaptador USB y usar.

No se por que hay que elegir entre con cable o inalámbrico, ¿no hay todavía un modelo de teclado y ratón que soporte los dos modos de funcionamiento y que sea el usuario el que decida como quiere usarlos? Si con la fiabilidad del cable o con la comodidad del inalámbrico en cada momento.

El teclado CKW200

El teclado CKW200 es un teclado completo tradicional con teclado numérico y teclas dedicadas Inicio, Fin, Avance Página, Retroceso Página, Suprimir e Insertar muy útiles al manejar documentos y editar archivos de texto que en muchos teclados de portátiles y más compactos no poseen por ahorrar espacio. También posee teclas dedicadas de flechas que en los portátiles suelen tener un tamaño más pequeño y son más incómodas de pulsar. Como programador estas teclas me resultan muy útiles para seleccionar código desde la posición del cursor al inicio o final, mover el cursor al final de la linea o al inicio, etc… También posee teclas especiales de función para silenciar, bajar y subir el volumen, teclas multimedia y de aplicaciones muy cómodas para hacer esas funciones directamente desde el teclado sin usar la interfaz gráfica del entorno de escritorio, el Logitech MK120 no posee estas teclas de función y es otro motivo por haberme decantado por el modelo de V7.

Las teclas no son en forma de isla sino que son como en la generación anterior de teclados y tienen el inconveniente de que entre los huecos de las teclas se suele acumular suciedad y polvo y no son muy fáciles de limpiar, en los teclados en formato isla se acumula menos suciedad. No posee florituras adicionales como retroiluminación para las teclas útil en condiciones de baja luz ni tampoco adornos como teclas RBG con efectos lumínicos, a un teclado con este precio no se le pueden pedir esas cosas hay que ir a teclados de mayor precio para encontrar esas funciones si se echan de menos que no son más que un añadido estético.

Un detalle importante de este teclado es que los caracteres y símbolos de las teclas está impresas mediante el proceso UV coating que consiste en que están impresas o protegidas mediante un proceso de luz ultravioleta. Esto es una gran característica ya que evita que en el caso de ser pintura el dibujo de las telas desaparezca por el uso debido a la grasa de los dedos y suciedad. Varios usuarios se quejan de esto en algunos modelos incluso de los que están en los primeros puestos de ventas en Amazon.

El teclado posee un indicador de batería entre los LED indicadores de estado, se enciende al conectar las pilas no se si indicará también el nivel bajo de las dos pilas AAA que usa.

El ratón CKW200

El ratón posee tres botones, izquierdo, derecho y el de la rueda de desplazamiento pero no posee botones de desplazamiento lateral. Es de tamaño normal no reducido, ergonómico con la palma de la mano y simétrico apto para diestros y zurdos. Dado que V7 es una empresa nueva en el mercado su modelo de teclado es del 2017 más reciente que otros muchos modelos que pueden ser incluso tan viejos como del 2013, 2015 o 2016.

El ratón posee botón de encendido y apagado pero el teclado no. El ratón posee una función de ahorro de energía con la que al cabo de un minuto la luz óptica que detecta el movimiento empieza a parpadear cada medio segundo, al cabo de 8 minutos la luz se paga completamente y el ratón entra en reposo para ahorrar batería y que dure más tiempo. Con solo hacer clic el ratón sale del estado de reposo y el sensor de movimiento se enciende. Por otro lado si el ratón detecta que el ordenador se ha apagado también entra en modo reposo lo que es muy útil para ni siquiera tener que apagar el ratón manualmente con su interruptor.

El ratón entre una pila AA y el sensor de movimiento posee un hueco para insertar el adaptador USB de como una forma de guardarlo y que no se pierda si se transporta.

Desempaquetado

Una vez más al igual que en otros análisis de productos que hago incluyo fotos mejores que las que proporciona el propio fabricante hechas por mi ya antiguo móvil. Me parece increíble que a estas alturas den tan poca importancia a esto ya que los usuarios utilizan la red para informarse en los productos con comentarios de Ámazon y vídeos de YouTube, fotos del fabricante que debería tener la información más fiable y detallada, incluyendo fotos de gran calidad y numerosas. No indica dimensiones reales del teclado y ratón, solo del paquete.

El teclado tiene una dimensiones de 45x14,5 centímetros de ancho y largo respectivamente, el ratón 7x12 centímetros de ancho y largo. Tanto el teclado como ratón y pilas estaban en la caja protegidos con una bolsa de plástico para evitar rayaduras. El adaptador para que el ordenador reciba la señal de teclado y ratón es muy pequeño y pasa casi despercibido conectado en el puerto USB. Se incluye en la caja una pila AA y dos AAA para poder usar el teclado y ratón desde el primer momento lo cual es de agradecer.

La caja, manual y pilas incluídas
El teclado
El ratón y el adaptador USB

Conclusión

Es un teclado y ratón básico pero yo no le pido más, de plástico pero con un buen acabado, estética cuidada sin ninguna extrabagancia y ligero. Posee pestañas para aumentar la inclinación de las teclas. Por lo que he probado hasta el momento durante unos días el teclado y ratón funciona correctamente la mayor parte del tiempo sin embargo en algún momento puntual el teclado y ratón han perdido la conexión algunas veces. La mayor parte de las veces la conexión se recupera sola en unos pocos segundos, el ratón queda como muerto ya que la luz óptima de movimiento se apaga. Si su funcionamiento es como hasta ahora estaré contento con la compra y habrá sido buena pero si las conexiones son frecuentes y no se recupera pronto me será un poco molesto y no acabaré tan contento.

Llevo usándolo unos días pero se me está haciendo más cómodo el teclado completo que el reducido por ahorrar espacio de los portátiles, sobre todo las teclas de las flechas y de inicio, fin, avance página y retroceso página, también la tecla de suprimir y borrar. El adaptador USB no se calienta y según se enciende el ordenador el teclado y ratón son usables. Quitando las desconexiones en su uso normal funciona perfectamente. Las pulsaciones de teclas y clic del ratón hace algo de ruido pero nada fuera de lo normal. No hay retraso entre la pulsación de la tecla y movimiento del ratón y la detección en el ordenador.

Como defectos están las desconexiones esporádicas que he tenido y que el ratón solo es de tres botones y no de 5, no tiene desplazamiento horizontal que otros ratones tienen moviendo la rueda el ratón hacia los lados. Quizá el ratón estaría mejor que tuviese dos pilas AA en vez de solo una para que la batería le durase más tiempo y hubiese que cambiar las pilas con menor frecuencia. Esto haría que el ratón pesase más pero no creo que fuese un inconveniente grande, con una pila es bastante ligero. Es curioso que el teclado que gasta menos pilas tenga dos AAA (de 750 mAh si son recargables) y el ratón solo una.

Por el motivo de la perdida de conexión no lo recomiendo para los juegos pero ni este modelo ni ningún otro inalámbrico que quizá funcionen más fiablemente pero no serán perfectos en este sentido, para los juegos es más recomendable un teclado y ratón con cable.

Según está indicado en la descripción de los huecos para las pilas el teclado y ratón funcionan con pilas de 1,5v pero los estoy usando con las pilas recargables de Amazon Basics que son de 1,2v y están funcionado sin problema.

Alfombrilla para teclado y ratón

Al mismo tiempo que he comprado el teclado y ratón he comprado una alfombrilla de 70cm de ancho por 30 cm de alto en la que colocar tanto ratón como teclado que está ribeteada con hilo para mayor duración, esto protegerá la mesa del movimiento de ratón que con el tiempo se desgastaría.

Alfombrilla, teclado y ratón

Pilas recargables y cargador

Para no incurrir en mayores gastos adicionales por tener que sustituir pilas cada cierto tiempo, sobre todo para el ratón, usaré pilas recargables de Amazon Basics tanto AA como AAA y un cargador con pantalla similar a este que adquirí hace tiempo para cargarlas, posee un indicador de la carga de la pila a medida que se carga y soporta múltiples tipos de pilas. Amazon Basics tiene un cargador sencillo pero aconsejo adquirir uno equivalente al que tengo yo con pantalla o mejor aún con la función de descarga de pila para prolongar más tiempo la vida útil de las pilas, no son mucho más caros que el de Amazon y la pantalla resulta muy útil. Unas pilas las usaré y tendré otras en reserva para poner de repuesto en cuanto las que estoy usando se gasten así no tendré que esperar mucho a que se carguen ya que tardan varias horas.

Otras opciones según preferencias

Modelos de teclados y ratones hay muchos, hay paquetes que incluyen ambos o se venden por separado. Si no tienes las preferencias claras puedes empezar por consultar la clasificación de los teclados y ratones según el número de ventas que puede ser un indicador de popularidad y buena relación calidad/precio. Como decía hay con cable, inalámbricos, formato isla, gota, ergonómico, compactos, teclados completos, ligeros con panel táctil integrado, adaptados para Smart TV, más económicos, de precio significativo, … aquí pongo algunos de los otros que he mirado.

De entre todos estos y otros de la lista de más vendidos por una cosa u otra al final elegí el Videoseven CKW200 de este artículo, ya sea por los comentarios de los clientes de Amazon o por su diseño y estética.

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

Adrianistán

IPFS, el futuro de la web descentralizada

septiembre 19, 2018 07:53

Imagina la web sin servicios centralizados. Donde puedas acceder a un vídeo o a una galería de fotos y que no haya una única manera de acceder a contenido. Eso y mucho más es IPFS. IPFS son las siglas de InterPlanetary File System y se trata de una red descentralizada de intercambio de archivos. Nos puede recordar a BitTorrent y en efecto, una buena descripción para IPFS es Torrent 2.0. No obstante IPFS implementa bastantes mejoras sobre BitTorrent, mejoras que lo hacen más útil.

En un post próximo explicaré como podemos sacar partido a IPFS ahora mismo, pero antes vamos a ver algunos conceptos fundamentales de IPFS.

Siendo más técnicos, IPFS es una red P2P inspirada en BitTorrent, Git y Kademlia. El protocolo es una red de distribución de contenido (CDN) y define un sistema de archivos donde el identificador es el propio contenido (a través de su hash). En IPFS nada desaparece sino que se versiona.

Vamos a ver como usar IPFS desde la terminal. Existen varios clientes, en diferentes lenguajes, como js-ipfs (que tendrá mucha utilidad en aplicaciones web descentralizadas usando JavaScript), pero de momento el cliente más maduro es go-ipfs. Desde la web puedes descargarlo.

Iniciar IPFS

Una vez IPFS esté instalado hay que ejecutar lo siguiente:

ipfs init
o
ipfs init --profile server

La segunda opción es para centros de datos, ya que reduce el tráfico interno.

Este comando genera las claves RSA del nodo, necesarias para la comunicación con la red IPFS. Además se nos informa de nuestro ID de nodo. Para acceder a este ID en cualquier momento podemos escribir:

ipfs id

Iniciar el nodo IPFS

Para acceder al contenido IPFS necesitamos ejecutar un nodo. Este nodo se inicia con ipfs daemon. Una cosa importante es que por ejecutar el nodo no se va a descargar nada que no pidamos. IPFS es explícito, pero necesita estar activo.

ipfs daemon

Obtener archivos

Ahora vamos a descargar nuestros primeros archivos de la red IPFS.

Para obtener un archivo existen varias formas:

ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme
o
ipfs cat QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme

Podemos usar el comando cat de IPFS, que funciona de forma similar a cat de Unix.

Las URL de IPFS todavía no han sido definidas de forma definitiva pero de momento siguen el siguiente formato: /protocolo (omitible)/hash/fichero (si es una carpeta). Es el hash el que identifica el bloque de contenido y es lo que sirve para encontrar el contenido en la red IPFS. Internamente usa una DHT (Distributed Hash Table). IPFS no usa trackers como las primeras versiones de BitTorrent. En cambio usa una DHT basada en Kademlia (bastante rápida).

Para obtener un fichero binario usamos el operador de redirección de Linux.

ipfs cat QmWYhH2Nac5vSgTmc6NULncakvhCXgAci33M5NXHjjBuU8 > Comuneros.jpg

También se puede acceder a IPFS por dos métodos más:

FUSE

Podemos montar un sistema de ficheros en Linux gracias a FUSE que es una puerta a IPFS.

ipfs mount

Y tendrás acceso a carpetas /ipfs/hash/ integradas en tu sistema. Muy útil si lo queremos integrar en aplicaciones.

GATEWAY HTTP

Podemos usar IPFS sin tener instalado nada, usando la puerta de acceso que alguien generosamente proporcione a la red. La puerta se encargará de llevar el contenido IPFS al mundo cliente-servidor de HTTP. Existen varias, de hecho cada nodo tiene un servidor HTTP en localhost para esto mismamente, pero aquí voy a mencionar dos: la de IPFS.io y la de CloudFare.

Esto sirve para llevar IPFS a cualquier ordenador a través de un navegador web tradicional como Chrome, Firefox o Safari. También facilita la tarea de integrar IPFS en aplicaciones que no tengan desarrollada una librería específica.

Añadir archivos

Ahora vamos a poner en la red IPFS nuevos archivos. Para ello usamos ipfs add.

Esta operación genera el hash que identifica al contenido en la red y que tendremos que enviar a las personas que queramos que accedan al contenido.

La red IPFS de este modo es semi-privada, ya que sin saber el hash no podemos acceder al contenido en cuestión.

Y ya estaría, así de simple. También podemos añadir carpetas.

El último hash que se ve en la pantalla hace referencia a la carpeta entera.

Pining

Por defecto, IPFS almacena los archivos propios del nodo (los que hemos añadido con ipfs add). Pero entonces IPFS no supone ninguna ventaja respecto a HTTP. No es distribuido, solo hay una copia de los ficheros en el universo.

Cuando descargamos un fichero, IPFS guarda en caché una copia para ofrecer a la red, haciendo que sea un sistema distribuido de verdad. No obstante si estamos realmente interesados en conservar el fichero en nuestro nodo a disposición de la red IPFS tenemos que hacer pin (ipfs add). Cuando nos deje de interesar conservar el fichero a la red, podemos quitar el pin (ipfs rm).

ipfs pin add QmWYhH2Nac5vSgTmc6NULncakvhCXgAci33M5NXHjjBuU8
ipfs pin rm -r QmWYhH2Nac5vSgTmc6NULncakvhCXgAci33M5NXHjjBuU8

Más cosas

Todavía nos quedan muchas cosas de IPFS que ver, como el versionado, el sistema de nombres IPNS, el sistema de enlazado semántico IPLD y como podemos usar IPFS para páginas y aplicaciones web.

 

La entrada IPFS, el futuro de la web descentralizada se publicó primero en Adrianistán.

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

Variable not found

BenchmarkDotNet: Arañando microsegundos en proyectos .NET Core o .NET Framework

septiembre 18, 2018 06:53

ToolsLos que peinamos ya bastantes canas recordamos con nostalgia aquellas intensas sesiones de programación intentando arañar ciclos de CPU y bytes en nuestro flamante Spectrum para sacar el máximo provecho de, en el mejor de los casos, un Zilog Z80A a 3,5MHz con 48K de memoria RAM. ¡Ah, el maravilloso mundo de las micro-optimizaciones!

Hoy en día, salvo en contadas ocasiones, ha dejado de tener sentido invertir demasiado tiempo en estas labores. Tenemos máquinas potentes, con micros cuya velocidad se mide en GHz capaces de ejecutar bastantes tareas de forma concurrente, y muchos Gigabytes libres de memoria RAM en los que guardar información. Además, los frameworks actuales como .NET permiten despreocuparse de asuntos como la reserva o liberación de memoria porque ya hay sistemas de más bajo nivel que se encargan de eso por nosotros.

Indudablemente es un gran avance, pero esto ha llevado a que, con el tiempo, se nos esté atrofiando ese sentido arácnido que antes nos disparaba las alertas cuando cierto código podía ser optimizado para consumir menos recursos.

En la mayoría de escenarios, y sobre todo cuando trabajamos en entornos empresariales, aplicaciones de escritorio o webs de poca carga, está bien así. Sin embargo, es cierto también que las necesidades han cambiado.

Por ejemplo, ahora creamos frecuentemente aplicaciones mucho más complejas que pueden ser utilizadas a través de Internet por miles de usuarios de forma simultánea y todos ellos esperan respuestas rápidas. Estas aplicaciones se ejecutan en servidores cuyos recursos son compartidos entre todos los usuarios que pueden llegar a tener un coste importante y debemos exprimir al máximo. Aquí, y en otros escenarios similares, es donde aparece de nuevo la necesidad de introducir optimizaciones en el código.

En este post vamos a hacer una introducción al uso de BenchmarkDotNet, una magnífica herramienta que nos permitirá medir el rendimiento de nuestro código .NET para hacerlo más eficiente en términos de uso de procesador y memoria.

Pero antes de empezar, no olvidéis la famosa frase de Donald Knuth:
“Los programadores consumen una gran cantidad de tiempo pensando, o preocupándose, sobre la velocidad de partes no críticas de sus programas, y esos intentos de mejorar la eficiencia tienen posteriormente un gran impacto negativo sobre la facilidad de depuración o mantenimiento. Deberíamos olvidarnos de las pequeñas mejoras de eficiencia, digamos en un 97% de los casos: la optimización prematura es el origen de todos los males. Sin embargo, no debemos dejar pasar la oportunidad de mejorar ese crítico 3% restante”

Introducing BenchmarkDotNet

BenchmarkDotNetBenchmarkDotNet es un proyecto de software libre miembro de la .NET Foundation que facilita la realización de pruebas de rendimiento de código, o benchmarking, a bajo nivel, aportándonos una visión muy interesante sobre cómo funcionan las cosas por dentro y ayudándonos a exprimir al máximo los recursos disponibles.

Se distribuye en forma de paquete Nuget bajo la denominación BenchmarkDotNet, y es compatible con .NET Framework, .NET Core, Mono y CoreRT, corriendo sobre Windows, Linux y MacOS.
Como suele ser habitual, el proyecto se encuentra en Github, está abierto a todo tipo de colaboraciones y tiene bastante actividad.

¿Como medimos el rendimiento con BenchmarkDotNet?

BenchmarkDotNet permite medir el rendimiento de código que puede provenir de distintas fuentes. Por ejemplo, podemos suministrarle directamente un código C#, VB o F# en forma de cadena de texto, una URL donde se encuentra el mismo (por ejemplo, en un Gist de GitHub) o realizarlas sobre código existente.

En nuestro caso veremos el último de los escenarios, pues probablemente será el que utilicemos con mayor frecuencia. Por tanto, imaginemos que queremos determinar el rendimiento del siguiente código, que podría encontrarse en una biblioteca de clases:
public static class HashUtils
{
public static byte[] GetMd5(byte[] bytes)
{
var md5 = MD5.Create();
return md5.ComputeHash(bytes);
}
}
Lo primero que vamos a hacer es crear una aplicación de consola, a la que añadimos referencias al proyecto o el ensamblado que contiene el código al que queremos hacer el benchmark. Tras ello, le añadiremos también el paquete Nuget BenchmarkDotNet.

A continuación, crearemos la clase que definirá las pruebas que vamos a hacer, a la que llamaremos por ejemplo HashUtilsBenchmarks:
public class HashUtilsBenchmarks
{
private readonly byte[] _buffer;
public HashUtilsBenchmarks()
{
_buffer = new byte[1024];
var rnd = new Random();
rnd.NextBytes(_buffer);
}

[Benchmark]
public void Md5Benchmark()
{
HashUtils.GetMd5(_buffer);
}
}
Observad que en el constructor inicializamos todo lo que necesitamos para hacer la prueba, pues se ejecutará una única vez antes de realizar el benchmark. Lo que realmente vamos a medir es el rendimiento de Md5BenchMark() y por eso este método lo decoramos con el atributo [Benchmark].

Finalmente, sólo debemos iniciar el proceso indicando a BenchmarkDotNet la clase que debe ejecutar en el Main() de nuestra aplicación de consola:
class Program
{
static void Main(string[] args)
{
BenchmarkRunner.Run<HashUtilsBenchmarks>(); // Go!
Console.ReadKey();
}
}
Al ejecutar la aplicación, BenchmarkDotNet creará un proyecto independiente y aislado por cada método que deseamos comprobar, lo lanzará varias veces, incluyendo un periodo de calentamiento o warm up, y ejecutará los métodos a comprobar tantas veces como estime necesario para obtener los resultados con un nivel de precisión fiable.
Nota: Es importante ejecutar el proyecto sin depurar y compilado en modo release, para que los “extras” añadidos por la depuración no afecten a los resultados. Asimismo, para mejorar los resultados, en la documentación oficial se recomienda establecer los ajustes de energía a máxima potencia, parar aplicaciones o servicios que no sean necesarios y evitar la anulación de dead code por parte del compilador.
En el caso anterior, el resultado obtenido por consola podría ser el siguiente:
// ***** BenchmarkRunner: Start   *****
// Found benchmarks:
// HashUtilsBenchmarks.Md5Benchmark: DefaultJob
[...]

BenchmarkDotNet=v0.10.14, OS=Windows 10.0.17134
Intel Core i7 CPU 950 3.07GHz (Nehalem), 1 CPU, 8 logical and 4 physical cores
Frequency=2992667 Hz, Resolution=334.1501 ns, Timer=TSC
.NET Core SDK=2.1.200
[Host] : .NET Core 2.0.7 (CoreCLR 4.6.26328.01, CoreFX 4.6.26403.03), 64bit RyuJIT
DefaultJob : .NET Core 2.0.7 (CoreCLR 4.6.26328.01, CoreFX 4.6.26403.03), 64bit RyuJIT

Method | Mean | Error | StdDev |
------------- |---------:|----------:|----------:|
Md5Benchmark | 3.738 us | 0.0093 us | 0.0078 us |
A la vista de estos datos, podemos concluir que nuestro método se ejecuta en .NET Core 2.0, de media, en 3.7 microsegundos. Recordad que un microsegundo es la millonésima parte de un segundo… ¡es brutal!

¿Y es más rápido en .NET framework o en .NET Core?

Si nuestro proyecto tiene activo el multi-targeting, es muy sencillo probar en una misma atacada el rendimiento de nuestros métodos en los distintos runtimes. Por ejemplo, supongamos que nuestro archivo de proyecto .csproj está configurado de la siguiente forma, por lo que nuestro proyecto será compilado para .NET Core 2.0 y .NET Framework 4.7.1 al mismo tiempo:
  <PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>netcoreapp2.0;net471</TargetFrameworks>
</PropertyGroup>
Si queremos que BenchmarkDotNet genere y ejecute mediciones para ambos entornos, sólo deberíamos incluir los atributos [ClrJob] y de [CoreJob] en la clase de pruebas:
[ClrJob, CoreJob]
public class HashUtilsBenchmarks
{
[...] // Todo igual
}
Esta vez las pruebas tardarán el doble porque se ejecutarán dos veces, una en cada entorno, pero al finalizar el resultado que obtendremos será muy esclarecedor:
// ***** BenchmarkRunner: Start   *****
// Found benchmarks:
// HashUtilsBenchmarks.Md5Benchmark: Clr(Runtime=Clr)
// HashUtilsBenchmarks.Md5Benchmark: Core(Runtime=Core)
[...]

BenchmarkDotNet=v0.10.14, OS=Windows 10.0.17134
Intel Core i7 CPU 950 3.07GHz (Nehalem), 1 CPU, 8 logical and 4 physical cores
Frequency=2992667 Hz, Resolution=334.1501 ns, Timer=TSC
.NET Core SDK=2.1.200
[Host] : .NET Core 2.0.7 (CoreCLR 4.6.26328.01, CoreFX 4.6.26403.03), 64bit RyuJIT
Clr : .NET Framework 4.7.1 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3101.0
Core : .NET Core 2.0.7 (CoreCLR 4.6.26328.01, CoreFX 4.6.26403.03), 64bit RyuJIT


Method | Job | Runtime | Mean | Error | StdDev |
------------- |----- |-------- |---------:|----------:|----------:|
Md5Benchmark | Clr | Clr | 8.225 us | 0.0456 us | 0.0426 us |
Md5Benchmark | Core | Core | 3.854 us | 0.0444 us | 0.0416 us |
Pues como podíamos sospechar, ¡.NET Core 2.0 es el doble de rápido que .NET 4.7.1 calculando hashes MD5!

Pero lo que mola es comparar distintas implementaciones, ¿verdad?

De poco sirve medir el rendimiento de un código si no podemos compararlo con algo. Por esta razón, supongamos ahora que en la clase original hemos añadido un nuevo método para obtener hashes utilizando SHA256:
public static class HashUtils
{
public static byte[] GetMd5(byte[] bytes) { ... } // Igual que antes

public static byte[] GetSha256(byte[] bytes)
{
var sha256 = SHA256.Create();
return sha256.ComputeHash(bytes);
}
}
Para comparar el rendimiento de ambos métodos, deberíamos extender un poco la clase de pruebas que creamos previamente y añadir la prueba correspondiente al nuevo método:
public class HashUtilsBenchmarks
{
[...] // Todo igual que antes

[Benchmark]
public void Sha256Benchmark()
{
HashUtils.GetSha256(_buffer);
}
}
Y sin cambiar nada más, al ejecutar la prueba podemos obtener el siguiente resultado:
          Method |     Mean |     Error |    StdDev |
---------------- |---------:|----------:|----------:|
Md5Benchmark | 3.735 us | 0.0584 us | 0.0547 us |
Sha256Benchmark | 7.990 us | 0.0304 us | 0.0237 us |
Fijaos que ahora tenemos información muy valiosa: ya podemos asegurar que la obtención de hashes usando MD5 es más del doble de rápida que su equivalente SHA256. Eso sí, tened en cuenta que también es más inseguro ;)

Comprobemos un clásico: ¿es más rápido concatenar cadenas o usar StringBuilder?

Seguro que alguna vez ós habéis encontrado con varias alternativas a la hora de implementar una determinada funcionalidad. Muchas veces optamos por la más sencilla de codificar, pero, ¿siempre sabemos realmente las repercusiones que esto tiene? Quizás nosotros no, pero BenchmarkDotNet sí ;)

Por ejemplo, todos hemos escuchado que la concatenación de cadenas de caracteres es una operación terrible desde el punto de vista del rendimiento, pero muchas veces hacemos oídos sordos porque frecuentemente es la implementación más rápida. Pues para tener información de primera mano, haremos un benchmark que compare ambas implementaciones.

Nuestra clase de pruebas, a la que llamaremos StringBenchmarks, incluirá dos implementaciones distintas para concatenar los primeros 1.000 números enteros, separados por un guión. Es decir, el resultado de ambos métodos será una cadena de caracteres del tipo “1-2-3-4-[…]-999-1000”.

Para que veáis otra forma de crear las pruebas, observad que en este caso estamos introduciendo la implementación directamente sobre esta clase de benchmark, y fijaos también que estamos activando el diagnóstico de memoria usando el atributo [MemoryDiagnoser] sobre la misma:
[MemoryDiagnoser]
public class StringBenchmarks
{
private readonly int _count = 1000;

[Benchmark]
public string UsingStringConcat()
{
var result = string.Empty;
for (int i = 1; i <= _count; i++)
{
result += i.ToString();
if (i != _count)
{
result += "-";
}
}
return result;
}

[Benchmark]
public string UsingStringBuilder()
{
var result = new StringBuilder();
for (int i = 1; i <= _count; i++)
{
result.Append(i);
if (i != _count)
{
result.Append("-");
}
}
return result.ToString();
}
}
El resultado no deja lugar a dudas:
             Method |       Mean |     Error |    StdDev |     Gen 0 |  Allocated |
------------------- |-----------:|----------:|----------:|----------:|-----------:|
UsingStringConcat | 1,050.7 us | 23.321 us | 23.949 us | 1828.1250 | 7495.82 KB |
UsingStringBuilder | 110.3 us | 2.184 us | 2.043 us | 11.4746 | 47.52 KB |
La columna “Gen 0” muestra el número de recolecciones de objetos de primera generación por cada 1.000 llamadas al método; “Allocated”, por otra parte, muestra la memoria que ha sido ocupada en el heap por cada operación.
La alternativa que utiliza StringBuilder, además de ser diez veces más rápida, utiliza 150 veces menos memoria del heap que la alternativa basada en strings, lo que implica un menor stress del recolector de basura (160 veces más recolecciones por cada mil llamadas al método).

Pero además, como se puede intuir, la diferencia entre ambas opciones aumenta cuando incrementamos el número de iteraciones. Es decir, si en lugar de concatenar los mil primeros enteros lo hacemos con diez mil, la cosa se dispara, sobre todo en uso de memoria y trasiego de objetos entre las distintas generaciones del heap:
             Method |       Mean |     Error |    StdDev |       Gen 0 |      Gen 1 |      Gen 2 |    Allocated |
------------------- |-----------:|----------:|----------:|------------:|-----------:|-----------:|-------------:|
UsingStringConcat | 147.255 ms | 2.9023 ms | 4.1623 ms | 244437.5000 | 73437.5000 | 73437.5000 | 936218.48 KB |
UsingStringBuilder | 1.173 ms | 0.0153 ms | 0.0143 ms | 119.1406 | 29.2969 | 29.2969 | 589.22 KB |
Sin embargo, ¿qué ocurre si nos vamos a pocas iteraciones? A continuación podemos observar el resultado para cinco iteraciones, lo que viene a indicar que para pequeñas operaciones de concatenación será prácticamente equivalente, o incluso más rápido algunas veces, sumar directamente string en lugar de hacerlo con StringBuilder:
             Method |     Mean |    Error |   StdDev |  Gen 0 | Allocated |
------------------- |---------:|---------:|---------:|-------:|----------:|
UsingStringConcat | 675.7 ns | 13.41 ns | 14.34 ns | 0.1135 | 480 B |
UsingStringBuilder | 536.2 ns | 10.77 ns | 11.97 ns | 0.0734 | 312 B |

Otro caso práctico: ¿es más rápido usar string.Join() o concatenar con StringBuilder?

Bueno, si la pregunta anterior era fácil de responder incluso sin haber efectuado las pruebas, en este caso tenemos otra que no es tan sencilla a priori. Por suerte, con BenchmarkDotNet saldremos de dudas en un instante ;)

Hagamos subir al escenario otra implementación de nuestra funcionalidad de concatenación, esta vez basada en el método string.Join() proporcionado por el framework. Como novedad, incluiremos en la clase de pruebas el atributo [RankColumn] para que BenchmarkDotNet incluya una columna que indique el ranking de cada una de las opciones y [OrderProvider] para ordenar los resultados mostrando los más rápidos primero:
[MemoryDiagnoser]
[RankColumn, OrderProvider(SummaryOrderPolicy.FastestToSlowest)]
public class StringBenchmarks
{
[...] // Todo igual que antes

[Benchmark]
public string UsingStringJoin()
{
var result = string.Join("-", Enumerable.Range(1, _count));
return result;
}
}
Al ejecutar con mil iteraciones, podemos concluir que StringBuilder sigue siendo la opción más rápida y eficiente, aunque string.Join muestra unos resultados casi idénticos, por lo que podríamos considerar que son prácticamente equivalentes, y ambos muy lejos de la concatenación pura de cadenas:
             Method |       Mean |     Error |    StdDev | Rank |     Gen 0 |  Allocated |
------------------- |-----------:|----------:|----------:|-----:|----------:|-----------:|
UsingStringBuilder | 109.7 us | 2.140 us | 3.000 us | 1 | 11.4746 | 47.52 KB |
UsingStringJoin | 130.2 us | 3.082 us | 2.883 us | 2 | 11.4746 | 47.56 KB |
UsingStringConcat | 1,052.6 us | 19.618 us | 18.351 us | 3 | 1828.1250 | 7495.82 KB |

Conclusión

Sin duda, BenchmarkDotNet es una de esas herramientas que tenemos que llevar siempre en el cinturón. Aunque su uso deberíamos limitarlo a escenarios donde realmente sea necesario realizar optimizaciones milimétricas y en funcionalidades muy críticas, también es interesante por lo que podemos aprender de los resultados para mejorar la forma de resolver determinados problemas.

Obviamente, BenchmarkDotNet es mucho más de lo que hemos contado aquí. Podemos hacer mediciones parametrizadas, inyectar valores como argumentos de métodos, generar archivos de exportación CSV, HTML, JSON, markdown y otros, añadir columnas personalizadas, implementar criterios de ordenación, etc. Pero creo que en este post hemos tratado lo mínimo que debemos conocer para poder empezar a utilizar esta magnífica herramienta.

Publicado en Variable not found.

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

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

DEP Terry Colligan

septiembre 17, 2018 02:22

Muchos ya no recordaréis a Terrance “Terry” Colligan, el fundador de Rational Systems luego renombrada a Tenberry Software y que entre otras cosas desarrolló el extensor DOS DOS/4G que se recordaría por su versión recortada DOS/4GW incluida con Watcom C. Doom, Descent, Duke Nukem 3D, Mortal Kombat o Rise of the Robots entre otros fueron […]

La entrada DEP Terry Colligan aparece primero en Bitácora de Javier Gutiérrez Chamorro (Guti).

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

Variable not found

¡Hola! ¿Hay alguien? Pues ahí van los enlaces interesantes, edición 330

septiembre 17, 2018 07:30

Enlaces interesantes¡Hola de nuevo! Pues sí, tras una larga temporada de descanso, por fin estamos de vuelta, preparados para la nueva temporada y con las baterías cargadas al 99% (ese 1% me temo que es ya irrecuperable ;D)

Y para celebrarlo, nada mejor que un buen puñado de enlaces recopilados durante la semana pasada que, como siempre, espero que os resulten interesantes. :-)

.NET / .NET Core

ASP.NET / ASP.NET Core

Azure / Cloud

Conceptos / Patrones / Buenas prácticas

Data

HTML / CSS / Javascript

Visual Studio / Complementos / Herramientas

Otros

Publicado en Variable not found.

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

Blog Bitix

El comando fork bomb explicado

septiembre 16, 2018 09:00

GNU
Linux

El siguiente aparente, gracioso e inocente conjunto de caracteres que parecen una colección de varios extraños emojis es un comando que si se ejecuta en una terminal de GNU/Linux crea gran cantidad de procesos de forma continua hasta que los recursos del sistema se agotan causando que sea inusable haya que reiniciarlo generando los problemas que de ello se deriven si el reinicio es forzado, este comando es el comando fork bomb para el intérprete de comandos bash.

:(){ :|:& };:

Analizando detalladamente este conjunto de caracteres es un comando bash que se compone de la definición de una función de nombre :, los paréntesis ( ) definen la función, que en su cuerpo entre las llaves { } recursivamente se llama a si misma dos veces con un pipeline | que ejecuta el primer comando enviando su salida al segundo, con el caracter & no se espera a que termine y los pone en segundo plano de modo no se puedan terminar con lo que seguirán consumiendo recursos. Cada uno de los procesos de la función se llama de nuevo a la función recursivamente y repitiendo el proceso. Como consecuencia el número de procesos del sistema crece de forma exponencial que en poco tiempo termina por agotar los recursos del sistema.

A continuación de la función se encuentra el comando : que realiza la primera llamada a la función que desencadena el fork bomb. Esta llamada inicial está separada por el caracter ; que sirve para escribir varios comandos uno a continuación de otro en una misma línea. El primer comando es la definición de la función y el segundo hace la llamada a la función e inicia el fork bomb.

Este fork bomb crea procesos en el sistema de forma exponencial (1, 2, 4, 8, 16, 32, …, 2^n) hasta que el sistema agota los recursos de procesador o memoria en un periodo de tiempo muy corto, menos de unos pocos segundos desde su inicio dada la capacidad de procesamiento de los sistemas actuales. Como consecuencia el sistema requerirá un reinicio.

Dado el problema que causa este aparente comando u otro similar una buena recomendación a seguir es no ejecutar ningún comando obtenido de internet que no se sepa lo que hace y de igual modo ningún programa o script de shell no obtenido de una fuente de confianza. En las distribuciones GNU/Linux la fuentes confiables son los repositorios oficiales.

Para GNU/Linux y los sistemas operativos en general uno de sus requisitos es que sean seguros e implementan medidas para que así sean incluso con el apoyo de los procesadores a nivel de hardware pero hacen lo que se les dice y no están a salvo de las estupideces por desconocimiento que pueda cometer el usuario.

Referencia:

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

Blog Bitix

Servicio de configuración para microservicios con Spring Cloud Config

septiembre 15, 2018 05:30

Spring
Java

Al igual que un servicio de registro y descubrimiento es esencial para los microservicios un servicio de obtención de configuración de donde puedan obtener su configuración es también básico. Dado el gran número de microservicios de los que puede estar compuesta una aplicación, su carácter efímero, los varios entornos de ejecución (desarrollo, pruebas, producción, …) mantener centralizada la configuración en un único sitio hace las cosas mucho más sencillas cuando hay que cambiar el valor de alguna propiedad, en vez de la alternativa aún externalizada del artefacto del microservicio en el sistema de archivos del entorno de ejecución.

Dado que este servicio de configuración es esencial para que los microservicios puedan obtener su configuración sin la cual no podrían proporcionar su funcionalidad hay que configurarlo de tal manera que sea tolerante a fallos. Una de las medidas para hacerlo tolerante a fallos es iniciar varias instancias de servidores de configuración, estas instancias se autoregistran en el servicio de descubrimiento para que los microservicios puedan descubrirlos y obtener su configuración al iniciarse.

Con el comando ./gradlew configserver:run –args=“–port=8090” se inicia una instancia de servicio de configuración en el puerto 8090, cambiando el número de puerto se puede iniciar otra instancia en el puerto especificado. Una vez iniciadas varias instancias en el dashboard del servicio de descubrimiento se observa como se autoregistran y su estado.

Servicios y su estado registrados en el servicio de registro y descubrimiento

Dado que los servicios de configuración no pueden confiar en obtener su configuración de una instancia de su servicio de configuración ha de establecerse en el propio microservicio los nombres de host de las instancias de registro y descubrimiento en las que registrarse, en la propiedad eureka.client.serviceUrl.defaultZone.

Los archivos de configuración para los microservicios en este ejemplo están en el directorio misc/config donde siguiendo algunas convenciones para asignar el nombre a los archivos se pueden personalizar las configuraciones de los microservicios según el entorno y perfil con el que se active. En este caso se utiliza lo que Spring Cloud Config denomina un filesystem backend, sin embargo, hay otras disponibles como un repositorio de git el cual ofrece varias ventajas propias de un repositorio de código como historial, ramas de trabajo y hacer cambios con un commit.

Un microservicio o aplicación de Spring que use un servidor de Spring Cloud Config una de las primeras acciones que realiza al iniciarse es obtener su configuración en función del nombre del microservicio y perfil con el que se inicie. Dado que la configuración se obtiene en el inicio en base a su nombre y perfil tanto el nombre del microservicio y su perfil de configuración se ha de configurar en el archivo bootstrap.yml.

El proceso de configuración de un microservicio está formado por dos pasos, en el primero el servicio se conecta al servicio de registro y descubrimiento obtiene los servicios registrados de configuración y en el segundo paso solicita a uno de ellos su configuración.

El servicio de configuración es accesible mediante una interfaz REST. Para obtener la configuración del servicio service y del servicio client de este ejemplo las URLs para obtenerlas son las siguientes. Estos endpoints devuelven en formato json un documento con los valores de las propiedades principalmente están en el mapa source entre otros datos que Spring al iniciar la aplicación con ellos configura la aplicación.

En otro artículo relacionado con la configuración de los microservicios comentaré como recargar la configuración de los microservicios sin necesidad de reiniciarlos y como almacenar datos sensibles de forma cifrada para mayor seguridad.

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando el comando ./gradlew run:configserver --args="port=8090".

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

Picando Código

Siete días en el Megaverso

septiembre 15, 2018 12:14

Noticias de cómics, cine, TV y videojuegos como ejercicio de escritura por alguien que debería escribir más seguido.

Esta columna nace como respuesta a la columna de Nacho Alcuri: Siete días en el Multiverso. Se trata de una serie de notas con una línea editorial que se inclina claramente hacia cierto extremo del espectro polí… digo del mundo de los cómics. Como defensor de la justicia, la libertad y la información como herramienta para alcanzarlas, propongo una contra columna con una clara inclinación hacia el extremo opuesto del espectro. Seguramente sea más entretenido leer esto después de haber leído la columna de Nacho.

Salgan los jueves, total el viernes es el último día de la semana laboral (para gran parte de nosotros que tenemos “trabajos de oficina”). Lo que sí recomendaría es no salgan los sábados. Porque es cuando sale todo el mundo y está todo lleno de gente. Es más tranquilo salir los domingos.

Largados

Los que seguimos a los héroes de la Casa de las Ideas en distintos medios no festejamos esta semana la salida de ningún servicio en particular. Si queremos acceder al catálogo de cómics en formato digital tenemos Marvel Unlimited, con acceso a más de 20.000 títulos. En animación no nos estamos perdiendo de mucho porque tampoco es que Marvel se destaque en eso. Está bien, que sean los mejores en crear un universo cinematográfico pero no son perfectos.

En lo que refiere a Netflix (aprovechemos a disfrutar el contenido de Marvel mientras Disney no saca su propio servicio de streaming y se lleve todo para ahí), se estrenó nueva temporada de Iron Fist (meh) y próximamente tendremos temporada 3 de Daredevil (yey). Con el garrón que me comí de mirarme toda la primera temporada de Iron Fist y que terminara en bruto cliffhanger, no merece una segunda oportunidad. Daredevil estuvo genial, así que ahí estaré para mirala.

Recuerden que se viene la película de Venom en octubre. En lo personal me es imposible olvidarlo porque Marvel viene queriendo convencernos de que Venom es un personaje genial con crossovers en casi todos los títulos de su línea. Me tocó directamente sólo con Venom Inc que invadió los títulos de Spider-Man. Si bien tenía alguna buena idea, no dejó de sentirse como una movida marketinera para intentar venderme a Venom. Ojalá me sorprenda pero no tengo mucha expectativa (lo dice alguien que de todas formas vaya a verla al cine). Estoy esperando con mucho más ansias Spider-Man: Into the Spider-Verse.

Mi opinión jugada, subjetiva y por lo tanto indiscutible: DC anda bien para la animación, Marvel para las películas. Pero nunca le voy a perdonar a DC la cancelación de Green Lantern: The Animated Series tras la primera temporada (la definiría casi tan injusta como la cancelación de Firefly). Y a Marvel tampoco le perdono cancelar la serie animada Avengers: Earth Mightiest Heroes para reemplazarla por la basura cósmica de Avengers Assemble.

Capitana Marvel

El martes 18 de setiembre tendríamos el estreno del primer trailer de Captain Marvel, una de las películas más esperadas del Universo Cinematográfico Marvel (por mí) y la primera en tener a una mujer super heroína como principal protagonista (en ese universo). La información surgió en una publicación eventualmente borrada en Reddit, hablando de la supuesta grilla filtrada del programa de televisión “Good Morning America”. Habrá que esperar a la semana que viene para saber si finalmente veremos a Brie Larson en acción como Captain Marvel.

Y hablando de Captain Marvel, se estrenó un trailer de la nueva serie animada Marvel Rising: Secret Warriors

Ésta se concentra en el equipo de super héroes integrado por Ms. Marvel, Squirrel Girl, Spider-Gwen (perdón, Ghost-Spider), America Chavez, Patriot, Inferno y Daisy Johnson (o Quake, o “la hacker” [abro un paréntesis anidado para decir que hago especial énfasis en las comillas] de la serie de TV Agents of S.H.I.E.L.D., con voz de la actiz en cuestión). En el trailer hace aparición Captain Marvel así que posiblemente tenga un rol de mentora con el equipo y particularmente Ms Marvel como en los cómics. También aparece el mejor perro de los cómics: Lockjaw (Otros columnistas de otros medios digitales dirían tal vez Krypto, pero ya sabemos de qué lado de la historia están…). Por cierto Lockjaw tuvo una mini serie en los cómics este año y es altamente recomendable. De la versión televisiva no voy a comentar nada porque esto es un sitio de bien y no hablamos de la serie de televisión de Inhumans.

No me he enterado de ninguna novedad entorno al relajo de Guardians Of The Galaxy 3 y James Gunn. Veremos si surge algo nuevo la semana que viene.

Cómics

La primera familia está de vuelta, volvieron los Fantastic Four. El primer número de este esperado regreso (que no sorprendió a nadie porque en los cómics nadie queda muerto excepto Mar-Vell 😢) estuvo medio flojo aunque esto no lo detuvo de estar bastante alto en el ranking de ventas. Dan Slott -quien había estado escribiendo Spider-Man suficiente tiempo como para darse cuenta que era momento de dejarle lugar a otro- hizo algo así como una introducción a lo que Ben y Johnny Storm venían viviendo por la suya. No conformó como primer número y era algo que venía haciendo mucho mejor Chip Zdarsky (me pongo de pie, porque en esta columna no somos devotos de otros falsos dioses aunque tengamos mucho respeto por cierto escritor calvo nacido en Escocia) en Marvel Two-In-One. Pero el segundo número publicado esta semana se vino con todo e hizo que seguir la serie valiera la pena.

Y ya que nombramos a Zdarsky, esta semana también salió Peter Parker: Spectacular Spider-Man #309, la conclusión de un arco de dos números centrados en Sandman. Zdarsky ha escrito de los mejores números de Spider-Man que he leído en mucho tiempo. Captura perfectamente el humor que uno espera de Spidey, pero las historias cuentan con la profundidad y heroísmo que lo caracterizan. No imaginé que después de tantas historias con Sandman, quedaran todavía excelentes historias nuevas por contar. Lamentablemente el próximo número va a ser el último de Zdarsky como autor, ya que se muda a otros proyectos en Marvel. Lo bueno es que su número despedida de la serie con un #310 escrito e ilustrado por él. Seguiré leyendo lo que escriba Zdarsky para Marvel así sea sobre Jarvis, el mayordomo de los Avengers.

En el ámbito cósmico, las cosas se están poniendo interesantes para Tierra 616. El actual evento cósmico tras el cual “nada volverá a ser como antes” es Infinity War. Si bien la conexión con el universo cinematográfico (aunque sea sólo por el nombre) es obvia, ha traído bastantes sorpresas y tiene muchos giros inesperados. Thanos tuvo un one-shot esta semana con Thanos Legacy, lectura recomendable conectada a los eventos de Infinity War. También medio conectado y medio en otro plano (bien puede leerse por separado sin depender de otros títulos) está Cosmic Ghost Rider. Este título parece ser el resultado de alguien en Marvel diciendo “Tenés carta blanca para hacer un cómic cósmico de lo que se te ocurra” y Donny Cates dejando volar su imaginación con tiburones espaciales. Diversión asegurada.

Aunque no todo es amor para Donny Cates, encargado también de Death of the Inhumans. ¡Literalmente está matando Inhumanos! Viene siendo lo único que hay para leer sobre Inhumanos, y si bien arrancó medio raro (no respeta mucho la continuidad o algunos agujeros argumentales se resolverán eventualmente) en el tercer número publicado la semana pasada la cosa empezó a agarrar color.

Una sorpresa muy bienvenida en este ámbito fue la publicación la semana pasada de Silver Surfer Annual #1. Inesperada porque el personaje no cuenta con serie regular actual después de terminada la escrita por Dan Slott. Bienvenida porque es una aventura autocontenida como un cuento corto de ciencia ficción con un arte que acompaña perfectamente. Recomendable, escrita por Ethan Sacks e ilustrada por André Lima Araújo. Veremos si se viene otra serie más de este estilo y menos “tratando de escribir cómics de Dr. Who con Silver Surfer”.

No todo lo que brilla es Marvel

La otra columna ya habló de Mister Miracle, pero acá hago eco porque lo vengo leyendo y es genial. La semana que viene se publica el penúltimo número 😱
Volition es un cómic de Aftershock sobre inteligencia artificial y robots. Me llamó la atención la premisa y no decepcionó. Está escrito por Ryan Parrot e ilustrado magistralmente por el artista argentino Omar Francia. Si les gusta la ciencia ficción, los robots, y el buen arte, no se pueden perder esta serie. Esta semana se publicó el segundo número. Hablando de artistas sudamericanos, la semana que viene sale un nuevo número de Coda, la serie de Boom ilustrada por el uruguayo Matías Bergara.

Consejo de la semana: Tengan cuidado con CBR, no tienen el más mínimo escrúpulo y te spoilean historias de los cómics en los títulos de sus noticias que también difunden por Twitter.

Videojuegos

El videojuego de Spider-Man para PlayStation 4 publicado la semana pasada sigue vendiendo como loco. La crítica y fans lo han recibido con muchos elogios, pero todavía no he tenido la oportunidad de probarlo. Y una para mi amigo Nacho, aparentemente un jugador descubrió un guiño a la Liga de la Justicia en el juego.

Esta semana hubo Nintendo Direct: La transmisión donde Nintendo anuncia sus novedades al mundo. En este caso se mostraron juegos nuevos para Nintendo Switch y 3DS. Hubo varias sorpresas, entre ellas las destacadas (porque son las que más recuerdo): Luigi’s Mansion 3 en 2019, prácticamente todos los Final Fantasy que existen, Cities Skylines, un bundle de juegos Beat ‘Em Up de Capcom, un Animal Crossing nuevo, New Super Mario Bros U Deluxe, y más. No te digo, te muestro. El juego de mechas gigantes que tiene bruta pinta pero nadie parece estar prestándole atención, Daemon X Machima, va a tener co-op online de hasta 4 jugadores.
Se vienen Mega Man 11 (que ya tiene un demo gratis en el eShop) y Diablo III en breve.

La semana que viene entra en funcionamiento Nintendo Online, el servicio en línea para Nintendo Switch. Creo que no podemos esperar mucho, Nintendo no parece haber resuelto bien qué esperan sus usuarios de este servicio. Diría que no me pueden decepcionar si no tengo expectativas, pero la experiencia me ha demostrado que por muy bajas que estén, igual puedo decepcionarme.

Caballos

Para que vean que con Nacho está todo bien, también comparto el trailer de la quinta temporada de Bojack Horseman, que empecé a mirar justo antes de ponerme a escribir esto y es muy genial:

Al terminar de escribir esto la seguiré mirando y discutiendo spoilers.

Por si no resulta obvio, la rivalidad con la otra columna no es para ser tomada en serio y estoy en buenos términos con Ignacio Alcuri (por ahora… 😏)

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

Picando Código

¡Feliz día del Programador!

septiembre 13, 2018 07:07

Picando Código

Feliz día del programador lectores y lectoras de este blog. El día del programador se celebra en el día número 256 (28) del año por ser la cantidad de valores representables en un byte de datos (13/9 en los años comunes y 12/9 años bisiestos).

Como todos los años, hago un balance de lo que ha sido el último año en programación y un repaso de lo que ando. Al igual que el año pasado, estoy trabajando en la empresa Cultivate en Edimburgo, Escocia. Llevo más de un año viviendo acá, he conocido muchos lugares del país y me gusta mucho.

En cuanto a programación he estado haciendo Ruby y ya he escrito algo de código Go en producción. No es el lenguaje que más me gusta, pero es lo que hay que usar. He estado bastante contento con Spacemacs y cada vez aprendo más y le agrego más cosas que me facilitan el trabajo día a día. Tengo pensado escribir algun artículo sobre Spacemacs por acá en algún momento. Tengo unos cuantos artículos más en mente, pero siempre me termino distrayendo y no me siento a escribir. He estado programando en varios proyectos personales y espero terminarlos pronto para poder estar escribiendo al respecto por acá. Casi todo en Ruby, algo de Elixir y con ganas de aprender Rust y otras cosas.

En cuando a conferencias, volví un poco al ruedo. Estuve en Euruko 2017, Bath Ruby 2018 y ElixirConf EU 2018. Las conferencias de Ruby siguen siendo mis favoritas, y espero ir a alguna más el año que viene y ver más gente conocida por ahí.

No he escrito tanto como quisiera en el blog, pero escribí dos artículos para la diaria:

También he escrito cosas en el blog de Cultivate (en inglés):

Como resumen, no he estado escribiendo tanto como quisiera por acá, pero sí he estado escribiendo código fuera del trabajo, lo que me resulta entretenido y me mantiene programando fuera de lo que el deber exige. Así están las cosas por Picando Código. ¡Feliz día! A quienes sigan leyendo del otro lado, ¿en qué andan por estos días? ¿Qué están programando? ¿Qué proyectos tienen en desarrollo o en mente?

El día del programador otros años: 2007200820092010201120122013201420152017

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

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

Visual C++ 2008 vs Visual C++ 2017

septiembre 13, 2018 08:05

Tal vez recordéis Sieve en PowerBASIC Console Compiler 6 donde comparaba la última versión de PowerBasic Console Compiler (6.04) de 2011, con la anterior (5.0) de 2008. Continuando con el artículo de WinAPI contra C, intrínsecas, C++ y ensamblador donde evaluábamos diferentes mecanismos de hacer lo mismo sobre Windows, hoy compararemos la evolución que ha […]

La entrada Visual C++ 2008 vs Visual C++ 2017 aparece primero en Bitácora de Javier Gutiérrez Chamorro (Guti).

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

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

UnQlite compilado para Windows (32 y 64 bits)

septiembre 11, 2018 10:16

Han pasado unos años desde que compilara SQLite para Windows x64. Hoy ocurre algo parecido, y es que gracias al nuevo Take Command he descubierto esta nueva base de datos NoSQL. A diferencia de MongoDB o Redis, UnQlite se ha diseñado para ser standalone, o serverless como ellos lo llaman. Es decir, funciona embebido sin […]

La entrada UnQlite compilado para Windows (32 y 64 bits) aparece primero en Bitácora de Javier Gutiérrez Chamorro (Guti).

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

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

WinAPI contra C, intrínsecas, C++ y ensamblador

septiembre 04, 2018 08:48

Vamos a proseguir con las comparativas que iniciamos en WinAPI vs C en donde si recordáis comparábamos las funciones de la RTL de los compiladores de Visual C++ 2017 y C++ Builder 10.2.3 contra las funciones de la API de Windows. Hoy vamos a centrarnos en Visual C++, y lo que procederemos será a comparar […]

La entrada WinAPI contra C, intrínsecas, C++ y ensamblador aparece primero en Bitácora de Javier Gutiérrez Chamorro (Guti).

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

proyectos Ágiles

Motivación de personas y liderazgo

septiembre 03, 2018 05:58

Principios sobre motivación de personas y su relación con el liderazgo.

Para ver el texto más pequeño o imprimir las imágenes en mayor resolución, con el botón derecho del ratón hacer clic en la imagen  y escoger la opción “Abrir imagen en una pestaña nueva”. 

Características del nuevo líder:

Liderazgo inspirador y cuidar a la gente

Cambio de paradigma motivacional: del industrial (inicios del siglo XX, con los riesgos de aplicar una cultura del miedo) al paradigma moderno (especialmente en aquellas áreas donde hay gran demanda de empleados especialmente cualificados). Quien conscientemente utiliza el miedo para conseguir determinados resultados a corto plazo, debería saber que los efectos reales que va a producir a medio plazo en realidad no le van a ayudar a conseguir sus propios intereses (con lo cual no tiene sentido un liderazgo basado en miedo y/o coercitivo):

Refuerzo positivo vs palo y zanahoria, miedo

Los beneficios de una empresa son consecuencia de la motivación de la gente que la compone. Gente desmotivada difícilmente creará productos o servicios excepcionales (y los más preparados marcharán, derivando los resultados hacia la mediocridad).

Empleados motivados = beneficios

Ejemplos de cómo se desmotivan las personas (a eliminar):

Factores desmotivacionales

Ejemplos de aspectos motivacionales (a fomentar):

Factores motivacionales

Los factores de la motivación intrínseca (la propia persona se motiva, la motivación es más auto-sostenible, si se ha creado un mínimo contexto adecuado) y la  motivación extrínseca (la motivación viene más dada por el contexto, su sostenibilidad es menor), en función de su impacto mayor en la motivación de las nuevas generaciones, como los Millennials (que fundamentalmente buscan aprender mucho en sus primeros años y estar en un ambiente de trabajo donde hagan mucha conexión social).

Motivación y millennials

Visión global de los factores clave en la motivación intrínseca (autonomía, maestría y propósito) y la motivación extrínseca (abrir la imagen en otra pestaña para verla a tamaño completo):Factores de motivación

Notar que subida de salario tiene un recorrido muy corto: si el entorno sigue siendo muy poco motivante, al poco tiempo la persona volverá a sufrirlo. Es por ello que uno de los principales objetivos del Management es crear un entorno motivante, con visión inspiradora, donde se cuide a las personas.

[Parcialmente basado en el trabajo de Daniel Pink y Ángel Medinilla].

Artículos relacionados

 

 

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

Picando Código

10 años de List Category Posts, mi primer plugin para WordPress

agosto 29, 2018 10:06

Mientras trabajaba en List Category Posts, recordé que debía estar por cumplir la década en cualquier momento. Fijándome en el repositorio svn original, encontré que así es:

~/workspace/picandocodigo/list-category-posts
$ svn log -r 1:HEAD --limit 2
------------------------------------------------------------------------
r59895 | plugin-master | 2008-08-16 15:09:04 +0100 (Sat, 16 Aug 2008) | 1 line

adding list-category-posts by fernandobt
------------------------------------------------------------------------
r59980 | fernandobt | 2008-08-16 21:27:29 +0100 (Sat, 16 Aug 2008) | 1 line

Adding version 0.1 of the plugin
------------------------------------------------------------------------

  

No sólo fue mi primer plugin de WordPress, sino que fue el que tuvo más popularidad. Más de 10 años después, List Category Post sigue vivo y coleando. Según WordPress.org, hay más de 100.000 instalaciones activas del plugin y ya ha tenido más de 2 millones de descargas. Tiene un rating de 94/100 y tanto el foro como mi correo electrónico se mueven bastante con dudas y consultas.

En algún momento me dió trabajo, y he recibido alguna que otra donación (tanto a través de PayPal como libros de mi wishlist de Amazon). También cada tanto recibo un mail de alguien agradeciéndome por el plugin. Me hacen tan bien los mensajes de agradecimiento tanto en los correos como en las reseñas que opacan totalmente los otros.

Un aspecto que ha ayudado mucho al desarrollo es los colaboradores. He tenido la suerte de contar con los colaboradores que cualquier desarrollador de un proyecto de software libre sueña. El más reciente zymeth25 ha sido responsable de la mayoría de las actualizaciones los últimos tiempos. Ni que hablar que el proyecto me ha dado una experiencia tremenda en lo que es desarrollar código abierto y libre, con todo lo bueno y lo malo que eso acarrea.

WordPress sigue siendo la única razón por la que sigo programando PHP de vez en cuando. No he seguido muy de cerca el desarrollo pero parece que el lenguaje se ha modernizado bastante en las últimas versiones. Sigo prefiriendo Ruby y otras cosas, pero está bueno mantenerme al tanto de PHP aunque sea un poco a la distancia.

Es difícil adivinar si WordPress va a seguir siendo relevante dentro de 10 años, era difícil imaginar que iba a seguir manteniendo este proyecto 10 años después. Pero por todo lo que me ha dado en esta década y lo que ha aportado a mi carrera profesional, hoy brindo por 10 años más de List Category Posts 🍻. Y terminado de escribir este blog, sigo revisando Pull Requests antes de publicar una nueva versión.

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

Variable not found

El filtro [ApiController] en ASP.NET Core MVC 2.1

agosto 06, 2018 06:00

ASP.NET Core MVCUno de los objetivos de ASP.NET Core ha sido siempre servir como infraestructura para la creación de servicios HTTP o APIs web, por lo que ya desde las primeras versiones se incluían funcionalidades específicamente diseñadas para facilitar esta tarea.

ASP.NET Core 2.1 continúa profundizando en esa línea e incluye entre sus novedades el nuevo atributo [ApiController], un decorador aplicable a controladores que los identifica como puntos de entrada de APIS, aplicando de forma automática una serie de convenciones bastante útiles a la hora de crear este tipo de componentes:
[ApiController]
[Route("api/[controller]")]
public class ValuesController : ControllerBase
{
...
}
Fijaos que, a diferencia de ASP.NET Web API (.NET Framework), se ha optado por utilizar un atributo en lugar de emplear herencia (en aquél framework existía la clase ApiController).
A continuación veremos qué debemos tener en cuenta a la hora de aplicar este atributo a nuestros controladores y qué convenciones son las que estaremos asumiendo al utilizarlo.

Obligatoriedad de usar rutas explícitas

El atributo [Route] es obligatorioLa aplicación de [ApiController] a un controlador hace obligatorio el uso de rutado por atributos hacia sus acciones. Es decir, los controladores decorados con [ApiController] no serán accesibles utilizando rutas por convenciones, como las definidas en el método Configure() de la clase Startup. De no ser así, se lanzará una excepción durante el arranque de la aplicación y no se podrá ejecutar.

Por tanto, este atributo vendrá siempre acompañado del correspondiente [Route], ya sea a nivel de controlador, o en sus acciones.
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
...
}

Inferencia del origen de parámetros

Al decorar un controlador con [ApiController], el binder usará el siguiente criterio, en orden de aplicación, para determinar desde dónde obtener los valores para los parámetros de las acciones:
  • Los parámetros de tipo complejo (clases, básicamente) se obtendrán desde el cuerpo de la petición. Sería equivalente a decorar el parámetro con [FromBody] en versiones anteriores a ASP.NET Core 2.1, por lo que, como ocurría anteriormente, sólo puede existir un parámetro de este tipo en las acciones.
     
  • Los valores para los parámetros de tipo IFormFile e IFormFileCollection serán tomados desde los valores recibidos como campos de formulario. Equivalente a usar [FromForm] en versiones anteriores.
     
  • Los parámetros cuyo nombre coincida con un valor presente en la ruta de la petición serán tomados desde ella, es decir, como si estuvieran decorados con [FromRoute].
     
  • El resto de parámetros se asumirá que proceden de la query string, equivalente a aplicar FromQuery] sobre ellos.
Por ejemplo, en una acción código como la siguiente, el valor del parámetro id se obtendrá desde la ruta de la petición, Invoice desde el cuerpo de la petición, y returnUrl desde la query string, todo ello sin necesidad de especificarlo expresamente:
[ApiController]
[Route("api/[controller]")]
public class InvoiceController: ControllerBase
{
[HttpPost("update/{id}")]
public ActionResult<InvoiceCreationResult> Update(int id, InvoiceInfo invoice, string returnUrl)
{
...
}
}

Errores HTTP 400 automáticos cuando el estado del modelo es inválido

Cuando entra una petición dirigida hacia una acción perteneciente a un controlador decorado con [ApiController], el binder cargará sus parámetros y aplicará automáticamente las validaciones asociadas a los datos de entrada. Como es habitual, el resultado de dicha validación lo tendremos en la propiedad ModelState.IsValid.

Pues bien, por defecto, el framework comprobará todos los objetos recibidos, y retornará un error HTTP 400 cuando se produzcan errores de validación. A continuación puedes ver un ejemplo de acción que devuelve el mismo objeto que recibe como parámetro, y el resultado obtenido de algunas peticiones:
public class Friend
{
[Required]
public string Name { get; set; }
[Range(0, 120)]
public int Age { get; set; }
}

[Route("api/[controller]")]
[ApiController]
public class TestController : ControllerBase
{
[HttpPost]
public ActionResult<Friend> Friend(Friend f)
{
return f;
}
}
PeticiónRespuesta
Enviamos un objeto correcto:
POST https://localhost:44399/api/test/ HTTP/1.1
Host: localhost:44399
Content-Length: 34
Content-Type: application/json

{
   name: "John",
   age: 34
}
HTTP 200, con el mismo objeto recibido:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Server: Kestrel
Content-Length: 24

{"name":"John","age":34}
Objeto con contenidos inválidos en los campos:
POST https://localhost:44399/api/test/ HTTP/1.1
Host: localhost:44399
Content-Length: 31
Content-Type: application/json

{
   name: "",
   age: 200
}
HTTP 400 con el resultado de las validaciones incorrectas:
HTTP/1.1 400 Bad Request
Content-Type: application/json; charset=utf-8
Server: Kestrel
Content-Length: 91

{
   "Age":["The field Age must be between 0 and 120."],
   "Name":["The Name field is required."]
}
Ni siquiera enviamos un objeto:
POST https://localhost:44399/api/test/ HTTP/1.1
Host: localhost:44399
Content-Length: 0
HTTP 400 indicando un error en el objeto:
HTTP/1.1 400 Bad Request
Content-Type: application/json; charset=utf-8
Server: Kestrel
Content-Length: 33

{"":["The input was not valid."]}

Personalización o desactivación de algunos comportamientos

Aunque las convenciones asociadas al uso de [ApiController] son bastante razonables, si por cualquier motivo queremos desactivar alguno de los comportamientos por defecto, podemos hacerlo desde el método ConfigureServices() de la clase Startup.

En el siguiente código muestra cómo desactivarlas todas (ya, mucho sentido no tendría, pero me vale como ejemplo ;))
services.Configure<ApiBehaviorOptions>(options =>
{
options.SuppressConsumesConstraintForFormFileParameters = true;
options.SuppressInferBindingSourcesForParameters = true;
options.SuppressModelStateInvalidFilter = true;
});
Ojo, que estas líneas deben incluirse después de haber añadido los servicios de MVC con services.AddMvc(), porque de lo contrario no funcionará.
También podemos configurar el tipo de resultado que se retornará cuando se detecte que el estado del modelo es inválido. Por ejemplo, en el siguiente código se establece como respuesta un resultado del tipo NotFoundResult(), lo que provocará que nuestros clientes obtengan un HTTP 404 como respuesta a una petición con datos inválidos:
services.Configure<ApiBehaviorOptions>(options =>
{
...
options.InvalidModelStateResponseFactory = context => new NotFoundResult();
});
¡Y eso es todo! Espero que lo que hemos visto os sea de utilidad, y gracias a estas pequeñas novedades os resulte más sencillo el desarrollo de APIs HTTP con ASP.NET Core :)

Publicado en Variable not found.

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

Navegapolis

LOS 6 FACTORES DE LA PRODUCTIVIDAD DEL TRABAJADOR DEL CONOCIMIENTO

agosto 04, 2018 10:23

6 factores

La expresión "trabajador del conocimiento" fue acuñada por Peter Druker a finales de la década de 1950, que intuyó adelantándose a su tiempo la importancia de los trabajos que requieren un conocimiento profesional especializado.

Los analistas de datos, programadores, investigadores, abogados o profesores son ejemplos de trabajadores del conocimiento. Se trata de personas con un alto nivel de formación y experiencia, cuyo trabajo requiere la aplicación de su conocimiento tácito de forma creativa e innovadora.

Valorar y mejorar la productividad de este tipo de trabajos no es fácil porque el objetivo no es cantidad, sino calidad. Y las estrategias basadas en incrementar el tiempo o  la presión con la que se realiza el trabajo se vuelven en contra del objetivo al empobrecer la calidad y valor.

Andrew Mawson, Karen Plum, Rob Briner, Eric Barends y Denise Rousseau identifican los 6 factores clave para mejora la productividad de los factores del conocimiento(1) :

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

Koalite

Siete años

julio 23, 2018 05:06

Otra vez llego por los pelos, pero llego. No está siendo nada fácil este año darle continuidad al blog. Pese a todo, ya van casi 350 entradas desde que empecé a escribirlo, que no está del todo mal. Este año además he vuelto a mezclar posts más teóricos, con otros más técnicos y mis típicos posts de quejarme.

Ya decía el año pasado que me estaba costando mantener mi frecuencia de publicación programada de un post cada dos semanas y que eso no tenía visos de cambiar en un futuro cercano, y así ha sido.

Mi intención con este blog siempre ha sido, y sigue siendo, aprender cosas y disfrutar escribiendo. Eso no ha cambiado. En realidad, pocas veces he aprendido más rápido a lo largo de mi vida, pero es un aprendizaje enfocado a mi otro proyecto.

Mi otro proyecto personal sigue avanzando muy bien después de 16 meses (ahora le ha llegado el momento de escalar, literalmente), y la verdad es que ahora mismo es donde prefiero invertir mi tiempo y energía.

¿Eso quiere decir que esto se termina? Ni idea. Me gustaría que no fuera así. De momento, me apetece descansar, pasar el verano centrado en otras cosas y dejar esto en pausa. Ya veremos en septiembre qué pasa.

De todas formas, sigo abierto a discutir de cualquier cosa entretenida en twitter o por correo.

52285

Feliz verano a todos.

No hay posts relacionados.

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

Una sinfonía en C#

[VIDEO] Clean code en Javascript

julio 22, 2018 04:17

Hace ya un tiempo que he tenido la suerte de dar una charla para la comunidad de Frontend Developers de Madrid, en este caso sobre clean code, buenas prácticas, SOLID, etc. en Javascript.

Al final hubo una sesión de refactor en vivo aplicando algunos de los conceptos

El video

 

Y las diapositivas que utilicé en la charla

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

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

Improve, ingenuity, support, resume, designed y location

julio 20, 2018 06:49

Continuamos con Remover, resumir y otros términos, en esta ocasión incorporando las sugerencias de nuestros lectores: Kabe, bianamaran y las mías propias. Para aportar algo de variedad al asunto, nos centraremos en anglicismos, muchos de ellos provenientes del entorno tecnológico, en esta ocasión, partiendo de sus términos en inglés, que se adaptan equivocadamente al español. […]

La entrada Improve, ingenuity, support, resume, designed y location aparece primero en Bitácora de Javier Gutiérrez Chamorro (Guti).

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

Meta-Info

¿Que es?

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

rss subscripción

Sponsors

Puedes utilizar las siguientes imagenes para enlazar PlanetaCodigo:
planetacodigo

planetacodigo

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

Idea: Juanjo Navarro

Diseño: Albin