diff --git a/public/images/speakers/Alexis_Alva_Nunez.webp b/public/images/speakers/Alexis_Alva_Nunez.webp new file mode 100644 index 0000000..351e63b Binary files /dev/null and b/public/images/speakers/Alexis_Alva_Nunez.webp differ diff --git a/public/images/speakers/Alison_Orellana_Rios.webp b/public/images/speakers/Alison_Orellana_Rios.webp new file mode 100644 index 0000000..ef22f68 Binary files /dev/null and b/public/images/speakers/Alison_Orellana_Rios.webp differ diff --git a/public/images/speakers/Alonso_Astroza.webp b/public/images/speakers/Alonso_Astroza.webp new file mode 100644 index 0000000..1ece49d Binary files /dev/null and b/public/images/speakers/Alonso_Astroza.webp differ diff --git a/public/images/speakers/Ariane_Carvajal.webp b/public/images/speakers/Ariane_Carvajal.webp new file mode 100644 index 0000000..80317c0 Binary files /dev/null and b/public/images/speakers/Ariane_Carvajal.webp differ diff --git a/public/images/speakers/Daniel_Hernandez.webp b/public/images/speakers/Daniel_Hernandez.webp new file mode 100644 index 0000000..76a7d57 Binary files /dev/null and b/public/images/speakers/Daniel_Hernandez.webp differ diff --git a/public/images/speakers/David_Cortes.webp b/public/images/speakers/David_Cortes.webp new file mode 100644 index 0000000..272d01d Binary files /dev/null and b/public/images/speakers/David_Cortes.webp differ diff --git a/public/images/speakers/Dylan_Oteiza.webp b/public/images/speakers/Dylan_Oteiza.webp new file mode 100644 index 0000000..b0db58a Binary files /dev/null and b/public/images/speakers/Dylan_Oteiza.webp differ diff --git a/public/images/speakers/Flavio_Fabian_Espeche_Nieva.webp b/public/images/speakers/Flavio_Fabian_Espeche_Nieva.webp new file mode 100644 index 0000000..879fc18 Binary files /dev/null and b/public/images/speakers/Flavio_Fabian_Espeche_Nieva.webp differ diff --git a/public/images/speakers/Francisca_Beatriz_Medina_Concha.webp b/public/images/speakers/Francisca_Beatriz_Medina_Concha.webp new file mode 100644 index 0000000..4c1f64b Binary files /dev/null and b/public/images/speakers/Francisca_Beatriz_Medina_Concha.webp differ diff --git a/public/images/speakers/Francisco_Alfaro.webp b/public/images/speakers/Francisco_Alfaro.webp new file mode 100644 index 0000000..51d0026 Binary files /dev/null and b/public/images/speakers/Francisco_Alfaro.webp differ diff --git a/public/images/speakers/Francisco_Ponce.webp b/public/images/speakers/Francisco_Ponce.webp new file mode 100644 index 0000000..2bfbe1d Binary files /dev/null and b/public/images/speakers/Francisco_Ponce.webp differ diff --git a/public/images/speakers/Francisco_Vergara_Vallejos.webp b/public/images/speakers/Francisco_Vergara_Vallejos.webp new file mode 100644 index 0000000..076a40c Binary files /dev/null and b/public/images/speakers/Francisco_Vergara_Vallejos.webp differ diff --git a/public/images/speakers/Gabriel_Grobier_Romo.webp b/public/images/speakers/Gabriel_Grobier_Romo.webp new file mode 100644 index 0000000..bce61f6 Binary files /dev/null and b/public/images/speakers/Gabriel_Grobier_Romo.webp differ diff --git a/public/images/speakers/Ingrid_Solis_Gonzalez.webp b/public/images/speakers/Ingrid_Solis_Gonzalez.webp new file mode 100644 index 0000000..92b7d11 Binary files /dev/null and b/public/images/speakers/Ingrid_Solis_Gonzalez.webp differ diff --git a/public/images/speakers/Jesus_Henriquez.webp b/public/images/speakers/Jesus_Henriquez.webp new file mode 100644 index 0000000..bf95323 Binary files /dev/null and b/public/images/speakers/Jesus_Henriquez.webp differ diff --git a/public/images/speakers/Lia_Da_Silva.webp b/public/images/speakers/Lia_Da_Silva.webp new file mode 100644 index 0000000..57183ea Binary files /dev/null and b/public/images/speakers/Lia_Da_Silva.webp differ diff --git a/public/images/speakers/Marcelo_Cavieres.webp b/public/images/speakers/Marcelo_Cavieres.webp new file mode 100644 index 0000000..6980d05 Binary files /dev/null and b/public/images/speakers/Marcelo_Cavieres.webp differ diff --git a/public/images/speakers/Pablo_Jimenez.webp b/public/images/speakers/Pablo_Jimenez.webp new file mode 100644 index 0000000..062ea6b Binary files /dev/null and b/public/images/speakers/Pablo_Jimenez.webp differ diff --git a/public/images/speakers/Pia_Aedo.webp b/public/images/speakers/Pia_Aedo.webp new file mode 100644 index 0000000..9173183 Binary files /dev/null and b/public/images/speakers/Pia_Aedo.webp differ diff --git a/public/images/speakers/Sebastian_flores.webp b/public/images/speakers/Sebastian_flores.webp new file mode 100644 index 0000000..56560b1 Binary files /dev/null and b/public/images/speakers/Sebastian_flores.webp differ diff --git a/public/images/speakers/Valeska_Canales.webp b/public/images/speakers/Valeska_Canales.webp new file mode 100644 index 0000000..737adf0 Binary files /dev/null and b/public/images/speakers/Valeska_Canales.webp differ diff --git a/public/images/speakers/ana-gonzalez.webp b/public/images/speakers/ana-gonzalez.webp deleted file mode 100644 index 29d085e..0000000 Binary files a/public/images/speakers/ana-gonzalez.webp and /dev/null differ diff --git a/public/images/speakers/carla-herrera.webp b/public/images/speakers/carla-herrera.webp deleted file mode 100644 index 400dfe1..0000000 Binary files a/public/images/speakers/carla-herrera.webp and /dev/null differ diff --git a/public/images/speakers/carlos-rojas.webp b/public/images/speakers/carlos-rojas.webp deleted file mode 100644 index 8f88d33..0000000 Binary files a/public/images/speakers/carlos-rojas.webp and /dev/null differ diff --git a/public/images/speakers/daniel-castro.webp b/public/images/speakers/daniel-castro.webp deleted file mode 100644 index 4df9835..0000000 Binary files a/public/images/speakers/daniel-castro.webp and /dev/null differ diff --git a/public/images/speakers/felipe-rojas.webp b/public/images/speakers/felipe-rojas.webp deleted file mode 100644 index b6c5367..0000000 Binary files a/public/images/speakers/felipe-rojas.webp and /dev/null differ diff --git a/public/images/speakers/jorge-mendez.webp b/public/images/speakers/jorge-mendez.webp deleted file mode 100644 index 1afc83c..0000000 Binary files a/public/images/speakers/jorge-mendez.webp and /dev/null differ diff --git a/public/images/speakers/laura-perez.webp b/public/images/speakers/laura-perez.webp deleted file mode 100644 index 5c8307e..0000000 Binary files a/public/images/speakers/laura-perez.webp and /dev/null differ diff --git a/public/images/speakers/patricia-morales.webp b/public/images/speakers/patricia-morales.webp deleted file mode 100644 index 37a1930..0000000 Binary files a/public/images/speakers/patricia-morales.webp and /dev/null differ diff --git a/public/images/speakers/roberto-gutierrez.webp b/public/images/speakers/roberto-gutierrez.webp deleted file mode 100644 index 1580cbd..0000000 Binary files a/public/images/speakers/roberto-gutierrez.webp and /dev/null differ diff --git a/src/app/[city]/page.js b/src/app/[city]/page.js index 15c0110..05eb8ed 100644 --- a/src/app/[city]/page.js +++ b/src/app/[city]/page.js @@ -39,6 +39,19 @@ export default async function CityPage({ params }) { notFound(); } + // Función para extraer la hora de inicio + const getStartTime = (timeStr) => { + if (timeStr.includes(' - ')) { + return timeStr.split(' - ')[0]; + } + return timeStr; + }; + + // Ordenar eventos por hora + const sortedSchedule = [...data.schedule].sort((a, b) => { + return getStartTime(a.time).localeCompare(getStartTime(b.time)); + }); + return ( <> {/* Hero Section */} @@ -59,6 +72,7 @@ export default async function CityPage({ params }) {

{data.date}

{data.venue}

+ {/* Sección de introducción - Solo se muestra si existe */} {data.introduction && (
@@ -104,7 +118,7 @@ export default async function CityPage({ params }) { {/* Registro Section */}
- +
@@ -112,10 +126,14 @@ export default async function CityPage({ params }) { {/* Agenda*/}

Agenda

- {data.length > 0 ? ( + {sortedSchedule.length > 0 ? (
- {data.schedule.map((talk, index) => ( - + {sortedSchedule.map((talk) => ( + ))}
) : ( @@ -230,4 +248,4 @@ export default async function CityPage({ params }) { ); -} +} \ No newline at end of file diff --git a/src/app/page.js b/src/app/page.js index 643bf40..96ec384 100644 --- a/src/app/page.js +++ b/src/app/page.js @@ -3,11 +3,10 @@ import Image from "next/image"; import CountdownTimer from "@/components/CountdownTimer"; import ChileMap from "@/components/ChileMap"; import TalkCard from "@/components/TalkCard"; -import RegistrationForm from "@/components/RegistrationForm"; import HeroSection from "@/components/HeroSection"; import SponsorList from "./sponsors/components/SponsorList"; import featuredTalks from "@/data/featuredTalks"; -import { FeatureGuard } from "@/components/FeatureManagement/FeatureGuard"; +import allTalks from "@/data/talks"; import RegistrationState from "@/components/RegistrationState"; import EmptyState from "@/components/EmptyState"; import cityData from "@/data/cities"; @@ -49,28 +48,38 @@ export default function Home() { {/* Agenda / Charlas Section */}

Charlas Destacadas

+ {featuredTalks && featuredTalks.length > 0 ? ( -
- {featuredTalks.map((talk, index) => ( - - ))} -
- ) : ( - - )} - {featuredTalks && featuredTalks.length > 0 && ( -
+ <> +
+ {featuredTalks.map((talk, index) => ( + + ))} +
+
+ + Ver todas las charlas + +
+ + ) : allTalks && allTalks.length > 0 ? ( +
+

+ Ya puedes revisar la agenda del evento PyDay 2025 +

- Ver todas las charlas + Ver agenda completa
+ ) : ( + )}
{/* Registro Section */}
-

Registro PyDay 2025

- +

Registro PyDay 2025

+
{/* Acerca de PyDay */} @@ -93,63 +102,12 @@ export default function Home() {
- {/* Patrocinadores Section - Versión Simplificada */} + {/* Patrocinadores Section */}
-

+

Nuestros Patrocinadores

- {/* FIXME: Escoger formato de Patrocinadores */} - {/* Patrocinadores Premium */} - {/*
-

- Patrocinadores Premium -

-
- - href="https://www.python.org/psf-landing/" - target="_blank" - rel="noopener noreferrer" - className="bg-white/10 backdrop-blur p-6 rounded-lg hover:bg-white/20 transition-all duration-300 flex items-center justify-center" - > -
- Python Software Foundation -
- -
-
*/} - - {/* Patrocinadores Básico */} - {/*
-

- Patrocinadores Básico -

-
- - href="https://aws.amazon.com/es/" - target="_blank" - rel="noopener noreferrer" - className="bg-white/10 backdrop-blur p-6 rounded-lg hover:bg-white/20 transition-all duration-300 flex items-center justify-center" - > -
- Amazon Web Services -
- -
-
*/} {/* CTA para patrocinadores */}
@@ -174,3 +132,4 @@ export default function Home() { ); } + diff --git a/src/app/talks/page.js b/src/app/talks/page.js index 65d35b8..e7ffd94 100644 --- a/src/app/talks/page.js +++ b/src/app/talks/page.js @@ -6,6 +6,7 @@ import Link from "next/link"; import allTalks from "@/data/talks"; import cityData from "@/data/cities"; import EmptyState from "@/components/EmptyState"; +import { FaSearch } from "react-icons/fa"; export default function TalksPage() { const [selectedCity, setSelectedCity] = useState(""); @@ -25,18 +26,18 @@ export default function TalksPage() { const filteredTalks = allTalks.filter((talk) => { const cityInfo = cityData[talk.city]; const searchTerms = debouncedSearch.toLowerCase(); - + const cityMatch = !selectedCity || talk.city === selectedCity; - const categoryMatch = - !selectedCategory || talk.category === selectedCategory; - const dateMatch = selectedDay ? cityInfo.date === selectedDay : true; - + const categoryMatch = !selectedCategory || talk.category === selectedCategory; + const dateMatch = selectedDay ? cityInfo?.date === selectedDay : true; + const searchMatch = talk.title.toLowerCase().includes(searchTerms) || talk.description.toLowerCase().includes(searchTerms) || - talk.tags?.some((tag) => tag.toLowerCase().includes(searchTerms)) || - talk.speaker.name.toLowerCase().includes(searchTerms); - + (talk.tags && talk.tags.some(tag => tag.toLowerCase().includes(searchTerms))) || + (talk.speaker?.name && talk.speaker.name.toLowerCase().includes(searchTerms)) || + (talk.speakers && talk.speakers.some(s => s.name.toLowerCase().includes(searchTerms))); + return cityMatch && categoryMatch && dateMatch && searchMatch; }); @@ -99,7 +100,8 @@ export default function TalksPage() { ))}
- {/* Filtros de charlas */} + + {/* Filtros de charlas (estructura original) */}
@@ -125,7 +127,6 @@ export default function TalksPage() { -
@@ -136,73 +137,51 @@ export default function TalksPage() { onChange={(e) => setSearchQuery(e.target.value)} className="text-py-text border border-py-text/20 rounded pl-9 pr-3 py-1.5 w-full md:w-64 text-sm focus:outline-none focus:ring-2 focus:ring-py-green" /> - - - +
- {/* Renderizado de charlas */} + {/* Renderizado agrupado por sala */} {filteredTalks.length > 0 ? ( -
- {filteredTalks.map((talk) => { - const cityInfo = cityData[talk.city]; - return ( - - ); - })} -
+ Object.entries( + filteredTalks.reduce((acc, talk) => { + const room = talk.room || "Sala no asignada"; + if (!acc[room]) acc[room] = []; + acc[room].push(talk); + return acc; + }, {}) + ).map(([roomName, talksInRoom]) => { + // Ordena por hora dentro de la sala + const sortedTalks = talksInRoom.sort((a, b) => + a.time.localeCompare(b.time) + ); + + return ( +
+

{roomName}

+
+ {sortedTalks.map((talk) => { + const cityInfo = cityData[talk.city]; + return ( + + ); + })} +
+
+ ); + }) ) : ( )} - - {/* TODO: API para que funcione: */} - {/* Subscribe for updates */} - {/*
-
-
-
-

- ¿Quieres recibir actualizaciones? -

-

- Suscríbete para recibir notificaciones sobre nuevas charlas y - cambios en el programa. -

-
-
- - -
-
-
-
*/} ); -} +} \ No newline at end of file diff --git a/src/components/FeatureManagement/FeatureGuard.js b/src/components/FeatureManagement/FeatureGuard.js index c8b0db5..14e8c57 100644 --- a/src/components/FeatureManagement/FeatureGuard.js +++ b/src/components/FeatureManagement/FeatureGuard.js @@ -5,13 +5,18 @@ export const FeatureGuard = ({ children, featureName, cityData }) => { registration: { enabled: process.env.NEXT_PUBLIC_FEATURE_REGISTRATION === "true", title: `Registro PyDay ${cityData?.name || "2025"}`, - subtitle: cityData?.registrationLink - ? "¡Regístrate ahora para asegurar tu lugar en el PyDay 2025!" - : "El registro abrirá próximamente. Mantente atento a nuestras redes sociales", - showCTA: !!cityData?.registrationLink, - buttonText: "Registrarme ahora", - href: cityData?.registrationLink || "", - }, + subtitle: + cityData?.registrationStatus === "soldout" + ? "Los cupos se han agotado. ¡Gracias por tu interés!" + : cityData?.registrationLink + ? "¡Regístrate ahora para asegurar tu lugar en el PyDay 2025!" + : "El registro abrirá próximamente. Mantente atento a nuestras redes sociales", + showCTA: + cityData?.registrationStatus !== "soldout" && + !!cityData?.registrationLink, + buttonText: "Registrarme ahora", + href: cityData?.registrationLink || "", + }, sponsors: { enabled: process.env.NEXT_PUBLIC_FEATURE_SPONSORS === "true", title: "Patrocinadores PyDay", diff --git a/src/components/RegistrationState.js b/src/components/RegistrationState.js index 3d2afca..32fd837 100644 --- a/src/components/RegistrationState.js +++ b/src/components/RegistrationState.js @@ -2,9 +2,10 @@ import Link from "next/link"; import cityData from "@/data/cities"; export default function RegistrationState({ cityId }) { - const citiesWithRegistration = Object.values(cityData) - .filter((city) => !!city.registrationLink) - .map((city) => ({ + // Filtramos solo ciudades con registro disponible y que NO estén agotadas + const citiesWithRegistration = Object.entries(cityData) + .filter(([_, city]) => city.registrationLink && city.registrationStatus !== "soldout") + .map(([_, city]) => ({ name: city.name, link: city.registrationLink, })); @@ -12,6 +13,15 @@ export default function RegistrationState({ cityId }) { const getContent = () => { if (cityId) { const city = cityData[cityId]; + + if (city.registrationStatus === "soldout") { + return { + title: "Cupos agotados", + message: `Los cupos para PyDay ${city.name} ya se han agotado.`, + links: [], // Sin links ni botones + }; + } + return { title: city.registrationLink ? "Registro disponible" : "Registro cerrado", message: city.registrationLink @@ -36,38 +46,38 @@ export default function RegistrationState({ cityId }) { const { title, message, links } = getContent(); - if (links.length === 0) return null; - + // Si no hay links, no mostramos botones, solo el texto return (

{title}

{message}

-
- {links.map((city, index) => ( - - {city.name} - - - - - ))} -
+ {links.length > 0 && ( +
+ {links.map((city, index) => ( + + {city.name} + + + + + ))} +
+ )}
); } - diff --git a/src/components/TalkCard.js b/src/components/TalkCard.js index 51bb31d..009118c 100644 --- a/src/components/TalkCard.js +++ b/src/components/TalkCard.js @@ -1,38 +1,180 @@ import Image from "next/image"; +import { + LuCoffee, LuPartyPopper, LuHandshake, LuMic, + LuWrench, LuMapPin, LuLinkedin +} from "react-icons/lu"; -export default function TalkCard({ talk }) { +export default function TalkCard({ talk, showRoom = false }) { + const { title, time, speaker, speakers, description, tags, type, room } = talk; + + // Normalizar speakers a un array + const normalizedSpeakers = speakers + ? speakers + : speaker + ? [speaker] + : []; + + // Mapa de estilos para todos los tipos de eventos + const typeStyles = { + recepcion: { + border: "border-l-green-400", + badge: { + label: "Recepción", + color: "bg-green-600/30 text-green-100", + icon: , + } + }, + break: { + border: "border-l-yellow-400", + badge: { + label: "Break", + color: "bg-yellow-500/30 text-yellow-100", + icon: , + } + }, + cierre: { + border: "border-l-red-400", + badge: { + label: "Cierre", + color: "bg-red-600/30 text-red-100", + icon: , + } + }, + charla: { + border: "border-l-blue-400", + badge: { + label: "Charla", + color: "bg-blue-500/30 text-blue-100", + icon: , + } + }, + taller: { + border: "border-l-orange-400", + badge: { + label: "Taller", + color: "bg-orange-500/30 text-orange-100", + icon: , + } + }, + }; + + const isGeneral = !normalizedSpeakers.length && + (type === 'recepcion' || type === 'break' || type === 'cierre'); + + const style = typeStyles[type] || typeStyles.charla; // Default a charla si no se reconoce + return ( -
-
-
-
- {talk.speaker.image && ( - {talk.speaker.name} +
+
+ {isGeneral ? ( +
+
+

{time}

+

{title}

+ {showRoom && room && ( +
+ + {room} +
+ )} +
+
+ {style.badge.icon} + {style.badge.label} +
+
+ ) : ( +
+ {/* Fila de tiempo y badge */} +
+

{time}

+
+ {style.badge.icon} + {style.badge.label} +
+
+ + {/* Título */} +

{title}

+ + {/* Speakers con imágenes */} + {normalizedSpeakers.length > 0 && ( +
+ {normalizedSpeakers.map((spkr, idx) => ( +
+ {/* Imagen optimizada para webp 320x320 */} +
+ {spkr.image && ( + {spkr.name} + )} +
+
+

{spkr.name}

+ + {/* Solo LinkedIn */} + {spkr.socials?.linkedin && ( + + + + + )} +
+
+ ))} +
+ )} + + {/* Sala */} + {showRoom && room && ( +
+ + {room} +
)}
-
-

{talk.time}

-

{talk.title}

-

{talk.speaker.name}

+ )} + + {/* Descripción */} + {description && ( +

+ {description} +

+ )} + + {/* Tags */} + {tags && tags.length > 0 && ( +
+ {tags.map((tag, index) => ( + + {tag} + + ))}
-
-

{talk.description}

-
- {talk.tags.map((tag, index) => ( - - {tag} - - ))} -
+ )}
); -} +} \ No newline at end of file diff --git a/src/data/cities.js b/src/data/cities.js index d1c8587..ed320f8 100644 --- a/src/data/cities.js +++ b/src/data/cities.js @@ -50,7 +50,7 @@ const cityData = { campusImage: "/images/campus/utfsm-campus.webp", }, registrationLink:"https://www.eventbrite.com/e/1366605807759", - talkProposalLink: "https://sessionize.com/pyday-valparaiso-2025/", + talkProposalLink: "", schedule: allTalks.filter((talk) => talk.city === "valparaiso"), }, santiago: { @@ -77,7 +77,8 @@ const cityData = { campusImage: "/images/campus/DuocUC__San_Joaquín.webp", }, registrationLink:"https://www.eventbrite.com/e/1366617793609", - talkProposalLink: "https://sessionize.com/pyday-santiago-2025/", + registrationStatus: "soldout", // <--- agregas esto solo si los cupos están agotados + talkProposalLink: "", schedule: allTalks.filter((talk) => talk.city === "santiago"), }, diff --git a/src/data/talks.js b/src/data/talks.js index 4cc7712..da13546 100644 --- a/src/data/talks.js +++ b/src/data/talks.js @@ -26,29 +26,494 @@ * - requirements: [String] (Solo talleres - Ej: ['Laptop', 'Python 3.11+ instalado']) * - language: 'es' (default) | 'en' */ - -//TODO: Simulación de datos - Estos vendrían de una base de datos o API -//FIXME:Actualizar con los datos de los oradores y las charlas. const allTalks = [ - // { - // id: 101, - // type: "charla", - // city: "valparaiso", - // title: "Keynote: El futuro de Python en América Latina", - // description: "Visión estratégica del crecimiento de Python en la región con casos de éxito regionales", - // time: "09:00 - 09:45", - // speaker: { - // name: "Roberto Gutiérrez", - // image: "/images/speakers/roberto-gutierrez.webp" - // }, - // category: "keynote", - // level: "intermedio", - // tags: ["Python", "Comunidad", "Educación"], - // resources: { - // slides: "https://slides.com/rgutierrez/keynote-pyday" - // } - // }, - + { + id: 1, + city: "santiago", + type: "recepcion", + title: "Bienvenida", + description: "Inicio de actividades y acreditación de participantes", + time: "13:00 - 14:00", + room: "Hall principal", + speaker: null, + }, + { + id: 2, + city: "santiago", + type: "charla", + title: "¿Sueñan los androides con gaviotas de plata? Python para explorar el humor en el Festival de Viña", + description: "Explora cómo el proyecto Datarisas usa Python, NLP y LLMs para analizar 3509 chistes de 128 rutinas del Festival de Viña (1960–2025). Una charla sobre cómo transcripción, segmentación y análisis automatizado revelan patrones y evolución del humor chileno, combinando storytelling y ciencia de datos para preservar la memoria cómica del país.", + time: "14:00 - 14:30", + room: "Aula Magna", + speaker: { + name: "Alonso Astroza", + image: "/images/speakers/Alonso_Astroza.webp", + socials: { + linkedin: "https://www.linkedin.com/in/aastrozacl/" + } + }, + category: "caso-de-exito", + level: "introductorio", + tags: ["Python", "NLP", "LLMs", "Data Science", "Cultura"], + }, + { + id: 3, + city: "santiago", + type: "charla", + title: "Visualizando mis 10K con Python: una mirada de datos al running personal", + description: "Charla práctica y personal sobre cómo usé Python, pandas y seaborn para analizar mis 10K en la Maratón de Santiago 2025: ritmos, tiempos por kilómetro, evolución en entrenamientos y comparación entre sesiones. Un ejemplo de cómo transformar datos crudos en información útil.", + time: "14:30 - 15:00", + room: "Aula Magna", + speaker: { + name: "Ingrid Solís Gonzalez", + image: "/images/speakers/Ingrid_Solis_Gonzalez.webp", + socials: { + linkedin: "https://www.linkedin.com/in/ingrid-solis-gonzalez/" + } + }, + category: "caso-de-exito", + level: "intermedio", + tags: ["Python", "Data Science", "Visualización", "Running"], + }, + { + id: 4, + city: "santiago", + type: "charla", + title: "Ingeniería de software en Python, aplicado al magnetismo", + description: "Hablaré de mi experiencia desarrollando y manteniendo librerías en Python para el estudio del magnetismo. Estos códigos abiertos y reproducibles han sido clave para publicar en revistas científicas, ampliando el acceso a la información y fomentando la ciencia abierta.", + time: "15:00 - 15:30", + room: "Aula Magna", + speaker: { + name: "David Cortes", + image: "/images/speakers/David_Cortes.webp", + socials: { + linkedin: "https://www.linkedin.com/in/davidcortesortuno/" + } + }, + category: "caso-de-exito", + level: "avanzado", + tags: ["Python", "Ingeniería de Software", "Ciencia Abierta", "Magnetismo"], + }, + { + id: 5, + city: "santiago", + type: "break", + title: "Coffee Break", + description: "Espacio para descansar, socializar y compartir ideas con otros asistentes.", + time: "15:30 - 16:00", + room: "Hall principal", + speaker: null, + }, + { + id: 6, + city: "santiago", + type: "charla", + title: "¿Cómo utilizar Agentes de IA? Su aplicación a web apps", + description: "Usar inteligencia artificial puede ser un misterio, especialmente controlar los outputs de un LLM. Herramientas como PyDantic AI nos permiten manejar estas cajas negras y controlar mejor su uso práctico. En esta charla revisaremos un proyecto que usa agentes de IA aplicado a una web app sobre flora nativa chilena.", + time: "16:00 - 16:30", + room: "Aula Magna", + speaker: { + name: "Lía Da Silva", + image: "/images/speakers/Lia_Da_Silva.webp", + socials: { + linkedin: "https://www.linkedin.com/in/lia-dsr/" + } + }, + category: "tecnica", + level: "introductorio", + tags: ["Python", "IA", "Agentes", "Web Apps"], + }, + { + id: 7, + city: "santiago", + type: "charla", + title: "Construyendo un motor de juegos 3D", + description: "Aquí cuento qué es un motor de juegos, mi experiencia aprendiendo sobre eso, y cómo he construido el mío en Python con pyglet", + time: "16:30 - 17:00", + room: "Aula Magna", + speaker: { + name: "Jesús Henriquez", + image: "/images/speakers/Jesus_Henriquez.webp", + socials: { + linkedin: "https://www.linkedin.com/in/hernaldo-henriquez" + } + }, + category: "tecnica", + level: "avanzado", + tags: ["Python", "Videojuegos", "Desarrollo", "3D", "Pyglet"], + }, + { + id: 8, + city: "santiago", + type: "charla", + title: "De las palabras al Algoritmo: Comprendiendo el Lenguaje Natural desde la perspectiva de la IA", + description: "Exploraremos cómo las máquinas procesan el lenguaje humano, enfrentando desafíos como la ambigüedad semántica, el contexto cultural y la diversidad lingüística. Hablaremos sobre tecnologías multimodales, modelos de lenguaje y cómo están dando forma a un lenguaje intermedio que facilita la interacción entre humanos y sistemas digitales.", + time: "17:00 - 17:30", + room: "Aula Magna", + speaker: { + name: "Alison Orellana Rios", + image: "/images/speakers/Alison_Orellana_Rios.webp", + socials: { + linkedin: "https://www.linkedin.com/in/alison-or/" + } + }, + category: "tecnica", + level: "intermedio", + tags: ["Python", "IA", "Machine Learning", "LLM","NLP"], + }, + { + id: 9, + city: "santiago", + type: "break", + title: "Coffee Break", + description: "Segundo descanso del día para recargar energías antes del cierre del evento.", + time: "17:30 - 18:00", + room: "Hall principal", + speaker: null, + }, + { + id: 10, + city: "santiago", + type: "charla", + title: "Búsqueda Semántica + Descubrimiento de Tópicos", + description: "Se presentarán flujos de trabajo para extracción de información desde texto en lenguaje natural, usando técnicas clásicas y modelos LLM. Exploraremos summarization y topic modeling desde ambas perspectivas.", + time: "18:00 - 18:30", + room: "Aula Magna", + speakers: [ + { + name: "Pablo Jiménez", + image: "/images/speakers/Pablo_Jimenez.webp", + socials: { + linkedin: "" + } + }, + { + name: "Dylan Oteiza", + image: "/images/speakers/Dylan_Oteiza.webp", + socials: { + linkedin: "" + } + } + ], + category: "tecnica", + level: "intermedio", + tags: ["Python", "NLP","LLM", "Topic Modeling", "Summarization"], + }, + { + id: 11, + city: "santiago", + type: "charla", + title: "Rust + Python = Poder Ilimitado: Introducción a PyO3", + description: "¿Velocidad de Rust con la flexibilidad de Python? En esta charla veremos cómo unir ambos mundos con PyO3, creando módulos Rust accesibles desde Python. Compartiré mi experiencia optimizando tareas críticas y los aprendizajes de este proceso.", + time: "18:30 - 19:00", + room: "Aula Magna", + speaker: { + name: "Daniel Hernandez", + image: "/images/speakers/Daniel_Hernandez.webp", + socials: { + linkedin: "https://www.linkedin.com/in/dhernandezmen/" + } + }, + category: "tecnica", + level: "intermedio", + tags: ["Python", "Rust", "Optimización", "Desarrollo"], + }, + { + id: 12, + city: "santiago", + type: "cierre", + title: "Palabras finales Duoc UC + Comunidades Amigas Python Chile", + description: "Cierre oficial del evento con agradecimientos y palabras de las comunidades organizadoras.", + time: "19:00", + room: "Aula Magna", + speaker: null, + }, + { + id: 13, + city: "santiago", + type: "taller", + title: "Taller: Análisis y visualización de datos básico con Python", + description: "En este taller aprenderemos los fundamentos de Python, uno de los lenguajes más usados y versátiles. Usaremos Google Colab como entorno, Pandas para manipular y analizar datos, y Altair para crear visualizaciones gráficas, todo con un enfoque en la música que nos conecta.", + time: "14:00 - 14:45", + room: "Sala de Computación", + speaker: { + name: "Francisca Beatriz Medina Concha", + image: "/images/speakers/Francisca_Beatriz_Medina_Concha.webp", + socials: { + linkedin: "https://www.linkedin.com/in/fbmedina-cl/" + } + }, + category: "tecnica", + level: "introductorio", + tags: ["Python", "Visualización de datos", "Educación"], + duration: 45, + requirements: ["Laptop", "Cuenta de Google para usar Colab"], + }, + { + id: 14, + city: "santiago", + type: "taller", + title: "Taller: Python for Lean Accounting", + description: "Usando Python para agilizar procesos contables. Un contador sin tecnología puede depender de software costoso o procesos manuales lentos. Con Python e IA es posible crear software liviano que acelera la contabilidad y mejora la entrega de resultados.", + time: "14:45 - 15:30", + room: "Sala de Computación", + speaker: { + name: "Francisco Ponce", + image: "/images/speakers/Francisco_Ponce.webp", + socials: { + linkedin: "https://www.linkedin.com/in/francisco-ponce-miranda/" + } + }, + category: "tecnica", + level: "introductorio", + tags: ["Python", "Fintech", "Automatización"], + duration: 45, + requirements: ["Laptop", "Python 3.11+ instalado"], + }, + { + id: 15, + city: "valparaiso", + type: "recepcion", + title: "Registro", + description: "Recepción y acreditación de participantes", + time: "10:00 - 10:15", + room: "Hall principal", + speaker: null + }, + { + id: 16, + city: "valparaiso", + type: "recepcion", + title: "Bienvenida", + description: "Inicio de actividades y palabras de apertura", + time: "10:15 - 10:30", + room: "Salón A101", + speaker: null + }, + { + id: 17, + city: "valparaiso", + type: "charla", + title: "Educación Abierta y Comunidad: Democratizando el Aprendizaje en Python", + description: "Exploración de cómo la educación abierta y la comunidad pueden democratizar el aprendizaje en Python, incluyendo una demo en vivo con Quarto, GitHub y el rol de las comunidades open source con énfasis en Python Chile.", + time: "10:30 - 11:00", + room: "Salón A101", + speakers: [ + { + name: "Francisco Alfaro", + image: "/images/speakers/Francisco_Alfaro.webp", + socials: { + linkedin: "https://www.linkedin.com/in/faam/" + } + }, + { + name: "Valeska Canales", + image: "/images/speakers/Valeska_Canales.webp", + socials: { + linkedin: "https://www.linkedin.com/in/vcanalesp/" + } + } + ], + category: "comunidad", + level: "introductorio", + tags: ["Python", "Educación", "Open Source", "Comunidad"] + }, + { + id: 18, + city: "valparaiso", + type: "break", + title: "Coffee Break", + description: "Espacio para descansar, socializar y compartir ideas con otros asistentes.", + time: "11:00 - 11:30", + room: "Hall principal", + speaker: null + }, + { + id: 19, + city: "valparaiso", + type: "charla", + title: "Ciudades Pendientes: datos para la planificación urbana", + description: "Presentamos una plataforma con Django y pydeck para clasificar y visualizar flujos de viajes en bicicleta, apoyando a organizaciones sociales en propuestas de movilidad urbana a escala humana. ¡Tecnología para mejorar la calidad de vida!", + time: "11:30 - 12:00", + room: "Salón A101", + speaker: { + name: "Francisco Vergara", + image: "/images/speakers/Francisco_Vergara_Vallejos.webp", + socials: { + linkedin: "https://www.linkedin.com/in/franciscovergara/" + } + }, + category: "caso-de-exito", + level: "introductorio", + tags: ["Python", "Data Science", "Urban Mobility", "Social Impact"] + }, + { + id: 20, + city: "valparaiso", + type: "charla", + title: "Clasificación del Impacto Hidrometeorológico de Ríos Atmosféricos mediante Aprendizaje Automático", + description: "Aplicación de aprendizaje automático para clasificar el impacto hidrometeorológico de ríos atmosféricos, usando datos del reanálisis CFSR y técnicas de IA explicable para mejorar el pronóstico y prevención de eventos extremos.", + time: "12:00 - 12:30", + room: "Salón A101", + speakers: [ + { + name: "Pía Aedo", + image: "/images/speakers/Pia_Aedo.webp", + socials: { + linkedin: "" + } + }, + { + name: "Alexis Alva", + image: "/images/speakers/Alexis_Alva_Nunez.webp", + socials: { + linkedin: "https://www.linkedin.com/in/alexis-alva-4993b2141/" + } + } + ], + category: "tecnica", + level: "intermedio", + tags: ["Python", "Machine Learning", "IA", "Clima"] + }, + { + id: 21, + city: "valparaiso", + type: "break", + title: "Pausa Almuerzo", + description: "Tiempo libre para almorzar y compartir con otros asistentes.", + time: "12:30 - 14:00", + room: "Hall principal", + speaker: null + }, + { + id: 22, + city: "valparaiso", + type: "charla", + title: "Potenciando la IA con Python: Descubre la Magia de MCP y N8N", + description: "Exploramos cómo integrar Python con MCP (Model Context Protocol) de Anthropic y la plataforma open source n8n para crear soluciones de IA personalizadas y automatizar flujos de trabajo, optimizando procesos y maximizando la eficiencia.", + time: "14:00 - 14:30", + room: "Salón A101", + speaker: { + name: "Gabriel Grobier", + image: "/images/speakers/Gabriel_Grobier_Romo.webp", + socials: { + linkedin: "https://www.linkedin.com/in/gabrielgrobier/" + } + }, + category: "tecnica", + level: "intermedio", + tags: ["Python", "IA", "Automatización", "Open Source", "MCP", "n8n"] + }, + { + id: 23, + city: "valparaiso", + type: "charla", + title: "Del caos al orden: cómo usamos Python para sincronizar el ecommerce y sobrevivir el camino", + description: "Cómo creamos Omaflow con Python: de planillas caóticas a una plataforma que conecta ecommerce con couriers y automatiza miles de órdenes. Una historia real de errores, aciertos y creatividad para resolver problemas con código.", + time: "14:30 - 15:00", + room: "Salón A101", + speaker: { + name: "Marcelo Cavieres", + image: "/images/speakers/Marcelo_Cavieres.webp", + socials: { + linkedin: "" + } + }, + category: "caso-de-exito", + level: "intermedio", + tags: ["Python", "Emprendimiento", "Automatización", "Ecommerce", "DevOps"] + }, + { + id: 24, + city: "valparaiso", + type: "charla", + title: "Robots comandado vía Web usando Raspberry Pi Pico W y 2W", + description: "Diseño de un robot de suelo programado en MicroPython y controlado vía WiFi con Raspberry Pi Pico W. Se mostrará el uso de impresión 3D y tecnologías abiertas, ideal para entusiastas y principiantes.", + time: "15:00 - 15:30", + room: "Salón A101", + speaker: { + name: "Flavio Espeche", + image: "/images/speakers/Flavio_Fabian_Espeche_Nieva.webp", + socials: { + linkedin: "https://www.linkedin.com/in/flavioespechenieva/" + } + }, + category: "tecnica", + level: "intermedio", + tags: ["Python", "MicroPython", "Robótica", "IoT", "Raspberry Pi", "Impresión 3D"] + }, + { + id: 25, + city: "valparaiso", + type: "charla", + title: "Charlas Relámpago", + description: "Sesión de charlas cortas de 5 minutos cada una sobre diversos temas.", + time: "15:30 - 16:00", + room: "Salón A101", + speaker: null + }, + { + id: 26, + city: "valparaiso", + type: "cierre", + title: "Cierre", + description: "Palabras finales y agradecimientos por parte de los organizadores.", + time: "16:00 - 16:15", + room: "Salón A101", + speaker: null + }, + { + id: 27, + city: "valparaiso", + type: "break", + title: "Coffee Break", + description: "Espacio para compartir y despedirse de los asistentes.", + time: "16:15 - 17:00", + room: "Hall principal", + speaker: null + }, + { + id: 28, + city: "valparaiso", + type: "taller", + title: "LLM + LLMs Seguros", + description: "Tipos de ataques que pueden ocurrir en ambientes que utilizan agentes (como ChatGPT) y algunas formas de protección ofrecidas en el paquete agentsdk.", + time: "11:30 - 12:30", + room: "Salón A102", + speaker: { + name: "Ariane Carvajal", + image: "/images/speakers/Ariane_Carvajal.webp", + socials: { + linkedin: "https://www.linkedin.com/in/ariane-carvajal/" + } + }, + category: "tecnica", + level: "intermedio", + tags: ["Python", "IA Generativa", "Seguridad", "LLMs", "Agents"], + duration: 60, + requirements: ["Laptop", "Python 3.11+ instalado"] + }, + { + id: 29, + city: "valparaiso", + type: "taller", + title: "Streamlit, Axidraw y aprendiendo a aprender", + description: "Taller práctico sobre Streamlit, Axidraw e intentos de arte con Python.", + time: "14:00 - 15:00", + room: "Salón A102", + speaker: { + name: "Sebastian Flores", + image: "/images/speakers/Sebastian_flores.webp", + socials: { + linkedin: "https://www.linkedin.com/in/sebastiandres" + } + }, + category: "proyecto-practico", + level: "introductorio", + tags: ["Python", "Web", "Educación"], + duration: 60, + requirements: ["Laptop", "Python 3.11+ instalado"] + } ]; export default allTalks;