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

Picando Código: Conceptos de computadoras y consolas Commodore 64 portátiles

$
0
0

Computadoras y Consolas Commodore 64 Portátiles

Me fascinan estos conceptos de computadoras Commodore 64. Los diseños están muy buenos y los render son sumamente detallados. La textura de los plásticos, los botones, está todo muy bien hecho. El artista hace modelados y estudios de conceptos de diseño y fabricación con modelado CAD y texturizado PBR. Además de servirle como portfolio, lo comparte también para la comunidad que ama estas computadoras. Esa comunidad no es menor, Commodore se declaró en banca rota y dejó de existir en 1994 y todavía sigue habiendo mucha gente haciendo cosas con Commodore 64.

Siempre que veo este tipo de cosas me lamento cómo en algún momento los dispositivos empezaron a tender a una uniformización del diseño. Las laptops todas plateadas o negras, sin mucho color ni forma original. Los teléfonos una cajita negra con bordes redondeados y nada más… De repente la mayoría de éstas decisiones se basan en eficiencia de uso y ergonomía, pero probablemente sobretodo se enfoquen a abaratar los costos de producción. Pero me gustaría ver más variedad en el diseño de dispositivos electrónicos. El color de la laptop por ejemplo podría ser una opción básica a la hora de comprar una nueva.

El artista responsable de estas genialidades es Cem Tezcan, Diseñador Técnico y Freelance. Pueden visitar el enlace para saber más del autor, o ver más de sus obras en ArtStation. Ahí van a encontrar estos diseños e imágenes con mayor resolución, algunas animaciones y más sobre el proceso. También tiene otros trabajos muy interesantes como escenas de los 90s, de los 70s, un Atari y más.

Imaginemos un mundo alternativo donde Commodore no se fundió en los 90’s y siguió desarrollando computadoras:

Handheld Retro PC – Commodore HX-64

Commodore HX-64

Este concepto fue parte de la práctica mensual de diseño de producto del autor. Decidió crear una Commodore 64 portátil que usa “mini cassettes” para cargar programas o juegos. Está inspirada más que nada en productos electrónicos Commodore viejos para crear un aparato soñado.

No me molestaría para nada usar algo así. Uno de mis mayores problemas con los teclados de pantalla táctil es que no hay feedback de donde estamos tocando entonces siempre le error a las teclas (y porque los dedos son muy gordos para un teclado tan chiquito). No sería lo más práctico del mundo, pero estaría bueno un dispositivo así.

Ver en ArtStation

Commodore CP-64

Commodore Pocket CP-64

Un diseño conceptual de una versión de bolsillo de las computadoras Commodore 64. El hardware es todo moderno, pero vendrían cargadas de software retro. Imaginen tener uno de éstos al lado de un Game Boy Advance, o Nintendo DS. Lo interesante es que con una impresora 3D, y las habilidades suficientes, no sería imposible crear una de éstas real. Recomiendo mirar las fotos y animaciones de mayor resolución para apreciar las texturas del plástico y la pantalla:

Ver en ArtStation

Commodore PX-64 – Reboot Concept

Commodore PX-64 - Reboot Concept

Otro diseño conceptual que el autor comenta está atado al final de la era de la Commodore 64. Pertenecen teóricamente (e imaginariamente) a 1993-94, un último reboot de las computadoras Commodore 64. Hay dos versiones, una con estilo metálico color turquesa y otra con colores más clásicos.

Me hicieron acordar a las agendas electrónicas que había en los 90s. Mi padre tenía una y me acuerdo que cuando me la prestaba la vivía usando para hacer dibujos en formato ASCII 🙂
Tiempos más simples…

Ver en ArtStation

Portable BMC 64 Emulator – Mk II

Portable BMC 64 Emulator - Mk II

Este último se trata de un aparato que sí se volvió real. El autor creó un dispositivo para uso personal para BMC64, un emulador para Raspberry Pi. Podemos ver un blog post y un video en este enlace, sobre cómo fue el proceso y cómo funciona el dispositivo. Aprovechando que lo modeló y armó después de imprimirlo con una impresora 3D, también produjo unos renders. Después agregó este empaquetado en formato de blister, con un resultado excelente en los detalles del plástico del empaquetado.

Ver en ArtStation

El post Conceptos de computadoras y consolas Commodore 64 portátiles fue publicado originalmente en Picando Código.

Picando Código: [Plugin WordPress] List Category Posts – 0.84

$
0
0

Ayer publicamos una actualización del plugin de WordPress List Category Posts, la versión 0.84. Se trata de una versión bastante especial por varias razones.

List Category PostsEn primer lugar, porque la publicación estuvo prácticamente 100% a cargo de Klemens Starybrat, uno de los colaboradores del plugin que más ha trabajado en el plugin en los últimos años. Klemens viene respondiendo preguntas en el foro de WordPress, resolviendo problemas en GitHub, actualizando el código, agregando funcionalidad y más. Ya es un colaborador oficial con permisos en GitHub y listado en la página del plugin como colaborador. También desarrolló un plugin que provee una interfaz gráfica para generar shortcodes de List Category Posts: GUI for List Category Posts.

Es lo bueno de escribir código de código abierto, se terminó transformando en un proyecto comunitario y ya no depende exclusivamente de mí para recibir actualizaciones o nuevas versiones 😁

Otro aspecto muy bueno de esta versión es que fue la primera vez que publicamos un release nuevo con GitHub Actions. Por alguna razón WordPress.org sigue usando Subversion para el control de versiones y publicación de sus plugins. Hasta ahora había sido la única razón por la cual tenía Subversion instalado en mi laptop, pero ya lo pude desinstalar sin problemas. Estamos usando esta acción: 10up/action-wordpress-plugin-deploy. Ahora al crear un tag en GitHub, que es como manejamos los releases, se publica automáticamente en WordPress.org.

Como si fuera poco, esta versión trae un montón de cambios y mejoras después de un buen tiempo sin actualizaciones:

  • Nuevo: Elegir mostrar posts específicos por ID: ⦋catlist includeposts="2,97"⦌. ¡Gracias @hvianna!
  • Nuevo: Filtro avanzado de customfield con customfield_compare, ver la documentación por instrucciones.
  • Nuevo: Es posible darle estilo a category_description con category_description_tag ycategory_description_class.
  • Se cambió el tag por defecto que envuelve el contenido al usar content=yes a <div> para evitar generar HTML inválido (previamente era <p>).
  • Corregido excerpt_full que no pasaba los filtros the_excerpt (¡gracias a @StefanXRoos!). Los filtros se aplican igual que con excerpt_yes. Por favor revisa tu setup si estás usando excerpt_full.
  • Corregido bug en display_id, ¡gracias por reportarlo @Fiestoforo!
  • Corregidas advertencias de PHP en el admin de WordPress causadas por el widget, gracias por reportarlo @hiskingdomprophecy (#420).
  • Corregido filtro posts_where que no estaba siendo eliminado correctamente al usar starting_with.
  • Gran refactoreo de la generación de HTML haciéndolo más fácil de mantener.
  • Actualizado a PHP 7.4 en la máquina Vagrant.

List Category Posts es un plugin para WordPress, es software libre publicado bajo la GPLv2. El código fuente está disponible en GitHub y en WordPress.org (SVN). Se puede descargar desde el sitio de plugins de WordPress.

El post [Plugin WordPress] List Category Posts – 0.84 fue publicado originalmente en Picando Código.

Variable not found: ¿Cuánto pesa realmente una aplicación Blazor WebAssembly recién creada?

$
0
0
Blazor

Cuando empezamos a estudiar Blazor WebAssembly e interiorizamos que para ejecutar .NET en el navegador es necesario llevar hasta éste el runtime y bibliotecas, tanto del propio framework como las de nuestra aplicación, una de las primeras dudas que nos asaltan es que cuánto peso tendrá eso. O dicho de otra forma, qué recursos tendrán que descargar los usuarios y qué tiempo tendrán que esperar hasta tener la aplicación en funcionamiento.

En este post vamos a intentar dar respuesta a esta pregunta, aunque con matices. Obviamente, parte de ese peso dependerá de la aplicación; si se trata de un proyecto grande, con muchos ensamblados o que usen muchos componentes externos (p.e. paquetes NuGet), el número de archivos y el tamaño de la descarga crecerá inexorablemente. Por esa razón, no podremos ver aquí números absolutos, sino los mínimos, es decir, lo que pesará una aplicación Blazor WebAssembly recién creada, con los contenidos proporcionados por la plantilla por defecto usando .NET 5.

Tampoco hablaremos de tiempos, pues son totalmente dependientes de las condiciones de red, la infraestructura en la que despleguemos la aplicación y las posibilidades del cliente. Simplemente tendremos en consideración que a más peso, mayor tiempo será necesario para llevarlo al navegador y ejecutarlo.

Ojo: lo que vamos a ver son los datos aproximados obtenidos en mi máquina de desarrollo y con la versión actual de Blazor (5.0.4). Los números exactos variarán si hacéis pruebas en vuestro entorno, aunque seguro que el espíritu de las conclusiones seguirá siendo el mismo.

Escenario 1: aplicación ejecutada en el entorno de desarrollo por primera vez

Acabamos de crear una aplicación Blazor WebAssembly con Visual Studio y pulsamos F5.

Peticiones realizadas204
Contenido transferido (comprimido)9.2 MB
Contenido cargado en la página (descomprimido)22.8 MB

Panel de red en las herramientas de desarrollador, mostrando gran cantidad de recursos descargados¿De dónde salen estos números tan altos? Pues hay que tener en cuenta varios factores:

  • Estamos descargando, además de la página "raíz" que actúa como lanzadora de la aplicación y sus recursos relacionados (CSS, JS, iconos, fuentes), entre otros:
    • El runtime WebAssembly de .NET
    • Archivos de manifiesto y configuraciones
    • Los ensamblados (*.dll) de .NET 5
    • Los ensamblados de nuestra aplicación
    • Los datos de zonas horarias
  • El entorno de ejecución es Development, por lo que no se aplica ningún tipo de optimización.
  • No tenemos nada en caché, por lo que nuestro navegador deberá descargar todos los recursos.

Aunque en nuestra máquina local o en redes internas la descarga de esos más de 9 MB no suponga ningún problema, en otro tipo de conexiones sí podría resultar un retraso importante para la carga. Sin embargo, recordad: estamos en el entorno de desarrollo y es la primera vez que ejecutamos.

Escenario 2: aplicación ejecutada en el entorno de desarrollo por segunda vez o sucesivas

Tras la primera ejecución, detenemos el proyecto y lo volvemos a lanzar desde Visual Studio pulsando la tecla F5.

Peticiones realizadas11
Contenido transferido (comprimido)5.6 kB
Contenido cargado en la página (descomprimido)529 kB

¡Uau! ¡Pues sí que cambió la cosa! En la primera carga gran parte de los recursos (en particular, el runtime y bibliotecas de .NET) se almacenaron en la caché del navegador, por lo que no fue necesario volver a obtenerlos.

Los contenidos cacheados son almacenados junto con un hash que permite detectar cuándo han cambiado. No se volverán a descargar salvo que eliminemos la caché o su contenido sea modificado.

Nota: estos recursos son almacenados el cache storage, que es distinto al caché habitual del navegador, pues es gestionado desde el código JS de la página. Por esta razón, el comportamiento de opciones como "Disable caching" en la pestaña de red del navegador no tendrán efecto.

Escenario 3: aplicación ejecutada en el entorno de desarrollo tras haber sido modificada

Volvemos a lanzar con F5, aunque previamente modificamos ligeramente uno de los componentes Blazor, forzando así la generación de un nuevo ensamblado del proyecto.

Peticiones realizadas12
Contenido transferido (comprimido)51.2 kB
Contenido cargado en la página (descomprimido)555 kB

Como podemos observar, se trata de unos números muy parecidos a los anteriores. La diferencia principal está en el ensamblado del proyecto, que al haber sido modificado es necesario obtenerlo de nuevo. El resto de elementos previamente cacheados siguen siendo válidos.

Escenario 4: aplicación publicada y ejecutada por primera vez

Hasta ahora hemos visto los números siempre en el entorno de desarrollo, por lo que sólo nos afectarían mientras trabajamos en el proyecto. Pero pasemos a un escenario más definitivo: publicamos la aplicación (compilada en modo "Release") y la lanzamos, eliminando previamente la caché del navegador.

Peticiones realizadas47
Contenido transferido (comprimido)2.1 MB
Contenido cargado en la página (descomprimido)7.0 MB

¡Hey! ¿Qué ha pasado aquí? Pues en primer lugar, fijaos en la reducción tan brutal del número de peticiones realizadas: hemos pasado de más de 200 a menos de 50. La magia aquí está en el IL trimming de la publicación, un mecanismo que permite eliminar de la salida el código IL que no utilizamos en la aplicación, incluidos los ensamblados del propio framework.

También podemos observar una reducción importante en el tamaño (de 9 a 2MB). Aparte de que se han descargado menos recursos, esta reducción también se debe a que durante la publicación los archivos resultantes son comprimidos de forma estática.

Como podemos ver, estos datos son bastante satisfactorios. Tanto el número de archivos a descargar como su peso total son más que razonables, teniendo en cuenta además que esta carga sólo ocurrirá la primera vez.

Escenario 5: aplicación publicada en modo release y ejecutada por segunda vez (o siguientes)

Accedemos de nuevo a la aplicación publicada anteriormente manteniendo la caché en el navegador, que al fin y al cabo será el comportamiento habitual de nuestros usuarios.

Peticiones realizadas10
Contenido transferido (comprimido)5.8 Kb
Contenido cargado en la página (descomprimido)514 Kb

Como podemos ver en este caso, una vez el contenido se encuentra en el navegador, queda poco por descargar, por lo que los resultados son similares a los que veíamos en tiempo de desarrollo. Números bastante bajos teniendo en cuenta que se trata de una recarga completa .

Conclusión

Como hemos visto, lo maravilloso que resulta poder utilizar C# en el navegador tiene su coste en cuanto a tiempo de la primera carga de la aplicación, aunque éste se reduce de forma drástica cuando nos encontramos en un entorno de producción y cuando se trata de las cargas sucesivas, gracias al uso de la caché del navegador.

En muchos escenarios probablemente este retraso en el primer acceso es totalmente asumible. Si no es nuestro caso, probablemente deberíamos evaluar el uso de opciones que "maquillan" esos tiempos, como la prerenderización en servidor o el uso de animaciones o efectos interesantes para hacer más grata esa espera inicial a nuestros usuarios. Otras veces, cuando el tiempo inicial sea un factor absolutamente crítico, no tendremos más remedio que optar por tecnologías más ligeras en cliente (incluyendo Blazor Server, que es una buena opción en algunos escenarios).

Publicado en Variable not found.

Bitácora de Javier Gutiérrez Chamorro (Guti): Optimizaciones de .htaccess para tu web y también para WordPress

$
0
0


Cuando me preparé para escribir Nulled WP-Rocket y cómo parchearlo necesariamente me tuve que familiarizar con el funcionamiento del plugin WP-Rocket. Me di cuenta que aunque es el más rápido del mercado, todavía lo podía ser aún más, puesto que había algunas optimizaciones elementales a nivel de .htaccess que no habían aplicado. Como forma de …

Optimizaciones de .htaccess para tu web y también para WordPress Leer más »



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

Picando Código: eBooks: Head First Programming por O’Reilly

$
0
0

La serie de libros Head First de O’Reilly es excelente para aprender algo por primera vez. En su momento leí Head First Java, Head First Software Development y partes de Head First Design Patterns si recuerdo bien.

Humble Bundle está ofreciendo un paquete de eBooks de la serie Head First para aprender Java, Python, Go, C, Ruby y más. El precio mínimo es USD 1/1 €, por un paquete con un costo total mayor a USD 700. Podemos elegir el precio y cómo se distribuye el dinero que aportamos entre la editora, la caridad Code For America o Humble Bundle.

eBooks: Head First Programming por O’Reilly

Pagando el mínimo de USD 1/1 € o más, obtenemos:

  • Head First Ruby
  • Head First C
  • Head First PMP – Cuarta Edición
  • Head First SQL
  • Head First Statistics

Pagando USD 10 / 8.50 € o más, obtenemos los anteriores y:

  • Head First JavaScript Programming
  • Head First Learn to Code
  • Head First HTML and CSS – Segunda Edición
  • Head First C# – Tercera Edición
  • Head First Agile

Pagando USD 18 / 15 € o más, obtenemos todos los libros anteriores y:

  • Head First Go
  • Head First Java – Segunda Edición
  • Head First Python – Segunda Edición
  • Head First Kotlin
  • Head First Android Development – Segunda Edición

Comprar el paquete de ebooks

El post eBooks: Head First Programming por O’Reilly fue publicado originalmente en Picando Código.

Blog Bitix: Historias de un streamer, «Un nuevo reto»

$
0
0

Alex enciende la Xbox y conecta el disco duro externo más vendido del momento, que ha comprado en una tienda online con dos terabytes metidos en una caja verde con la que liberará espacio de la consola.

Con la capturadora que compró y el micrófono tiene todo preparado y hoy es un día importante, se enfrenta a los mejores del instituto. Los cascos bien ajustados y listo, se deja caer en la parte más alta de la isla.

Discos duros externos

Sale a toda velocidad en busca de una fuente de armas. El disco externo está encendido y graba de manera automática sus avances y también sus emociones. Se relaja en el momento en que observa por la mirilla y ve a su oponente que está en el campanario, pero falla el disparo dejando una estela de humo que puede localizarle.

Su perro Duty, se le ha subido a las piernas y le ladra, mete el hocico entre sus manos y tiene que dejar de jugar, no puede huir y le disparan, se salva por los pelos, se enfada, grita, «Mira lo que has hecho. Duty».

El perro se aleja, deja de ladrar y comprende que no es el momento y aunque tiene muchas ganas y no aguanta más, se va al rincón de la habitación y allí deja una charco amarillento.

¡Ahora, vale! Vamos a la calle, Duty tiene la cabeza agachada le da vergüenza haber manchado la alfombra. «Luego la limpiaremos no pasa nada, ¡vamos Duty!».

Los tres salen a casa de su amigo, ¿los tres? Sí los tres. Alex, su perro Duty y su nuevo disco duro externo en el bolsillo con la partida grabada. Ahora la verá y comentará con su amigo Tomás y a subirlo a su nuevo canal de Twitch.

Ha nacido un nuevo streamer.

Esta es una breve historia, una ficción para explicar lo práctico que sería disponer de este tipo de discos. Y ahora damos algunas características especiales de este disco duro externo recomendado tan vendido.

Características del disco Seagate Game Drive - 2TB

Tamaño del HDD 2.5", capacidad 2 TB (2000 GB), conector USB micro-USB B, versión USB 3.2 Gen 1 (3.1 Gen 1), tasa de transferencia de datos USB 480-5000 Mbit/s, color verde, alimentación USB, ancho 80 mm, profundidad 117 mm, altura 14.8 mm y peso 170 gr.

Diseñado para Xbox

El disco duro externo HDD portátil diseñado para Xbox One es una solución perfecta para liberar espacio de tu consola. Con 2 años de servicios rescue y 2 TB. Top ventas con miles de unidades vendidas. Es sin dudar una de las mejores opciones para el almacenamiento masivo de juegos y datos que se formatea automáticamente y sin problemas de compatibilidad.

Disco duro Seagate Game Drive

Disco duro Seagate Game Drive

Comparte sin miedo con los discos duros externos para PS4 y para Xbox de Seagate que están recomendados para aquellos jugadores que no pueden desprenderse de su colección de juegos por muchos motivos, por la pasta que se han gastado en ellos, porque les une un vínculo mucho más fuerte de lo que imaginamos o porque simplemente es un aficionado dispuesto a coleccionar todo lo que pueda.

Lo hemos probado y con diferencia, es un disco que soluciona muchas de estas necesidades de almacenamiento contado desde la ficción.

Esperamos que os haya gustado este toque que mezcla lo técnico con la fantasía.

Picando Código: Siete días en el P̸͖̣̞̍ί̵̨͙̮̞̪̹͇̪͎̋̒͘̕ƈ̵̢͈̰̲͇͍͍̬͙͇̂͊̓͒̽ᾷ̵͈͔̠ɳ̶̮͓͇̖̲͐̐̈́̔̌́ԃ̴̧̛̫̭͊̈́̋͂̕͘ͅσ̸̨̟̱̗̜̿́ͅʋ̶̨͓̑̈͊̌͠ҽ̶͔̙̙͂̃͂́͂͛̕̕͜͜ɾ̵̡̢̭̭̼̩̩̖̘͐͊̏͘͝͝ʂ̵̤̦̙̺̦̗̫̤̓̇̍͂̓̈̏̄̎̃͜ͅσ̴̯̦̞̠̯͉̟̮͂̑̂͆͊͛ͅ – Abril Revolutions

$
0
0

En esta nueva edición de Siete días en el Picandoverso comparto unos videos interesantes sobre películas y series de artes marciales y robots, varios enlaces interesantes sobre el lenguaje de programación Ruby, algunas cosas sobre Firefox, Tecnología y más.

Siete días en el P̸͖̣̞̍ί̵̨͙̮̞̪̹͇̪͎̋̒͘̕ƈ̵̢͈̰̲͇͍͍̬͙͇̂͊̓͒̽ᾷ̵͈͔̠ɳ̶̮͓͇̖̲͐̐̈́̔̌́ԃ̴̧̛̫̭͊̈́̋͂̕͘ͅσ̸̨̟̱̗̜̿́ͅʋ̶̨͓̑̈͊̌͠ҽ̶͔̙̙͂̃͂́͂͛̕̕͜͜ɾ̵̡̢̭̭̼̩̩̖̘͐͊̏͘͝͝ʂ̵̤̦̙̺̦̗̫̤̓̇̍͂̓̈̏̄̎̃͜ͅσ̴̯̦̞̠̯͉̟̮͂̑̂͆͊͛ͅ

Ruby

💎 Se publicó la versión 1.0 de Alba, biblioteca para parsear JSON en Ruby que dice ser la más rápida.

💎Publicado Rubocop 1.13 con bastantes mejoras, entre ellas un cop interesante Layout/RedundantLineBreak: hace que si una expresión entra en el largo de línea permitido, no lo separa en líneas nuevas.

💎 La gente de Planet Ruby organizó una nueva semana temática sobre gemas Ruby. Se trata de The Ruby Pixel Art Week 2021, presentando una biblioteca gráfica Ruby por día todos los días desde el 19 al 25 de abril. Destaca bibliotecas gráficas para pixelart en Ruby. Todavía quedan algunos días disponibles si querés aportar escribiendo sobre una gema en particular.

💎 Mike Perham, el desarrollador de Sidekiq – el popular programador de trabajos o “job scheduler” en Ruby- escribió un artículo muy completo sobre la API de Sidekiq. A Tour of the Sidekiq API.

💎Problemas comunes con CSV en Ruby y cómo solucionarlosen un artículo de Long Live Ruby. Me resultan muy familiares, ideales para quienes usamos Ruby para parsear Datos Abiertos.

💎 Para celebrar su 2° aniversario, DragonRuby está ofreciendo licencias gratuitas del kit. La oferta dura hasta el lunes 26 de abril. DragonRuby Game Toolkit es un motor 2D para desarrollar videojuegos que pueden ser ejecutados en PC, Mac, Linux, Raspberry Pi y Web (también existe al menos un juego hecho en DragonRuby para Nintendo Switch). Tiene una licencia comercial y proveen licencias gratuitas para estudiantes, profesores y maestros, personas con bajos ingresos, menores de edad y más. Vengo atento a esta herramienta desde la charla de Amir Rajan en The Ruby Galaxy, y ya lo tengo descargado. ¡A ver si en breve sale algún proyecto de videojuego en Ruby!

Programación / Tecnología

🧪 La empresa Grafana Labs fue fundada en 2014 como negocio alrededor del proyecto de código abierto Grafana, para poder financiar esa tecnología y su comunidad. Inspirados en empresas como Elastic, Redis Labs y MongoDB -entre otras-, decidieron hacer un cambio en la licencia de su software. Las empresas mencionadas evoluciaron su régimen de licencias a licencias no aprobadas por la OSI, pero son un paso necesario para poder mantener el negocio que soporta el desarrollo de las respectivas tecnologías (particularmente para defenderse de prácticas de mega corporaciones monopólicas).

Así que Grafana decidió cambiar la licencia de Grafana, Loki y Tempo de Apache 2 a AGPL3. Agregan que si bien AGPL no los protege de la misma manera que otras licencias (como la SSPL), creen que mantiene un balance correcto.

🔥🦊Firefox Nightly y Firefox Beta soportan HTTP/3– Al visitar un sitio que ofrece soporte HTTP/3, el pedido en el panel de Red indicará que se usó el protocolo HTTP/3.

🔥🦊Se publicó Firefox 88– el mejor navegador web y de los pocos que respetan tu privacidad. Entre las características destacadas están adiciones CSS: soporte para user-valid, :user-invalid y image-set(). Podemos aprender más de estas características en este post de Mozilla Hacks. ¡También se eliminó el soporte para el protocolo FTP! Personalmente cuando necesito usar FTP acudo a mi navegador de archivos, tanto Files en GNOME como Dolphin en KDE soportan ftp. Podemos leer las notas completas de esta version en este enlace.

🕵️‍♂️WordPress, sistema responsable de aproximadamente 40% de los sitios web, publicó una propuesta para tratar a FLoC como un problema de seguridad. Federated Learning of Cohorts (FLoC) es un nuevo proyecto de Google en Chrome para violar la privacidad de los usuarios y agruparlos basado en sus hábitos de navegación para proveer publicidad dirigida. Ahora WordPress propone tratarlo como un problema de seguridad y deshabilitarlo por defecto en el sistema.

🖋 Siguiendo con WordPress, tras la versión 0.84.0 del plugin List Category Posts, Klemens publicó la versión 0.84.1 de List Category Posts que agrega hooks al plugin! Por mi parte publiqué una actualización de mi otro plugin de WordPress List Categories, más que nada confirmando su compatibilidad con las versiones más recientes de WordPress.

📝 Otra semana de noticias de Emacs en el blog de Sacha Chua: Emacs News 2021-04-19

🎮 Descubrí de casualidad de la existencia del Teenage Engineering Pocket Operator PO-128 viendo un cover chiptune 8-bits de Dammit de Blink 182. En el video se ve la edición limitada de Mega Man, pero existe también uno de Street Fighter. No sabía que existía este aparato, ¡pero ahora necesito uno! (de cada uno). Lástima que el precio es bastante elevado 😬

YouTube Video

Trabajo

Recientemente vengo teniendo días bastante productivos en el trabajo. Así que los estoy aprovechando para sacar bastante trabajo adelante y mejorando cosas en el cliente Ruby Elasticsearch. También tengo que implementar algunas cosas interesantes que se van a publicar en la próxima versión del cliente de Elastic Enterprise Search.

Estuvo bueno enterarse que proyectos de la empresa donde trabajo ¡ayudaron a la NASA a volar un helicóptero en Marte!

Películas y Televisión

Marvel publicó el primer trailer de una nueva entrega en su universo cinematográfico Shang-Chi and the Legend of the Ten Rings. Se ve muy bien, artes marciales con el toque Marvel, tiene que estar espectacular:
YouTube Video

Este viernes se estrena la película de Mortal Kombat, en cines y gratis para suscriptores de HBO Max. El servicio no está disponible en Escocia, y los cines todavía no han abierto por acá. Así que tendré que esperar… Mientras tanto, ya pude disfrutar de los primeros 7 minutos de la película publicados en YouTube por HBO Max. Con estos pocos minutos ya me gustó, muy buenas escenas de pelea con violencia y artes marciales:

YouTube Video

Netflix publicó un trailer del segundo volúmen de su serie Love death + Robots: La antología animada NSFW vuelve con una venganza. Gigantes desnudos, demonios de Navidad, y robots salvajes, nos alientan a consumirlo de manera irresponsable. Se estrena el 14 de mayo, y anunciaron un tercer volumen para 2022. Me sentí muy identificado con las palabras y expresión en la voz una de las protagonistas del video: “He estado viva 218 años, he visto demasiado”, creo que acompaña el sentimiento de esta pandemia… El trailer:

YouTube Video

Picando Código

Tengo un par de borradores por terminar que espero poder publicar en breve, uno repasando un poco lo que ha sido este tiempo de pandemia en el blog. ¿Cómo les lleva la pandemia por su lado?

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

Otros 7 días en el Picandoverso:

El post Siete días en el P̸͖̣̞̍ί̵̨͙̮̞̪̹͇̪͎̋̒͘̕ƈ̵̢͈̰̲͇͍͍̬͙͇̂͊̓͒̽ᾷ̵͈͔̠ɳ̶̮͓͇̖̲͐̐̈́̔̌́ԃ̴̧̛̫̭͊̈́̋͂̕͘ͅσ̸̨̟̱̗̜̿́ͅʋ̶̨͓̑̈͊̌͠ҽ̶͔̙̙͂̃͂́͂͛̕̕͜͜ɾ̵̡̢̭̭̼̩̩̖̘͐͊̏͘͝͝ʂ̵̤̦̙̺̦̗̫̤̓̇̍͂̓̈̏̄̎̃͜ͅσ̴̯̦̞̠̯͉̟̮͂̑̂͆͊͛ͅ – Abril Revolutions fue publicado originalmente en Picando Código.

Blog Bitix: Crear de forma sencilla un cliente de un servicio REST o HTTP con Retrofit

$
0
0

La implementación de un servicio REST o HTTP es solo una parte, el otro lado es crear un cliente de ese u otro servicio que permita invocarlo, proporcionar parámetros y obtener las respuestas. Con la librería Retrofit implementar un cliente de un servicio en Java es una tarea bastante sencilla sencilla que utiliza una simple interfaz a la que se le añaden varias anotaciones que le indican a Retrofit cómo construir una implementación a partir de la interfaz. El código que hace uso de la clase que implementa la interfaz del servicio con Retrofit no es diferente de usar una clase que implementa una interfaz.

Java

En el lenguaje de programación Java hay varias librerías que permiten hacer peticiones a un servicio que utilice el protocolo HTTP. Varias de las librerías más conocidas son OkHttp, Apache HttpComponents e incluso en el JDK en la versión 11 se ha incorporado un cliente HTTP que soporta HTTP/2.

Estas librerías cumplen su función y ofrecen total flexibilidad en su uso, sin embargo, requieren hacer las peticiones HTTP de forma explícita lo que supone un código repetitivo y tedioso incluyendo hacer las conversiones de objetos a JSON y de JSON a objetos Java en las peticiones y respuestas.

Contenido del artículo

La librería Retrofit para crear un cliente de un servicio REST o HTTP

Retrofit es una librería que simplifica en gran medida el construir clientes HTTP de una API REST o realizar un cliente de un servicio REST. Con Retrofit basta con crear una interfaz Java que represente el servicio y decorarla con las anotaciones que proporciona Retrofit. También es posible utilizar Retrofit para servicios implementados con GraphQL que aunque no están basados en REST si utilizan el protocolo HTTP.

Retrofit utiliza como librería para realizar las peticiones OkHttp y es compatible con varias librerías para realizar las conversiones de datos de JSON a objetos y de objetos a JSON, entre ellas Jackson, Gson y JSON-B. También soporta realizar las peticiones de forma síncrona o asíncrona.

Esta es una interfaz de Java que representa un sencillo servicio REST de una petición GET. Las anotaciones instruyen a Retrofit como a partir de esta interfaz crear el cliente del servicio REST, al proporcionar esta interfaz Retrofit devuelve una instancia de la interfaz que al invocar a los métodos internamente realiza las peticiones HTTP.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
packageio.github.picodotdev.blogbitix.javaretrofit;importretrofit2.Call;importretrofit2.http.GET;importretrofit2.http.Header;importretrofit2.http.Path;importretrofit2.http.Query;publicinterfaceService{    @GET("/message/{name}")    Call<String>message(@Header("Accept-Language")StringacceptLanguage,@Path("name")Stringname,@Query("random")Stringrandom);}
Service.java

Al proporcionar a Retrofit la interfaz este crea una instancia que implementa la interfaz pero que internamente implementa el cliente HTTP del servicio. Aparte de la interfaz para obtener la instancia del servicio se ha de proporcionar la URL base donde se ubica el servicio asi como otros objetos relacionados como interceptores.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
publicclassMainimplementsCommandLineRunner{    @Autowired    privateMeterRegistryregistry;    ...    privateServicebuildService(){    OkHttpClientclient=newOkHttpClient.Builder()            .addNetworkInterceptor(buildLoggingInterceptor())            .eventListener(OkHttpMetricsEventListener.builder(registry,"okhttp.requests").build())            .build();    Retrofitretrofit=newRetrofit.Builder()            .client(client)            .addConverterFactory(ScalarsConverterFactory.create())            .baseUrl("http://localhost:8080/").build();    returnretrofit.create(Service.class);    }    ...}
Main-buildService.java

Anotaciones de Retrofit

Las anotaciones de Retrofit en la interfaz de Java describen el servicio como variables en el path de la URL, parámetros, para realizar conversiones a JSON o el método HTTP a invocar o cabeceras HTTP.

  • HTTP, GET, POST, PUT, PATCH, DELETE, OPTIONS y HEAD: estas anotaciones indican el método HTTP que se realiza.
  • Path, Query: la anotación Path sustituye una variable en el path de la URL por el valor del argumento anotado. La anotación Query añade un argumento en la query de la URL.
  • Headers, Header: la anotación Headers permite especificar una colección de cabeceras HTTP a incluir en la petición. La anotación Header añade una cabecera a partir del valor de un argumento en la firma del método.
  • Body: la anotación Body transforma el argumento como los datos a incluir como JSON en cuerpo de la petición utilizando la librería que implementa la conversión de objetos a JSON.

Aplicar funcionalidades transversales con interceptores

Algunas funcionalidades comunes al crear un cliente de un servicio REST son obtener trazas de las peticiones que se están realizando, realizar autenticación, generar métricas o trazabilidad con Sleuth. Estas son funcionalidades transversales a todos los métodos de la interfaz del servicio REST que se implementan usando interceptores.

Un interceptor es una clase que implementa una interfaz de la librería OkHttp que es invocada al realizarse una petición HTTP. OkHttp soporta métricas añadiendo un EventListener al construir la instancia del cliente de OkHttp.

OkHttp proporciona una implementación de interceptor que emite trazas cuando se realiza una petición útil para observar en el log qué peticiones se están realizando y que códigos de estado se están devolviendo. Esta es una implementación propia de un interceptor para emitir las trazas que se realizan con el cliente.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
publicclassMainimplementsCommandLineRunner{    ...    privateInterceptorbuildLoggingInterceptor(){        returnchain->{            Requestrequest=chain.request();            longt1=System.nanoTime();            System.out.println(String.format("Sending request %s on %s%n%s",request.url(),chain.connection(),request.headers()));            Responseresponse=chain.proceed(request);            longt2=System.nanoTime();            System.out.println(String.format("Received response for %s in %.1fms%n%s",response.request().url(),(t2-t1)/1e6d,response.headers()));            returnresponse;        };    }    ...}
Main-interceptor.java

Servicio de ejemplo con Retrofit

Un controlador como el siguiente de un servicio REST definido con Spring Framework sencillo que únicamente devuelve un mensaje en función de los parámetros recibidos a través de una en la petición, una variable en el path de la petición y un parámetro en la query.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
packageio.github.picodotdev.blogbitix.javaretrofit;...@RestControllerpublicclassRestService{    privatestaticfinalMap<String,String>MESSSAGES;    static{        MESSSAGES=newHashMap<>();        MESSSAGES.put("es-ES;default","¡Hola mundo!");        MESSSAGES.put("es-ES;hello","¡Hola %s!");        MESSSAGES.put("en-GB;default","Hello World!");        MESSSAGES.put("en-GB;hello","Hello %s");    }    @GetMapping(path={"/message/","/message/{name}"})    publicStringmessage(@RequestHeader(value="Accept-Language",defaultValue="en-GB")Stringlocale,@PathVariable(required=false)Stringname,@RequestParam(name="random",required=false)Stringrandom){        System.out.printf("Random: %s%n",random);        Stringmessage="";        if(name==null||name.isBlank()){            Stringkey=String.format("%s;default",locale);            message=MESSSAGES.getOrDefault(key,MESSSAGES.get("en-GB;default"));        }else{            Stringkey=String.format("%s;hello",locale);            Stringvalue=MESSSAGES.getOrDefault(key,MESSSAGES.get("en-GB;default"));            message=String.format(value,name);        }        returnmessage;    }}
RestService.java

El cliente del servicio construido por Retrofit se realiza a partir de la definición de la interfaz, el cliente es un objeto que implementa esa interfaz y en código Java no de su uso es simplemente invocar sus métodos y proporcionar los parámetros. La implementación del cliente contiene el código necesario para transformar las invocaciones de los métodos de la interfaz en peticiones al servicio REST.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
packageio.github.picodotdev.blogbitix.javaretrofit;...@SpringBootApplicationpublicclassMainimplementsCommandLineRunner{    ...    @Override    publicvoidrun(String...args)throwsException{        Serviceservice=buildService();        Stringr1=service.message("es-ES","",UUID.randomUUID().toString()).execute().body();        Stringr2=service.message("es-ES","Java",UUID.randomUUID().toString()).execute().body();        Stringr3=service.message("en-GB","",UUID.randomUUID().toString()).execute().body();        Stringr4=service.message("en-GB","Java",UUID.randomUUID().toString()).execute().body();        System.out.printf("Result: %s%n",r1);        System.out.printf("Result: %s%n",r2);        System.out.printf("Result: %s%n",r3);        System.out.printf("Result: %s%n",r4);    }    ...}
Main.java

Esta es la salida del programa en la consola donde se ven las trazas del interceptor de OkHttp con los datos de la petición y las respuesta del servicio junto con el mensaje de respuesta del servicio.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Sending request http://localhost:8080/message/?random=520983c7-79d9-4956-aceb-b0dad5c8902c on Connection{localhost:8080, proxy=DIRECT hostAddress=localhost/127.0.0.1:8080 cipherSuite=none protocol=http/1.1}
Accept-Language: es-ES
Host: localhost:8080
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.14.9

Random: 520983c7-79d9-4956-aceb-b0dad5c8902c
Received response for http://localhost:8080/message/?random=520983c7-79d9-4956-aceb-b0dad5c8902c in 94,6ms
Content-Type: text/plain;charset=UTF-8
Content-Length: 13
Date: Fri, 23 Apr 2021 17:46:41 GMT
Keep-Alive: timeout=60
Connection: keep-alive

Sending request http://localhost:8080/message/Java?random=d4cca45d-4a45-40ca-9872-fc2c344f1572 on Connection{localhost:8080, proxy=DIRECT hostAddress=localhost/127.0.0.1:8080 cipherSuite=none protocol=http/1.1}
Accept-Language: es-ES
Host: localhost:8080
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.14.9

Random: d4cca45d-4a45-40ca-9872-fc2c344f1572
Received response for http://localhost:8080/message/Java?random=d4cca45d-4a45-40ca-9872-fc2c344f1572 in 3,7ms
Content-Type: text/plain;charset=UTF-8
Content-Length: 12
Date: Fri, 23 Apr 2021 17:46:41 GMT
Keep-Alive: timeout=60
Connection: keep-alive

Sending request http://localhost:8080/message/?random=e802c2e7-9f5c-4908-8fe6-22b3c8069192 on Connection{localhost:8080, proxy=DIRECT hostAddress=localhost/127.0.0.1:8080 cipherSuite=none protocol=http/1.1}
Accept-Language: en-GB
Host: localhost:8080
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.14.9

Random: e802c2e7-9f5c-4908-8fe6-22b3c8069192
Received response for http://localhost:8080/message/?random=e802c2e7-9f5c-4908-8fe6-22b3c8069192 in 2,2ms
Content-Type: text/plain;charset=UTF-8
Content-Length: 12
Date: Fri, 23 Apr 2021 17:46:41 GMT
Keep-Alive: timeout=60
Connection: keep-alive

Sending request http://localhost:8080/message/Java?random=16fc8a5f-b9ab-4b26-8049-81a4e7901820 on Connection{localhost:8080, proxy=DIRECT hostAddress=localhost/127.0.0.1:8080 cipherSuite=none protocol=http/1.1}
Accept-Language: en-GB
Host: localhost:8080
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.14.9

Random: 16fc8a5f-b9ab-4b26-8049-81a4e7901820
Received response for http://localhost:8080/message/Java?random=16fc8a5f-b9ab-4b26-8049-81a4e7901820 in 2,7ms
Content-Type: text/plain;charset=UTF-8
Content-Length: 10
Date: Fri, 23 Apr 2021 17:46:41 GMT
Keep-Alive: timeout=60
Connection: keep-alive

Result: ¡Hola mundo!
Result: ¡Hola Java!
Result: Hello World!
Result: Hello Java!
System.out

En el archivo de construcción hay que incluir la dependencia de Retrofit.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
plugins{    id'application'}repositories{    mavenCentral()}dependencies{    implementation(platform('org.springframework.boot:spring-boot-dependencies:2.4.5'))    implementation'org.springframework.boot:spring-boot'    implementation'org.springframework.boot:spring-boot-starter-web'    implementation'org.springframework.boot:spring-boot-starter-actuator'    implementation'com.squareup.retrofit2:retrofit:2.9.0'    implementation'com.squareup.retrofit2:converter-scalars:2.9.0'    implementation'io.micrometer:micrometer-core:1.6.6'}application{    mainClass='io.github.picodotdev.blogbitix.javaretrofit.Main'}
build.gradle
Terminal

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


Variable not found: Enlaces interesantes 441

$
0
0
Enlaces interesantes

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

Por si te lo perdiste...

.NET Core / .NET

ASP.NET Core / ASP.NET / Blazor

Azure / Cloud

Conceptos / Patrones / Buenas prácticas

Data

    Web / HTML / CSS / Javascript

    Visual Studio / Complementos / Herramientas

    Xamarin

    Otros

    Publicado en Variable not found.

    Variable not found: Syncfusion Blazor UI components library: un primer vistazo

    $
    0
    0

    SyncfusionEn el mundo de las suites profesionales de componentes, seguro que todos habéis oído hablar de Syncfusion. Esta compañía lleva desde 2001 ofreciendo componentes y marcos de trabajo para todo tipo de entornos, con el fin de hacer la vida más sencilla a los desarrolladores: ASP.NET Core, ASP.NET MVC, Web Forms, Angular, React, Vue, Xamarin, Flutter, WinForms o WPF son sólo algunas tecnologías en las que tenemos a disposición sus soluciones.

    Y claro, no podía faltar Blazor :) La biblioteca Syncfusion Blazor UI ofrece más de setenta componentes para Blazor Server y WebAssembly que cubren sobradamente las necesidades más habituales en la construcción de aplicaciones profesionales.

    Aunque se trata de una solución comercial y las licencias tienen coste, la buena noticia es que existe una generosa licencia community gratuita, mediante la cual podemos tener acceso a todos los componentes siempre que seamos desarrolladores independientes o una empresa con menos de seis trabajadores e ingresemos anualmente menos 1 millón de dólares brutos.

    En este post vamos a dar un primer vistazo a esta biblioteca, para tener una idea de su alcance y forma de uso.

    Componentes incluidos en Blazor UI components library

    Como podemos ver a continuación, la lista de componentes incluidos en esta biblioteca es impresionante: potentes rejillas de datos, diagramas para visualización de datos, controles de edición de formularios, layouts, herramientas de navegación, agendas y calendarios, diagramas, visualizadores y editores WYSIWYG de documentos o utilidades para generación al vuelo de documentos ofimáticos.

    Los componentes principales son los siguientes:

    Grids
    • DataGrid
    • Pivot Table
    • Tree Grid
    Data Visualization
    • Charts
    • Barcode Generator
    • BulletChart
    • Circular Gauge
    • Diagram
    • HeatMap Chart
    • Kanban
    • Linear Gauge
    • Maps
    • Range Selector
    • Smith Chart
    • Sparkline Charts
    • Stock Chart
    • TreeMap
    Editors
    • InPlace Editor
    • Rich Text Editor
    • Word Processor
    Calendars
    • Scheduler
    • Calendar
    • DatePicker
    • DateRangePicker
    • DateTime Picker
    • Gantt Chart
    • TimePicker
    Buttons
    • Button
    • Button Group
    • Chips
    • Dropdown Menu
    • Progress Button
    • Split Button
    Inputs
    • Checkbox
    • Color Picker
    • File Upload
    • Input Mask
    • Numeric Textbox
    • Radio Button
    • Range Slider
    • TextBox
    • Toggle Switch Button
    DropDowns
    • AutoComplete
    • ComboBox
    • Dropdown List
    • ListBox
    • MultiSelect Dropdown
    Notifications
    • Progress Bar
    • Toast
    • Spinner
    Layout
    • Card
    • Dashboard Layout
    • Dialog
    • ListView
    • Splitter
    • Tooltip
    Navigation
    • Accordion
    • Context Menu
    • File Manager
    • MenuBar
    • Sidebar
    • Tabs
    • Toolbar
    • TreeView
    Forms
    • Query Builder
    Viewer
    • PDF Viewer
    File Formats
    • DocIO
    • PDF
    • Presentation
    • XlsIO

    Según indican en la documentación oficial, todos los componentes están afinados para conseguir el mejor rendimiento posible y trabajar con grandes volúmenes de datos. En particular, el componente DataGrid está diseñado para ofrecer un alto rendimiento incluso con millones de filas, gracias al uso de virtualización de filas y columnas.

    ¿Cómo probar Syncfusion Blazor UI components library?

    Si queréis averiguar si esta suite de componentes os vale para vuestros proyectos, lo mejor que podéis hacer es probarla :) Para ello, tenéis dos opciones:

    • Descargar la free trial, una evaluación totalmente funcional del producto durante 30 días, tiempo suficiente para que podáis probarlo todo a conciencia.

    • O bien, si sois desarrolladores individuales o empresas con 5 o menos empleados, e ingresáis menos de 1 millón de dólares al año, usar la versión community, mediante la cual tendréis acceso a todos los productos de forma ilimitada y sin restricciones de uso (es decir, podéis usarlos en proyectos comerciales, aunque si tenéis dudas os recomiendo que leáis las FAQs o contactéis con ellos).

    Dado que encajo bien en este último grupo, he podido completar el proceso de solicitud de la licencia muy rápidamente. Lo único que tenemos que hacer es visitar el sitio web de Syncfusion, pulsar el botón "Claim Free License" y registrarnos usando nuestra cuenta de LinkedIn o Xing.

    Por cierto, algo que llama bastante la atención es que la licencia community no está limitada a los componentes Blazor: en realidad se trata de la licencia community de Essential Studio, por lo que tendremos acceso a los componentes de cualquiera de las tecnologías soportadas (Blazor, ASP.NET Core, JavaScript, Angular, etc.): ¡más de 1.600 controles! También podremos usar las bibliotecas de generación de documentos Word, Excel, PowerPoint y PDF, y a herramientas de visualización de informes.

    Plantilla de creación de proyectos con componentes SyncfusionUna vez completado el registro, tenemos acceso a un dashboard desde el que podemos descargar el software y obtener las claves de las licencias de los productos que deseemos utilizar. Podemos descargar la suite completa u obtener los productos de forma individualizada, para ocupar sólo el espacio que vayamos a necesitar, así como, si lo deseamos, instalar la extensión para Visual Studio que proporcionará plantillas para la creación sencilla de proyectos con las referencias a componentes Syncfusion que nos interesen (aunque en realidad no es estrictamente necesaria).

    Un ejemplo simple, paso a paso: entrada de datos con autocompletado

    Poner en marcha estos componentes es muy sencillo; si ya hemos descargado e instalado el producto, en muy pocos minutos podemos tener funcionando un proyecto Blazor Server o WebAssembly con controles Syncfusion. Veamos paso a paso cómo hacerlo.

    Partiendo de un proyecto Blazor estándar ya creado (es decir, creado sin utilizar las plantillas propias de Syncfusion), lo primero que debemos hacer es instalar el "core" de los componentes, distribuido en el paquete NuGet Syncfusion.Blazor.Core.

    Tras ello, debemos añadir una referencia al tema visual que queramos utilizar en el proyecto en el encabezado <head> de la página contenedora de la aplicación Blazor (puede ser el archivo _Host.cshtml o index.html, dependiendo de si usamos Blazor Server o Web Assembly).

    <head>
    ...
    <link href="_content/Syncfusion.Blazor.Themes/bootstrap4.css" rel="stylesheet" />
    </head>

    En este caso hemos elegido el tema bootstrap4, aunque la biblioteca proporciona cinco temas prediseñados, con versiones claras y oscuras, y permite creación de temas personalizados.

    Además, antes de que se nos olvide, justo en el arranque de la aplicación hay que inicializar la biblioteca usando la clave de licencia obtenida desde el dashboard de Syncfusion. Por ejemplo, podríamos hacerlo en el archivo Program.cs:

    using Syncfusion.Licensing;
    ...
    public class Program
    {
    public static void Main(string[] args)
    {
    SyncfusionLicenseProvider.RegisterLicense("YOUR-LICENSE-KEY-HERE");
    ...
    }
    }

    Este paso es importante, porque de lo contrario los componentes visuales aparecerán en la página con un mensaje indicando que es necesario registrar la licencia.

    Asimismo, como es habitual, tendremos que registrar los servicios de la biblioteca en el inyector de dependencias. En Blazor Server, desde el interior del método ConfigureServices() de la clase Startup; en Blazor WebAssembly, en el método Main() de Program.cs:

    services.AddSyncfusionBlazor();

    Lo que hemos hecho hasta el momento es común a todos los componentes, por lo que tendremos que seguir estos pasos siempre. A continuación, daremos pasos ya específicos para el componente que queremos utilizar, que en este caso es la entrada de datos con autocompletado.

    Un detalle muy interesante es que los controles para Blazor se distribuyen agrupados según funcionalidad en distintos paquetes NuGet. Es decir, no existe un paquete único con todos los componentes, sino que hay que instalarlos en nuestro proyecto de forma independiente, de forma que el peso de la aplicación sólo se verá afectado por lo que utilicemos realmente.

    En la web de Syncfusion podemos encontrar una extensa documentación de cada uno de los componentes para Blazor. Por ejemplo, como en nuestro caso queremos utilizar el componente de edición con autocompletado, nos centraremos en su apartado concreto en la documentación.

    En este documento veremos que el paquete Nuget a instalar es Syncfusion.Blazor.DropDowns. También se recomienda añadir la siguiente directiva en el archivo _Imports.razor del proyecto, para que los controles estén disponibles desde cualquier componente:

    @using Syncfusion.Blazor.DropDowns

    Ya por último, lo que nos queda es añadir al componente que nos interese una instancia de SfAutoComplete, el componente editor con autocompletado, y configurarla apropiadamente para lograr nuestros objetivos. Por ejemplo, con el siguiente código mostraremos en la página de inicio de la aplicación un selector de colores por nombre, en el que aprovechamos las capacidades de este control para personalizar su visualización mediante plantillas y así poder mostrar una interfaz más colorida:

    Selector de color con control SfAutocomplete

    El código es el siguiente:

    @* Index.razor *@
    @page "/"

    <p>Selected color:
    <span class="color" style="background-color: @selected"></span>
    @(selected ?? "None")
    </p>

    <SfAutoComplete TValue="string" TItem="string"
    Placeholder="Select color" AllowCustom="false"
    DataSource="colors" @bind-Value="selected">
    <AutoCompleteTemplates TItem="string">
    <ItemTemplate>
    <span class="color" style="background-color: @context;"></span>
    @context
    </ItemTemplate>
    </AutoCompleteTemplates>
    </SfAutoComplete>

    @code {
    string selected { get; set; }
    string[] colors = {
    "White", "Black", "Blue", "Green", "Red", "Yellow"
    };
    }
    /* Index.razor.css */
    .color {
    display: inline-block;
    vertical-align: middle;
    width: 16px;
    height: 16px;
    border: 1px solid #333;
    }

    Obviamente hay controles más complejos y potentes que requieren mayor esfuerzo en su configuración y puesta en marcha, pero nunca comparable con el requerido si nosotros tuviéramos que implementar a mano las funcionalidades para lograr los mismos resultados.

    Recapitulando

    Blazor UI components es una suite de componentes bastante completa, bien documentada, y, como habéis visto en el ejemplo anterior, de uso bastante sencillo.

    Si tenéis ocasión y pensáis que os encaja en vuestros proyectos, os recomiendo que le echéis un vistazo, y más aún si sois elegibles para la licencia community, que os permitirá usarla sin coste :)

    Nota: si os da pereza descargar nada, podéis ver una demo live de los componentes en la web de la compañía.

    Publicado en Variable not found.

    Picando Código: Siete días en el Picandoverso – Abril 4: No Control

    $
    0
    0

    Es la primera vez desde que empecé esta serie de posts de “Siete días” en que no hay otros posts entre medio de uno y el siguiente. Pero esa era la idea original, que me forzara a escribir al menos un post a la semana con este resumen. Y este mes se cumplió con la edición número 14, ¡catorce semanas de repasos! Vengo con bastantes proyectos en el trabajo y de a poco volviendo a socializar más en el MundoReal™. De a poco van abriendo más cosas en Escocia y he vuelto a ver más amigos, así que por ese lado contento de poder ir volviendo a una vida social más normal. Pero igual tuve algo de tiempo para juntar algunos enlaces interesantes para comentar por acá. Van:

    Siete días en el Picandoverso - Abril 4: No Control

    Ruby

    💎 Mañana jueves 29 de abril es el meetup online The Ruby Galaxy a las 19:00 UTC y se transmite a través de Twitch. La información completa de las charlas y oradores está en rubygalaxy.io. A nivel general, las charlas de este mes incluyen una sobre automatización con GitHub Actions, JSON Web Tokens y ViewComponents. Ahí estaremos.

    💎 En este post escrito por Sylwia Vargas se hace un repaso de los clientes HTTP disponibles para Ruby en 2021. Muestra ejemplos de código para pedidos GET y POST de cada una de las herramientas y al final las compara en base a distintas medidas. Para los pedidos HTTP usa como ejemplo la API de Dad Jokes, lo que me hizo acordar a este alias que agregué hace poco en mi sistema, y que comparto y recomiendo:

    alias dadjoke=’curl -H “Accept: text/plain” https://icanhazdadjoke.com/; echo’

    Tecnología

    🗜 Dejo esto acá para terminar de leerlo en algún momento, y creo que a más gente le puede interesar también. Shrink, Reduce, and Implode: The Legacy Zip Compression Methods describe e implementa los métodos de compresión. También enlaza a un artículo anterior con bastante detalle sobre la compresión Zip que también quiero leer… Zip Files: History, Explanation and Implementation

    🐧 Una lista con 10 distribuciones Linux para principiantes en 2021. Hacía mucho que no leía un artículo de este tipo, pero más o menos encontramos a los mismos sospechosos de siempre.

    🧪 Una de las cosas más mencionadas sobre Elixir es el Gen Server. En este post Alex Reichert explica de qué se trata con ejemplos de código del MundoReal™.

    📬 El cliente de correo de código abierto para Android K9 está buscando financiamiento. Para esto están usando Liberapay, una plataforma de donaciones recurrentes software libre manejada por volntarios. Ya llevan 700 € por mes, con la meta de llegar a 1.000.

    🏢¿Ha muerto UML? Ernesto Garbarino escribe sobre el Unified Modelling Language y quién fue responsable de su asesinato.

    Criptomonedas y Bitcoin

    💰 En éstos días leí al menos dos artículos interesantes sobre Bitcoin y Criptomonedas. El primero es Bitcoin – the future of money or speculative bubble?. El segundo artículo refleja bastante bien lo que pienso del tema. Se trata de Cryptocurrency is an abject disaster y describe bastante bien todos los problemas que ha traído. Algunas citas del artículo traducidas al español:

    • La integridad y confianza de toda la industria del software ha decaído drásticamente debido a las criptomonedas
    • Cualquier tecnología que no sea una (presunta)  moneda y que incorpora blockchain de cualquier manera siempre funcionaría mejor sin ella.
    • De eso se tratan las criptomonedas: no tecnología novedosa, no empoderamiento, sino hacer plata.
    • No, las criptomonedas no son una divisa para nada: es un vehículo de inversión. Una herramienta para hacer más ricos a los más ricos. Y eso es decirlo bien; en realidad tiene mucho más en común con una estafa que con una inversión genuina. ¿Qué “valor” provee resolver problemas matemáticos falsos? Es todo mierda.
    • Tal vez tu criptomoneda es diferente. Pero mira: estás en muy mala compañía. Cuando sos la única persona honesta en la habitación, tal vez deberías estar en una habitación diferente. Es imposible confiar en tí.
    • Las Criptomonedas son uno de los peores inventos del siglo 21. Estoy avergonzado de compartir una industria con esta estafa explotativa. Ha fallado en ser una divisa útil, inventó una nueva clase de abuso en internet, enriquecido más a los ricos, desperdiciado asombrosas cantidades de electricidad, apurado el cambio climático, arruinado cientos de proyectos de otra forma prometedores, provisto un clima para que florezcan cientos de estafas, creado escasez y aumentos de precios para el hardware, e inyectado incentivos perversos en la tecnología en todos lados. Al carajo con las criptomonedas.

    Con suerte algún día se terminará toda esta pavada…

    Comics

    🐴 Dark Horse anunció un cómic precuela de la nueva serie He-Man en Netflix, Masters of the Universe: Revelation. Todavía no hemos visto ningún adelanto, pero supongo que los personajes al menos tendrán un estilo similar al de la tapa del cómic.

    💬 Hoy es día de cómics nuevos y tengo para ponerme al día: BRZRK #2, Beta Ray Bill #2 (me encantó el primer número, excelente) y algunos títulos más de la semana pasada y ésta.

    Videojuegos

    💪 Ya está disponible por Limited Run Games la versión física de NEOGEO POCKET COLOR SELECTION Vol.1. No es una edición limitada -están haciendo sólo distribución- así que supongo que habrá más formas de adquirir la versión física eventualmente.

    🥳 Después de 2 años sin actualizaciones, Mario Party para Nintendo Switchrecibió una actualización. La novedad principal es que ahora se puede jugar online🙄

    Películas/TV

    🦕¡Vuelven los Picapiedras! Fox anunció “Bedrock”, una comedia animada para adultos secuela a la serie The Flintstones. La serie vuelve a la familia 20 años después de la original, con Pedro Picapiedra a punto de retirarse y Pebbles en sus 20 y pico de años embarcándose en su carrera. La serie también va a documentar el pasaje de la Edad de Piedra a la Edad de Bronze, y las dificultades de los habitantes de en esta evolución.

    😱 Salió trailer de la próxima película de The Conjuring, de las pocas sagas de terror que sigo:
    YouTube Video

    🎥 Liz se está quedando sin oxígeno y sin tiempo, para sobrevivir debe buscar la forma de acordarse quién es. Oxygen, una película de Alexandre Aja con Mélanie Laurent que se estrena en Netflix el 12 de mayo y me resultó bastante interesante:

    YouTube Video

    📺 Se terminó The Falcon and the Winter Soldier (Flacón y Gualtersoldier). Disfruté muchísimo ir viendo cada nuevo capítulo viernes a viernes. Es una serie bien a lo películas del Universo Cinematográfico de Marvel. No le pedía más que eso, y eso fue lo que me brindó. Espero con ansias las próximas aventuras de Sam y Bucky. Hasta junio que empieza Loki no hay nada más para ver en lo que respecta al UCM en TV, pero se viene The Bad Batch en el universo Star Wars mientras tanto.

    💀 Estos días miré la película de Mortal Kombat, y también me gustó mucho. Otra que me dió lo que esperaba: peleas, magia y violencia. Hasta Fatalities hubo, ¡espero las secuelas!

    Picando Código

    Como comenté al principio, he estado bastante ocupado y el tiempo que venía usando para escribir posts lo estoy usando en otras cosas. Pero será cuestión de ir adaptando nuevamente el tiempo de escritura a los cambios en la rutina. Veremos cómo me ajusto en estos tiempos tan caóticos y raros.

    Otros 7 días en el Picandoverso:

    El post Siete días en el Picandoverso – Abril 4: No Control fue publicado originalmente en Picando Código.

    Blog Bitix: Guía de instalación y uso básico de FreeBSD

    $
    0
    0

    Aún con su reducida cuota de uso las distribuciones GNU/Linux son conocidas por muchas personas como alternativa a los sistemas operativos comerciales Windows de Microsoft y macOS de Apple para propósitos de entorno de escritorio. Las distribuciones BSD también son conocidas, cualquier usuario de GNU/Linux con seguridad las conoce. FreeBSD es una abanderada de las BSD, aún así no son tantos los usuarios que deciden instalarla como su sistema operativo de uso cotidiano. Es fácil y rápido de instalar y a un usuario de GNU/Linux e incluso macOS el cambio al nuevo sistema resulta conocido ya que el entorno de escritorio y muchos comandos son exactamente los mismos.

    FreeBSD

    La cuota de uso entre los diferentes sistemas operativos para computadoras de escritorio está dominada con más de un 80% por el sistema operativo Windows de Microsoft, un sistema operativo comercial con una licencia de uso privativo dirigido a ser fácil de usar incluso para usuarios sin ser expertos en informática. El éxito de Windows se debe a que es la opción preinstalada por la mayoría de ordenadores y portátiles a la venta, posee el paquete ofimático Office también de Microsoft imprescindible en muchos puestos de trabajo, se puede usar sin licencia con algunas limitaciones o se puede comprar una licencia de Windows 10 completamente válida a un precio significativamente más reducido que el oficial.

    El siguiente sistema operativo de escritorio más usado es macOS de Apple, un sistema operativo comercial con licencia privativa exclusivo de las computadoras Mac. Los Mac se consideran ordenadores que suelen incorporar las últimas tecnologías y cuidando más diseño que las que se encuentran en ordenadores con Windows, sin embargo, la exclusividad se ve reflejada en un significativo precio comparado con PC de características equivalentes. A pesar del precio son computadoras con cierta popularidad, deseadas y vendidas.

    La tercera opción son alguna de las distribuciones de GNU/Linux siendo una de las más populares Ubuntu. Las distribuciones y sistema operativo GNU/Linux se caracterizan por tener una licencia de software libre basada en la GPL y ser generalmente gratuitas incluyendo la práctica totalidad de los programas. Las distribuciones GNU/Linux actualmente son tan fáciles de instalar y usar que los sistemas operativos Windows o macOS, incluyendo ser compatible con la mayoría del hardware. Sin embargo, dado que no hay tantas empresas que vendan y distribuyan equipos con algún GNU/Linux preinstalado no tiene en el escritorio una cuota tan alta como las anteriores, dos empresas que distribuyen GNU/Linux en sus equipos son Slimbook y Vant. En el área de los servidores y computación en la nube, por el contrario, GNU/Linux sí es la opción que domina el mercado, por su licencia, flexibilidad, fiabilidad y potencia.

    La cuarta opción mucho menos conocida y usada son alguna de las distribuciones BSD. Las distribuciones BSD también tienen una licencia de software libre incluso más permisiva que la licencia GPL. La mayor permisividad de las licencias BSD la hace atractiva para algunas empresas, que al contrario de la licencia GPL con la licencia BSD no están obligadas a distribuir el código fuente de los programas lo que les permite proteger sus desarrollos de competidores. Es utilizada por empresas como Netflix, Sony en las consolas PlayStation e incluso macOS está basado en partes de BSD. Aunque las licencias BSD permiten usar el software sin obligar a colaborar en el desarrollo de su software se ven beneficiadas por colaboraciones puntuales dado que las empresas están interesadas en mejorar el software en el basan su negocio.

    Contenido del artículo

    La distribución FreeBSD

    Entre las distribuciones BSD una popular es FreeBSD, que es posible utilizar con propósitos de computadora de escritorio, su uso también está destinado a software de servidor que es conocida por su pila TCP/IP de gran rendimiento para comunicación por red.

    El mérito de las distribuciones BSD como FreeBSD es ciertamente notable, aunque no tienen la popularidad ni el apoyo por parte de las empresas ni disponer del mismo número de desarrolladores dedicado a su mejora de las distribuciones GNU/Linux consigue proporcionar un sistema operativo de gran calidad con funcionalidades equivalentes a las existentes GNU/Linux o incluso más innovadoras con un modelo de desarrollo diferente de GNU/Linux.

    Es perfectamente capaz de realizar las tareas comunes con el propósito de ordenador de escritorio. Posee programas de navegadores web, multimedia como vídeo y audio, ofimática, visor de documentos e imágenes y una colección formada por más de 36000 paquetes de software compatibles. Otras funciones de software que posee son virtualización, Jails para crear procesos separados del resto del sistema que es la base de los contenedores de Docker, DTrace también desarrollada originalmente por Sun Microsystems, WINE para ejecutar programas de Windows y la posibilidad de agregar compatibilidad binaria con Linux lo que hace posible utilizar programas cuando no están disponibles de forma nativa.

    La mayor dificultad de usar FreeBSD es en que sea compatible con todo el hardware de la computadora, si bien la compatibilidad con el hardware en GNU/Linux actualmente no es un problema en FreeBSD dado el mayor limitado de desarrolladores que tiene el interés de las compañía en ofrecer soporte para su hardware puede presentar algún problema de compatibilidad.

    Las novedades de destacadas de FreeBSD 13 publicada en abril de 2021 es el soporte de la arquitectura de procesadores arm64 al mismo nivel que la arquitectura de procesadores amd64, actualización de paquetes de compiladores, eliminación de algunos programas obsoletos de GNU, soporte en el kernel de TLS y otras mejoras de menor relevancia.

    FreeBSDBeastie

    Logotipo y mascota de FreeBSD

    El sistema de archivos ZFS, ¿qué lo hace diferente?

    Una de las opciones como sistema de archivos es la posibilidad de utilizar ZFS. La licencia BSD permite utilizar más fácilmente el avanzado sistema de archivos ZFS desarrollado originalmente por la difunta Sun Microsystems.

    Lo que hace diferente a ZFS es que combina el rol de gestor de volúmenes con el rol de sistema de archivos. El sistema de archivos ZFS es consciente de la estructura subyacente de discos. Al contrario que los sistemas de archivos tradicionales que solo pueden crearse en un único disco de almacenamiento, esto obliga a que si hay dos discos sea necesario crear dos sistemas de archivos diferentes.

    La combinación de ZFS como gestor de volúmenes y sistema de archivos permite la creación de varios sistemas de archivos todos compartiendo un conjunto de almacenamiento disponible. Una de las mayores ventajas de ZFS de la disposición física de los discos es que los sistemas de archivos existentes pueden ser agrandados automáticamente al añadir discos adicionales al conjunto. Este nuevo espacio queda disponible para todos los sistemas de archivos. También tiene propiedades que pueden ser aplicadas a cada sistema de archivos en vez de crear un único sistema de archivos monolítico.

    OpenZFS

    OpenZFS

    Guía de instalación

    El primer paso de la instalación es descargar la última de las imágenes de medio de instalación disponibles, ya sea la versión de menor tamaño para realizar la instalación por red o la más completa sin necesidad de descargar nada adicionalmente desde la página de descargas de FreeBSD. En caso de duda en la instalación tiene disponible un manual completo de la instalación y uso o como documentación de referencia.

    En este caso como primera toma de contacto con FreeBSD realizo la instalación en una máquina virtual con VirtualBox que está disponible también para Windows como macOS que permite probarla sin necesidad de eliminar el sistema existente en la computadora. En la definición de la máquina virtual se especifican las características de la máquina virtualizada desde el tamaño de memoria, almacenamiento de disco o tipo de BIOS, adicionalmente se proporciona la imagen del medio de instalación y se inserta en la unidad DVD virtual de la máquina.

    El siguiente error de VirtualBox impide iniciar FreeBSD en modo UEFI, hasta que no sea resuelto requiere iniciar el sistema como BIOS, para la prueba el tipo de sistema BIOS o UEFI no tiene relevancia.

    Configuración de máquina virtual con VirtualBox

    Configuración de máquina virtual con VirtualBox

    La instalación de FreeBSD utiliza un asistente que guía y hace la instalación sencilla, rápida y fiable. Descargado el medio de instalación e iniciado el sistema desde él se presenta un menú de opciones que permiten iniciar la instalación. En los diferentes pasos del asistente se van introduciendo las preferencias de configuración desde la disposición del teclado, particionado del sistema de almacenamiento, copiado de archivos del sistema base, establecimiento de contraseña del usuario root, configuración de red, zona horaria y usuarios adicionales.

    Inicio de la instalación.

    Inicio de la instalación de FreeBSDInicio de la instalación de FreeBSDInicio de la instalación de FreeBSD

    Inicio de la instalación de FreeBSDInicio de la instalación de FreeBSDInicio de la instalación de FreeBSD

    Inicio de la instalación de FreeBSDInicio de la instalación de FreeBSDInicio de la instalación de FreeBSD

    Inicio de la instalación de FreeBSDInicio de la instalación de FreeBSDInicio de la instalación de FreeBSD

    Inicio de la instalación de FreeBSD

    Inicio de la instalación de FreeBSD

    El siguiente paso es automático, consiste en la copia de los archivos base del sistema.

    Copia de archivos base de FreeBSDCopia de archivos base de FreeBSDCopia de archivos base de FreeBSD

    Copia de archivos base de FreeBSDCopia de archivos base de FreeBSDCopia de archivos base de FreeBSD

    Copia de archivos base de FreeBSDCopia de archivos base de FreeBSD

    Copia de archivos base de FreeBSD

    A continuación se sigue con la configuración básica del sistema para la conectividad de red, usuarios, fecha y servicios demonio.

    Configuración de FreeBSDConfiguración de FreeBSDConfiguración de FreeBSD

    Configuración de FreeBSDConfiguración de FreeBSDConfiguración de FreeBSD

    Configuración de FreeBSDConfiguración de FreeBSDConfiguración de FreeBSD

    Configuración de FreeBSDConfiguración de FreeBSDConfiguración de FreeBSD

    Configuración de FreeBSD

    Configuración de FreeBSD

    Se ha de establecer la contraseña del usuario root que otorga permisos de superusuario. También se da la oportunidad de crear los usuarios en el sistema.

    Contraseña de superusuario en FreeBSDCreación de usuarios en FreeBSDCreación de usuarios en FreeBSD

    Contraseña de superusuario y creación de usuarios en FreeBSD

    Las últimas pantalla indican la finalización de la instalación.

    Finalización de la instalación de FreeBSDFinalización de la instalación de FreeBSDFinalización de la instalación de FreeBSD

    Finalización de la instalación de FreeBSD

    Primer inicio en FreeBSD

    Completada la instalación al reiniciar el sistema se presenta la pantalla del cargador de arranque y posteriormente la de inicio de sesión en modo texto a partir de la cual es posible instalar programas adicionales y un entorno de escritorio con interfaz gráfica.

    Inicio de sesión en modo texto de FreeBSDInicio de sesión en modo texto de FreeBSDInicio de sesión en modo texto de FreeBSD

    Instalación de entorno de escritorio

    La instalación del entorno de escritorio requiere instalar el servidor gráfico y el entorno de escritorio deseado. Los entornos de escritorio disponibles son los mismos que están disponibles en GNU/Linux entre ellos GNOME, KDE y XFCE con lo que la experiencia de usuario es en gran medida la misma que en una distribución GNU/Linux, la mayor diferencia es que las versión del entorno de escritorio de FreeBSD disponible sea la versión anterior o tarde más tiempo en estar disponible desde su publicación.

    A partir de la consola de inicio de sesión en modo texto hay que instalar los paquete del servidor gráfico Xorg, el paquete del entorno de escritorio deseado y cambiar un archivo de configuración si se desea iniciar el entorno de escritorio al inicio del sistema.

    1
    2
    3
    
    # pkg install xorg# pw groupmod video -m freebsd || pw groupmod wheel -m freebsd# pkg install gnome3
    pkg-gnome.sh

    Para iniciar el gestor de sesión GNOME en el inicio del sistema hay que cambiar la configuración en los archivos /etc/rc.conf y ~/.xinitrc.

    1
    2
    3
    4
    
    dbus_enable="YES"
    gdm_enable="YES"
    gdm_lang="es_ES.UTF-8"
    gnome_enable="YES"
    rc-gnome.conf
    1
    2
    
    exec /usr/local/bin/gnome-session
    
    
    xinitrc.conf

    Para establecer como idioma el español se requiere añadir la siguiente configuración en el archivo /usr/local/etc/gdm/locale.conf.

    1
    2
    3
    
    LANG="es_ES.UTF-8"
    LC_CTYPE="es_ES.UTF-8"
    LC_MESSAGES="es_ES.UTF-8"
    locale.conf

    GNOME en FreeBSDGNOME en FreeBSDGNOME en FreeBSD

    GNOME en FreeBSD

    Uso básico

    FreeBSD proporciona una colección de programas básicos de línea de comandos incorporados en el sistema, al contrario que en GNU/Linux estos programas están desarrollados por los mismos desarrolladores del núcleo del sistema operativo y se actualizan como una unidad en cada versión en vez de individualmente.

    Instalado el sistema dos tareas básicas son la instalación de programas adicionales y la actualización del sistema para obtener nuevas versiones de los programas, correcciones de errores y actualizaciones de seguridad.

    Comando uname en FreeBSDComando df en FreeBSD

    Comandos uname y df en FreeBSD

    Obtener permisos de superusuario root

    Por seguridad algunas tareas administrativas y de edición de archivos de configuración requieren permisos de superusuario root. Esto es posible iniciando sesión en el sistema como el usuario root o obteniendo los privilegios de superusuario con el programa su o sudo.

    Hay un único superusuario en el sistema cuyo nombre de usuario es root, este usuario tiene permisos para realizar cualquier acción en el sistema. La contraseña es necesaria para iniciar sesión, es la proporcionada en la instalación del sistema, y se solicita al obtener privilegios de superusuario en la línea de comandos con el comando su. El resto de usuarios distintos a root son usuarios regulares, para que un usuario regular obtenga privilegios de supersusaurio se ha de utilizar el comando su pertenecer al grupo wheel.

    1
    2
    
    # pw groupmod whell -M freebsd
    pw-add-user-to-wheel.sh
    1
    2
    
    $ su -
    #
    su.sh

    Obtener privilegios de superusuario

    Obtener privilegios de superusuario

    Instalación de paquetes

    La finalidad de cualquier sistema operativo es permitir realizar tareas productivas en él a través de los programas. Para usar un programa es necesario instalarlo previamente en el sistema.

    FreeBSD diferencia los programas de dos formas en como están distribuidos, los paquetes con binarios precompilados para su fácil y rápida instalación y los ports que requieren la compilación a partir del código fuente. En este sentido los paquetes de de FreeBSD son similares a los de los repositorios oficiales Arch Linux y los ports al repositorio AUR que requieren igualmente ser compilados a partir del código fuente.

    La instalación de un paquete se realiza con el comando pkg para buscar su nombre e instalarlo.

    1
    2
    3
    4
    5
    6
    
    # pkg search gnome# pkg search firefox# pkg search libreoffice# pkg search gimp# pkg search vlc# pkg search vim
    pkg-search.sh
    1
    2
    
    # pkg install libreoffice
    pkg-install.sh

    Actualización del sistema

    Una vez realizada la instalación en el futuro se publicarán nuevas versiones de los programas. Para mantener el sistema actualizado hay que ejecutar de forma periódica un comando de actualización.

    La actualización de parches de seguridad de FreeBSD se realiza con los siguientes dos comandos. El sistema base del sistema operativo de FreeBSD se actualiza independientemente de los programas instalados como paquetes.

    1
    2
    
    # freebsd-update fetch# freebsd-update install
    freebsd-update.sh

    El siguiente comando permite revertir la actualización en caso de algún error.

    1
    2
    
    # freebsd-update rollback
    freebsd-update-rollback.sh

    Para actualizar a versiones mayores se realiza con el siguiente comando en el que se indica la versión a la que actualizar.

    1
    2
    
    # freebsd-update -r 13.0-RELEASE upgrade
    freebsd-update-upgrade.sh

    Los paquetes se actualizan independientemente del sistema base de FreeBSD con el siguiente comando.

    1
    2
    
    # pkg upgrade
    pkg-upgrade.sh

    En caso de una actualización a una versión mayor de FreeBSD se requiere una reinstalación de todos los paquetes y ports con los siguientes comandos.

    1
    2
    3
    
    # pkg-static upgrade -f# portmaster -af# freebsd-update install
    freebsd-pkg-upgrade.sh

    Obtener más ayuda

    La cuota de uso de GNU/Linux no es muy grande en el escritorio pero tiene un grupo de usuarios muy activo que comparte gran cantidad de información, es difícil no encontrar una respuesta a una duda o problema y es fácil obtener respuesta a una pregunta.

    El grupo de usuario de FreeBSD es más reducido y por tanto encontrar respuestas a algo concreto no muy común es más difícil, aún siendo un grupo de usuarios más reducido se caracteriza por recibir calurosamente a los nuevos usuarios de FreeBSD. Una buena forma de obtener respuestas y soporte son los foros de usuario y las listas de distribución. Aunque no hay tantos canales de YouTube y artículos en blogs es posible encontrar información sobre FreeBSD a través de los buscadores.

    Libros

    También hay algunos libros dedicados en exclusiva a FreeBSD como Absolute Freebsd: The Complete Guide To FreeBSD, Design and Implementation of the FreeBSD Operating System, FreeBSD Device Drivers: A Guide for the Intrepid, FreeBSD Mastery: ZFS y FreeBSD Mastery: Advanced ZFS

    Eso es todo lo básico para empezar a usar FreeBSD, si alguién lee este artículo y usa FreeBSD u otra distribución BSD como sistema principal o en el trabajo me encantaría conocer más detalles así que si quieres puedes dejar un comentario, también si a alguien que acceda al artículo y lo lea seguro que le resulta interesante como forma de animarse a probar este sistemas operativo de la familia UNIX.

    Bitácora de Javier Gutiérrez Chamorro (Guti): Preload del OPCache en PHP

    $
    0
    0

    Sigo profundizando en el rendimiento de WordPressy también de tu web. En esta ocasión hablaré de las mejoras en cuando al Zend Opcache que si bien se introdujeron en PHP 7.4, no han empezado a despertar el interés hasta el lanzamiento de PHP 8.

    Opcache (php_opcache) es una vieja extensión introducida en PHP 5.5, aunque estaba disponible de manera separada desde el 5.3 creo recordar. Su misión es esencialmente cachear el código parseado/compilado de PHP en memoria. Ya sabéis que tanto si usamos JIT como si no, cada vez que se carga una página el motor de PHP lee de disco sus archivos, lo interpreta, carga sus include/require y finalmente la ejecuta. Ese proceso es lento y por eso Opcache suele producir bastantes beneficios.



    Preload del OPCache en PHP

    El inconveniente de Opcache es que para cada instancia que se lanza de PHP, ya sea esta vía CGI como FastCGI se debe regenerar el contenido de ese caché, lo cual lleva tiempo. Eso es lo que viene a solucionar el preload o preloading que mencionaba. La directiva preload le indica a Opcache qué archivo PHP debe ejecutar al cargarse. Para ello modificamos nuestro php.ini o el archivo de configuración de PHP que usemos para que contenga lo siguiente:

    opcache.preload = "/home/htdocs/www/_opcache.preload.php"

    Efectivamente /home/htdocs/www/_opcache.preload.php es la ruta física (del sistema de archivos del sistema) que contiene el archivo con los contenidos a precargar. Este ejemplo lo que indica son las clases de WordPress necesarias y que he obtenido de internet aplicándole algunas mejoras:

    declare(strict_types=1);
    $wp_dir = dirname(__FILE__) . '/';
    $preload_patterns =
    [
    	$wp_dir . 'wp-includes/Text/Diff/Renderer.php',
    	$wp_dir . 'wp-includes/Text/Diff/Renderer/inline.php',
    	$wp_dir . 'wp-includes/SimplePie/**/*.php',
    	$wp_dir . 'wp-includes/SimplePie/*.php',
    	$wp_dir . 'wp-includes/Requests/**/*.php',
    	$wp_dir . 'wp-includes/Requests/*.php',
    	$wp_dir . 'wp-includes/**/class-*.php',
    	$wp_dir . 'wp-includes/class-*.php',
    ];
    
    $exclusions =
    [
    	$wp_dir . 'wp-includes/class-simplepie.php',
    	$wp_dir . 'wp-includes/SimplePie/File.php',
    	$wp_dir . 'wp-includes/SimplePie/Core.php',
    	$wp_dir . 'wp-includes/class-wp-simplepie-file.php',
    	$wp_dir . 'wp-includes/class-snoopy.php',
    	$wp_dir . 'wp-includes/class-json.php',
    ];
    
    foreach ($preload_patterns as $pattern)
    {
    	$files = glob($pattern);
    	foreach ($files as $file)
    	{
    		if (!in_array($file, $exclusions, true))
    		{
    			opcache_compile_file($file);
    		}
    	}
    }
    



    Preload del OPCache en PHP

    Blog Bitix: Qué son los datos estructurados y para que sirven con ejemplos

    $
    0
    0

    Los datos estructurados son datos que describen los elementos relevantes que contiene la página, facilitan la tarea a los buscadores de analizar el contenido y extraer la información para su indexación y la aparición en las páginas de resultados. Incluir datos estructurados en cada página mejora el SEO y permite que en las páginas de resultados de los buscadores se muestre con un formato enriquecido que destaca sobre el resto de resultados.

    HTML

    Los buscadores rastrean la web en busca de páginas que una vez indexadas les permite mostrarlas en la página de resultados las más relevantes para las palabras clave introducidas al realizar la búsqueda.

    Los archivos sitemap.xml permiten a los buscadores conocer todas páginas de las que se compone un sitio web. Los rastreadores los descargan cada cierto tiempo, de forma paulatina analizan los enlaces proporcionados en el sitemap.xml y los indexa para mostrarlos como resultados si es un contenido relevante para las búsquedas de los usuarios.

    Mostrar los enlaces más relevantes de una búsqueda no es una tarea sencilla, el algoritmo de indexación y del motor de búsqueda han de conocer qué es lo que trata de buscar el usuario y han de conocer cúal es el contenido de cada página. Conocer el contenido de una página no es sencillo ya que las páginas están en formato HTML que ofrece poca ayuda a los buscadores de la información que contienen.

    Contenido del artículo

    Qué son los datos estructurados en una página web

    Los buscadores hacen el mejor esfuerzo por entender el contenido de las páginas, los datos estructurados facilitan en gran medida el análisis del contenido. Los datos estructurados son un formato estandarizado que permite proporcionar de forma más precisa cuál es el contenido e información de una página. Para los buscadores obtener la información de la página es más sencillo y preciso obtener de los datos estructurados que analizando el texto del contenido HTML sin ninguna estructura.

    Además, en las páginas de resultados los buscadores para las páginas que proporcionan datos estructurados son capaces de mostrar los resultados enriquecidos, por ejemplo, incluyendo una imagen, una descripción, una imagen o ciertos datos específicos del dato estructurado como ubicación o fecha.

    Los datos estructurados son buenos para el SEO ya que los buscadores conocen mejor el contenido de la página. Por otro lado, los resultados enriquecidos destacan más sobre los que no son consiguiendo que los usuarios hagan más clics en la página de resultados y atrayendo más visitantes a un sitio web.

    El siguiente es un ejemplo de contenido que contiene datos como un título o fecha pero que no utiliza ningún formato de datos estructurados.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    <h1>Apple Spring Forward Event Live Blog</h1><p>Welcome to live coverage of the Apple Spring Forward …</p><h2>See the new flagship Apple Retail Store in West Lake, China.</h2><p>March 9, 2015 1:17 PM</p><imgsrc="http://images.apple.com/live/2015-mar-event/images/908d2e_large_2x.jpg"/><h2>iPhone is growing at nearly twice the rate of the rest of the smartphone market.</h2><p>March 9, 2015 1:13 PM</p><imgsrc="http://images.apple.com/live/2015-mar-event/images/573cb_xlarge_2x.jpg"/><h2>Coming this April, HBO NOW will be available exclusively in the U.S. on Apple TV and the App Store.</h2><p>March 9, 2015 1:08PM</p><p>It's $14.99 a month.<br> And for a limited time, …</p>
    no-structured-data.html

    Formatos de datos estructurados

    Hay varios formatos de datos estructurados, el formato recomendado por Google es utilizar JSON-LD.

    JSON-LD

    JSON for Linking Data o JSON-LD es un formato de datos estructurados que se especifica en formato JSON y se incluye en la página normalmente en la cabecera separada del contenido, también se puede incluir en el cuero de la página. La diferencia de este formato es que el contenido no está mezclado con los datos estructurados.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    
    <scripttype="application/ld+json">{    "@context":"https://schema.org",    "@type":"LiveBlogPosting",    "@id":"http://techcrunch.com/2015/03/08/apple-watch-event-live-blog",    "about":{      "@type":"Event",      "startDate":"2015-03-09T13:00:00-07:00",      "name":"Apple Spring Forward Event"    },    "coverageStartTime":"2015-03-09T11:30:00-07:00",    "coverageEndTime":"2015-03-09T16:00:00-07:00",    "headline":"Apple Spring Forward Event Live Blog",    "description":"Welcome to live coverage of the Apple Spring Forward …",    "liveBlogUpdate":[      {        "@type":"BlogPosting",        "headline":"Coming this April, HBO NOW will be available exclusively in the U.S. on Apple TV and the App Store.",        "datePublished":"2015-03-09T13:08:00-07:00",        "articleBody":"It's $14.99 a month.<br> And for a limited time, …"      },      {        "@type":"BlogPosting",        "headline":"iPhone is growing at nearly twice the rate of the rest of the smartphone market.",        "datePublished":"2015-03-09T13:13:00-07:00",        "image":"http://images.apple.com/live/2015-mar-event/images/573cb_xlarge_2x.jpg"      },      {        "@type":"BlogPosting",        "headline":"See the new flagship Apple Retail Store in West Lake, China.",        "datePublished":"2015-03-09T13:17:00-07:00",        "video":{          "@type":"VideoObject",          "thumbnail":"http://images.apple.com/live/2015-mar-event/images/908d2e_large_2x.jpg"        }      }    ]}</script>
    json-ld.html

    Microdatos

    El formato HTML Microdata define nuevos atributos HTML para embeber datos simples legibles por computadoras en documentos HTML. Es similar a RDFa pero menos expresivo, simple de aprender y procesar pero no ofrece el mismo nivel para la internacionalización, por ello en su lugar se suele recomendar usar RDFa o JSON-LD.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    
    <divitemid="http://techcrunch.com/2015/03/08/apple-watch-event-live-blog"itemscopeitemtype="https://schema.org/LiveBlogPosting"><divitemprop="about"itemscopeitemtype="https://schema.org/Event">    <spanitemprop="startDate"content="2015-03-09T13:00:00-07:00">March 9, 2015 1:17 PM</span>    <metaitemprop="name"content="Apple Spring Forward Event"/></div><metaitemprop="coverageStartTime"content="2015-03-09T11:30:00-07:00"/><metaitemprop="coverageEndTime"content="2015-03-09T16:00:00-07:00"/><h1itemprop="headline">Apple Spring Forward Event Live Blog</h1><pitemprop="description">Welcome to live coverage of the Apple Spring Forward …</p><divitemprop="liveBlogUpdate"itemscopeitemtype="https://schema.org/BlogPosting">    <h2itemprop="headline">See the new flagship Apple Retail Store in West Lake, China.</h2>    <p><spanitemprop="datePublished"content="2015-03-09T13:17:00-07:00">March 9, 2015 1:17 PM</span></p>    <divitemprop="video"itemscopeitemtype="https://schema.org/VideoObject">      <imgitemprop="thumbnail"src="http://images.apple.com/live/2015-mar-event/images/908d2e_large_2x.jpg"/>    </div></div><divitemprop="liveBlogUpdate"itemscopeitemtype="https://schema.org/BlogPosting">    <h2itemprop="headline">iPhone is growing at nearly twice the rate of the rest of the smartphone market.</h2>    <p><spanitemprop="datePublished"content="2015-03-09T13:13:00-07:00">March 9, 2015 1:13 PM</span></p>    <imgitemprop="image"src="http://images.apple.com/live/2015-mar-event/images/573cb_xlarge_2x.jpg"/></div><divitemprop="liveBlogUpdate"itemscopeitemtype="https://schema.org/BlogPosting">    <h2itemprop="headline">Coming this April, HBO NOW will be available exclusively in the U.S. on Apple TV and the App Store.</h2>    <p><spanitemprop="datePublished"content="2015-03-09T13:08:00-07:00">March 9, 2015 1:08PM</span></p>    <pitemprop="articleBody">It's $14.99 a month.<br> And for a limited time, …</p></div></div>
    microdata.html

    RDFa

    RDFa Es una extensión de HTML que ayuda a marcar los datos de la página, embebiendo ciertos atributos en las etiquetas HTML.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    
    <divvocab="https://schema.org/"typeof="LiveBlogPosting"resource="http://techcrunch.com/2015/03/08/apple-watch-event-live-blog"><divproperty="about"typeof="Event">    <spanproperty="startDate"content="2015-03-09T13:00:00-07:00">March 9, 2015 1:17 PM</span>    <metaproperty="name"content="Apple Spring Forward Event"/></div><metaproperty="coverageStartTime"content="2015-03-09T11:30:00-07:00"/><metaproperty="coverageEndTime"content="2015-03-09T16:00:00-07:00"/><h1property="headline">Apple Spring Forward Event Live Blog</h1><pproperty="description">Welcome to live coverage of the Apple Spring Forward …</p><divproperty="liveBlogUpdate"typeof="BlogPosting">    <h2property="headline">See the new flagship Apple Retail Store in West Lake, China.</h2>    <p><spanproperty="datePublished"content="2015-03-09T13:17:00-07:00">March 9, 2015 1:17 PM</span></p>    <divproperty="video"typeof="VideoObject">      <imgproperty="thumbnail"src="http://images.apple.com/live/2015-mar-event/images/908d2e_large_2x.jpg"/>    </div></div><divproperty="liveBlogUpdate"typeof="BlogPosting">    <h2property="headline">iPhone is growing at nearly twice the rate of the rest of the smartphone market.</h2>    <p><spanproperty="datePublished"content="2015-03-09T13:13:00-07:00">March 9, 2015 1:13 PM</span></p>    <imgproperty="image"src="http://images.apple.com/live/2015-mar-event/images/573cb_xlarge_2x.jpg"/></div><divproperty="liveBlogUpdate"typeof="BlogPosting">    <h2property="headline">Coming this April, HBO NOW will be available exclusively in the U.S. on Apple TV and the App Store.</h2>    <p><spanproperty="datePublished"content="2015-03-09T13:08:00-07:00">March 9, 2015 1:08PM</span></p>    <pproperty="articleBody">It's $14.99 a month.<br> And for a limited time, …</p></div></div>
    rdfa.html

    Tipos de datos estructurados

    Hay múltiples tipos de datos estructurados según el contenido de la página. Por ejemplo, si el contenido de una página trata sobre un producto un dato es la imagen del producto, su nombre y descripción, su precio o su valoración. En el caso de un evento, por ejemplo un evento deportivo o concierto, sus datos específicos son la ubicación en la que tiene lugar, su hora de comienzo y final, además de también los participantes en el evento una su descripción.

    Algunos datos son compartidos por múltiples tipos de datos estructurados, como un nombre o una descripción otros son específicos según el tipo de datos estructurados y contenido de la página. También algunos datos estructurados son comunes a todas las páginas como el autor del contenido o la organización que lo publica.

    En la página schema.org está documentados los tipos de datos estructurados y que datos tiene cada uno. Algunas propiedades son obligatorias otras son opcionales.

    Algunos tipos de datos estructurados son:

    • Trabajos creativos: libro, película, música, receta, series de televisión, …
    • Objetos embebidos no de texto: objeto de audio, imagen, vídeo, …
    • Evento como un espectáculo deportivo o musical.
    • Organización, como empresas.
    • Persona
    • Lugares, negocios locales, restaurantes, comercios, museos, …
    • Productos, ofertas, …
    • Análisis de productos
    • Acciones

    Ejemplo de datos estructurados

    Hay múltiples formas de incluir los datos estructurados en una página web. Una de ellas es embebiendo en el HTML los datos estructurados añadiendo ciertos atributos a etiquetas HTML.

    Para separar el contenido HTML de los datos estructurados se puede utilizar json-ld, es la forma que recomienda Google para incluir datos estructurados en una página. Los datos estructurados json-ld se suelen incluir en la cabecera de la página en formato JSON.

    El el caso de mi blog en el que publico artículos el dato estructurado adecuado para cada publicación es BlogPosting. Este tipo de dato estructurado tiene un título del artículo, una imagen que represente el contenido del artículo, una descripción, fecha de publicación y fecha de última actualización entre otros datos.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    
    <!DOCTYPE html><htmllang="es"><head>
    
    ...
    
    <scripttype="application/ld+json">{"@context":"https://schema.org","@type":"BlogPosting","mainEntityOfPage":{      "@type":"WebPage",      "@id":"https://picodotdev.github.io/blog-bitix/2021/01/analitica-web-con-matomo-como-alternativa-a-google-analytics/"},"headline":"Analítica web con Matomo como alternativa a Google Analytics","image":{      "@type":"ImageObject",      "url":"https://picodotdev.github.io/blog-bitix/assets/images/structured-data/matomo-750.png"    },"datePublished":"2021-01-15T17:00:00+01:00","dateModified":"2021-01-15T17:00:00+01:00","inLanguage":"es","wordCount":"1181","license":"https://creativecommons.org/licenses/by-sa/4.0/","author":{      "@type":"Person",      "name":"picodotdev",      "description":"Ingeniero de software. I ♥ Java, GNU/Linux and libre software.",      "url":"https://twitter.com/picodotdev/"},"publisher":{      "@type":"Organization",      "name":"Blog Bitix",      "logo":{        "@type":"ImageObject",        "url":"https://picodotdev.github.io/blog-bitix/assets/images/structured-data/blogbitix-750.png"      }},"description":"Matomo es una alternativa a Google Analytics con funciones similares que cubren las necesidades de la mayoría de sitios web. Es software libre con algunas funciones <em>premium</em> que requieren comprar una licencia anual de uso. Matomo se puede hospedar <em>on-premise</em> que requiere administrar esa infraestructura o en la nube ofrecida por la propia Matomo. En el artículo muestro en un ejemplo como empezar a usar Matomo en un sitio web con Docker."}</script><scripttype="application/ld+json">{"@context":"https://schema.org","@type":"Organization","name":"Blog Bitix","description":"Blog sobre al lenguaje de programación Java y la distribución GNU/Linux que uso habitualmente, Arch Linux, lo que aprendo sobre el software libre, la programación web y otros temas relacionados con la tecnología y la informática. El contenido puede contener trazas de asuntos fuera de tema.","url":"https://picodotdev.github.io/blog-bitix/","logo":{      "@type":"ImageObject",      "url":"https://picodotdev.github.io/blog-bitix/assets/images/structured-data/blogbitix-750.png"}}</script>
    
    ...
    
    </head><body>
      ...
    </body></html>
    json-ld-blogbitix.html

    Herramienta para validar los datos estructurados

    Una vez incluidos los datos estructurados es recomendable validarlos, esto permite conocer con exactitud qué está extrayendo un buscador. Google ofrece una herramienta de prueba de datos estructurados, basta con proporcionar la URL de la página y en el resultado se muestran los distintos tipos de datos estructurados que ha extraído de la página y sus propiedades. Para uno de los artículos del blog, Analítica web con Matomo como alternativa a Google Analytics, la herramienta de análisis de Google muestra como resultado tipos de datos estructurados que reconoce que están incluídos en la cabecera de la página.

    Variable not found: Enlaces interesantes 442

    $
    0
    0
    Enlaces interesantes

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

    Por si te lo perdiste...

    .NET Core / .NET

    ASP.NET Core / ASP.NET / Blazor

    Azure / Cloud

    Conceptos / Patrones / Buenas prácticas

    Data

    Machine learning / IA / Bots

    Web / HTML / CSS / Javascript

    Visual Studio / Complementos / Herramientas

    Xamarin

    Otros

    Publicado en Variable not found.


    Variable not found: Cómo mostrar por consola las líneas que se van añadiendo a logs o archivos de texto, en tiempo real

    $
    0
    0
    Logging

    Hace unos días pasaba a un amigo una instrucción de PowerShell para visualizar en tiempo real el contenido que iba añadiéndose al final de un archivo de log en Windows, y pensé que igual podía ser útil para alguien más, así que aquí va :)

    El asunto es tan simple como abrir un terminal o consola PowerShell en la carpeta donde tengamos el archivo y ejecutar la siguiente orden:

    Get-content log.txt -Tail 0 -Wait

    A partir de ese momento, la consola quedará bloqueada e irá mostrando en tiempo real las últimas líneas añadidas al archivo:

    Ventana de consola mostrando las últimas líneas añadidas a un archivo de texto

    Esta idea tan sencilla podría ser combinada en scripts que nos simplifiquen alguna tarea más; por ejemplo, si estamos en una carpeta con archivos de trazas de distintos días, es sencillo conseguir que se abra el fichero de log más reciente, de forma que no tengamos que introducir su nombre cada vez que queramos utilizarlo:

    # File: ViewLog.ps1
    $file = Get-ChildItem -Filter *.txt | Sort-Object LastAccessTime -Descending | Select-Object -First 1
    if($file)
    {
    Get-content $file -Tail 0 -Wait
    }

    ¡Espero que os sea útil!

    Publicado en Variable not found.

    Picando Código: ngrok – expone tus servidores locales a través de NATs y Firewalls a la internet pública sobre túneles seguros

    $
    0
    0

    ngrokHace poco tuve que usar ngrok para exponer un servidor de desarrollo local como redireccionamiento para probar el proceso de OAuth. ngrok es una herramienta que expone tus servidores locales a internet a través de túneles seguros por NATs y firewalls.

    Es una herramienta muy práctica que nos permite compartir lo que estemos ejecutando en local con cualquier persona con acceso a internet. Sumamente útil para tareas de desarrollo o demos, si tenemos una aplicación corriendo en local pero todavía no hemos subido los cambios a un servidor público.

    Para empezar a usar ngrok, tenemos que descargarlo (está disponible para FreeBSD, Linux, Mac OS y Windows). Se nos provee un zip con un archivo ejecutable y ya lo podemos empezar a usar ni bien lo descomprimimos. En mi sistema tengo un directorio bin en mi directorio personal. Éste está agregado al path de mi bash, así puedo ejecutar cualquier comando que deje en ese directorio llamándolo directamente.

    En este ejemplo levanté un servidor con Rack en el puerto 9292, después ejecuté ngrok con ngrok http 9292. De ahí podemos o bien copiar la URL pública que nos da ngrok o abrirla desde el navegador web:

    ngrok incluye una interfaz web que podemos ver visitando http://localhost:4040 cuando ngrok se está ejecutando. Nos muestra detalles de los pedidos web y detalles del estado de la aplicación.

    Su uso es gratuito para demos y necesidades simples como desarrollo. Los puertos y URL generados son al azar y podemos tener 1 proceso ngrok online a la vez, entre otras limitaciones. Trabaja con un modelo de pago que nos provee más opciones como subdominios personalizados, SSO con Google Apps, dominios reservados y más recursos. Los precios parecen bastante razonables para empresas.

    Sitio oficial de ngrok

    El post ngrok – expone tus servidores locales a través de NATs y Firewalls a la internet pública sobre túneles seguros fue publicado originalmente en Picando Código.

    Picando Código: Siete días en el Picandoverso: Mayo – 2021

    $
    0
    0

    La última semana estuvo bastante complicada y pasé poco rato en la computadora fuera del horario de trabajo. Por eso tocó un post un poco corto, pero acá van algunos enlaces interesantes para compartir de la última semana:

    Siete días en el Picandoverso Mayo 1 2021

    Tecnología y Programación

    🎤EMEA on Rails es un meetup de meetups con el objetivo de unir distintos meetups de Ruby/Rails en la zona horaria de Europa, el Medio Oriente y África. El próximo encuentro (virtual obviamente) es el 9 de junio. Podemos entrar a su sitio web para ver más o seguirles en Twitter para mantenerlos al tanto de más novedades. Por ahora hay meetups registrados de Austria, Escocia, Inglaterra, Israel, Suiza, Alemania y más.

    📼 En posts anteriores he mencionado a Jemma Issroff y su trabajo con Ruby. El mes pasado dio una charla en el Ruby Meetup de Berlín, y el video está subido a YouTube. La charla se llama “A Day in the Life of a Ruby Object” y explica detalles sobre el Garbage Collector, el uso de memoria instanciando objetos, herramientas que podemos usar para analizar la memoria y más.

    💎 Leyendo Emacs News me enteré de RBS mode, un modo de Emacs para editar RBS (el lenguaje para definir tipos de Ruby). Tengo que probar este nuevo sistema de tipados… ¡algún día tendré tiempo!

    🛤 Con todo el lío con Basecamp y las cagadas que se mandó management, Rails publicó un artículo donde aclaran cómo se gobierna el proyecto. Era necesario para calmar en parte a quienes sin haber colaborado con una línea de código a Rails ya estaban “pidiendo fork”. El equipo central de Rails cuenta con 11 personas, de las cuales 2 trabajan en Basecamp. Lo más importante relacionado al tema es: Hay un proceso de consenso y nadie en el equipo central, o sus empleadores, tiene control único sobre el framework o la comunidad. No hay un individuo o sub grupo de individuos que tengan el poder de ejecutar políticas unilateralmente en los espacios de la comunidad Rails que operan. Así que a calmarnos que usar Rails no implica que estemos de acuerdo ni aprobemos lo que hace o dice su creador…

    🐧El código fuente de Linux superó el millón de commits, se puede ver más claro en el mirror en GitHub.

    🎨 Volví a cambiar mi tema de Emacs, hace un par de semanas (o meses 🤷🏻‍♂️) cambié a curry-on , pero ahora pasé a wilmersdorf, un tema oscuro, sutil y sin mucho contraste.

    🌐 Apache ya no es el servidor web más usado en el mundo. Por primera vez Nginx supera en uso al viejo y querido Apache, aunque siguen estando bastante parejos.

    📚 El bundle de ebooks Head First Programming por O’Reilly sigue estando activo hasta el 10 de este mes, podemos adquirir un montón de libros muy buenos para iniciarnos en distintos temas de programación al precio que elijamos.

    Cómics

    🧙‍♂️Alan Moore vuelve a los cómics después de haberse “retirado” hace un par de años. Va a publicar una serie de cinco volúmenes de fantasía y una colección de cuentos cortos.

    💬 Creo que este mes aflojan un poco los cómics que voy a leer. Marvel está pasando por otro de esos mega eventos aislados que pasan sólamente una vez cada 3 meses y nunca nada volverá a ser como antes. Los esquivo como a la gente sin máscara en el supermercado, así que voy a evitar comprar todos los tie-ins y crossovers con Heroes Reborn que haya…

    Mientras tanto Immortal Hulk se va acercando a sus números finales, si es que va a terminar en el número 50 😱 Y sigo leyendo: BRZRKR que va por el segundo número y viene bien. Beta Ray Bill que tiene un arte excelente y la historia está muy entretenida. Daredevil de Chip Zdarsky que como todo lo que escribe Zdarsky está bueno (Spider-Man: Spider’s Shadow, el “What If?” donde Spider-Man se quedaba con el traje extraterrestre en vez de Venom, está tremendo también). Non-Stop Spider-Man por Joe Kelly y Chris Bachalo que está muy bien pero lamentablemente atrasó los próximos números un mes para adelante. En breve vuelvo a leer DC con Superman and The Authority de Grant Morrison. En su momento leí todo lo que había de The Authority y me gustó mucho, vamos a ver cómo andan Apollo, Midnighter y el resto de la pandilla. También agregué a mis suscripciones el nuevo título de Shazam!

    Películas/TV

    🌌 Ayer 4 de mayo, fue día de celebración de Star Wars (por May the Fourth/May the Force). En Disney+ se estrenó Star Wars: The Bad Batch, una serie secuela/spin-off de la serie The Clone Wars. La premisa:

    La “Fuerza Clon 99”, también conocidos como “Bad Batch”, es un grupo de soldados clon de élite con mutaciones genéticas que se presentaron por primera vez en Star Wars: The Clone Wars, tomando misiones mercenarias tras haber terminado la Guerra de los Clones.

    YouTube Video

    Miré el primer capítulo y me gustó mucho. Seguiré mirando…

    🍿 También miré la película animada de Netflix The Mitchells vs. The Machines y me encantó. ¡La recomiendo! En este tweet (¡spoilers!) publiqué un clip de la película donde expresan perfectamente lo que se siente ser programador 😆

    ❤ Marvel Studios publicó un video “Celebrando las Películas”. No sólo hicieron un repaso del Universo Cinematográfico de Marvel con un voice over de Stan Lee que me erizó todo, también adelantan por primera vez imágenes de The Eternals y fechas y nombres de películas que se vienen en los próximos años. Creo que las novedades además de las fechas son el nombre de la secuela de Black Panther – Black Panther: Wakanda Forever y Captain Marvel – The Marvels (¡con la S de Ms Marvel!). Al final del video un logo de los Fantastic Four, aunque ya estábamos al tanto que estaba en pre-producción y por fin puede que haya una película decente de la primera familia de Marvel.

    YouTube Video

    Otros 7 días en el Picandoverso:

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

    Coding Potions: Cómo crear un reloj analógico con Javascript - Sortilegios 02

    $
    0
    0

    Qué vamos a hacer

    Seguimos con la serie de artículos en las que vamos a construir pequeños proyectos como excusa para aprender programación. En este segundo episodio vamos a seguir con el día 2 de #Javascript30, el reto de construir 30 pequeñas aplicaciones web con Javascript.

    Este tiene un enunciado sencillo, pero no te dejes engañar, si no sabes cómo abordarlo puede que al principio te cueste. Para este reto se pide crear un reloj analógico con CSS y JS.

    🗺️ Hoja de ruta

    • Crear el HTML con los elementos a dibujar
    • Dar estilos a los elementos para que parezcan un reloj
    • Pasar la hora actual a grados
    • Coger los elementos del HTML y pasarle los estilos para que marquen la hora

    Manos a la obra 👷

    Creado la vista y los estilos

    Lo que voy a hacer es hacerlo con SVG. Aunque también se puede hacer con elementos HTML he preferido hacerlo así para dar alguna pincelada sobre SVG.

    Empecemos por el círculo:

    <divclass="clock"><svgclass="circle"viewBox="0 0 120 120"version="1.1"xmlns="http://www.w3.org/2000/svg"><circlecx="60"cy="60"r="60"/></svg></div>

    Creamos un div simplemente para meter el SVG que contendrá la esfera del reloj y las manecillas.

    Como ves, en SVG existe un elemento destinado a crear círculos. Las propiedades cx y cy marcan la posición del círculo dentro del reloj, en esta caso al ser la mitad que la viewBox, se situará en el centro.

    De momento simplemente voy a posicionar el reloj en el centro usando CSS.

    .clock{margin:0pxauto;width:650px;height:650px;}

    Como no hemos definido un color para el círculo por defecto se pintará en negro. Para añadir un color tienes que hacerlo mediante la propiedad fill, la puedes añadir en el HTML o en el CSS:

    <circlecx="60"cy="60"r="60"fill="#fabada"/>
    circle{fill:#fabada;}

    Creando las manecillas

    Vamos ahora con las manecillas. La idea es crear 3 líneas dentro del SVG (una para cada manecilla). En principio las voy a crear para que salgan desde la parte de arriba y vayan hasta el centro del reloj.

    Las líneas serían así:

    <linex1="60"y1="0"x2="60"y2="60"class="hours"/><linex1="60"y1="0"x2="60"y2="60"class="minutes"/><linex1="60"y1="0"x2="60"y2="60"class="seconds"/>

    Los parámetros x1 y y1 sirven para indicar la posición dentro del SVG del punto de partida. En este caso el punto de partida es 60 (el radio del círculo) para el eje X y 0 en el Y para que se coloque arriba en el centro del reloj.

    Los parámetros x2 y y2 son para el punto de destino de la línea, en nuestro caso el centro del reloj, por lo tanto 60 y 60.

    También he añadido clases CSS para poder cambiar el color de las líneas usando la propiedad stroke. Esto no lo hago con el fill porque con stroke quiero que sea como una propiedad de un borde, así puedo añadir stroke-linecap para redondearlo y que no sea una línea rectangular.

    Además, para las 3 líneas he puesto que el transform-origin esté en el centro para que al rotar la línea se haga desde el centro del reloj.

    .hours,.minutes,.seconds{transform-origin:center;stroke-linecap:round;stroke-width:3px;}.hours{stroke:cyan;}.minutes{stroke:lime;}.seconds{stroke:fuchsia;}

    Vamos ahora con el Javascript.

    Calculando la rotación de las manecillas

    El Javascript parece que puede ser muy complicado pero si lo piensas no lo es tanto.

    Simplemente lo que necesitamos es calcular los grados de rotación de cada manecilla pasando la hora actual. Haz una prueba, en el CSS pon esto:

    .minutes{stroke:lime;transform:rotate(90deg);}

    ¿Ves que la manecilla de los minutos ahora apunta hacia la derecha? Eso es gracias al transform-origin, tan solo tenemos que sacar los grados entre 0 y 360 (360 porque una circunferencia tiene 360 grados). Ya puedes quitar lo del transform.

    Lo primero que he hecho es crear una función que se autoejecuta para que se lance cuando se cargue el Javascript.

    (function(){calculateHourDegrees();calculateMinuteDegrees();calculateSeconds();})();

    Simplemente llamo a 3 funciones que voy a crear ahora para calcular los grados de cada manecilla.

    Lo siguiente que hago es crear una función que servirá para hacer una especie de regla de 3 para poder calcular los grados:

    functionlinearMap(value,min,max,newMin,newMax){returnnewMin+(newMax-newMin)*(value-min)/(max-min);}

    Es muy simple, pasas un número value y con min y max pones el rango que tiene ese valor, es decir, el mínimo valor y el máximo que puede tener ese número. Por último, pasas el nuevo valor mínimo con newMiny el nuevo máximo con newMax y la función te devolverá el nuevo valor en el nuevo rango.

    Pongamos un ejemplo. Imagina que queremos calcular los grados (entre 0 grados y 360 grados como hemos dicho) de la manecilla de los minutos. Pongamos que son las 12:33, la llamada a esa función sería así:

    linearMap(33,0,60,0,360);

    El primer parámetro son los minutos, 33, min y max son 0 y 60 porque los minutos como mucho pueden ser 60 y el nuevo valor mínimo y el máximo es 0 y 360. En otras palabras, es una simple regla de 3 que uso para sacar los grados.

    Sabiendo esto ya podemos crear la función para calcular la manecilla de las horas:

    functioncalculateHourDegrees(){constcurrentHour=newDate().getHours()-12;constangle=linearMap(currentHour,0,12,0,360);document.querySelector(".hours").style.transform=`rotate(${angle}deg)`;}

    Lo primero que hago es sacar la hora actual y le resto 12 (porque puede ir hasta 24 pero en un reloj analógico nos vale con 12).

    Saco el ángulo con la función que he explicado antes y lo que hago es seleccionar con el querySelector el elemento del HTML con la línea de las horas para ponerle como estilo el transform con los grados.

    Las otras funciones, la de los minutos y segundos es igual:

    functioncalculateMinuteDegrees(){constcurrentMinutes=newDate().getMinutes();constangle=linearMap(currentMinutes,0,60,0,360);document.querySelector(".minutes").style.transform=`rotate(${angle}deg)`;}functioncalculateSeconds(){constcurrentMinutes=newDate().getSeconds();constangle=linearMap(currentMinutes,0,60,0,360);document.querySelector(".seconds").style.transform=`rotate(${angle}deg)`;}

    Con eso ya se calculan los grados del reloj cuando cargamos el HTML y el Javascript, pero falta algo, ir actualizando el reloj según cambia la hora. Para ello voy a envolver el calculo de los grados dentro de un setInterval:

    (function(){setInterval(()=>{calculateHourDegrees();calculateMinuteDegrees();calculateSeconds();},1000);})();

    El setInterval lo que va a hacer es llamar a las 3 funciones cada segundo (por eso pone 1000 porque son 1000 milisegundos). El reloj quedaría así:

    En la imagen se aprecia un círculo negro con 3 manecillas

    Por cierto, en el HTML, en cada línea, he ajustado el valor y1 para que cada manecilla mida distinto, como en los relojes analógicos. Esto va al gusto de cada uno.

    Por último para dejarlo fino fino voy a meter dentro del CSS una transición de la propiedad transform de las manecillas de las horas y de los minutos para que cuando cambie el valor del ángulo el cambio no sea brusco.

    .hours,.minutes,.seconds{transform-origin:center;stroke-linecap:round;}.hours{stroke:fuchsia;stroke-width:3px;transition:transform1sease-in-out;}.minutes{stroke-width:2px;stroke:lime;transition:transform1sease-in-out;}.seconds{stroke:white;}

    Pero esto no acaba aquí, como detalle final voy a pintar las típicas líneas para marcar las horas alrededor de las manecillas.

    Ahora lo que voy a hacer es crear 12 líneas (una para señalar cada hora) dentro del SVG:

    <linex1="60"y1="5"x2="60"y2="10"class="line"/><linex1="60"y1="5"x2="60"y2="10"class="line"/><linex1="60"y1="5"x2="60"y2="10"class="line"/><linex1="60"y1="5"x2="60"y2="10"class="line"/><linex1="60"y1="5"x2="60"y2="10"class="line"/><linex1="60"y1="5"x2="60"y2="10"class="line"/><linex1="60"y1="5"x2="60"y2="10"class="line"/><linex1="60"y1="5"x2="60"y2="10"class="line"/><linex1="60"y1="5"x2="60"y2="10"class="line"/><linex1="60"y1="5"x2="60"y2="10"class="line"/><linex1="60"y1="5"x2="60"y2="10"class="line"/><linex1="60"y1="5"x2="60"y2="10"class="line"/>

    He ajustado el x e y de cada punto para que midan poquito y se dibujen cerca del borde. Ahora, como pasa con las manecillas hay que calcular los grados de cada una de las líneas para que se dibujen alrededor del círculo. Lo primero el CSS, parecido a las manecillas:

    .line{stroke-width:1px;stroke:white;stroke-linecap:round;transform-origin:center;}

    Y por último el Javascript. Antes de seguir leyendo piensa primero cómo lo harías e intenta hacerlo sin mirar cómo lo he hecho yo.

    Yo lo que se me ha ocurrido es tener en una lista de objetos todas las líneas para recorrerla con bucle for e ir poniendo los ángulos a cada línea.

    functioncalculateLines(){constlines=document.querySelectorAll(".line");constnumberLines=lines.length;for(leti=0;i<numberLines;i++){constline=lines[i];constangle=linearMap(i,0,numberLines,0,360);line.style.transform=`rotate(${angle}deg)`;}}

    Con querySelectorAll pillo en forma de lista todos los elementos del HTML con la clase “line”. Usando un bucle for recorro las líneas y con la función de linearMap que hemos creado antes calculo los grados para cada línea. Fíjate en el detalle que ahora el primer parámetro que paso es i, es decir, el número de esa línea, que va desde 0 al número de líneas que haya, así se reparten las líneas entre la circunferencia y se quedan a la misma distancia.

    Lo bueno de hacerlo así es que si ahora decides que quieres más o menos líneas alrededor de la esfera simplemente tienes que añadir o quitar las líneas del HTML. Automáticamente se calculará su posición para que queden repartidas en el reloj.

    Resultado final:

    En la imagen se aprecia un círculo negro con 3 manecillas y líneas alrededor para cada 5 minutos

    Demo y código fuente

    https://codepen.io/Frostq/pen/XQNXpq

    Deberes

    Si quieres seguir practicando cosas con el reloj te propongo este par de ejercicios:

    • Añadir los números del reloj en su posición, es decir los números del 1 al 12. Para que quede mejor haz que los números 1, 3, 6 y 9 sean más grandes y el resto más pequeños.

    • Añade una esfera interna al reloj, en pequeño con las iniciales de los días de la semana: L, M, X, J, V, S y D. Añade otra manecilla que se mueva indicando el día de la semana actual.

    Conclusiones

    Este tipo de proyectos te recomiendo que primero los intentes hacer sin mirar el código que aparece aquí (puedes leer más o menos como lo planteo por encima) porque cuando lo haces por ti mismo y te sale sin mirar la solución te sientes muy bien.

    Si lo has hecho mirando y copiando mi código no pasa nada, al principio este tipo de ejercicios suele costar, pero te recomiendo que vuelvas a intentar hacerlo sin mirar dentro de un tiempo.

    También te digo que el código que yo explico puede que no sea el mejor o el más óptimo, simplemente es mi solución, seguramente haya otras mucho mejores.

    Blog Bitix: La tinta electrónica y los mejores lectores de libros electrónicos

    $
    0
    0

    Un lector de libros electrónico ofrece mayor comodidad frente a los libros en formato físico, en cuanto a peso y volumen de libros ni los libros ocupan espacio una vez leídos. Son ligeros, de tamaño reducido, ofrecen una lectura bajo el sol equivalente al formato impreso y añaden algunas funciones adicionales como luz integrada y un diccionario de palabras. Tienen un precio asequible y muchos libros electrónicos un precio inferior a la versión en formato físico en papel.

    Hace ya bastante tiempo que están disponibles para comprar dispositivos de lectores de libros electrónicos como sustitución a los tradicionales libros de formato en papel. Los libros en formato electrónico mejoran algunos aspectos de los libros en formato en papel, su tinta electrónica de escala de grises es equivalente a un libro en formato impreso.

    En el mercado hay varios lectores de libros electrónicos a unos precios bastante asequibles con ofertas puntuales cada cierto tiempo.

    Contenido del artículo

    La tinta electrónica

    La experiencia de lectura de los libros electrónicos es equivalente a la de formato en papel. Las pantallas de tinta electrónica son legibles con luz natural ni ofrecen reflejos al contrario de lo que ocurre con el tipo de pantallas que usan los teléfonos móviles inteligentes.

    La resolución de las pantallas de tinta electrónica llega a 300 ppp y unos 1024x758 píxeles ofreciendo una escala de grises comúnmente de 16 tonos. Las pantallas de la mayoría de dispositivos tienen un tamaño de 6 pulgadas de diagonal.

    Cuando se generalice comercialización de lectores con tinta electrónica a color supondrá otro paso en la sustitución del formato en papel pudiendo reemplazar algunos formatos como los comics. Incluso si en el futuro mejoran su tiempo de actualización quizá ofrezcan la reproducción de contenido como vídeos o imágenes en movimiento proporcionando una característica que no tiene el formato en papel.

    Utilizan una batería y requieren ser cargados cada cierto tiempo. Las pantallas de tinta electrónica sólo consumen energía cuando se cambia de página, una sola carga de batería es suficiente para la lectura de una novela de 300 páginas. El dispositivo puede estar un mes en modo reposo antes de necesitar ser cargado de nuevo. La carga se realiza igual que un smartphone y tarda menos de 4 horas en cargarse por completo.

    Ventajas de los libros electrónicos

    Los libros electrónicos tienen varias ventajas sobre los libros en formato en papel. En primer lugar el formato físico es reemplazado por un dispositivo lector de libro electrónico, los libros ya no son físicos sino que son electrónicos con el consiguiente ahorro de espacio para los mismos una vez ya leídos.

    El lector de libros electrónicos es capaz de contener la totalidad de los libros físicos en formato electrónico. Dado que el libro electrónico de una novela de 300 páginas apenas ocupa 1 MB en formato electrónico y que los libros electrónicos tienen una memoria de 2 o más GB, los lectores son capaces de contener gran cantidad de libros. En desplazamientos como viajes o vacaciones el libro electrónico es mucho más cómodo ya que contiene los varios libros a leer no siendo necesario transportar los libros físicos individuales.

    El peso del dispositivo lector de libros electrónicos es más liviano que los libros en formato en papel. Un libro voluminoso de 500 o 1000 páginas ocupa espacio y pesa bastante lo que los hace incómodos de leer en algunas situaciones como en en transporte público.

    Algunos lectores de libros electrónicos ofrecen luz integrada lo que permite la lectura en situaciones de baja luz natural sin necesidad de luz artificial adicional.

    En los libros electrónicos ofrecen funciones adicionales que no tiene un libro en formato físicos como la posibilidad de cambiar el tamaño de la fuente, el espaciado entre líneas y el tipo de la fuente. Otra función es tener un diccionario integrado para consultar la definición de alguna palabra.

    En algunos casos el libro electrónico es más barato que el equivalente en formato físico. Si se es un lector habitual que lee varios libros al año, el precio del dispositivo se ve compensado por el ahorro en los libros electrónicos.

    Lectores de libros electrónicos

    En el mercado hay varios modelos de libros electrónicos con un precio entre 80 y 300 €. Los lectores electrónicos más populares son los Amazon y los modelos de Kobo.

    Amazon Kindle

    Los dispositivos de libros electrónicos de Amazon son de los más populares, ofrece varios modelos en diferentes franjas de precios. Amazon al vender libros electrónicos en su tienda y dado que los dispositivos están integrados con sus servicios es fácil dotarles de contenido.

    Lector de libros electrónicos Kindle Touch del año 2011

    Lector de libros electrónicos Kindle Touch del año 2011

    Hay varios modelos de Kindle con una gama de lectores que se ha ido renovando a lo largo del tiempo con versiones que mejoran paulatinamente las anteriores. Los modelos actuales se catalogan en los siguientes:

    • Kindle: es la versión más básica y económica de los tres modelos, tiene un tamaño de pantalla de 6 pulgadas táctil con luz integrada, una resolución de 167 ppp y una capacidad de 8 GB de memoria para almacenar libros.
    • Kindle Paperwhite: tiene un tamaño de pantalla de 6 pulgadas táctil con luz integrada, una resolución de 300 ppp y una capacidad de 8 o 32 GB de memoria para almacenar libros. Tiene un diseño sin bordes y es resistente al agua.
    • Kindle Oasis: es la opción de gama alta, tiene un tamaño de pantalla de 7 pulgadas táctil con luz integrada ajustable, botones físicos para el paso de página con un diseño ergonómico para diestros o zurdos, una resolución de 300 ppp y una capacidad de 8 o 32 GB de memoria para almacenar libros.

    La conectividad de los Kindle se realiza mediante red WIFI o cable USB aceptando los siguiente formatos de forma nativa (Formato 8 Kindle (AZW3), Kindle (AZW), TXT, PDF, MOBI sin protección, PRC de forma nativa) y otros formatos por conversión.

    Un accesorio para el lector de libros electrónicos es una funda para los modelos Kindle que lo proteja de golpes y suciedad.

    Kobo

    Otra empresa que fabrica lectores de libros electrónicos es Kobo que en características son similares a los de Amazon. Estos también se venden en la propia tienda de Amazon y algunas tiendas físicas.

    • Kobo Nia: es la versión más básica y económica, tiene un tamaño de pantalla de 6 pulgadas táctil con luz integrada, una resolución de 212 ppp y una capacidad de 8 GB de memoria para almacenar libros.
    • Kobo Clara HD: tiene un tamaño de pantalla de 6 pulgadas táctil con luz integrada, una resolución de 300 ppp y una capacidad de 8 GB de memoria para almacenar libros.
    • Kobo Libra H2O: tiene un tamaño de pantalla de 7 pulgadas táctil con luz integrada, botones físicos para el paso de página con un diseño ergonómico para diestros o zurdos, una resolución de 300 ppp y una capacidad de 8 GB de memoria para almacenar libros.
    • Kobo Forma: tiene un tamaño de pantalla de 8 pulgadas táctil con luz integrada resistente al agua, botones físicos para el paso de página con un diseño ergonómico para diestros o zurdos, una resolución de 300 ppp y una capacidad de 8 GB o 32 GB de memoria para almacenar libros.

    La conectividad de los Kindle se realiza mediante red WIFI o cable USB aceptando 15 formatos de libros electrónicos de forma nativa (EPUB, EPUB3, FlePub, PDF, MOBI, JPEG, GIF, PNG, BMP, TIFF, TXT, HTML, RTF, CBZ, CBR) y otros formatos por conversión.

    También hay fundas para los modelos de Kobo en Amazon.

    Otras opciones

    Otras tiendas como El Corte Ingles o PcComponentes también ofrecen algunos otros dispositivos de libros electrónicos. Sus precios son similares pero los de Amazon y Kobo son dispositivos en algunos aspectos mejores.

    El modelo PocketBook InkPad Color destaca por ser de los pocos que utilizan tinta electrónica a color, para la lectura de novelas el color es prescindible pero es muy interesante para la lectura de comics o libros con ilustraciones.

    Dónde comprar libros electrónicos

    Amazon además de los lectores Kindle en su tienda ofrece la compra de una gran variedad de libros en formato electrónico en Amazon. La Casa del Libro también tiene su tienda de libros electrónicos.

    Dado que los libros electrónicos son un formato digital con una distribución más sencilla su precio si no son más baratos tiene el mismo precio que las ediciones en formato físico.

    Estos son algunos ejemplos de libros electrónicos que Amazon vende en su tienda, entre ellos los libros electrónicos más vendidos.

    Si el libro deseado a leer no se encuentra en una de estas tiendas porque ya tiene varios años de publicación ni son las últimas novedades o está descatalogado hay algunas páginas de descargas de libros electrónicos al igual que hay páginas de descargas de películas y series que permiten obtener los libros en formato digital.

    Cómo añadir libros electrónicos al lector

    Hay dos formas de añadir los libros electrónicos al lector de libros. Una de ella es conectando el dispositivo con un cable USB al ordenador que es reconocido como un dispositivo de memoria y posteriormente copiando el archivo del libro electrónico al dispositivo.

    Otra forma en el caso de los Amazon Kindle a través de la red WIFI, si se ha comprado el libro en la tienda de Amazon aparecerá como descarga y se trata de un libro obteniendo de otra forma enviándolo a una dirección de correo especial que añade el libro al contenido digital descargable en el dispositivo.

    Cómo convertir libros electrónicos a un formato soportado por el lector

    Dependiendo del lector de libro electrónico soportará unos formatos u otros. Los dos más comunes son el EPUB soportado por los Kobo y el AZW o MOBI soportado por los Kindle.

    Si se necesita convertir el formato de libro electrónico a otro formato que soporte el dispositivo la aplicación gestor de libros electrónicos Calibre permite además para catalogar los libros de la biblioteca digital para realizar la conversión entre formatos.

    Gestor de biblioteca y conversor de libros electrónicos Calibre

    Gestor de biblioteca y conversor de libros electrónicos Calibre
    Viewing all 2713 articles
    Browse latest View live