CursosEmpresasBlogLiveConfPrecios

Uso de gravatar en nuestro proyecto

Clase 19 de 29 • Curso de React Router 5 y Redux

Clase anteriorSiguiente clase

Contenido del curso

Bienvenida al curso

  • 1
    Todo lo que aprenderás sobre React Router y Redux

    Todo lo que aprenderás sobre React Router y Redux

    01:30 min

¿Qué es React Router? y Aplicarlo en tus proyectos

  • 2
    ¿Qué es React Router y cómo instalarlo?

    ¿Qué es React Router y cómo instalarlo?

    02:54 min
  • 3
    Crear nuestro archivo de Rutas

    Crear nuestro archivo de Rutas

    07:33 min
  • 4
    Container: Login

    Container: Login

    10:29 min
  • 5
    Container: Register

    Container: Register

    06:28 min
  • 6
    Container: 404 Not Found

    Container: 404 Not Found

    06:43 min
  • 7
    Componente: Layout

    Componente: Layout

    05:10 min
  • 8
    Manejando enlaces y configuraciones

    Manejando enlaces y configuraciones

    06:33 min

¿Qué es Redux?

  • 9
    Qué es Redux

    Qué es Redux

    02:17 min
  • 10

    ¿Qué es Redux? Profundizando en la herramienta

    01:32 min
  • 11
    Instalación de Redux

    Instalación de Redux

    04:40 min
  • 12
    Creando el Store de Redux

    Creando el Store de Redux

    12:53 min

Aplicando Redux a nuestra aplicación

  • 13
    Creando los reducers

    Creando los reducers

    10:40 min
  • 14
    Finalizando reducers y eliminar favoritos

    Finalizando reducers y eliminar favoritos

    08:26 min
  • 15
    Debuggeando nuestro proyecto (agregando validaciones a nuestro componente card)

    Debuggeando nuestro proyecto (agregando validaciones a nuestro componente card)

    04:19 min
  • 16
    Crear Formulario de Login

    Crear Formulario de Login

    10:08 min
  • 17
    Formulario de Login con Redux

    Formulario de Login con Redux

    06:28 min
  • 18
    Creando un Servicio para Gravatar

    Creando un Servicio para Gravatar

    05:28 min
  • 19
    Uso de gravatar en nuestro proyecto

    Uso de gravatar en nuestro proyecto

    Viendo ahora
  • 20
    Validación para LogIn LogOut

    Validación para LogIn LogOut

    09:15 min
  • 21
    Register

    Register

    07:00 min
  • 22
    Register con Redux

    Register con Redux

    04:17 min
  • 23
    Vista general del player

    Vista general del player

    05:26 min
  • 24
    Arreglando la funcionalidad del player

    Arreglando la funcionalidad del player

    06:55 min
  • 25
    Terminando de detallar nuestro player

    Terminando de detallar nuestro player

    13:50 min
  • 26
    Validaciones

    Validaciones

    10:35 min
  • 27
    Validaciones de UI

    Validaciones de UI

    07:04 min
  • 28
    Debug con Redux Devtools

    Debug con Redux Devtools

    05:57 min

Cierre del curso

  • 29
    Cierre del Proyecto

    Cierre del Proyecto

    00:39 min
  • Tomar el examen del curso
    • Seba Cardoso

      Seba Cardoso

      student•
      hace 6 años

      A mi se me ocurre que también podría tener una sola img y manejar la lógica dentro del src.

      <img src={Object.keys(user).length > 0 ? gravatar(user.email) : userIcon} alt={user.email} />
        Oscar Barajas Tavares

        Oscar Barajas Tavares

        Team Platzi•
        hace 6 años

        Una solución que ayuda a mejorar el código que es parte de la imagen, gracias por compartir.

        Markoz Peña Mendez

        Markoz Peña Mendez

        student•
        hace 6 años

        No esta mal pero para mi gusto es mejor tener todo ese resultado que final regresa un Boolean en una constante. Meter mucho js en la JSX no es entendible al final.

      Pablo Domínguez Durán

      Pablo Domínguez Durán

      student•
      hace 6 años

      No me gusta que dé por hecho que sabemos qué hace gravatar.js

      Una explicación sencilla bastaría. Al saltarselo hace que muchos solo copien y peguen código

        Jaime David Burbano Montoya

        Jaime David Burbano Montoya

        student•
        hace 5 años

        Es que no hace mucho. Lo que hizo en ese archivo fue construir una url .

        import md5 from 'md5'; const gravatar = (email) => { const base = 'https://gravatar.com/avatar/'; const formattEmail = (email).trim().toLowerCase(); const hash = md5(formattEmail, {encoding:'binaty'}); return `${base}${hash}`; } export default gravatar;
        1. Importa la libreria de md5
        2. Crea un función llamada gravatar que recibe un email como parametro
        3. Crea una "base" que es la url de gravatar para obtener una imagen
        4. Crea la parte dinámica de la url, donde coge el email que recibe, le quita los espacios que pueda tener dentro y lo pasa a minúsculas
        5. Convierte la parte dinámica de la url a un hash o una serie binaria
        6. La función retonar una URL que representa una imagen
        7. Le pone esta url de la imagen en la etiqueta <img>

        Eso es todo

        Victor Baruch Pazaran Jaimes

        Victor Baruch Pazaran Jaimes

        student•
        hace 5 años

        claro, estoy de acuerdo en esto, pero tambien es tarea de cada quien ponerse a investigar un poco por nuestra cuenta en los temas que te interesen o que se quieran entender mas a profundidad, tan solo imagina como seria el curso si se pusiera a explicar cada una de las funciones que llebamos usando hasta el momento

        yo nunca habia escuchado de gravatar, pero mira, con una sencialla busqueda en google pude saber que era

        gravatar.JPG
      Joaquín Ignacio Ossandón Gómez

      Joaquín Ignacio Ossandón Gómez

      student•
      hace 6 años

      Para quienes tengan un error con Object.keys(user)

      En mi index.js (más bien en mi estado inicial) no existía el objeto user, sino User, corrigiendo esto, solucioné el error de que no funcionase con el Object.keys, claramente no era un objeto, sino algo que no estaba definido y me lo estaba sacando de la manga.

      Antes:

      const initialState = { "User" : {}, "playing": {}, "myList": [], ...

      Después:

      const initialState = { "user" : {}, "playing": {}, "myList": [], ...

      Hace bien despejarse, intenté hacer un poco de música, me distraje un poco, fui a hacer almuerzo y cuando entré a la cocina, se me alumbró la ampolleta. 😁

      Obvio, también tenemos que revisar todo y entender qué estamos haciendo y por qué. En mi caso, no terminaba de enlazar todo hasta ahora. 😅

      Esto soluciona también el problema de la próxima clase.

        Manuel Entrena Jimenez

        Manuel Entrena Jimenez

        student•
        hace 5 años

        Me salvastes!

      Axel Alexis Lopez Resendiz

      Axel Alexis Lopez Resendiz

      student•
      hace 5 años

      En el return de gravatar

      return `${base}${hash}?d=identicon`

      de esta forma les retornara la imagen que tenga asignada al hash del correo o una aleatoria en caso de que no lo tenga.

        Miguel Angel Reyes Moreno

        Miguel Angel Reyes Moreno

        student•
        hace 5 años

        No me funciona :(

      Andrés Felipe Cano Sierra

      Andrés Felipe Cano Sierra

      student•
      hace 6 años

      Oh, oh, oh It's magic, you know

      Max Alberto Cuao Manjarrez

      Max Alberto Cuao Manjarrez

      student•
      hace 6 años

      Otra manera de validar si existe el usuario para poner el icono:

      <img src={user ? gravatar(user.email) : userIcon} alt={user ? user.email : 'Icono de usuario'} />
      Gustavo Gonzalez Montero

      Gustavo Gonzalez Montero

      student•
      hace 4 años

      Alguien me puede explicar con peras y manzanas porque en esta ocasión usamos una arrow function en mapStateToProps para sacar el usuario, y en otras ocaciones usamos un objeto que usamos como parámetro en el connect?

      const mapStateToProps = state => { return { user: state.user } } export default connect(mapStateToProps, null)(Header)

      Lo que entiendo es que del contenedor Login nos conectamos al otro contenedor Home que tiene al componente Header donde "supongo" que va a "traer" consigo ya cargado el usuario (en las props del state).

      ¿Es así o cómo se podría explicar de una manera simple?

        Nilson Diaz

        Nilson Diaz

        student•
        hace 4 años

        Hola ! como bien ya sabes La forma de consumir el estado de redux es atravez de la funcion connect , esta recibira dos parametros

        El primero sera una funcion a la que redux internamente le pasara todo nuestro store (o state) y nosotros dentro de la funcion retornaremos un objeto con los valores del store que queremos consumir en nuestro componente, tambien solo podemos retornar el store(o state) si queremos tener acceso a todo. Comunmente y por convencion se le llama mapStateToProps

        El segundo parametro es un objeto en donde ponemos nuestros actions, Comunmente y por convencion se le llama mapDispatchToProps.

        la razon por la que mapStateToProps es una funcion es porque nosotros no tenemos acceso al store de redux de una forma directa , asi que de esta forma redux nos dara por parametros el estado y ya luego nosotros decidiremos que retornar a las props de nuestro componente, mapDispatchToProps siempre sera un objeto ya que redux no tiene conocimiento de que actions nosotros tenemos , asi que importamos nuestro actions y lo ponemos en un objeto y se lo pasamos de segundo parametro en la funcion connect.

        si no necesitamos actions o estado simplemente le ponemos un null en su respectivo espacio, y haremos esto cada vez que queramos conectarnos al store de redux (o state) en cualquier componente

        siempre puedes leer mas a detalle como funciona en su documentacion

        Espero te haya quedado un poco mas claro !

        Gustavo Gonzalez Montero

        Gustavo Gonzalez Montero

        student•
        hace 4 años

        Gracias!

      Manuel Alejandro Blanco Lamas

      Manuel Alejandro Blanco Lamas

      student•
      hace 5 años

      Tambien pueden verificar si email esta incluido dentro de user con:

      Object.keys(user).includes('email')

      Andrés Campuzano Garzón

      Andrés Campuzano Garzón

      student•
      hace 6 años

      🦄 Acá el código de lo trabajado al momento: https://github.com/AndresCampuzano/React-Router-and-Redux/commit/c2d05f887bda20f194436f08d042064cb96c7525

        GRECO ALEJANDRO SERNA DIAZ

        GRECO ALEJANDRO SERNA DIAZ

        student•
        hace 4 años

        muchas gracias compañero, gracias a ti pude darme cuenta de lo que fallé en mi proyecto, saludos :D

      platzerito02112019 platzerito02112019

      platzerito02112019 platzerito02112019

      student•
      hace 6 años

      Tengo este TypeError cuando uso la funcion keys

      const Header = props => { const { user } = props; const hasUser = Object.keys(user).length > 0;
      Uncaught TypeError: Cannot convert undefined or null to object at Function.keys (<anonymous>) at Header (Header.jsx:23) at renderWithHooks (react-dom.development.js:15108) at mountIndeterminateComponent (react-dom.development.js:17342) at beginWork$1 (react-dom.development.js:18486) at HTMLUnknownElement.callCallback (react-dom.development.js:347) at Object.invokeGuardedCallbackDev (react-dom.development.js:397) at invokeGuardedCallback (react-dom.development.js:454) at beginWork$$1 (react-dom.development.js:23217) at performUnitOfWork (react-dom.development.js:22208)

      ![](

      type.png

        Juan Sebastian Reina

        Juan Sebastian Reina

        student•
        hace 6 años

        Lo que debe estar ocurriendo es que cuando se hace el destructuring de props el valor de user no existe, luego, el Object.keys intenta obtener los key values de un objeto que no existe o es null. Prueba lo siguiente:

        const isNullOrUndefined = (value) => value === null || typeof value === 'undefined' ; const { user } = props; const hasUser = isNullOrUndefined() && Object.keys(user).length > 0;

        en caso de ser null o undefined Object.keys no se ejecuta y hasUsertoma el valor defalse`, de esta manera debería quedar resulto

        Juan Sebastian Reina

        Juan Sebastian Reina

        student•
        hace 6 años

        me falta algo en el comentario anterior, corrijo:

        const hasUser = !isNullOrUndefined(user) && Object.keys(user).length > 0;

        ps: no se si se pueden editar comentarios haha

      Manuel Entrena Jimenez

      Manuel Entrena Jimenez

      student•
      hace 5 años

      Tuve que poner un "/" entre el base y el hash para que la url de gravatar funcionase y al final "?

      code.png

        Emmanuel Vega

        Emmanuel Vega

        student•
        hace 5 años

        Gracias! A mi tampoco me retornaba ni mi usuario ni el default Aunque me queda duda de por qué se puede acceder a mi usario aún sin ponerle una contraseña

      Daniel Hernández

      Daniel Hernández

      student•
      hace 6 años

      porque en la logica de un anterior video para pasar un parametro a una function desde el html toco hacer : {() => function(param)} y aqui si se puede hacer {function(param)} ??

        Marco Mesén Campos

        Marco Mesén Campos

        student•
        hace 6 años

        las funciones que pases así {function(param)} se ejecutará inmediatamente, diferente a las funciones que pases dentro de otra, estas esperarán a que las ejecutes, el ejemplo anterior que mencionas era un event, creo que era onchange o onclick por ende tenía que pasarse sin que se ejecutara, hasta que el evento lo hiciera

      Pablo Domínguez Durán

      Pablo Domínguez Durán

      student•
      hace 6 años

      Lo que hace la url de gravatar es proveer una url pública que tiene una foto asociada a un correo.

      Este correo lo mandamos con un hash en formato binario que obtenemos de md5, un algoritmo de criptografía, para crear un hash de 128 bits

      Karen Paola Diaz Duarte

      Karen Paola Diaz Duarte

      student•
      hace 5 años

      Práctica: anteriormente me salía un error en la consola de la web y lo corregí poniendo binary en comillas simples, 'binary'

      24.PNG

      Bruno Kamiche

      Bruno Kamiche

      student•
      hace 5 años

      no entendí nara

      Julio Gragirena

      Julio Gragirena

      student•
      hace 6 años

      holaa , el icono del usuario no me cambia , no se cual es la solucion

      import React from 'react'; import { connect } from 'react-redux'; import '../asset/styles/Components/Header.scss'; import { Link } from 'react-router-dom'; import gravatar from '../utils/gravatar'; import logo from '../asset/static/logo-platzi-video-BW2.png'; import userIcon from '../asset/static/user-icon.png'; const Header = (props) => { const { user } = props; const hasUser = Object.keys(user).length > 0; console.log(hasUser); return ( <header className='header'> <Link to='/'> <img className='header__img' src={logo} alt='Platzi Video' /> </Link> <div className='header__menu'> <div className='header__menu--profile'> { hasUser ? (<img src={gravatar(user.email)} alt={user.email} />) : (<img src={userIcon} alt='User' />) } <p>Perfil</p> </div> <ul> <li><a href='/'>Cuenta</a></li> <li> <Link to='/login'> Iniciar sesion </Link> </li> </ul> </div> </header> ); }; const mapStateToProps = (state) => { return { user: state.user, }; }; //export default Header; export default connect(mapStateToProps, null)(Header);
      import md5 from 'md5'; const gravatar = (email) => { const base = 'https://gravatar.com/avatar/'; const formattedEmail = email[0].trim().toLowerCase(); const hash = md5(formattedEmail, { enconding: 'binary' }); return `${base}${hash}`; }; export default gravatar;
        Luis Lira

        Luis Lira

        student•
        hace 6 años

        ¡Hola! :D

        Para que funcione el cambio de icono debes usar una cuenta de correr la cual esté registrada en Gravatar y que le hayas asignado tu propia imagen, en mi caso, me salía la imagen que agregué en mi cuenta de Wordpress, al parecer de ahí las toma.

        ¡Nunca pares de aprender! 💚

        Julio Gragirena

        Julio Gragirena

        student•
        hace 6 años

        osea no me pone el icono por defecto ni tampoco un icono valido , ando viendo pero no encuentro el error la verdad

      Daniel Ruiz

      Daniel Ruiz

      student•
      hace 5 años

      No me cambia el avatar pero tampoco me arroja ningun error en consola ¿donde podria estar fallando?

        Luis Lira

        Luis Lira

        student•
        hace 5 años

        Podrías poner tu código para poder revisarlo? También puedes ir haciendo logs para ver qué resultado estás teniendo.

        Martin Paez

        Martin Paez

        student•
        hace 5 años

        Hi. Tienes que revisar tu funcion gravatar o el componente Header. Si nos podrias compartir tu codigo de ambos seria mejor para poderte apoyar. :)

      Juan Sebastián Gómez Tabares

      Juan Sebastián Gómez Tabares

      student•
      hace 5 años

      estoy revisando que es props y aun no me queda claro que es, asi que lo imprimi en consola y me encuentro con muchas cosas que no se que son, alguien me podria explicar?

        Abril Rios

        Abril Rios

        student•
        hace 5 años

        Props vendria a ser las propiedades React lo abrevia como props.

        Un ejemplo de una propiedad con JavaScript seria .toString

        Y con uno de React podria ser React.component

      Migrant Cyborg

      Migrant Cyborg

      student•
      hace 5 años

      Por si les llega a dar un typeError diciendo que el Object.keys no puede ejecurtarse sobre un elemento vacio:

      1. Revisen las solcuiones que ya ofrecieron otrxs compañerxs: 1.1. Revisar initialState que "user" estè escrito en minuscula 1.2 Revisa que Object.keys inicie en mayuscula y no object.keys Y si nada de eso les funciona, lo que pasa es que el typo està en el reducer, vayan al case de loginRequest, y asegurense que en el return de user esté asì: action.payload
      case actions.loginRequest: return{ ...state, user: action.payload, };

      Me pasó que tenia actions.payload y no tenia como guardar el dato. Intenten no resolver haciendo una validación para que cuando user venga vació no haga el Object.keys, porque de este modo no resuelven el problema real y van a ir acarreando esta deuda tènica. Exitos compas!!

        Cesar Eduardo Valle Pino

        Cesar Eduardo Valle Pino

        student•
        hace 4 años

        Me paso que tenía object en lugar de Object. Gracias.

      Paul Cortes

      Paul Cortes

      student•
      hace 5 años

      Que opìnan de esta forma de validar

      <img src={user.email ? gravatar(user.email) : userIcon} alt='' />
        Carlos Alfonso Garcia Rivera

        Carlos Alfonso Garcia Rivera

        student•
        hace 5 años

        estilo compacto (y)

    Escuelas

    • Desarrollo Web
      • Fundamentos del Desarrollo Web Profesional
      • Diseño y Desarrollo Frontend
      • Desarrollo Frontend con JavaScript
      • Desarrollo Frontend con Vue.js
      • Desarrollo Frontend con Angular
      • Desarrollo Frontend con React.js
      • Desarrollo Backend con Node.js
      • Desarrollo Backend con Python
      • Desarrollo Backend con Java
      • Desarrollo Backend con PHP
      • Desarrollo Backend con Ruby
      • Bases de Datos para Web
      • Seguridad Web & API
      • Testing Automatizado y QA para Web
      • Arquitecturas Web Modernas y Escalabilidad
      • DevOps y Cloud para Desarrolladores Web
    • English Academy
      • Inglés Básico A1
      • Inglés Básico A2
      • Inglés Intermedio B1
      • Inglés Intermedio Alto B2
      • Inglés Avanzado C1
      • Inglés para Propósitos Específicos
      • Inglés de Negocios
    • Marketing Digital
      • Fundamentos de Marketing Digital
      • Marketing de Contenidos y Redacción Persuasiva
      • SEO y Posicionamiento Web
      • Social Media Marketing y Community Management
      • Publicidad Digital y Paid Media
      • Analítica Digital y Optimización (CRO)
      • Estrategia de Marketing y Growth
      • Marketing de Marca y Comunicación Estratégica
      • Marketing para E-commerce
      • Marketing B2B
      • Inteligencia Artificial Aplicada al Marketing
      • Automatización del Marketing
      • Marca Personal y Marketing Freelance
      • Ventas y Experiencia del Cliente
      • Creación de Contenido para Redes Sociales
    • Inteligencia Artificial y Data Science
      • Fundamentos de Data Science y AI
      • Análisis y Visualización de Datos
      • Machine Learning y Deep Learning
      • Data Engineer
      • Inteligencia Artificial para la Productividad
      • Desarrollo de Aplicaciones con IA
      • AI Software Engineer
    • Ciberseguridad
      • Fundamentos de Ciberseguridad
      • Hacking Ético y Pentesting (Red Team)
      • Análisis de Malware e Ingeniería Forense
      • Seguridad Defensiva y Cumplimiento (Blue Team)
      • Ciberseguridad Estratégica
    • Liderazgo y Habilidades Blandas
      • Fundamentos de Habilidades Profesionales
      • Liderazgo y Gestión de Equipos
      • Comunicación Avanzada y Oratoria
      • Negociación y Resolución de Conflictos
      • Inteligencia Emocional y Autogestión
      • Productividad y Herramientas Digitales
      • Gestión de Proyectos y Metodologías Ágiles
      • Desarrollo de Carrera y Marca Personal
      • Diversidad, Inclusión y Entorno Laboral Saludable
      • Filosofía y Estrategia para Líderes
    • Diseño de Producto y UX
      • Fundamentos de Diseño UX/UI
      • Investigación de Usuarios (UX Research)
      • Arquitectura de Información y Usabilidad
      • Diseño de Interfaces y Prototipado (UI Design)
      • Sistemas de Diseño y DesignOps
      • Redacción UX (UX Writing)
      • Creatividad e Innovación en Diseño
      • Diseño Accesible e Inclusivo
      • Diseño Asistido por Inteligencia Artificial
      • Gestión de Producto y Liderazgo en Diseño
      • Diseño de Interacciones Emergentes (VUI/VR)
      • Desarrollo Web para Diseñadores
      • Diseño y Prototipado No-Code
    • Contenido Audiovisual
      • Fundamentos de Producción Audiovisual
      • Producción de Video para Plataformas Digitales
      • Producción de Audio y Podcast
      • Fotografía y Diseño Gráfico para Contenido Digital
      • Motion Graphics y Animación
      • Contenido Interactivo y Realidad Aumentada
      • Estrategia, Marketing y Monetización de Contenidos
    • Desarrollo Móvil
      • Fundamentos de Desarrollo Móvil
      • Desarrollo Nativo Android con Kotlin
      • Desarrollo Nativo iOS con Swift
      • Desarrollo Multiplataforma con React Native
      • Desarrollo Multiplataforma con Flutter
      • Arquitectura y Patrones de Diseño Móvil
      • Integración de APIs y Persistencia Móvil
      • Testing y Despliegue en Móvil
      • Diseño UX/UI para Móviles
    • Diseño Gráfico y Arte Digital
      • Fundamentos del Diseño Gráfico y Digital
      • Diseño de Identidad Visual y Branding
      • Ilustración Digital y Arte Conceptual
      • Diseño Editorial y de Empaques
      • Motion Graphics y Animación 3D
      • Diseño Gráfico Asistido por Inteligencia Artificial
      • Creatividad e Innovación en Diseño
    • Programación
      • Fundamentos de Programación e Ingeniería de Software
      • Herramientas de IA para el trabajo
      • Matemáticas para Programación
      • Programación con Python
      • Programación con JavaScript
      • Programación con TypeScript
      • Programación Orientada a Objetos con Java
      • Desarrollo con C# y .NET
      • Programación con PHP
      • Programación con Go y Rust
      • Programación Móvil con Swift y Kotlin
      • Programación con C y C++
      • Administración Básica de Servidores Linux
    • Negocios
      • Fundamentos de Negocios y Emprendimiento
      • Estrategia y Crecimiento Empresarial
      • Finanzas Personales y Corporativas
      • Inversión en Mercados Financieros
      • Ventas, CRM y Experiencia del Cliente
      • Operaciones, Logística y E-commerce
      • Gestión de Proyectos y Metodologías Ágiles
      • Aspectos Legales y Cumplimiento
      • Habilidades Directivas y Crecimiento Profesional
      • Diversidad e Inclusión en el Entorno Laboral
      • Herramientas Digitales y Automatización para Negocios
    • Blockchain y Web3
      • Fundamentos de Blockchain y Web3
      • Desarrollo de Smart Contracts y dApps
      • Finanzas Descentralizadas (DeFi)
      • NFTs y Economía de Creadores
      • Seguridad Blockchain
      • Ecosistemas Blockchain Alternativos (No-EVM)
      • Producto, Marketing y Legal en Web3
    • Recursos Humanos
      • Fundamentos y Cultura Organizacional en RRHH
      • Atracción y Selección de Talento
      • Cultura y Employee Experience
      • Gestión y Desarrollo de Talento
      • Desarrollo y Evaluación de Liderazgo
      • Diversidad, Equidad e Inclusión
      • AI y Automatización en Recursos Humanos
      • Tecnología y Automatización en RRHH
    • Finanzas e Inversiones
      • Fundamentos de Finanzas Personales y Corporativas
      • Análisis y Valoración Financiera
      • Inversión y Mercados de Capitales
      • Finanzas Descentralizadas (DeFi) y Criptoactivos
      • Finanzas y Estrategia para Startups
      • Inteligencia Artificial Aplicada a Finanzas
      • Domina Excel
      • Financial Analyst
      • Conseguir trabajo en Finanzas e Inversiones
    • Startups
      • Fundamentos y Validación de Ideas
      • Estrategia de Negocio y Product-Market Fit
      • Desarrollo de Producto y Operaciones Lean
      • Finanzas, Legal y Fundraising
      • Marketing, Ventas y Growth para Startups
      • Cultura, Talento y Liderazgo
      • Finanzas y Operaciones en Ecommerce
      • Startups Web3 y Blockchain
      • Startups con Impacto Social
      • Expansión y Ecosistema Startup
    • Cloud Computing y DevOps
      • Fundamentos de Cloud y DevOps
      • Administración de Servidores Linux
      • Contenerización y Orquestación
      • Infraestructura como Código (IaC) y CI/CD
      • Amazon Web Services
      • Microsoft Azure
      • Serverless y Observabilidad
      • Certificaciones Cloud (Preparación)
      • Plataforma Cloud GCP

    Platzi y comunidad

    • Platzi Business
    • Live Classes
    • Lanzamientos
    • Executive Program
    • Trabaja con nosotros
    • Podcast

    Recursos

    • Manual de Marca

    Soporte

    • Preguntas Frecuentes
    • Contáctanos

    Legal

    • Términos y Condiciones
    • Privacidad
    • Tyc promociones
    Reconocimientos
    Reconocimientos
    Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
    Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
    Logo reconocimientoPrimera Startup EdTech · 2018
    Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
    Logo reconocimientoCEO Mejor Emprendedor del año · 2024
    De LATAM conpara el mundo
    YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads