Aprende el abecedario en tres idiomas

Español

Resumen de audio

Resumen de vídeo

Canción del abecedario

A de abeja vuela sin parar,
Be de barco que va por el mar,
Ce de casa donde voy a jugar,
De de dado me gusta lanzar.

E de elefante grandote es,
Efe de flor perfumada a la vez,
Ge de gato saltando otra vez,
Hache de héroe valiente ya ves.

(Estribillo)
A be ce, vamos a aprender,
cantando juntos lo vas a saber.
Del a a la zeta lo vas a lograr,
el abecedario vas a dominar.

I de isla en el medio del mar,
Jota de jirafa que quiere bailar,
Ka de koala que quiere abrazar,
Ele de luna que se ve al brillar.

Eme de manzana roja y genial,
Ene de nube que vuela en el cielo,
Eñe de ñandú caminando ligero,
O de oso en un bosque de hielo.

(Estribillo)
A be ce, vamos a aprender,
cantando juntos lo vas a saber.
De la a a la zeta lo vas a lograr,
el abecedario vas a dominar.

Pe de pez nadando feliz,
Cu de queso que guardo yo aquí,
Erre de rana que hace “croac” así,
Ese de sol que ilumina mi país.

Te de tren que hace “chucu chucu” ya,
U de unicornio con magia y paz,
Uve de vaca que hace “muuu” de verdad,
Uve doble wifi pa’ conectarnos más.

Equis de xilófono que suena genial,
I griega de yogur que me voy a tomar,
Zeta de zorro que saluda al final.

(Estribillo final)
A be ce, ya lo sabes bien,
siempre cantando lo harás muy muy bien.
A be ce, vamos a aplaudir,
con el abecedario puedes sonreír.

Inglés

Resumen de audio

Resumen de vídeo

Catalán

Resumen de audio

Resumen de vídeo

Inteligencia artificial

¿Cómo ponerte al día?

Canales de YouTube recomendados

  • Jon Hernández. Divulgación semanal sobre IA. Publica vídeos nuevos cada lunes por la noche. Proporciona actualizaciones constantes sobre tecnologías emergentes, combinando noticias y explicaciones accesibles.
  • Carlos Santana (Dot CSV). Explicaciones profundas sobre IA y aprendizaje automático, presentadas de manera clara y amena. Uno de los divulgadores en español más reconocidos de IA. Mezcla precisión técnica con narrativa accesible, ideal para quienes buscan profundidad sin perder claridad.
  • Xavier Mitjana. Tutoriales que conectan IA con creatividad y producción, mostrando aplicaciones prácticas e inspiradoras. Orientado a quienes desean integrar IA en procesos creativos o narrativos, como cine, diseño o automatización visual.
  • Alejavi Rivera. IA explicada de forma práctica, directa y con casos reales de uso. Combina teoría con aplicación concreta, ideal para emprendedores o quienes buscan resultados inmediatos y efectivos con IA.
  • Javi Galué. Herramientas, estrategias, hacks y formas de monetizar usando IA. Muy orientado a la productividad, la creatividad aplicada y la generación de ingresos reales mediante IA.
  • Elena Santos (ChicaGeek). Consejos tecnológicos prácticos (apps, trucos, gadgets y tutoriales) pensados para facilitar la vida digital. Muy accesible y útil para el día a día; ideal para público general que busca mejorar su uso de tecnología sin tecnicismos.

Comparación de los canales recomendados

CanalEnfoque principalA destacar
Jon HernándezActualizaciones semanales de IAFrecuencia constante; enfoque claro y accesible
Carlos Santana (Dot CSV)IA explicada en profundidadEquilibrio entre rigor técnico y divulgación clara
Xavier MitjanaIA aplicada a creatividad y negociosEnfoque profesional, creativo y muy visual
Alejavi RiveraCasos prácticos de IAAplicabilidad directa; visión de marketing digital
Javi GaluéHacks, monetización y productividad con IAOrientación a resultados reales y uso eficiente
Elena Santos (ChicaGeek)Trucos tecnológicos cotidianosConsejos muy prácticos para la vida digital diaria

Vídeo con las últimas novedades

Blogs recomendados

  • Microsiervos.com. Temática muy variada (tecnología, ciencia, Internet), pero también humor, astronomía, aviación, conspiraciones, puzzles, reseñas de libros o películas y experiencias personales.
  • Xataka.com. Noticias, análisis, reseñas extensas de dispositivos (móviles, gadgets, informática), exploración espacial, energías renovables, etc., cubriendo toda la actualidad tecnológica.

Comparación de los blogs recomendados

CaracterísticaMicrosiervos.comXataka.com
OrígenesBlog personal de un grupo de amigosBlog profesional
TemáticaMuy variada: tecnología, ciencia, humor, curiosidadesTecnología aplicada, noticias, análisis, gadgets
EstiloInformal, personal, humorísticoInformativo, técnico, bien estructurado
FormatoPosts sueltos, blog estilo “diario”Publicación periódica con secciones y verticales
EquipoPequeño grupo de autores (Alvy, Wicho y colaboraciones)Equipo amplio y diversificado de periodistas y editores

¿Qué IA debo utilizar?

ChatGPT

Se puede acceder online (https://chatgpt.com) y con la app:

Muy versátil, entiende bien el lenguaje natural, ideal para redacción, resúmenes, creación de materiales didácticos y resolver dudas de alumnos. Ventaja: calidad y fluidez. Inconveniente: no siempre gratuito en sus versiones más nuevas.

Z.ai

Se puede acceder online (https://chat.z.ai).

Destaca por ser ligero, rápido y económico, con buen rendimiento en chino, inglés y español. Ventaja: eficiencia y bajo coste, y generación excelente de aplicaciones informáticas y presentaciones con diapositivas. Inconveniente: menos precisión que modelos grandes en explicaciones complejas.

Qwen

Se puede acceder online (https://chat.qwen.ai) y con la app:

Excelentes resultados en razonamiento matemático y técnico, con versiones grandes y pequeñas. Ideal para programación y ciencias. Ventaja: muy bueno en lógica y coste relativamente bajo. Inconveniente: menos natural en la redacción creativa.

Deepseek

Se puede acceder online (https://www.deepseek.com/en) y con la app:

Especializado en eficiencia y bajo consumo de recursos, pensado para análisis de datos y asistentes técnicos. Ventaja: rapidez y buena relación coste-rendimiento. Inconveniente: menos pulido en lenguaje pedagógico o creativo.

Mistral

Se puede acceder online (https://chat.mistral.ai/chat) y con la app:

Modelos europeos, abiertos y de calidad, muy buenos para tareas multilingües y razonamiento. Ventaja: muy buenos resultados con idiomas europeos. Inconveniente: no dispone de generación de presentaciones de manera automática.

Google AI Studio

Se puede acceder online (https://aistudio.google.com/welcome) y con la app:

Integración directa con Google, ideal si ya usas Google Workspace (Docs, Drive, Classroom). Ventaja: se integra fácilmente en el ecosistema escolar. Inconveniente: depende de conexión a Google y la privacidad puede ser un tema sensible en colegios, donde se suele trabajar con herramientas Microsoft.

NotebookLM

Se puede acceder online desde https://notebooklm.google.com/.

Pensado para estudiar y resumir documentos. Muy útil para alumnos y maestros que quieren convertir apuntes o libros en resúmenes y cuestionarios. Ventaja: especializado en aprendizaje. Inconveniente: no es tan flexible como otros modelos generalistas.

Grok

Accesible desde https://grok.com/.

Integrado en la red social X, con estilo más informal. Ventaja: útil para comunicación desenfadada y creatividad. Inconveniente: menos serio y todavía limitado en educación formal.

Claude

Accesible desde https://claude.ai/new. Más orientado a programadores.

Destaca en ética, seguridad, comprensión de textos largos, y programación de aplicaciones informáticas. Ideal para trabajar con documentos extensos y entornos donde se busca una IA más enfocada al mundo empresarial. Ventaja: maneja textos muy largos y cuida el tono. Inconveniente: menos creativo que ChatGPT.

Hugging Face

Accesible desde https://huggingface.co/spaces.

No es un modelo en sí, sino una plataforma que reúne cientos de modelos de IA abiertos. Ventaja: enorme flexibilidad y recursos gratuitos para experimentar. Inconveniente: requiere más conocimientos técnicos para elegir y usar el modelo correcto (orientado a usuarios expertos).

Comparación de los diversos modelos

IAFortalezasDebilidadesUso ideal en educación
ChatGPTMuy fluido y versátil en lenguaje; excelente para redacción, resúmenes y explicaciones creativasVersiones avanzadas pueden tener costo; menos personalizable a nivel técnicoRedacción de actividades, generación de ejemplos, guías didácticas
Z.ai (GLM‑4.5)Modelo unificado con razonamiento, codificación y agentes; código abierto y coste competitivo (Business Insider, z.ai)Comunidad menor en españolBúsquedas en Internet, razonamiento avanzado, creación de presentaciones y aplicaciones informáticas
Qwen (Alibaba)Gran variedad multimodal (texto, audio, imagen/video); razonamiento avanzado; multilingüe (Wikipedia, Wikipedia, Prismetric)Ecosistema menos conocido fuera de ChinaRecursos multimedia, explicación con voz e imagen, programación de aplicaciones informáticas
DeepSeekAltamente eficiente y abierto; razonamiento potente a muy bajo coste (The Wall Street Journal, Business Insider, Wikipedia)Censura en temas sensibles según versión; consideraciones de privacidad (The Times, Wikipedia)Para recursos locales o de investigación avanzada, cuando se tiene soporte técnico y precaución con contenido censurable
MistralOpen source, flexible, desplegable localmente, razonamiento multilingüe eficiente (kalm.works, Medium, Appvizer)Comunidad menor en educaciónPersonalización local, modelado lingüístico adaptado al contexto local
Google AI Studio / GeminiIntegración con Workspace (Docs, Drive, Classroom); resumen de archivos, notas automáticas (Android Central)Depende del ecosistema Google; preocupaciones de privacidad institucionalIntegración en flujos escolares existentes, generación de notas y resúmenes automáticos
NotebookLM (Google)Asistente de investigación: resúmenes, guías de estudio, podcasts automáticos en español (Cinco Días, Wikipedia, blog.google, Revolgy)Menor flexibilidad para otros usos creativos fuera de investigaciónPreparación de guías, podcasts educativos, interacción con documentos complejos
Grok (xAI)Integración en X y búsquedas en tiempo real, razonamiento avanzado (Grok 4) (Tom’s Guide, Wikipedia, Business Insider)Historial de respuestas controvertidas; riesgo de sesgos; requiere supervisión crítica (The Wall Street Journal)Uso en comunicación dinámica, debates o actividades creativas (con precaución)
Claude (Anthropic)Usado ampliamente a nivel profesional y creación de aplicaciones informáticas (swiftask.ai, anthropic.com)Menor creatividad espontánea; acceso limitado; ecosistema cerrado (reddit.com)Crear cuestionarios, diseño curricular, aplicaciones informáticas, uso empresarial
Hugging FacePlataforma con acceso a muchos modelos abiertos; ideal para explorar y experimentarNecesita conocimientos técnicos para elegir y probar modelos adecuadosExploración de nuevas IA y prototipos para usos específicos educativos

Ejemplos de uso utilizando Qwen, Grok y Claude

¿Qué IA es la mejor?

Ranking mundial

En la página web LMArena podemos utilizar los modelos de inteligencia artificial más populares. Es una plataforma abierta y colaborativa que permite realizar comparaciones directas mediante “batallas” anónimas: el usuario introduce un prompt, recibe dos respuestas generadas por modelos distintos y elige cuál le parece mejor; luego se revelan las identidades de los modelos y el resultado se suma a un ranking público. Creada por investigadores de la Universidad de California en Berkeley, se ha convertido en un referente porque combina transparencia (sus datos se publican para investigación), participación comunitaria y alcance global, evaluando desde modelos de código abierto hasta prototipos pre-lanzamiento de gigantes como OpenAI, Google o Anthropic.

Por ejemplo, en los siguientes enlaces se puede consultar el ranking mundial de los modelos de IA más populares para generación de texto en español, para resolución de problemas matemáticos, para escritura creativa, y de generación y edición de imágenes, según las valoraciones de los usuarios:

Además, se pueden probar todos los modelos de forma gratuita a través de este enlace: https://lmarena.ai/?mode=direct

Casos prácticos

Traducciones

Traductor de Google desde su app:

Generación y edición de imágenes e infografías completas

Ejemplos generados con ChatGPT utilizando imágenes reales (en diciembre del 2024, y agosto del 2025 respectivamente):

Ejemplo generados con «Nano Banana» desde Google AI Studio con los siguientes prompts:

  • Crea un dibujo de un niño corriendo porque llega tarde al colegio y sus padres están detrás, con estilo manga.
  • Cambia la torre del reloj por la Torre Eiffel.

Modelo recomendado «Nano Banana» accesible desde Google AI Studio (es mejor modelo de generación de imágenes que el proporcionado por ChatGPT 5):

Generación de presentaciones con diapositivas

Presentación de ejemplo sobre la Cabalgata de los Reyes Magos de Alcoy generada desde Z.ai:

Presentación de ejemplo para aprender nombres de animales en inglés, generada automáticamente desde kimi.com:

Modelos recomendados:

  • «GLM» desde Z.ai:

Generación de podcasts (o resúmenes)

Ejemplo generado automáticamente a partir de la información disponible en la Wikipedia (https://es.wikipedia.org/wiki/Cabalgata_de_Reyes_Magos_de_Alcoy):

Accesible desde https://notebooklm.google.com/:

Generación de vídeos explicativos

Ejemplo generado automáticamente a partir de la información disponible en la Wikipedia (https://es.wikipedia.org/wiki/Cabalgata_de_Reyes_Magos_de_Alcoy):

Accesible desde https://notebooklm.google.com/:

Libros ilustrados

Modelo recomendado «Gemini» desde Gemini Storybook:

Generación de series completas

Servicio proporcionado por Showrunner:

Generación de música

Las vocales en canción:

El baile del abecedario:

Modelo recomendado «Suno 4.5» de Suno.com:

Mundos virtuales

Modelo «Mirage 2» de DynamicsLab. Demostraciones disponibles aquí: https://demo.dynamicslab.ai/chaos.

Publicar libros en Amazon

Servicio accesible desde https://kdp.amazon.com/:

Manual básico de Scikit-learn

Introducción a Scikit-learn

Scikit-learn es una de las librerías más populares utilizadas en Python para el aprendizaje automático (machine learning). Fue desarrollada como parte del ecosistema científico de Python y se ha convertido en una herramienta fundamental para investigadores, analistas de datos y desarrolladores que buscan aplicar algoritmos de aprendizaje automático a problemas del mundo real.

¿Qué es Scikit-learn?

Scikit-learn es una librería de código abierto construida sobre otras librerías fundamentales de Python como NumPy, SciPy y matplotlib. Ofrece una amplia gama de herramientas para abordar la resolución de problemas mediante aprendizaje automático y análisis de datos. Incluye algoritmos de clasificación, regresión, clustering (agrupamiento), reducción de dimensionalidad, selección de modelos, y preprocesamiento de datos, tales como:

  1. Clasificación: Asignar etiquetas a datos de entrada.
    • Detección de spam: Clasificar correos electrónicos como spam o no spam.
    • Reconocimiento de imágenes: Identificar objetos en imágenes (por ejemplo, reconocimiento facial).
    • Diagnóstico médico: Clasificar si un paciente tiene o no una enfermedad basada en datos clínicos.
  2. Regresión: Predecir valores continuos.
    • Predicción de precios: Estimar el precio de viviendas en base a características como el tamaño y la ubicación.
    • Análisis de ventas: Predecir las ventas futuras basadas en datos históricos.
  3. Clustering (agrupamiento): Agrupar datos en categorías no etiquetadas.
    • Segmentación de clientes: Agrupar clientes en segmentos basados en su comportamiento de compra.
    • Compresión de datos: Reducción de la dimensionalidad de los datos para visualizar conjuntos complejos.
  4. Reducción de dimensionalidad: Reducir el número de características en un conjunto de datos para facilitar la visualización o mejorar la eficiencia de otros algoritmos.
    • Análisis de Componentes Principales (PCA): Simplificar datos de alta dimensión para exploración visual.
  5. Selección de modelos y optimización: Elegir el mejor modelo y ajustar los hiperparámetros para mejorar el rendimiento.

¿Por qué Scikit-learn es tan popular?

Scikit-learn es muy popular por varias razones que lo convierten en una herramienta esencial para cualquier persona involucrada en el análisis de datos o el desarrollo de modelos predictivos:

  1. Accesibilidad y simplicidad: Una de las principales ventajas de scikit-learn es su simplicidad, incluso para aquellos que son nuevos en el campo del aprendizaje automático. Gracias a su API consistente, es fácil aprender a usar un algoritmo y luego aplicar los conocimientos a otros sin necesidad de aprender nuevas sintaxis complejas.
  2. Versatilidad y flexibilidad: Puede utilizarse en la resolución de una amplia gama de problemas, desde algunos muy simples hasta otros extremadamente complejos. Esto hace que scikit-learn sea adecuado para aplicaciones en diversos campos, como la medicina, finanzas, marketing, y tecnología, entre otros.
  3. Eficiencia y rapidez: Scikit-learn está altamente optimizado para funcionar con grandes volúmenes de datos y realizar cálculos complejos rápidamente, lo que es crucial en entornos empresariales donde el tiempo es esencial.
  4. Facilita la experimentación y prototipado rápido: Scikit-learn permite a los usuarios probar rápidamente diferentes algoritmos y técnicas, ver sus resultados y ajustar modelos sin necesidad de un conocimiento profundo de la matemática detrás de cada algoritmo. Esto acelera el proceso de descubrimiento y la innovación.
  5. Compatibilidad con entornos de producción: Los modelos desarrollados con scikit-learn se pueden integrar fácilmente en aplicaciones en producción, lo que permite trasladar las ideas y prototipos desde el laboratorio de datos hasta el uso real en aplicaciones y servicios.
  6. Aprendizaje reforzado por la comunidad: La comunidad de scikit-learn no solo proporciona soporte continuo, sino que también contribuye con mejoras regulares, manteniendo la librería actualizada con las últimas investigaciones y avances en el campo del aprendizaje automático.
  7. Integración con herramientas de visualización: Aunque no es una librería de visualización, scikit-learn se integra bien con matplotlib y otras herramientas para crear gráficos que ayudan a interpretar los resultados de los modelos, lo cual es clave para la toma de decisiones basada en datos.

¿Qué nos aporta Scikit-learn?

  1. Amplia gama de algoritmos y funcionalidades: Incluye desde algoritmos básicos como la regresión lineal hasta técnicas avanzadas como bosques aleatorios y métodos de boosting, lo que permite abordar prácticamente cualquier problema con una sola librería.
  2. Preprocesamiento de datos: Herramientas para la limpieza, normalización, escalado y transformación de datos, permitiendo preparar los datos para el modelado de manera sencilla.
  3. Algoritmos específicos de aprendizaje automático: Scikit-learn incluye una gran variedad de algoritmos para tareas de clasificación, regresión y clustering, como Regresión Lineal, Máquinas de Soporte Vectorial (SVM), K-Means, Bosques Aleatorios, y muchos más.
  4. Interoperabilidad con el ecosistema de python: Scikit-learn se integra perfectamente con otras librerías como pandas (para manipulación de datos), NumPy (para cálculos numéricos), y matplotlib (para visualización de datos). Esto facilita la creación de flujos de trabajo completos y simplifica el desarrollo y la implementación de modelos.
  5. Evaluación y mejora continua: Ofrece herramientas robustas para evaluar la precisión y la validez de los modelos mediante métodos como la validación cruzada, matrices de confusión, y métricas de clasificación como precisión, recall y F1-score.
  6. Optimización de modelos: Herramientas como Grid Search y Random Search permiten ajustar los hiperparámetros de los modelos de manera efectiva, mejorando la precisión y el rendimiento del modelo sin necesidad de realizar ajustes manuales tediosos.
  7. Interfaz consistente: Todos los algoritmos comparten una interfaz coherente y simple, lo que facilita cambiar entre diferentes modelos con muy poco esfuerzo.
  8. Documentación actualizada: Scikit-learn cuenta con una documentación extensa, clara y llena de ejemplos prácticos. Además, tiene una gran comunidad de usuarios y desarrolladores, lo que facilita encontrar ayuda, tutoriales y soluciones a problemas comunes.

Instalación de Scikit-learn

Podemos instalar scikit-learn fácilmente utilizando el gestor de paquetes pip, que viene instalado con Python. Basta con abrir el terminal (o símbolo del sistema en Windows) y escribir el siguiente comando para instalar scikit-learn junto con sus dependencias:

pip install scikit-learn

Importar y comenzar a usar Scikit-learn

Scikit-learn se usa a través de sus módulos específicos, que se importan según las necesidades específicas de cada proyecto. Algunas de las funcionalidades más comunes son las siguientes:

  • Preprocesamiento de datos: Para escalar, normalizar y transformar datos.
  • Modelos de aprendizaje supervisado: Para tareas de regresión y clasificación.
  • Modelos de aprendizaje no supervisado: Para clustering y reducción de dimensionalidad.

Ejemplo de importación

# Importar módulos de preprocesamiento
from sklearn.preprocessing import StandardScaler, LabelEncoder

# Importar modelos de aprendizaje supervisado
from sklearn.linear_model import LinearRegression
from sklearn.svm import SVC

# Importar modelos de aprendizaje no supervisado
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA

# Importar funciones de evaluación
from sklearn.metrics import accuracy_score, confusion_matrix

Jupyter Notebook y Google Colab

Para una experiencia más interactiva y visual, se pueden usar entornos como Jupyter Notebook o Google Colab:

  • Google Colab: Es un entorno basado en web que no requiere instalación y ofrece GPU gratuita para acelerar el entrenamiento de modelos. Puedes acceder a él a través de Google Colab.
  • Jupyter Notebook: Puedes instalarlo con pip usando pip install jupyterlab y luego ejecutarlo con el comando jupyter notebook. Es ideal para experimentar con código y visualizar resultados en tiempo real.

Fundamentos de Scikit-learn

Scikit-learn facilita el trabajo con modelos predictivos y de aprendizaje automático proporcionando una serie de herramientas para:

  1. Cargar y preparar datos: scikit-learn no tiene herramientas propias para la carga de datos desde archivos como CSV, Excel o bases de datos, pero se complementa perfectamente con otras librerías como pandas y numpy que permiten manipular datos fácilmente. Por lo tanto, uno de los primeros pasos en cualquier proyecto de machine learning es cargar los datos con pandas.
  2. Preprocesamiento de datos: Este es un paso esencial. Los datos crudos generalmente no están listos para usarse en un modelo. Pueden tener valores faltantes, variables categóricas que necesitan ser convertidas en números, o los datos pueden necesitar ser escalados para mejorar la precisión del modelo. Scikit-learn tiene una variedad de transformadores para realizar estos ajustes.
  3. Entrenamiento de modelos: Una vez los datos están listos, puedes entrenar un modelo. Esto implica usar un algoritmo de aprendizaje automático para ajustar el modelo a tus datos. Algunos ejemplos de algoritmos son la regresión lineal para predicción de valores numéricos y las máquinas de soporte vectorial (SVM) para clasificación.
  4. Evaluación de modelos: Después de entrenar un modelo, es fundamental medir su rendimiento. Scikit-learn proporciona diversas métricas para evaluar la precisión, como la matriz de confusión, precisión, recall, entre otras.
  5. Predicciones: Finalmente, puedes usar tu modelo entrenado para hacer predicciones sobre nuevos datos que no se usaron durante el entrenamiento. Esto es útil en aplicaciones como predicciones de ventas, clasificación de correos como spam o no spam, etc.

Preprocesamiento de datos

El preprocesamiento de datos consiste en preparar tus datos para que un modelo de aprendizaje automático los pueda usar correctamente. Esto incluye tareas como escalar los datos (ajustar la escala de las variables para que tengan la misma importancia), transformar datos categóricos en numéricos, o vectorizar texto.

Ejemplo básico: Escalar datos numéricos

Imagina que tienes un conjunto de datos con varias características numéricas, pero estas están en diferentes rangos. Por ejemplo, una columna puede tener valores entre 0 y 1000, mientras que otra tiene valores entre 0 y 1. Esto puede confundir a muchos modelos de aprendizaje automático porque algunas características parecen tener más peso simplemente porque sus números son más grandes. Para evitar esto, se utilizan técnicas de escalado.

En el ejemplo que se muestra a continuación, usamos StandardScaler de scikit-learn para estandarizar los datos de modo que tengan una media de 0 y una desviación estándar de 1:

from sklearn.preprocessing import StandardScaler
import numpy as np

# Datos de ejemplo: una matriz con tres filas y tres columnas
X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# Crear el escalador
scaler = StandardScaler()

# Ajustar (fit) el escalador y transformar (transform) los datos
X_scaled = scaler.fit_transform(X)

print(X_scaled)

Explicación del código:

  1. StandardScaler() crea un objeto escalador que se usará para ajustar y transformar los datos.
  2. fit_transform(X) ajusta el escalador a los datos y luego transforma esos datos, es decir, calcula la media y desviación estándar de cada columna y luego aplica la transformación para escalar los valores.

El escalado de datos es particularmente útil en algoritmos como regresión lineal, SVM y redes neuronales, donde los valores numéricos deben estar en un rango similar para un mejor rendimiento.

Algoritmos de aprendizaje supervisado

Los algoritmos de aprendizaje supervisado son aquellos que aprenden a partir de datos etiquetados, es decir, datos en los que sabemos cuál es la salida correcta (etiqueta). Uno de los algoritmos más simples es la regresión lineal, que predice un valor numérico basado en las características de entrada.

Ejemplo: Regresión lineal

La regresión lineal trata de ajustar una línea recta (o un plano en dimensiones superiores) que describa la relación entre las variables independientes (X) y la variable dependiente (Y).

from sklearn.linear_model import LinearRegression
import numpy as np

# Datos de ejemplo: X son las variables independientes (entrada) y y es la variable dependiente (salida)
X = np.array([[1], [2], [3], [4]])  # Cada número es una característica, en este caso un solo valor por observación
y = np.array([3, 6, 9, 12])  # Resultados que queremos aprender a predecir

# Crear el modelo de regresión lineal
model = LinearRegression()

# Entrenar el modelo con los datos
model.fit(X, y)

# Predecir un nuevo valor con el modelo entrenado
prediction = model.predict([[5]])
print(prediction)  # Salida esperada: [15]

Explicación del código:

  1. LinearRegression() crea un modelo de regresión lineal.
  2. model.fit(X, y) entrena el modelo con los datos de entrada X y los resultados conocidos y.
  3. model.predict([[5]]) usa el modelo entrenado para predecir el resultado cuando X = 5.

Este ejemplo muestra un caso simple, pero la regresión lineal se usa ampliamente en aplicaciones como la predicción de ventas, la valoración de bienes inmuebles o incluso en la ciencia para encontrar relaciones entre variables.

Aplicación real: Predicción de precios de casas

Imaginemos que tenemos un conjunto de datos de casas con características como el tamaño, número de habitaciones, etc., y queremos predecir el precio de una casa nueva basada en esas características. Para mejorar la precisión, primero escalamos los datos usando StandardScaler.

from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
import pandas as pd

# Supongamos que tenemos un archivo CSV con datos sobre casas
data = pd.read_csv('casas.csv')
X = data.drop('Precio', axis=1)  # Variables independientes (tamaño, habitaciones, etc.)
y = data['Precio']  # Variable dependiente (precio)

# Escalar los datos
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# Crear y entrenar el modelo
model = LinearRegression()
model.fit(X_scaled, y)

# Predecir el precio de una casa nueva con características específicas
nueva_casa = [[200, 3, 2, 1]]  # Tamaño de 200 m², 3 habitaciones, 2 baños, 1 garaje
nueva_casa_scaled = scaler.transform(nueva_casa)
precio_predicho = model.predict(nueva_casa_scaled)

print(precio_predicho)

Explicación del código:

  1. data = pd.read_csv('casas.csv'): Carga los datos desde un archivo CSV.
  2. X = data.drop('Precio', axis=1) y y = data['Precio']: Separa las características (X) del valor que queremos predecir (y).
  3. scaler.fit_transform(X): Escala los datos para que todas las características estén en un rango similar.
  4. model.fit(X_scaled, y): Entrena el modelo usando los datos escalados.
  5. model.predict(): Usa el modelo entrenado para hacer una predicción.

Aprendizaje supervisado para clasificación

La clasificación es otra tarea importante del aprendizaje supervisado, donde el objetivo es asignar etiquetas a datos de entrada. Un ejemplo clásico es clasificar correos electrónicos como spam o no spam.

Ejemplo: Clasificación de texto (spam vs no spam)

Este ejemplo muestra cómo usar TfidfVectorizer para convertir texto en datos numéricos y SVC (máquinas de soporte vectorial) para entrenar un modelo de clasificación.

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import SVC
from sklearn.pipeline import make_pipeline
import pandas as pd

# Datos de ejemplo con textos y etiquetas (1 para spam, 0 para no spam)
data = pd.DataFrame({
    'texto': ['Hola, ¿cómo estás?', 'Gana dinero rápido', 'Te extrañamos', 'Oferta exclusiva para ti'],
    'spam': [0, 1, 0, 1]
})

# Crear un pipeline con TfidfVectorizer (para vectorizar texto) y SVC (para clasificar)
model = make_pipeline(TfidfVectorizer(), SVC(probability=True))

# Entrenar el modelo con los datos
model.fit(data['texto'], data['spam'])

# Predecir si un nuevo mensaje es spam
nuevo_mensaje = '¡Oferta exclusiva para ganar dinero!'
probabilidad = model.predict_proba([nuevo_mensaje])[0][1] * 100
print(f'Probabilidad de spam: {probabilidad}%')

Explicación del código:

  1. TfidfVectorizer() convierte texto en una representación numérica que el modelo puede usar. Calcula una medida llamada «TF-IDF» que refleja la importancia de las palabras en el texto.
  2. SVC() es un modelo de clasificación que aprende a separar las clases (spam y no spam) a partir de los datos de entrenamiento.
  3. make_pipeline() crea un flujo de trabajo que primero vectoriza el texto y luego aplica el modelo de clasificación.

Aprendizaje no supervisado

En el aprendizaje no supervisado, los modelos tratan de encontrar patrones en datos que no tienen etiquetas conocidas. Un algoritmo común es k-Nearest Neighbors (k-NN), que puede usarse para sugerir recetas basadas en ingredientes disponibles.

Ejemplo: k-Nearest Neighbors (k-NN) para sugerir recetas

El siguiente ejemplo muestra cómo usar k-NN para sugerir recetas similares basadas en los ingredientes proporcionados.

from sklearn.neighbors import NearestNeighbors
from sklearn.preprocessing import MultiLabelBinarizer
import pandas as pd

# Datos de ejemplo: lista de recetas y sus ingredientes
data = pd.DataFrame({
    'receta': ['Pasta con tomate', 'Ensalada de pollo', 'Tacos de pescado'],
    'ingredientes': ['pasta,tomate', 'lechuga,pollo', 'pescado,tortilla']
})

# Convertir los ingredientes en una representación binaria
mlb = MultiLabelBinarizer()
X = mlb.fit_transform(data['ingredientes'].apply(lambda x: x.split(',')))

# Crear y entrenar el modelo k-NN
model = NearestNeighbors(n_neighbors=2, metric='jaccard')
model.fit(X)

# Sugerir recetas basadas en los ingredientes proporcionados
ingredientes = ['tomate', 'pasta']
ingredientes_vector = mlb.transform([ingredientes])
distancias, indices = model.kneighbors(ingredientes_vector, n_neighbors=2)

# Mostrar recetas sugeridas
for idx in indices[0]:
    print(data.iloc[idx]['receta'])

Explicación del código:

  1. MultiLabelBinarizer() convierte listas de ingredientes en vectores binarios donde cada posición indica si un ingrediente está presente.
  2. NearestNeighbors() encuentra las recetas más cercanas a las dadas basándose en la similitud de ingredientes.
  3. kneighbors() busca las recetas más cercanas (vecinas) a los ingredientes proporcionados.

Uso de modelos de clasificación en aplicaciones más específicas

Los modelos de clasificación intentan predecir una etiqueta o clase para cada observación en los datos. Este tipo de problemas es común en una gran variedad de aplicaciones en campos más específicos. A través de los pasos de preparación de datos, preprocesamiento, entrenamiento y predicción, scikit-learn nos facilita el desarrollo de modelos que pueden ser usados en aplicaciones del mundo real, tales como:

  • Diagnóstico médico: Determinar si un paciente tiene una enfermedad en base a sus síntomas y análisis médicos.
  • Finanzas: Predecir si un cliente cumple las condiciones adecuadas para aprobar la concesión de un crédito.
  • Crowdfunding: Predecir si una campaña tendrá éxito en base a sus características.

A continuación vamos a detallar un ejemplo donde intentaremos predecir el éxito de campañas de crowdfunding. Así mostraremos cómo se puede utilizar un modelo de clasificación para resolver un problema práctico más concreto y específico.

Ejemplo: Predicción de éxito en campañas de crowdfunding

Contexto del problema: Imagina que tienes datos históricos de campañas de crowdfunding. Cada campaña tiene varias características (como la categoría del proyecto, el monto recaudado, la meta financiera, la duración de la campaña, etc.). El objetivo es entrenar un modelo que pueda predecir si una campaña tendrá éxito o no.

Paso 1: Preparación de los datos

El primer paso en cualquier problema de clasificación es preparar los datos de entrenamiento:

# Importar las bibliotecas necesarias
from sklearn.ensemble import RandomForestClassifier
import pandas as pd

# Supongamos que tenemos datos de campañas de crowdfunding
# Cada fila representa una campaña con sus características y si tuvo éxito (1) o no (0)
data = pd.DataFrame({
    'Categoría': ['Tecnología', 'Arte', 'Música'],
    'Meta Financiera': [5000, 3000, 8000],
    'Dinero Recaudado': [4000, 3500, 2000],
    'Duración (días)': [30, 40, 25],
    'Número de Patrocinadores': [20, 30, 10],
    'Éxito': [1, 1, 0]  # 1 indica que la campaña tuvo éxito, 0 indica que no tuvo éxito
})

# Mostrar los datos de ejemplo
print(data)

Explicación de los datos:

  • Categoría: La categoría a la que pertenece la campaña, como Tecnología, Arte o Música.
  • Meta Financiera: La cantidad de dinero que se espera recaudar.
  • Dinero Recaudado: El dinero que efectivamente se recaudó.
  • Duración (días): Los días que duró la campaña.
  • Número de Patrocinadores: El número de personas que contribuyeron a la campaña.
  • Éxito: Etiqueta que indica si la campaña tuvo éxito (1) o no (0).

Paso 2: Preprocesamiento de los datos

Antes de entrenar un modelo, necesitamos transformar las variables categóricas (en este caso, la categoría del proyecto) en un formato que los modelos puedan entender. Para esto, usamos get_dummies() que convierte las categorías en variables numéricas llamadas variables dummy:

# Convertir la variable categórica 'Categoría' en variables dummy
data = pd.get_dummies(data, columns=['Categoría'])

# Separar las características (X) y la variable objetivo (y)
X = data.drop('Éxito', axis=1)  # Características de entrada
y = data['Éxito']  # Variable de salida que queremos predecir

# Mostrar las nuevas características después de la transformación
print(X)

Explicación del preprocesamiento:

  • get_dummies() crea nuevas columnas para cada categoría. Por ejemplo, si la categoría es «Tecnología», se crea una columna Categoría_Tecnología con valores 1 (si es de esa categoría) o 0 (si no lo es).
  • X contiene las características que usaremos para predecir y y contiene las etiquetas de éxito (1) o fracaso (0).

Paso 3: Entrenamiento del modelo

En este ejemplo, usaremos un Random Forest Classifier (clasificador de bosque aleatorio), que es un modelo potente y versátil. Este algoritmo combina muchos árboles de decisión para mejorar la precisión y reducir el riesgo de sobreajuste.

# Crear y entrenar el modelo de bosque aleatorio
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X, y)  # Entrenar el modelo con las características X y la variable objetivo y

Explicación del modelo:

  • RandomForestClassifier(n_estimators=100) crea un modelo de bosque aleatorio con 100 árboles de decisión. Cuantos más árboles, más robusto es el modelo, pero también se necesitará más tiempo para completar el entrenamiento.
  • model.fit(X, y) ajusta (entrena) el modelo a los datos, encontrando patrones que relacionan las características con la etiqueta de éxito o fracaso.

Paso 4: Predicción de un nuevo proyecto

Una vez que el modelo está entrenado, puedes usarlo para predecir la probabilidad de éxito de nuevas campañas. A continuación, mostramos cómo hacer una predicción para una nueva campaña:

# Crear un nuevo proyecto para predecir
nuevo_proyecto = pd.DataFrame({
    'Meta Financiera': [6000],
    'Dinero Recaudado': [4500],
    'Duración (días)': [35],
    'Número de Patrocinadores': [25],
    'Categoría_Arte': [0],
    'Categoría_Música': [0],
    'Categoría_Tecnología': [1]  # Esta campaña es de Tecnología
})

# Mostrar los datos del nuevo proyecto
print(nuevo_proyecto)

# Predecir la probabilidad de éxito del nuevo proyecto
probabilidad_exito = model.predict_proba(nuevo_proyecto)[0][1] * 100
print(f'Probabilidad de éxito: {probabilidad_exito:.2f}%')

Explicación de la predicción:

  • nuevo_proyecto contiene las características del nuevo proyecto. Observa que debe tener las mismas columnas que las características de entrenamiento (X).
  • model.predict_proba(nuevo_proyecto) devuelve la probabilidad de cada clase (0 o 1). [0][1] selecciona la probabilidad de que el proyecto sea exitoso (1).
  • Multiplicamos por 100 para convertir la probabilidad a un porcentaje.

Análisis de resultados y ajuste del modelo

Después de predecir, es fundamental analizar el rendimiento del modelo y ajustarlo si es necesario:

  1. Métricas de evaluación: Usar métricas como precisión, recall, f1-score, y matriz de confusión para evaluar la calidad de predicción del modelo. En problemas de negocio reales, un alto recall (identificar todas las campañas exitosas) puede ser más importante que la precisión.
  2. Ajuste de hiperparámetros: Experimentar con el número de árboles (n_estimators) o la profundidad máxima de cada árbol (max_depth) para mejorar el rendimiento.
  3. Validación cruzada: Usar técnicas como la validación cruzada para asegurar que el modelo no esté sobreajustado a los datos de entrenamiento y pueda generalizar bien a nuevos datos.

Conclusión

Scikit-learn se ha convertido en una herramienta muy popular y versátil dentro del campo del aprendizaje automático debido a su simplicidad, la amplitud de sus capacidades y su integración con el ecosistema de Python. Es la elección perfecta tanto para principiantes como para expertos que buscan aplicar machine learning de manera efectiva en sus proyectos. Con scikit-learn, es posible abordar problemas complejos de predicción, clasificación y análisis de datos con una curva de aprendizaje moderada, proporcionando resultados precisos y valiosos que facilitan la toma de decisiones en el mundo real.

Juegos en red y minijuegos

Multijugador

UNO (hasta 4 jugadores)

https://uno1.fernandoruizrico.com y https://uno2.fernandoruizrico.com

UNO (hasta 8 jugadores)

https://uno3.fernandoruizrico.com y https://uno4.fernandoruizrico.com

GRAVITY (shooter, conquista civilizaciones en el espacio)

https://gravity1.fernandoruizrico.com y https://gravity2.fernandoruizrico.com

EL GRAN QUESO (shooter, destruye la luna)

https://cheese1.fernandoruizrico.com y https://cheese2.fernandoruizrico.com

BALONCESTO (encestar, ambiente espacial)

https://basketball1.fernandoruizrico.com y https://basketball2.fernandoruizrico.com

MAZMORRA (shooter, deathmatch, sólo 1 sala)

https://dungeon1.fernandoruizrico.com y https://dungeon2.fernandoruizrico.com

MAZMORRA (shooter, deathmatch, varias salas)

https://dungeon3.fernandoruizrico.com y https://dungeon4.fernandoruizrico.com

DIEP.IO (arena 2D, tanques)

https://diep1.fernandoruizrico.com y https://diep2.fernandoruizrico.com

TANQS.IO (arena 2D, tanques)

https://tanks1.fernandoruizrico.com y https://tanks2.fernandoruizrico.com

TANKS (arena 3D, tanques)

https://tanks3.fernandoruizrico.com y https://tanks4.fernandoruizrico.com

ZORB.IO (3D, espacio, absorber otros jugadores)

https://zorb1.fernandoruizrico.com y https://zorb2.fernandoruizrico.com

AGAR.IO (2D, absorber otros jugadores)

https://agario1.fernandoruizrico.com y https://agario2.fernandoruizrico.com

HEX (estrategia)

https://hex1.fernandoruizrico.com y https://hex2.fernandoruizrico.com

BOMBERBOX (bomberman)

https://bomber1.fernandoruizrico.com y https://bomber2.fernandoruizrico.com

BOMBER (bomberman)

https://bomber3.fernandoruizrico.com y https://bomber4.fernandoruizrico.com

SNAKE (serpiente)

https://snakes3.fernandoruizrico.com y https://snakes4.fernandoruizrico.com

TRON (tron legacy)

https://tron1.fernandoruizrico.com y https://tron2.fernandoruizrico.com

PICTIO (pictionary)

https://pictio1.fernandoruizrico.com y https://pictio2.fernandoruizrico.com

WORDS (mini scrabble, adivinar palabras)

https://words1.fernandoruizrico.com y https://words2.fernandoruizrico.com

Minijuegos

LIBRERAMA (ritmo rápido)

https://minigames1.fernandoruizrico.com

MINIGAME MADNESS (ritmo rápido)

https://minigames2.fernandoruizrico.com

CRISP GAMES (juega con un solo botón)

https://minigames3.fernandoruizrico.com

Programación con JavaScript: Peticiones a un servidor

El método fetch de JavaScript nos proporciona la funcionalidad necesaria para comunicarnos con servidores web directamente desde el navegador. Nos permite realizar todo tipo de peticiones HTTP (como obtener datos, enviar formularios, actualizar o eliminar información) de manera sencilla y eficiente.

Introducción

Lo que hace especial a fetch es su capacidad para trabajar con promesas, lo que permite manejar respuestas asíncronas del servidor de una manera más limpia y organizada. En esencia, fetch te permite solicitar recursos o enviar datos a un servidor y luego, una vez que la petición es procesada, trabajar con la respuesta, ya sea extrayendo su contenido en diferentes formatos (como texto o JSON) o manejando posibles errores que ocurran durante el proceso. Esta funcionalidad es crucial para el desarrollo de aplicaciones web modernas, donde la interacción constante con APIs y servicios externos es una práctica común para mostrar datos dinámicos, realizar actualizaciones en tiempo real y mejorar la experiencia del usuario en la web.

Para usar la función fetch en JavaScript y hacer peticiones a un servidor, primero necesitas entender qué es y cómo funciona. La función fetch nos permite realizar peticiones HTTP (como GET, POST, PUT, y DELETE) a un servidor desde un navegador web. Esta función devuelve una promesa que se resuelve con el objeto de respuesta del servidor, permitiéndote luego manipular esta respuesta, ya sea extrayendo el cuerpo de la misma en el formato deseado (como texto, JSON, etc.) o manejando errores.

Realizar una petición básica con fetch

Para hacer una petición GET simple, puedes utilizar fetch con la URL del recurso que deseas obtener.

fetch('https://api.example.com/data')
  .then(response => response.json()) // Convierte la respuesta a JSON
  .then(data => console.log(data)) // Maneja los datos de la respuesta
  .catch(error => console.error('Hubo un error:', error)); // Maneja los errores

En este caso, fetch('https://api.example.com/data') realiza una petición GET a la URL proporcionada. La función .then(response => response.json()) recoge la respuesta HTTP y la convierte a JSON. Luego, otro .then recibe esos datos ya procesados y, por ejemplo, los imprime en la consola. Finalmente, .catch captura cualquier error que pueda ocurrir durante la petición o procesamiento de la respuesta.

Enviar una petición con método POST

Para enviar datos a un servidor, como un formulario o información en formato JSON, puedes utilizar el método POST.

fetch('https://api.example.com/submit', {
  method: 'POST', // Método HTTP
  headers: {
    'Content-Type': 'application/json', // Indica el tipo de contenido que se está enviando
  },
  body: JSON.stringify({
    name: 'Usuario',
    message: 'Hola, mundo'
  }) // Datos que se envían convertidos a cadena JSON
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Hubo un error:', error));

Aquí, el segundo argumento de fetch es un objeto que configura la petición, especificando el método HTTP (method: 'POST'), los encabezados (headers) para indicar el tipo de contenido que se está enviando, y el cuerpo de la petición (body), que contiene los datos enviados al servidor. Los datos deben ser una cadena JSON, por lo que se utiliza JSON.stringify para convertir un objeto JavaScript a esta cadena.

Control de errores y respuestas erróneas

Es importante manejar correctamente los errores y las respuestas que no indican éxito (como un estado 404 o 500). Puedes hacerlo verificando el estado de la respuesta.

fetch('https://api.example.com/data')
  .then(response => {
    if (!response.ok) {
      throw new Error('Network response was not ok');
    }
    return response.json();
  })
  .then(data => console.log(data))
  .catch(error => console.error('Hubo un problema con tu petición:', error));

En este ejemplo, if (!response.ok) verifica si el estado de la respuesta no indica éxito, lanzando un error si es necesario. Esto permite que el .catch posterior maneje tanto errores de red como respuestas no exitosas.

Conclusión

La función fetch es una herramienta poderosa y flexible para realizar peticiones HTTP en aplicaciones web modernas. Permite un control detallado sobre las peticiones y respuestas, facilitando el trabajo con APIs y servicios web. Practica con ejemplos y variaciones de estos para familiarizarte completamente con su funcionamiento y capacidades.

Programación con JavaScript: Cuadros de diálogo con SweetAlert

SweetAlert es una popular librería de JavaScript que permite crear cuadros de diálogo más atractivos y funcionales que los cuadros de diálogo nativos de JavaScript (alert, confirm, prompt). Ofrece una amplia gama de opciones personalizables, como iconos, botones, animaciones, y más, lo que la convierte en una excelente opción para mejorar la interacción del usuario en aplicaciones web modernas.

Cómo Comenzar con SweetAlert

Primero, necesitas incluir SweetAlert en tu proyecto. Puedes hacerlo de varias maneras, pero la forma más sencilla es mediante la inclusión directa de la librería desde un CDN (Content Delivery Network) en tu archivo HTML. Aquí mostramos cómo hacerlo:

<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>

Asegúrate de incluir esta línea en la sección <head> o al final del cuerpo (<body>) de tu archivo HTML, antes de usar las funciones de SweetAlert.

Ejemplos Básicos de Uso

Mostrar un Alerta Simple

Swal.fire('Hola mundo!');

Este código mostrará un cuadro de diálogo simple con el mensaje «Hola mundo!».

Mostrar un Alerta con Título y Texto

Swal.fire({
  title: '¡Error!',
  text: 'Algo salió mal.',
  icon: 'error',
});

Este ejemplo muestra un cuadro de diálogo con un título, un mensaje y un ícono que indica un error.

Confirmación

SweetAlert también puede usarse para crear un cuadro de diálogo de confirmación similar al confirm() nativo de JavaScript, pero con una apariencia mucho más atractiva y opciones de personalización.

Swal.fire({
  title: '¿Estás seguro?',
  text: "¡No podrás deshacer esta acción!",
  icon: 'warning',
  showCancelButton: true,
  confirmButtonColor: '#3085d6',
  cancelButtonColor: '#d33',
  confirmButtonText: 'Sí, bórralo'
}).then((result) => {
  if (result.isConfirmed) {
    Swal.fire(
      '¡Borrado!',
      'Tu archivo ha sido borrado.',
      'success'
    )
  }
});

Este código muestra un cuadro de diálogo de confirmación con botones personalizados. Si el usuario confirma la acción, se muestra otro cuadro de diálogo indicando el éxito de la operación.

Prompt Personalizado

Para crear un cuadro de diálogo que solicite información al usuario, similar a prompt(), puedes usar SweetAlert de la siguiente manera:

(async () => {
  const { value: nombre } = await Swal.fire({
    title: 'Introduce tu nombre',
    input: 'text',
    inputLabel: 'Tu nombre',
    inputPlaceholder: 'Escribe tu nombre aquí'
  });

  if (nombre) {
    Swal.fire(`Tu nombre es: ${nombre}`);
  }
})();

Este fragmento abre un cuadro de diálogo que solicita al usuario su nombre y luego muestra un saludo personalizado con el nombre introducido.

Ventajas de Usar SweetAlert

  • Personalización: SweetAlert permite personalizar completamente los cuadros de diálogo, desde el texto y los botones hasta los colores e iconos, adaptándose así a la estética de tu aplicación web.
  • Facilidad de uso: A pesar de su riqueza en características, SweetAlert es muy fácil de usar, con una API clara y documentación extensa.
  • Mejora la experiencia del usuario: Los cuadros de diálogo creados con SweetAlert son visualmente atractivos y pueden mejorar significativamente la experiencia del usuario en comparación con los cuadros de diálogo nativos.

Consejos para principiantes

  • Practica: Experimenta con las diferentes opciones que ofrece SweetAlert. Prueba diferentes combinaciones de configuraciones para ver cómo afectan a la apariencia y el comportamiento de los cuadros de diálogo.
  • Lee la documentación: SweetAlert tiene una documentación extensa y ejemplos que pueden ayudarte a entender todas sus capacidades y cómo utilizarlas eficazmente.
  • Considera la accesibilidad: Asegúrate de que tus cuadros de diálogo sean accesibles, proporcionando una buena experiencia de usuario para todas las personas, incluidas aquellas que utilizan tecnologías de asistencia.

Conclusión

SweetAlert es una herramienta poderosa y flexible para mejorar las interacciones con el usuario en tus aplicaciones web. Con una amplia gama de opciones personalizables y una API fácil de usar, puedes crear cuadros de diálogo atractivos y funcionales que mejoren la experiencia del usuario y hagan que tu aplicación web se destaque.

Programación con JavaScript: Cuadros de diálogo

Los cuadros de diálogo en JavaScript se utilizan para interactuar con los usuarios mediante mensajes emergentes, solicitando información o simplemente notificando algo. JavaScript ofrece tres métodos principales para este propósito: alert(), confirm(), y prompt(). Estos métodos son bastante simples de usar y son fundamentales para la interacción básica en páginas web.

Alert

El método alert() se utiliza para mostrar un mensaje al usuario. Este método pausa la ejecución del script hasta que el usuario cierra el cuadro de diálogo. No retorna ningún valor.

Ejemplo de código:

alert("Hola, bienvenido a nuestra página web!");

Cómo funciona:

  • Cuando este código se ejecuta, aparece un cuadro de diálogo con el mensaje «Hola, bienvenido a nuestra página web!».
  • El usuario debe hacer clic en «Aceptar» para cerrar el cuadro de diálogo y continuar.

Confirm

El método confirm() se utiliza para mostrar un mensaje y dos botones, «Aceptar» y «Cancelar». Este método es útil cuando necesitas que el usuario confirme una acción. Devuelve un valor booleano: true si el usuario hace clic en «Aceptar» y false si el usuario hace clic en «Cancelar».

Ejemplo de código:

if (confirm("¿Estás seguro de que quieres eliminar este elemento?")) {
    // El usuario hizo clic en "Aceptar", pon aquí el código para eliminar el elemento
    alert("Elemento eliminado.");
} else {
    // El usuario hizo clic en "Cancelar", puedes manejar esta acción aquí
    alert("Operación cancelada.");
}

Cómo funciona:

  • Este código muestra un cuadro de diálogo con el mensaje «¿Estás seguro de que quieres eliminar este elemento?» y dos botones.
  • Si el usuario hace clic en «Aceptar», se muestra un nuevo cuadro de diálogo que dice «Elemento eliminado.».
  • Si el usuario hace clic en «Cancelar», se muestra un cuadro de diálogo que dice «Operación cancelada.».

Prompt

El método prompt() se utiliza para solicitar al usuario que introduzca algún texto. Aparece un cuadro de diálogo con un campo de texto y dos botones, «Aceptar» y «Cancelar». Devuelve el texto introducido si el usuario hace clic en «Aceptar» y null si el usuario hace clic en «Cancelar».

Ejemplo de código:

let nombre = prompt("¿Cuál es tu nombre?", "Escribe tu nombre aquí");
if (nombre) {
    alert("Hola, " + nombre + "!");
} else {
    alert("No has introducido tu nombre.");
}

Cómo funciona:

  • Este código muestra un cuadro de diálogo pidiendo al usuario su nombre, con un campo de texto que contiene el texto «Escribe tu nombre aquí» por defecto.
  • Si el usuario escribe su nombre y hace clic en «Aceptar», se muestra un saludo personalizado.
  • Si el usuario hace clic en «Cancelar», se muestra el mensaje «No has introducido tu nombre».

Buenas Prácticas

  • Usabilidad: Aunque los cuadros de diálogo son útiles, su uso excesivo puede ser molesto para los usuarios. Úsalos solo cuando sea necesario.
  • Claridad: Asegúrate de que los mensajes en los cuadros de diálogo sean claros y directos para evitar confusiones.
  • Accesibilidad: Considera la accesibilidad y la experiencia del usuario en dispositivos móviles.

Conclusión

Los cuadros de diálogo son herramientas sencillas y muy útiles para la interacción básica en JavaScript. Permiten obtener confirmaciones, mostrar alertas informativas y solicitar datos de los usuarios de manera efectiva. Experimentar con estos métodos te ayudará a entender mejor cómo y cuándo utilizarlos para mejorar la experiencia del usuario en tus aplicaciones web.

Programación con JavaScript: Almacenamiento de datos

En esta unidad hablaremos de localStorage, un mecanismo de almacenamiento muy versátil y sencillo. Se trata de una herramienta diseñada para mejorar la experiencia del usuario al permitir que las aplicaciones web guarden y recuperen datos directamente en el navegador de manera eficiente y sin necesidad de una constante comunicación con el servidor.

A diferencia de las cookies, los datos almacenados a través de localStorage son específicos para el protocolo, el dominio y el puerto del sitio web, y no se envían al servidor en cada solicitud HTTP. Esto lo hace ideal para almacenar información que no necesita ser enviada al servidor, como preferencias del usuario o datos de estado de la aplicación.

localStorage vs cookies

El uso de localStorage frente a cookies para almacenar datos en el navegador web tiene varias ventajas que lo hacen más conveniente en muchas situaciones. A continuación, se detallan las principales razones:

Capacidad de Almacenamiento

  • localStorage: Ofrece una capacidad de almacenamiento mucho mayor que las cookies. Mientras que localStorage puede almacenar hasta 5MB o más de datos por origen en la mayoría de los navegadores, las cookies están limitadas a aproximadamente 4KB por cookie. Esta diferencia de capacidad hace que localStorage sea mucho más adecuado para almacenar grandes cantidades de datos, como preferencias del usuario, datos de estado de la aplicación, y más.

Rendimiento

  • Envío al servidor: Las cookies se envían con cada solicitud HTTP al servidor, lo que puede aumentar innecesariamente el tráfico de red y afectar el rendimiento, especialmente en aplicaciones web con mucho tráfico o que realizan muchas solicitudes al servidor. localStorage, por otro lado, solo almacena datos en el lado del cliente y no afecta el tráfico de red, ya que los datos no se envían al servidor con cada solicitud.

Facilidad de Uso

  • API simple: localStorage proporciona una API simple y fácil de usar para almacenar y acceder a los datos, basada en el sistema clave-valor. Las cookies, aunque no son especialmente difíciles de usar, requieren un manejo más cuidadoso, especialmente cuando se trata de establecer parámetros como fechas de expiración, dominios, y caminos, así como la codificación y decodificación de sus valores.

Persistencia

  • Duración: Los datos almacenados en localStorage persisten hasta que se eliminan explícitamente mediante código o se limpia el almacenamiento del navegador. Las cookies, sin embargo, tienen una fecha de expiración y se eliminan automáticamente cuando alcanzan esa fecha. Esto hace que localStorage sea más conveniente para almacenar datos que deben persistir a largo plazo o indefinidamente.

Seguridad

  • Acceso a datos: Mientras que localStorage no es inherentemente más seguro que las cookies en términos de vulnerabilidades a ataques como XSS (Cross-Site Scripting), el hecho de que no se envíe con cada solicitud HTTP reduce la superficie de ataque para ciertos tipos de ataques (como CSRF, Cross-Site Request Forgery), ya que los datos almacenados en localStorage no se incluyen automáticamente en cada solicitud.

Uso Específico

  • Sin Interferencia con el servidor: Dado que localStorage está diseñado para el almacenamiento exclusivo del lado del cliente, es ideal para casos de uso donde los datos no necesitan ser enviados al servidor con cada solicitud. Esto lo hace adecuado para aplicaciones web ricas en clientes (SPA, Single-Page Applications), donde se necesita mantener el estado de la aplicación o almacenar grandes cantidades de datos del lado del cliente.

Conclusión

localStorage ofrece ventajas significativas sobre las cookies en términos de capacidad de almacenamiento, rendimiento, facilidad de uso, y persistencia de datos. Estas características lo hacen más conveniente para almacenar datos del lado del cliente en muchas aplicaciones web modernas. Sin embargo, es importante tener en cuenta que tanto localStorage como las cookies tienen sus roles y casos de uso específicos, y la elección entre uno u otro debe basarse en los requisitos específicos de la aplicación y las consideraciones de seguridad.

Cómo Funciona localStorage

localStorage proporciona un almacenamiento clave-valor simple, donde tanto las claves como los valores son cadenas de texto. Cada origen (es decir, combinación de protocolo, dominio y puerto) tiene su propio espacio de almacenamiento, limitado generalmente a 5MB por origen, aunque este límite puede variar según el navegador.

Métodos Principales

  • setItem(key, value): Permite almacenar un valor, identificado por una clave. Si la clave ya existe, el valor anterior se reemplaza.
  • getItem(key): Devuelve el valor asociado a una clave. Si la clave no existe, retorna null.
  • removeItem(key): Elimina el par clave-valor especificado.
  • clear(): Elimina todos los pares clave-valor almacenados por el dominio.
  • key(index): Devuelve el nombre de la clave en la posición dada.

Ejemplos con Código

Guardar Datos

Para guardar datos en localStorage, se utiliza el método setItem, especificando una clave y un valor:

localStorage.setItem('usuario', 'Juan');
localStorage.setItem('tema', 'oscuro');

Leer Datos

Para leer datos de localStorage, se utiliza el método getItem, pasando la clave del dato que se desea recuperar:

let usuario = localStorage.getItem('usuario'); // 'Juan'
let tema = localStorage.getItem('tema'); // 'oscuro'

Eliminar Datos

Para eliminar un dato específico, se utiliza removeItem, proporcionando la clave del dato a eliminar:

localStorage.removeItem('usuario');

Eliminar Todos los Datos

Para eliminar todos los datos almacenados por el dominio en localStorage, se utiliza el método clear:

localStorage.clear();

Almacenar Objetos

localStorage solo puede almacenar cadenas de texto. Para almacenar objetos, es necesario convertirlos a una cadena JSON usando JSON.stringify antes de guardarlos, y luego convertirlos de nuevo a un objeto usando JSON.parse al recuperarlos:

let usuario = { nombre: 'Juan', edad: 30 };

// Guardar el objeto como una cadena JSON
localStorage.setItem('usuario', JSON.stringify(usuario));

// Leer la cadena JSON y convertirla de nuevo a objeto
let usuarioGuardado = JSON.parse(localStorage.getItem('usuario'));

console.log(usuarioGuardado.nombre); // 'Juan'

Uso Práctico

localStorage es útil para guardar todo tipo de preferencias y datos de usuario que deben persistir entre sesiones del navegador. Algunos ejemplos incluyen:

  • Preferencias de tema (claro/oscuro)
  • Información de sesión de usuario (no sensible)
  • Datos de formularios autocompletados
  • Estados de la interfaz de usuario (por ejemplo, si un menú lateral está expandido o no)

Limitaciones y Consideraciones

  • Seguridad: No se debe almacenar información sensible como contraseñas o datos personales debido a que la información está accesible desde el cliente.
  • Compatibilidad: Aunque ampliamente soportado, es buena práctica verificar la disponibilidad de localStorage antes de usarlo.
  • Límite de almacenamiento: Generalmente limitado a 5MB por origen, puede variar según el navegador.
  • Origen específico: Los datos almacenados son accesibles solo por páginas del mismo origen.

Vídeos increíbles de Realidad Virtual

La tecnología nos ofrece formas increíbles de explorar el mundo sin salir de casa. A través de vídeos en 360° y realidad virtual, podemos experimentar desde emocionantes montañas rusas hasta tranquilos paisajes naturales. Esta colección de enlaces te llevará en un viaje virtual inmersivo, ofreciéndote experiencias únicas desde diferentes rincones del planeta y más allá. Prepárate para sumergirte en aventuras visuales y auditivas como nunca antes.

Canales de YouTube y Vimeo sobre Realidad Virtual

  • 360: Descubre maravillas del mundo en vídeos de 360°.
  • AirPano VR: Experimenta vistas aéreas espectaculares en realidad virtual.
  • VR Planet: Viaja a destinos exóticos con contenido VR único.
  • Vicinity360: Experiencias únicas de realidad virtual en 360º.
  • mvr: Diversidad de experiencias en realidad virtual.
  • Black Studios XR: Sumérgete en experiencias inmersivas en XR.
  • VR360 Cinema: Disfruta de películas y cortometrajes en formato 360°.
  • 360 Horizons: Explora paisajes y horizontes impresionantes en 360°.
  • Virtual Reality 360 Video Channel: Una variedad de contenido emocionante en 360°.
  • Vimeo 360 VR: Una plataforma con vídeos creativos y artísticos en formato 360° y VR.

Naturaleza y paisajes

  • China: Ver vídeo. Te muestra la cultura y tradiciones milenarias de China. Recorre sus ciudades vibrantes, monumentos históricos y paisajes impresionantes.
  • Paisajes del mundo: Ver vídeo. Te presenta una selección de los paisajes más impresionantes del planeta. Déjate sorprender por la belleza natural de nuestro mundo.
  • Pandemia alrededor del mundo: Ver vídeo. Documenta el impacto global de la pandemia de COVID-19. Conoce las diferentes medidas tomadas por los países para combatir el virus.
  • Isla Hamilton: Ver vídeo. Te invita a descubrir la belleza natural de la isla Hamilton en Australia. Disfruta de sus playas paradisíacas, arrecifes de coral y exuberante vegetación.
  • Cascada del Salto del Ángel: Ver vídeo. Visión panorámica del Salto Ángel, la cascada más alta del mundo. Hasta este momento, nadie había podido capturar el Salto Ángel en formato de vídeo 360°.
  • Formaciones rocosas de Manpupuner: Ver vídeo. Rusia ofrece una gran variedad de magníficos monumentos naturales, como las formaciones rocosas de Manpupuner, los ídolos de piedra en el distrito Troitsko-Pechorsky de la República de Komi. En 2008, las formaciones fueron reconocidas como una de las Siete Maravillas de Rusia.
  • Cueva Chauvet: Ver vídeo. Te invita a explorar las pinturas rupestres de la Cueva Chauvet en Francia. Admira estas impresionantes obras de arte prehistórico.
  • África: Ver vídeo. Te lleva a un safari por las vastas llanuras de África. Observa la increíble diversidad de animales salvajes que habitan este continente.
  • Antártida: Ver vídeo. Explora una colonia de pingüinos y focas mientras se aproxima una tormenta.
  • Polo Sur: Ver vídeo. Te lleva a un viaje al Polo Sur, el lugar más austral de la Tierra. Experimenta la inmensidad y el frío extremo de este continente helado.
  • Mago David Blaine vuela a 7.500m.: Ver vídeo. Muestra el proceso de preparación para conseguir realizar tal hazaña. Percibirás los riesgos que implica y apreciarás la increíble satisfacción de Blaine al conseguir superar este reto ascendiendo a esa increíble altitud.
  • Escalada: Ver vídeo. Serás consciente de la preparación física y mental necesaria para la escalada. Además experimentarás las dificultades y peligros a los que se enfrentan los escaladores, y también serás partícipe de la emoción de llegar a la cima.
China
Paisajes del mundo
Pandemia alrededor del mundo
Isla Hamilton
Formaciones rocosas de Manpupuner
Cueva Chauvet
África
Antártida
Polo Sur
Mago David Blaine vuela a 7.500m
Escalada

Animales

  • Tiburones: Ver vídeo 1 | Ver vídeo 2. Sumérgete en el fascinante mundo de los tiburones. Conoce diferentes especies, sus características y su papel en el ecosistema marino.
  • Leones: Ver vídeo. Crecer es una lucha, especialmente si eres un joven león. En esta película de realidad virtual de National Geographic, te encontrarás cara a cara con Gibson y su madre, mientras luchan contra el macho alfa de su manada. ¿Dejar la seguridad de la manada es la única esperanza de supervivencia de Gibson?
  • Tiburón martillo: Ver vídeo. Sumérgete en este video de 360° y enfréntate cara a cara con un curioso tiburón martillo gigante.
  • Ballenas: Ver vídeo. Te presenta la majestuosidad de las ballenas, los animales más grandes del planeta. Observa estos increíbles cetáceos en su hábitat natural.
  • Criaturas marinas: Ver vídeo. Descubre las increíbles criaturas que habitan en las profundidades del océano.
  • Monstruos del océano: Ver vídeo. Explora diferentes zonas del océano, desde la superficie hasta la fosa abisal, mostrando una gran variedad de animales poco conocidos, como el pez ojo de barril, el calamar gigante y el tiburón duende.
  • Oso perezoso: Ver vídeo. Explora la jungla costarricense mientras una perezosa de tres dedos se abre camino desde el suelo hasta el dosel de la selva.
Tiburones
Tiburones
Leones
Tiburón martillo
Ballenas
Criaturas marinas
Monstruos del océano
Oso perezoso

Espacio

  • Paseo espacial: Ver vídeo. Lánzate al vacío desde 400 kilómetros sobre la Tierra con este galardonado paseo espacial en realidad virtual, inspirado en el programa de entrenamiento de la NASA y las asombrosas experiencias de sus astronautas.
  • Viaje por el universo: Ver vídeo. Te embarca en una fascinante aventura espacial. Explora las estrellas, planetas y galaxias que conforman nuestro universo.
  • Eclipse solar desde el espacio: Ver vídeo. Te ofrece una vista única del eclipse solar desde la perspectiva de la Estación Espacial Internacional.
  • Alunizaje: Ver vídeo. Sumérgete en la misión espacial Apolo 11 de la NASA en 360 grados. Experimenta el lanzamiento del cohete y el alunizaje en realidad virtual.
  • Sonda de la NASA en Saturno: Ver vídeo. Te muestra las imágenes y descubrimientos de la sonda Cassini durante su viaje a Saturno.
  • Agujero de gusano: Ver vídeo. Explora la posibilidad de la existencia de agujeros de gusano, como atajos a través del espacio-tiempo.
Paseo espacial
Viaje por el universo
Eclipse solar desde el epacio
Alunizaje
Sonda de la NASA en Saturno
Agujero de gusano

Parques de atracciones

  • Montaña rusa real: Ver vídeo. Te lleva a través de las subidas, bajadas, giros y vueltas de la montaña rusa, permitiéndote sentir la adrenalina y la emoción de la experiencia.
  • Montaña rusa virtual: Ver vídeo. Te lleva a un emocionante viaje a través de una montaña rusa. Siente la adrenalina mientras subes, bajas y giras en este trepidante recorrido.
  • Parque acuático: Ver vídeo. Un tobogán a gran velocidad en una isla tropical llena de sorpresas.
  • Montaña rusa virtual de Bob Esponja: Ver vídeo. Montaña rusa en 360 grados con el mundo submarino temático de Bob Esponja de Nickelodeon, inspirado en el nuevo juego Battle for Bikini Bottom Rehydrated.
Montaña rusa real
Montaña rusa virtual
Parque acuático
Montaña rusa Bob Esponja

Experiencias musicales

  • Banda sonora de Avatar: Escuchar. La Orquesta Sinfónica Nacional Danesa te presenta la Suite Avatar en VR y con audio espacial en el concierto Galaxymphony.
  • Ópera de Sídney: Escuchar. La Ópera de Sídney es un ícono australiano y uno de los centros de artes escénicas más activos del mundo. Encontrarás actuaciones, contenido detrás de escena e historias de los espacios bajo las velas. Con más de 40 espectáculos a la semana en la Ópera de Sídney, hay algo para todos los gustos.
  • Quinta sinfonía de Beethoven: Escuchar. Una experiencia filarmónica con la Orquesta Filarmónica de Róterdam, Países Bajos. Te ofrece 6 puntos de vista diferentes, tanto para tus ojos como para tus oídos, situándote en el centro de la orquesta, como si fueras uno de los músicos. Cada ubicación cuenta con un paisaje sonoro único, lo que convierte esta experiencia de la famosa Quinta de Beethoven en algo completamente nuevo.
  • Novena sinfonía de Beethoven: Escuchar. Ludwig van Beethoven, Sinfonía n.° 9 (1.er movimiento) / Director: Sir Simon Rattle, Orquesta Filarmónica de Berlín / Ensayo grabado en vídeo de 360 grados en la Filarmónica de Berlín.
  • Orquesta BBC: Escuchar. Siente toda la emoción con una vista de 360° de la Orquesta Sinfónica BBC interpretando «En la gruta del Rey de la montaña» de Edvard Grieg, grabada en los estudios Maida Vale de Londres.
  • Mahler No. 9: Escuchar. Orquesta Sinfónica de Aachen, dirigida por Kazem Abdullah. Sinfonía No. 9 de Gustav Mahler. Eurogress Aachen.
  • Orquesta de Filadelfia: Escuchar. La Orquesta de Filadelfia interpreta «En la gruta del rey de la montaña» de la Suite No. 1 de Peer Gynt de Edvard Grieg, bajo la dirección del Director Musical Yannick Nézet-Séguin en el Auditorio Stern / Escenario Perelman del Carnegie Hall.
  • Take on me, de a-ha: Escuchar. Grupo de música «a-ha» inmortalizado a través de la realidad virtual, en esta grabación de la última parte de su gira en Oslo Spektrum.
Banda sonora de Avatar
Ópera de Sídney
Quinta sinfonía de Beethoven
Novena sinfonía de Beethoven
Orquesta BBC
Mahler No. 9
Orquesta de Filadelfia
Take on me, de a-ha

Videojuegos e ilusiones ópticas

  • Ilusiones ópticas (en español): Ver vídeo. Te sorprenderá con una colección de ilusiones que desafiarán tu percepción. Prepárate para ver cosas que no son lo que parecen.
  • Spiderman gameplay: Ver vídeo. Gameplay del videojuego de Spiderman – Lejos de casa.
  • Mario Kart: Ver vídeo. Super Mario es una serie de juegos de plataforma creada por Nintendo y protagonizada por su mascota, Mario.
  • Subway surfers: Ver vídeo. Animación en 360° de Subway Surfers.
  • Among US: Ver vídeo. Gameplay del videojuego Among US.
  • Bob Esponja: Ver vídeo. Disfruta de los primeros 13 minutos del nuevo juego de Bob Esponja en 360 grados.
  • Dinosaurio de Google Chrome: Ver vídeo. El juego del dinosaurio de Google Chrome, también conocido como «Chrome Dino Run» o «T-Rex Run», es un juego simple pero desafiante que se encuentra oculto en el navegador Chrome. Se activa cuando no hay conexión a internet o cuando se produce un error de red.
  • Fortnite (evento Galactus): Ver vídeo. Revive el épico evento Galactus en Fortnite, donde los jugadores se unieron para luchar contra una amenaza cósmica.
Ilusiones ópticas
Gameplay de Spiderman
Gameplay de Super Mario Kart
Subway surfers
Gameplay de Among US
Videojuego de Bob Eponja
Dinosaurio de Google Chrome
Fornite

Otros

  • Vuelo visto desde la cabina: Ver vídeo. Acompaña al Capitán Joe, al Primer Oficial Dean y al videógrafo Swayne en este video totalmente interactivo. La Isla North Eleuthera nunca había recibido un avión tan grande, por lo que este vuelo vacío le dio a los equipos de tierra la oportunidad de trabajar con el nuevo E-175 por primera vez antes del servicio regular de pasajeros.
  • Bob Esponja en el Crustáceo Crujiente: Ver vídeo. Ahora puedes entrar al Crustáceo Crujiente en el primer video oficial de 360° de Bob Esponja. Experimenta cómo es la vida de los habitantes de Fondo de Bikini, e intenta encontrar todos los objetos escondidos de tus episodios favoritos de Bob Esponja.
  • Espantapájaros: Ver vídeo. Crea una atmósfera de suspense y terror mediante efectos de sonido espeluznantes en una situación en la que te sientes atrapado.
  • Sala de cine con formatos de sonido: Ver vídeo. Te permite experimentar los diferentes formatos de sonido en las salas de cine, pudiendo percibir cómo impactan en la experiencia del espectador.
Vuelo visto desde la cabina
Bob Esponja
Espantapájaros
Sala de cine con formatos de sonido

Conclusión

Este viaje virtual a través de videos en 360° y realidad virtual te ha llevado desde las profundidades del océano hasta el espacio exterior, desde emocionantes aventuras hasta serenas experiencias musicales. La tecnología de realidad virtual nos permite explorar mundos de manera que antes solo podíamos imaginar. Esperamos que hayas disfrutado de estas experiencias inmersivas tanto como nosotros.

Programación con JavaScript: Condicionales

Los condicionales son estructuras esenciales en programación que dirigen la ejecución de código según situaciones específicas. Actúan como puntos de bifurcación en el flujo del programa, permitiendo que se ejecuten diferentes secciones de código en función de si se cumple o no una evaluación lógica. Estas estructuras son fundamentales para la toma de decisiones automatizadas y la adaptación del comportamiento del programa a distintos escenarios.

Estructura «if»

El condicional if se utiliza para ejecutar un bloque de código si una condición es verdadera. La condición es una expresión que se evalúa como true o false. Si la condición es verdadera, el bloque de código dentro de las llaves {} se ejecuta. Si es falsa, el bloque se omite:

if (condición) {
  // Código a ejecutar si la condición es verdadera
}

Por ejemplo, con el siguiente código podemos verificar si una persona es mayor de edad:

let edad = 20;

if (edad >= 18) {
  console.log("Eres mayor de edad.");
}

Estructura «if…else»

La estructura if...else se utiliza para ejecutar un bloque de código si la condición es verdadera y otro bloque si es falsa:

if (condición) {
  // Código a ejecutar si la condición es verdadera
} else {
  // Código a ejecutar si la condición es falsa
}

Por ejemplo, podemos decidir cómo saludar a alguien en función de la hora que sea:

let hora = 20;

if (hora < 12) {
  console.log("Buenos días.");
} else {
  console.log("Buenas tardes o noches.");
}

Estructura «if…else if…else»

En bloque if...else if...else se usa para manejar múltiples condiciones en secuencia. Si la primera condición es falsa, se evalúan las condiciones siguientes en orden.

Supongamos que tenemos diferentes condiciones y queremos ejecutar un bloque de código específico dependiendo de cuál de esas condiciones sea verdadera. En lugar de usar varios bloques if independientes, podemos usar la estructura if...else if...else para hacerlo de manera más organizada:

if (condición1) {
  // Código a ejecutar si condición1 es verdadera
} else if (condición2) {
  // Código a ejecutar si condición2 es verdadera
} else if (condición3) {
  // Código a ejecutar si condición3 es verdadera
} else {
  // Código a ejecutar si ninguna condición es verdadera
}

Esta sería la descripción paso a paso de cómo se ejecuta esta estructura:

  1. El programa evalúa la condición1. Si es verdadera, ejecuta el bloque de código dentro de ese if y luego sale del bloque if...else if...else.
  2. Si condición1 es falsa, pasa a evaluar condición2. Si es verdadera, ejecuta el bloque de código dentro de ese else if y luego sale del bloque if...else if...else.
  3. Si tanto condición1 como condición2 son falsas, pasa a evaluar condición3. Si es verdadera, ejecuta el bloque de código dentro de ese else if y luego sale del bloque if...else if...else.
  4. Si ninguna de las condiciones anteriores es verdadera, se ejecuta el bloque de código dentro del else.

Por ejemplo, podemos utilizar el siguiente código para evaluar el trabajo de un estudiante:

let puntuacion = 8;
let calificacion;

if (puntuacion >= 9) {
  calificacion = "Sobresaliente";
} else if (puntuacion >= 7) {
  calificacion = "Notable";
} else if (puntuacion >= 6) {
  calificacion = "Bien";
} else if (puntuacion >= 5) {
  calificacion = "Suficiente";
} else {
  calificacion = "Suspenso";
}

// Salida: "Calificación: Notable"
console.log(`Calificación: ${calificacion}`);

Estructura «switch»

El switch es una estructura de control en JavaScript que se utiliza para tomar decisiones basadas en múltiples casos posibles. A diferencia de las estructuras if...else if...else, el switch se utiliza cuando necesitamos realizar diferentes acciones dependiendo del valor de una única expresión. Resulta especialmente útil cuando tenemos muchos posibles valores y queremos evitar una serie larga de else if:

switch (expresión) {
  case valor1:
    // Código a ejecutar si la expresión coincide con valor1
    break;
  case valor2:
    // Código a ejecutar si la expresión coincide con valor2
    break;
  // Más casos...
  default:
    // Código a ejecutar si ningún caso coincide
}
  • expresión: Una expresión cuyo valor se comparará con los diferentes casos.
  • valor1, valor2, etc.: Los posibles valores que puede tener la expresión.
  • break: Esta palabra clave es importante. Cuando se encuentra un break, el programa sale del bloque switch y continúa con el código después del bloque.

Por ejemplo, podemos utilizar el siguiente código para imprimir el día de la semana partiendo de un número del 1 al 7:

let dia = 3;
let nombreDia;

switch (dia) {
  case 1:
    nombreDia = "Lunes";
    break;
  case 2:
    nombreDia = "Martes";
    break;
  case 3:
    nombreDia = "Miércoles";
    break;
  // ...
  default:
    nombreDia = "Día no válido";
}

// Salida: "Hoy es Miércoles"
console.log(`Hoy es ${nombreDia}`);

En el ejemplo anterior, el programa compara el valor de dia con cada caso dentro del switch y asigna el nombre del día correspondiente. Si dia es igual a 3, se ejecuta el bloque de código bajo case 3.

Operador ternario

El operador ternario nos permite compactar la forma de escribir condicionales. La idea principal es que, en lugar de usar un bloque if...else para asignar valores a una variable en función de una condición, usemos el operador ternario para lograrlo con menos código mediante la siguiente sintaxis:

variable = condición ? valorSiVerdadero : valorSiFalso;
  • condición: Una expresión que se evalúa como verdadera o falsa.
  • valorSiVerdadero: El valor que se asignará a la variable si la condición es verdadera.
  • valorSiFalso: El valor que se asignará a la variable si la condición es falsa.

Por ejemplo, podemos utilizar el siguiente código para verificar si un número es par o impar:

let numero = 7;
let esPar = numero % 2 === 0 ? "Es par." : "Es impar.";
console.log(esPar);

En el ejemplo anterior utilizamos la condición numero % 2 === 0 para verificar si el número es par. Si la condición es verdadera, se asigna el valor "Es par." a la variable esPar; si la condición es falsa, se asigna el valor "Es impar.".

Operadores de comparación

Los operadores de comparación son símbolos especiales que se utilizan para comparar dos valores y determinar la relación entre ellos, evaluando si una condición es verdadera o falsa. En esencia, nos permiten hacer preguntas sobre los valores para tomar decisiones basadas en comparaciones numéricas, de cadenas de texto y otros tipos de datos.

Operador de igualdad (==)

El operador de igualdad == se utiliza para comparar si dos valores son iguales. Realiza una conversión de tipo antes de realizar la comparación, lo que significa que puede comparar valores de diferentes tipos.

Por ejemplo, en el siguiente código comparamos dos valores: numero1 es un número y numero2 es una cadena de texto que representa el número 5. Aunque los tipos son diferentes, el operador == realiza una conversión de tipo y considera que son iguales, por lo que se imprimirá «Los números son iguales»:

var num1 = 5;
var num2 = "5";

if (num1 == num2) {
  console.log("Los números son iguales.");
} else {
  console.log("Los números son diferentes.");
}

Operador de igualdad estricta (===)

El operador de igualdad estricta === se utiliza para comparar si dos valores son iguales y del mismo tipo. No realiza conversión de tipo antes de la comparación.

En el siguiente ejemplo, aunque los valores son iguales, el operador === tiene en cuenta el tipo de dato y no realiza conversión de tipo. Dado que numero1 es un número y numero2 es una cadena de texto, la comparación devuelve falso y se imprimirá «Los números son diferentes»:

var num1 = 5;
var num2 = "5";

if (num1 === num2) {
  console.log("Los números son iguales.");
} else {
  console.log("Los números son diferentes.");
}

Operador de desigualdad (!=)

El operador de desigualdad != se utiliza para comparar si dos valores son distintos. Realiza una conversión de tipo antes de la comparación.

En el siguiente ejemplo comparamos el valor de la variable edad con la cadena de texto «18». Aunque los tipos son diferentes, el operador != realiza una conversión de tipo y considera que son iguales, por lo que se imprimirá «La edad es 18»:

var edad = 18;
if (edad != "18") {
  console.log("La edad es diferente de 18.");
} else {
  console.log("La edad es 18.");
}

Operador de desigualdad estricta (!==)

El operador de desigualdad estricta !== se utiliza para comparar si dos valores son diferentes o no son del mismo tipo. No realiza conversión de tipo antes de la comparación.

En el siguiente ejemplo, aunque los valores son iguales, el operador !== tiene en cuenta el tipo de dato y no realiza ninguna conversión. Dado que numero es un número y la cadena de texto «10» es de un tipo diferente, la comparación devuelve verdadero y se imprimirá «El número no es igual a 10 o no es del mismo tipo»:

var num = 10;
if (num !== "10") {
  console.log("El número no es igual a 10 o no es del mismo tipo.");
} else {
  console.log("El número es igual a 10 y del mismo tipo.");
}

Operadores de comparación numérica

Los operadores de comparación numérica (<, >, <=, >=) se utilizan para comparar valores numéricos.

En el siguiente ejemplo comparamos dos valores numéricos: x e y. El primer if verifica si x es mayor que y, el segundo if verifica si x es menor que y, y si ninguna de estas condiciones es verdadera, se asume que x es igual a y:

var x = 10;
var y = 5;

if (x > y) {
  console.log("x es mayor que y.");
} else if (x < y) {
  console.log("x es menor que y.");
} else {
  console.log("x es igual a y.");
}

Operadores de comparación de cadenas de texto

Los operadores de comparación también se pueden utilizar para comparar cadenas de texto alfabéticamente.

En el siguiente ejemplo comparamos dos cadenas de texto (palabra1 y palabra2), utilizando la posición alfabética para determinar el orden. Si palabra1 viene antes en el diccionario que palabra2, se imprimirá «palabra1 viene antes en el diccionario»; si es lo contrario, se imprimirá «palabra2 viene antes en el diccionario»; y si ambas palabras son iguales, se imprimirá «Las palabras son iguales»:

var palabra1 = "manzana";
var palabra2 = "banana";

if (palabra1 < palabra2) {
  console.log("palabra1 viene antes en el diccionario.");
} else if (palabra1 > palabra2) {
  console.log("palabra2 viene antes en el diccionario.");
} else {
  console.log("Las palabras son iguales.");
}

Operadores lógicos

Los operadores lógicos son herramientas esenciales en programación utilizadas para combinar y evaluar condiciones booleanas. Estos operadores, como AND, OR y NOT, permiten construir expresiones más complejas al unir o negar condiciones simples. AND devuelve verdadero si dos condiciones son verdaderas, OR devuelve verdadero si al menos una condición es verdadera, y NOT invierte el valor de una condición verdadera o falsa. Estos operadores son fundamentales para controlar cómo se ejecuta el código en función de condiciones múltiples y permiten tomar decisiones condicionales más avanzadas:

if (condición1 && condición2) {
  // Bloque de código si ambas condiciones son verdaderas
}

if (condición1 || condición2) {
  // Bloque de código si al menos una de las condiciones es verdadera
}

Operador && (AND)

El operador lógico &&, también conocido como AND, se utiliza para evaluar si dos condiciones son verdaderas al mismo tiempo. Devuelve true solo si ambas condiciones son true.

Por ejemplo, con el siguiente código podemos verificar al mismo tiempo si una persona tiene al menos 18 años y si además tiene carnet de conducir. Si ambas condiciones son verdaderas, se imprimirá «Puedes conducir»; de lo contrario, se imprimirá «No puedes conducir»:

var edad = 25;
var tieneCarnet = true;

if (edad >= 18 && tieneCarnet) {
  console.log("Puedes conducir.");
} else {
  console.log("No puedes conducir.");
}

Operador || (OR)

El operador lógico ||, también conocido como OR, se utiliza para evaluar si al menos una de las dos condiciones es verdadera. Devuelve true si al menos una condición es true.

Por ejemplo, con el siguiente código podemos verificar si una persona es estudiante o empleado. Si al menos una de las condiciones es verdadera, se imprimirá «Tienes acceso al edificio»; de lo contrario, se imprimirá «No tienes acceso al edificio»:

var esEstudiante = false;
var esEmpleado = true;

if (esEstudiante || esEmpleado) {
  console.log("Tienes acceso al edificio.");
} else {
  console.log("No tienes acceso al edificio.");
}

Operador ! (NOT)

El operador lógico !, también conocido como NOT, se utiliza para negar una condición. Si la condición es verdadera, ! la convierte en falsa, y si es falsa, la convierte en verdadera.

Por ejemplo, con el siguiente código verificamos si una persona está autenticada o no. Si la condición es verdadera (es decir, no está autenticada), se imprimirá «Debes iniciar sesión»; de lo contrario, se imprimirá «Bienvenido».

var estaAutenticado = false;

if (!estaAutenticado) {
  console.log("Debes iniciar sesión.");
} else {
  console.log("Bienvenido.");
}

Combinando operadores

Podemos combinar diferentes operadores para formar condiciones más complejas. Es importante tener en cuenta el orden de evaluación y usar paréntesis para agrupar condiciones cuando sea necesario.

Prioridad de los operadores

La prioridad de los operadores en JavaScript determina el orden en que se evalúan las expresiones. Los operadores de mayor prioridad se evalúan antes que los de menor prioridad. Si necesitamos cambiar este orden, podemos usar paréntesis para agrupar las expresiones. A continuación mostramos la prioridad de algunos operadores (los de igualdad o comparación se evaluarán antes que los lógicos):

  1. Operadores de comparación: ==, !=, ===, !==, <, >, <=, >=
  2. Operadores lógicos: &&, ||

Por ejemplo, con el siguiente código evaluamos la temperatura y si hace un día soleado. Si ambas condiciones son verdaderas, se imprimirá «Hace calor y está soleado». Si al menos una de las condiciones es verdadera, se imprimirá «Hace calor o está soleado». Si ninguna de las condiciones es verdadera, se imprimirá «No hace calor y no está soleado»:

var temperatura = 28;
var estaSoleado = true;

if (temperatura > 25 && estaSoleado) {
  console.log("Hace calor y está soleado.");
} else if (temperatura > 25 || estaSoleado) {
  console.log("Hace calor o está soleado.");
} else {
  console.log("No hace calor y no está soleado.");
}

A continuación exponemos otro ejemplo para determinar en este caso el tipo de un triángulo. Supongamos que tenemos las longitudes de los lados del triángulo y debemos decidir si es equilátero, isósceles o escaleno. Para ello podemos combinar operadores de comparación y lógicos para implementar las siguientes condiciones:

  • Si todos los lados son iguales, el triángulo es equilátero.
  • Si todos los lados son diferentes, el triángulo es escaleno.
  • Si ninguna de las condiciones anteriores se cumple, el triángulo es isósceles.
var ladoA = 5;
var ladoB = 5;
var ladoC = 6;

if (ladoA === ladoB && ladoB === ladoC) {
  console.log("El triángulo es equilátero.");
} else if (ladoA !== ladoB && ladoB !== ladoC && ladoA !== ladoC) {
  console.log("El triángulo es escaleno.");
} else {
  console.log("El triángulo es isósceles.");
}

Uso de paréntesis

A continuación vamos a mostrar un ejemplo en el que resulta necesario utilizar paréntesis para agrupar las condiciones. Supongamos que estamos desarrollando una aplicación que requiere contraseñas seguras. Para ello todas la contraseñas deben tener al menos 8 caracteres de longitud y deben contener al menos uno de los caracteres especiales «@» o «#». Si ambas condiciones se cumplen, la contraseña se considera segura:

var contraseña = "P@ssw0rd";

if ((contraseña.length >= 8) && (contraseña.includes("@") || contraseña.includes("#"))) {
  console.log("Contraseña segura.");
} else {
  console.log("La contraseña no cumple con los requisitos de seguridad.");
}

Vamos a desglosar el ejemplo para entenderlo mejor. Comenzaremos matizando los dos requisitos que se deben cumplir para que una contraseña sea segura:

  1. La longitud de la contraseña debe ser al menos 8 caracteres.
  2. La contraseña debe contener al menos uno de los caracteres especiales «@» o «#».

Ahora, veamos cómo los paréntesis ayudan a controlar el orden de evaluación:

  1. (contraseña.length >= 8) evalúa si la longitud de la contraseña es al menos 8 caracteres.
  2. (contraseña.includes("@") || contraseña.includes("#")) evalúa si la contraseña contiene al menos uno de los caracteres especiales «@» o «#».

Ambas condiciones deben cumplirse para que la contraseña sea segura. Sin embargo, si no usáramos paréntesis para agrupar estas condiciones, podríamos tener problemas con el orden de evaluación. Veamos el ejemplo sin paréntesis:

if (contraseña.length >= 8 && contraseña.includes("@") || contraseña.includes("#")) {
  // ...
}

En este caso, JavaScript evaluaría primero contraseña.length >= 8 && contraseña.includes("@"), y luego evaluaría contraseña.includes("#"), lo cual no es lo que deseamos.

Al usar paréntesis para agrupar las condiciones relacionadas, aseguramos que se evalúen como una unidad coherente. Esto nos garantiza que se cumplan ambos requisitos para considerar la contraseña segura.

En resumen, los paréntesis son esenciales para controlar el orden de evaluación y garantizar que las condiciones se combinen de la manera correcta, especialmente cuando estamos combinando operadores lógicos (&& y ||) con operadores de comparación en condiciones más complejas.

Test

Comprueba tus conocimientos con este test sobre condicionales y otros conceptos relacionados con esta unidad.