Crea una App de preguntas y respuestas con MIT App Inventor

15/05/2020
Artículo original

¿Quieres aprender a crear un juego para móviles y tablets Android y poder compartirlo con toda tu familia y amigos? En esta entrada te mostraremos cómo puedes hacerlo y de una forma muy sencilla. Si aún no has creado apps para móviles o bien no conoces la interfaz de MIT App Inventor, te recomendamos que [...]

Los 5 puntos clave a la hora de elegir un curso de programación online

14/05/2020
Artículo original

Nunca ha habido un mejor momento para aprender a programar; ya desde antes de la crisis actual. Existen un gran número de cursos y plataformas de aprendizaje online, tanto gratuitos como de pago.

Para elegir un buen curso de desarrollo en una buena plataforma de formación es importante dedicar un tiempo a considerar qué curso será el mejor para ti en función del tipo de persona que eres y de tus circunstancias.

Sin una buena evaluación, puede que te encuentres a la deriva yendo de un curso a otro, en un perpetuo estado de confusión, perdiendo dinero o, lo que es más importante, tiempo (a veces un curso gratuito sale muy caro). Esto provoca frustración y puede llevar a que uno se dé por vencido y abandone la formación en esa materia por completo.

Una adecuada valoración de cada curso es fundamental para que el proceso resulte óptimo y satisfactorio. En este artículo repasaremos cinco puntos de evaluación basados en la psicología educativa, que son muy importantes a la hora de establecer un criterio para elegir un curso y una plataforma de formación online.

Sí, en el mercado hay un gran número de cursos para aprender a programar, pero al evaluarlos teniendo en cuenta estos cinco criterios, se eliminarán muchos de la lista.

Dicho esto: no todos los cursos son para todo el mundo. Dependerá de quién eres, de dónde partas en el aprendizaje, de cuáles son tus capacidades, del tiempo del que dispones, de si tienes mucha experiencia o no... No existe una "bala de plata", y una misma formación o método no tiene por qué ser válida para todo el mundo. Pero estos cinco puntos garantizan que, para la mayor parte de la gente que tiene el perfil apropiado para programar, la formación tienda a ser la más adecuada.

Vamos a verlos.

1.- El estilo de enseñanza online

No vamos a entrar aquí a repasar todos los estilos de aprendizaje, que se refieren a la forma preferida que tiene cada mente para asimilar conceptos, pero sí diremos que, la mayoría de las personas tienen un estilo dominante de aprendizaje o una combinación de estilos dominantes que son fundamentalmente estos tres:

  • El aprendizaje verbal (lectura)
  • El aprendizaje visual (vídeos e imágenes)
  • El aprendizaje auditivo (escucha)

Esto significa que los cursos con vídeo + audio que además ofrecen material con teoría para su lectura acompañada de esquemas, imágenes y capturas, aseguran que más participantes puedan tener éxito en la realización de los mismos.

En cualquier curso de campusMVP hay contenidos verbales, visuales y auditivos, no sólo una sucesión de vídeos uno tras otro, sin pausa para reflexionar y asentar conceptos. Todos los módulos se componen de teoría para su lectura, que se refuerza con vídeos con voz centrados en lo importante. Con la teoría también se incluyen esquemas e imágenes para ayudar a aclarar los conceptos más complejos.

La combinación de los tres estilos de aprendizaje facilita la comprensión de los conceptos. Pero es mucho más costosa de crear que una simple sucesión de vídeos grabados como si fuese una clase en directo.

Cuando se busca un curso de programación, se debe elegir uno en el que el material combine múltiples formas de transmitir las ideas, en cada caso la más apropiada, para aumentar las posibilidades de comprender y retener la información.

El curso online que tienes en mente adquirir para formarte, ¿qué tipo de material te ofrece? ¿Vídeo tan solo? ¿Una buena teoría para los conceptos importantes? ¿Te enseña "recetas" o te enseña conceptos? ¿Te ofrece material de consulta y repaso posteriores para cuando termine la formación?

2.- Aprendizaje basado en proyectos

Imagen ornamental, una persona llevando un pan que ha hecho con sus manos. Foto por Toa Heftiba, CC0

Tratándose de temas de formación técnica, el aprendizaje kinestésico - aprender haciendo - es la forma más efectiva y eficiente de asimilar la materia.

El aprendizaje se produce cuando hay una transformación de la información en un producto de trabajo. Durante este proceso de aprendizaje es natural que las tareas de programación se compliquen y que no funcionen las cosas, porque así se aprende de forma contextual. La máxima de campusMVP es que la mejor forma de aprender a programar es programando. Pero no de cualquier manera.

La formación siempre debe aspirar a una proporción de 80/20. El 80% del tiempo se debería estar programando o pensando en cómo resolver tareas de programación, revisando tu propio código hasta dar con la solución más adecuada. El 20% restante se debería estar leyendo y viendo vídeos.

Siempre hay que tener en cuenta si el curso que se quiere realizar tiene un proyecto o una aplicación que se desarrolla a lo largo del mismo. La programación en casos reales desarrolla la memoria para adquirir habilidades básicas. Y estos proyectos no deben ser los típicos laboratorios paso a paso en los que te van diciendo lo que tienes que hacer, sino ofrecer un punto de partida y uno de destino, unas pocas indicaciones para el camino, y que los pasos adecuados los decidas e implementes tú, con apoyo de un tutor, y basándose en todo lo aprendido hasta ese momento en el curso.

"Pegarse" con el código es la única forma de aprender. Lo otro son "recetas" que no servirán para la vida real, cuando no estés bajo condiciones de laboratorio.

Eso es realmente el aprendizaje kinestésico: aprender haciendo. Averigüa si la formación que te interesa te da "mascado" cómo hacer las cosas o si te obliga a decidir y trabajar con apoyo de un tutor experimentado. Si te dicen que "aprendes sin esfuerzo": o no aprenderás nada útil o te mienten.

3.- Posibilidad de resolución de problemas

Esto está muy relacionado con lo anterior, pero va un poco más allá...

Desafortunadamente, muchos cursos programación no dan la opción a que los estudiantes resuelvan problemas. La mayoría de los cursos enlatados basados en vídeo muestran a alguien programando para que los alumnos lo imiten sin pensar. El resultado siempre sale.

Y, aunque es importante replicar también las "recetas" que te explican cuando estás empezando en una materia, sin el entrenamiento adecuado para resolver problemas, será muy difícil encontrar una salida profesional en el mundo de la programación. Un buen curso debe ofrecer retos que se sepa que te van a provocar problemas cuando los resuelvas.

Esto se debe a que se necesita práctica en el análisis causa/efecto y en la comprensión de la jerarquía, la depuración de errores y la refactorización. A veces, el objetivo que se persigue con los problemas es secundario. Lo importante es el aprendizaje que surge al intentarlo, al tropezar, al encontrarse con problemas y no tanto el hecho de conseguir un resultado concreto.

Esta es probablemente una de las mayores fortalezas de campusMVP: siempre se están resolviendo problemas y, esto es muy relevante, aprendiendo a gestionar cierto grado de frustración.

Siendo esto importante, tampoco hay que abusar. Para prevenir la fatiga, es aconsejable que se establezcan objetivos para la resolución de un cierto número de problemas a la semana o en cada módulo.

La formación que estás considerando ¿te ofrece la oportunidad de resolver problemas (no proyectos concretos: problemas)? ¿Te obligará a "pelearte" con ellos y a gestionar un poco la frustración? ¿Te apoyarán cuando no puedas resolverlos?

4.- La figura del tutor

No hay nada peor que estar trabajando en un problema dentro de un curso y toparse con un muro de hormigón y no tener a dónde acudir en busca de ayuda. Se intenta hacer todo lo que se puede, incluyendo un montón de búsquedas en Google, pero nada. Esto hace que el aprendizaje se frene en seco, y por eso es tan importante que el curso disponga de un tutor para ayudar al alumno a "desbloquearse".

Un tutor con contacto directo, no un foro donde a lo mejor te contesta un compañero mañana, dentro de una semana o a lo mejor nunca.

Esto es crucial. Si no se tiene una manera de obtener respuestas a las preguntas de manera oportuna y rápida, uno se olvida de lo que ha aprendido, hay ciertas cosas que no va a ver nunca o se siente desmotivado para seguir avanzando.

¿La formación que estás sopesando hacer te ofrece un tutor con contacto directo y tiempo de respuesta garantizado? ¿Quién es ese tutor? ¿Quizá el mismo profesional reconocido que ha diseñado el curso?, como en campusMVP.

5.- El mapa del tesoro: hitos y plazos

Imagen ornamental. Un camino de madera en el bosque, por Erik Mclean, CC0

Aunque un buen marketing puede hacer pensar que puedes aprender a programar en un mes, sin esfuerzo y conseguir un trabajo increíble, lo más probable es que no sea así. Y eso está bien. Aprender a programar o una nueva tecnología lleva tiempo.

Cada uno aprende a su propio ritmo, pero es importante que se fijen objetivos realistas para saber en cada momento dónde deberíamos estar, tener hitos a corto, medio y largo plazo para ayudarnos a planificar y no desanimarnos por el camino.

Los grandes cursos proporcionan puntos de referencia que ayudan a motivarte y a animarte a seguir adelante. En cualquier curso de campusMVP siempre tienes claros los hitos y objetivos en cada momento:

Ejemplo de información sobre el alumno en la portada de un curso de campusMVP

Desde el instante en el que accedes al curso conoces perfectamente en dónde estás respecto al aprendizaje total, qué llevas bien y qué llevas mal, cuál es el próximo hito que tienes en el futuro inmediato, cuánto te queda y las estadísticas clave de tu aprendizaje.

Esto no está reñido con que tengas libertad para ir a tu ritmo y decidir cómo estudiar. Solamente te ayuda a tener una brújula por la que guiarte. Que no es poco.

En formación online esto es especialmente importante o corres el riesgo de no terminar la formación nunca. Por eso también entra dentro de nuestra filosofía el hecho de que todas las formaciones tengan una fecha de fin concreta y cerrada. Y por eso cerca del 90% de nuestros alumnos finalizan la formación con éxito.

Aunque esto es algo que muchas veces se pasa por alto al valorar un curso, es sumamente importante para la salud mental mientras se aprende y para lograr aprovechar y terminar la formación online. La sensación de logro hace maravillas para en la psique humana.

¿Cómo estás de fuerza de voluntad pra estudiar a pesar del día a día de tu trabajo? La formación que estás considerando ¿ofrece hitos claros o deja a tu libre albedrío qué haces y cuándo lo haces? Si tienes toda la vida para hacerlo, es probable que no lo hagas en tu vida. Si te cobran una cuota mensual, les importa que pagues todos los meses, no que aprendas en el tiempo adecuado.

Ruby 2.7.0-preview2 Publicado

11/05/2020
Artículo original

Nos complace anunciar la publicación de Ruby 2.7.0-preview2.

Es una versión previa que se publica para obtener retroalimentación sobre la versión final planeada para Diciembre. Introduce una serie de características nuevas y mejoras de desempeño, las más notorias son:

  • Compactar en el Recolector de Basura (GC)
  • Reconocimiento de patrones
  • Mejoras en REPL
  • Separación de argumentos posicionales y con palabra clave

Compactar en el recolector de basura (GC)

Esta versión introduce compactar en el recolector de basura, que defragmenta un espacio de memoria fragmentado.

Algunos programas Ruby de múltiples hilos pueden causar fragmentación en la memoria, que conlleva a un alto uso de la memoria y a que se degrade la velocidad.

El método GC.compact se introduce para compactar el montón (heap). Esta función compacta los objetos vivos en el montón de forma que usen menos páginas y que el montón sea más amigable con la técnica de administración de recursos compartidos “Copiar ante Escritura” (Copy on Write o CoW). [Característica #15626]

Reconocimiento de patrones [Experimental]

El reconocimiento de patrones, es una característica ampliamente usada en lenguajes de programación funcional, se introduce como característica experimental. [Característica #14912] Puede recorrer un objeto dado y asignar su valor si concuerda con un patrón.

json ='{
  "nombre": "Alice",
  "edad": 30,
  "hijos": [
    {
      "nombre": "Bob",
      "edad": 2
    }
  ]
}'
case JSON.parse(json, symbolize_names: true)
in {nombre: "Alice", hijos: [{nombre: "Bob", edad: edad}]}
  p edad
end

Puede ver más detalles en Pattern matching - New feature in Ruby 2.7.

Mejoras a REPL

irb, el ambiente interactivo incluido con Ruby (REPL; Read-Eval-Print-Loop; Bucle-Leer-Evaluar-Presentar), ahora soporta edición de múltiples líneas. Es potenciado por reline, la implementación en puro Ruby de readline. También provee integración con rdoc. En irb puede presentar el manual de referencia para una clase dada, para un modulo o para un método. [Característica #14683], [Característica #14787], [Característica #14918] Además, ahora se presentan con colores tanto el código fuente de su programa al iniciar una sesión IRB con binding.irb como los resultados de inspeccionar los objetos de las clases del núcleo de ruby.

Separación de argumentos posicionales y con palabra clave

Se desecha la conversión automática de argumentos con palabra clave a argumentos posicionales, y tal conversión se eliminará en Ruby 3. [Característica #14183]

  • Si la llamada a un método pasa un diccionario (Hash) cómo último argumento y si no pasa palabras clave, y si el método llamado acepta palabras clave, se emitirá una advertencia. Para mantener la palabra clave en la definición de la función, agregue un operador doble splat all llamarla para evitar la advertencia y asegurar el comportamiento correcto en Ruby 3.

    def foo(key: 42); end; foo({key: 42})   # advertencia
    def foo(**kw);    end; foo({key: 42})   # advertencia
    def foo(key: 42); end; foo(**{key: 42}) # OK
    def foo(**kw);    end; foo(**{key: 42}) # OK
    
  • Si la llamada a un método pasa palabras clave a un método que acepta palabras clave, pero no pasa suficientes argumentos posicionales, las palabras clave se tratarán como los argumentos posicionales finales que requiera el método pero se emitirá una advertencia. Pase los argumentos como un diccionario en lugar de palabras clave para evitar la advertencia y asegurar el comportamiento correcto en Ruby 3.

    def foo(h, **kw); end; foo(key: 42)      # warned
    def foo(h, key: 42); end; foo(key: 42)   # warned
    def foo(h, **kw); end; foo({key: 42})    # OK
    def foo(h, key: 42); end; foo({key: 42}) # OK
    
  • Si un método acepta palabras clave especificas, pero no una palabra clave splat, y si se pasa un diccionario o palabra clave splat al método que incluye unas llaves que son símbolos y otras que no son símbolos, el diccionario seguirá siendo dividido y se emitirá una advertencia. Tendrá que actualizar el código que hace la llamada para pasar diccionarios separados y asegurar el comportamiento correcto en Ruby 3.

    def foo(h={}, key: 42); end; foo("key" => 43, key: 42)   # warned
    def foo(h={}, key: 42); end; foo({"key" => 43, key: 42}) # warned
    def foo(h={}, key: 42); end; foo({"key" => 43}, key: 42) # OK
    
  • Si un método no acepta palabras clave, y se llama con palabras clave, las palabras clave se tratarán como un diccionario posicional, sin advetencias. Este comportamiento seguirá operando en Ruby 3.

    def foo(opt={});  end; foo( key: 42 )   # OK
    
  • Las cadenas que no sean símbolos se aceptarán como argumentos con palabras clave si el método acepta palabras clave arbitrarias. [Característica #14183]

    def foo(**kw); p kw; end; foo("str" => 1) #=> {"str"=>1}
    
  • **nil se permite en la definición de métodos para marcar explicitamente que el método no acepta palabras clave. Llamar a un método así con palabras clave resultará en un ArgumentError. [Característica #14183]

    def foo(h, **nil); end; foo(key: 1)       # ArgumentError
    def foo(h, **nil); end; foo(**{key: 1})   # ArgumentError
    def foo(h, **nil); end; foo("str" => 1)   # ArgumentError
    def foo(h, **nil); end; foo({key: 1})     # OK
    def foo(h, **nil); end; foo({"str" => 1}) # OK
    
  • Si se pasa una palabra clave splat a un método que no acepta palabras clave, ya no pasará un diccionario vacío, a menos que el diccionario vacío sea necesario para una parámetro requerido, en cuyo caso se emite una advertencia. Elimine el doble splat para continuar pasando un diccionario posicional. [Característica #14183]

    h = {}; def foo(*a) a end; foo(**h) # []
    h = {}; def foo(a) a end; foo(**h)  # {} and warning
    h = {}; def foo(*a) a end; foo(h)   # [{}]
    h = {}; def foo(a) a end; foo(h)    # {}
    

Otras caracerísticas nuevas y notables

  • Un operador para referenciar un método, .:, se introduce como característica experimental. [Característica #12125], [Característica #13581]

  • Como característica experimental se introducen paramétros numerados como párametros por omisión en bloques. [Característica #4475]

  • Un rango sin inicio se introduce de forma experimental. Podría no ser tan útil como un rango sin terminación, pero es bueno para lenguajes específicos para un domino (DSL). [Característica #14799]

    ary[..3]  # identico a ary[0..3]
    rel.where(ventas: ..100)
    
  • Se añade Enumerable#tally. Que cuenta las ocurrencias de cada elemento.

    ["a", "b", "c", "b"].tally
    #=> {"a"=>1, "b"=>2, "c"=>1}
    
  • Ahora se permite llamar un método privado conself. [Característica #11297], [Característica #16123]

    def foo
    end
    private :foo
    self.foo
    
  • Se añade Enumerator::Lazy#eager. Que genera un enumerador no-perezoso a partir de un enumerador perezoso. [Característica #15901]

    a = %w(foo bar baz)
    e = a.lazy.map {|x| x.upcase }.map {|x| x + "!" }.eager
    p e.class               #=> Enumerator
    p e.map {|x| x + "?" }  #=> ["FOO!?", "BAR!?", "BAZ!?"]
    

Mejoras en desempeño

  • JIT [Experimental]

    • El código compilado con JIT es recompilado a uno menos optimizado cuando los supuestos de la optimización dejan de ser válidos.

    • Un método se puede ejecutar en línea (method inlining o inserción en lugar de llamado) cuando un método se considera puro. Esta optimización aún es experimetnal y muchos métodos aún no se consideran puros.

    • El valor por omisión de --jit-min-calls cambió de 5 a 10,000

    • El valor por omisión de --jit-max-cache cambió de 1,000 a 100

  • Symbol#to_s, Module#name, true.to_s, false.to_s and nil.to_s ahora retornan una cadena congelada. La cadena retornada es siempre la misma para un objeto dado. [Experimental] [Característica#16150]

  • Se mejora el desempeño de CGI.escapeHTML. GH-2226

Otros cambios notables desde la versión 2.6

  • Se actualizaron algunas librerías estándar
    • Bundler 2.1.0.pre.1
    • RubyGems 3.1.0.pre.1
    • CSV 3.1.2 (NEWS)
    • Racc 1.4.15
    • REXML 3.2.3 (NEWS)
    • RSS 0.2.8 (NEWS)
    • StringScanner 1.0.3
    • Algunas de las otras librerías que no tienen versión original también se actualizaron.
  • Proc.new y proc sin bloque en un método llamado con un bloque produce una advertencia.

  • lambda sin un bloque en un método llamado con un bloque produce un error.

  • Actualizada la versión de Unicode y de Emoji de 11.0.0 a 12.0.0. [Característica #15321]

  • Actualizada la versión de Unicode a 12.1.0, añadiendo soporte para U+32FF SQUARE ERA NAME REIWA. [Característica #15195]

  • Date.jisx0301, Date#jisx0301, y Date.parse soportan la nueva era japonesa. [Característica#15742]

  • Requiere compiladores que soporten C99 [Misc #15347]

Vea más detalles en el archivo NEWS o en la bitácora de cambios.

¡Estos cambios constan de 3670 archivos cambiados, 201242 inserciones(+), 88066 eliminaciones(-) desde Ruby 2.6.0!

¡Disfrute programando con Ruby 2.7!

Descargas

  • https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-preview2.tar.bz2

    SIZE:   14555229 bytes
    SHA1:   7d9eed71115acfc8851747517904c1c6809872a9
    SHA256: 417c84346ba84d664a13833c94c6d9f888c89bb9bee9adf469580441eaede30b
    SHA512: 7066ececebbbba4b2933ba1a4f70cdef373169910802259a3e52b4fc144ba298f3cffda4be5fe8a7be8ef769ed43076fa046a9ac2c13bb733475b9852112c6f0
    
  • https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-preview2.tar.gz

    SIZE:   16622499 bytes
    SHA1:   5e998eb37ef54e650c0206184d56f506359d5477
    SHA256: bda4b8dc340fad425c8099400fe3ef8e7393837d7e6e1bfae41843d1d938ebc4
    SHA512: dbf05d6ddab59062f507342b25b8c21670b02bdd49e77bda947870607f4bf9049e5e7ddfde6bbce2e1749ca92568da9be3e5f30601b1eb450f10d8add952239a
    
  • https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-preview2.tar.xz

    SIZE:   11874200 bytes
    SHA1:   4356e1726027795a5c6b08572bb37bcb5a8c55d6
    SHA256: fa39f088331f6d505154aa9d025aab177fdffedfbbabccd900b8c02e745bc077
    SHA512: a057a186d85fcdf123abd69d584ef3adb20ad4397521e14306395d34102c3d818fe2d34a6476db01effcde479da9a77076cbb6d30bca40f1471ce3f5d3a995a9
    
  • https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0-preview2.zip

    SIZE:   20576618 bytes
    SHA1:   891b70ec76e9e776774a49b3ce24832a944422b3
    SHA256: 81a240bead4438b064cb4cde562b483b82ec8e414bac057a6df43df5a247545c
    SHA512: 1a8d4503374d31abf43182e2af6902ea6e5295f55d539415c8268b1d6a0fa83a975648c225ae986e687d5283dc2d180cf1e608841485506e4b0ac5efc154949a
    

¿Qué es Ruby?

Ruby fue desarrollado primero por Matz (Yukihiro Matsumoto) en 1993, y ahora es desarrollado como Código Abierto. Corre en múltiples plataformas y se usa en todo el mundo especialmente para desarrollo web.

Publicado por naruse el 2019-10-22
Traducción de vtamara

24.000 desarrolladores responden: cómo y para qué usan Python, plataformas favoritas, y principal lenguaje secundario

11/05/2020
Artículo original

24.000 desarrolladores responden: cómo y para qué usan Python, plataformas favoritas, y principal lenguaje secundario

JetBrainS ha publicado los resultados de su encuesta anual para desarrolladores Python, en ella buscan identificar las últimas tendencias dentro del mundo de la programación sobre uno de los lenguajes más amados por los programadores y de crecimiento más rápido en los últimos años.

En la encuesta participaron unos 24.000 desarrolladores procedentes de más de 150 países, lo que ayuda a pintar una imagen bastante clara de la comunidad alrededor de este lenguaje. De todos los entrevistados, más del 80% usa Python como su lenguaje de programación principal.

La combinación Python/JavaScript es la más común

Lenguajes Secundarios Python Jetbrains Lenguajes de programación secundarios favoritos junto a Python - JetBrains

De entre los entrevistados, un 43% respondió utilizar JavaScript como lenguaje secundario, una cifra que alcanzaba el 51% el año anterior. En popularidad le siguen Bash/Shell, HTML/CSS, SQL, C/C++, Java, PHP, C#, Go, TypeScript, R y Rust.

Otro dato interesante es que hasta el 11% dijo no utilizar ningún otro lenguaje de programación además de Python, casi el doble del 6% que respondió lo mismo en la encuesta anterior.

Teniendo en cuenta esa combinación predominante de lenguajes, no es sorpresa que el desarrollo web sea uno de los principales usos que los programadores le dan a Python. Sin embargo, sigue sin ser el más popular, ese puesto es para el análisis de datos, una categoría que abarca el 59% de las respuestas.

Usos Python 2019 Jetbrains Principales usos de Python como lenguaje de programación - Gráfico de JetBrains

El aprendizaje automático o machine learning está en el tercer puesto, y sin embargo, la enorme mayoría de los desarrolladores que trabajan ya sea en estas tecnología o en análisis de datos, no se consideran a sí mismos como científicos de datos, solo un tercio respondió que sí a esta pregunta.

Los usos de Python son tan extensos como su comunidad

Python Lenguajes De Programacion

Una de las principales razones por las que Python se ha hecho tan popular es por su versatilidad. Y de hecho, es algo que queda claro con los datos recogidos por esta encuestas. Una de las preguntas que se hicieron fue para qué usaban Python los desarrolladores, y como tenía un campo de texto abierto las respuestas fueron muy variadas.

La lista incluye desde inteligencia artificial, criptografía, ciberseguridad, deep learning, IoT, o hacking ético, hasta astronomía, bioinformática, software financiero, comercio, música, procesamiento de imagen, simulaciones de física, o incluso algo tan "trivial" como bots para Discord.

Python 3 ya es la versión más usada, recordemos que hace apenas unos meses finalizó el soporte de Python 2 tras más de 20 años. Sin embargo, el 10% de los encuestados aún lo usa de forma activa.

lenguajes de programacion

Entre los 24.000 encuestados el 68% respondió que usan Linux de alguna forma, el 48% dice utilizar Windows, un 29% trabaja con macOS, y un 2% dice utilizar BSD. PyCharm y Visual Studio Code son los editores/IDEs más usados, seguidos con amplia diferencia por Vim, Sublime Text, Jupyter Notebook, Atom, y Emacs. Hasta un 2% usa NotePad++.

Linux es el sistema operativo favorito de los desarrolladores Python

El 90% de los desarrolladores utiliza algún sistema de control de versiones, el 67% tiene trabajo a tiempo completo mientras que un 10% son estudiantes. La mayoría tienen entre 3 y 5 años de experiencia con Python, solo el 10% pasa de 11 años, y el 21% tiene menos de un año programando en Python.

Los desarrolladores Python también son jóvenes, el 42% tienen entre 21 y 29 años, y solo el 5% pasa de 50 años. Además, la mayoría (58%) usa Python tanto para su trabajo como para proyectos personales.

Más información | JetBrains

¿Por qué aunque pongo un z-index muy alto no consigo que se vea un elemento en mi diseño Web?

11/05/2020
Artículo original

Antes de nada voy a empezar con un buen repaso de qué es la propiedad z-index, para qué vale y cómo trabaja. Aunque creas que conoces z-index, no dejes de leer esta parte introductoria, puesto que hay detalles que es muy probable que no tengas tan claros como creías.

El artículo es bastante largo porque entra a fondo en cómo se apilan los elementos de una página, algo que es crucial entender bien para poder evitar problemas a la hora de maquetar y mostrar los elementos adecuadamente. Además quiero ser exhaustivo. Incluyo también un vídeo explicativo al final, en el que se puede ver en la práctica lo explicado.

Este artículo está basado en material de mi curso HTML5 y CSS3 a fondo para desarrolladores de campusMVP. Si quieres aprender bien estas materias, más complicadas de lo que parece a primera vista, este es tu curso. Habla con tu responsable en tu empresa: puede saliros sin coste.

La propiedad z-index

La propiedad CSS z-index sirve para indicar la posición de los elementos en el eje perpendicular (eje "Z" de ahí su nombre) de una página.

Si vemos una página Web como un papel colocado sobre una mesa, los ejes X e Y serían los que siguen los bordes de la página, y el eje Z sería el perpendicular a la mesa (hacia "arriba"), algo así:

La imagen muestra un render 3D de una página Web impresa, encima de una mesa, con los ejes de referencia dibujados encima

Como vemos, todos los ejes parten de la esquina superior izquierda de la página. Los ejes horizontales, X e Y, que mueven los elementos sobre la superficie de la página, son los que establecemos con las propiedades top y left cuando un elemento está posicionado de manera diferente a la posición estática que tienen por defecto (por ejemplo: absolute, relative, fixed, sticky...). El eje Z es lo que establecemos con la propiedad z-index y se refiere a la posición de los elementos sobre el plano.

Con z-index podemos controlar cómo se posicionan unos elementos encima de los otros cuando coinciden al cambiar su posición.

En la página, este posicionamiento vertical se traduce en que unos elementos "tapan" a los otros porque se superponen, ya que, en la figura anterior, nosotros veríamos la página colocados de forma perpendicular a la mesa, o sea, desde arriba, por lo que no somos capaces de ver la "altura", y sólo veríamos unos encima de otros tapándose.

Lo básico que hay que saber de z-index es lo siguiente:

  1. Sus unidades son "niveles", no longitudes. Al contrario que el posicionamiento en los otros ejes, el valor de esta propiedad no se mide en píxeles u otras unidades de longitud, sino en "niveles". Es decir, es un número entero, positivo o negativo, que indica el "nivel" sobre el plano de la página en el que se colocará ese elemento.
  2. Sólo funciona en elementos posicionados. Es decir, en elementos con el valor por defecto de position (que es static), no tiene efecto alguno. Ya le puedes poner lo que quieras, que no te hará caso.

Cómo se colocan los elementos en una página: la importancia de z-index

Por defecto los elementos de una página tienen una posición estática, por lo que se colocan siguiendo el orden en el que están definidos en el código y, en principio, no se solapan nunca.

Nota: lo anterior no es del todo cierto ya que podemos jugar con márgenes negativos y cosas así para hacer que se solapen, pero no es lo habitual. En cualquier caso seguirían estando en el mismo plano, por lo que el término correcto sería "interfiriéndose", no solapándose. En caso de interferencia queda por encima el que se haya definido más tarde en el código.

Si cambiamos el modo de posicionamiento con la propiedad position y usamos alguno de los disponibles para poder colocarlos de manera relativa, absoluta, fija, etc... lo que ocurre es que estos elementos se salen del flujo normal de la página y se colocan en donde les corresponda, interfiriendo con cualquier otro elemento "normal" que hubiera en esa ubicación. Es decir, al posicionar un elemento éste interfiere con los demás elementos que ocupen su misma posición. Quedará por encima el que esté definido más tarde en el código, como en el caso comentado en la nota anterior.

Para poder controlar qué elemento se va a visualizar en caso de interferencia por posicionamiento existe la propiedad z-index. Gracias a ella podemos indicar en qué nivel queremos que esté cada elemento sobre el plano, decidiendo de esta manera cuál es el que se va a ver por encima de los demás.

Así, por ejemplo, consideremos este sencillo código HTML:

<div id="sc1" class="sc">
    <div class="caja roja">HOLA</div>
</div>
<div id="sc2" class="sc">
    <div class="caja verde">HOLA</div>
</div>
<div id="sc3" class="sc">
    <div class="caja azul">HOLA</div>
</div>

En él tenemos tres elementos con un <div> dentro cada uno de ellos. He establecido el CSS para que los divs interiores sean cuadrados y tengan un color diferente para verlos bien.

Nota: aunque los divs "padre" no son necesarios en general y, de hecho, en este caso se colapsan, quedando sin dimensiones, me interesa tenerlos para el ejemplo posterior, así que de momento no te preocupes por ellos.

Como sabemos, si no le cambiamos el posicionamiento quedarían unos debajo de otros, apilados en la vertical (posicionamiento estático):

Cajas apiladas

Si les ponemos un posicionamiento absoluto, sin indicar realmente posición alguna, estarán todos colocados en (0,0) y por lo tanto interferirán en el mismo plano y el que se verá es el último: el azul:

Todos los elementos interfiriendo, solo se ve el azul

Vamos, que es como si sólo tuviésemos uno a efectos de visualizarlos.

Ahora los voy a posicionar para que se muevan y se vean todos a la vez, pero interfiriendo unos con otros:

Los 3 elementos posicionados

Ahora los vemos todos, pero como se interfieren parcialmente, unos se tapan a otros, tapando el azul al verde y éste al rojo que está debajo de todo por ser el primero en el código.

Si queremos que uno de ellos prevalezca sobre los demás independientemente de dónde esté en el código, podemos ponerle un z-index superior a lo de los otros:

El verde ahora está por encima de los demás

¡Perfecto! Justo lo que queríamos. El CSS sería:

.caja {
    width: 200px;
    height:200px;
    position: absolute;
}

.roja {
    background-color: coral;
    top: 0;
    left: 0;
}

.verde {
    background-color: lightseagreen;
    top: 100px;
    left: 100px;
    z-index: 1;
}

.azul {
    background-color: skyblue;
    top: 200px;
    left: 200px;
}

Al ponerle un z-index:1; al segundo elemento (y tener todos ellos un posicionamiento absoluto), lo que estamos haciendo es colocarlo un nivel por encima del del documento "base", que es donde están los otros dos cuadrados, por eso se ve por encima.

Muy sencillo ¿no?

Cuando z-index no hace caso

Pues va a ser que no...

El problema de z-index es que parece muy sencillo (un número y listo), pero puede llegar a complicarse. Y es entonces cuando aparecen los problemas y nada parece funcionar. Vamos a verlo con un ejemplo sencillo.

Sigamos con la estructura anterior de cuadrados. Sólo voy a hacer un cambio muy pequeño: al div contenedor del tercer cuadrado le voy a aplicar una rotación con este estilo:

#sc3 {
    transform: rotate(360deg);
}	

Es una tontería, ya que lo deja tal cual estaba (girarlo 360 grados es dejarlo en la misma posición), pero me servirá para demostrar una cosa.

Nota: podría haber hecho otras muchas cosas con él, como cambiarle la opacidad un poco, aplicarle una máscara o aplicarle una ruta de recorte (propiedad clip-path), entre otras muchas cosas. Luego las veremos.

Ahora al cuadrado azul, el que está contenido en ese div que hemos rotado, le aplicamos un z-index:2;, es decir mayor que el del segundo cuadrado, el verde, por lo que en teoría debería quedar por encima, ya que está posicionado sobre él en el plazo Z:

El resultado: el cuadrado azul sigue por debajo a pesar de tener un z-index mayor que el verde

¡No funciona!

Este es uno de esos casos en los que, hagas lo que hagas con z-index no podrás ponerlo por encima.

Muchos desarrolladores Web, cuando se encuentran con un problema como este lo que hacen es ponerle un valor muy grande a la propiedad z-index, tratando de "ser el que más arriba está", en plan z-index:9999; y cosas así. Eso no vale para nada.

¿Cuál es el motivo de que es no funcione?

Contextos de apilamiento (stacking contexts)

Para entender por qué un determinado elemento "no hace caso" del z-index hay que entender qué es un contexto de apilamiento.

Por defecto, siempre existe al menos un contexto de apilamiento que es el que se crea en el elemento raíz de la página (<html>). Es en este en el que se apilan todos los demás elementos de la forma que hemos visto antes.

Pero, además de este, se pueden formar muchos otros contextos de apilamiento dentro de la página. En concreto, se forman contextos de apilamiento en elementos que cumplan alguna de estas condiciones:

  • Si están posicionados con absolute o relative y tienen un z-index aplicado (distinto de auto, el valor automático por defecto), como los tres cuadrados de nuestro ejemplo.
  • Si tiene posición fixed o sticky.
  • Si es hijo de un elemento Flexbox o Grid que tenga un z-index aplicado (nuevamente no auto).
  • Si se le aplica una opacidad parcial, es decir, si no es totalmente opaco (un valor tan grande como opacity:0.9999; sería suficiente).
  • Si se le ha aplicado alguna transformación (transform), filtro (filter), máscara (mask), perspectiva o ruta de recorte (como he comentado más arriba).
  • Si se han hecho mezclas fotográficas o de colores o se le ha aplicado aislamiento.
  • Si se ha cambiado su modo de contención de elementos.
  • Si se le indica al navegador que el elemento va a cambiar en el futuro, para resolver problemas de rendimiento.

En general se puede decir que se forma un nuevo contexto de apilamiento cuando sacamos un elemento del flujo normal de la página, sea con el método que sea (todos los de la lista anterior lo hacen de un modo u otro).

Cuando se forma un nuevo contexto de apilamiento lo que ocurre es que todos los elementos hijos del que lo ha formado pasan a gestionarse con él, en grupo, y su propiedad z-index ya no tiene efecto sobre los demás elementos fuera de este contexto.

Esto es la clave: la posición en Z de sus hijos sólo tendrá influencia sobre otros elementos del mismo contexto de apilamiento.

Interferencia de los contextos de apilamiento

Sólo nos falta un detalle más: conocer cómo se relacionan entre sí los contextos de apilamiento.

Si hay más de un elemento que forma su propio contexto de apilamiento en una página (algo que pasa constantemente), en caso de que estos elementos interfieran entre sí, el orden de visualización es el siguiente, idéntico al de los elementos individuales que hemos visto antes:

  1. Abajo de todo de la pila, en el nivel 0, se visualiza el elemento raíz, que forma su propio contexto de apilamiento, el global. Lo que se ven son los bordes y el fondo del elemento raíz de la página (el elemento <html>). Es importante señalar que, aunque le pongas a algún elemento hijo del raíz un z-index negativo, no podrá estar nunca por debajo del elemento raíz.
  2. Justo encima se visualizan los elementos posicionados con un z-index negativo. Estos no pueden estar por debajo del raíz, pero sí por debajo de otros elementos.
  3. A continuación se ponen los elementos no posicionados, es decir, los que tienen position:static, que es el valor por defecto, en el orden de aparición en el código fuente (los que están definidos más tarde, se ven por encima en caso de interferencia).
  4. Luego se colocan los elementos posicionados de diversas formas (absoluta, relativa...) que no tienen un z-index especificado (lo tienen en auto).
  5. Finalmente se colocan los elementos posicionados que además tienen un z-index positivo.

Sabiendo esto es fácil ver por que en nuestro ejemplo el cuadrado azul no se ve a pesar de que le hayamos puesto un z-index altísimo... ¿Sería capaz de ver el motivo?

Te lo voy a mostrar en un vídeo en el que te lo explico de manera visual:

[youtube:DlVMx1nS9gk]

En resumen

En más ocasiones de las que nos gustaría, las cosas en HTML y CSS parecen mucho más sencillas de lo que son en realidad. Una de estas cuestiones aparentemente fáciles, pero que tiene mucho más fondo del que parece, es el posicionamiento vertical de elementos, controlado por la propiedad z-index, que influye en qué elementos se ven cuando se solapan varios.

Existen dos conceptos clave para entender el posicionamiento vertical: los contextos de apilamiento y la prioridad cuando se produce una interferencia entre elementos.

En este artículo, basado en material de mi curso HTML5 y CSS3 a fondo para desarrolladores de campusMVP, te explico con detalle esos conceptos para ir más allá de lo que sabe el desarrollador medio sobre el tema, y ayudarte a evitar cualquier problema que te pueda surgir a la hora de aplicar la visibilidad vertical de elementos.

Además vemos un ejemplo práctico del problema, con un vídeo explicativo que te ayuda a entender qué pasa y cómo solucionarlo. Puedes descargar el ejemplo desde aquí (ZIP, 0,6Kb).

¡Espero que te resulte útil!

Cómo publicar una web gratis usando Netlify y Github

10/05/2020
Artículo original

Cómo publicar una web gratis usando Netlify y Github

Hace unos años, antes del auge de Wordpress y otros CMS, la mayor parte de las webs eran estáticas: se componían meramente de archivos HTML, CSS y, en algunos casos, de scripts JS... y no requerían de tecnologías como PHP o bases de datos SQL.

Para un internauta de hoy en día, esas webs se perciben como funcionalmente limitadas; y, para un webmaster, podían llegar a ser un infierno a la hora de actualizarlas.

Pero, ¿por qué iba a interesarle al resto de usuarios, que están más que servidos con Wordpress y similares, conocer un servicio de hosting de páginas estáticas (por mucha popularidad que esté cosechando en los últimos tiempos) más allá de funciones educativas o similares?

Fundamentalmente, por dos razones: porque las páginas estáticas, hoy en día, pueden ser mucho más complejas e interesantes que las de hace unos años, y porque el servicio del que vamos a hablar nos permitirá tener un sitio o aplicación web online, de forma gratuita, sin publicidad y fiable. Sin más dilación, veamos qué es Netlify.

Netlify

Si quisiéramos definir Netlify en pocas palabras, diríamos que es un servicio de hosting para sitios web estáticos. Pero es un hosting al que nosotros no subiremos nada, por lo que toca olvidarse de cuentas FTP o similares: el código HTML, Javascript e imágenes estarán alojados en nuestro servicio Git favorito (Github, Gitlab o Bitbucket).

Netlify

A cambio, ofrece toda una serie de características que no encontraremos en otros servicios para sitios estáticos como Firestarter o Github Pages:

  • Despliegue continuo: permite vincular nuestro sitio web con un proyecto Git, con el objetivo de poder actualizar automáticamente el primero tras cada actualización que llevemos a cabo en el repositorio.

  • Rollbacks: Si un cambio en el repositorio ha causado algún efecto indeseado en nuestro sitio web, siempre podremos hacer retroceder éste a una versión anterior de sí mismo con un único clic.

  • DNS: permite administrar zonas dentro del dominio netlify.com, así como usar dominios personalizados que hayamos adquirido.

  • HTTPS: disponible de forma automática para todas las zonas gestionadas por Netlify.

  • Split Testing: Nos da la opción de redireccionar un porcentaje configurable de nuestro tráfico web a una 'rama' de prueba de nuestro sitio, con el objetivo de realizar tests A/B.

A excepción de esta última característica (en fase beta), todas las demás opciones están disponibles en el plan 'Starter' de Netlify, totalmente gratuito, por lo que nos ofrece todo lo que necesitamos para poner online nuestra web.

Manos a la obra

Podemos usar nuestra cuenta en Github, Gitlab o Bitbucket para registrarnos e iniciar sesión en Netlify. Tras eso, cuando pretendamos crear desde éste nuestro sitio web, tendremos que dar acceso a Netlify a nuestra cuenta en Github (por ejemplo), y posteriormente se nos pedirá que vinculemos el sitio web a un proyecto concreto ya existente en la misma.

Netlify4

Tras unos cuantos clics (el procedimiento es bastante intuitivo), y habiendo realizado el primer despligue, Netlify nos notificará que tenemos lista y online nuestra web en un subdominio de netlify.com. Sólo tendremos que pulsar el botón de "Domain settings" para hacer que esa URL (algo larga, y poco memorizable) sea sustituida por un dominio de nuestra propiedad.

Web Final Pantalla final del proceso de creación de nuestro sitio web en Netlify (izquierda) y aspecto final del mismo (derecha).

Páginas estáticas... que no lo son tanto

Aunque para la prueba anterior hemos utilizado una web 100% estática (sólo un archivo HTML), lo cierto es que Netlify facilita crear páginas más complejas, en las que el límite entre lo estático y lo dinámico se desdibuja.

En los últimos años han ido apareciendo diversas aplicaciones que permiten generar sitios webs estáticos, pero que recurren a sistemas de gestión de contenidos y plantillas, e incluso a editores WYSIWYG.

Así, recurriendo a esta clase de software, apenas existe diferencia entre crear una web dinámica usando un CMS y optar por una estática, al margen de que esta última no se regenerará cada vez que un usuario la visite (algo parecido, por otra parte, a lo que ocurre con una web Wordpress cuando accedemos a ella a través de un CDN).

Entrar en detalles sobre los mismos excede el objetivo de este artículo, pero si visitáis StaticGen.com, podréis acceder a un listado de los generadores de sitios estáticos más populares (Next.js, Gatsby, Hugo, Jekyll, etc), cada uno con su correspondiente botón de 'Deploy to Netlify'.

Esto, unido a los apartados que la propia documentación de Netlify dedica al uso de los mismos os ayudará a crear sitios con la última tecnología web sin necesidad de gastar absolutamente nada en alojamiento.

98.css: una librería open source para construir interfaces que se vean como Windows 98

08/05/2020
Artículo original

98.css: una librería open source para construir interfaces que se vean como Windows 98

98.css es un archivo CSS que toma el HTML semántico y lo hace ver bonito. O al menos esa es la forma en la que el desarrollador detrás del proyecto lo describe. En otras palabras, se trata de una librería CSS para construir interfaces que se vean como Windows 98.

La idea es ofrecer todo un sistema de diseño para recrear lo más fielmente posible las interfaces viejas, como las del antiguo sistema operativo de Microsoft. Sí, esas interfaces donde los botones están muy bien definidos, igual que los checkbox, los cajones de texto, las barras, etc.

Cero JavaScript

Anotacion 2020 05 08 160154

El objetivo principal de este proyecto es la accesibilidad. La librería depende del uso de HTML semántico y no contiene nada de JavaScript, lo único que hace es darle estilo a tu código en HTML utilizando algo de CSS. Lo que quiere decir que 98.css es compatible con tu framework frontend favorito.

Para usar la librería existe una guía dentro de la misma web, también hay ejemplos de su uso con React, y con JavaScript. Puedes instalarla desde la página de lanzamientos del proyecto en GitHub, o puedes usar npm.

El objetivo principal de este proyecto es la accesibilidad

Para su creador, 98.css es simplemente un proyecto tonto y divertido con el que ejercitar su músculo open source, pero aparte de eso, no deja de ser un proyecto interesante para comparar las viejas interfaces de antes con las modernas. Especialmente por el tema de accesibilidad.

El diseño de UI actual, especialmente en el escritorio, aunque más estilizado tienen a dejar que desear en cuanto a accesibilidad. La poca diferenciación de colores y relieves en barras de herramientas, botones y menús tienden a confundir bastante. En la época de Windows 98 las cosas quizás no eran tan "bonitas", pero si que eran funcionales. Ahí hay un debate.

Cómo evitar que se pueda seleccionar contenido en una página web sin usar JavaScript (sólo con CSS)

08/05/2020
Artículo original

Imagen ornamentalTradicionalmente, si por algún motivo queremos que los usuarios no sean capaces de seleccionar ciertas partes del contenido de nuestra página Web, hemos tenido que recurrir a JavaScript. Se marcaban los elementos a "proteger" de alguna manera (por ejemplo con una clase determinada) y tras la carga de la página un código los buscaba e interceptaba ciertos eventos para anularlos e impedir así que fueran seleccionables.

La versión 4 de la especificación CSS incluye una nueva funcionalidad precisamente para esto. Todavía está en borrador (el último de enero de este año), pero ya hace tiempo que todos los navegadores del mercado lo soportan (excepto Internet Explorer, claro), incluyendo los móviles.

Se trata de la propiedad user-select. Esta propiedad controla cómo se deben seleccionar los elementos a los que se le aplica, y puede tomar los siguientes valores:

  • text: permite la selección normal de los contenidos de texto del elemento.

La figura muestra cómo se puede seleccionar el texto normalmente

  • none: impide que se pueda seleccionar el texto.

La figura animada muestra cómo, a pesar de pulsar y arrastrar, no queda nada seleccionado

  • all: deja seleccionar el texto, pero todo o nada, es decir, no permite seleccionar palabras o fragmentos sueltos. De hecho, si pulsas encima del elemento ya se selecciona todo automáticamente y si vuelves a pulsar se deselecciona. Muy útil para, por ejemplo, permitir copiar fragmentos de código, contraseñas, URLs y cosas así.

El GIF muestra cómo al pulsar encima o intentar seleccionar, se selecciona todo el texto de golpe.

  • contain: este solo funciona en elementos editables, y hace que la selección no pueda extenderse fuera del elemento, o sea, está contenida en él, de ahí su nombre:

El GIF muestra cómo, aunque arrastremos fuera del área no deja seleccionar nada que esté fuera

De esta manera podemos tener un control muy bueno sobre lo que se selecciona (o no) de nuestro contenido de una forma directa y sencilla, y sin tener que complicarnos la vida con JavaScript.

Por cierto, puedes controlar el aspecto de los elementos seleccionados gracias al pseudoelemento de CSS ::selection. Por ejemplo, puedes hacer que al seleccionarlo, en lugar del color azul por defecto se use otro color escribiendo esto en tu CSS:

#miElemento::selection {
   background-color: red;
}

que haría que tuviera color rojo cualquier selección hecha dentro del elemento llamado miElemento.

Te dejo el ejemplo que he utilizado para que puedas jugar con él, aquí (ZIP, 1.37Kb)

¡Espero que te sea útil!

GitHub presenta Codespaces, su entorno de desarrollo online

07/05/2020
Artículo original

GitHub presenta Codespaces, su entorno de desarrollo online

GitHub, la plataforma de alojamiento de proyectos de desarrollo propiedad de Microsoft, está celebrando en estos días su evento Satellite 2020 (forzosamente online, como otros eventos de la compañía, a causa de la crisis del coronavirus), y ha aprovechado la ocasión para anunciar una serie de novedades sobre su plataforma.

Shanku Niyogi, vicepresidente de GitHub, ha afirmado que evento de este año trata de "proporcionar a las comunidades herramientas que les permitan unirse para resolver problemas y eliminar barreras".

Y la mayor de las novedades anunciadas trata precisamente de eso, de facilitar a los desarrolladores la tarea de unirse a un proyecto, configurar su entorno de desarrollo y empezar a escribir código sin apenas recursos, sólo con la ayuda de un navegador.

De eso trata GitHub Codespaces, una nueva funcionalidad (en versión beta cerrada, por ahora) que permitirá al usuario escribir código directamente en la nube, proporcionándole un IDE basado en el editor Visual Studio Codespaces (conocido hasta hace unos días como Visual Studio Online).

Según Niyogi,

"Realizar contribuciones al código de una comunidad puede resultar difícil: cada repositorio tiene su propia forma de configurar un entorno de desarrollo, lo cual frecuentemente llega a requerir docenas de pasos antes de empezar a escribir código".

Esta herramienta permite activar entornos de desarrollo con un clic, incluso para proyectos en los que el usuario no haya trabajado antes, y cambiar entre ellos con facilidad; será posible, incluso, contar con varias configuraciones para un mismo proyecto:

"Los 'codespaces' se pueden configurar para cargar tu código y dependencias, tus herramientas de desarrollador, extensiones, etc. Y cambiar de un entorno a otro es bastante simple: puedes seguir navegando cada vez que quieras y, al volver, tu Codespace se volverá a abrir también, automáticamente".

"La edición de código en el IDE de Codespaces siempre será gratuita", explican desde la plataforma, pero eso no significa que cualquier uso que le demos a GitHub Codespaces sea gratis.

Así, una vez el servicio deje de ser beta, se cobrará por uso en el caso de tareas computacionalmente intensivas (como las compilaciones), por hora y según el tipo de máquina virtual que estén utilizando, como ya ocurre en el caso de GitHub Actions.

También llega GitHub Discussion y el escaneo de código

Pero GitHub Codespaces no es la única novedad presentada hoy por la plataforma: también desembarcan en GitHub los foros Discussion para proyectos, que se estructurarán en torno a hilos, permitiendo publicar recopilatorios de preguntas frecuentes y otros documentos colaborativos como hilos independientes.

Discussions

GitHub Discussions ya contaba actualmente con varias comunidades en versión beta (como las dedicadas a Prisma y React Query), pero hasta ahora estos foros no habían estado vinculados a proyectos de código concretos: en éstos, la interacción con el resto de colaboradores de un proyecto sólo podía darse en las pestañas de 'Propuestas' y de 'Solicitudes de extracción'.

Por último, GitHub también pondrá a disposición de sus usuarios herramientas automatizadas de escaneo de código, gratuitas para todos los proyectos de código abierto (el resto de proyectos también podrán usarlas, precio pago).

Su objetivo, será ayudar a los desarrolladores a detectar con anticipación posibles vulnerabilidades de seguridad, y hacerlo a una escala que funcione tanto para proyectos pequeños como grandes. Según GitHub, el escaneo de código se basará en CodeQL, un motor de análisis semántico avanzado que adquirió tras su compra de Semmle el año pasado.

Vía | TechCrunch

Microsoft Build 2020 se reconvierte en un evento tecnológico online al que cualquier usuario podrá asistir

01/05/2020
Artículo original

Microsoft Build 2020 se reconvierte en un evento tecnológico online al que cualquier usuario podrá asistir

La irrupción en Occidente de la pandemia del coronavirus el pasado mes de febrero se llevó por delante una larga lista de grandes eventos tecnológicos ya programados (algunos, a punto de ser inaugurados). Al margen de nuestro MWC barcelonés, cayeron otros referentes como el I/O de Google, el F8 de Facebook o el Build de Microsoft.

Pero precisamente el Microsoft Build 2020, una de las grandes citas anuales para desarrolladores, fue uno de los eventos que anunció que trataría de reformular su propuesta de tal modo que todos los interesados pudieran seguir online sus conferencias.

De hecho, Microsoft anunció a sus partners a comienzos de abril que había decidido reconvertir en digitales todos los eventos internos y externos que tenía programados hasta julio... de 2021. Así, Inspire (en verano) e Ignite (en otoño) serán los próximos eventos de los de Redmond que se pasarán íntegramente a lo digital.

Ya puedes inscribirte como público en el evento

De este modo, y tras el ensayo general que supuso la presentación online ante los medios de las nuevas funciones de MS Edge, Microsoft ha anunciado que a lo largo de hoy comenzará a aceptar inscripciones para su primer Build 100% digital, programado entre los días 19 y 21 de mayo.

Dos de las primeras consecuencias de este cambio de formato son que el evento pasará a ser gratuito, y que se centrará más aún en los desarrolladores, dejando más de lado a los usuarios finales de los grandes productos de consumo de Microsoft.

Además, el ámbito de interacción dejará de ser, inevitablemente, personal para pasar a desarrollarse en Twitter, si bien los periodistas podrán ver cómo la habitual sala de prensa se torna en un espacio virtual en Microsoft Teams.

En esta ocasión, las presentaciones (más breves de lo habitual, y grabadas -o pregrabadas, dependiendo del caso- por los ejecutivos de la compañía desde sus hogares) girarán en torno a la nube de Azure, a la inteligencia artificial, al 'edge computing' y a la familia de productos Microsoft 356.

En ZDNet especulan, incluso, con la posibilidad de que haya novedades sobre WinUI 3.0, la tecnología que unificará Win32 con la Plataforma Universal de Windows.

No habrá en esta ocasión una extensa 'keynote' inaugural de Satya Nadella, CEO de la compañía, aunque sí se dirigirá al público, como también lo harán probablemente el director de tecnología Kevin Scott, el responsable del área de Cloud e IA Scott Guthrie y el responsable de Experiencias y Dispositivos, Rajesh Jha.

Vía | ZDnet

Imagen | Rodrigo Ghedin (vía Wikipedia)

Página Anterior Página Siguiente