diff --git a/img/Appsilon_logo.svg b/img/Appsilon_logo.svg
new file mode 100644
index 0000000..b31f18f
--- /dev/null
+++ b/img/Appsilon_logo.svg
@@ -0,0 +1,41 @@
+
+
+
diff --git a/img/appsilon-web.png b/img/appsilon-web.png
new file mode 100644
index 0000000..2a2ec2c
Binary files /dev/null and b/img/appsilon-web.png differ
diff --git a/img/diagrama1.png b/img/diagrama1.png
new file mode 100644
index 0000000..9df9f49
Binary files /dev/null and b/img/diagrama1.png differ
diff --git a/img/profiling-01.png b/img/profiling-01.png
new file mode 100644
index 0000000..8b945e9
Binary files /dev/null and b/img/profiling-01.png differ
diff --git a/img/profiling-02.png b/img/profiling-02.png
new file mode 100644
index 0000000..7ae5b91
Binary files /dev/null and b/img/profiling-02.png differ
diff --git a/img/profiling-03.png b/img/profiling-03.png
new file mode 100644
index 0000000..fe37e07
Binary files /dev/null and b/img/profiling-03.png differ
diff --git a/img/profiling-04.png b/img/profiling-04.png
new file mode 100644
index 0000000..00fe3bd
Binary files /dev/null and b/img/profiling-04.png differ
diff --git a/index.qmd b/index.qmd
index 17f7c86..45a09e2 100644
--- a/index.qmd
+++ b/index.qmd
@@ -7,42 +7,49 @@ format:
theme: default
transition: slide
slide-number: true
- chalkboard: true
+ logo: img/Appsilon_logo.svg
+ footer: "LatinR: 2024-11-18"
+mermaid:
+ theme: default
---
-## Requisitos del Taller {.smaller}
+## Intro
-- R 4.1.0 o mayor
-- RStudio instalado
-- 8GB RAM (deseable)
-- Internet estable (deseable)
-- Git instalado (deseable)
-- Alternativa: cuenta en posit.cloud
+- Quien soy
-## Estructura del Taller (3 horas) {.smaller}
+## Appsilon
+
+![](img/appsilon-web.png)
+
+
+
+## We are hiring!
+
+- [R shiny developer](https://jobs.lever.co/appsilon/6e6cea0f-4ec3-439a-8456-d5e31e51c05b?lever-origin=ap%5B%E2%80%A6%5Dloper)
+- [R developer with life science](https://jobs.lever.co/appsilon/d5c698a5-9f93-4fb4-a22b-b4abaf77de5d?lever-origin=applied&lever-source%5B%5D=CAREERS)
+- [Project Manager (US time zone)](https://jobs.lever.co/appsilon/e8594bfe-2c9a-4504-b978-ff3242bc9c73?lever-origin=applied&lever-source%5B%5D=careers%20page?utm_medium%3Djob-boards)
+
+Para ver más posiciones:
+
+## Estructura del Taller (3 horas)
- Introducción
-- Ciclo de optimización
-- Ejercicio 1 - Benchmarking
-- Profiling
-- Ejercicio 2 - Profiling
-- Optimización - Data
-- Ejercicio 3 - Data
-- Optimización - Shiny
-- Ejercicio 4 - Shiny
-- Optimización - Async
-- Ejercicio 5 - Async
-- Benckmarking avanzado
+- Ciclo de optimización: Ejercicio 1 - Benchmarking
+- Profiling: Ejercicio 2
+- Optimización - Data: Ejercicio 3
+- Optimización - Shiny: Ejercicio 4
+- Optimización - Async: Ejercicio 5
+- Temas avanzados
- Preguntas
## Ciclo de Optimización:
-- Benchmarking - diagnóstico inicial
-- Profiling - identificación de cuellos de botella
-- Estimación - recursos necesarios
-- Optimización - implementación de mejoras
+- Benchmarking: ¿Performa como esperamos?
+- Profiling: ¿Dónde están los cuellos de botella?
+- Estimación/Recomendación: ¿Qué puedo hacer?
+- Optimización: Hagámoslo
-### Tipos de benchmarking
+## Tipos de benchmarking
- Manual
- Avanzado (shinyloadtest)
@@ -51,33 +58,96 @@ format:
Prueba la app y anota cuánto tiempo te toma...
-## Profiling
+# Profiling
## Profiling - Herramientas en R
El profiling es una técnica utilizada para identificar cuellos de botella en el rendimiento de tu código:
-1. **profvis**: Es una herramienta interactiva que proporciona una visualización detallada del tiempo de ejecución de tu código.
+## `{profvis}`
+
+Es una herramienta interactiva que proporciona una visualización detallada del tiempo de ejecución de tu código.
- Instalación:
- ```r
- install.packages("profvis")
- ```
+
+```r
+install.packages("profvis")
+```
+
- Uso básico:
- ```r
- library(profvis)
- profvis({
- # Código a perfilar
- })
- ```
-2. **shiny.tictoc**: Una herramienta que usa Javascript para calcular el tiempo que toman las acciones en la app, desde el punto de vista del navegador.
-## Ejercicio 2 - Profiling
+```r
+library(profvis)
+profvis({
+# Código a perfilar
+})
+```
+
+## shiny.tictoc
+
+Una herramienta que usa Javascript para calcular el tiempo que toman las acciones en la app, desde el punto de vista del navegador.
+
+Es super fácil de añadir a una app.
+
+```r
+tags$script(
+ src = "https://cdn.jsdelivr.net/gh/Appsilon/shiny.tictoc@v0.2.0/shiny-tic-toc.min.js"
+)
+```
+
+---
+
+Ejecutar cualquiera de estas operaciones en la consola de Javascript.
+
+```js
+// Print out all measurements
+showAllMeasurements()
+
+// To download all measurements as a CSV file
+exportMeasurements()
+
+// To print out summarised measurements (slowest rendering output, slowest server computation)
+showSummarisedMeasurements()
-Realiza el profiling de la app para las siguientes acciones:
+// To export an html file that visualizes measurements on a timeline
+await exportHtmlReport()
+```
+
+Muchos navegadores cuentan con herramientas de desarrollador donde puedes encontrar una mientras tu app está corriendo.
+
+## Usando profvis
+
+Ubicar la herramienta en Rstudio
+
+![](img/profiling-01.png)
+
+---
+
+La consola de R mostrará el botón "Stop profiling". Esto significa que el profiler está activado.
+
+![](img/profiling-02.png)
+
+Corre tu shiny app e interactúa con ella. Luego, puedes detener la app y el profiler.
+
+---
+
+El panel de edición de Rstudio te mostrará una nueva vista.
+
+![](img/profiling-03.png)
-- ...
-- ...
+La parte superior hace profiling de cada línea de código, la parte inferior muestra un *FlameGraph*, que indica el tiempo requerido por cada operación.
+
+---
+
+También puede accederse a la pestaña "Data".
+
+![](img/profiling-04.png)
+
+Esta indica cuánto tiempo y memoria se ha requerido por cada operación. Nos da un resumen de la medición.
+
+## Ejercicio 2 - Profiling
+
+Interpreta los resultados
¿Cuáles son los puntos más críticos?
@@ -90,13 +160,13 @@ Realiza el profiling de la app para las siguientes acciones:
¡Puedes combinar todo!
-### Cargar datos más rápido
+## Cargar datos más rápido
- data.table::fread()
- vroom::vroom()
- readr::read_csv()
-### Ejemplo
+## Ejemplo
NO ejecutar durante el workshop porque toma tiempo en correr
@@ -118,14 +188,14 @@ suppressMessages(
```
-### Formatos de datos eficientes:
+## Formatos de datos eficientes:
- Parquet (via {arrow})
- Feather (compatibilidad con Python)
- fst
- RDS (nativo de R)
-### Ejemplo
+## Ejemplo
NO ejecutar durante el workshop porque toma tiempo en correr
@@ -146,36 +216,42 @@ suppressMessages(
#> rds 558.5518 644.32460 782.37898 695.07300 860.85075 1379.519 100
```
-### Pre-procesar cálculos
+## Pre-procesar cálculos
-- Filtrado previo: Realiza el filtrado de datos antes de realizar cálculos complejos para reducir el tamaño del conjunto de datos.
-- Agregación previa: Agrega los datos en una etapa temprana para reducir la cantidad de datos que necesitan ser procesados.
-- Transformaciones previas: Realiza transformaciones de datos antes de usarlos en la aplicación para evitar cálculos repetitivos.
-- **Uso de índices**: Crea índices en tus datos para acelerar las operaciones de búsqueda y filtrado.
+- Filtrado previo: Reduce el tamaño del conjunto de datos.
+- Transformación o agregación previa: Reduce el procesado en tiempo real.
+- Uso de índices: Acelerar las operaciones de búsqueda y filtrado.
-Personalmente, mi estrategia favorita. Difícil de usar si se requiere calcular en vivo, real-time (stock exchange, data en streaming). Es, en esencia, *caching*.
+Personalmente, mi estrategia favorita. Difícil de usar si se requiere calcular en vivo, real-time (stock exchange, streaming data). Es, en esencia, *caching*.
-### Bases de Datos
+## Bases de Datos
- **Escalabilidad**: Las bases de datos pueden manejar grandes volúmenes de datos de manera eficiente.
- **Consultas Rápidas**: Permiten realizar consultas complejas de manera rápida.
- **Persistencia**: Los datos se almacenan de manera persistente, lo que permite su recuperación en cualquier momento.
-- Algunos ejemplos notables son SQLite, MySQL, PostgreSQL, DuckDB.
+
+Algunos ejemplos notables son SQLite, MySQL, PostgreSQL, DuckDB.
## Ejercicio 3 - Data
Implementa una estrategia de optimización
-## Optimización - Shiny
+# Optimización - Shiny
+
+## Cuando una app arranca
+
+![](img/diagrama1.png)
+
+---
Del lado de shiny, optimizar consiste básicamente en hacer que la app (en realidad, el procesador) haga el menor trabajo posible.
-### Controlar reactividad
+## Controlar reactividad
1. bindEvent() - observeEvent() / eventReactive()
-### Estrategias de Caché
+## Estrategias de Caché
1. bindCache()
@@ -183,7 +259,7 @@ Del lado de shiny, optimizar consiste básicamente en hacer que la app (en reali
- Nivel aplicación: `cache = "app"`
- Nivel sesión: `cache = "session"`
-### Comunicación servidor / navegador
+## Comunicación servidor / navegador
- Reducir en tamaño y frecuencia lo que se manda al *cliente*.
@@ -192,9 +268,9 @@ Del lado de shiny, optimizar consiste básicamente en hacer que la app (en reali
-## Optimización - Async
+# Optimización - Async
-### Programación Asíncrona {.smaller}
+## Programación Asíncrona {.smaller}
- Casos de uso:
- Operaciones I/O (bases de datos, APIs)
@@ -206,4 +282,4 @@ Del lado de shiny, optimizar consiste básicamente en hacer que la app (en reali
## Ejercicio 5 - Async
-## Preguntas
+# Preguntas