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

Variable not found: Enlaces interesantes 333

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

Por si te lo perdiste...

.NET / .NET Core

.NET timeline

ASP.NET / ASP.NET Core

Azure / Cloud

    Data

    HTML / CSS / Javascript

    Visual Studio / Complementos / Herramientas

    Xamarin

    Otros

    Publicado en Variable not found.
    Publicado en: www.variablenotfound.com.

    Picando Código: Taller de tidyverse: manipulación y transformación de datos en R por R-Ladies Montevideo

    $
    0
    0

    R-Ladies Montevideo

    La organización mundial que promueve la diversidad de género en la comunidad de R, R-Ladies, tiene una instancia en Uruguay: R-Ladies MVD. El martes 23 de octubre organizan su cuarto encuentro: Taller de manipulación y transformación de datos con tidyverse en R por Lucía Coudet.

    La cita es en Scanntech (Duvimioso Terra 1975) a las 19:00. Pueden confirmar asistencia en este enlace.

    Pueden unirse y estar al tanto de su actividad en Meetup o seguir la organización en Twitter.

    Blog Bitix: Balanceo de carga y resilencia en un microservicio con Spring Cloud Netflix y Ribbon

    $
    0
    0
    Spring
    Java

    Un servicio que recibe numerosas peticiones o es crítico para el funcionamiento de una aplicación es necesario escalarlo o crear múltiples instancias de él para atender toda la carga que se demanda o para que en caso de que una instancia falle haya otras disponibles que funcionen correctamente para atender las peticiones.

    En este entorno de múltiples instancias se hace necesario un servicio de registro y descubrimiento que usando Spring, Spring Boot y Spring Cloud Netflix una implementación es Eureka. Una vez descubiertas las instancias que hay del servicio es necesario hacer balanceo de carga para conseguir escalabilidad y tolerancia a fallos, en el mismo proyecto de Spring Cloud Netflix para realizar balanceo de carga en el cliente se ofrece Ribbon.

    Hay varias formas de usar Ribbon una de ellas es con lo que denominan feign client, con Spring RestTemplate o directamente con LoadBalancerClient que es la que muestro en este artículo. Este cliente con Ribbon obtiene del servicio de registro y descubrimiento la lista inicial de instancias de un servicios registrado con sus ubicaciones siendo el host en el que se encuentran y el puerto en el que ofrecen su servicio. Con esta lista y el estado de los servicios se realiza el balanceo de carga. Sin embargo, dada la naturaleza de los microservicios se pueden añadir con posterioridad más instancias de un servicio o algunas pueden empezar fallar, Ribbon se encarga de mantener actualizada la lista de instancias de un servicio.

    Combinado con Hystrix un ejemplo de cliente que hace peticiones a un servicio es el siguiente. Para demostrar su funcionamiento el cliente realiza varias llamadas a un servicio cada unos pocos milisegundos balanceando la carga entre las instancias que existan. Si con posterioridad se añade una nueva instancia del servicio Ribbon al cabo de un tiempo de que haya sido iniciada lo añadirá a la lista y empieza a seleccionarla para enviarle peticiones. Si una instancia falla hasta que Eureka no marca la instancia como fuera de servicio y el cliente no actualiza su lista de instancias en el ejemplo de cliente seguirá enviando peticiones a la instancia fuera de servicio y con Hystrix utilizando el método de fallback como respuesta.

    Ante el fallo de una instancia para evitar que temporalmente el cliente empiece a fallar cuando le redirige una petición este puede reintentar las peticiones en otra instancia, esta funcionalidad se proporciona con Spring Retry o utilizando Zuul como proxy.

    Esta es la salida y funcionamiento del cliente realizando balanceado la carga entre las mútiples instancias y que ocurre cuando se añade una nueva o una empieza a fallar y se elimina de la lista.

    Ribbon posee numerosas propiedades de configuración a nivel global para todos los clientes de servicios o de forma específica para cada servicio ya sea con la anotación @RibbonClient o mediante la configuración en archivos externos de Spring Boot. Algunas propiedades de configuración interesantes son las de timeout que permiten que un cliente no agote sus recursos esperando a que a los servicios que llama si tardan en responder y a su vez el cliente actuando de servidor recibe muchas llamadas de sus clientes. En un comando de Hystrix también se puede especificar un timeout de modo que si se realizan reintentos el tiempo total para Hystrix deberá ser superior que el tiempo total de todos los posibles reintentos teniendo en cuenta el timeout del cliente con Ribbon. Unsando el cliente HTTP Jersey como en este caso también pueden establecerse timeouts para una petición.

    El balanceo de carga que con Ribbon se realiza en el cliente es más sencillo que realizar el balanceo de carga en el servidor ya que no requiere una pieza más en la infraestructura pero requiere que el cliente tenga algo de lógica para hacer el balanceo de carga.

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

    Blog Bitix: Proxy para microservicios con Spring Cloud Netflix y Zuul

    $
    0
    0
    Spring
    Java

    Teniendo una buen número de microservicios con múltiples instancias ofreciendo cada uno una API y en una ubicación diferente para simplificar la visión de los que actúen clientes de los microservicios se puede utilizar un proxy. Con un proxy es posible centralizar todas las peticiones, que sea éste el encargado de conocer la ubicación de todas las instancias de los microservicios y de hacer la llamada allí donde se encuentre cada una de ellas.

    Entre las varias funcionalidades que proporcionar el proyecto Spring Cloud Netflix es esta de proxy mediante Zuul. Para hacer de proxy Zuul necesita tener una correspondencia entre URLs y servicios que realmente proporcionan la funcionalidad, una forma que tiene Zuul de conocer la ubicación de las instancias es utilizando el servicio de registro y descubrimiento Eureka. Además, Zuul como cliente de los microservicios posee la funcionalidad de Hystrix que implementa el patrón circuit breaker para tolerancia a fallos, Ribbon para hacer balanceo de carga entre varias instancias de los microservicios a nivel de servidor además de reintentos cuando una instancia falla.

    En el ejemplo que he utilizado para esta serie de artículos sobre Spring Cloud hay un servicio que por defecto se inicia en el puerto 8080 y ofrece un endpoint/ que devuelve un mensaje. Para crear un microservicio proxy con Zuul hay que crear una aplicación Spring Boot anotar la clase principal con la anotación @EnableZuulProxy y proporcionar la configuración para la correspondencia de rutas y microservicios, además de las propiedades para hacer reintentos en caso de que un microservicio falle y de timeouts en caso de que se comporte no como se espera en cuanto tiempos de respuesta.

    Se puede establecer un tiempo máximo para establecer la conexión, de tiempo de petición, el número de reintentos en la misma instancia si falla o en otro número de instancias, el número máximo de conexiones y el número máximo de conexiones al mismo host. Todas ellas definibles en cada servicio de forma individual bajo las propiedades hystrix.command.service y service.ribbon donde service es el identificativo del servicio. Las rutas se indican bajo la propiedad zuul.routes con la relación identificativo del servicio y path.

    Dado que Zuul es un proxy para múltiples instancias de microservicios a cada microservicio hay que darle una ruta, cuando Zuul realiza la llamada a una instancia del microservicio se encarga de omitirla. En el ejemplo, la ruta en Zuul /service/** está asociada al microservicio service pero el servicio service ofrece su endpoint en /, Zuul se encarga de omitir la parte de la ruta para el proxy y hace la llamada a la ruta / como espera el microservicio.

    Lógicamente los clientes deben contactar con el proxy en vez de con el microservicio directamente. Arrancado el servicio de descubrimiento y registro Eureka, el servidor de configuración de Spring Cloud, dos instancias del servicio y el proxy con Zuul haciendo las llamadas al proxy se observa que se obtiene el resultado del microservicio. Como en el ejemplo hay varias instancias del servicio Zuul realiza balanceo de carga entre ellas con Ribbon utilizando la política round-robin y el mensaje es diferente en cada una de las respuestas según la instancia invocada. Con Zuul además se consigue balanceo de carga a nivel de servidor que Ribbon solo ofrece a nivel de cliente.

    Las URLs del servicio en el microservicio y en el proxy son.

    El cliente de ejemplo realiza peticiones al proxy, en la salida se muestra el resultado del balanceo de carga cuando hay varias instancias, cuando se añade una nueva instancia entra a formar parte del balanceo de carga. Otro beneficio de Zuul es que ofrece la funcionalidad de reintentos de modo que si una instancia de un servicio falla la petición se reintenta en otra. En el artículo Balanceo de carga y resilencia en un microservicio con Spring Cloud Netflix y Ribbon usando solo Ribbon se observaba que cuando una instancia falla se le siguen haciendo peticiones hasta que la lista de instancias del servicio en Eureka se actualiza quitando la fallida, con Hystrix se obtiene la respuesta fallback pero no se evita completamente el error. Zuul puede ocultar el error provocado por una instancia que falla reintentado la petición en la misma nuevamente, en otra u otras instancias según se configure. El comportamiento con Zuul cuando una instancia falla se puede comparar con el comportamiento incluido en el artículo anterior usando en el cliente los microservicios directamente.

    Zuul además es capaz de proporciona otras muchas funcionalidades como:

    • Autenticación
    • Seguridad
    • Recolección de métricas y monitorización
    • Pruebas de carga
    • Pruebas de verificación o canary testing
    • Enrutado dinámico
    • Migración de servicio
    • Abandono de carga o load shedding
    • Manejo de respuesta estática
    • Gestión de tráfico active/active

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

    Bitácora de Javier Gutiérrez Chamorro (Guti): Watcom C++ y Sieve para DOS

    $
    0
    0

    Hace unos años redacté Sieve en C, una macro-comparativa del rendimiento de diferentes compiladores de C/C++ para Windows ejecutando una implementación de la Criba de Eratóstenes o Sieve. Unos días atrás publiqué Visual C++ 2008 vs Visual C++ 2017, y volvió a picarme el gusanillo sobre lo que ha evolucionado la calidad del código generado […]

    La entrada Watcom C++ y Sieve para DOS aparece primero en Bitácora de Javier Gutiérrez Chamorro (Guti).

    Picando Código: 10 años de la Ley de Acceso a la Información Pública en Uruguay

    $
    0
    0

    Hoy se celebran 10 años de la Ley de Acceso a la Información Pública en Uruguay. Una ley que ha ayudado mucho a los datos abiertos y la transparencia, en algunos casos. Gracias a esta ley podemos hacer un pedido de información directamente desde la web con ¿Qué Sabés?.

    Para celebrar el aniversario, Fabrizio Scrollini lista 10 cosas que deberíamos ir pensando sobre cómo solucionar en los próximos 10:

    1) Aún tenemos organismos que o bien no publican información, o no responden pedidos de acceso. Trasciende partidos, y hay hasta quien quiso (caso de la Intendencia de Maldonado) declarar la ley inconstitucional. Esto no debería ser aceptable.

    2) En el país líder en América Latina en gobierno electrónico, hay organismos que no responden pedidos vía correo electrónico. No solo es irónico. Está desfasado de la realidad del siglo XX (ya ni XXI)

    3) Necesitamos más recursos para el organismo regulador y posiblemente un nuevo diseño institucional. Eso debería ayudar con el cumplimiento de la ley y la capacitación del servicio civil.

    4) En estos 10 años han existido interpretaciones disparatadas (y otras respetables) del Poder judicial sobre como aplicar excepciones. Necesitamos generar doctrina legal adecuada y consistente.

    5) La actividades de formación ciudadana son importantes. Deberían escalarse lo cual asume recursos. Solo un 25 % de la ciudadanía (aproximadamente) conoce este derecho y es clave que más lo conozcan.

    6) Los programas de Datos Abiertos deben ser fotalecidos para favorecer más publicación y uso de la ley en formas no tradicionales. Ahí vamos por buen camino y podemos hacer mucho más.

    7) Nos debemos una conversación seria sobre transparencia en el sector de seguridad y defensa. Está claro que no todo puede ser público pero hay mucha información útil para la ciudadanía y para evaluar que no está aún disponible.

    8) Hay un problema en todas las tiendas políticas. La transparencia no gusta. Hay declaraciones disparatas. Precisamos fortalecer una sociedad civil que cobre ese tipo de declaraciones y eso debe incluir financiamiento público.

    9) No existe no tener registros ni archivos adecuados sobre los pedidos que se responden. No solo pasa en Uruguay, pero no se puede medir lo que no se cuenta. Si nos vamos a quejar que hay muchos pedidos y toma trabajo, al menos midamos.

    10) Seguimos precisando de medios de prensa que molesten al poder y hagan uso de estas herramientas. Cada vez hay más. También la administración ha adaptado sus prácticas. Esconder información no es jugar limpio.

    Bonustrack 11). Creer que nuestra democracia ha mejorado solo por esta ley sería un error. Hay gente que resiste la transparencia en todas las tiendas partidarias e institucionales. Son la gente que puede ayudar a que nuestra democracia deje de ser seria.

    Picando Código: Nintendo en Madrid Games Week II

    $
    0
    0

    Si están en Madrid este fin de semana, no se pierdan Madrid Games Week, la feria del videojuego referente a nivel nacional. Se realiza a partir de hoy 18 de octubre hasta el 21 de octubre en el pabellón 12 de IFEMA.

    Nintendo va a tener una gran presencia, con 850 metros cuadrados de espacio dedicado a Nintendo Switch y más de 90 puestos de juego. Van a haber más de 30 juegos a disposición de los asistentes, incluyendo Super Smash Bros. Ultimate y Pokémon Let’s Go Pikachu y Pokémon Let’s Go Eevee.

    Nintendo en Madrid Games Week

    El “¡Todos están aquí!” es la expresión perfecta para hablar de Super Smash Bros. Ultimate, el crossover de personajes que no solo enfrenta en divertidos y frenéticos combates a Mario, Link, Pikachu, y otros personajes de toda la historia de Nintendo, sino que engloba a grandes estrellas invitadas y todos los personajes que han estado alguna vez en la saga Smash, como los míticos Sonic y Pac-Man. El juego más completo de la saga, con más de 70 personajes y más de 100 escenarios, llegará a las tiendas el 7 de diciembre, pero todos los asistentes a Madrid Games Week podrán probarlo meses antes de su lanzamiento.

    Estarán también todos los Pokémon de la primera generación por primera vez en Nintendo Switch, y por primera vez en España, gracias a Pokémon: Let’s Go, Pikachu! y Pokémon: Let’s Go, Eevee!. Madrid Games Week será la primera oportunidad que tendrán los fans de todo el país para probar esta nueva aventura que combina elementos de la saga clásica con elementos de Pokémon GO, el fenómeno de masas que a día de hoy sigue superando récords de actividad gracias a su entregada comunidad. Pokémon: Let’s Go, Pikachu! y Pokémon: Let’s Go, Eevee! se pondrán a la venta el próximo 16 de noviembre, y los asistentes a la feria podrán probar varias de sus novedades, como el modo cooperativo para explorar, capturar y combatir en compañía, y el control con el nuevo accesorio Poké Ball Plus.

    En la Zona Mario los asistentes se podrán montar fiestas sobre la marcha con sus acompañantes y disfrutar con los minijuegos de Super Mario Party, o demostrarán quién es el rey de la pista con Mario Tennis Aces y quién domina mejor el volante y los caparazones con Mario Kart 8 Deluxe.

    Las aventuras de mayor calibre están en la Zona RPG, como The Legend of Zelda: Breath of the Wild, el considerado por la crítica (y el autor de este blog) como el mejor juego del año 2017 y uno de los mejores de la historia.

    En la Zona de Acción y deportes no sólo están títulos exclusivos de Nintendo Switch como Splatoon 2. El apoyo third party está patente en EA SPORTS FIFA 19, Dragon Ball FighterZ y el gran fenómeno de Fortnite en un formato que permite jugar en cualquier lugar. Ubisoft tendrá un gran peso en esta zona con Starlink: Battle for Atlas, el título de acción y exploración espacial que el mismísimo Shigeru Miyamoto presentó en el pasado E3.

    Nintendo Switch, la consola de los indies

    Nintendo Switch es la consola en la que todos los desarrolladores independientes quieren estar. Así, la Zona Nindies crece con un gran número de experiencias diferentes, con títulos
    ya considerados por muchos como inolvidables como Celeste, Hollow Knight, Dead Cells, y apuestas con la originalidad por bandera como Toki, Flipping Death, The Gardens Between.

    Todos los asistentes al stand de Nintendo en Madrid Games Week tendrán la posibilidad de llevarse una de las dos Nintendo Switch que se sortearán cada día (de viernes a
    domingo) entre todos aquellos que hayan conseguido un número de sellos por jugar en cada una de las diferentes zonas. A través de Twitter también se sortearán tres Nintendo Switch
    entre todos aquellos que tuiteen una foto desde cualquier lugar del stand utilizando el hashtag #NintendoEnMGW.

    Quien busque la diversión en la emoción de la competición, también tendrá su lugar en el stand de Nintendo en Madrid Games Week. Los asistentes podrán inscribirse en los torneos de Mario Tennis Aces y Mario Kart 8 Deluxe, y para quienes disfruten de ver una competición de alto nivel tanto como de jugar, se celebrará un Torneo Invitacional de Super Smash Bros. Ultimate, en el que los mejores jugadores del país se enfrentarán en frenéticos combates.

    La guinda al pastel de la competición la pone la clasificación nacional del Splatoon 2 European Championship 2019, en el que los mejores equipos de inklings y octolings se llenarán las caras de tinta para demostrar quién merece representar a España en el campeonato europeo que se celebrará en primavera de 2019.

    Están los juegos más esperados meses antes de su lanzamiento, están los juegos third party en las mejores versiones para jugar en cualquier lugar, están los Nindies, están los mejores
    juegos para la diversión en familia, están las aventuras más sorprendentes, están las competiciones de alto nivel, están los regalos y sorteos… Todos están aquí, ¡solo faltas tú!

    Más información:
    http://www.nintendo.es
    https://www.nintendo.es/nintendoswitch
    https://twitter.com/nintendoes
    https://www.facebook.com/NintendoES
    https://www.facebook.com/NintendoSwitchES
    http://www.youtube.com/NintendoES
    https://instagram.com/nintendoes/
    https://www.instagram.com/NintendoSwitchES

    Sobre Nintendo
    Pionera en la creación de entretenimiento interactivo, Nintendo Co., Ltd., con sede en Kioto (Japón), fabrica y distribuye hardware y software para su consola de sobremesa Nintendo Switch, y para las familias de consolas portátiles. Desde 1983, cuando lanzó la Nintendo Entertainment System (NES), Nintendo ha vendido más de 4.600 millones de videojuegos y más de 725 millones de unidades de hardware en todo el mundo, incluyendo las actuales consolas Nintendo Switch, New Nintendo 3DS y New Nintendo 3DS XL, Nintendo 3DS, Nintendo 3DS XL y Nintendo 2DS, así como Game Boy™, Game Boy Advance, Super NES™, Nintendo 64™, Nintendo GameCube™, Wii, Nintendo DS, Nintendo DSi, Nintendo DSi XL y Wii U. También ha creado personajes tan conocidos como Mario™, Donkey Kong™, Metroid™, Zelda™ y Pokémon™. Como empresa subsidiaria, Nintendo Ibérica, S.A., con sede en Madrid, actúa como sede central de operaciones de Nintendo en España y Portugal.

    Blog Bitix: Sun Microsystems cae

    $
    0
    0
    Sun Microsystems
    Oracle

    Era enero del 2010 y se anunciaba que Oracle adquiría Sun Microsystems por unos 7400 millones de dólares. Sun Microsystems era asimilada por uno de los grandes entre el mundo empresarial. Fue un hecho importante debido a varias de las tecnologías que había desarrollado Sun y poseía como aún a día de hoy uno de los lenguajes más populares para el desarrollo de software, Java, y otras tecnologías importantes que había adquirido hace no tanto tiempo como la base de datos MySQL competencia de Oracle.

    Otras tecnologías de Sun relevantes eran el sistema operativo Solaris, la tecnologías de depuración DTraze, el avanzado sistema de archivos ZFS utilizando a día de hoy en los sistemas BSD, el paquete ofimático OpenOffice predecesora de LibreOffice, la herramienta de automatización de proyectos Hudson también predecesora de Jenkins, el software de virtualización VirtualBox o la plataforma de microprocesadores Sparc.

    La adquisición de Oracle generó dudas por la cultura de empresa más cerrada que la que tenía Sun que contribuyó e infiluencio notablemente en el mundo tecnológico aún a día de hoy. Después de unos meses de la adquisición varias personas salieron de la compañía como James Gosling creador de Java, Tim Bray creador de formato XML, Kohsuke Kawaguchi desarrollador principal de Hudson o Bryan Cantrill creador de DTrace.

    ¿Cuál fue el error o errores de Sun Microsystems para que teniendo unas tecnologías tan importantes tuviese problemas económicos como para que fuese vendida? Fue una de las empresas más afectadas por el estallido de la burbuja de las punto com y una pérdida importante de clientes grandes. Quizá el fallo para mi fue que aún poseyendo grandes tecnologías y habiendo realizado importantes adquisiciones no fue capaz de rentabilizarlas económicamente, quizá que GNU/Linux le estuviese haciendo competencia al sistema Solaris u opciones más económicas como la arquitectura x86 a Sparc.

    Oracle se ha deshecho muchas de las tecnologías a las que creía no sacar rentabilidad, otras como Java las ha seguido desarrollando creo en una buena dirección inicialmente con la publicación de Java 7 y más tarde incluyendo cambios más importantes con Java 8, más recientemente Java 9, 10 y 11. Con Java EE ha dado también un paso importante para proporcionarle un modelo de desarrollo más abierto y rápido traspasando el desarrollo a la fundación Eclipse y adoptando un nuevo nombre de Java EE a Jakarta EE. Algunas otras conserva como VirtualBox con buena salud.

    En el artículo The Java Saga se comentan varios aspectos importantes de Java como que inicialmente este lenguaje estaba orientado a la electrónica donde la fiabilidad es más importante que la rapidez, C++ no era lo suficientemente fiable para lo que Gosling tenía en mente. Diseñaron la primera tableta electrónica, aún así pasa a ser la base de la emergente web para hacerla interactiva. Otro artículo interesante es The downfall of Sun Microsystems en el que precisamente se comenta la falta de rentabilizar varias de sus tecnologías y la crisis de las punto com.

    En Sun Microsystems, Inc. se indica que parte del éxito de Java se atribuye a la frase «write once, run anywhere» significando que un programa escrito en Java no tiene que se reescrito para cada sistema operativo de cada computadora. Si es ejecutado en una computadora UNIX, debería ejecutarse en una máquina Windows o Macintosh mediante el uso de la máquina virtual de Java o JVM. La Java Virtual Machine se proporcionaba con UNIX, Macintosh y otros systemas asi como navegadores web como Netscape o Internet Explorer. Esa versatilidad hizo de Java un lenguaje popular al escribir aplicaciones para la web y para varios observadores hacer disminuir la importancia de los sistemas operativos.

    Sin embargo, en 1997 Microsoft mediante su técnica adoptar, extender y extinguir publicó una JVM que era incompatible con otras JVMs rompiendo de forma efectiva la promesa «write once, run anywhere» de los programas Java. En noviembre de 1998 la justicia instó a Microsoft a no distribuir más copias de su versión de Java.

    Por afinidad y percepción con su cultura la que a mi me hubiese gustado más que adquiriese Sun es Red Hat una compañía que ha demostrado que con el software libre se puede hacer negocio siendo en en el año 2012 cuando alcanzó la cifra de 1000 millones de dólares de facturación y 2000 millones en el 2018. Sin embargo, no hubiese sido posible en ese momento porque Red Hat no era lo suficientemente grande como para hacer hacer una adquisición de tal tamaño para con Sun Microsystems.

    Sun Microsystems dejó una larga herencia que dura aún e día y frases legendarias y visionarias como «the network is the computer» atribuida a John Gage o «write once, run anywhere».


    Blog Bitix: Sun Microsystems cae, la adquiere Oracle

    $
    0
    0
    Sun Microsystems
    Oracle

    Era enero del 2010 y se anunciaba que Oracle adquiría Sun (Stanford University Network) por unos 7400 millones de dólares. Sun Microsystems era asimilada por uno de los grandes entre el mundo empresarial que eliminaba a uno de sus competidores. Fue un hecho importante debido a varias de las tecnologías que había desarrollado Sun y poseía como aún a día de hoy uno de los lenguajes más populares para el desarrollo de software, Java, y otras tecnologías importantes que había adquirido hace no tanto tiempo como la base de datos MySQL competencia de Oracle.

    Otras tecnologías de Sun relevantes eran el sistema operativo Solaris, la tecnologías de depuración DTraze, el avanzado sistema de archivos ZFS utilizando a día de hoy en los sistemas BSD, el paquete ofimático OpenOffice predecesora de LibreOffice, la herramienta de automatización de proyectos Hudson también predecesora de Jenkins, el software de virtualización VirtualBox o la plataforma de microprocesadores Sparc.

    La adquisición de Oracle generó dudas por la cultura de empresa más cerrada que la que tenía Sun que contribuyó e influenció notablemente en el mundo tecnológico aún a día de hoy. Después de unos meses de la adquisición varias personas salieron de la compañía como James Gosling creador de Java, Tim Bray creador de formato XML, Kohsuke Kawaguchi desarrollador principal de Hudson o Bryan Cantrill creador de DTrace.

    ¿Cuál fue el error o errores de Sun Microsystems para que teniendo unas tecnologías tan importantes tuviese problemas económicos como para que fuese vendida? Fue una de las empresas más afectadas por el estallido de la burbuja de las punto com y una pérdida importante de clientes grandes. Posiblemente el fallo fue que aún poseyendo grandes tecnologías y habiendo realizado importantes adquisiciones, algunas de dudoso acierto y muy caras, no fue capaz de rentabilizarlas económicamente, quizá que GNU/Linux le estuviese haciendo competencia al sistema Solaris u opciones más económicas como la arquitectura x86 a Sparc.

    Oracle se ha deshecho muchas de las tecnologías a las que creía no sacar rentabilidad, otras como Java las ha seguido desarrollando creo en una buena dirección con la publicación de Java 7 y más tarde incluyendo cambios más importantes con Java 8, más recientemente Java 9, 10 y 11. Con Java EE ha dado también un paso importante para proporcionarle un modelo de desarrollo más abierto y rápido traspasando el desarrollo a la fundación Eclipse y adoptando un nuevo nombre de Java EE a Jakarta EE. Algunas otras conserva como VirtualBox con buena salud.

    JavaSolarisSparc
    LibreOfficeMySQLVirtualbox

    En el artículo The Java Saga se comentan varios aspectos importantes de Java como que inicialmente este lenguaje estaba orientado a la electrónica donde la fiabilidad es más importante que la rapidez, C++ no era lo suficientemente fiable para lo que Gosling tenía en mente. Diseñaron la primera tableta electrónica, aún así pasa a ser la base de la emergente web para hacerla interactiva. Otro artículo interesante es The downfall of Sun Microsystems en el que precisamente se comenta la falta de rentabilizar varias de sus tecnologías y la crisis de las punto com.

    En Sun Microsystems, Inc. se indica que parte del éxito de Java se atribuye a la frase «write once, run anywhere» significando que un programa escrito en Java no tiene que se reescrito para cada sistema operativo de cada computadora. Si es ejecutado en una computadora UNIX, debería ejecutarse en una máquina Windows o Macintosh mediante el uso de la máquina virtual de Java o JVM. La Java Virtual Machine se proporcionaba con UNIX, Macintosh y otros systemas asi como navegadores web como Netscape o Internet Explorer. Esa versatilidad hizo de Java un lenguaje popular al escribir aplicaciones para la web y para varios observadores disminuyendo la importancia de los sistemas operativos.

    En 1997 Microsoft viendose amenazada y haciendo uso de su técnica adoptar, extender y extinguir publicó una JVM que era incompatible con otras JVMs rompiendo de forma efectiva la promesa «write once, run anywhere» de los programas Java. En noviembre de 1998 la justicia instó a Microsoft a no distribuir más copias de su versión de Java.

    En los artículos La historia de Sun Microsystems, 1ª Parte: Network is the computer y La historia de Sun Microsystems. 2ª Parte: Write Once. Run Everywhere se hace un buen repaso de la historia de esta empresa desde sus inicios e hitos más importantes asi como las personas que intervinieron en ellos pasando por los malos momentos hasta la finalmente adquisición por Oracle. Otro artículo y sus comentarios interesante es Así es como Oracle ha sometido a Sun Microsystems a una muerte larga y agónica.

    Por afinidad hacia el open source con su cultura de empresa la que hubiese preferido que adquiriese Sun es Red Hat una compañía que ha demostrado que con el software libre se puede hacer negocio además de contribuir a la comunidad beneficiandose de ella al mismo tiempo, en el año 2012 alcanzó la cifra de 1000 millones de dólares de facturación y 2000 millones en el 2018. Sin embargo, no hubiese sido posible en ese momento porque Red Hat no era lo suficientemente grande como para hacer hacer una adquisición de tal tamaño para con Sun Microsystems.

    Sun Microsystems dejó una larga herencia que dura aún en día y frases legendarias y visionarias como «the network is the computer» atribuida a John Gage o «write once, run anywhere» de Java.

    Picando Código: La Programación…

    $
    0
    0

    Picando Código: Kingdom Rush Origins

    $
    0
    0

    Kingdom Rush Origins

    El estudio uruguayo Ironhide vuelve a la carga con Kingdom Rush Origins: La más reciente entrega de la saga Kingdom Rush está disponible en Steam para Linux, Mac y Windows y GOG (Mac y Windows).

    Kingdom Rush es una saga de juegos que combina tower defense y estrategia en un universo fantástico con caballeros, héroes, magos, dragones y otras criaturas místicas. La mecánica es relativamente sencilla, tenemos que proteger nuestra base de olas de enemigos, pero a medida que avanzamos la estrategia es clave para poder seguir adelante.

    Contamos con distintos tipos de torres que son más o menos efectivas según el enemigo que enfrentemos, y la combinación de torres que elijamos. Arqueros, magos, druidas de piedra e infantería élfica son la base de nuestro ejército y hay más de 18 habilidades para nuestras torres: tiradores elfos, osos, magos y hasta árboles gigantes.

    Los niveles son bastante coloridos con una estética caricaturesca y los distintos personajes y enemigos son muy particulares. Arañas gigantes, gnomos, magos, vampiros y más. El juego mantiene la tradición de incluir homenajes a distintas series y juegos que parecen venir del cariño que de los desarrolladores a dichas series. Son pequeños huevos de pascua que divierten mucho al ser descubiertos, hay que estar atentos para encontra estos detalles. Entre los escenarios esta vez contamos con bosques élficos, reinos de hadas mágicos y ruinas aéreas de una antigua metrópolis.

    La historia se cuenta con mini cómics entre algunos de los niveles, y este título es una precuela de los que vinieron antes. Pero no necesitan haber jugado los Kingdom Rush anteriores para divertirse jugando éste.

    Como en instancias anteriores, contamos con héroes que van subiendo de nivel y ganando poder a medida que generan experiencia en el campo de batalla. Por ahora mi héroe preferido es Faustus, el dragón. Pero no los he probado todos. Cada héroe tiene su estrategia también, y según el nivel o nuestra forma de jugar algunos héroes son mejor que otros.

    Nuevamente tuve el privilegio de poder probar la versión beta de Kingdom Rush Origins en Steam. Llegué a terminar la aventura principal sin encontrar ningún error y nuevamente volví a jugarlo entero con mi Steam Controller como hice con Kingdom Rush Frontiers. Al terminar la historia principal, me puse a jugar en el modo heróico, un poco más difícil con ciertas limitaciones en lo que podemos usar. Le sigue el modo Iron, todavía más limitado en las torres y habilidades, que pone a prueba nuestra capacidad como estrategas. Cuenta también con varios achievements de Steam que son bastante divertidos de ir encontrando.

    [See image gallery at picandocodigo.net]

    Como si todo esto fuera poco, faltan algunas actualizaciones gratuitas con más contenido. Al terminar la aventura principal podemos ver que el mapa tiene varias partes sin explorar y quedan héroes por descubrir:

    Última semana de Diciembre – Actualización 1.1

    ¡Cuidado! ¡Un poderoso ejército de ogros está preparando una estrategia para invadir y destruir todo!

    Esta actualización incluye:

    • La expansión “Hulking rage” (¿la furia a lo Hulk? No sé cómo traducirlo exacto, pero me gusta)
    • Héros nuevos para ayudar con la invasión (Durax, Lilith y Razz & Rags)

    Última semana de Enero – Actualización 1.2

    El último y más leal teniente de Malicia se ha vuelto loco y está tramando venganza.
    ¡Lidera las fuerzas élficas y detén los planes de Baj’Nimen el Odioso antes que destruya todo en su camino!

    Esta actualización incluye:

    • La expansión “Bittering Rancor” (no creo que lo bitter se refiera a un tipo de cerveza)
    • Héroes poderosos (Bruce, Lynn)

    Última semana de Febrero – Actualización 1.3

    Como nuestro Reino vuelve a sus antiguos tiempos de paz, el mensaje que mandamos pidiendo ayuda a los enanos nunca volvió, si hay algo más molesto que un enano ruidoso, ¡es uno callado!
    Necesitas viajar a su tierra y buscar respuestas.

    Esta actualización incluye:

    • Expansión “Forgotten treasures” (tesoros escondidos)
    • Héroes (Wilbur, Phoenix)

    No tengo mucho más que decir que si les resulta interesante el género o la ambientación del juego, probablemente les resulte divertido. Cuenta con mucho contenido, y más contenido en camino todavía. En lo personal la saga es de lo que más he jugado en computadora, y siempre estoy atento a nuevas entregas. Así que recomiendo ampliamente que jueguen y disfruten de Kingdom Rush:

    Otras reseñas de la saga en el blog:

    ¡Muchas gracias Ironhide por volver a darme la oportunidad de jugar la versión beta!

    Concurso Kingdom Rush

    Manteniendo algo así como una tradición iniciada en 2014: Para cerrar el post, por haber leído hasta acá, para repartir la alegría, y celebrar la salida del juego, voy a estar regalando claves de Kingdom Rush para Steam. El juego está disponible en GNU/Linux, Mac OS y Windows. Como en otros sorteos, hay varias formas de participar:

    • Dejando un comentario en este post con su correo electrónico real (no voy a compartirlo con ninguna empresa que los quiera espamear, simplemente tengo que contactarlos de alguna manera si son los ganadores).
    • Publicando un tweet mencionando a @picandocodigo con un link a este post y el hashtag #AwokMilanga o #KingdomRushLinux

    La semana que viene anunciaré los ganadores. ¡Suerte y a jugar Kingdom Rush!

    Variable not found: Enlaces interesantes 334

    $
    0
    0
    Enlaces interesantesDespués del parón de la semana pasada debido a compromisos profesionales (¡hola, chic*s!), continuamos con una nueva recopilación de enlaces que, como siempre, espero que os resulten interesantes :)

    Por si te lo perdiste...

    .NET / .NET Core

    ASP.NET / ASP.NET Core

    Azure / Cloud

    Conceptos / Patrones / Buenas prácticas

    Data

    HTML / CSS / Javascript

    Visual Studio / Complementos / Herramientas

    Xamarin

    Otros

    Publicado en Variable not found.

    Picando Código: Game Dev Meetup Montevideo: Mujeres en Videojuegos

    $
    0
    0

    Gamedev Meetup Uruguay: Mujeres en Videojuegos

    Llega la segunda edición de Gamedev Meetup Uruguay: Mujeres en Videojuegos organizado por CAVI con el apoyo de Girls in Tech – Uruguay, INAE Uruguay – Instituto Nacional de Artes Escénicas y MEC Uruguay.

    Adriana Pignolo (Game Designer en Trojan Chicken) nos trae Diseñando una tercera entrega: Mejorar la experiencia de usuario sin cambiar “nada” .

    Victoria De Lima (Senior Community Manager de Travian Games GmbH) y Lucía Gómez (Community Manager de Ironhide Game Studio) se unen en un panel para contarnos cómo crear y gestionar una comunidad para tu juego.

    María Virginia Ambrosoni (Lead Artist de Arf Games) nos trae métodos de desorganización para artistas.

    Fecha: jueves 25 de octubre desde las 18:30 hs , entrada sin costo.
    Lugar: INAE Uruguay – Instituto Nacional de Artes Escénicas – Zabala 1480, 11000, Montevideo, Uruguay

    GameDev Meetup en Twitter

    Variable not found: Cargar automáticamente objetos del modelo en acciones ASP.NET Core MVC

    $
    0
    0
    ASP.NET Core MVCDesde que comenzamos a programar con ASP.NET MVC tenemos interiorizado que si en nuestras acciones vemos código repetido, suele ser un candidato a ser implementado en forma de filtro. Así, durante años hemos implementado en forma de action filters asuntos transversales de nuestras aplicaciones, como la seguridad, logging, caching y otros aspectos.

    Sin embargo, a veces olvidamos que estas mismas técnicas podemos utilizarlas para simplificar código en la implementación de convenciones o funciones más ligadas al negocio o a funcionalidades de nuestra aplicación. Por ejemplo, ¿no estáis aburridos de escribir acciones como las siguientes?
    publicclass FriendsController: Controller
    {
    public IActionResult View(int id)
    {
    var friend = _friendServices.GetById(id);
    if(friend == null)
    return NotFound();
    ... // Prepare and show "View" view
    }

    public IActionResult Edit(int id)
    {
    var friend = _friendServices.GetById(id);
    if(friend == null)
    return NotFound();
    ... // Prepare and show "Edit" view
    }

    public IActionResult Delete(int id)
    {
    var friend = _friendServices.GetById(id);
    if(friend == null)
    return NotFound();
    ... // Prepare and show "Delete" view
    }

    ...
    }
    Pues bien, vamos a aplicar el mismo principio para simplificar este código y eliminar duplicidades extrayendo las porciones comunes a un filtro, resultando en algo así de bonito:

    [Autoload(typeof(Friend))] // ¡Magia!
    publicclass FriendsController: Controller
    {
    public Task<IActionResult> View(Friend friend)
    {
    ... // Prepare and show "View" view
    }

    public Task<IActionResult> Edit(Friend friend)
    {
    ... // Prepare and show "Edit" view
    }

    public Task<IActionResult> Delete(Friend friend)
    {
    ... // Prepare and show "Delete" view
    }
    ...
    }
    No sé lo útil que podrá resultar en la práctica pero, como mínimo, nos ayudará a conocer mejor cómo funciona por dentro el framework ASP.NET Core MVC.

    Primero, tengámoslo claro: convenciones

    Para conseguir el resultado pretendido primero tendremos que establecer ciertas convenciones, así como determinar claramente el comportamiento que deseamos para el filtro [Autoload].

    Así pues, de momento convengamos que las peticiones a acciones afectadas por nuestro filtro serán procesadas de la siguiente forma:
    • Examinamos si la acción contiene un parámetro de entrada del mismo tipo indicado en el atributo. Es decir, si hemos decorado la acción (o controlador donde se encuentra) con [Autoload(typeof(Friend))], buscamos si ésta tiene un parámetro de entrada de tipo Friend.
       
    • En caso afirmativo, buscamos si en los datos de la petición existe un parámetro id y obtenemos su valor. Este nombre de parámetro es por defecto, pero podremos establecer uno diferente al crear el filtro, así: [Autoload(typeof(Friend), IdParamName = "ident")] si quisiésemos utilizar como identificador el parámetro ident.
       
    • Tras obtener el valor del identificador, buscaremos en el contenedor de dependencias un servicio de tipo IRepository<T>, siendo T el tipo de objeto solicitado. Siguiendo con nuestro ejemplo, buscaríamos un servicio IRepository<Friend>.
       
    • Si existe el servicio, invocamos a su método GetByIdAsync(int id) del repositorio, suministrándole el identificador obtenido anteriormente.
       
    • Si todo fue correcto y el repositorio retorna un objeto, lo inyectamos como parámetro de la acción. En caso negativo, retornaremos directamente un HTTP 404.
    A nivel de código veréis que es bastante sencillo adaptar estas convenciones a vuestros escenarios específicos.
    Para explicar mejor estas convenciones, veamos un ejemplo a nivel de código. Imaginad el siguiente controlador:
    publicclass FriendsController: Controller
    {
    [Autoload(typeof(Friend))]
    public Task<IActionResult> Edit(Friend friend)
    {
    ... // Prepare and show "edit" view
    }
    }
    Cuando se produzca una petición hacia, digamos, friends/edit/12, el filtro detectará que la acción a ejecutar presenta un parámetro de tipo Friend. A continuación, obtendrá el contexto de la petición un valor para el parámetro “id” (12, en este caso), y lo utilizará como clave para obtener una instancia a través del servicio IRepository<Friend>. Una vez obtenida, inyectará el valor y ejecutará la acción.

    [Autoload]: el código

    Veamos el código de este atributo, que es bastante sencillito, y después lo comentamos un poco:
    publicclass AutoloadAttribute : ActionFilterAttribute
    {
    privatereadonly Type _entityType;
    privatereadonly Type _repositoryType;

    publicstring IdParamName { get; set; } = "id"; // Default ID param name

    publicAutoloadAttribute(Type entityType)
    {
    _entityType = entityType;
    _repositoryType = typeof(IRepository<>).MakeGenericType(_entityType);
    }

    publicoverrideasync Task OnActionExecutionAsync(ActionExecutingContext context,
    ActionExecutionDelegate next)
    {
    var entityParam = context.ActionDescriptor.Parameters
    .FirstOrDefault(p => p.ParameterType == _entityType);

    if (entityParam != null) // The action has a parameter of type _entityType
    {
    string idParamValue = await GetIdValueAsync(context);
    if (!int.TryParse(idParamValue, outvar id))
    {
    // No entity ID found
    context.ActionArguments[entityParam.Name] = null;
    }
    else
    {
    // Entity ID found, so let's find it using the repository
    dynamic repo = context.HttpContext.RequestServices.GetService(_repositoryType);
    if (repo == null)
    {
    thrownew Exception(
    $"Instance of {_repositoryType.DisplayName()} not found. "
    + "Did you forgot to add it in ConfigureServices()?"
    );
    }

    var entity = await repo.GetByIdAsync(id);
    if (entity == null) // We didn't found an entity, so return HTTP 404
    {
    context.Result = new NotFoundResult();
    return;
    }
    context.ActionArguments[entityParam.Name] = entity;
    }

    }
    await next();
    }

    // Gets the id from the request using the value providers
    privateasync Task<string> GetIdValueAsync(ActionExecutingContext context)
    {
    // We assume that all controllers inherit from Controller.
    var controller = context.Controller as Controller;
    var compositeValueProvider = await CompositeValueProvider
    .CreateAsync(controller.ControllerContext);
    return compositeValueProvider.GetValue(IdParamName).FirstValue;
    }
    }
    Creo que el código se explica por sí mismo, pero de todas formas aclaro un par de puntos clave de esta implementación:
    • Desde un filtro podemos acceder fácilmente a la descripción de la acción que se está ejecutando a través del objeto ActionDescriptor de su contexto. En este objeto encontraremos información valiosa como la descripción de sus parámetros, que usamos en nuestro código para ver si necesitamos inyectar algún valor.
       
    • Observad que para utilizar el repositorio genérico que obtenemos desde el contenedor de servicios necesitamos utilizar tipos dinámicos. Sé que suena a ñapa, pero en realidad no he encontrado otra forma de hacer un cast a IRepository<T> porque nuestro atributo no utiliza tipos genéricos (de hecho, no se soportan en C#).
       
    • También podemos acceder a los argumentos, es decir, a los valores que van a ser suministrados a la acción. Estos valores se encuentran en el diccionario ActionArguments del contexto del filtro, que es del tipo IDictionary<string, object> y, como vemos en el código, podemos manipularlos a nuestro antojo.
       
    • En el método privado GetIdValueAsync() observaréis que, para capturar desde los datos de la petición el valor del identificador que por convención usaremos para obtener la entidad, utilizamos un CompositeValueProvider, que no es sino un connjunto de value providers, inicializado con la instancia del controlador actual. Por simplificar, hemos asumido que los controladores que usarán nuestro filtro [Autoload] siempre heredarán de Controller, aunque no sería difícil proveer de otras implementaciones que no usen esta convención.
    ¡Y esto es todo!

    Comprobando que todo funciona

    Para probar el sistema sólo necesitaríamos definir el interfaz que usaremos para recuperar datos, por ejemplo así:
    publicinterface IRepository<T>
    {
    Task<T> GetByIdAsync(int id);
    }
    Y obviamente, necesitaríamos también una implementación del repositorio, registrada convenientemente en el sistema de inyección de dependencias de nuestra aplicación:
    // En Startup.cs
    publicvoidConfigureServices(IServiceCollection services)
    {
    services.AddMvc();
    services.AddScoped<IRepository<Friend>, FriendRepository>();
    }
    Hecho esto, ya podemos aplicar el filtro a los controladores que nos interesen, como hemos visto más arriba:
    [Autoload(typeof(Friend))]
    publicclass FriendController : Controller
    {
    publicstringEdit(Friend friend)
    {
    return friend.Name;
    }
    }
    Así, una petición hacia /Friends/Edit/1 mostrará en el navegador el nombre del amigo, siempre que éste exista. En caso contrario, se retornará un error 404.

    Observad además que el filtro puede ser aplicado más de una vez por controlador, por lo que podríamos solucionar escenarios más complejos como el siguiente:
    [Autoload(typeof(Invoice), IdParamName = "invoiceId")]
    [Autoload(typeof(Customer), IdParamName = "customerId")]
    publicclass InvoiceController : Controller
    {
    public IActionResult Add(Invoice invoice, Customer customer)
    {
    // Logic here
    }
    }
    En este caso, una petición hacia /invoice/add?invoiceId=1234&customerId=5678 retornaría un error 404 si alguno de los dos elementos no existe, o bien ejecutaría la acción con ambas instancias precargadas.

    Conclusión

    En este post hemos visto que con unas pocas decenas de líneas podemos ahorrarnos bastante trabajo si jugamos un poco con las herramientas que nos proporciona el framework MVC. En este caso, aprovechamos la potencia de los filtros para liberar a las acciones de realizar tareas muy repetitivas, como la carga automática de argumentos, partiendo de unas convenciones simples.

    Aunque seguro que no es perfecta, la solución mostrada aquí puede ser un buen punto de partida para implementar funcionalidades más avanzadas, por ejemplo, ninguna de las siguientes ideas serían difíciles de implementar:

    • Ampliar el alcance de este filtro y hacer que tenga en cuenta aspectos de seguridad, como comprobar si el usuario actual tiene permiso para acceder a la entidad solicitada.
        
    • Generalizar el filtro para que precargue todos los parámetros que implementen un interfaz o clase base determinada, de forma que no sea necesario introducir el filtro por cada uno de ellos.
       
    • Introducir mecanismos de caching que impidan la carga de elementos que no varían con frecuencia.
       
    • Y, por supuesto, podríamos definir convenciones personalizadas de ASP.NET Core MVC para aplicar automáticamente el filtro a controladores o acciones que cumplan determinados criterios.
    El límite, como siempre, sólo está en nuestra imaginación y en las necesidades que debamos cubrir ;)

    Publicado en Variable Not Found.

    Fixed Buffer: Venciendo el miedo a las pruebas unitarias en .Net

    $
    0
    0

    Test Unitario

    Otro día más por aquí, y hoy vengo a hablaros de las “Pruebas Unitarias”. Las pruebas unitarias son herramientas de testing para asegurar que nuestro código no cambia su funcionalidad pese a que hagamos cambios en él. Es decir, imaginemos que tenemos una librería matemática con unas operaciones simples:

    public static class ProcesadorMatematico
    {
        public static int Sumar(int primerNumero, int segundoNumero)
        {
            return primerNumero + segundoNumero;
        }
        public static int Resta(int primerNumero, int segundoNumero)
        {
            return primerNumero - segundoNumero;
        }
        public static int Multiplicacion(int primerNumero, int segundoNumero)
        {
            return primerNumero * segundoNumero;
        }
        public static int Division(int dividendo, int divisor)
        {
            return dividendo / divisor;
        }
        public static int Potencia(int numeroBase, int exponente)
        {
            return (int)Math.Pow(numeroBase, exponente);
        }
        public static int Raiz(int numeroBase, int exponente)
        {
            return (int)Math.Pow(numeroBase, 1 / exponente);
        }
    }

    Como se puede ver, es una clase muy simple de ver, entender, y probar su funcionamiento pero… ¿Que pasaría si una de estas operaciones básicas fallase por un cambio no comprobado? Pues probablemente, no pensaríamos que algo tan simple puede estar fallando… y eso que podemos haberlo cambiado incluso sin darnos cuenta…

    Para evitar ese tipo de fallos, existen este tipo de herramientas, cuya finalidad es que, ante unos datos de entrada conocidos, si todo va bien, tenemos que tener unos datos de salida que podemos predecir y comprobar.

    Pruebas Unitarias en Net Framework

    Como habitualmente, crearemos un proyecto de consola:

    ProyectoConsolaNetClasico

    Y en el introduciremos la clase ProcesadorMatematico de la que acabamos de hablar. Una vez hecho eso, vamos a crear un nuevo proyecto en la solución, pero esta vez de pruebas unitarias:

    PruebasUnitariasNetClasico

    Con esto, veremos que se nos crea un proyecto nuevo dentro de la solución, con una clase por defecto:

    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
        }
    }

    En ella vemos 2 decoradores, [TestClass] , el cual indica que esa clase va a ejecutar pruebas unitarias, y [TestMethod], el cual indica que ese método es una prueba unitaria. Da igual el nombre de la clase y de los métodos, siempre que tengan los atributos correspondientes.

    Como en cualquier otro proyecto, tenemos que referenciar los proyectos que queremos usar:

    referencia

    Una vez hecho esto, podremos acceder a las clases añadiendo el using correspondiente. Vamos a crear un test para algunas operaciones, así que nos quedara algo como esto:

    using System;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using PostPruebasUnitarias;
    
    namespace PruebasUnitarias
    {
        [TestClass]
        public class PruebasProcesador
        {
            [TestMethod]
            public void TestSuma()
            {
                //Definimos las variables
                //Arrange
                var operador1 = 10;
                var operador2 = 11;
    
                //Ejecutamos la prueba
                //Act
                var result = ProcesadorMatematico.Sumar(operador1, operador2);
    
                //Comparamos resultados
                //Assert
                var valorEsperado = 21;
                Assert.AreEqual(valorEsperado, result);
            }
    
            [TestMethod]
            public void TestDivision1()
            {
                //Definimos las variables
                //Arrange
                var dividendo = 10;
                var divisor = 2;
    
                //Ejecutamos la prueba
                //Act
                var result = ProcesadorMatematico.Division(dividendo, divisor);
    
                //Comparamos resultados
                //Assert
                var valorEsperado = 5;
                Assert.AreEqual(valorEsperado, result);
            }
    
            [TestMethod]
            [ExpectedException(typeof(DivideByZeroException))] //Excepcion esperada
            public void TestDivisionExcepcion()
            {
                //Definimos las variables
                //Arrange
                var dividendo = 10;
                var divisor = 0;
    
                //Ejecutamos la prueba
                //Act
                var result = ProcesadorMatematico.Division(dividendo, divisor);
    
                //Comparamos resultados
                //Assert
                //En este caso, no deberiamos llegar aqui, la prueba correcta es una excepción de DivisionEntreCero
            }
        }
    }

    Para poder comprobar los resultados visualmente, la opción más cómoda es sacar la ventana de pruebas, para ello, vamos al menú Prueba->Ventanas->Explorador de pruebas unitarias. Esto nos añade una ventana al cuadro de herramientas:

    VentanaPruebas

    En ella, pulsaremos ejecutar todo, y veremos que nos muestra los resultados de las pruebas:

    PruebasOK

    Pero… que pasaría si por algún problema no pasa la prueba? Vamos a probarlo cambiando el método “Sumar” por :

    public static int Sumar(int primerNumero, int segundoNumero)
    {
        return primerNumero * segundoNumero;
    }

    Si volvemos a lanzar la prueba:

    PruebaNOK

    Efectivamente, las pruebas unitarias detectan rápidamente que algo no va bien…

    Puedes descargar el código de ejemplo aquí.

    Pruebas Unitarias en Net Core

    Vamos a crear otro proyecto de consola, esta vez de NetCore:

    consola .net core

    Y en el vamos a añadir nuestra clase igual que antes. Una vez hecho, vamos a crear un proyecto de pruebas:

    PruebasUnitariasNetCore

    Y generamos una clase de pruebas como la anterior. Ejecutamos las pruebas exactamente igual que antes, y como podemos ver, los resultados son los mismos. Dejo un enlace al código fuente del proyecto para poder descargarlo.

    Como se puede ver, las pruebas unitarias nos aseguran que nuestros cambios no comprometen el funcionamiento de nuestros programas, dándonos ese extra de tranquilidad al poder añadir pruebas para prácticamente cualquier cosa que se nos ocurra.

    En futuros post, ampliaremos este tema tan versátil utilizando “Mocking” para simular las bases de datos y escribiendo clases “fake” para probar clases diseñadas según el patrón de inyección de dependencias

    **La entrada Venciendo el miedo a las pruebas unitarias en .Net se publicó primero en Fixed Buffer.**


    Blog Bitix: Desempaquetado y análisis de monitor Benq PD2700Q

    $
    0
    0

    La siguiente pieza que he adquirido para completar lo que será mi ordenador personal en casa es el monitor que usaré en mayor medida para tareas ofimáticas, navegar por internet, quizá ver alguna película y en menor medida quizá también algún juego. De entre las opciones que buscaba inicialmente era que fuese IPS por los colores, de 27 pulgadas y con ese tamaño de pantalla con al menos resolución QHD. Hay muchos modelos entre los que elegir y con variaciones de precios notables en aparentemente las mismas características, de 32 pulgadas, ultrapanorámicos, UHD, orientados más a gaming, …

    Benq

    Aún no se está comercializando en España el ordenador que he decidido comprar, un Intel NUC entre las opciones entre portátil, ITX o NUC que evalué hace ya más de seis meses. Espero que no quede mucho hasta que haya disponibilidad en Amazon del Intel NUC8i5BEK Bean Canyon, al menos está listado y en Amazon EEUU ya hay disponibilidad. A pesar de esto ya estoy comprando las otras piezas que en cualquier caso necesito como teclado y ratón inalámbrico, alfombrilla para la mesa y ahora otra pieza más importante, el monitor.

    Ya con unas semanas habiendo usado el teclado y ratón V7 CKW200 acepto que el ratón no sea totalmente fiable y un peligro hacer cosas importantes con él al arrastrar y soltar ya que falla en ocasiones, quizá compre un ratón tradicional con cable si me da muchos problemas. He comprobado que se pueden tener dos ratones conectados simultáneamente, funcionado ambos. El teclado funciona perfectamente y estoy encantado con él, solo por el teclado no los he devuelto. Sin embargo, en el monitor con algún defecto de píxeles muertos o retención de imagen si haría la devolución, por fortuna una vez me ha llegado y lo he comprobado con unas imágenes de prueba para detectar píxeles muertos o vagos no he visto ninguno así que el panel me ha llegado perfecto estado.

    He mirado varias opciones y modelos de monitor y aún así tampoco estoy seguro de que la que finalmente he elegido sea la mejor en el mercado. Leyendo comentarios y opiniones de otros usuarios en todos los modelos siempre hay alguno que ha tenido problemas, en el caso de los monitores de píxeles muertos, vagos, fugas de luz, hasta retención de imágenes. Las fugas de luz es algo normal en la tecnología actual de monitores y televisores con retroiluminación led en los bordes de la pantalla, apreciable en condiciones de poca luz e imágenes oscuras.

    Opciones

    Partía de unos requerimientos de que fuera IPS por su calidad de colores, de 27 pulgadas y con resolución 2K o 2560x1440 en un rango de precio de hasta unos 300€. En otro orden de cosas menos importantes que valoraba era que tuviese conexión HDMI y DisplayPort, marcos finos y compatibilidad con soporte VESA. Hay opciones en formato ultrapanorámico de 29 pulgadas y resolución 2560x1080. He visto alguno de estos pero finalmente he preferido que tenga más resolución vertical y no sea tan ancho para no tener que girar la cabeza.

    Con estos requerimientos iniciales me quedé con unos pocos candidatos. Básicamente monitores 2K en formato de 27 pulgadas e IPS muy similares en cuanto a características, son IPS de resolución QHD 2560x1440, tienen entrada HDMI 1.4 y DisplayPort 1.2, soporte VESA 100x100, con algunas pequeñas diferencias en cuanto a especificaciones. El Benq PD2500Q es de 25 pulgadas, panel de 8 bits y tiene sensor para adaptar automáticamente el brillo a la luz ambiental, posee un hub USB 3.1 de cuatro puertos, el Benq PD2700Q posee un hub USB 2.0 de dos puertos y un panel de 10 bits. Los dos modelos de Benq son muy parecidos sino iguales en cuanto al panel de monitor, varía en cuanto al marco que en el caso del GW s brillante y en el PD mate, también cambian las conexiones que tienen el GW tiene D-Sub, DVI-DL (Dual Link), DisplayPort, HDMI y el PD DisplayPort, mini DisplayPort y HDMI. Ambos soportan 100% Rec.709 y sRGB, sin parpadeos, son regulables en altura, gira, inclinación y pivotable para ponerlo en modo vertical. Tienen un precio similar.

    De las opciones con las que me quedé todos con panel de 10 bits (u 8 + 2, salvo el PD2500Q que es de 8), función de no parpadeo, filtro de luz azul y altavoces sencillos. El PD2700Q es un modelo más antiguo, los PD2500Q y PD2700U son más modernos y se notan en los biseles más reducidos y el hub con una versión mayor de USB.

    Tanto el Viewsonic VG2719-2K como el V7 L27HAS2K-2E tienen un precio más económico pero en cuanto a especificaciones técnicas no eran malas. Sin embargo, de estos modelos no hay mucha información ni de análisis en páginas web, desempaquetados en Youtube, ni opiniones en Amazon. Del V7 hay dos opiniones en Amazon alemania y ambas no son buenas y coinciden en que el texto y la imagen se ve borrosa. La falta de información me ha hecho tener reticencias con estos modelos.

    El Viewsonic es un modelo del 2015 con dos HDMI 1.3 y DisplayPort 1.2. El Benq PD2700Q es un modelo del año 2016, tiene HDMI 1.4 y DisplayPort 1.2, no es muy relevante ya que de HDMI 1.3 a 1.4 varía la resolución soportada pero en estos monitores en ambos casos es suficiente cualquiera de ellas en esta resolución y a 60 Hz. El Viewsonic es una opción algo menor pero considerando su precio y el del Benq hubiese sido otra buena elección. El Viewsonic en contra tiene la falta de información aún habiendo un comentario positivo en Amazon.

    Los otros candidatos destacables que he visto han sido alguno en formato panorámico.

    Los monitores UHD para un tamaño de 27 pulgadas a máxima resolución el texto y elementos gráficos se ven muy pequeños con lo que para uso ofimático hay que escalar a una más pequeña. Hay en un rango de precios muy amplio, desde 200€ a 700+€. Dos modelos en 4K de los anteriores son el Benq PD2700U, el LG 27UK600-W o el LG 27UK650-W, nótese la U en estos modelos. Estos monitores aún siendo UDH no llegan a los 192 dpi, se quedan en 163, para considerarse HiDPI ni tiene una pantalla retina.

    En monitores de 27 pulgadas la recomendación en varios foros es de 2K. Menos con 1K o full hd es ver píxeles como centollos, más es ver las cosas muy pequeñas a máxima resolución para tareas ofimáticas y hay que escalar a una resolución más baja aunque tenga mayor definición. Estos son unos hilos en foros y dos artículos que me han parecido interesantes y que me han resuelto alguna duda o confirmado lo que ya suponía.

    En PcComponentes los precios no varían tanto pero en Amazon en algunos productos si hay notables diferencias entre pocos días o alguna semana, sobre todo en productos de tecnología. Para conocer si el precio actual de un producto es alto, bajo o está bajando la página CamelCamelCamel permite introduciendo la URL del producto de Amazon mostrar una gráfica con la evolución del precio.

    Evolución del precio del monitor Benq PD2700Q

    Benq PD2700Q

    Teniendo en cuenta todo finalmente me he decidido por el Benq PD2700Q. Tiene buena conectividad, sin conexiones obsoletas como en el caso del Benq GW. Es un monitor orientado a diseñadores aunque mi uso es principalmente en tareas ofimáticas y posiblemente algún juego ocasional. Los monitores ultra anchos no los he usado pero se me hacen demasiado anchos obligando a mover la cabeza para cubrir su área de visualización. Ya con 27” el monitor se me hace grande aunque me acostumbraré a este tamaño pasado un tiempo, para la gente que aún quiere un monitor más grande los hay de 32” aunque en estos ya hay que ir a una resolución de UHD 3840x2160.

    Sus especificaciones más destacables son:

    • Tamaño de la pantalla, 27
    • Tipo de panel, IPS
    • Brillo, 350 cd/㎡
    • Colores de la pantalla, 1.07 billion colors
    • Área de la pantalla (mm), 596.74(H) x 335.66(V)
    • Distancia entre píxeles (mm), 0.2331 y PPP, 108.79
    • Profundidad de color, 10bits
    • HDMI, HDMI (v1.4) x 1
    • DisplayPort, DisplayPort (v1.2) x 1
    • Mini DisplayPort, Mini DisplayPort (ver1.2) x 1
    • Concentrador USB 2.0, upstream x 1 y downstream x 2
    • Fuente de alimentación, built-in
    • Dimensiones (altura × anchura × profundidad, mm) (sin base), 379.5 x 641.0 x 56.5. Con base (posición alta): 547.3 x 641.0 x 239.6. Con base (posición baja): 417.3 x 641.0 x 239.6

    Con 27 pulgadas y una resolución de 2560x1440 su área de visualización, DPI y PPI son:

    • Display size (27”): 23.53” × 13.24” = 311.5in² (59.77cm × 33.62cm = 2009.68cm²) at 108.79 PPI, 0.2335mm dot pitch, 11834 PPI²

    Comprando con un monitor de 23 pulgadas y una resolución de 1920x1080 y con un monitor de 3840x2160 en 27 pulgadas estos números son:

    • Display size (23”, Full HD): 20.05” × 11.28” = 226.04in² (50.92cm × 28.64cm = 1458.33cm²) at 95.78 PPI, 0.2652mm dot pitch, 9174 PPI²
    • Display size (27”, UHD): 23.53” × 13.24” = 311.5in² (59.77cm × 33.62cm = 2009.68cm²) at 163.18 PPI, 0.1557mm dot pitch, 26627 PPI²

    Por 2K en monitor me refiero a QHD (quad hd), que es 4 veces la resolución HD (1280x720), dos en alto y dos en ancho. Lo mismo ocurre con los monitores 4K que en realidad la denominación más acertada es UHD (ultra hd) y son tres veces la resolución HD en cada medida, 3840x2160.

    En YouTube hay unos cuantos vídeos analizando este mismo monitor u otros parecidos que me han servidor para aclarar dudas.

    Desempaquetado

    El monitor está perfectamente embalado en una caja impresa con las principales características del monitor, dentro lleva sus respectivos protectores e incluye los siguientes elementos. Que incluya una cable DisplayPort, HDMI y USB es de agradecer para no tener que comprarlos aparte y poder usar el monitor desde el primer momento.

    • Monitor PD2700Q.
    • Guía de inicio y CD con software.
    • Cable de alimentación.
    • Cable HDMI.
    • Cable Mini DisplayPort a DisplayPort.
    • Cable USB para conectar al monitor y ordenador.
    • Gancho para colgar cascos en la parte trasera.
    Desempaquetado
    Contenido de la caja

    El monitor posee unos biseles bastante amplios de 2 cm sin embargo al ser el marco negro con acabado mate no distraen mucho ni son molestos estéticamente. Aún así la tendencia es que estos biseles sean reducidos pero este modelo de monitor ya tiene algunos años.

    Pantalla
    Pantalla parte trasera

    Este modelo de monitor incluye dos puertos USB 2.0 en la parte trasera, tiene utilidad en un ordenador de escritorio que esté debajo de la mesa para tener unos puertos USB más cerca del escritorio con un concentrador USB.

    Conexiones

    Los botones para ajustar los parámetros del monitor y OSD están detrás del monitor y el piloto indicador de encendido en un lateral de modo que en un ambiente de luz oscuro no molesta.

    Configuración en pantalla (OSD)

    Habitualmente estoy trabajando con un portátil MacBook Pro con pantalla retina y anteriormente he usado un Sony VAIO E 14P con panel TN de resolución 1600x900 y un monitor LG 2351 también TN de resolución 1920x1080. Con respecto a los dos paneles TN que he usado hasta el momento la mejora es apreciable en sus ángulos de visión, colores más intensos, este es el motivo de requerir un panel tipo IPS. Si tengo que destacar algo del MacBook es la pantalla, la pantalla del Benq cumple pero al no ser retina la diferencia es clara, aún conservando buena vista la definición del texto no es mala pero no llega a la calidad de la pantalla del MacBook, eso si en cuanto a colores no tiene nada que envidiar a la pantalla del Mac.

    Análisis

    Después de un tiempo de uso ya veré como son las impresiones, las primeras impresiones son buenas aunque viniendo de una pantalla retina no tanto. Si el texto resultase demasiado pequeño según las preferencias el MacBook permite reducir la resolución a 2048x1152, 1600x900, 1080p o 720p. Si se desea un monitor UHD que tenga HDMI 2.0 a 60 Hz y en esa resolución casi pensando en las 32”. Con el monitor externo no tengo que tener la pantalla tan cerca ni tener la cabeza agachada como con el portátil con lo que la postura corporal y de espalda es mejor para evitar cansancios y dolores que con el uso continuado pueden surgir, la verdad es que lo he notado ya desde el primer momento. Otra cosa que me gusta es que su fuente de alimentación está integrada con lo que no hay un transformador encima de la mesa y sus respectivos cables.

    Con la resolución de 2560x1440 se puede visualizar más información al mismo tiempo y es más cómodo trabajar en una misma aplicación a pantalla completa o poder ver dos aplicaciones en primer plano. Se nota y mucho el espacio extra en la pantalla al trabajar con varias de las aplicaciones que uso habitualmente como editor de textos, navegador web y terminal.

    La primera impresión es que un monitor de 27” es grande pero ya me han comentado que es cuestión de acostumbrase y que dentro de poco me parecerá lo normal o incluso pequeño, de hecho ya hay monitores de 32” para esa gente que aún lo quiere más grande. A la espera del Intel NUC tendré monitor que me parece grande pero un equipo que cabe en la palma de la mano. Comparado con la pantalla retina del MacBook las cosas no se ven tan definidas, un monitor de 27” con pantalla retina no he visto salvo los Mac. Con 27” en UHD tampoco se considera HiDPI y se queda en 163 dpi contra los 226 del Mac. Para que un monitor de 27” tenga similar definición que con una pantalla retina la resolución debería ser del doble, 5120x2880, con esto alcanzaría unos 216 dpi y ya se consideraría HiDPI aunque habría que escalar la resolución en la configuración del ordenador ya que en la resolución nativa el texto se vería muy pequeño.

    Imagen en la pantalla

    Este monitor tiene los botones de ajustes detrás del monitor marcados con unos indicadores en el frontal para encontrar su posición, en algún sitio se comenta que esto es algo incómodo para acertar a pulsar el botón adecuado. En lo que probado no me ha resultado nada incómodo y los botones me han parecido perfectos. Dado que el monitor tiene altavoces se le puede enviar sonido por el mismo cable HDMI que envía la señal de vídeo y luego con un jack de 3.5mm desde el monitor enviarlo a unos altavoces que den mejor calidad de sonido, esto me permite conectar un cable menos al ordenador y que la mesa no quede cubierta de cables. Aunque con esta opción al menos un Mac no permite ajustar el volumen hay que hacerlo desde los altavoces, por fortuna tengo unos altavoces con regulador de volumen.

    Las fugas de luz o bleeding es otro de los posibles problemas de un monitor, por la tecnología de retoiluminación led hace que en condiciones oscuras los negros aparezcan como grises y que en los bordes de la pantalla se noten zonas un poco iluminadas al no bloquearse por completo la retoiluminación. Ya era consciente de este problema y no me sorprende que el que me ha llegado a mi tenga, no se si será mucho o poco porque no puedo comparar pero no me ha parecido excesivo. Sin píxeles muertos o vagos sin mucha fuga de luz me doy por contento. Por el momento tampoco he notado retención de imagen.

    Bleeding en ambiente oscuro

    En un futuro probablemente aparezcan nuevos monitores que soporten HDR y con resolución retina que supondrá otro salto en la calidad de la imagen. Me va a quedar la duda de si un monitor con resolución UHD de 27 pulgadas bajando la resolución sería una buena opción en cuanto a definición de texto, se suele comentar que no, usar una resolución escalada del panel no es lo mismo que en la resolución nativa pero me gustaría experimentarlo, en este Benq de 27” bajando la resolución no aprecio que el texto se vea mucho peor.

    Detección de píxeles muertos o vagos

    Es recomendable realizar una primera prueba al monitor para buscar píxeles muertos, que no se encienden, o vagos, que permanecen encendidos todo el tiempo con el color de un componente. El siguiente test se compone de varias imágenes en los colores básicos (negro, blanco, azul, rojo y verde) que visualizadas individualmente a pantalla completa muestran si algún pixel es defectuoso. Que haya un pixel defectuoso es molesto ya que basta para que haya solo uno y sepas donde está entre los casi 3 millones que tiene el monitor para que estés fijándote constantemente en él, más si se encuentra en el área central de la pantalla.

    Soporte VESA

    En todos los modelos he buscado que sea compatible con la norma VESA 100x100 por si en un futuro lo pongo en uno soporte de modo que el pie no ocupe sitio en la mesa. La peana de algunos monitores no soportan ajustes en altura, inclinación, ajuste laterales o modo vertical pero con un soporte compatible con VESA se puede suplir la carencia además de evitar que la peana ocupe espacio. Con un soporte tienen la ventaja de que se puede ajustar la posición del monitor muy fácilmente. Estos soportes funcionan con una mordaza para anclarlos a la mesa.

    Algunos soportes compatibles con VESA que he mirado son los siguientes.

    Hub de puertos USB

    Teniendo el monitor un hub USB 2.0 no merece la pena un hub externo USB 3.0 o 3.1, sin embargo, con otros monitores puede ser una opción como con el PD2500Q o el PD2700U. Los discos duros externos que tengo son USB 2.0 y por limitaciones del disco duro si fuesen 3.0 el rendimiento adicional no se si sería mucho mayor. Hay hubs de 4, 7 y 10 puertos pero con esta candidad de puertos es recomendable que sea alimentado sobre todo si se conectan discos duros externos sin alimentación propia, también hay algunos con interruptor individual de encendido por puerto.

    Blog Bitix: Ejemplo sencillo de cómo leer datos de un archivo Excel o CSV en Java

    $
    0
    0
    Java

    Los formatos de archivo de columnas separadas por comas o CSV y los documentos en formato de hojas de cálculo excel del paquete ofimático Microsoft Office son muy utilizados como formato de archivo para intercambiar datos entre aplicaciones o simplemente como contenedores de datos. Para leer los datos en estos formatos de archivos en Java hay que emplear alguna librería que facilite y entienda estos formatos de los archivos. Para leer los archivos CSV está la librería OpenCSV y para los archivos excel está la librería Apache POI.

    Con Apache POI para acceder al archivo excel hay que usar unas pocas clases de su API como HSSFWorkbook, HSSFSheet, HSSFRow, HSSFCell y utilizar el método adecuado según el tipo de datos a obtener.

    Para el caso de los CSV hay que utilizar la clase CSVReader que permite iterar sobre las líneas del archivo teniendo en cuenta el caracter separador de las columnas y las comillas de los datos. Para acceder a los valores de cada una de las columnas hay que convertir al tipo de datos deseado ya que siempre se devuelve un String.

    En ambos casos la salida en la consola al leer los datos de los documentos es la misma.

    Las dependencias a incluir en el proyecto son las siguientes.

    También se puede utilizar Apache POI para crear hojas excel y OpenCSV para crear archivos CSV con las columnas correctamente separadas por comas.

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

    Blog Bitix: IBM adquiere RedHat, el gigante de Linux y código abierto

    $
    0
    0
    RedHat
    IBM

    Hace unos pocos días recordaba una de las adquisiciones más relevantes entre empresas de software y de tecnología, la adquisición de Sun Microsystems por parte de Oracle en enero del 2010. En este octubre del 2018 acaba de anunciarse la adquisición de RedHat por parte de IBM.

    La adquisición de Sun Microsystems por parte de Oracle fue relevante por el conjunto de productos que poseía Sun entre ellos el lenguaje de programación más usado, Java, pero también MySQL, competencia directa de la base de datos Oracle, el paquete ofimático OpenOffice que originaría LibreOffice, el software de virtualización VirtualBox, Solaris y otras tecnologías relevantes como ZFS y DTrace. Por su parte la adquisición de RedHat por parte de IBM también es relevante por el conjunto de productos de RedHat que ha desarrollado, adquirido o contribuido como su sistema operativo basado en GNU/Linux denominado RedHat Enterprise Linux (RHEL) pero también las variantes comunitarias del proyecto Fedora o la versión equivalente comunitaria CentOS basada en RHEL. Pero también por otros productos como el servidor de aplicaciones JBoss y Wildfly, la herramienta de automatización Ansible adquirida no hace mucho, OpenShift como plataforma de computación en la nube basada en contenedores, la versión de RedHat de OpenStack para disponer de una infraestructura para la computación en la nube, Gluster y Ceph para el almacenamiento, CoreOS a añadir a sus soluciones para contenedores entre otros de sus productos.

    Entre las empresas Sun Microsystems y RedHat hay algún punto en común como que las dos han tenido en especial consideración las tecnologías de código abierto y el software libre, son dos de las empresas que más han contribuido al desarrollo del software libre. Sun dotando a Java de una licencia de software libre com GPL en el año 2006 junto con los otros proyectos que fue adquiriendo y RedHat con sus contribuciones al núcleo de Linux y otros proyectos como el entorno de escritorio GNOME, NetworkManager, los controladores gráficos, el servidor gráfico de nueva generación Wayland que sustituirá a X.Org Server o Flatpak como nueva forma de distribuir software para todas las distribuciones GNU/Linux directamente por los desarrolladores de los programas, el software de virtualización KVM o el sistema de inicio systemd.

    Sin embargo, también hay diferencias en la adquisición de Sun y RedHat. Una de ellas significativa es que Sun no pasaba por buenos momentos cuando fue adquirida por Oracle aún con las importantes tecnologías que poseía incapaz de tener un modelo de negocio rentable sobre el que basarse para pedurar. Oracle se deshizo de los que no le eran provechosos y muchas personas abandonaron Sun/Oracle. En cambio RedHat si posee un modelo de negocio rentable basado en el código abierto y software libre con una facturación de 2000 millones. Sun fue adquirida por 7400 millones de dólares lo que en su momento parecía una gran cantidad de dinero y ahora parece que fue muy barato, RedHat ha sido adquirida por 34000 millones, una enorme diferencia entre ambas operaciones aún habiendo pasado casi una década.

    Anuncio en la página de RedHat

    Conocida la operación en la página de RedHat se publican varias notas de prensa.

    A razón de estas notas de prensa después de haberlas leído el motivo principal por el que IBM adquiere RedHat es para convertirse en el proveedor número uno de computación en la nube híbrida y el motivo por el que RedHat acepta la operación es porque estando dentro de una compañía del tamaño y recursos disponibles de IBM puede acelerar el crecimiento y proporcionar a una mayor audiencia innovación basándose en el código abierto a una escala mucho mayor conservando su cultura única y compromiso decidido con el código abierto, muchos años antes de lo que les costaría hacerlo solos. RedHat en el 2008 eran 2200 empleados en el 2018 son 12600, IBM tiene 300000 empleados. IBM se mantiene comprometida con el gobierno abierto de RedHat, las contribuciones al código abierto, la participación en la comunidad de código abierto y modelo de desarrollo. RedHat seguirá siendo RedHat como una unidad distinta dentro de IBM, mantiene su misión comprometida con el código abierto y valores de colaboración, transparencia, participación y meritocracia, incluso esperando que estos valores se transladen a IBM.

    RedHat se fundó en 1993 liberando en 1994 la primera versión de Red Hat Linux, en el 2001 vendía en comercios por $29.95 cajas con el sistema operativo entre entusiastas o descargable gratuitamente de sitios FTP. Pero con solo entusiastas del código abierto no haría de RedHat (o Linux) un jugador en el software empresarial. En el año 2002 se hace la apuesta por separar los productos comerciales de su inversión continuada en construir proyectos de código abierto. Se deja de lado la descarga gratuita y las cajas con Red Hat Linux siendo reemplazadas con un modelo de suscripción empresarial, reteniendo los principios del código abierto de libertad a la vez que creando un modelo de negocio sostenible a largo plazo, publicándolo como Red Hat Enterprise Linux. El punto importante es que encontró un modelo de negocio exitoso para Linux y el código abierto continuando invirtiendo e innovando en la comunidad con proyectos como Fedora, siendo aún a día de hoy su modelo pero mucho más expandido. Desde el día que presentaron RHEL su misión ha sido llevar el código abierto a la empresa. Lo hicieron para Lixux, para Java EE, para OpenStack y lo están haciendo para Ansible, Kubernetes y más proyectos de código abierto.

    IBM es una compañía mucho más grande que RedHat y tiene importantes valores como los servidores mainframe IBM Z, los procesadores POWER, además de su propia nube, software de analítica, internet de las cosas y soluciones para varios sectores de la industria y gubernamentales. El proyecto Eclipse surgió de IBM y ha estado ampliamente relacionada con Java con los servidores WebSphere u OpenLiberty. Ambas son dos de las empresas que más contribuyen al kernel de Linux.

    En la nube hay negocio con varios actores importantes Amazon Web Services, Microsoft Azure, Google Cloud, Oracle Cloud uniéndose ahora IBM y RedHat entre otros varios actores más pequeños. En este auge de la nube y que seguirá creciendo todos quieren estar presentes, sin embargo, con la cantidad de ellos que quizá con el paso del tiempo solo haya dos o tres exitosos muy grandes que concentren la mayor parte del mercado. O quizá surja una nueva tecnología disruptiva que cambie de nuevo las reglas de juego. IBM que parecía pasar más desapercibida en los últimos tiempos con la adquisición de RedHat toma una nueva relevancia que puede ser beneficiosa para ella y RedHat si son capaces de aprovechar esta oportunidad. IBM realiza nueva inversión en el código abierto que se suma a las ya anteriores de 1000 millones en Linux.

    Al mismo tiempo se abre un periodo de incertidumbre considerando precedentes similares anteriores como el comentado de Sun pero también de oportunidades. Si no es exitoso Canonical y Ubuntu o SUSE pueden ser beneficiados pasando a ocupar el espacio que ahora ocupa RedHat. Está por ver si IBM abraza los valores por los que RedHat ha sido exitoso, de momento parece que va a mantener a RedHat como una unidad distinta dentro de IBM.

    ¿IBM se convertirá en el gigante rojo o RedHat se convertirá en BlueHat?.

    Variable not found: Enlaces interesantes 335

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

    Por si te lo perdiste...

    .NET / .NET Core

    ASP.NET / ASP.NET Core

    Azure / Cloud

    Conceptos / Patrones / Buenas prácticas

    Data

    HTML / CSS / Javascript

    Visual Studio / Complementos / Herramientas

    Xamarin

    Otros

    Publicado en Variable not found.

    Blog Bitix: IBM adquiere Red Hat, el gigante de Linux y código abierto

    $
    0
    0
    Red Hat
    IBM

    Hace unos pocos días recordaba una de las adquisiciones más relevantes entre empresas de software y de tecnología, la adquisición de Sun Microsystems por parte de Oracle en enero del 2010. En este octubre del 2018 acaba de anunciarse la adquisición de Red Hat por parte de IBM.

    La adquisición de Sun Microsystems por parte de Oracle fue relevante por el conjunto de productos que poseía Sun entre ellos el lenguaje de programación más usado, Java, pero también MySQL, competencia directa de la base de datos Oracle, el paquete ofimático OpenOffice que originaría LibreOffice, el software de virtualización VirtualBox, Solaris y otras tecnologías relevantes como ZFS y DTrace. Por su parte la adquisición de Red Hat por parte de IBM también es relevante por el conjunto de productos de Red Hat que ha desarrollado, adquirido o contribuido como su sistema operativo basado en GNU/Linux denominado Red Hat Enterprise Linux (RHEL) pero también las variantes comunitarias del proyecto Fedora o la versión equivalente comunitaria CentOS basada en RHEL. Pero también por otros productos como el servidor de aplicaciones JBoss y Wildfly, la herramienta de automatización Ansible adquirida no hace mucho, OpenShift como plataforma de computación en la nube basada en contenedores, la versión de Red Hat de OpenStack para disponer de una infraestructura para la computación en la nube, Gluster y Ceph para el almacenamiento, CoreOS a añadir a sus soluciones para contenedores entre otros de sus productos.

    Entre las empresas Sun Microsystems y Red Hat hay algún punto en común como que las dos han tenido en especial consideración las tecnologías de código abierto y el software libre, son dos de las empresas que más han contribuido al desarrollo del software libre. Sun dotando a Java de una licencia de software libre como GPL en el año 2006 junto con los otros proyectos que fue adquiriendo y Red Hat con sus contribuciones al núcleo de Linux y otros proyectos como el entorno de escritorio GNOME, NetworkManager, los controladores gráficos, el servidor gráfico de nueva generación Wayland que sustituirá a X.Org Server o Flatpak como nueva forma de distribuir software para todas las distribuciones GNU/Linux directamente por los desarrolladores de los programas, el software de virtualización KVM o el sistema de inicio systemd.

    Sin embargo, también hay diferencias en la adquisición de Sun y Red Hat. Una de ellas significativa es que Sun no pasaba por buenos momentos cuando fue adquirida por Oracle aún con las importantes tecnologías que poseía incapaz de tener un modelo de negocio rentable sobre el que basarse para pedurar. Oracle se deshizo de los que no le eran provechosos y muchas personas abandonaron Sun/Oracle. En cambio Red Hat si posee un modelo de negocio rentable basado en el código abierto y software libre con una facturación de 2000 millones. Sun fue adquirida por 7400 millones de dólares lo que en su momento parecía una gran cantidad de dinero y ahora parece que fue muy barato, Red Hat ha sido adquirida por 34000 millones, una enorme diferencia entre ambas operaciones aún habiendo pasado casi una década.

    Anuncio en la página de Red Hat

    Conocida la operación en la página de Red Hat se publican varias notas de prensa.

    A razón de estas notas de prensa después de haberlas leído el motivo principal por el que IBM adquiere Red Hat es para convertirse en el proveedor número uno de computación en la nube híbrida y el motivo por el que Red Hat acepta la operación es porque estando dentro de una compañía del tamaño y recursos disponibles de IBM puede acelerar el crecimiento y proporcionar a una mayor audiencia innovación basándose en el código abierto a una escala mucho mayor conservando su cultura única y compromiso decidido con el código abierto, muchos años antes de lo que les costaría hacerlo solos. Red Hat en el 2008 eran 2200 empleados en el 2018 son 12600, IBM tiene 300000 empleados. IBM se mantiene comprometida con el gobierno abierto de Red Hat, las contribuciones al código abierto, la participación en la comunidad de código abierto y modelo de desarrollo. Red Hat seguirá siendo Red Hat como una unidad distinta dentro de IBM, mantiene su misión comprometida con el código abierto y valores de colaboración, transparencia, participación y meritocracia, incluso esperando que estos valores se transladen a IBM.

    Red Hat se fundó en 1993 liberando en 1994 la primera versión de Red Hat Linux, en el 2001 vendía en comercios por $29.95 cajas con el sistema operativo entre entusiastas o descargable gratuitamente de sitios FTP. Pero con solo entusiastas del código abierto no haría de Red Hat (o Linux) un jugador en el software empresarial. En el año 2002 se hace la apuesta por separar los productos comerciales de su inversión continuada en construir proyectos de código abierto. Se deja de lado la descarga gratuita y las cajas con Red Hat Linux siendo reemplazadas con un modelo de suscripción empresarial, reteniendo los principios del código abierto de libertad a la vez que creando un modelo de negocio sostenible a largo plazo, publicándolo como Red Hat Enterprise Linux. El punto importante es que encontró un modelo de negocio exitoso para Linux y el código abierto continuando invirtiendo e innovando en la comunidad con proyectos como Fedora, siendo aún a día de hoy su modelo pero mucho más expandido. Desde el día que presentaron RHEL su misión ha sido llevar el código abierto a la empresa. Lo hicieron para Lixux, para Java EE, para OpenStack y lo están haciendo para Ansible, Kubernetes y más proyectos de código abierto.

    IBM es una compañía mucho más grande que Red Hat y tiene importantes valores como los servidores mainframe IBM Z, los procesadores POWER, además de su propia nube, software de analítica, internet de las cosas y soluciones para varios sectores de la industria y gubernamentales. El proyecto Eclipse surgió de IBM y ha estado ampliamente relacionada con Java con los servidores WebSphere u OpenLiberty. Ambas son dos de las empresas que más contribuyen al kernel de Linux.

    En la nube hay negocio con varios actores importantes Amazon Web Services, Microsoft Azure, Google Cloud, Oracle Cloud uniéndose ahora IBM y Red Hat entre otros varios actores más pequeños. En este auge de la nube y que seguirá creciendo todos quieren estar presentes, sin embargo, con la cantidad de ellos que quizá con el paso del tiempo solo haya dos o tres exitosos muy grandes que concentren la mayor parte del mercado. O quizá surja una nueva tecnología disruptiva que cambie de nuevo las reglas de juego. IBM que parecía pasar más desapercibida en los últimos tiempos con la adquisición de Red Hat toma una nueva relevancia que puede ser beneficiosa para ambas si son capaces de aprovechar esta oportunidad. IBM realiza nueva inversión en el código abierto que se suma a las ya anteriores de 1000 millones en Linux.

    Al mismo tiempo se abre un periodo de incertidumbre considerando precedentes similares anteriores como el comentado de Sun pero también de oportunidades. Si no es exitoso Canonical y Ubuntu o SUSE pueden ser beneficiados pasando a ocupar el espacio que ahora ocupa Red Hat. Está por ver si IBM abraza los valores por los que Red Hat ha sido exitoso, de momento parece que va a mantener a Red Hat como una unidad distinta dentro de IBM.

    ¿IBM se convertirá en el gigante rojo o Red Hat se convertirá en Blue Hat?.

    Viewing all 2730 articles
    Browse latest View live