<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: campusMVP</title>
    <description>The latest articles on DEV Community by campusMVP (@campusmvp_es).</description>
    <link>https://dev.to/campusmvp_es</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F130989%2Fd629e476-dea8-48cf-9d39-51a2891c812e.jpg</url>
      <title>DEV Community: campusMVP</title>
      <link>https://dev.to/campusmvp_es</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/campusmvp_es"/>
    <language>en</language>
    <item>
      <title>Java: Introducción a los tipos genéricos (vídeo)</title>
      <dc:creator>campusMVP</dc:creator>
      <pubDate>Fri, 02 Oct 2020 07:51:20 +0000</pubDate>
      <link>https://dev.to/campusmvp_es/java-introduccion-a-los-tipos-genericos-video-4i86</link>
      <guid>https://dev.to/campusmvp_es/java-introduccion-a-los-tipos-genericos-video-4i86</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Nota: este post pertenece &lt;a href="https://www.campusmvp.es/recursos/post/java-introduccion-a-los-tipos-genericos.aspx"&gt;al blog de campusMVP&lt;/a&gt;. Puedes ver vídeos como el que se utiliza en este contenido &lt;a href="https://www.youtube.com/user/campusMVPes"&gt;en nuestro canal de YouTube&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Además del polimorfismo, una característica que permite a la plataforma Java tratar homogéneamente objetos heterogéneos, de los que habitualmente no se conoce su tipo concreto, el lenguaje Java cuenta con otro mecanismo con el mismo fin: &lt;strong&gt;los tipos genéricos&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Al definir una clase genérica, o bien una interfaz, en realidad estamos definiendo un meta-tipo, &lt;strong&gt;una especie de plantilla a partir de la cual se crearán posteriormente clases/interfaces que actuarán como tipos concretos&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;El objetivo principal de los tipos genéricos es evitar que tengamos que utilizar la clase &lt;code&gt;Object&lt;/code&gt; como tipo para ciertos atributos, parámetros o valores de retorno, como se hacía tradicionalmente en las primeras versiones de Java, al ser &lt;code&gt;Object&lt;/code&gt; el ascendiente común de todos los tipos por referencia y, por tanto, un mínimo común denominador. &lt;/p&gt;

&lt;p&gt;Los tipos genéricos de Java son similares, en cuanto a funcionalidad se refiere, a las plantillas de C++ y lenguajes similares. El objetivo es definir una clase, una interfaz o un método cuyos tipos de datos son parametrizables. Los tipos genéricos están estrechamente vinculados a las estructuras de datos clásicas como pueden ser las colas y las listas, etc.&lt;/p&gt;

&lt;p&gt;En lugar de definir una clase "Pila" para trabajar con números enteros, otra para trabajar con números en punto flotante, una tercera para trabajar con cadenas y así sucesivamente, es mucho más sencillo definir una clase que sea capaz de tratar con datos de diferentes tipos. En Java esto inicialmente implicaba utilizar el tipo &lt;code&gt;Object&lt;/code&gt;, pero esto conlleva una serie de problemas.&lt;/p&gt;

&lt;p&gt;Al definir los atributos de una clase como &lt;code&gt;Object&lt;/code&gt; es necesario realizar posteriormente conversiones a los tipos concretos que el usuario desea utilizar. Asimismo, es un peligro, puesto que sería potencialmente posible introducir datos de diferentes tipos dentro de esa estructura de datos.&lt;/p&gt;

&lt;p&gt;Con los tipos genéricos estos inconvenientes se evitan, puesto que el tipo concreto de dato con el que va a trabajar es un parámetro de entrada más.&lt;/p&gt;

&lt;p&gt;En el siguiente vídeo vamos a conocer la utilidad de los tipos genéricos de Java definiendo una clase de tipo genérico y viendo cómo podemos utilizarla con diferentes tipos concretos. Nuestro tutor &lt;strong&gt;Francisco Charte&lt;/strong&gt;  te ayuda a conocer los &lt;strong&gt;aspectos esenciales sobre la definición de clases/interfaces con tipos genéricos&lt;/strong&gt; , así como la posterior instanciación de tipos concretos. También comprobarás la utilidad de esta funcionalidad de Java:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/SQSPIb8zvdA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;En resumen, &lt;strong&gt;lo que nos permiten los tipos genéricos es facilitar una sola definición de una funcionalidad que posteriormente se aplicaría a diferentes tipos concretos, lo cual en definitiva nos ahorra mucho trabajo de codificación&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>java</category>
      <category>spanish</category>
      <category>video</category>
    </item>
    <item>
      <title>Cómo crear textos generados por Inteligencia Artificial/Machine Learning y engañar hasta a Hacker News</title>
      <dc:creator>campusMVP</dc:creator>
      <pubDate>Fri, 02 Oct 2020 07:00:00 +0000</pubDate>
      <link>https://dev.to/campusmvp_es/como-crear-textos-generados-por-inteligencia-artificial-machine-learning-y-enganar-hasta-a-hacker-news-4bh5</link>
      <guid>https://dev.to/campusmvp_es/como-crear-textos-generados-por-inteligencia-artificial-machine-learning-y-enganar-hasta-a-hacker-news-4bh5</guid>
      <description>&lt;p&gt;A estas alturas sería muy raro que no hubieses oído hablar aún de GPT-3, el &lt;strong&gt;modelo de lenguaje natural&lt;/strong&gt; creado por OpenAI que es capaz de crear de la nada sus propios artículos, opiniones editoriales, poemas y, sí, &lt;strong&gt;también código&lt;/strong&gt;. Y aunque hay ejemplos de esto último muy alucinantes como &lt;a href="https://twitter.com/sharifshameem/status/1282676454690451457"&gt;este&lt;/a&gt; o &lt;a href="https://twitter.com/pavtalk/status/1285410751092416513"&gt;este otro con Excel&lt;/a&gt; y hay quien vaticina que acabará con los programadores, seguro que el que lo dijo no ha tenido que tomar nunca requisitos de clientes 😁&lt;/p&gt;

&lt;p&gt;Bromas aparte, se trata de una alucinante implementación práctica de &lt;strong&gt;la potencia de los algoritmos de aprendizaje automático&lt;/strong&gt; cuando tienen un "corpus" de entrenamiento lo suficientemente bueno y se afinan bien.&lt;/p&gt;

&lt;p&gt;Aunque GPT-3 está basado en la misma tecnología de Machine Learning que GPT-2, lanzada el año pasado, esta nueva versión es un modelo muchísimo mayor. Utiliza 175.000 millones de parámetros entrenables (😱) lo que lo hace 100 veces mayor que su predecesor y 10 veces mayor que su competidor más cercano, Turing NLG de Microsoft, con "tan solo" 17.000 millones de parámetros.&lt;/p&gt;

&lt;p&gt;Los expertos que han podido probar este modelo están impresionados. Y lo que más impresiona ya no es tanto su tamaño sino sus capacidades de generación de textos, que rivalizan con las de muchos profesionales humanos. Lo único que tienes que hacer es darle una frase inicial sobre un tema y la AI lo continúa de manera coherente y "humana". Se ha utilizado para escribir artículos, historias, canciones, entrevistas, manuales técnicos y hasta poesía. Es el sistema que más cerca está de pasar el test de Turing hasta la fecha.&lt;/p&gt;

&lt;p&gt;Lo último que lo ha traído a la actualidad ha sido el caso de un estudiante, &lt;strong&gt;Liam Porr&lt;/strong&gt; , que &lt;a href="https://adolos.substack.com/archive?sort=new"&gt;ha creado un blog generado 100% de forma automática con GPT-3&lt;/a&gt; y que ha logrado llegar a número 1 en Hacker News, nada menos. Porr elegía los temas y ajustaba el título para lograr el mayor impacto de SEO, pero el resto de los contenidos es, tal cual, lo que generó GPT-3. Échale un vistazo al blog (en inglés, aunque la tecnología funciona en muchos otros idiomas) y te costará creer que no sean artículos escritos por una persona.&lt;/p&gt;

&lt;p&gt;Tenemos ejemplos desde hace años sobre cómo el Machine Learning es capaz de generar contenidos automáticos (un porcentaje muy alto de los artículos de economía y de deportes ya se generan de esta forma hace tiempo), y &lt;strong&gt;se ha especulado mucho sobre cómo GPT-3 y similares podrían afectar al trabajo de periodistas y generadores de contenido en general&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Esta tecnología es alucinante y abre una nueva era en el engaño, las &lt;em&gt;fake news&lt;/em&gt; y el contenido hueco, vacío de humanidad&lt;/strong&gt;. Pero tiene muchas aplicaciones benignas también. Es por esto que Open AI no va a liberar el modelo como Open Source sino que lo expone a través de una API a la que da acceso previa petición y análisis de ésta. De esta forma pueden responder al mal uso de la tecnología, cosa que no podrían hacer si la liberasen. Aparte de esto Open AI, que nació como una organización de investigación sin ánimo de lucro a finales de 2015, se ha convertido en una empresa con objetivos comerciales en la que Microsoft ha invertido 1.000 millones de dólares para crear uno de los mayores supercomputadores que se ejecutan en Azure. Elon Musk también es uno de los inversores en la empresa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Estamos entrando en la era del Machine Learning y el futuro será de las empresas y organizaciones que sepan seguirle el ritmo&lt;/strong&gt; 🤖&lt;/p&gt;

</description>
      <category>ia</category>
      <category>machinelearning</category>
      <category>spanish</category>
    </item>
    <item>
      <title>¿Qué son Spring framework y Spring Boot? Tu primer programa Java con este framework - VIDEO</title>
      <dc:creator>campusMVP</dc:creator>
      <pubDate>Tue, 31 Mar 2020 08:00:00 +0000</pubDate>
      <link>https://dev.to/campusmvp_es/que-son-spring-framework-y-spring-boot-tu-primer-programa-java-con-este-framework-4ao6</link>
      <guid>https://dev.to/campusmvp_es/que-son-spring-framework-y-spring-boot-tu-primer-programa-java-con-este-framework-4ao6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;El autor de este artículo es &lt;strong&gt;Rubén Pahíno&lt;/strong&gt; y fue originalmente publicado &lt;a href="https://www.campusmvp.es/recursos/post/que-son-spring-framework-y-spring-boot-tu-primer-programa-java-con-este-framework.aspx"&gt;en el blog de campusMVP&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Si desarrollas con Java, o lo has hecho en algún momento de los últimos años, seguramente te suene &lt;strong&gt;Spring Framework&lt;/strong&gt; , aunque sea de oídas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://spring.io/"&gt;Spring Framework&lt;/a&gt;&lt;/strong&gt; es un &lt;em&gt;framework&lt;/em&gt; Open Source que facilita la creación de aplicaciones de todo tipo en &lt;strong&gt;Java&lt;/strong&gt; , &lt;strong&gt;Kotlin&lt;/strong&gt; y &lt;strong&gt;Groovy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Si bien es cierto que, por lo que es más conocido es por la inyección de dependencias, Spring Framework está dividido en diversos módulos que podemos utilizar, ofreciéndonos muchas más funcionalidades:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Core container&lt;/strong&gt; : proporciona inyección de dependencias e inversión de control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web&lt;/strong&gt; : nos permite crear controladores Web, tanto de vistas MVC como aplicaciones REST.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acceso a datos&lt;/strong&gt; : abstracciones sobre JDBC, &lt;a href="https://www.campusmvp.es/recursos/post/que-es-un-orm.aspx"&gt;ORMs&lt;/a&gt; como Hibernate, sistemas OXM (&lt;em&gt;Object XML Mappers&lt;/em&gt;), JSM y transacciones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Programación orientada a Aspectos (AOP)&lt;/strong&gt;: ofrece el soporte para &lt;a href="https://docs.spring.io/spring/docs/4.3.15.RELEASE/spring-framework-reference/html/aop.html"&gt;aspectos&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instrumentación&lt;/strong&gt; : proporciona soporte para la instrumentación de clases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pruebas de código&lt;/strong&gt; : contiene un &lt;em&gt;framework&lt;/em&gt; de &lt;em&gt;testing&lt;/em&gt;, con soporte para JUnit y TestNG y todo lo necesario para probar los mecanismos de Spring.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Estos módulos son opcionales&lt;/strong&gt; , por lo que podemos utilizar los que necesitemos sin tener que llenar nuestro &lt;code&gt;classpath&lt;/code&gt; con clases que no vamos a usar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0JIvpPMC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2020/1T/modulos-spring.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0JIvpPMC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2020/1T/modulos-spring.png" alt="Esquema que ilustra los diferentes módulos de Spring, obtenido de la documentación oficial"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Razones para usar Spring
&lt;/h2&gt;

&lt;p&gt;Aunque no sea una característica única de Spring, el uso de inyección de dependencias facilita la programación contra interfaz, permitiendo a los distintos componentes depender únicamente de interfaces y produciendo así un &lt;strong&gt;código menos acoplado&lt;/strong&gt;. No solo eso, también permite implementar el patrón &lt;em&gt;singleton&lt;/em&gt; de una forma extremadamente sencilla (por defecto, las dependencias que inyectamos son singletons).&lt;/p&gt;

&lt;p&gt;Hay cientos de tecnologías que Spring permite integrar. Desde bibliotecas que implementan &lt;a href="https://opentracing.io/"&gt;opentracing&lt;/a&gt; hasta las que nos generan métricas para nuestra aplicación, pasando por serialización/deserialización a JSON y XML, seguridad con OAuth2 o programación reactiva entre otras.&lt;/p&gt;

&lt;p&gt;En general, Spring &lt;strong&gt;aumenta la productividad y reduce la fricción&lt;/strong&gt; al ofrecernos abstracciones sobre implementaciones de tecnologías concretas. Un ejemplo claro es el de &lt;code&gt;spring-data&lt;/code&gt;, que nos permite definir el acceso a base de datos con interfaces Java. Esto lo consigue &lt;em&gt;parseando&lt;/em&gt; el nombre de los métodos y generando la consulta con la sintaxis específica para el &lt;em&gt;driver&lt;/em&gt; que utilicemos. Por ejemplo, cambiar nuestra aplicación de MySQL a PostgreSQL es tan sencillo como cambiar el &lt;em&gt;driver&lt;/em&gt;: Spring se encarga de la sintaxis de forma transparente.&lt;/p&gt;

&lt;p&gt;A pesar de "la magia de Spring" 🧙🏻‍♂️, como muchos lo llaman, Spring nos permite desactivar estos "comportamientos mágicos" en caso de ser necesario, por lo que &lt;strong&gt;podemos tomar el control cuando necesitemos más granularidad&lt;/strong&gt;. Siguiendo con el ejemplo de &lt;code&gt;spring-data&lt;/code&gt;, este control sería necesario si tenemos que realizar consultas mucho más complejas que un &lt;code&gt;SELECT * BY name&lt;/code&gt;. En esos casos, entre otras opciones, podemos anotar nuestro método con &lt;code&gt;@Query&lt;/code&gt; y escribir la consulta que deseemos. Ya no hay magia 😉&lt;/p&gt;

&lt;p&gt;Por lo general, Spring no obliga a implementar ni extender nada, lo que nos permite escribir código que es "agnóstico" del &lt;em&gt;framework&lt;/em&gt;. De esta forma, desarrolladores con cero o muy poco conocimiento de Spring pueden realizar su trabajo sin mayores complicaciones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spring es de código abierto y tiene una gran comunidad detrás&lt;/strong&gt;. Si encuentras un &lt;em&gt;bug&lt;/em&gt;, echas en falta una funcionalidad o lo que sea, siempre puedes &lt;a href="https://github.com/spring-projects/spring-framework/issues"&gt;abrir un ticket&lt;/a&gt; o contribuir por tu cuenta.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Pero no íbamos a hablar de Spring Boot?
&lt;/h2&gt;

&lt;p&gt;Hasta ahora he hablado de Spring Framework en general, pero el título de esta entrada menciona &lt;strong&gt;Spring Boot&lt;/strong&gt; , así que voy a presentarlo.&lt;/p&gt;

&lt;p&gt;Si bien es cierto que Spring Framework es muy potente, &lt;strong&gt;la configuración inicial y la preparación de las aplicaciones para producción&lt;/strong&gt; son tareas bastante tediosas. &lt;strong&gt;Spring Boot simplifica el proceso al máximo&lt;/strong&gt; gracias a sus dos principales mecanismos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Contenedor de aplicaciones integrado
&lt;/h3&gt;

&lt;p&gt;Spring Boot permite compilar nuestras aplicaciones Web como un archivo &lt;code&gt;.jar&lt;/code&gt; que podemos ejecutar como una aplicación Java normal (como alternativa a un archivo &lt;code&gt;.war&lt;/code&gt;, que desplegaríamos en un servidor de aplicaciones como Tomcat).&lt;/p&gt;

&lt;p&gt;Esto lo consigue &lt;strong&gt;integrando el servidor de aplicaciones en el propio &lt;code&gt;.jar&lt;/code&gt;&lt;/strong&gt; y levantándolo cuando arrancamos la aplicación. De esta forma, podemos &lt;strong&gt;distribuir nuestras aplicaciones de una forma mucho más sencilla&lt;/strong&gt; , al poder configurar el servidor junto con la aplicación. Esto también es muy útil en &lt;strong&gt;arquitecturas de microservicios&lt;/strong&gt; , puesto que permite distribuir nuestras aplicaciones como imágenes Docker que podemos escalar horizontalmente (algo muy complicado con un &lt;code&gt;.war&lt;/code&gt;).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt; : Spring boot &lt;strong&gt;permite&lt;/strong&gt; distribuir tu aplicación como un &lt;code&gt;jar&lt;/code&gt;, &lt;strong&gt;no lo impone&lt;/strong&gt;. Si prefieres desplegar tu aplicación en un servidor de aplicaciones tradicional, Spring Boot te deja compilar el código como un &lt;code&gt;.war&lt;/code&gt; que no incluya ningún servidor de aplicaciones integrado.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Starters
&lt;/h3&gt;

&lt;p&gt;Spring Boot nos proporciona una serie de dependencias, llamadas &lt;em&gt;starters&lt;/em&gt;, que podemos añadir a nuestro proyecto dependiendo de lo que necesitemos: crear un controlador REST, acceder a una base de datos usando JDBC, conectar con una cola de mensajes Apache ActiveMQ, etc.&lt;/p&gt;

&lt;p&gt;Una vez añadimos un &lt;em&gt;starter&lt;/em&gt;, éste nos proporciona todas las dependencias que necesitamos, tanto de Spring como de terceros. Además, los &lt;em&gt;starters&lt;/em&gt; vienen configurados con valores por defecto, que pretenden &lt;strong&gt;minimizar la necesidad de configuración&lt;/strong&gt; a la hora de desarrollar. Un buen ejemplo es el de &lt;strong&gt;&lt;code&gt;spring-boot-starter-actuator&lt;/code&gt;&lt;/strong&gt; : una vez que añadimos la dependencia, nuestra aplicación empezará a generar métricas tanto de la JVM como de la aplicación en sí (latencias, errores, etc).&lt;/p&gt;

&lt;p&gt;Al igual que con Spring Framework, &lt;strong&gt;cualquier configuración puede ser modificada&lt;/strong&gt; de ser necesario: desde el puerto en el que la aplicación escucha peticiones, hasta el banner que sale por consola al arrancar la aplicación.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hola Mundo con Spring Boot
&lt;/h2&gt;

&lt;p&gt;Para demostrar lo fácil que es empezar a usar Spring Boot, vamos a ver el código necesario para crear nuestro primer "Hola mundo":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@SpringBootApplication
@RestController
public class Application {

    @GetMapping("/hello")
    public String hello() {
        return "Hello Bootiful!";
    }
}

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Sencillo, ¿verdad?&lt;/p&gt;

&lt;p&gt;Un poco más abajo te explico en un vídeo práctico cómo llegar a este código y qué significa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus tip: Spring Initializr
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--romMppNW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2020/1T/spring-initializr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--romMppNW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2020/1T/spring-initializr.png" alt="Captura de Spring Initializr"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El equipo de Spring también ha creado &lt;a href="https://start.spring.io/"&gt;Spring Initializr&lt;/a&gt;, una herramienta web que puedes utilizar para autogenerar el esqueleto de tu aplicación Spring Boot.&lt;/p&gt;

&lt;p&gt;Se trata de un inicializador muy útil, ya que genera el &lt;code&gt;pom.xml&lt;/code&gt; (o &lt;code&gt;build.gradle&lt;/code&gt;), el &lt;code&gt;main&lt;/code&gt; de la aplicación, y un test que comprueba que la aplicación arranca correctamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vídeo práctico: "Hola Mundo" con Spring Boot
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/UxMuZ-UPwrI"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>java</category>
      <category>spring</category>
      <category>spanish</category>
      <category>video</category>
    </item>
    <item>
      <title>PostCSS: cómo reducir hojas de estilo CSS, eliminando los selectores que sobran (vídeo)</title>
      <dc:creator>campusMVP</dc:creator>
      <pubDate>Tue, 04 Feb 2020 08:00:00 +0000</pubDate>
      <link>https://dev.to/campusmvp_es/postcss-como-reducir-hojas-de-estilo-css-eliminando-los-selectores-que-sobran-video-15j5</link>
      <guid>https://dev.to/campusmvp_es/postcss-como-reducir-hojas-de-estilo-css-eliminando-los-selectores-que-sobran-video-15j5</guid>
      <description>&lt;p&gt;Aunque todo profesional del desarrollo Web que se precie debe &lt;a href="https://www.campusmvp.es/recursos/catalogo/Product-HTML5-y-CSS3-a-fondo-para-desarrolladores_185.aspx"&gt;dominar HTML y CSS,&lt;/a&gt; la realidad es que en la mayor parte de los proyectos normalmente hacemos uso de &lt;strong&gt;alguna biblioteca o &lt;em&gt;framework&lt;/em&gt; CSS&lt;/strong&gt; , como por ejemplo &lt;a href="https://www.campusmvp.es/recursos/catalogo/Product-Dise%C3%B1o-Web-Responsive-con-HTML5,-Flexbox,-CSS-Grid-y-Bootstrap_212.aspx"&gt;Bootstrap&lt;/a&gt; (que es la más utilizada) o herramientas similares.&lt;/p&gt;

&lt;p&gt;Utilizar un &lt;em&gt;framework&lt;/em&gt; CSS nos permite &lt;strong&gt;maquetar muy rápido&lt;/strong&gt; , dar un &lt;strong&gt;aspecto atractivo&lt;/strong&gt; por defecto a las aplicaciones, y &lt;strong&gt;&lt;a href="https://dev.to/campusmvp/bootstrap-42---spinners-notificaciones-toast-interruptores-y-otras-novedades-l0f"&gt;tener ya hechas muchas cosas complicadas&lt;/a&gt;&lt;/strong&gt;. Pero, por otro lado, utilizar un &lt;em&gt;framework&lt;/em&gt; implica que &lt;strong&gt;estamos añadiendo gran cantidad de cosas a la aplicación que jamás vamos a utilizar&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Por ejemplo, si creas una aplicación sencilla con Bootstrap utilizando tan solo la facilidad de maquetación con su rejilla (aunque hoy en día &lt;a href="https://www.campusmvp.es/recursos/catalogo/Product-Dise%C3%B1o-Web-Responsive-con-HTML5,-Flexbox,-CSS-Grid-y-Bootstrap_212.aspx"&gt;con CSS Grid y Flexbox&lt;/a&gt; no lo necesitarías) y tomando el aspecto por defecto de botones y cuadros de texto, estarás añadiendo a la aplicación unos 156KB de tamaño con la versión minimizada del CSS de Boostrap. Sin embargo, &lt;strong&gt;si analizas el uso real que estás haciendo&lt;/strong&gt; de las reglas incluidas, verás que es mínimo y &lt;strong&gt;te llegaría con un porcentaje pequeño&lt;/strong&gt; del contenido de ese archivo.&lt;/p&gt;

&lt;p&gt;Lo puedes ver en este mini-vídeo en el que tengo una página muy sencilla con unas cuantas secciones para maquetar texto e imágenes, abro la página en Chrome y empleo su herramienta para análisis de cobertura de código:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/hTdEbVaLtoE"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Como puedes comprobar, &lt;strong&gt;casi el 96% del código de la hoja de estilos de Bootstrap no se utiliza&lt;/strong&gt; para nada. El resto, para esta página en concreto, no lo necesitamos.&lt;/p&gt;

&lt;p&gt;Pero claro, hacer esto manualmente es una tarea propensa a errores y, además, lamentablemente las herramientas de cobertura de Chrome no nos dejan exportar a un archivo tan solo lo que se identifica como que está en uso.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;En el siguiente vídeo&lt;/strong&gt; te explico paso a paso cómo puedes &lt;strong&gt;sacar partido a la estupenda herramienta &lt;a href="https://purgecss.com/"&gt;PurgeCSS&lt;/a&gt;&lt;/strong&gt; para automatizar el análisis y limpieza de los archivos CSS que emplee tu aplicación web Front-End y acabar con aplicaciones más ligeras y más rápidas. Para ello utiliza un pequeño sitio web con algunas páginas bastante complejas, y que se apoya en el uso de diversas bibliotecas y mucho CSS.&lt;/p&gt;

&lt;p&gt;Vamos a verlo:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/xN3w49LSMYo"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Todo lo explicado se puede automatizar con &lt;strong&gt;npm&lt;/strong&gt; , &lt;strong&gt;Gulp&lt;/strong&gt; o &lt;strong&gt;Webpack&lt;/strong&gt; e incorporarlo al proceso de desarrollo de tu aplicación.&lt;/p&gt;

&lt;p&gt;Puedes aprender a dominar todas estas herramientas de desarrollo Front-End y muchas más, para ser mejor profesional, con nuestro curso de &lt;a href="https://www.campusmvp.es/recursos/catalogo/Product-Herramientas-modernas-para-desarrollo-Web-Front-End-empresarial_243.aspx"&gt;Herramientas modernas para desarrollo Web Front-End empresarial&lt;/a&gt;. Háblalo con tu empresa o invierte por tu cuenta en mejorar tu perfil profesional 😉&lt;/p&gt;

&lt;p&gt;¡Espero que te resulte útil!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>spanish</category>
      <category>video</category>
    </item>
    <item>
      <title>Java: Los 5 mejores frameworks para desarrollo Web</title>
      <dc:creator>campusMVP</dc:creator>
      <pubDate>Mon, 23 Dec 2019 08:00:00 +0000</pubDate>
      <link>https://dev.to/campusmvp/java-los-5-mejores-frameworks-para-desarrollo-web-45fa</link>
      <guid>https://dev.to/campusmvp/java-los-5-mejores-frameworks-para-desarrollo-web-45fa</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Post original en &lt;a href="https://www.campusmvp.es/recursos/post/java-los-5-mejores-frameworks-para-desarrollo-web.aspx"&gt;campusMVP&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Java&lt;/strong&gt; es sin duda el lenguaje más demandado en el mercado laboral. Sirve para crear &lt;strong&gt;todo tipo de aplicaciones&lt;/strong&gt; : desde el móvil hasta el servidor, pasando por el escritorio o la Web. Y es esto último precisamente lo que nos ocupa hoy: el &lt;strong&gt;desarrollo Web&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Aunque Java ofrece de serie todo lo necesario para crear aplicaciones para Internet, no sería muy inteligente ceñirse tan solo a eso, al igual que no lo haríamos así con ninguna otra plataforma. Simplemente sería demasiado complejo. Así que para abstraernos de la necesidad de bajar mucho de nivel, existe &lt;strong&gt;una amplia oferta de &lt;em&gt;frameworks&lt;/em&gt; Java que nos ayudan con el desarrollo Web&lt;/strong&gt; , ofreciéndonos ya hechas muchas de las funcionalidades que necesitamos: desde acceso a bases de datos, gestión de sesiones, creación de servicios, servir contenidos estáticos, crear vistas.... y por supuesto reutilizar código, probarlo, etc...&lt;/p&gt;

&lt;p&gt;Para orientarte en el camino sobre qué aprender para desarrollar aplicaciones Web con Java hemos creado esta lista con &lt;strong&gt;los 5 frameworks más importantes&lt;/strong&gt; , los cuales son todos &lt;strong&gt;gratuitos y &lt;em&gt;Open Source&lt;/em&gt;&lt;/strong&gt; :&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://spring.io/"&gt;1.- Spring MVC&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--B-7mLPNF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/4T/java-frameworks-spring.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--B-7mLPNF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/4T/java-frameworks-spring.png" alt="Imagen ornamnetal - Logo de Sping"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El conocido &lt;em&gt;framework&lt;/em&gt; Spring es seguramente el más popular y utilizado del mundo. Se trata de un &lt;em&gt;framework&lt;/em&gt; de desarrollo de aplicaciones ligero para Java EE que en realidad se puede utilizar para todo tipo de aplicaciones, no sólo para la Web, pero que es especialmente útil para éstas. &lt;/p&gt;

&lt;p&gt;Nos ayuda a crear cualquiera de las capas de la aplicación, cosa en la que otros &lt;em&gt;frameworks&lt;/em&gt; son más limitados. Dispone de varios &lt;em&gt;sub-frameworks&lt;/em&gt; como:  &lt;strong&gt;Spring Core&lt;/strong&gt; , que dota de funcionalidad a todo lo demás;  &lt;strong&gt;SpringMVC&lt;/strong&gt; , para la parte que UI que se devuelve al navegador; &lt;strong&gt;Spring ORM&lt;/strong&gt; , para el acceso a datos; &lt;strong&gt;Spring Security&lt;/strong&gt; , para autenticación y autorización de las aplicaciones; etc...&lt;/p&gt;

&lt;p&gt;Aumenta la productividad, reduce los errores y hace que las aplicaciones sean más fáciles de mantener. Soporta la configuración de su comportamiento a partir de XML o mediante anotaciones en el código. Permite usar JDBC para el acceso a datos si lo preferimos. También facilita el &lt;em&gt;testing&lt;/em&gt; del código web. Ofrece una documentación muy buena.&lt;/p&gt;

&lt;p&gt;Lo utiliza... prácticamente todo el mundo, pero hay muchas empresas conocidas que desarrollan con Spring: &lt;strong&gt;Netflix&lt;/strong&gt; , &lt;strong&gt;Amazon&lt;/strong&gt; o &lt;strong&gt;eBay&lt;/strong&gt; por poner algunos ejemplos.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://hibernate.org/"&gt;2.- Hibernate&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OeUwyTmp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/4T/java-frameworks-hibernate.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OeUwyTmp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/4T/java-frameworks-hibernate.png" alt="Imagen ornamental - Logo de Hibernate"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vale, esto no es específico para desarrollo Web, sino para cualquier desarrollo con Java que utilice acceso a datos. Pero es el &lt;em&gt;framework&lt;/em&gt; de datos más utilizado del mundo y en cualquier desarrollo web lo vas a acabar utilizando.&lt;/p&gt;

&lt;p&gt;Hibernate es &lt;strong&gt;&lt;a href="https://www.campusmvp.es/recursos/post/que-es-un-orm.aspx"&gt;un ORM&lt;/a&gt;&lt;/strong&gt; que nos permite crear la capa de acceso a datos de nuestra aplicación utilizando objetos en lugar de consultas, disminuyendo la fricción entre el mundo de las bases de datos relacionales y la Programación Orientada a Objetos. Vamos, como cualquier ORM. La diferencia con otros es que Hibernate es con diferencia el más utilizado y ello significa que hay mucho más soporte y comunidad que para cualquier otro y te resultará más fácil resolver cualquier problema y obtener nuevas funcionalidades.&lt;/p&gt;

&lt;p&gt;Su mayor desventaja es seguramente su tamaño y que puede resultar complejo a veces. Pero es algo que, si programas en Java hay que conocer sí o sí.&lt;/p&gt;

&lt;p&gt;Al igual que en el caso de Spring, Hibernate lo usa casi todo el mundo para desarrollar en Java: la propia &lt;strong&gt;Oracle&lt;/strong&gt; , &lt;strong&gt;IBM&lt;/strong&gt; , &lt;strong&gt;Accenture&lt;/strong&gt;...&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://struts.apache.org/"&gt;3.- Struts&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oItaVxgD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/4T/java-frameworks-struts.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oItaVxgD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/4T/java-frameworks-struts.png" alt="Imagen ornamental, logo de Struts"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Otro &lt;em&gt;framework&lt;/em&gt; de desarrollo para Java lleno de características, mantenido en este caso por la &lt;strong&gt;Fundación Apache&lt;/strong&gt;. Es bastante antiguo pero por el mismo motivo está muy probado y lo utiliza mucha gente, y sacan versiones constantemente. Es comparable en muchos sentidos con Spring, que mencionamos antes. Está basado en &lt;a href="https://dev.to/campusmvp_es/que-es-el-patron-mvc-en-programacion-y-por-que-es-util-2c2e-temp-slug-4666309"&gt;el patrón MVC&lt;/a&gt; y su enfoque es en crear aplicaciones de nivel empresarial de manera rápida y que sean fáciles de mantener.&lt;/p&gt;

&lt;p&gt;Dispone de una arquitectura basada en &lt;em&gt;plugins&lt;/em&gt; que permiten extenderlo fácilmente con cualquier funcionalidad que requieras y no tenga de serie. Trae muchos plugins de serie para hacer de todo (procesar JSON, crear servicios REST...) y existen muchos más creados por la comunidad.&lt;/p&gt;

&lt;p&gt;Lo puedes combinar con otros &lt;em&gt;frameworks&lt;/em&gt; para conseguir funcionalidad que no tenga. Por ejemplo, puedes usar inyección de dependencias a través de Spring, o Hibernate para el acceso a datos.&lt;/p&gt;

&lt;p&gt;Su mayor pega quizá sea que es más complejo que otros y que te fuerza a seguir un determinado estilo de programación y ciertas reglas (lo cual, en muchas empresas es una ventaja).&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="http://www.javaserverfaces.org/"&gt;4.- JavaServer Faces (JSF)&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--r1W3d-HS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/4T/java-frameworks-jsf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r1W3d-HS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/4T/java-frameworks-jsf.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;JavaServer Faces es en realidad &lt;a href="https://javaee.github.io/javaserverfaces-spec/"&gt;una especificación&lt;/a&gt; "estándar" para la creación de interfaces de usuario para aplicaciones Web, aunque se puede usar también para crear aplicaciones nativas. La creó la propia Oracle y su primera versión data del año 2004, así que es algo muy estable y probado también. Al igual que otros, utiliza el patrón MVC, y está basado en componentes. El objetivo es que puedas construir componentes de interfaz de usuario que sean reutilizables, pudiendo gestionar su estado, conectarlos a orígenes de datos y atarlos a eventos para realizar acciones.&lt;/p&gt;

&lt;p&gt;Tiene un sistema de plantillas para crear los componentes que se llama Facelets y que utilizan XML en lugar de Java para definirlas, aunque puedes usar otros métodos para lo mismo sin salirte de JSF (usando Java directamente si quieres).&lt;/p&gt;

&lt;p&gt;Es bastante complejo y no es el más rápido, pero tiene dos ventajas fundamentales: está &lt;strong&gt;incluido con Java EE&lt;/strong&gt; (y &lt;a href="https://www.campusmvp.es/recursos/post/Los-mejores-entornos-de-desarrollo-para-Java.aspx"&gt;los principales IDEs&lt;/a&gt; dan soporte de serie para usarlo) y la &lt;strong&gt;documentación es muy buena&lt;/strong&gt;  ya que está creada y mantenida por Oracle.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://grails.org/"&gt;5.- Grails&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uk-GrJSF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/4T/java-frameworks-grails.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uk-GrJSF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/4T/java-frameworks-grails.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Grails&lt;/strong&gt; es un &lt;em&gt;framework&lt;/em&gt; de desarrollo Web que utiliza &lt;strong&gt;&lt;a href="http://groovy-lang.org/"&gt;el lenguaje Groovy&lt;/a&gt;&lt;/strong&gt; para la plataforma Java. Groovy es un lenguaje orientado a objetos que compila a Bytecode y que está enfocado a fondo en la productividad del desarrollador. Por ese motivo, Grails lo que te da es una productividad altísima y te permite estar produciendo código para tu aplicación de manera casi inmediata (en 1 hora puedes tener tu primera aplicación probada y en marcha).&lt;/p&gt;

&lt;p&gt;Aunque programas con Groovy y no con Java directamente, la sintaxis es compatible con Java y además funciona de maravilla con otras tecnologías Java como Hibernate o incluso Spring. De hecho está basado en Spring Boot, por lo que incluye características como la inyección de dependencias. Sigue buenas prácticas y principios de desarrollo modernos como convención sobre configuración.&lt;/p&gt;

&lt;p&gt;Escala bien y te servirá tanto para proyectos pequeños como muy grandes. El soporte de los diferentes IDEs es muy bueno. Tiene centenares de &lt;em&gt;plugins&lt;/em&gt; para hacer casi cualquier cosa que se te ocurra.&lt;/p&gt;

&lt;p&gt;La &lt;a href="http://grails.org/documentation.html"&gt;documentación de Grails&lt;/a&gt; es muy buena, y tiene también unas &lt;a href="https://guides.grails.org/index.html"&gt;guías paso a paso de Grails&lt;/a&gt; muy buenas.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Post original en &lt;a href="https://www.campusmvp.es/recursos/post/java-los-5-mejores-frameworks-para-desarrollo-web.aspx"&gt;campusMVP&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>java</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Paquetes en Java: qué son, para qué se utilizan, y cómo se usan (con vídeo)</title>
      <dc:creator>campusMVP</dc:creator>
      <pubDate>Wed, 14 Aug 2019 08:00:00 +0000</pubDate>
      <link>https://dev.to/campusmvp/paquetes-en-java-que-son-para-que-se-utilizan-y-como-se-usan-con-video-11e5</link>
      <guid>https://dev.to/campusmvp/paquetes-en-java-que-son-para-que-se-utilizan-y-como-se-usan-con-video-11e5</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Post original escrito por Franciso Charte en &lt;a href="https://www.campusmvp.es/recursos/post/paquetes-en-java-que-son-para-que-se-utilizan-y-como-se-usan.aspx"&gt;campusMVP&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Los paquetes son el mecanismo que usa Java &lt;strong&gt;para facilitar la modularidad del código&lt;/strong&gt;. Un paquete puede contener una o más definiciones de interfaces y clases, distribuyéndose habitualmente como un archivo. Para utilizar los elementos de un paquete es necesario importar este en el módulo de código en curso, usando para ello la sentencia &lt;code&gt;import&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;La funcionalidad de una aplicación Java se implementa habitualmente en múltiples clases, entre las que suelen existir distintas relaciones. &lt;strong&gt;Las clases se agrupan en unidades de un nivel superior, los paquetes&lt;/strong&gt; , que actúan como &lt;strong&gt;ámbitos de contención de tipos&lt;/strong&gt;. Cada módulo de código establece, mediante la palabra clave &lt;code&gt;package&lt;/code&gt; al inicio, a qué paquete pertenece. Como ya sabrás, con la &lt;strong&gt;cláusula &lt;code&gt;import&lt;/code&gt;&lt;/strong&gt; cualquier módulo de código puede hacer referencia a tipos definidos en otros paquetes.&lt;/p&gt;

&lt;p&gt;Vamos a familiarizarnos con los procedimientos para construir paquetes, para referenciarlos desde otros puntos y también veremos la &lt;strong&gt;relación existente entre paquetes, clases y el sistema de archivos&lt;/strong&gt; donde se almacena el proyecto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creación de paquetes
&lt;/h2&gt;

&lt;p&gt;Un paquete Java se genera sencillamente incluyendo la palabra clave &lt;code&gt;package&lt;/code&gt; al inicio de los módulos de código en los que se definen las clases que formarán parte del mismo. Trabajando en un proyecto con &lt;a href="https://www.campusmvp.es/recursos/post/Los-mejores-entornos-de-desarrollo-para-Java.aspx"&gt;NetBeans&lt;/a&gt;, comprobaremos que en la ventana &lt;code&gt;Projects&lt;/code&gt; los paquetes se representan con un icono específico y actúan como nodos contenedores, alojando los módulos &lt;code&gt;.java&lt;/code&gt; con el código fuente. El menú contextual del proyecto nos ofrece la opción &lt;code&gt;New&amp;gt;Java Package&lt;/code&gt;, que será el que usemos habitualmente para crear un nuevo paquete:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Juqagt_o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/3T/NewPackage.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Juqagt_o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/3T/NewPackage.png" alt="Creación de un nuevo paquete en Netbeans"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt; : cada vez que se crea un nuevo proyecto con NetBeans se propone la definición de un nuevo paquete, cuyo nombre sería el mismo del proyecto, donde se alojarían los módulos de código. En proyectos complejos, no obstante, puede ser necesaria la &lt;strong&gt;creación de paquetes adicionales&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Un paquete puede contener, además de definiciones de tipos como las clases e interfaces, otros paquetes, &lt;strong&gt;dando lugar a estructuras jerárquicas de contenedores&lt;/strong&gt;. La denominación de los &lt;strong&gt;subpaquetes, paquetes contenidos en otros&lt;/strong&gt; , se compondrán del identificador del contenedor seguido de un punto y el nombre del subpaquete. De existir niveles adicionales se agregarían los distintos identificadores separados por puntos, formando así el nombre completo del paquete.&lt;/p&gt;

&lt;p&gt;El diagrama siguiente representa el contenido de un paquete llamado &lt;code&gt;campusmvp&lt;/code&gt;, teóricamente correspondiente a un proyecto de aplicación de contabilidad. En ese paquete de primer nivel tenemos un subpaquete con utilidades, llamado &lt;code&gt;campusmvp.util&lt;/code&gt;, no directamente vinculadas con la aplicación de contabilidad. El subpaquete &lt;code&gt;campusmvp.conta&lt;/code&gt; contendría todos los elementos asociados a dicha aplicación, distribuidos a su vez en un tercer nivel de paquetes que contienen las clases correspondientes al modelo, la vista, etc., siguiendo al &lt;strong&gt;&lt;a href="https://es.wikipedia.org/wiki/Modelo%E2%80%93vista%E2%80%93controlador"&gt;patrón arquitectónico MVC&lt;/a&gt;&lt;/strong&gt;. Cada uno de los módulos de definición de clase, denominados &lt;code&gt;Cuenta.java&lt;/code&gt;, &lt;code&gt;Movimiento.java&lt;/code&gt;, &lt;code&gt;Vista.java&lt;/code&gt;, etc., comenzarían con una cláusula &lt;code&gt;package&lt;/code&gt; indicando &lt;strong&gt;el nombre completo del paquete al que pertenecen&lt;/strong&gt; :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cz2GQl05--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/3T/NestedPackages.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cz2GQl05--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/3T/NestedPackages.png" alt="Estructura jerárquica de paquetes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt; : todas las clases que pertenecen a un mismo paquete comparten un ámbito común, al que pertenecerán aquellos miembros que no especifiquen explícitamente otro tipo de visibilidad.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Importación de paquetes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Los paquetes Java son como cajas de herramientas&lt;/strong&gt; , cada una de ellas con una colección distinta de instrumentos útiles para nuestro trabajo, a las que podemos necesitar acceder cada vez que abordamos el desarrollo de un nuevo proyecto. Es en este contexto donde recurriremos a la cláusula &lt;strong&gt;&lt;code&gt;import&lt;/code&gt;&lt;/strong&gt; , a fin de &lt;strong&gt;importar en el ámbito actual las definiciones de otro paquete y poder usarlas&lt;/strong&gt; según el procedimiento habitual, creando objetos, accediendo a los servicios de las clases, etc.&lt;/p&gt;

&lt;p&gt;La cláusula &lt;code&gt;import&lt;/code&gt; puede utilizarse para importar un elemento concreto de un paquete, facilitando el nombre de este seguido de un punto y el identificador de dicho elemento. Por ejemplo, para importar la clase &lt;code&gt;Math&lt;/code&gt; del paquete &lt;code&gt;java.lang&lt;/code&gt;, pudiendo así acceder a la constante &lt;code&gt;PI&lt;/code&gt; y las funciones matemáticas que aporta, bastaría con la siguiente línea:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import java.lang.Math;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Es habitual que al importar un paquete nos interesen muchas de las clases definidas en el mismo. En este caso podríamos importarlas individualmente, usando la sintaxis anterior, o bien podríamos recurrir a la siguiente alternativa. Esto nos permitiría usar la clase &lt;code&gt;Math&lt;/code&gt;, así como la clase &lt;code&gt;System&lt;/code&gt;, la clase &lt;code&gt;Thread&lt;/code&gt; y muchas otras definidas en el paquete &lt;code&gt;java.lang&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import java.lang.\*;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;En ocasiones, como ocurre con la clase &lt;code&gt;Math&lt;/code&gt;, &lt;strong&gt;importamos una clase para acceder directamente a sus miembros estáticos, constantes y métodos&lt;/strong&gt; , no para crear objetos a partir de ellas, lo que nos fuerza a utilizar constantemente la sintaxis &lt;code&gt;Clase.miembro&lt;/code&gt;, por ejemplo &lt;code&gt;Math.PI&lt;/code&gt; o &lt;code&gt;Math.sin()&lt;/code&gt;. Si tras importar la clase &lt;code&gt;Math&lt;/code&gt; intentamos referirnos a estos miembros simplemente por su nombre, como se hace en la mitad superior de la siguiente imagen, obtendremos un error. En estos casos podemos recurrir a la sintaxis &lt;strong&gt;&lt;code&gt;import static paquete.clase.*&lt;/code&gt;&lt;/strong&gt; , cuya finalidad es &lt;strong&gt;incluir en el ámbito actual los miembros estáticos de la clase indicada&lt;/strong&gt;. Es lo que se hace en la mitad inferior de la siguiente imagen:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4wsBeVSr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/3T/ImportStatic.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4wsBeVSr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/3T/ImportStatic.png" alt="Importación de paquetes" title="Distintas alternativas para hacer referencia al contenido de paquetes Java"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Relación entre clases, paquetes y el sistema de archivos
&lt;/h2&gt;

&lt;p&gt;En Java existe una estrecha relación entre &lt;strong&gt;las definiciones de paquetes y clases y el sistema de archivos local&lt;/strong&gt; , en el que se almacenan los módulos conteniendo el código. Es un hecho que puede pasarnos totalmente inadvertido al trabajar con un IDE como el de NetBeans, ya que sus opciones se encargan de ocultar estos detalles. No obstante, &lt;strong&gt;es interesante que conozcamos dicha relación&lt;/strong&gt; ya que esto nos permitirá, en caso de necesidad, trabajar directamente con el JDK.&lt;/p&gt;

&lt;p&gt;Cada módulo de código de un proyecto Java únicamente puede contener una clase pública, cuyo nombre, respetando mayúsculas y minúsculas, debe coincidir con el del módulo. Es decir, existe una &lt;strong&gt;correspondencia directa entre los identificadores de clase y archivos en los que se alojan&lt;/strong&gt;. Esto no afecta a las clases anidadas y otras clases no públicas que pudiesen definirse en el mismo módulo.&lt;/p&gt;

&lt;p&gt;El &lt;strong&gt;nombre del paquete establece además el nombre de la carpeta donde se alojan los módulos de código&lt;/strong&gt; contenidos en el paquete. Los nombres de paquete pueden ser compuestos, usándose el punto como separador de las diferentes porciones del identificador. Cada parte identificaría a un subdirectorio, según se muestra en el siguiente esquema:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KEQJ8pDi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/3T/FilesystemScheme.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KEQJ8pDi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/3T/FilesystemScheme.png" alt="Esquema sistema de archivos" title="Esquema de la correspondencia entre el sistema de archivos y la definición de paquetes y clases"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Al trabajar desde la línea de comandos, usando directamente el JDK, hemos de tener en cuenta que tanto la compilación como la ejecución verificarán que se &lt;strong&gt;satisface la correspondencia entre el nombre de paquete y clase y la estructura de directorios y nombre de archivo&lt;/strong&gt;. Si esta no se cumple en algún punto, como ocurre en la parte inferior de la siguiente imagen, se obtiene un error.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7TgwSxcJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/3T/PackageFilesystem.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7TgwSxcJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/3T/PackageFilesystem.png" alt="Relación entre paquete y sistema de archivos" title="La clase Cuenta pertenece al paquete com.campusmvp.contabilidad, denominación que condiciona la jerarquía de carpetas en el sistema de archivos"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt; : la estructura de directorios de un paquete puede almacenarse completa, una vez se compila el proyecto, en un archivo JAR. Este contendría asimismo los archivos de clase de cada módulo de código.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A continuación puedes ver un &lt;strong&gt;vídeo práctico explicativo&lt;/strong&gt; de todo lo anterior, que está extraído directamente del &lt;strong&gt;&lt;a href="https://www.campusmvp.es/recursos/catalogo/Product-Desarrollo-de-aplicaciones-con-la-plataforma-Java_231.aspx"&gt;curso de programación con Java&lt;/a&gt;&lt;/strong&gt; de campusMVP:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/x4BDc-VGeZY"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Post original escrito por Franciso Charte en &lt;a href="https://www.campusmvp.es/recursos/post/paquetes-en-java-que-son-para-que-se-utilizan-y-como-se-usan.aspx"&gt;campusMVP&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>java</category>
      <category>spanish</category>
    </item>
    <item>
      <title>5 motivos por los que utilizar Java para desarrollar tus aplicaciones</title>
      <dc:creator>campusMVP</dc:creator>
      <pubDate>Wed, 10 Apr 2019 08:00:00 +0000</pubDate>
      <link>https://dev.to/campusmvp/5-motivos-por-los-que-utilizar-java-para-desarrollar-tus-aplicaciones-2k32</link>
      <guid>https://dev.to/campusmvp/5-motivos-por-los-que-utilizar-java-para-desarrollar-tus-aplicaciones-2k32</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Post original: &lt;a href="https://www.campusmvp.es/recursos/post/5-motivos-por-los-que-utilizar-java-para-desarrollar-tus-aplicaciones.aspx"&gt;https://www.campusmvp.es/recursos/post/5-motivos-por-los-que-utilizar-java-para-desarrollar-tus-aplicaciones.aspx&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Java es una &lt;a href="https://www.campusmvp.es/recursos/post/Descifrando-Java-lenguaje-plataforma-ediciones-implementaciones.aspx"&gt;plataforma de desarrollo&lt;/a&gt; de propósito general cuya principal oferta de valor siempre ha sido "Escribe una vez, ejecuta en todas partes". En la actualidad es prácticamente ubicua: puedes encontrar aplicaciones Java desde pequeños dispositivos conectados del "Internet de las Cosas" (IoT), hasta servidores, pasando por aplicaciones de gestión en escritorio, desarrollos para móviles, videojuegos...&lt;/p&gt;

&lt;p&gt;Existen diversos motivos, técnicos y no técnicos, para la popularidad de Java, pero &lt;strong&gt;¿cuáles son las principales propuestas de valor TÉCNICAS para desarrollar con Java?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Seguro que hay muchas más, y desde luego las siguientes no son exclusivas de Java en su mayor parte, pero la combinación de todas ellas, por lo que nos cuentan &lt;a href="https://www.campusmvp.es/recursos/catalogo/Product-Desarrollo-de-aplicaciones-con-la-plataforma-Java_231.aspx"&gt;nuestros alumnos de Java&lt;/a&gt;, es lo que suelen valorar las empresas:&lt;/p&gt;

&lt;h2&gt;
  
  
  1.- Es multiplataforma
&lt;/h2&gt;

&lt;p&gt;Aunque en la actualidad no es una ventaja tan grande como lo era cuando nació y hay muchas otras plataformas que ofrecen multiplataforma, lo cierto es que el hecho de que Java funcione en prácticamente cualquier dispositivo, servidor o sistema operativo, sigue siendo uno de sus principales atractivos para mucha gente.&lt;/p&gt;

&lt;p&gt;Existe una implementación de la &lt;a href="https://www.campusmvp.es/recursos/post/que-es-la-maquina-virtual-de-java-o-java-virtual-machine.aspx"&gt;máquina virtual de Java&lt;/a&gt; para casi cualquier sistema que se nos ocurra.&lt;/p&gt;

&lt;p&gt;Además no debemos olvidar que Java se diseñó inicialmente para ejecutarse en dispositivos embebidos, con muchas limitaciones de memoria y potencia, por lo que, dependiendo de dónde lo ejecutemos, puede resultar de gran ayuda apoyarse en el lenguaje.&lt;/p&gt;

&lt;h2&gt;
  
  
  2.- El código Java es robusto
&lt;/h2&gt;

&lt;p&gt;Hay otros lenguajes como C++ que ofrecen más rendimiento y mayor control, pero que son mucho más difíciles de manejar sin meter la pata. Java es un lenguaje que ofrece manejo automático de la memoria y cuyos objetos no hacen referencia a datos fuera de sí mismos o de otros objetos de Java. Esto hace imposible que una instrucción de Java pueda corromper la memoria, ni "pisar" o comprometer los datos de otras aplicaciones o del propio sistema operativo. La máquina virtual realiza todo tipo de comprobaciones para asegurar la integridad que impiden que pueda romper el sistema operativo u otros programas.&lt;/p&gt;

&lt;p&gt;También &lt;a href="https://www.campusmvp.es/recursos/post/Modelos-de-gestion-de-memoria-II-Garbage-collector.aspx"&gt;gestiona la liberación de memoria&lt;/a&gt; de manera automática, por lo que la usa eficientemente sin que el programador tenga que preocuparse de nada.&lt;/p&gt;

&lt;p&gt;Nuevamente, esto no es exclusivo de Java, ya que otras plataformas, como .NET, disponen de las mismas protecciones, pero es una ventaja frente a plataformas más tradicionales.&lt;/p&gt;

&lt;h2&gt;
  
  
  3.- Es orientada a objetos
&lt;/h2&gt;

&lt;p&gt;Otra cuestión que no llama la atención por especial en la actualidad, pero a mediados de los años 90, cuando se lanzó Java, no era algo tan frecuente como lo es ahora. Gracias a su orientación a objetos es más fácil crear aplicaciones modulares y reutilizar partes de las mismas, además de que permite implementar mejores patrones de diseño probados que contribuyen a la robustez que se comentaba en el apartado anterior.&lt;/p&gt;

&lt;p&gt;También es uno de los motivos de que la propia plataforma sea tan extensible y disponga de tantas funcionalidades nativas o añadidas.&lt;/p&gt;

&lt;p&gt;Lo cual nos lleva a...&lt;/p&gt;

&lt;h2&gt;
  
  
  4.- Funcionalidad de base y mucho código Open Source
&lt;/h2&gt;

&lt;p&gt;Aparte de la enorme cantidad de funcionalidad base que ya incluye la propia plataforma listo para ser utilizado, con Java dispones de muchísimo código de terceros listo para ser utilizado.&lt;/p&gt;

&lt;p&gt;Entre que lleva bastante más de dos décadas entre nosotros y que la comunidad es enorme, existen infinidad de bibliotecas y utilidades creadas para extender la funcionalidad y mejorar la plataforma Java.&lt;/p&gt;

&lt;p&gt;Casi cualquier cosa que puedas necesitar seguro que la encuentras ya creada en algún proyecto de código abierto. No solo eso: mucha de las bibliotecas más conocidas y utilizadas las han creado y las mantienen grandes organizaciones como Google, Facebook o la fundación Apache, lo cual siempre es una garantía adicional.&lt;/p&gt;

&lt;p&gt;Esto facilita mucho la vida de los programadores y no existen muchas otras plataformas que puedan aportar la misma exuberante variedad de código utilizable.&lt;/p&gt;

&lt;h2&gt;
  
  
  5.- Java es relativamente fácil de aprender
&lt;/h2&gt;

&lt;p&gt;Comparado con lenguajes clásicos como C o C++, desde luego. En general se puede decir que Java no es un lenguaje más difícil de aprender que cualquier otro, especialmente otros modernos como C# o Swift, pero sí que es más fácil de aprender que muchos otros.&lt;/p&gt;

&lt;p&gt;Gracias a &lt;a href="https://www.campusmvp.es/recursos/post/Los-mejores-entornos-de-desarrollo-para-Java.aspx"&gt;herramientas especializadas&lt;/a&gt; (¡y gratuitas!) como NetBeans y otros editores o entornos de desarrollo, la compilación, depuración y despliegue es muy sencillo y comenzar con él muy fácil.&lt;/p&gt;

&lt;p&gt;Como cualquier plataforma compleja y de propósito general como esta, tienes dos retos al aprenderla:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Hay tanta funcionalidad que es difícil saber por dónde empezar y cuáles de las, literalmente, miles de clases disponibles debes aprender.&lt;/li&gt;
&lt;li&gt;A medida que aprendes y profundizas la cosa se vuelve más compleja y necesitas dominar mejor los fundamentos para poder salir adelante.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3iHwZk4g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/1T/java-ventajas.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3iHwZk4g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/1T/java-ventajas.png" alt="Imagen ornamental"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ninguna de estas ventajas es exclusiva de Java y se puede aplicar a otras plataformas, especialmente a .NET y el lenguaje C#. Sin embargo, la combinación de lo que hemos dicho con el hecho de llevar tanto tiempo en el mercado, la enorme comunidad de desarrolladores que hay por todo el mundo y la gran demanda existente en empresas e instituciones, crea un "círculo virtuoso" que hace que Java sea desde hace muchos años la plataforma de desarrollo más importante.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Post original: &lt;a href="https://www.campusmvp.es/recursos/post/5-motivos-por-los-que-utilizar-java-para-desarrollar-tus-aplicaciones.aspx"&gt;https://www.campusmvp.es/recursos/post/5-motivos-por-los-que-utilizar-java-para-desarrollar-tus-aplicaciones.aspx&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>java</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Contenedores: cómo es el ciclo de vida de una aplicación en Kubernetes</title>
      <dc:creator>campusMVP</dc:creator>
      <pubDate>Thu, 21 Mar 2019 08:00:00 +0000</pubDate>
      <link>https://dev.to/campusmvp/contenedores-como-es-el-ciclo-de-vida-de-una-aplicacion-en-kubernetes-1ief</link>
      <guid>https://dev.to/campusmvp/contenedores-como-es-el-ciclo-de-vida-de-una-aplicacion-en-kubernetes-1ief</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Post original escrito por &lt;strong&gt;Eduard Tomás&lt;/strong&gt; en &lt;a href="https://www.campusmvp.es/recursos/post/contenedores-como-es-el-ciclo-de-vida-de-una-aplicacion-en-kubernetes.aspx"&gt;campusMVP&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hace poco os explicaba en un artículo &lt;strong&gt;&lt;a href="https://dev.to/campusmvp/qu-es-kubernetes-y-cmo-funciona-mbd-temp-slug-5971176"&gt;qué es Kubernetes, cuál es su arquitectura y su funcionamiento básico&lt;/a&gt;&lt;/strong&gt;. Léelo antes de continuar si no tienes claros estos conceptos.&lt;/p&gt;

&lt;p&gt;En esta ocasión voy a continuar con aquella explicación analizando cómo es el ciclo de vida de una aplicación que está desplegada con Kubernetes.&lt;/p&gt;

&lt;p&gt;Lo primero que debemos tener claro es que &lt;strong&gt;en Kubernetes nunca se ejecutan contenedores de forma directa&lt;/strong&gt;. Es decir, no se puede desplegar un contenedor o parar un contenedor. En su lugar se opera con lo que se llaman &lt;strong&gt;&lt;em&gt;pods&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Un &lt;em&gt;pod&lt;/em&gt; es la unidad mínima de despliegue y operación en Kubernetes&lt;/strong&gt;. Es decir, desplegamos &lt;em&gt;pods&lt;/em&gt;, escalamos &lt;em&gt;pods&lt;/em&gt; y son los &lt;em&gt;pods&lt;/em&gt; los que se ejecutan en los distintos nodos.&lt;/p&gt;

&lt;p&gt;La relación entre &lt;em&gt;pod&lt;/em&gt; y contenedor no tiene por qué ser de uno a uno: es decir,  &lt;strong&gt;en un único &lt;em&gt;pod&lt;/em&gt; se pueden ejecutar varios contenedores&lt;/strong&gt;. Solo recuerda que en este caso se escalarán y desplegarán de forma conjunta (ya que se escala o despliega todo el &lt;em&gt;pod&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Aunque es posible, teóricamente, desplegar en un &lt;em&gt;pod&lt;/em&gt; una web y su API en dos contenedores, eso no es lo que suele hacer. En la gran mayoría de casos las relaciones entre &lt;em&gt;pod&lt;/em&gt; y contenedor son, efectivamente, de uno a uno. Pero que un &lt;em&gt;pod&lt;/em&gt; pueda ejecutar varios contenedores habilita ciertos escenarios avanzados como p. ej. tener un contenedor que ofrezca servicios a otro contenedor (como podría ser hacer de &lt;em&gt;proxy&lt;/em&gt;, de &lt;em&gt;logger&lt;/em&gt; o similar).&lt;/p&gt;

&lt;p&gt;Es importante tener presente que &lt;strong&gt;todos los contenedores que se ejecutan en un mismo &lt;em&gt;pod&lt;/em&gt; comparten espacio de red&lt;/strong&gt;. Es decir, se comunican entre ellos usando &lt;em&gt;localhost&lt;/em&gt; y no pueden abrir los mismos puertos. También comparten el espacio &lt;a href="https://es.wikipedia.org/wiki/Comunicaci%C3%B3n_entre_procesos"&gt;IPC&lt;/a&gt; por lo que pueden usar cualquier técnica de IPC (como semáforos) para comunicarse entre ellos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Los distintos estados de un &lt;em&gt;pod&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Un &lt;em&gt;pod&lt;/em&gt; pasa por varias fases a lo largo de su ciclo de vida:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Pending&lt;/em&gt;&lt;/strong&gt; : el &lt;em&gt;pod&lt;/em&gt; ha sido creado, pero aún no se han creado sus contenedores ni se ha decidido qué nodo lo va a ejecutar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Running&lt;/em&gt;&lt;/strong&gt; : los contenedores del &lt;em&gt;pod&lt;/em&gt; han sido creados y el &lt;em&gt;pod&lt;/em&gt; ya se está ejecutando en un nodo. Al menos un contenedor del &lt;em&gt;pod&lt;/em&gt; se está ejecutando o está en proceso de creación.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Esto es importante&lt;/strong&gt; : que un &lt;em&gt;pod&lt;/em&gt; esté en estado &lt;em&gt;running&lt;/em&gt; no significa que sus contenedores estén ejecutándose. P. ej. se pueden estar iniciando o reiniciando.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Succeeded&lt;/em&gt;&lt;/strong&gt; : los contenedores del &lt;em&gt;pod&lt;/em&gt; han finalizado (todos) su ejecución de forma satisfactoria.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Failed&lt;/em&gt;&lt;/strong&gt; : los contenedores del &lt;em&gt;pod&lt;/em&gt; han finalizado (todos) su ejecución y al menos uno de ellos lo ha hecho con error.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Unknown&lt;/em&gt;&lt;/strong&gt; : el estado del &lt;em&gt;pod&lt;/em&gt; no se puede saber. Esto suele indicar un error de comunicación con el nodo &lt;em&gt;minion&lt;/em&gt; que está ejecutando el &lt;em&gt;pod&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;CrashLoopBackOff&lt;/em&gt;&lt;/strong&gt; : el &lt;em&gt;pod&lt;/em&gt; está corriendo, pero uno de sus contenedores se está reiniciando debido a que ha terminado (generalmente de forma errónea).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Es importante &lt;strong&gt;separar el ciclo de vida del &lt;em&gt;pod&lt;/em&gt; del ciclo de vida de sus contenedores&lt;/strong&gt;. Un &lt;em&gt;pod&lt;/em&gt; puede estar en la fase de &lt;em&gt;running&lt;/em&gt; pero uno de sus contenedores puede no estar ejecutándose. Cuando un &lt;em&gt;pod _está en fase de _CrashLoopBackOff&lt;/em&gt; eso significa que uno de los contenedores está en proceso de reinicio, pero otros contenedores del &lt;em&gt;pod&lt;/em&gt; pueden estar ejecutándose.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Muchas veces se dice que Kubernetes reinicia un &lt;em&gt;pod&lt;/em&gt; pero esa expresión no es estrictamente cierta: Kubernetes reinicia contenedores de un &lt;em&gt;pod&lt;/em&gt;, pero el &lt;em&gt;pod&lt;/em&gt; en sí mismo sigue ejecutándose durante todo este tiempo. Que Kubernetes decida reiniciar o no los contenedores de un &lt;em&gt;pod&lt;/em&gt; (y en qué casos) depende de la configuración del &lt;em&gt;pod&lt;/em&gt;. Es decir, para ciertos &lt;em&gt;pods&lt;/em&gt; no hay posibilidad de que entren nunca en fase de &lt;em&gt;Succeeded&lt;/em&gt; ya que su misión es estar ejecutándose permanentemente (p. ej. una API), por lo que si un contenedor termina será reiniciado por Kubernetes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Los &lt;em&gt;pods&lt;/em&gt; se consideran "objetos transitorios", en el sentido de que hay determinados eventos del clúster a los cuales no sobreviven. P. ej. si el nodo &lt;em&gt;minion&lt;/em&gt; se cae, todos los &lt;em&gt;pods&lt;/em&gt; que se estén ejecutándose en él se caen también. &lt;strong&gt;Los &lt;em&gt;pods&lt;/em&gt; no se mueven de nodo ni se reinician&lt;/strong&gt; (sí se reinician sus contenedores como se ha comentado antes).&lt;/p&gt;

&lt;p&gt;En general &lt;strong&gt;no se suele crear nunca &lt;em&gt;pods&lt;/em&gt; de forma directa&lt;/strong&gt; , en su lugar usamos lo que llamamos un &lt;strong&gt;controlador&lt;/strong&gt;. Un controlador es el responsable de garantizar que en todo momento se cumple una cierta condición al respecto de los &lt;em&gt;pods&lt;/em&gt; que controla, como que en todo momento haya N instancias de este &lt;em&gt;pod&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hago aquí un inciso de nomenclatura: cuando digo "N instancias de un &lt;em&gt;pod&lt;/em&gt;" me refiero a N &lt;em&gt;pods _idénticos (ejecutando los mismos contenedores y con la misma configuración) pero son N _pods&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Si estamos usando un controlador y deseamos tener en todo momento 2 instancias de un determinado &lt;em&gt;pod&lt;/em&gt; y uno de los dos &lt;em&gt;pods&lt;/em&gt; se muere (porque se muere su nodo p. ej.), el controlador creará otro &lt;em&gt;pod&lt;/em&gt; para asegurar de que siga habiendo dos instancias.&lt;/p&gt;

&lt;p&gt;Cuando tenemos N instancias, los N &lt;em&gt;pods&lt;/em&gt; se consideran todos "idénticos". Si por algún motivo (p. ej. debe desescalarse) debe eliminarse algún &lt;em&gt;pod&lt;/em&gt;, el controlador eliminará uno cualquiera, sin preferencias. Eso encaja con el modelo &lt;em&gt;stateless&lt;/em&gt; de aplicación en el que los contenedores encajan perfectamente. Es decir, como desarrollador debes asegurar que tus contenedores sean &lt;em&gt;stateless&lt;/em&gt;, ya que en cualquier momento Kubernetes puede decidir eliminar el &lt;em&gt;pod&lt;/em&gt; (y por lo tanto el contenedor) y recrearlo en otra parte.&lt;/p&gt;

&lt;p&gt;Este modelo &lt;em&gt;stateless&lt;/em&gt; no siempre aplica: a veces, si tenemos N instancias de un &lt;em&gt;pod&lt;/em&gt; hay alguno que juega un rol especial y por lo tanto se requiere que estos tengan identidad. Un ejemplo es una configuración de base de datos en modo maestro/esclavo. Si uno de los &lt;em&gt;pods&lt;/em&gt; se cae, el nuevo que se cree debe ser del mismo tipo, y no solo eso, sino que debe recibir el estado que tenía el &lt;em&gt;pod&lt;/em&gt; caído. Kubernetes es capaz de gestionar estos casos mediante un controlador específico (llamado &lt;code&gt;StatefulSet&lt;/code&gt;), pero lo ideal es que nuestras aplicaciones sean &lt;em&gt;stateless&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Post original escrito por &lt;strong&gt;Eduard Tomás&lt;/strong&gt; en &lt;a href="https://www.campusmvp.es/recursos/post/contenedores-como-es-el-ciclo-de-vida-de-una-aplicacion-en-kubernetes.aspx"&gt;campusMVP&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>docker</category>
      <category>kubernetes</category>
      <category>tools</category>
      <category>spanish</category>
    </item>
    <item>
      <title>10 Diferencias entre .NET Core y .NET Framework</title>
      <dc:creator>campusMVP</dc:creator>
      <pubDate>Tue, 19 Mar 2019 08:00:00 +0000</pubDate>
      <link>https://dev.to/campusmvp/10-diferencias-entre-net-core-y-net-framework-3e5o</link>
      <guid>https://dev.to/campusmvp/10-diferencias-entre-net-core-y-net-framework-3e5o</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Post original escrito por &lt;strong&gt;José María Aguilar&lt;/strong&gt; en &lt;a href="https://www.campusmvp.es/recursos/post/10-diferencias-entre-net-core-y-net-framework.aspx" rel="noopener noreferrer"&gt;campusMVP&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Seguro que todos los desarrolladores que trabajáis normalmente usando herramientas Microsoft habéis oído hablar bastante de .NET Core en los últimos tiempos. Incluso quizás muchos de vosotros habéis tenido oportunidad de trabajar con este nuevo &lt;em&gt;framework&lt;/em&gt; y ya conocéis sus principales características y las bondades (e incluso algún que otro inconveniente) que ofrece sobre el ya clásico .NET Framework.&lt;/p&gt;

&lt;p&gt;Pero probablemente sois muchos también los que sólo lo conocéis de oídas, pues vuestro día a día está más enfocado al mantenimiento de sistemas existentes, o quizás trabajáis sobre tecnologías que están ancladas a versiones determinadas del &lt;em&gt;framework&lt;/em&gt; .NET, o simplemente el fragor de la batalla diaria no os deja tiempo para explorar nuevos horizontes.&lt;/p&gt;

&lt;p&gt;Si este último es tu caso, lo mínimo que debes saber es que &lt;strong&gt;.NET Core es una implementación del estándar .NET que&lt;/strong&gt; , al igual que otras implementaciones como .NET Framework o Mono, &lt;strong&gt;incluye todo lo necesario para crear y ejecutar aplicaciones&lt;/strong&gt; : como los &lt;a href="https://github.com/dotnet/roslyn" rel="noopener noreferrer"&gt;compiladores&lt;/a&gt;, las &lt;a href="https://github.com/dotnet/corefx" rel="noopener noreferrer"&gt;bibliotecas de clases básicas&lt;/a&gt; o la &lt;a href="https://github.com/dotnet/coreclr" rel="noopener noreferrer"&gt;máquina virtual o &lt;em&gt;runtime&lt;/em&gt;&lt;/a&gt; que proporciona el entorno donde se ejecutan las aplicaciones.&lt;/p&gt;

&lt;p&gt;En otras palabras, con .NET Core puedes crear una aplicación con lenguajes como C# o VB.NET, utilizar en ella clases básicas como las habituales &lt;code&gt;string&lt;/code&gt;, &lt;code&gt;int&lt;/code&gt; o &lt;code&gt;List&amp;lt;T&amp;gt;&lt;/code&gt;, compilarla a &lt;a href="https://es.wikipedia.org/wiki/Common_Intermediate_Language" rel="noopener noreferrer"&gt;&lt;em&gt;bytecode&lt;/em&gt; CIL&lt;/a&gt; y ejecutarla en tu ordenador.&lt;/p&gt;

&lt;p&gt;Entonces, &lt;strong&gt;¿qué diferencia a .NET Core de .NET Framework?&lt;/strong&gt; Pues precisamente eso es lo que vamos a ver en este artículo 😉&lt;/p&gt;

&lt;h2&gt;
  
  
  1. NET Core es nuevo, y escrito prácticamente desde cero
&lt;/h2&gt;

&lt;p&gt;.NET Core es, en muchos sentidos, &lt;strong&gt;un &lt;em&gt;reboot&lt;/em&gt; de .NET Framework&lt;/strong&gt; y ha tenido que ser reescrito desde cero. Obviamente se han aprovechado las APIs, ya estandarizadas y conocidas por todos los desarrolladores, pero internamente se han vuelto a implementar muchos componentes para poder lograr los ambiciosos objetivos que se plantearon en su diseño y que veremos en algunos puntos siguientes.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. .NET Core es &lt;em&gt;open source&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Aunque determinados componentes del &lt;em&gt;stack&lt;/em&gt; clásico, como ASP.NET MVC o Entity Framework, habían sido &lt;a href="https://en.wikipedia.org/wiki/.NET_Framework#Licensing" rel="noopener noreferrer"&gt;publicados bajo licencias &lt;em&gt;open source&lt;/em&gt;&lt;/a&gt;, .NET Framework no era un marco de trabajo abierto en su totalidad y aún tiene piezas distribuidas bajo licencias propietarias.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.NET Core es un proyecto completamente &lt;em&gt;open source&lt;/em&gt; desde sus orígenes&lt;/strong&gt;. De hecho, aunque dirigido y soportado oficialmente por Microsoft, el proyecto pertenece a la &lt;a href="https://dotnetfoundation.org/" rel="noopener noreferrer"&gt;.NET Foundation&lt;/a&gt; y en su desarrollo están involucrados activamente cientos de desarrolladores de todo el mundo, que pueden participar en su diseño y realizar contribuciones de cualquier tipo al &lt;em&gt;framework&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. .NET Core es multiplataforma
&lt;/h2&gt;

&lt;p&gt;Sin duda, una de las características .NET Core que más lo diferencian respecto a sus predecesores es su &lt;strong&gt;capacidad real de funcionar en múltiples plataformas&lt;/strong&gt; , incluyendo algunas impensables hace sólo algunos años, como Linux o macOS.&lt;/p&gt;

&lt;p&gt;Los SDK y &lt;em&gt;runtimes&lt;/em&gt; &lt;a href="https://dotnet.microsoft.com/download" rel="noopener noreferrer"&gt;están disponibles para una gran variedad de sistemas operativos y distribuciones&lt;/a&gt; (Windows, macOS, Ubuntu, RHEL, Debian, Fedora, CentOS...), lo que hace que sea posible desarrollar aplicaciones sobre cualquiera de las plataformas soportadas y ejecutarlas también sobre cualquiera ellas. De esta forma, ahora sería totalmente posible, por ejemplo, programar una aplicación en Windows y ejecutarla en un Mac, o desarrollarla en Mac y ejecutarla en una distribución Debian de Linux.&lt;/p&gt;

&lt;p&gt;De la misma forma, es &lt;strong&gt;compatible con distintas arquitecturas de procesador&lt;/strong&gt; , como x64, x86 o ARM, lo que posibilita su uso en diversos tipos de dispositivo.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. .NET Core es modular
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;.NET Framework es un bloque monolítico&lt;/strong&gt; que ha ido creciendo con el tiempo hasta convertirse en algo difícil de manejar. Por ejemplo, las distintas versiones o revisiones actualizan el &lt;em&gt;framework&lt;/em&gt; completo, muchas veces sobrescribiendo las versiones anteriormente instaladas (con los problemas que esto podría provocar). También, suelen estar bastante distanciadas en el tiempo, porque se trata de actualizaciones completas del marco de trabajo.&lt;/p&gt;

&lt;p&gt;En cambio, &lt;strong&gt;.NET Core está formado por distintas piezas distribuidas a través de paquetes NuGet&lt;/strong&gt;. De esta forma, las correcciones a bugs o mejoras en componentes concretos pueden distribuirse y actualizarse de forma independiente al resto, sólo actualizando el paquete correspondiente. Sin duda, un modelo mucho más ágil y eficiente que el anterior, y que permite un ritmo de evolución mucho más rápido.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Las operaciones principales de .NET Core se realizan desde línea de comandos
&lt;/h2&gt;

&lt;p&gt;Para conseguir ser &lt;em&gt;cross platform&lt;/em&gt; real, era absolutamente imprescindible que las herramientas de .NET Core estuviesen disponibles en Windows, Linux y Mac. ¿Y cómo conseguirlo de la forma más sencilla? Pues acudiendo al denominador común: la línea de comandos.&lt;/p&gt;

&lt;p&gt;A diferencia de .NET Framework, donde a veces nos encontrábamos casi obligados a utilizar Visual Studio, &lt;strong&gt;para compilar, ejecutar, testear o publicar aplicaciones .NET Core basta con tener a mano la línea de comandos&lt;/strong&gt; de cada sistema operativo y utilizar las órdenes de la CLI (&lt;em&gt;Command Line Interface&lt;/em&gt;) proporcionada por el &lt;em&gt;framework&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Aquí tienes algunos ejemplos de comandos en acción:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C:\Test&amp;gt;dotnet new console
Preparándose...
La plantilla "Console Application" se creó correctamente.

Procesando acciones posteriores...
Ejecutando "dotnet restore" en C:\Test\Test.csproj...
  Restaurando paquetes para C:\Test\Test.csproj...
  Generación de archivo MSBuild C:\Test\obj\Test.csproj.nuget.g.props.
  Generación de archivo MSBuild C:\Test\obj\Test.csproj.nuget.g.targets.
  Restauración realizada en 147,78 ms para C:\Test\Test.csproj.

Restauración correcta.

C:\Test&amp;gt;dotnet build
Microsoft (R) Build Engine versión 15.9.20+g88f5fadfbe para .NET Core
Copyright (C) Microsoft Corporation. Todos los derechos reservados.

  Restauración realizada en 23,44 ms para C:\Test\Test.csproj.
  Test -&amp;gt; C:\Test\bin\Debug\netcoreapp2.2\Test.dll

Compilación correcta.
    0 Advertencia(s)
    0 Errores

Tiempo transcurrido 00:00:00.52

C:\Test&amp;gt;dotnet run
Hello World!

C:\Test&amp;gt;_

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. .NET Core puede distribuirse de varias formas
&lt;/h2&gt;

&lt;p&gt;Como seguramente sabes ya, .NET Framework se distribuye a través paquetes descargables que se instalan en el equipo de forma única, es decir, &lt;strong&gt;sólo puede existir una copia a nivel de equipo&lt;/strong&gt;. Además, determinadas versiones (principalmente actualizaciones) sobrescriben la versión instalada anteriormente, por lo que puede dar lugar a problemas si tenemos aplicaciones que dependen de versiones específicas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.NET Core es mucho más flexible en este sentido&lt;/strong&gt; : el &lt;em&gt;framework&lt;/em&gt; puede estar instalado a nivel de equipo, como .NET Framework, pero también podemos hacerlo a nivel de usuario o incluso a nivel de aplicación (es decir, que cada aplicación incluya su propia copia de .NET Core).&lt;/p&gt;

&lt;p&gt;Además, &lt;strong&gt;distintas versiones y revisiones pueden convivir sin problemas&lt;/strong&gt; en el mismo equipo. Por ejemplo, la siguiente traza de consola muestra el resultado de invocar el comando &lt;code&gt;dotnet --info&lt;/code&gt;, donde aparecen las distintas versiones del SDK y &lt;em&gt;runtimes&lt;/em&gt; instalados en mi equipo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C:\&amp;gt;dotnet --info
SDK de .NET Core (reflejando cualquier global.json):
 Version: 2.2.102
 Commit: 96ff75a873

Entorno de tiempo de ejecución:
 OS Name: Windows
 OS Version: 10.0.17763
 OS Platform: Windows
 RID: win10-x64
 Base Path: C:\Program Files\dotnet\sdk\2.2.102\

Host (useful for support):
  Version: 2.2.1
  Commit: 878dd11e62

.NET Core SDKs installed:
  1.1.11 [C:\Program Files\dotnet\sdk]
  2.1.202 [C:\Program Files\dotnet\sdk]
  2.1.503 [C:\Program Files\dotnet\sdk]
  2.2.102 [C:\Program Files\dotnet\sdk]

.NET Core runtimes installed:
  Microsoft.AspNetCore.All 2.1.7 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.All 2.2.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All]
  Microsoft.AspNetCore.App 2.1.7 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.AspNetCore.App 2.2.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 1.0.13 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 1.1.10 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.0.9 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.1.7 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.NETCore.App 2.2.1 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]

To install additional .NET Core runtimes or SDKs:
  https://aka.ms/dotnet-download

C:\&amp;gt;_

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  7. .NET Core no soporta todos los modelos de aplicación ni todos los &lt;em&gt;frameworks&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Lo más habitual es que a la hora de construir aplicaciones lo hagamos &lt;em&gt;subidos a hombros de gigantes&lt;/em&gt;, es decir, utilizamos &lt;em&gt;frameworks&lt;/em&gt; que nos ayudan a desarrollar más rápidamente y con menos errores. Por ejemplo, si vamos a crear una aplicación web, lo habitual es usar ASP.NET, si nuestra aplicación es de escritorio podríamos usar WinForms o WPF, o si vamos a acceder a datos, una opción razonable es Entity Framework.&lt;/p&gt;

&lt;p&gt;Pues bien, muchos de estos &lt;em&gt;frameworks&lt;/em&gt; sólo funcionan sobre las plataformas para las que han sido creados. Por ejemplo, SignalR, ASP.NET MVC o Entity Framework 6 sólo funcionarán sobre .NET Framework porque es el &lt;em&gt;framework&lt;/em&gt; para el que han sido construidos.&lt;/p&gt;

&lt;p&gt;Como consecuencia, a día de hoy, &lt;strong&gt;con .NET Core 2.x sólo podemos crear determinados tipos de aplicaciones&lt;/strong&gt; : consola, web (ASP.NET Core) y Xamarin. Esto limita algo las posibilidades de uso de este &lt;em&gt;framework&lt;/em&gt;, pero, afortunadamente, esto va a cambiar en un futuro próximo: previsto para 2019, &lt;strong&gt;.NET Core 3.0 incluirá soporte para WPF y Windows Forms&lt;/strong&gt; , que se beneficiarán de algunas de las ventajas que aportan este nuevo marco de trabajo.&lt;/p&gt;

&lt;p&gt;En definitiva, &lt;strong&gt;a la hora de desarrollar con .NET Core debemos utilizar marcos de trabajo específicos para esta plataforma&lt;/strong&gt; , como ASP.NET Core, Entity Framework Core o SignalR Core.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. En .NET Core el rendimiento es algo prioritario
&lt;/h2&gt;

&lt;p&gt;Desde sus orígenes, &lt;strong&gt;en .NET Core el rendimiento ha sido siempre una prioridad&lt;/strong&gt; , y esto se pone de manifiesto en los &lt;em&gt;benchmarks&lt;/em&gt; que demuestran que este &lt;em&gt;framework&lt;/em&gt; supera a su predecesor con creces en este aspecto.&lt;/p&gt;

&lt;p&gt;Por dar algunas cifras, algo tan simple y recurrente como utilizar los métodos &lt;code&gt;IndexOf()&lt;/code&gt; o &lt;code&gt;StartsWith()&lt;/code&gt; sobre una cadena son &lt;strong&gt;un 200% más rápidos en .NET Core que en .NET Framework&lt;/strong&gt;. Un &lt;code&gt;ToString()&lt;/code&gt; sobre el elemento de un &lt;em&gt;enum&lt;/em&gt; &lt;strong&gt;gana un 600% de rendimiento&lt;/strong&gt;. &lt;strong&gt;LINQ es hasta un 300% más eficiente&lt;/strong&gt; en determinados puntos. &lt;code&gt;Lazy&amp;lt;T&amp;gt;&lt;/code&gt; es &lt;strong&gt;un 500% más rápido&lt;/strong&gt;...&lt;/p&gt;

&lt;p&gt;Beneficiarios directos de estas mejoras son los &lt;em&gt;frameworks&lt;/em&gt; específicos como ASP.NET Core o Entity Framework Core. Por ejemplo, el primero de ellos se ha situado ya sólidamente en los &lt;em&gt;top ten&lt;/em&gt; de los marcos de trabajo más rápidos para la web según las &lt;a href="https://www.techempower.com/benchmarks/#section=test&amp;amp;runid=8ca46892-e46c-4088-9443-05722ad6f7fb&amp;amp;hw=ph&amp;amp;test=plaintext" rel="noopener noreferrer"&gt;pruebas TechEmpower&lt;/a&gt; soportando &lt;strong&gt;más de 7 millones de peticiones por segundo&lt;/strong&gt; , algo impensable en ASP.NET 4.x.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.campusmvp.es%2Frecursos%2Fimage.axd%3Fpicture%3D%2F2019%2F1T%2F2019-02-05-16-57-44.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.campusmvp.es%2Frecursos%2Fimage.axd%3Fpicture%3D%2F2019%2F1T%2F2019-02-05-16-57-44.png" alt="Benchmarks de ASP.NET Core"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  9. .NET Core ha sido creado pensando en los &lt;em&gt;tiempos modernos&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Cuando se creó .NET Framework, hace más de quince años, una nube era simplemente un agregado visible de minúsculas gotitas de agua, de cristales de hielo o de ambos, suspendido en la atmósfera y producido por la condensación de vapor de agua (&lt;a href="https://dle.rae.es/?id=QgpwJRv" rel="noopener noreferrer"&gt;RAE dixit&lt;/a&gt;), los contenedores se usaban exclusivamente para almacenar cosas diversas, como mercancías o residuos, y probablemente al hablar de microservicios sólo podíamos pensar en cuartos de baño pequeñitos 😆&lt;/p&gt;

&lt;p&gt;Hoy en día, el &lt;em&gt;cloud&lt;/em&gt; está presente en casi cualquier aspecto del desarrollo, sobre todo en aplicaciones que, de alguna u otra forma, hacen uso de Internet. Los contenedores se han consolidado como una forma simple, ágil y escalable para desplegar aplicaciones, y los microservicios se han demostrado como arquitecturas apropiadas en múltiples escenarios.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.NET Core y los &lt;em&gt;frameworks&lt;/em&gt; construidos sobre él han sido creados teniendo en cuenta todos estos aspectos&lt;/strong&gt;. Sus componentes están diseñados con el enfoque &lt;em&gt;cloud-first&lt;/em&gt; en mente, por lo que se integran a la perfección en infraestructuras de nube. Se trata además de una tecnología especialmente recomendada para la construcción de microservicios, entre otros aspectos, por la facilidad con que pueden ser creados y distribuidos en contenedores.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Se pueden desarrollar aplicaciones .NET Core con cualquier editor o IDE
&lt;/h2&gt;

&lt;p&gt;Ni a nuestros más acérrimos enemigos le desearíamos algo tan terrible como crear aplicaciones para .NET Framework sin Visual Studio. De hecho, aunque técnicamente era evitable, en muchos modelos de aplicación (por ejemplo, WinForms, WPF o ASP.NET) era prácticamente obligatorio utilizar el IDE de Microsoft.&lt;/p&gt;

&lt;p&gt;Por el contrario, &lt;strong&gt;con .NET Core tenemos libertad completa a la hora de elegir el editor&lt;/strong&gt; que utilizaremos en el desarrollo de nuestros proyectos. Si trabajamos sobre Windows, muchos preferimos seguir utilizando Visual Studio en el día a día (al fin y al cabo, es el mejor IDE 😜, pero hay quien prefiere trabajar con Visual Studio Code, o con editores alternativos como Atom, Brackets o Sublime Text. Y si trabajamos desde Linux o Mac, podemos utilizar cualquier editor disponible en dichos entornos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Corolario: .NET Core es tu próximo &lt;em&gt;framework&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Lo queramos o no, &lt;strong&gt;.NET Core se convertirá en algún momento en la herramienta que usaremos en nuestro día a día&lt;/strong&gt;. Aunque en principio .NET Framework seguirá existiendo y Microsoft continuará dándole soporte, la tendencia actual indica que &lt;strong&gt;todo está confluyendo en .NET Core&lt;/strong&gt; : Xamarin, WPF, WinForms, Entity Framework, SignalR o MVC son sólo algunos ejemplos de &lt;em&gt;frameworks&lt;/em&gt; que ya están o van a estar pronto basados en la nueva infraestructura.&lt;/p&gt;

&lt;p&gt;Además, es lógico pensar que estos marcos de trabajo continuarán evolucionando exclusivamente sobre .NET Core. Sólo hay que mirar un poco hacia atrás y ver que en los últimos dos años han aparecido ya varias versiones completas de &lt;em&gt;frameworks&lt;/em&gt; como Entity Framework Core o ASP.NET Core, mientras que EF o ASP.NET MVC "clásicos" apenas han lanzado pequeñas actualizaciones.&lt;/p&gt;

&lt;p&gt;En nuestro &lt;strong&gt;&lt;a href="https://www.campusmvp.es/recursos/catalogo/Product-Desarrollo-Web-con-ASP.NET-Core-2-MVC_227.aspx" rel="noopener noreferrer"&gt;curso de ASP.NET Core MVC&lt;/a&gt;&lt;/strong&gt; se estudia a fondo la creación de aplicaciones Web con el nuevo &lt;em&gt;framework&lt;/em&gt; de Microsoft. ¿A qué esperas para dar el salto?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Post original escrito por &lt;strong&gt;José María Aguilar&lt;/strong&gt; en campusMVP: &lt;a href="https://www.campusmvp.es/recursos/post/10-diferencias-entre-net-core-y-net-framework.aspx" rel="noopener noreferrer"&gt;https://www.campusmvp.es/recursos/post/10-diferencias-entre-net-core-y-net-framework.aspx&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>csharp</category>
      <category>netcore</category>
      <category>spanish</category>
    </item>
    <item>
      <title>SAP hace Open Source su herramienta de análisis de vulnerabilidades para Java y Python</title>
      <dc:creator>campusMVP</dc:creator>
      <pubDate>Fri, 15 Mar 2019 08:00:00 +0000</pubDate>
      <link>https://dev.to/campusmvp/sap-hace-open-source-su-herramienta-de-analisis-de-vulnerabilidades-para-java-y-python-e6c</link>
      <guid>https://dev.to/campusmvp/sap-hace-open-source-su-herramienta-de-analisis-de-vulnerabilidades-para-java-y-python-e6c</guid>
      <description>&lt;p&gt;SAP recientemente ha hecho Open Source y ha liberado por tanto el código de su &lt;a href="https://sap.github.io/vulnerability-assessment-tool/"&gt;herramienta de evaluación de vulnerabilidades de código&lt;/a&gt; VAT (&lt;em&gt;Vulnerability Assesment Tool&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;La herramienta sirve para analizar código de &lt;strong&gt;Java&lt;/strong&gt; y de &lt;strong&gt;Python&lt;/strong&gt; , y ha sido probada durante dos años internamente, realizando más de 20.000 análisis en unos 600 proyectos de la compañía.&lt;/p&gt;

&lt;p&gt;Se centra en la detección de componentes Open Source que utilice tu proyecto y que sean vulnerables, y utiliza tanto análisis estático como &lt;em&gt;testeo&lt;/em&gt; automatizado para determinar el contexto en el que se ejecuta el código y mejorar la precisión de los resultados. Así:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Detecta si hay dependencias de componentes de código abierto que tengan vulnerabilidades conocidas y además te informa de novedades de seguridad relacionadas con ellos.&lt;/li&gt;
&lt;li&gt;Recaba evidencias sobre la ejecución del código vulnerable en diversos contextos de la aplicación&lt;/li&gt;
&lt;li&gt;Da soporte a los desarrolladores para que puedan arreglar los problemas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Trata de abordar todos los problemas especificados en el &lt;a href="https://www.owasp.org/index.php/Top_10-2017_A9-Using_Components_with_Known_Vulnerabilities"&gt;Top10 de OWASP A9&lt;/a&gt;, que suelen ser las causas de la mayor parte de las brechas de seguridad. Utiliza las &lt;a href="https://nvd.nist.gov/"&gt;bases de datos de vulnerabilidades  del gobierno estadounidense&lt;/a&gt;, y la &lt;a href="https://cve.mitre.org/"&gt;lista CVE&lt;/a&gt;. Funciona tanto en desarrollo como en producción.&lt;/p&gt;

&lt;p&gt;Según SAP, la mayor parte de los problemas de seguridad que se producen en las aplicaciones expuestas a Internet son causadas por no actualizar componentes que se sabe que son vulnerables. Muchas empresas tardan meses en hacerlo y otras no lo hacen nunca. Con VAT la idea es que puedas arreglarlas a las pocas horas o como mucho, días.&lt;/p&gt;

&lt;p&gt;Se puede usar directamente como un &lt;strong&gt;contenedor Docker&lt;/strong&gt; para ponerlo a funcionar de manera rápida y sencilla. Y por supuesto se puede descargar el código fuente y compilarlo.&lt;/p&gt;

&lt;p&gt;Aquí te dejamos &lt;a href="https://github.com/SAP/vulnerability-assessment-tool"&gt;la página en Github del proyecto.&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Post original&lt;/strong&gt;: &lt;a href="https://www.campusmvp.es/recursos/post/sap-hace-open-source-su-herramienta-de-analisis-de-vulnerabilidades-para-java-y-python.aspx"&gt;https://www.campusmvp.es/recursos/post/sap-hace-open-source-su-herramienta-de-analisis-de-vulnerabilidades-para-java-y-python.aspx&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>tools</category>
      <category>java</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Descifrando Java: lenguaje, plataforma, ediciones, implementaciones...</title>
      <dc:creator>campusMVP</dc:creator>
      <pubDate>Wed, 13 Feb 2019 10:17:20 +0000</pubDate>
      <link>https://dev.to/campusmvp/descifrando-java-lenguaje-plataforma-ediciones-implementaciones-5dpj</link>
      <guid>https://dev.to/campusmvp/descifrando-java-lenguaje-plataforma-ediciones-implementaciones-5dpj</guid>
      <description>&lt;p&gt;El lenguaje Java se utiliza para programar aplicaciones que pueden ser ejecutadas en distintas plataformas, entre ellas las distintas ediciones de la propia plataforma Java. Esta se encuentra disponible para los sistemas operativos más extendidos, como son Microsoft Windows, Apple OS X y GNU/Linux, así como para otros con un uso más minoritario, como es el caso de Solaris.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;En realidad una aplicación estándar Java, una vez compilada, puede ser ejecutada sobre cualquier sistema para el que haya disponible alguna versión del entorno de ejecución de Java, conocido como JRE (&lt;em&gt;Java Runtime Environment&lt;/em&gt;). Asimismo, también es posible compilar para una plataforma diferente.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Es necesario distinguir claramente entre dos partes muy diferenciadas dentro de la plataforma Java:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  JRE (&lt;em&gt;Java Runtime Environment&lt;/em&gt;): su objeto es aportar el entorno necesario para ejecutar una aplicación Java. Forman parte del JRE la máquina virtual Java o JVM (&lt;em&gt;Java Virtual Machine&lt;/em&gt;), encargada de ejecutar el &lt;em&gt;&lt;a href="https://es.wikipedia.org/wiki/Bytecode" rel="noopener noreferrer"&gt;bytecode&lt;/a&gt;&lt;/em&gt; Java, así como las bibliotecas que ofrecen los servicios definidos en la plataforma.&lt;/li&gt;
&lt;li&gt;  JDK (&lt;em&gt;Java Development Kit&lt;/em&gt;): es el paquete de herramientas precisas para llevar a cabo el desarrollo de dicha aplicación.  Este JDK es un superconjunto del JRE, al que agrega herramientas como el compilador Java. Este toma el código fuente Java y genera como resultado &lt;em&gt;bytecode&lt;/em&gt;, un formato de código objeto independiente del sistema operativo y el hardware.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La siguiente figura ilustra de manera visual la relación existente entre los diferentes componentes de la plataforma Java (pulsa para aumentar):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.campusmvp.es/recursos/image.axd?picture=JRE-JDK.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.campusmvp.es%2Frecursos%2Fimage.axd%3Fpicture%3DJRE-JDK_thumb.png" title="PULSA para aumentar - JRE-JDK" alt="JRE-JDK"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tanto las herramientas aportadas por el JDK como los servicios ofrecidos por el JRE dependerán fundamentalmente de la edición de Java que esté utilizándose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ediciones de la plataforma Java
&lt;/h2&gt;

&lt;p&gt;La configuración de una plataforma Java afecta fundamentalmente a los servicios que esta ofrece, las herramientas adicionales que incorpora y también a aspectos menos visibles, como el modo de funcionamiento de la JVM. De acuerdo a la &lt;a href="http://www.oracle.com/technetwork/java/index.html" rel="noopener noreferrer"&gt;documentación actual de Oracle&lt;/a&gt; podemos distinguir las siguientes cuatro plataformas Java:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Java SE: la conocida como &lt;em&gt;Standard Edition&lt;/em&gt; es la edición más difundida de la plataforma Java. Incorpora los elementos necesarios para crear aplicaciones de escritorio con o sin interfaz gráfica de usuario, acceso al sistema de archivos, comunicación a través de redes, concurrencia y otros servicios básicos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;JavaFX: originalmente JavaFX era una alternativa a Java SE para el desarrollo de proyectos de tipo RIA (&lt;em&gt;Rich Internet Applications&lt;/em&gt;), con un núcleo más ligero y fácil de distribuir, capacidad de aceleración 3D aprovechando la GPU, servicios avanzados para producción de gráficos y animaciones, y un mecanismo simplificado para el diseño de interfaces de usuario. JavaFX forma parte de Java SE desde la versión 7 de dicha edición de la plataforma.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Java EE: es la &lt;em&gt;Enterprise Edition&lt;/em&gt; de la plataforma Java, dirigida al desarrollo de soluciones software que se ejecutarán en un servidor de aplicaciones. A las capacidades de Java SE, la edición EE agrega servicios para gestionar la persistencia de objetos en bases de datos, hacer posible la invocación remota de métodos, crear aplicaciones con interfaz de usuario web, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Java ME: esta edición de la plataforma, &lt;em&gt;Micro Edition&lt;/em&gt;, está enfocada a la creación de programas que se ejecutarán en sistemas con recursos limitados, tales como teléfonos móviles, electrodomésticos y dispositivos de domótica o equipos para entornos empotrados como la Rasperry Pi y similares.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.campusmvp.es/recursos/image.axd?picture=Java-Ediciones.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.campusmvp.es%2Frecursos%2Fimage.axd%3Fpicture%3DJava-Ediciones_thumb.png" title="PULSA para aumentar - Ediciones de java" alt="Ediciones de java"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nota: Java SE, EE, ME, la JVM y otras partes de Java son en realidad especificaciones abstractas de los servicios y modos de funcionamiento de los distintos elementos de la plataforma. Encontraremos múltiples implementaciones de dichas especificaciones. Por ejemplo, &lt;a href="http://www.oracle.com/technetwork/articles/javase/index-jsp-136373.html" rel="noopener noreferrer"&gt;HotSpot&lt;/a&gt; es la implementación de Oracle de la JVM, existiendo implementaciones alternativas de esa misma especificación como la de OpenJDK o la de IBM.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Por regla general, salvo que tengamos alguna necesidad más específica de desarrollo, partiremos siempre de la Java SE, procediendo después a instalar plataformas adicionales en caso de que precisemos algún servicio no disponible en la edición estándar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Java y sistemas operativos
&lt;/h2&gt;

&lt;p&gt;Para ejecutar aplicaciones desarrolladas en Java sobre un sistema operativo es necesario que exista para el mismo una implementación concreta de la plataforma.&lt;/p&gt;

&lt;p&gt;Además de la implementación de cada plataforma procedente de Oracle, que podría considerarse la oficial o de referencia y que está disponible para múltiples sistemas, podemos encontrar otras alternativas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="http://openjdk.java.net/" rel="noopener noreferrer"&gt;OpenJDK&lt;/a&gt;, la organización respaldada por Oracle cuyo objetivo es mantener una versión de código abierto de la plataforma Java, ofrece Java SE para múltiples distribuciones de GNU/Linux.&lt;/li&gt;
&lt;li&gt;  Si queremos utilizar OpenJDK en otros sistemas, como Windows u OS X, podemos recurrir a &lt;a href="https://www.azul.com/products/zulu/" rel="noopener noreferrer"&gt;Zulu&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;  IBM también ofrece su propia implementación de la plataforma Java, conocida como &lt;a href="https://www.ibm.com/developerworks/java/jdk/index.html" rel="noopener noreferrer"&gt;IBM J9&lt;/a&gt;, para GNU/Linux, así como para varios de sus sistemas operativos para mainframes y derivados de UNIX, como AIX y z/OS.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Nota: La implementación de Java SE de Oracle está basada en el código de OpenJDK, por lo que estas dos variantes comparten un núcleo funcionalmente idéntico.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;  Si nuestro objetivo es desarrollar para dispositivos embebidos, tales como Smart TV o dispositivos tipo Raspberry Pi, encontraremos versiones específicas de la plataforma Java para tal fin. Un ejemplo de ello son las &lt;a href="http://www.oracle.com/technetwork/java/embedded/overview/index.html" rel="noopener noreferrer"&gt;versiones Embedded&lt;/a&gt; de Java SE y Java ME de la propia Oracle. También derivadas de OpenJDK, se están preparando versiones de &lt;a href="http://openjdk.java.net/projects/mobile/" rel="noopener noreferrer"&gt;Java SE para iOS, Android y Windows Mobile&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;  Android es un sistema operativo algo especial en cuanto a la ejecución de aplicaciones Java, ya que incorpora un entorno de ejecución propio, llamado &lt;a href="https://source.android.com/devices/tech/dalvik/index.html" rel="noopener noreferrer"&gt;ART (Android RunTime)&lt;/a&gt;, en lugar de la correspondiente implementación del JRE. Las aplicaciones para Android se desarrollan usando el JDK de Java SE, pero el código se compila posteriormente para ART.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Espero que esto te ayude a tener clara la diferencia que existe entre Java, la plataforma Java, sus componentes y sus diferentes implementaciones.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Post original &lt;a href="https://www.campusmvp.es/recursos/post/Descifrando-Java-lenguaje-plataforma-ediciones-implementaciones.aspx" rel="noopener noreferrer"&gt;por &lt;strong&gt;Francisco Charte&lt;/strong&gt; en el blog de campusMVP&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>java</category>
      <category>fundamentos</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Los 5 lenguajes de programación más fáciles de aprender</title>
      <dc:creator>campusMVP</dc:creator>
      <pubDate>Fri, 08 Feb 2019 08:00:00 +0000</pubDate>
      <link>https://dev.to/campusmvp/los-5-lenguajes-de-programacin-ms-fciles-de-aprender-2lff</link>
      <guid>https://dev.to/campusmvp/los-5-lenguajes-de-programacin-ms-fciles-de-aprender-2lff</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Post original: &lt;a href="https://www.campusmvp.es/recursos/post/los-5-lenguajes-de-programacion-mas-faciles-de-aprender.aspx"&gt;https://www.campusmvp.es/recursos/post/los-5-lenguajes-de-programacion-mas-faciles-de-aprender.aspx&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Aprender a programar puede ser una tarea ardua, en cambio, no es tan difícil como parece. El acceso a la información es prácticamente ilimitado: hoy en día existen una gran cantidad de recursos tanto &lt;em&gt;online&lt;/em&gt; como &lt;em&gt;offline&lt;/em&gt;, además de comunidades de desarrolladores y expertos en programación que comparten su conocimiento.&lt;/p&gt;

&lt;p&gt;Sin embargo, a la hora de aprender a programar es tan importante escoger el lenguaje adecuado como el proceso de aprendizaje. En un &lt;a href="https://dev.to/campusmvp/cmo-aprender-a-programar-3-lenguajes-por-los-que-empezar-ln0-temp-slug-1806261"&gt;&lt;em&gt;post&lt;/em&gt; anterior&lt;/a&gt; os hablamos de cómo aprender a programar. En este artículo encontraréis &lt;strong&gt;los 5 lenguajes de programación más fáciles de aprender&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Antes de continuar conviene aclarar a qué nos referimos con la palabra &lt;strong&gt;fácil&lt;/strong&gt; , pues su significado varía de un lenguaje a otro, es decir, lo que hace que un lenguaje de programación sea "fácil" de aprender cambia de uno a otro. Por ejemplo: algunos lenguajes cuentan con una sintaxis intuitiva; otros, si bien pueden ser teóricamente más complejos, el hecho de tener una comunidad muy activa puede compensar esa dificultad. Además, se trata de una cuestión bastante subjetiva, pero creemos que la selección es interesante ya que contempla lenguajes que no tienen sintaxis complicadas ni requieren grandes conocimientos previos para arrancar con ellos.&lt;/p&gt;

&lt;h2&gt;
  
  
  JavaScript
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uhnzI0RM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/1T/Logos-Lenguajes-Prog/JavaScript.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uhnzI0RM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/1T/Logos-Lenguajes-Prog/JavaScript.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;JavaScript es el lenguaje &lt;a href="https://www.campusmvp.es/recursos/post/5-razones-por-las-que-todo-programador-deberia-aprender-JavaScript.aspx"&gt;más utilizado y con más demanda actualmente&lt;/a&gt;, y se encuentra integrado en numerosas aplicaciones. Si deseas dedicarte al desarrollo web, aprender JavaScript es un indispensable ya que se ejecuta nativamente en cualquier navegador, por lo que no necesitas compilarlo. Solo necesitas un bloc de notas para empezar.&lt;/p&gt;

&lt;p&gt;Se trata de un lenguaje débilmente tipado, lo hace que resulte más fácil de aprender, aunque también más fácil que puedas meter la pata. Su sintaxis es similar a la de otros lenguajes, como C, C++, Java o C#, por lo que también sirve como puerta de entrada para luego seguir estudiando lenguajes de programación más complejos.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt; : no confundir JavaScript con Java. Nuestro experto tutor de JavaScript te lo aclara en &lt;a href="https://www.campusmvp.es/recursos/post/Java-y-JavaScript-son-lo-mismo.aspx"&gt;este post&lt;/a&gt;, básico pero necesario.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Usos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Desarrollo web&lt;/li&gt;
&lt;li&gt;Desarrollo backend&lt;/li&gt;
&lt;li&gt;Aplicaciones IoT&lt;/li&gt;
&lt;li&gt;Otros&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Sencillo&lt;/li&gt;
&lt;li&gt;Múltiples posibles aplicaciones&lt;/li&gt;
&lt;li&gt;Multiplataforma&lt;/li&gt;
&lt;li&gt;Es un estándar&lt;/li&gt;
&lt;li&gt;Puerta de entrada hacia otras tecnologías&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Contras
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Débilmente tipado&lt;/li&gt;
&lt;li&gt;Más difícil detectar bugs de tipo lógico&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Java
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Pxkmg8PA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/1T/Logos-Lenguajes-Prog/Java-Logo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Pxkmg8PA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/1T/Logos-Lenguajes-Prog/Java-Logo.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Java se utiliza tanto en aplicaciones web como de escritorio, en servidores, etc... No en vano su eslogan siempre fue "Escribe una vez, ejecuta en todas partes" cuando esto no era ni mucho menos lo habitual como ahora. Este lenguaje de programación orientado a objetos basado en clases, &lt;strong&gt;está siempre en los primeros puestos en las clasificaciones de popularidad y de demanda de empleo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Su inmensa popularidad se refleja en que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Java dispone de una de las comunidades de desarrolladores más grandes y activas, por lo que nunca te sentirás solo.&lt;/li&gt;
&lt;li&gt;Especialmente las grandes empresas siempre están buscando gente con conocimientos de Java.&lt;/li&gt;
&lt;li&gt;Existen más de &lt;a href="https://www.campusmvp.es/recursos/post/es-cierto-que-3-mil-millones-de-dispositivos-ejecutan-java.aspx"&gt;15.000 millones de dispositivos que ejecutan Java&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aprender Java entraña más dificultad que JavaScript porque tiene muchos tipos de datos y miles de clases en sus paquetes. Pero, al fomentar una base sólida de conocimientos de programación analítica, Java sigue siendo un lenguaje de programación fantástico, aunque un poco más difícil, para principiantes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Desarrollo web backend&lt;/li&gt;
&lt;li&gt;Desarrollo de escritorio&lt;/li&gt;
&lt;li&gt;Desarrollo móvil&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Popularidad y demanda&lt;/li&gt;
&lt;li&gt;Lenguaje estable&lt;/li&gt;
&lt;li&gt;Gran comunidad de apoyo&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Contras
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Perdona mucho menos los fallos.&lt;/li&gt;
&lt;li&gt;Hay que aprender también la plataforma Java, con decenas de miles de clases, lo que puede ser desafiante&lt;/li&gt;
&lt;li&gt;Precisa mayor capacidad de pensamiento analítico.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Python
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hT22nLLl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/1T/Logos-Lenguajes-Prog/Phyton-Logo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hT22nLLl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/1T/Logos-Lenguajes-Prog/Phyton-Logo.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Python es un gran lenguaje de programación fácil para principiantes&lt;/strong&gt;. Utilizado en aplicaciones web y de escritorio, Python ha aumentado mucho en popularidad en los últimos años gracias a ser &lt;strong&gt;el lenguaje más utilizado en Machine Learning e Inteligencia Artificial&lt;/strong&gt;. Este lenguaje dinámico es compatible con programación orientada a objetos, procedimientos y programación funcional.&lt;/p&gt;

&lt;p&gt;Además, es un lenguaje open-source y, al igual que Java, dispone de una devota comunidad.&lt;/p&gt;

&lt;p&gt;Gracias además a su flexibilidad y versatilidad, Phyton es un lenguaje recomendado para principiantes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Aplicaciones web&lt;/li&gt;
&lt;li&gt;Aplicaciones de escritorio.&lt;/li&gt;
&lt;li&gt;Machine Learning e Inteligencia Artificial&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Sintaxis sencilla&lt;/li&gt;
&lt;li&gt;Avanzas enseguida&lt;/li&gt;
&lt;li&gt;Gran comunidad&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Contras
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No es indicado para ciertos tipos de desarrollo, por ejemplo, para aplicaciones móviles&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  C
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dcm0VaD6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/1T/Logos-Lenguajes-Prog/C-Sharp-Logo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dcm0VaD6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/1T/Logos-Lenguajes-Prog/C-Sharp-Logo.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C# es una opción increíble para principiantes&lt;/strong&gt;. Hay una manera muy rápida y sencilla de probarlo: basta &lt;a href="https://visualstudio.microsoft.com/es/vs/community/"&gt;descargar Visual Studio Community&lt;/a&gt;. C # se puede usar para una gran variedad de propósitos, desde el desarrollo web hasta las aplicaciones de consola y gracias a la plataforma .NET se puede crear prácticamente de todo: apps de escritorio, servidores, cloud, móviles...&lt;/p&gt;

&lt;p&gt;La sintaxis de C# se base en C++ (y en Java), por lo que a priori podría parecer un lenguaje complejo para principiantes. Sin embargo, las opciones de autocompletado de Visual Studio, la auto-creación de proyectos y la facilidad de uso de su entorno de desarrollo en general, son aspectos que hacen que este lenguaje sea una buena opción para las personas que se inician en la programación.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Aplicaciones web backend&lt;/li&gt;
&lt;li&gt;Aplicaciones de escritorio&lt;/li&gt;
&lt;li&gt;Aplicaciones móviles&lt;/li&gt;
&lt;li&gt;Aplicaciones Cloud&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ampliamente usado&lt;/li&gt;
&lt;li&gt;Visual Studio allana mucho el aprendizaje y disminuye los fallos&lt;/li&gt;
&lt;li&gt;IDE fácil de usar&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Contras
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Hay que aprender también la plataforma .NET con decenas de miles de clases, lo que puede ser desafiante&lt;/li&gt;
&lt;li&gt;El despliegue en ciertos entornos puede ser complejo&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Ruby on Rails
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xIagldYC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/1T/Logos-Lenguajes-Prog/Ruby-Logo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xIagldYC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.campusmvp.es/recursos/image.axd%3Fpicture%3D/2019/1T/Logos-Lenguajes-Prog/Ruby-Logo.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ruby on Rails es fácil de leer, ya que está diseñado para parecerse al inglés, lo cual supone una gran ventaja para cualquier persona sin experiencia de programación. Ruby es un lenguaje orientado a objetos dinámico que &lt;strong&gt;se usa mucho en el desarrollo web&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Aprender &lt;strong&gt;Ruby on Rails&lt;/strong&gt; (Ruby es el lenguaje de programación y Rails es un &lt;em&gt;framework&lt;/em&gt; de aplicación web que funciona con dicho lenguaje) es muy, muy fácil ya que no es necesario aprender cientos o miles de clases. Y además facilita mucho enlazar a datos y otras operaciones normalmente complejas.&lt;/p&gt;

&lt;p&gt;Es el lenguaje elegido por muchas empresas que empiezan ya que se puede decir que &lt;strong&gt;no tiene barreras de entrada&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Desarrollo web&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Curva de aprendizaje casi plana&lt;/li&gt;
&lt;li&gt;Gran rapidez de desarrollo de aplicaciones web, ves resultados rápido&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Contras
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ha caído bastante en desuso en los últimos años ante nuevas opciones&lt;/li&gt;
&lt;li&gt;La comunidad es menor que la de otros lenguajes&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Post original: &lt;a href="https://www.campusmvp.es/recursos/post/los-5-lenguajes-de-programacion-mas-faciles-de-aprender.aspx"&gt;https://www.campusmvp.es/recursos/post/los-5-lenguajes-de-programacion-mas-faciles-de-aprender.aspx&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>aprendizaje</category>
      <category>spanish</category>
    </item>
  </channel>
</rss>
