├── .github └── workflows │ └── ci.yml ├── 01-data_management_in_bash └── 2-utilities │ ├── README.md │ ├── _input.log │ ├── _output.json │ ├── execute.sh │ └── test.sh ├── 02-jq ├── 1-map_json │ ├── README.md │ ├── _input.json │ ├── _output.json │ ├── execute.sh │ └── test.sh ├── 2-combine_filter_json │ ├── README.md │ ├── _input.json │ ├── _output.json │ ├── execute.sh │ └── test.sh └── 3-aggregate_sort_json │ ├── README.md │ ├── _input.json │ ├── _output.json │ ├── execute.sh │ └── test.sh ├── 03-jq_challenge ├── 1-problem │ ├── README.md │ └── _input.json └── 2-solution │ ├── README.md │ ├── _input.json │ ├── _output.json │ ├── execute.sh │ └── test.sh ├── 04-yaml_and_xml ├── 1-handle_yamls │ ├── README.md │ ├── _input │ │ ├── app │ │ │ └── controllers │ │ │ │ └── services.yaml │ │ └── src │ │ │ └── mooc │ │ │ ├── comments │ │ │ └── infrastructure │ │ │ │ └── services.yaml │ │ │ └── videos │ │ │ └── infrastructure │ │ │ └── services.yaml │ └── execute.sh └── 2-handle_xmls │ ├── README.md │ ├── _input.orm.yaml │ ├── _output.orm.xml │ └── execute.sh ├── 05-csv ├── 1-csv_with_coreutils │ ├── README.md │ ├── _input.csv │ ├── _output.csv │ ├── codely_example │ │ ├── 1-importer.sh │ │ ├── 2-importer.sh │ │ └── _input.csv │ └── execute.sh └── 2-csv_with_yq │ ├── README.md │ ├── _input.csv │ ├── _output.csv │ └── execute.sh ├── 06-csv_challenge ├── 1-problem │ ├── README.md │ ├── _input.csv │ └── execute.sh └── 2-solution │ ├── README.md │ ├── _input.csv │ ├── categories.sh │ ├── output │ ├── categories.csv │ ├── products.json │ └── sellers.csv │ ├── products.sh │ └── sellers.sh ├── 07-sql ├── 1-handle_sqls │ ├── README.md │ ├── _input.sql │ ├── execute.sh │ └── generate_big_input.sh └── 2-handle_live_sqls │ ├── Dockerfile │ ├── README.md │ ├── docker-compose.yaml │ ├── execute.sh │ ├── random_course_creator │ ├── courses_words.txt │ ├── creator.sh │ └── number_of_inserts_per_second │ └── sql │ └── 01-courses.sql ├── 08-sql_challenge ├── 1-problem │ ├── README.md │ ├── docker-compose.yaml │ ├── execute.sh │ └── sql │ │ ├── 01-courses.sql │ │ └── 02-inserts.sql ├── 2-solution │ ├── README.md │ ├── docker-compose.yaml │ ├── execute.sh │ ├── execute_optimized.sh │ └── sql │ │ ├── 01-courses.sql │ │ └── 02-inserts.sql └── 3-domain_events_legacy │ ├── Dockerfile │ ├── docker-compose.yaml │ ├── execute.sh │ ├── random_course_creator │ ├── courses_words.txt │ ├── creator.sh │ └── number_of_inserts_per_second │ └── sql │ └── 01-courses.sql ├── 09-conclusions └── 1-interesting_tooling │ ├── 01-youplot.sh │ ├── 02-awk.sh │ ├── 03-yq.sh │ ├── 04-miller.sh │ ├── 05-combine.sh │ ├── _input.csv │ └── _simple_input.csv ├── README.md └── _shared ├── compare_json.sh └── compare_text.sh /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | pull_request: 8 | 9 | jobs: 10 | test: 11 | runs-on: ubuntu-latest 12 | name: ✅ Tests 13 | steps: 14 | - uses: actions/checkout@v2 15 | 16 | - name: ⬇️ Install dependencies 17 | run: sudo apt install -y jq 18 | 19 | - name: ✅ Test 20 | run: (cd 02-jq/1-map_json; bash test.sh) && 21 | (cd 02-jq/2-combine_filter_json; bash test.sh) && 22 | (cd 02-jq/3-aggregate_sort_json; bash test.sh) && 23 | (cd 03-jq_challenge/2-solution; bash test.sh) 24 | -------------------------------------------------------------------------------- /01-data_management_in_bash/2-utilities/README.md: -------------------------------------------------------------------------------- 1 | # 🔥 Challenge 2 | 3 | * Filter the `_input.log` lines only keeping the ones from June 28th and 29th 4 | * Replace the fields separator by tabs 5 | * Format the date to `29/Jun/2023 12:53` 6 | * Modify the HTTP verb showing it in lowecase 7 | * Show the URL path in uppercase 8 | * Sort descendently by date 9 | -------------------------------------------------------------------------------- /01-data_management_in_bash/2-utilities/_output.json: -------------------------------------------------------------------------------- 1 | 29/Jun/2023 12:53 get /YYBJEJE.GIF 2 | 29/Jun/2023 09:41 get /ZYB.GIF 3 | 28/Jun/2023 20:23 get /ZYBSUBCODELY.GIF 4 | 28/Jun/2023 09:41 get /ZYB.GIF 5 | 28/Jun/2023 09:41 get /ZYB.GIF 6 | 28/Jun/2023 09:41 get /YYB.GIF 7 | 28/Jun/2023 09:41 get /YYB.GIF 8 | 28/Jun/2023 09:41 get /YYB.GIF 9 | 28/Jun/2023 09:41 get /GO.JPG 10 | 28/Jun/2023 09:41 get /GO.JPG 11 | -------------------------------------------------------------------------------- /01-data_management_in_bash/2-utilities/execute.sh: -------------------------------------------------------------------------------- 1 | grep -E "(28|29)/Jun" _input.log | 2 | awk -F'[ "]' '{print substr($4, 1, 18) "\t" tolower($7) "\t" toupper($8)}' | 3 | sed 's/\[//g' | 4 | sed 's/:/ /1' | 5 | sort --reverse 6 | -------------------------------------------------------------------------------- /01-data_management_in_bash/2-utilities/test.sh: -------------------------------------------------------------------------------- 1 | source "../../_shared/compare_text.sh" 2 | 3 | it_should_output_the_expected_text "$PWD/execute.sh" "$PWD/_output.json" 4 | -------------------------------------------------------------------------------- /02-jq/1-map_json/README.md: -------------------------------------------------------------------------------- 1 | # 🔥 Challenge 2 | 3 | 1. Filter out the `_input.json` JSON items properties only keeping the `title` and `emoji` ones 4 | 2. Rename the `title` property to `titulo` 5 | -------------------------------------------------------------------------------- /02-jq/1-map_json/_input.json: -------------------------------------------------------------------------------- 1 | [{"title":"React de 0 aplicando buenas prácticas","emoji":"🎛️","summary":"Introdúcete en React desde 0 creando tu developer dashboard personal dónde podrás consultar las métricas de tus repositorios favoritos.","authors":["isma-navarro","javier-ferrer"],"releaseDate":{"start":"2022-11-17","end":"2022-12-29"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/react-desde-0.png","slug":"react-desde-0","color":"yellow","url":"https://pro.codely.com/library/react-de-0-aplicando-buenas-practicas-192069/about/"},{"title":"API HTTP en Kotlin aplicando Arquitectura Hexagonal","emoji":"💎","summary":"Aprende a desarrollar tu primera API HTTP en Kotlin aplicando algunos de los fundamentos de la Arquitectura Hexagonal.","authors":["isa-garrido","rafa-gomez"],"releaseDate":{"start":"2022-10-27","end":"2022-11-24"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/api-kotlin-hexagonal.png","slug":"api-http-en-kotlin-aplicando-arquitectura-hexagonal","color":"green","url":"https://pro.codely.com/library/api-http-en-kotlin-aplicando-arquitectura-hexagonal-189116/456277/about/"},{"title":"DDD en TypeScript: Comunicación entre servicios y aplicaciones","emoji":"🛰","summary":"Comunica servicios y aplicaciones usando Domain-Driven Design (DDD) y TypeScript y consigue así que el software y los equipos escalen de forma progresiva.","authors":["fernando-vilas","ruben-salado","dani-santamaria"],"releaseDate":{"start":"2022-10-06","end":"2022-11-03"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/ddd-en-typescript-eda.png","slug":"ddd-en-typescript-comunicacion-entre-servicios-y-aplicaciones","color":"pink","url":"https://pro.codely.com/library/ddd-en-typescript-comunicacion-entre-servicios-y-aplicaciones-189024/449177/about/"},{"title":"Linting en JavaScript y TypeScript","emoji":"🔦","summary":"Aprende a sacarle todo el partido a ESLint para llevar tu código al siguiente nivel.","authors":["nuria-soriano","rafa-gomez"],"releaseDate":{"start":"2022-09-09","end":"2022-09-22"},"tags":[],"categories":["tooling","frontend","backend"],"sticker":"/img/cursos/linting-js-ts.png","slug":"linting-en-javascript-y-typescript","color":"yellow","url":"https://pro.codely.com/library/linting-en-javascript-y-typescript-188432/446893/about/"},{"title":"Desarrolla plugins de Figma con TypeScript","emoji":"🪆","summary":"Ves un paso más allá y desarrolla plugins mantenibles, escalables y testables para figma con TypeScript. Diseño y desarrollo se dan la mano.","authors":["carmen-ansio","javier-ferrer"],"releaseDate":{"start":"2022-08-31","end":"2022-09-30"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/plugins-figma.png","slug":"desarrolla-plugins-de-figma-mantenibles-con-typescript","color":"violet","url":"https://pro.codely.com/library/desarrolla-plugins-de-figma-mantenibles-con-typescript-187373/about/"},{"title":"Patrones de Diseño de Comportamiento","emoji":"🐝","summary":"Aprende las implicaciones a nivel de SOLID y de mantenimiento de los Patrones de Diseño de Comportamiento.","authors":["dani-santamaria","rafa-gomez"],"releaseDate":{"start":"2022-07-07","end":"2022-08-03"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/patrones-comportamiento.png","slug":"patrones-de-comportamiento","color":"green","url":"https://pro.codely.com/library/patrones-de-diseno-de-comportamiento-185034/about/"},{"title":"TypeScript Avanzado: Más alla de any","emoji":"🚜","summary":"En este curso vamos a sentar las bases de TypeScript avanzado con el objetivo de ir estableciendo los conocimientos básicos para futuros cursos en los que profundizaremos más en otros aspectos de esta herramienta de desarrollo.","authors":["isma-navarro","javier-ferrer"],"releaseDate":{"start":"2022-05-25","end":"2022-06-08"},"tags":[],"categories":["frontend","backend"],"sticker":"/img/cursos/typescript-avanzado.png","slug":"typescript-avanzando","color":"pink","url":"https://pro.codely.com/library/typescript-avanzado-mas-alla-de-any-182513/about/"},{"title":"Maquetando la web de Codely desde 0","emoji":"🍍","summary":"Llevaremos un diseño en Figma a una web en producción, con un design system escalable y teniendo en cuenta performance, SEO, y accesibilidad.","authors":["nuria-soriano","rafa-gomez"],"releaseDate":{"start":"2022-05-18","end":"2022-06-15"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/maquetando-la-web-de-codely.png","slug":"maquetando-la-web-de-codely-desde-0","color":"yellow","url":"https://pro.codely.com/library/maquetando-la-web-de-codely-desde-0-181753/"},{"title":"Gestión de logs con Loki y Grafana","emoji":"🏵️","summary":"Aprende a gestionar tus logs con Grafana y Loki, las buenas prácticas y cómo se diferencia del stack de ELKi","authors":["joan-lopez-de-la-franca","rafa-gomez"],"releaseDate":{"start":"2022-03-24","end":"2022-04-20"},"tags":[],"categories":["backend","devops"],"sticker":"/img/cursos/gestion-de-logs-con-loki-y-grafana.png","slug":"gestion-de-logs-con-loki-y-grafana","color":"pink","url":"https://pro.codely.com/library/gestion-de-logs-con-loki-y-grafana-179996/407529/about/"},{"title":"Entrevistas sobre eXtreme Programming","emoji":"🎤","summary":"Contenido adicional del curso de eXtreme Programming","authors":["nino-dafonte"],"releaseDate":{"start":"2022-04-01","end":"2022-04-01"},"tags":[],"categories":["metodologias-buenas-practicas"],"sticker":"/img/cursos/entrevistas-sobre-extreme-programming.png","slug":"entrevistas-sobre-extreme-programming","color":"green","url":"https://pro.codely.com/library/entrevistas-sobre-extreme-programming-179419/about/"},{"title":"TDD: Test-Driven Development","emoji":"♻️","summary":"Aprende Test-Driven Development (TDD) y las diferentes formas y estilos de aplicarlo en aplicaciones del Mundo Real™️","authors":["dani-santamaria","javier-ferrer"],"releaseDate":{"start":"2022-03-24","end":"2022-04-20"},"tags":[],"categories":["arquitectura-software","metodologias-buenas-practicas"],"sticker":"/img/cursos/tdd.png","slug":"tdd","color":"violet","url":"https://pro.codely.com/library/tdd-test-driven-development-179143/"},{"title":"Directos exclusivos CodelyTV Pro","emoji":"🎥","summary":"Directos exclusivos resolviendo dudas, teniendo debates, y preparando siguientes cursos en base a vuestro feedback","authors":["javier-ferrer","rafa-gomez","isma-navarro","dani-santamaria","nino-dafonte","nuria-soriano"],"releaseDate":{"start":"2021-05-26","end":"2022-03-11"},"tags":[],"categories":["arquitectura-software","frontend","backend"],"sticker":"/img/cursos/pro-streaming.png","slug":"pro-streaming","color":"violet","url":"https://pro.codely.com/library/directos-exclusivos-codelytv-pro-166172/about/"},{"title":"Setup macOS para Programar","emoji":"","summary":"Configura tu ordenador con Mac tal y cómo lo tienen Nino y Rafa para programar lo más cómodamente posible.","authors":["nino-dafonte","rafa-gomez"],"releaseDate":{"start":"2022-03-03","end":"2022-03-16"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/setup-mac.png","slug":"setup-mac","color":"yellow","url":"https://pro.codely.com/library/setup-macos-para-programar-178003/"},{"title":"Lightning Talks","emoji":"⚡","summary":"Charlas de 10-20 minutos sobre temas variados. Hasta ahora eran internas al equipo Codely, pero… si a nosotros nos aportan valor, puede que a ti también","authors":["nuria-soriano"],"releaseDate":{"start":"2022-02-16","end":"2022-02-16"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/lightning-talks.png","slug":"lightning-talks","color":"green","url":"https://pro.codely.com/library/lightning-talks-177049/about/"},{"title":"eXtreme Programming","emoji":"🧑‍🔬","summary":"Descubre las prácticas de eXtreme Programming y su aplicación en el Mundo Real™","authors":["nino-dafonte","dani-santamaria"],"releaseDate":{"start":"2022-01-26","end":"2022-02-23"},"tags":[],"categories":["metodologias-buenas-practicas"],"sticker":"/img/cursos/extreme-programming.png","slug":"extreme-programming","color":"pink","url":"https://pro.codely.com/library/extreme-programming-171308"},{"title":"Introducción a Kotlin: Tu primera app","emoji":"🐈","summary":"Desarrolla tu primer comando de consola con Kotlin mientras aprendes qué hace tan potente a este lenguaje.","authors":["isa-garrido","rafa-gomez"],"releaseDate":{"start":"2022-01-05","end":"2022-02-03"},"tags":[],"categories":["backend"],"sticker":"/img/cursos/introduccion-a-kotlin.png","slug":"introduccion-a-kotlin","color":"yellow","url":"https://pro.codely.com/library/introduccion-a-kotlin-tu-primera-app-174088/"},{"title":"DDD en TypeScript: Modelado y arquitectura","emoji":"🔷","summary":"Crea paso a paso tu aplicación TypeScript siguiendo Domain-Driven Design.","authors":["fernando-vilas","ruben-salado","javier-ferrer"],"releaseDate":{"start":"2021-11-24","end":"2021-12-22"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/ddd-en-typescript-modelado-arquitectura.png","slug":"ddd-en-typescript-modelado-arquitectura","color":"violet","url":"https://pro.codely.com/library/ddd-en-typescript-modelado-y-arquitectura-172533"},{"title":"Auditorías y Acompañamientos","emoji":"🐷","summary":"Sesión de auditoría en la que se revisa el diseño y arquitectura de software de una parte de tus sistemas y de Acompañamiento dónde te ayudamos a mejorar tu aprendizaje","authors":["javier-ferrer","rafa-gomez"],"releaseDate":{"start":"2021-11-26","end":"2022-07-27"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/auditoria-acompanamientos.png","slug":"auditoria-acompanamientos","color":"green","url":"https://pro.codely.com/library/auditorias-y-acompanamientos-172662/375960/about/"},{"title":"Gestión de Estado en React","emoji":"🍥","summary":"Conoce las distintas herramientas con la que puedes gestionar el estado en tu aplicación React.","authors":["isma-navarro","javier-ferrer","ricardo-borillo"],"releaseDate":{"start":"2021-11-03","end":"2021-12-01"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/gestion-estado-react.png","slug":"gestion-estado-react","color":"yellow","url":"https://pro.codely.com/library/gestion-estado-en-react/"},{"title":"Web performance","emoji":"🌪️","summary":"Aprende a optimizar tus aplicaciones web y a crear una cultura de performance para mantenerla a largo plazo.","authors":["nino-dafonte","nuria-soriano"],"releaseDate":{"start":"2021-09-29","end":"2021-10-27"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/web-performance.png","slug":"web-performance","color":"pink","url":"https://pro.codely.com/library/web-performance-168675/"},{"title":"Patrones de Diseño: Creacionales","emoji":"🏭","summary":"Aprende las implicaciones a nivel de SOLID y de mantenimiento de los Patrones de Diseño Creacionales.","authors":["dani-santamaria","javier-ferrer"],"releaseDate":{"start":"2021-09-08","end":"2021-10-06"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/patrones-diseno-creacionales.png","slug":"patrones-diseno-creacionales","color":"violet","url":"https://pro.codely.com/library/patrones-de-diseno-creacionales-167860/"},{"title":"CSS Flex a fondo","emoji":"🤸","summary":"Aprende a sacar todo el potencial de CSS Flex para crear layouts adaptables fácilmente.","authors":["isma-navarro","rafa-gomez"],"releaseDate":{"start":"2021-09-01","end":"2021-09-15"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/css-flex.png","slug":"css-flex","color":"green","url":"https://pro.codely.com/library/css-flex-a-fondo/"},{"title":"De JavaScript a TypeScript","emoji":"🏗️","summary":"Aprende TypeScript partiendo de un ejemplo de JavaScript en el que haremos el proceso de refactor poco a poco y analizando las principales características de TypeScript.","authors":["isma-navarro","rafa-gomez","nuria-soriano"],"releaseDate":{"start":"2021-06-14","end":"2021-07-28"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/de-javascript-a-typescript.png","slug":"de-javascript-a-typescript","color":"yellow","url":"https://pro.codely.com/library/de-javascript-a-typescript-128106/"},{"title":"Symfony mantenible y escalable","emoji":"🎶","summary":"Aprende herramientas y prácticas con Symfony para conseguir una mayor mantenibilidad y escalabilidad de tus aplicaciones.","authors":["dani-santamaria","javier-ferrer"],"releaseDate":{"start":"2021-06-10","end":"2021-07-05"},"tags":[],"categories":["backend"],"sticker":"/img/cursos/symfony-mantenible-escalable.png","slug":"symfony-mantenible-escalable","color":"pink","url":"https://pro.codely.com/library/symfony-mantenible-y-escalable-127478/"},{"title":"CSS Grid a fondo","emoji":"🍱","summary":"Aprende a sacar provecho de CSS Grid para crear layouts flexibles sin necesidad de recurrir a frameworks.","authors":["nuria-soriano","rafa-gomez","isma-navarro"],"releaseDate":{"start":"2021-06-02","end":"2021-06-16"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/css-grid.png","slug":"css-grid","color":"violet","url":"https://pro.codely.com/library/css-grid-a-fondo-126731/"},{"title":"Setup Linux para Programar","emoji":"🐧","summary":"Configura tu ordenador con Linux tal y cómo lo tiene Dani para programar lo más cómodamente posible.","authors":["dani-santamaria","rafa-gomez"],"releaseDate":{"start":"2021-05-13","end":"2021-05-26"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/setup-linux.png","slug":"setup-linux","color":"green","url":"https://pro.codely.com/library/setup-linux-para-programar-124104/"},{"title":"JavaScript moderno","emoji":"🐥","summary":"Aprende buenas prácticas para empezar aplicaciones JavaScript vanilla desde 0 y refactorizar código legacy dando soporte a navegadores antiguos.","authors":["nuria-soriano","javier-ferrer","isma-navarro"],"releaseDate":{"start":"2021-04-07","end":"2021-05-19"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/javascript-moderno.png","slug":"javascript-moderno","color":"yellow","url":"https://pro.codely.com/library/js-moderno/about/"},{"title":"Refactoring de Code Smells a Clean Code: Change Preventers","emoji":"🧹","summary":"Aprende a detectar y lidiar con código que genera aversión al cambio. Curso centrado en Code Smells de tipo Change Preventers.","authors":["javier-ferrer","rafa-gomez","dani-santamaria"],"releaseDate":{"start":"2021-04-15","end":"2021-04-28"},"tags":[],"categories":["arquitectura-software","metodologias-buenas-practicas"],"sticker":"/img/cursos/refactoring-change-preventers.png","slug":"refactoring-change-preventers","color":"pink","url":"https://pro.codely.com/library/refactoring-change-preventers/about/"},{"title":"Light & Dark themes accesibles","emoji":"🌚🌝","summary":"Aprende a implementar temas claros y oscuros en una página web de forma accesible, cómo integrarlo en tu arquitectura CSS y cómo adaptar los diseños para que te queden unos temas finísimos.","authors":["nuria-soriano","rafa-gomez"],"releaseDate":{"start":"2021-03-03","end":"2021-03-17"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/light-dark-themes-accesibles.png","slug":"light-dark-themes-accesibles","color":"violet","url":"https://pro.codely.com/library/light-dark-themes-accesibles/about/"},{"title":"API HTTP en Go aplicando Arquitectura Hexagonal","emoji":"⛳","summary":"Aprende a desarrollar tu primera API HTTP en Go aplicando algunos de los fundamentos de la Arquitectura Hexagonal.","authors":["adrian-perez","joan-lopez-de-la-franca","javier-ferrer"],"releaseDate":{"start":"2021-01-27","end":"2021-02-24"},"tags":[],"categories":["backend","arquitectura-software"],"sticker":"/img/cursos/api-go-hexagonal.png","slug":"api-go-hexagonal","color":"yellow","url":"https://pro.codely.com/library/api-go-hexagonal/about/"},{"title":"Testing en frontend","emoji":"🐙","summary":"Aprende cómo testear tus aplicaciones frontend, aplicando buenas prácticas para conseguir unos tests mantenibles que aporten confianza.","authors":["nuria-soriano","javier-ferrer"],"releaseDate":{"start":"2021-01-21","end":"2021-02-17"},"tags":[],"categories":["frontend","metodologias-buenas-practicas"],"sticker":"/img/cursos/testing-frontend.png","slug":"testing-frontend","color":"green","url":"https://pro.codely.com/library/testing-frontend/about/"},{"title":"Karabiner: Atajos de teclado para todo","emoji":"🎱","summary":"¡Automatiza todo en tu mac a golpe de atajos de teclado y mejor tu productividad!","authors":["rafa-gomez"],"releaseDate":{"start":"2021-01-13","end":"2021-01-13"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/karabiner.png","slug":"karabiner","color":"yellow","url":"https://pro.codely.com/library/karabiner/about/"},{"title":"Arquitectura CSS","emoji":"🗼","summary":"Aprende los fundamentos de una buena arquitectura CSS para que tus estilos sean fáciles de mantener y escalar.","authors":["nuria-soriano","rafa-gomez"],"releaseDate":{"start":"2020-11-25","end":"2020-12-24"},"tags":[],"categories":["frontend","arquitectura-software"],"sticker":"/img/cursos/arquitectura-css.png","slug":"arquitectura-css","color":"pink","url":"https://pro.codely.com/library/arquitectura-css/about/"},{"title":"PHP 8: Novedades y ejemplos para el Mundo Real™","emoji":"🐘","summary":"Migra tus aplicaciones a PHP 8 paso a paso, consigue tests más mantenibles gracias a Named Arguments, Value Objects más simples con Constructor Property Promotion, reemplaza PECL (obsoleto), y mucho más.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2020-11-18","end":"2020-12-02"},"tags":[],"categories":["backend"],"sticker":"/img/cursos/php-8.png","slug":"php-8","color":"violet","url":"https://pro.codely.com/library/php-8/about/"},{"title":"Vue 3: Novedades aplicadas al mundo real","emoji":"✌️","summary":"Veremos cómo exprimir las novedades de Vue 3 con ejemplos reales y aplicando buenas prácticas.","authors":["nuria-soriano","javier-ferrer"],"releaseDate":{"start":"2020-10-28","end":"2020-11-11"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/novedades-vue-3.png","slug":"novedades-vue-3","color":"green","url":"https://pro.codely.com/library/novedades-vue-3/about/"},{"title":"Buenas prácticas con CSS: Layouts","emoji":"📐","summary":"","authors":["nuria-soriano","rafa-gomez"],"releaseDate":{"start":"2020-10-01","end":"2020-10-16"},"tags":[],"categories":["frontend","metodologias-buenas-practicas"],"sticker":"/img/cursos/layouts-css.png","slug":"layouts-css","color":"yellow","url":"https://pro.codely.com/library/layouts-css/about/"},{"title":"Refactoring de Code Smells a Clean Code: Bloaters","emoji":"🧼","summary":"Aprende a detectar y lidiar con código incomprensible 🤟","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2020-09-24","end":"2020-10-22"},"tags":[],"categories":["arquitectura-software","metodologias-buenas-practicas"],"sticker":"/img/cursos/refactoring-code-smells-clean-code-bloaters.png","slug":"refactoring-code-smells-clean-code-bloaters","color":"pink","url":"https://pro.codely.com/library/refactoring-code-smells-clean-code-bloaters/about/"},{"title":"Teclados Mecánicos","emoji":"⌨️","summary":"Monta tu teclado perfecto y personalizado al 100%","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2020-09-16","end":"2020-09-30"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/teclados-mecanicos.png","slug":"teclados-mecanicos","color":"yellow","url":"https://pro.codely.com/library/teclados-mecanicos/about/"},{"title":"Makefiles","emoji":"🐂","summary":"El centralizar tareas de nuestras aplicaciones es algo muy importante, y con los Makefiles se simplifica mucho.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2020-08-19","end":"2020-09-02"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/makefiles.png","slug":"makefiles","color":"green","url":"https://pro.codely.com/library/makefiles/about/"},{"title":"Monitoring con Prometheus","emoji":"🔥","summary":"La observabilidad es una de las cosas más importantes de la programación y el Monitoring uno de sus principales pilares.","authors":["ruben-cougil","rafa-gomez"],"releaseDate":{"start":"2020-08-12","end":"2020-08-26"},"tags":[],"categories":["devops"],"sticker":"/img/cursos/prometheus.png","slug":"prometheus","color":"violet","url":"https://pro.codely.com/library/prometheus/about/"},{"title":"Visualiza métricas de Prometheus con Grafana","emoji":"👁‍🗨","summary":"Aprende a crear un panel de 10 utilizando Grafana con Prometheus como datasource.","authors":["ruben-cougil","rafa-gomez"],"releaseDate":{"start":"2020-08-12","end":"2020-08-26"},"tags":[],"categories":["devops"],"sticker":"/img/cursos/grafana-con-prometheus.png","slug":"grafana-con-prometheus","color":"yellow","url":"https://pro.codely.com/library/curso-grafana-con-prometheus/about/"},{"title":"Notion: Productividad en equipo","emoji":"🌈","summary":"Centraliza toda la documentación de tu equipo de trabajo y la gestión de tareas en 1 única herramienta: Notion.","authors":["javier-ferrer"],"releaseDate":{"start":"2020-05-22","end":"2020-07-31"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/notion.png","slug":"notion","color":"green","url":"https://pro.codely.com/library/notion/about/"},{"title":"Bash para el día a día: Scripting & Productividad","emoji":"💻","summary":"Aprende a usar la navaja suiza de los programadores 😬","authors":["rafa-gomez"],"releaseDate":{"start":"2020-05-29","end":"2020-06-10"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/bash.png","slug":"bash","color":"yellow","url":"https://pro.codely.com/library/curso-bash/about/"},{"title":"Todo sobre los dotfiles","emoji":"🚀","summary":"Aprende a automatizar, centralizar y compartir todas tus configuraciones gracias a los dotfiles.","authors":["rafa-gomez"],"releaseDate":{"start":"2020-04-23","end":"2020-05-07"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/todo-sobre-los-dotfiles.png","slug":"todo-sobre-los-dotfiles","color":"pink","url":"https://pro.codely.com/library/todo-sobre-los-dotfiles/about/"},{"title":"Productividad con iTerm: Terminal macOS","emoji":"💨","summary":"Veremos cómo tener una terminal rapidísima y muy productiva gracias a unos simple (y escondidos) tips.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2020-04-23","end":"2020-05-07"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/iterm.png","slug":"iterm","color":"yellow","url":"https://pro.codely.com/library/iterm/about/"},{"title":"Automatiza tu flujo de trabajo con GitHub Actions","emoji":"🤖","summary":"Crearemos nuestras propias actions (¡hasta publicaremos alguna en el Marketplace!) que nos puedan ser muy útiles en nuestro día a día.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2020-03-04","end":"2020-04-08"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/automatizacion-con-github-actions.png","slug":"automatizacion-con-github-actions","color":"violet","url":"https://pro.codely.com/library/automatizacion-con-github-actions/about/"},{"title":"Terminal 100% productiva con Zsh","emoji":"💻","summary":"Consigue ser un Productivity Raptor™ con tu terminal gracias a Zsh, Oh My Zsh, Zim y funciones avanzadas.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2020-03-04","end":"2020-04-08"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/terminal-zsh.png","slug":"terminal-zsh","color":"green","url":"https://pro.codely.com/library/terminal-zsh/about/"},{"title":"Integración Continua con GitHub Actions","emoji":"🤖","summary":"¡Consigue una Integración Continua de la que te puedas fiar y que sea rapidísima! Gracias a GitHub Actions veremos como lograrlo.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2020-03-04","end":"2020-04-08"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/github-actions-de-0-a-integracion-continua.png","slug":"github-actions-de-0-a-integracion-continua","color":"pink","url":"https://pro.codely.com/library/github-actions-de-0-a-integracion-continua/about/"},{"title":"Exprimiendo IntelliJ","emoji":"⚡","summary":"¡Mejora tu productividad exprimiendo IntelliJ! Consigue un aspecto minimalista, crea ficheros con plantillas personalizadas, atajos secretos, y mucho más.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2020-03-04","end":"2020-04-08"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/intellij.png","slug":"intellij","color":"yellow","url":"https://pro.codely.com/library/intellij/about/"},{"title":"DDD en Java","emoji":"☕","summary":"Crea paso a paso tu aplicación Java siguiendo Domain-Driven Design. Estructura de carpetas, integración con BD, sistema de colas, CQRS y más.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2019-09-19","end":"2019-12-31"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/ddd-en-java.png","slug":"ddd-en-java","color":"green","url":"https://pro.codely.com/library/ddd-en-java/about/"},{"title":"DDD en PHP","emoji":"🐘","summary":"Crea paso a paso tu aplicación PHP siguiendo Domain-Driven Design. Estructura de carpetas, integración con BD, sistema de colas, CQRS y más.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2019-07-30","end":"2019-08-28"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/ddd-en-php.png","slug":"ddd-en-php","color":"pink","url":"https://pro.codely.com/library/ddd-en-php/about/"},{"title":"Git: Introducción y trabajo en equipo","emoji":"🔀","summary":"Aprende a trabajar en equipo con Git y sacarle todo el provecho con aspectos avanzados como debugging, estrategias de merge, y mucho más.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2019-06-26","end":"2019-08-07"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/git-introduccion-y-trabajo-en-equipo.png","slug":"git-introduccion-y-trabajo-en-equipo","color":"green","url":"https://pro.codely.com/library/git-introduccion-y-trabajo-en-equipo/about/"},{"title":"Testing: Introducción y buenas prácticas","emoji":"✅","summary":"Aprende qué aporta el testing, cómo testear y buenas prácticas para evitar que mantener tus tests sea un infierno con ejemplos de El Mundo Real™","authors":["javier-ferrer","rafa-gomez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["arquitectura-software","metodologias-buenas-practicas"],"sticker":"/img/cursos/testing-introduccion-y-buenas-practicas.png","slug":"testing-introduccion-y-buenas-practicas","color":"yellow","url":"https://pro.codely.com/library/testing-introduccion-y-buenas-practicas/about/"},{"title":"Introducción a Go: Tu primera app","emoji":"⚡","summary":"Desarrolla tu primer comando de consola con Go mientras aprendes qué hace diferente al lenguaje de moda.","authors":["joan-lopez-de-la-franca","adrian-perez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["backend"],"sticker":"/img/cursos/introduccion-a-go-tu-primera-app.png","slug":"introduccion-a-go-tu-primera-app","color":"violet","url":"https://pro.codely.com/library/introduccion-a-go-tu-primera-app/about/"},{"title":"Domain-Driven Design","emoji":"🗿","summary":"Aprende a modelar tus aplicaciones centrándote en tu dominio, definir Bounded Contexts, agregados, value objects, y mucho más. Todo de forma práctica y con ejemplos de código","authors":["javier-ferrer","rafa-gomez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/domain-driven-design-ddd.png","slug":"domain-driven-design-ddd","color":"pink","url":"https://pro.codely.com/library/domain-driven-design-ddd/about/"},{"title":"ReactJS: De 0 a deploy","emoji":"⚛️","summary":"Crea tu primera aplicación de React llevándola hasta producción y siguiendo buenas prácticas","authors":["dani-martin"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/reactjs-de-0-a-deploy.png","slug":"reactjs-de-0-a-deploy","color":"yellow","url":"https://pro.codely.com/library/reactjs-de-0-a-deploy-siguiendo-buenas-practicas/about/"},{"title":"Kubernetes para desarrolladores","emoji":"⛵","summary":"Aprende a orquestrar contenedores de Docker y desplegarlos en Azure, GCE, o AWS siguiendo buenas prácticas","authors":["jose-armesto"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["devops"],"sticker":"/img/cursos/kubernetes-para-desarrolladores.png","slug":"kubernetes-para-desarrolladores","color":"violet","url":"https://pro.codely.com/library/kubernetes-para-desarrolladores/about/"},{"title":"Migrando a VueJS progresivamente","emoji":"♻️️","summary":"Aprende cómo migrar un frontend ya existente a Vue.js partiendo de HTML, CSS y JS generado por backend","authors":["juanma-garrido"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/migrando-a-vuejs-progresivamente-desde-0.png","slug":"migrando-a-vuejs-progresivamente-desde-0","color":"green","url":"https://pro.codely.com/library/migrando-a-vuejs-progresivamente-desde-0/about/"},{"title":"ELK: Centraliza logs con Elastic Stack","emoji":"📊","summary":"Aprende a montar un stack para poder explotar toda la información de tus logs gracias a Elasticsearch, Logstash o Beats, y Kibana","authors":["ruben-cougil","javier-ferrer"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["devops","backend"],"sticker":"/img/cursos/elkbeats-centraliza-la-gestion-de-logs-con-the-elastic-stack.png","slug":"elkbeats-centraliza-la-gestion-de-logs-con-the-elastic-stack","color":"yellow","url":"https://pro.codely.com/library/elkbeats-centraliza-la-gestion-de-logs-con-the-elastic-stack/about/"},{"title":"Principios SOLID aplicados","emoji":"🧱","summary":"Si ya sabes desarrollar software, pero quieres ir un paso más allá y mejorar la calidad de tu código, este es tu curso","authors":["javier-ferrer","rafa-gomez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/principios-solid-aplicados.png","slug":"principios-solid-aplicados","color":"pink","url":"https://pro.codely.com/library/principios-solid-aplicados/about/"},{"title":"Comunicación entre microservicios: Event-Driven Architecture","emoji":"💬","summary":"Publica y consume eventos de dominio, consistencia eventual, RabbitMQ y AWS SNS-SQS, migración de monolito a servicios, y mucho más.","authors":["javier-ferrer","rafa-gomez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/comunicacion-entre-microservicios-event-driven-architecture.png","slug":"comunicacion-entre-microservicios-event-driven-architecture","color":"green","url":"https://pro.codely.com/library/comunicacion-entre-microservicios-event-driven-architecture/about/"},{"title":"Programación funcional: Refactor de OO a TypeClasses","emoji":"ƛ","summary":"Introducción a la programación funcional pura en Scala y a sus ventajas de la mano de las type classes.","authors":["juan-manuel-serrano","javier-fuentes"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["backend"],"sticker":"/img/cursos/programacion-funcional-refactorizando-codigo-orientado-a-objetos-con-typeclasses.png","slug":"programacion-funcional-refactorizando-codigo-orientado-a-objetos-con-typeclasses","color":"yellow","url":"https://pro.codely.com/library/programacion-funcional-refactorizando-codigo-orientado-a-objetos-con-typeclasses/about/"},{"title":"Docker: De 0 a deploy","emoji":"🐳","summary":"Aprende qué es Docker y cómo sacar el mayor partido a los contenedores. Empezando desde el principio, veremos cómo usar Docker para levantar tu aplicación en local como si fuese producción, arrancando una base de datos con Docker Compose.","authors":["jose-armesto"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["devops"],"sticker":"/img/cursos/docker-de-0-a-deployment.png","slug":"docker-de-0-a-deployment","color":"violet","url":"https://pro.codely.com/library/docker-de-0-a-deployment/about/"},{"title":"Exprimiendo las vistas de Android","emoji":"🖌️","summary":"Aprenderás a diseñar en Android cualquier diseño que te propongas. Empezando desde la base, iremos analizando todos los componentes hasta llegar a conceptos avanzados para que no se te resista ningún reto.","authors":["ilia-berlana"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["mobile"],"sticker":"/img/cursos/exprimiendo-las-vistas-de-android.png","slug":"exprimiendo-las-vistas-de-android","color":"yellow","url":"https://pro.codely.com/library/exprimiendo-las-vistas-de-android/about/"},{"title":"CQRS y Event Sourcing con Kotlin y Axon Framework","emoji":"🤹","summary":"Aprenderemos qué es Event Sourcing y cómo se complementa con la arquitectura CQRS. La parte práctica del curso consistirá en un desarrollo de un carrito de la compra para un ecommerce usando Kotlin y el framework Axon.","authors":["jordi-llonch","ramon-aranda"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["backend","arquitectura-software"],"sticker":"/img/cursos/cqrs-y-event-sourcing-con-kotlin-y-axon-framework.png","slug":"cqrs-y-event-sourcing-con-kotlin-y-axon-framework","color":"green","url":"https://pro.codely.com/library/cqrs-y-event-sourcing-con-kotlin-y-axon-framework/about/"},{"title":"Tu primera API HTTP con Scala","emoji":"🗣️","summary":"Habiendo hecho el primer curso de introducción a Scala ya nos podemos meter en materia y desarrollar nuestra primera API HTTP con Scala, Akka, base de datos, y mucho más.","authors":["javier-ferrer","rafa-gomez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["backend"],"sticker":"/img/cursos/api-http-con-scala-y-akka.png","slug":"api-http-con-scala-y-akka","color":"pink","url":"https://pro.codely.com/library/api-http-con-scala-y-akka/about/"},{"title":"Arquitectura Hexagonal","emoji":"🎯","summary":"Domain-Driven Design se apoya en la Arquitectura Hexagonal como uno de sus pilares a nivel técnico. Aprende a implementarla con CodelyTV!","authors":["javier-ferrer","rafa-gomez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/arquitectura-hexagonal.png","slug":"arquitectura-hexagonal","color":"yellow","url":"https://pro.codely.com/library/arquitectura-hexagonal/about/"},{"title":"AWS: Escalando apps - Load Balancers y Auto Scaling Groups","emoji":"📈","summary":"José Armesto seguirá la serie de cursos sobre AWS hablando de cómo escalar. Introduciremos los Load Balancers y Auto Scaling Groups de AWS.","authors":["jose-armesto"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["devops"],"sticker":"/img/cursos/aws-autoescalado-de-aplicaciones-con-alb-y-asg.png","slug":"aws-autoescalado-de-aplicaciones-con-alb-y-asg","color":"violet","url":"https://pro.codely.com/library/aws-autoescalado-de-aplicaciones-con-alb-y-asg/about/"},{"title":"Crea una app MEAN profesional con AngularJS y Webpack","emoji":"🛡️","summary":"JuanMa Garrido nos explica cómo crear aplicaciones profesionales desde 0 basándonos en MongoDB, Express, AngularJS, y Node.js siguiendo buenas prácticas y usando Webpack.","authors":["juanma-garrido"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/crea-una-app-mean-profesional-con-angularjs-y-webpack.png","slug":"crea-una-app-mean-profesional-con-angularjs-y-webpack","color":"yellow","url":"https://pro.codely.com/library/crea-una-app-mean-profesional-con-angularjs-y-webpack/about/"},{"title":"Testing unidirectional dataflow con Vuex y Jest","emoji":"🍄","summary":"Explicaremos la implementación de arquitectura de flujo unidireccional de Vuex y veremos cómo ayuda al desarrollo de aplicaciones con una jerarquía de componentes más compleja.","authors":["alberto-gualis","javier-rubio"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/testing-unidirectional-dataflow-vuex-y-jest.png","slug":"testing-unidirectional-dataflow-vuex-y-jest","color":"pink","url":"https://pro.codely.com/library/testing-unidirectional-dataflow-vuex-y-jest/about/"},{"title":"Crea una app con VueJS y Jest aplicando TDD","emoji":"✌️","summary":"Alberto Gualis y Javi Rubio nos explicarán cómo testean aplicaciones VueJS con Jest en los Coding Stones. Incluye sesión práctica de TDD en Frontend. A lo loco!","authors":["alberto-gualis","javier-rubio"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/crea-una-app-con-vuejs-y-jest-aplicando-tdd.png","slug":"crea-una-app-con-vuejs-y-jest-aplicando-tdd","color":"violet","url":"https://pro.codely.com/library/crea-una-app-con-vuejs-y-jest-aplicando-tdd/about/"},{"title":"Buenas prácticas de BDD con Gherkin","emoji":"🥒","summary":"Aprenderás desde los conceptos básicos para testear tu aplicación con Cucumber o Behat, hasta consejos de buenas prácticas para hacer que tu suite de tests sea más fácilmente mantenible.","authors":["alberto-gualis","javier-rubio","dani-latorre"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["backend"],"sticker":"/img/cursos/buenas-practicas-de-bdd-con-cucumber.png","slug":"buenas-practicas-de-bdd-con-cucumber","color":"green","url":"https://pro.codely.com/library/buenas-practicas-de-bdd-con-cucumber/about/"},{"title":"Introducción a Scala","emoji":"🌀","summary":"Scala es un lenguaje conciso, poco verboso, y que permite la programación funcional sin olvidar la POO. Aprenderemos cómo configurar el entorno, las bases del lenguaje, asincronía y otros tips para empezar.","authors":["javier-ferrer","rafa-gomez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["backend"],"sticker":"/img/cursos/introduccion-a-scala.png","slug":"introduccion-a-scala","color":"violet","url":"https://pro.codely.com/library/introduccion-a-scala/about/"},{"title":"UI Testing en iOS con KIF","emoji":"📱","summary":"Aprende una de las técnicas de testing más potentes que existen para desarrollo móvil, aprende a hacer tests funcionales de UI para aplicaciones iOS con Sergio Gutierrez de Karumi.","authors":["jorge-barroso","sergio-gutierrez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["mobile"],"sticker":"/img/cursos/ui-testing-en-ios-con-kif.png","slug":"ui-testing-en-ios-con-kif","color":"yellow","url":"https://pro.codely.com/library/ui-testing-en-ios-con-kif/about/"},{"title":"Screenshot testing en iOS","emoji":"🖼️","summary":"Sergio Gutierrez de Karumi nos explicará cómo y qué aporta hacer Screenshot Testing en iOS. Veremos desde cómo empezar a escribir nuestros primeros tests, hasta algunos trucos a tener en cuenta pasando por la integración continua.","authors":["jorge-barroso","sergio-gutierrez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["mobile"],"sticker":"/img/cursos/screenshot-testing-en-ios.png","slug":"screenshot-testing-en-ios","color":"green","url":"https://pro.codely.com/library/screenshot-testing-en-ios-3af3e7f1/about/"},{"title":"Screenshot testing en Android","emoji":"📸","summary":"Jorge Barroso de Karumi nos explicará cómo y qué aporta hacer Screenshot Testing en Android. Veremos desde cómo empezar a escribir nuestros primeros tests, hasta algunos trucos a tener en cuenta pasando por la integración continua.","authors":["jorge-barroso","sergio-gutierrez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["mobile"],"sticker":"/img/cursos/screenshot-testing-en-android.png","slug":"screenshot-testing-en-android","color":"pink","url":"https://pro.codely.com/library/screenshot-testing-en-android-f1bc7a25/about/"},{"title":"UI Testing en Android con Espresso","emoji":"🎨","summary":"En el mundo mobile la parte más importante y grande que debemos cubrir con tests es la interfaz de usuario. En este curso aprenderemos las claves para escribir buenos tests de UI con Jorge Barroso de Karumi.","authors":["jorge-barroso","sergio-gutierrez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["mobile"],"sticker":"/img/cursos/ui-testing-en-android-con-espresso.png","slug":"ui-testing-en-android-con-espresso","color":"yellow","url":"https://pro.codely.com/library/ui-testing-en-android-con-espresso/about/"},{"title":"AWS EC2: Tu primer deploy","emoji":"☁️","summary":"Aprende las bases de Amazon Web Services para levantar tu aplicación en la nube. Crea tu propia VPC, elige la instancia adecuada de EC2, configura SSH, elige tu AMI base, define Security Groups, deploya, y configura Route53 como DNS!","authors":["jose-armesto"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["devops"],"sticker":"/img/cursos/aws-deploy-en-ec2.png","slug":"aws-deploy-en-ec2","color":"green","url":"https://pro.codely.com/library/aws-deploy-en-ec2/about/"},{"title":"Agile: Cómo mejorar tus retrospectivas","emoji":"🤝","summary":"A pesar de parecer simple, llevar a cabo buenas retrospectivas no siempre es fácil. En este curso José Huerta de Smoking Brains nos explicará cómo mejorar.","authors":["jose-rodriguez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/agile-retrospectivas.png","slug":"agile-retrospectivas","color":"pink","url":"https://pro.codely.com/library/agile-retrospectivas/about/"},{"title":"CQRS: Command Query Responsibility Segregation","emoji":"🚌","summary":"Aumenta el rendimiento y el desacoplamiento de tu backend mediante CQRS. Veremos conceptos e implementaciones de buses síncronos y asíncronos.","authors":["javier-ferrer","rafa-gomez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/cqrs-command-query-responsibility-segregation.png","slug":"cqrs-command-query-responsibility-segregation","color":"violet","url":"https://pro.codely.com/library/cqrs-command-query-responsibility-segregation-3719e4aa/about/"}] 2 | -------------------------------------------------------------------------------- /02-jq/1-map_json/_output.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "titulo": "React de 0 aplicando buenas prácticas", 4 | "emoji": "🎛️" 5 | }, 6 | { 7 | "titulo": "API HTTP en Kotlin aplicando Arquitectura Hexagonal", 8 | "emoji": "💎" 9 | }, 10 | { 11 | "titulo": "DDD en TypeScript: Comunicación entre servicios y aplicaciones", 12 | "emoji": "🛰" 13 | }, 14 | { 15 | "titulo": "Linting en JavaScript y TypeScript", 16 | "emoji": "🔦" 17 | }, 18 | { 19 | "titulo": "Desarrolla plugins de Figma con TypeScript", 20 | "emoji": "🪆" 21 | }, 22 | { 23 | "titulo": "Patrones de Diseño de Comportamiento", 24 | "emoji": "🐝" 25 | }, 26 | { 27 | "titulo": "TypeScript Avanzado: Más alla de any", 28 | "emoji": "🚜" 29 | }, 30 | { 31 | "titulo": "Maquetando la web de Codely desde 0", 32 | "emoji": "🍍" 33 | }, 34 | { 35 | "titulo": "Gestión de logs con Loki y Grafana", 36 | "emoji": "🏵️" 37 | }, 38 | { 39 | "titulo": "Entrevistas sobre eXtreme Programming", 40 | "emoji": "🎤" 41 | }, 42 | { 43 | "titulo": "TDD: Test-Driven Development", 44 | "emoji": "♻️" 45 | }, 46 | { 47 | "titulo": "Directos exclusivos CodelyTV Pro", 48 | "emoji": "🎥" 49 | }, 50 | { 51 | "titulo": "Setup macOS para Programar", 52 | "emoji": "" 53 | }, 54 | { 55 | "titulo": "Lightning Talks", 56 | "emoji": "⚡" 57 | }, 58 | { 59 | "titulo": "eXtreme Programming", 60 | "emoji": "🧑‍🔬" 61 | }, 62 | { 63 | "titulo": "Introducción a Kotlin: Tu primera app", 64 | "emoji": "🐈" 65 | }, 66 | { 67 | "titulo": "DDD en TypeScript: Modelado y arquitectura", 68 | "emoji": "🔷" 69 | }, 70 | { 71 | "titulo": "Auditorías y Acompañamientos", 72 | "emoji": "🐷" 73 | }, 74 | { 75 | "titulo": "Gestión de Estado en React", 76 | "emoji": "🍥" 77 | }, 78 | { 79 | "titulo": "Web performance", 80 | "emoji": "🌪️" 81 | }, 82 | { 83 | "titulo": "Patrones de Diseño: Creacionales", 84 | "emoji": "🏭" 85 | }, 86 | { 87 | "titulo": "CSS Flex a fondo", 88 | "emoji": "🤸" 89 | }, 90 | { 91 | "titulo": "De JavaScript a TypeScript", 92 | "emoji": "🏗️" 93 | }, 94 | { 95 | "titulo": "Symfony mantenible y escalable", 96 | "emoji": "🎶" 97 | }, 98 | { 99 | "titulo": "CSS Grid a fondo", 100 | "emoji": "🍱" 101 | }, 102 | { 103 | "titulo": "Setup Linux para Programar", 104 | "emoji": "🐧" 105 | }, 106 | { 107 | "titulo": "JavaScript moderno", 108 | "emoji": "🐥" 109 | }, 110 | { 111 | "titulo": "Refactoring de Code Smells a Clean Code: Change Preventers", 112 | "emoji": "🧹" 113 | }, 114 | { 115 | "titulo": "Light & Dark themes accesibles", 116 | "emoji": "🌚🌝" 117 | }, 118 | { 119 | "titulo": "API HTTP en Go aplicando Arquitectura Hexagonal", 120 | "emoji": "⛳" 121 | }, 122 | { 123 | "titulo": "Testing en frontend", 124 | "emoji": "🐙" 125 | }, 126 | { 127 | "titulo": "Karabiner: Atajos de teclado para todo", 128 | "emoji": "🎱" 129 | }, 130 | { 131 | "titulo": "Arquitectura CSS", 132 | "emoji": "🗼" 133 | }, 134 | { 135 | "titulo": "PHP 8: Novedades y ejemplos para el Mundo Real™", 136 | "emoji": "🐘" 137 | }, 138 | { 139 | "titulo": "Vue 3: Novedades aplicadas al mundo real", 140 | "emoji": "✌️" 141 | }, 142 | { 143 | "titulo": "Buenas prácticas con CSS: Layouts", 144 | "emoji": "📐" 145 | }, 146 | { 147 | "titulo": "Refactoring de Code Smells a Clean Code: Bloaters", 148 | "emoji": "🧼" 149 | }, 150 | { 151 | "titulo": "Teclados Mecánicos", 152 | "emoji": "⌨️" 153 | }, 154 | { 155 | "titulo": "Makefiles", 156 | "emoji": "🐂" 157 | }, 158 | { 159 | "titulo": "Monitoring con Prometheus", 160 | "emoji": "🔥" 161 | }, 162 | { 163 | "titulo": "Visualiza métricas de Prometheus con Grafana", 164 | "emoji": "👁‍🗨" 165 | }, 166 | { 167 | "titulo": "Notion: Productividad en equipo", 168 | "emoji": "🌈" 169 | }, 170 | { 171 | "titulo": "Bash para el día a día: Scripting & Productividad", 172 | "emoji": "💻" 173 | }, 174 | { 175 | "titulo": "Todo sobre los dotfiles", 176 | "emoji": "🚀" 177 | }, 178 | { 179 | "titulo": "Productividad con iTerm: Terminal macOS", 180 | "emoji": "💨" 181 | }, 182 | { 183 | "titulo": "Automatiza tu flujo de trabajo con GitHub Actions", 184 | "emoji": "🤖" 185 | }, 186 | { 187 | "titulo": "Terminal 100% productiva con Zsh", 188 | "emoji": "💻" 189 | }, 190 | { 191 | "titulo": "Integración Continua con GitHub Actions", 192 | "emoji": "🤖" 193 | }, 194 | { 195 | "titulo": "Exprimiendo IntelliJ", 196 | "emoji": "⚡" 197 | }, 198 | { 199 | "titulo": "DDD en Java", 200 | "emoji": "☕" 201 | }, 202 | { 203 | "titulo": "DDD en PHP", 204 | "emoji": "🐘" 205 | }, 206 | { 207 | "titulo": "Git: Introducción y trabajo en equipo", 208 | "emoji": "🔀" 209 | }, 210 | { 211 | "titulo": "Testing: Introducción y buenas prácticas", 212 | "emoji": "✅" 213 | }, 214 | { 215 | "titulo": "Introducción a Go: Tu primera app", 216 | "emoji": "⚡" 217 | }, 218 | { 219 | "titulo": "Domain-Driven Design", 220 | "emoji": "🗿" 221 | }, 222 | { 223 | "titulo": "ReactJS: De 0 a deploy", 224 | "emoji": "⚛️" 225 | }, 226 | { 227 | "titulo": "Kubernetes para desarrolladores", 228 | "emoji": "⛵" 229 | }, 230 | { 231 | "titulo": "Migrando a VueJS progresivamente", 232 | "emoji": "♻️️" 233 | }, 234 | { 235 | "titulo": "ELK: Centraliza logs con Elastic Stack", 236 | "emoji": "📊" 237 | }, 238 | { 239 | "titulo": "Principios SOLID aplicados", 240 | "emoji": "🧱" 241 | }, 242 | { 243 | "titulo": "Comunicación entre microservicios: Event-Driven Architecture", 244 | "emoji": "💬" 245 | }, 246 | { 247 | "titulo": "Programación funcional: Refactor de OO a TypeClasses", 248 | "emoji": "ƛ" 249 | }, 250 | { 251 | "titulo": "Docker: De 0 a deploy", 252 | "emoji": "🐳" 253 | }, 254 | { 255 | "titulo": "Exprimiendo las vistas de Android", 256 | "emoji": "🖌️" 257 | }, 258 | { 259 | "titulo": "CQRS y Event Sourcing con Kotlin y Axon Framework", 260 | "emoji": "🤹" 261 | }, 262 | { 263 | "titulo": "Tu primera API HTTP con Scala", 264 | "emoji": "🗣️" 265 | }, 266 | { 267 | "titulo": "Arquitectura Hexagonal", 268 | "emoji": "🎯" 269 | }, 270 | { 271 | "titulo": "AWS: Escalando apps - Load Balancers y Auto Scaling Groups", 272 | "emoji": "📈" 273 | }, 274 | { 275 | "titulo": "Crea una app MEAN profesional con AngularJS y Webpack", 276 | "emoji": "🛡️" 277 | }, 278 | { 279 | "titulo": "Testing unidirectional dataflow con Vuex y Jest", 280 | "emoji": "🍄" 281 | }, 282 | { 283 | "titulo": "Crea una app con VueJS y Jest aplicando TDD", 284 | "emoji": "✌️" 285 | }, 286 | { 287 | "titulo": "Buenas prácticas de BDD con Gherkin", 288 | "emoji": "🥒" 289 | }, 290 | { 291 | "titulo": "Introducción a Scala", 292 | "emoji": "🌀" 293 | }, 294 | { 295 | "titulo": "UI Testing en iOS con KIF", 296 | "emoji": "📱" 297 | }, 298 | { 299 | "titulo": "Screenshot testing en iOS", 300 | "emoji": "🖼️" 301 | }, 302 | { 303 | "titulo": "Screenshot testing en Android", 304 | "emoji": "📸" 305 | }, 306 | { 307 | "titulo": "UI Testing en Android con Espresso", 308 | "emoji": "🎨" 309 | }, 310 | { 311 | "titulo": "AWS EC2: Tu primer deploy", 312 | "emoji": "☁️" 313 | }, 314 | { 315 | "titulo": "Agile: Cómo mejorar tus retrospectivas", 316 | "emoji": "🤝" 317 | }, 318 | { 319 | "titulo": "CQRS: Command Query Responsibility Segregation", 320 | "emoji": "🚌" 321 | } 322 | ] 323 | -------------------------------------------------------------------------------- /02-jq/1-map_json/execute.sh: -------------------------------------------------------------------------------- 1 | jq '[.[] | {titulo: .title, emoji}]' "$PWD/_input.json" 2 | -------------------------------------------------------------------------------- /02-jq/1-map_json/test.sh: -------------------------------------------------------------------------------- 1 | source "../../_shared/compare_json.sh" 2 | 3 | it_should_output_the_expected_json "$PWD/execute.sh" "$PWD/_output.json" 4 | -------------------------------------------------------------------------------- /02-jq/2-combine_filter_json/README.md: -------------------------------------------------------------------------------- 1 | # 🔥 Challenge 2 | 3 | 1. Add a `titulo` property on each `_input.json` item combining the `emoji` one, a blank space, and the `title` one. 4 | 2. Add a `titulo_largo` property on each `_input.json` item. Its value must be: 5 | * `si`: if the initial `title` property value has more than 50 characters 6 | * `no`: otherwise 7 | 3. Filter out the JSON items only keeping the ones with a `titulo_largo` property value with more than 40 charaters 8 | -------------------------------------------------------------------------------- /02-jq/2-combine_filter_json/_input.json: -------------------------------------------------------------------------------- 1 | [{"title":"React de 0 aplicando buenas prácticas","emoji":"🎛️","summary":"Introdúcete en React desde 0 creando tu developer dashboard personal dónde podrás consultar las métricas de tus repositorios favoritos.","authors":["isma-navarro","javier-ferrer"],"releaseDate":{"start":"2022-11-17","end":"2022-12-29"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/react-desde-0.png","slug":"react-desde-0","color":"yellow","url":"https://pro.codely.com/library/react-de-0-aplicando-buenas-practicas-192069/about/"},{"title":"API HTTP en Kotlin aplicando Arquitectura Hexagonal","emoji":"💎","summary":"Aprende a desarrollar tu primera API HTTP en Kotlin aplicando algunos de los fundamentos de la Arquitectura Hexagonal.","authors":["isa-garrido","rafa-gomez"],"releaseDate":{"start":"2022-10-27","end":"2022-11-24"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/api-kotlin-hexagonal.png","slug":"api-http-en-kotlin-aplicando-arquitectura-hexagonal","color":"green","url":"https://pro.codely.com/library/api-http-en-kotlin-aplicando-arquitectura-hexagonal-189116/456277/about/"},{"title":"DDD en TypeScript: Comunicación entre servicios y aplicaciones","emoji":"🛰","summary":"Comunica servicios y aplicaciones usando Domain-Driven Design (DDD) y TypeScript y consigue así que el software y los equipos escalen de forma progresiva.","authors":["fernando-vilas","ruben-salado","dani-santamaria"],"releaseDate":{"start":"2022-10-06","end":"2022-11-03"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/ddd-en-typescript-eda.png","slug":"ddd-en-typescript-comunicacion-entre-servicios-y-aplicaciones","color":"pink","url":"https://pro.codely.com/library/ddd-en-typescript-comunicacion-entre-servicios-y-aplicaciones-189024/449177/about/"},{"title":"Linting en JavaScript y TypeScript","emoji":"🔦","summary":"Aprende a sacarle todo el partido a ESLint para llevar tu código al siguiente nivel.","authors":["nuria-soriano","rafa-gomez"],"releaseDate":{"start":"2022-09-09","end":"2022-09-22"},"tags":[],"categories":["tooling","frontend","backend"],"sticker":"/img/cursos/linting-js-ts.png","slug":"linting-en-javascript-y-typescript","color":"yellow","url":"https://pro.codely.com/library/linting-en-javascript-y-typescript-188432/446893/about/"},{"title":"Desarrolla plugins de Figma con TypeScript","emoji":"🪆","summary":"Ves un paso más allá y desarrolla plugins mantenibles, escalables y testables para figma con TypeScript. Diseño y desarrollo se dan la mano.","authors":["carmen-ansio","javier-ferrer"],"releaseDate":{"start":"2022-08-31","end":"2022-09-30"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/plugins-figma.png","slug":"desarrolla-plugins-de-figma-mantenibles-con-typescript","color":"violet","url":"https://pro.codely.com/library/desarrolla-plugins-de-figma-mantenibles-con-typescript-187373/about/"},{"title":"Patrones de Diseño de Comportamiento","emoji":"🐝","summary":"Aprende las implicaciones a nivel de SOLID y de mantenimiento de los Patrones de Diseño de Comportamiento.","authors":["dani-santamaria","rafa-gomez"],"releaseDate":{"start":"2022-07-07","end":"2022-08-03"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/patrones-comportamiento.png","slug":"patrones-de-comportamiento","color":"green","url":"https://pro.codely.com/library/patrones-de-diseno-de-comportamiento-185034/about/"},{"title":"TypeScript Avanzado: Más alla de any","emoji":"🚜","summary":"En este curso vamos a sentar las bases de TypeScript avanzado con el objetivo de ir estableciendo los conocimientos básicos para futuros cursos en los que profundizaremos más en otros aspectos de esta herramienta de desarrollo.","authors":["isma-navarro","javier-ferrer"],"releaseDate":{"start":"2022-05-25","end":"2022-06-08"},"tags":[],"categories":["frontend","backend"],"sticker":"/img/cursos/typescript-avanzado.png","slug":"typescript-avanzando","color":"pink","url":"https://pro.codely.com/library/typescript-avanzado-mas-alla-de-any-182513/about/"},{"title":"Maquetando la web de Codely desde 0","emoji":"🍍","summary":"Llevaremos un diseño en Figma a una web en producción, con un design system escalable y teniendo en cuenta performance, SEO, y accesibilidad.","authors":["nuria-soriano","rafa-gomez"],"releaseDate":{"start":"2022-05-18","end":"2022-06-15"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/maquetando-la-web-de-codely.png","slug":"maquetando-la-web-de-codely-desde-0","color":"yellow","url":"https://pro.codely.com/library/maquetando-la-web-de-codely-desde-0-181753/"},{"title":"Gestión de logs con Loki y Grafana","emoji":"🏵️","summary":"Aprende a gestionar tus logs con Grafana y Loki, las buenas prácticas y cómo se diferencia del stack de ELKi","authors":["joan-lopez-de-la-franca","rafa-gomez"],"releaseDate":{"start":"2022-03-24","end":"2022-04-20"},"tags":[],"categories":["backend","devops"],"sticker":"/img/cursos/gestion-de-logs-con-loki-y-grafana.png","slug":"gestion-de-logs-con-loki-y-grafana","color":"pink","url":"https://pro.codely.com/library/gestion-de-logs-con-loki-y-grafana-179996/407529/about/"},{"title":"Entrevistas sobre eXtreme Programming","emoji":"🎤","summary":"Contenido adicional del curso de eXtreme Programming","authors":["nino-dafonte"],"releaseDate":{"start":"2022-04-01","end":"2022-04-01"},"tags":[],"categories":["metodologias-buenas-practicas"],"sticker":"/img/cursos/entrevistas-sobre-extreme-programming.png","slug":"entrevistas-sobre-extreme-programming","color":"green","url":"https://pro.codely.com/library/entrevistas-sobre-extreme-programming-179419/about/"},{"title":"TDD: Test-Driven Development","emoji":"♻️","summary":"Aprende Test-Driven Development (TDD) y las diferentes formas y estilos de aplicarlo en aplicaciones del Mundo Real™️","authors":["dani-santamaria","javier-ferrer"],"releaseDate":{"start":"2022-03-24","end":"2022-04-20"},"tags":[],"categories":["arquitectura-software","metodologias-buenas-practicas"],"sticker":"/img/cursos/tdd.png","slug":"tdd","color":"violet","url":"https://pro.codely.com/library/tdd-test-driven-development-179143/"},{"title":"Directos exclusivos CodelyTV Pro","emoji":"🎥","summary":"Directos exclusivos resolviendo dudas, teniendo debates, y preparando siguientes cursos en base a vuestro feedback","authors":["javier-ferrer","rafa-gomez","isma-navarro","dani-santamaria","nino-dafonte","nuria-soriano"],"releaseDate":{"start":"2021-05-26","end":"2022-03-11"},"tags":[],"categories":["arquitectura-software","frontend","backend"],"sticker":"/img/cursos/pro-streaming.png","slug":"pro-streaming","color":"violet","url":"https://pro.codely.com/library/directos-exclusivos-codelytv-pro-166172/about/"},{"title":"Setup macOS para Programar","emoji":"","summary":"Configura tu ordenador con Mac tal y cómo lo tienen Nino y Rafa para programar lo más cómodamente posible.","authors":["nino-dafonte","rafa-gomez"],"releaseDate":{"start":"2022-03-03","end":"2022-03-16"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/setup-mac.png","slug":"setup-mac","color":"yellow","url":"https://pro.codely.com/library/setup-macos-para-programar-178003/"},{"title":"Lightning Talks","emoji":"⚡","summary":"Charlas de 10-20 minutos sobre temas variados. Hasta ahora eran internas al equipo Codely, pero… si a nosotros nos aportan valor, puede que a ti también","authors":["nuria-soriano"],"releaseDate":{"start":"2022-02-16","end":"2022-02-16"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/lightning-talks.png","slug":"lightning-talks","color":"green","url":"https://pro.codely.com/library/lightning-talks-177049/about/"},{"title":"eXtreme Programming","emoji":"🧑‍🔬","summary":"Descubre las prácticas de eXtreme Programming y su aplicación en el Mundo Real™","authors":["nino-dafonte","dani-santamaria"],"releaseDate":{"start":"2022-01-26","end":"2022-02-23"},"tags":[],"categories":["metodologias-buenas-practicas"],"sticker":"/img/cursos/extreme-programming.png","slug":"extreme-programming","color":"pink","url":"https://pro.codely.com/library/extreme-programming-171308"},{"title":"Introducción a Kotlin: Tu primera app","emoji":"🐈","summary":"Desarrolla tu primer comando de consola con Kotlin mientras aprendes qué hace tan potente a este lenguaje.","authors":["isa-garrido","rafa-gomez"],"releaseDate":{"start":"2022-01-05","end":"2022-02-03"},"tags":[],"categories":["backend"],"sticker":"/img/cursos/introduccion-a-kotlin.png","slug":"introduccion-a-kotlin","color":"yellow","url":"https://pro.codely.com/library/introduccion-a-kotlin-tu-primera-app-174088/"},{"title":"DDD en TypeScript: Modelado y arquitectura","emoji":"🔷","summary":"Crea paso a paso tu aplicación TypeScript siguiendo Domain-Driven Design.","authors":["fernando-vilas","ruben-salado","javier-ferrer"],"releaseDate":{"start":"2021-11-24","end":"2021-12-22"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/ddd-en-typescript-modelado-arquitectura.png","slug":"ddd-en-typescript-modelado-arquitectura","color":"violet","url":"https://pro.codely.com/library/ddd-en-typescript-modelado-y-arquitectura-172533"},{"title":"Auditorías y Acompañamientos","emoji":"🐷","summary":"Sesión de auditoría en la que se revisa el diseño y arquitectura de software de una parte de tus sistemas y de Acompañamiento dónde te ayudamos a mejorar tu aprendizaje","authors":["javier-ferrer","rafa-gomez"],"releaseDate":{"start":"2021-11-26","end":"2022-07-27"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/auditoria-acompanamientos.png","slug":"auditoria-acompanamientos","color":"green","url":"https://pro.codely.com/library/auditorias-y-acompanamientos-172662/375960/about/"},{"title":"Gestión de Estado en React","emoji":"🍥","summary":"Conoce las distintas herramientas con la que puedes gestionar el estado en tu aplicación React.","authors":["isma-navarro","javier-ferrer","ricardo-borillo"],"releaseDate":{"start":"2021-11-03","end":"2021-12-01"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/gestion-estado-react.png","slug":"gestion-estado-react","color":"yellow","url":"https://pro.codely.com/library/gestion-estado-en-react/"},{"title":"Web performance","emoji":"🌪️","summary":"Aprende a optimizar tus aplicaciones web y a crear una cultura de performance para mantenerla a largo plazo.","authors":["nino-dafonte","nuria-soriano"],"releaseDate":{"start":"2021-09-29","end":"2021-10-27"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/web-performance.png","slug":"web-performance","color":"pink","url":"https://pro.codely.com/library/web-performance-168675/"},{"title":"Patrones de Diseño: Creacionales","emoji":"🏭","summary":"Aprende las implicaciones a nivel de SOLID y de mantenimiento de los Patrones de Diseño Creacionales.","authors":["dani-santamaria","javier-ferrer"],"releaseDate":{"start":"2021-09-08","end":"2021-10-06"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/patrones-diseno-creacionales.png","slug":"patrones-diseno-creacionales","color":"violet","url":"https://pro.codely.com/library/patrones-de-diseno-creacionales-167860/"},{"title":"CSS Flex a fondo","emoji":"🤸","summary":"Aprende a sacar todo el potencial de CSS Flex para crear layouts adaptables fácilmente.","authors":["isma-navarro","rafa-gomez"],"releaseDate":{"start":"2021-09-01","end":"2021-09-15"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/css-flex.png","slug":"css-flex","color":"green","url":"https://pro.codely.com/library/css-flex-a-fondo/"},{"title":"De JavaScript a TypeScript","emoji":"🏗️","summary":"Aprende TypeScript partiendo de un ejemplo de JavaScript en el que haremos el proceso de refactor poco a poco y analizando las principales características de TypeScript.","authors":["isma-navarro","rafa-gomez","nuria-soriano"],"releaseDate":{"start":"2021-06-14","end":"2021-07-28"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/de-javascript-a-typescript.png","slug":"de-javascript-a-typescript","color":"yellow","url":"https://pro.codely.com/library/de-javascript-a-typescript-128106/"},{"title":"Symfony mantenible y escalable","emoji":"🎶","summary":"Aprende herramientas y prácticas con Symfony para conseguir una mayor mantenibilidad y escalabilidad de tus aplicaciones.","authors":["dani-santamaria","javier-ferrer"],"releaseDate":{"start":"2021-06-10","end":"2021-07-05"},"tags":[],"categories":["backend"],"sticker":"/img/cursos/symfony-mantenible-escalable.png","slug":"symfony-mantenible-escalable","color":"pink","url":"https://pro.codely.com/library/symfony-mantenible-y-escalable-127478/"},{"title":"CSS Grid a fondo","emoji":"🍱","summary":"Aprende a sacar provecho de CSS Grid para crear layouts flexibles sin necesidad de recurrir a frameworks.","authors":["nuria-soriano","rafa-gomez","isma-navarro"],"releaseDate":{"start":"2021-06-02","end":"2021-06-16"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/css-grid.png","slug":"css-grid","color":"violet","url":"https://pro.codely.com/library/css-grid-a-fondo-126731/"},{"title":"Setup Linux para Programar","emoji":"🐧","summary":"Configura tu ordenador con Linux tal y cómo lo tiene Dani para programar lo más cómodamente posible.","authors":["dani-santamaria","rafa-gomez"],"releaseDate":{"start":"2021-05-13","end":"2021-05-26"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/setup-linux.png","slug":"setup-linux","color":"green","url":"https://pro.codely.com/library/setup-linux-para-programar-124104/"},{"title":"JavaScript moderno","emoji":"🐥","summary":"Aprende buenas prácticas para empezar aplicaciones JavaScript vanilla desde 0 y refactorizar código legacy dando soporte a navegadores antiguos.","authors":["nuria-soriano","javier-ferrer","isma-navarro"],"releaseDate":{"start":"2021-04-07","end":"2021-05-19"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/javascript-moderno.png","slug":"javascript-moderno","color":"yellow","url":"https://pro.codely.com/library/js-moderno/about/"},{"title":"Refactoring de Code Smells a Clean Code: Change Preventers","emoji":"🧹","summary":"Aprende a detectar y lidiar con código que genera aversión al cambio. Curso centrado en Code Smells de tipo Change Preventers.","authors":["javier-ferrer","rafa-gomez","dani-santamaria"],"releaseDate":{"start":"2021-04-15","end":"2021-04-28"},"tags":[],"categories":["arquitectura-software","metodologias-buenas-practicas"],"sticker":"/img/cursos/refactoring-change-preventers.png","slug":"refactoring-change-preventers","color":"pink","url":"https://pro.codely.com/library/refactoring-change-preventers/about/"},{"title":"Light & Dark themes accesibles","emoji":"🌚🌝","summary":"Aprende a implementar temas claros y oscuros en una página web de forma accesible, cómo integrarlo en tu arquitectura CSS y cómo adaptar los diseños para que te queden unos temas finísimos.","authors":["nuria-soriano","rafa-gomez"],"releaseDate":{"start":"2021-03-03","end":"2021-03-17"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/light-dark-themes-accesibles.png","slug":"light-dark-themes-accesibles","color":"violet","url":"https://pro.codely.com/library/light-dark-themes-accesibles/about/"},{"title":"API HTTP en Go aplicando Arquitectura Hexagonal","emoji":"⛳","summary":"Aprende a desarrollar tu primera API HTTP en Go aplicando algunos de los fundamentos de la Arquitectura Hexagonal.","authors":["adrian-perez","joan-lopez-de-la-franca","javier-ferrer"],"releaseDate":{"start":"2021-01-27","end":"2021-02-24"},"tags":[],"categories":["backend","arquitectura-software"],"sticker":"/img/cursos/api-go-hexagonal.png","slug":"api-go-hexagonal","color":"yellow","url":"https://pro.codely.com/library/api-go-hexagonal/about/"},{"title":"Testing en frontend","emoji":"🐙","summary":"Aprende cómo testear tus aplicaciones frontend, aplicando buenas prácticas para conseguir unos tests mantenibles que aporten confianza.","authors":["nuria-soriano","javier-ferrer"],"releaseDate":{"start":"2021-01-21","end":"2021-02-17"},"tags":[],"categories":["frontend","metodologias-buenas-practicas"],"sticker":"/img/cursos/testing-frontend.png","slug":"testing-frontend","color":"green","url":"https://pro.codely.com/library/testing-frontend/about/"},{"title":"Karabiner: Atajos de teclado para todo","emoji":"🎱","summary":"¡Automatiza todo en tu mac a golpe de atajos de teclado y mejor tu productividad!","authors":["rafa-gomez"],"releaseDate":{"start":"2021-01-13","end":"2021-01-13"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/karabiner.png","slug":"karabiner","color":"yellow","url":"https://pro.codely.com/library/karabiner/about/"},{"title":"Arquitectura CSS","emoji":"🗼","summary":"Aprende los fundamentos de una buena arquitectura CSS para que tus estilos sean fáciles de mantener y escalar.","authors":["nuria-soriano","rafa-gomez"],"releaseDate":{"start":"2020-11-25","end":"2020-12-24"},"tags":[],"categories":["frontend","arquitectura-software"],"sticker":"/img/cursos/arquitectura-css.png","slug":"arquitectura-css","color":"pink","url":"https://pro.codely.com/library/arquitectura-css/about/"},{"title":"PHP 8: Novedades y ejemplos para el Mundo Real™","emoji":"🐘","summary":"Migra tus aplicaciones a PHP 8 paso a paso, consigue tests más mantenibles gracias a Named Arguments, Value Objects más simples con Constructor Property Promotion, reemplaza PECL (obsoleto), y mucho más.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2020-11-18","end":"2020-12-02"},"tags":[],"categories":["backend"],"sticker":"/img/cursos/php-8.png","slug":"php-8","color":"violet","url":"https://pro.codely.com/library/php-8/about/"},{"title":"Vue 3: Novedades aplicadas al mundo real","emoji":"✌️","summary":"Veremos cómo exprimir las novedades de Vue 3 con ejemplos reales y aplicando buenas prácticas.","authors":["nuria-soriano","javier-ferrer"],"releaseDate":{"start":"2020-10-28","end":"2020-11-11"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/novedades-vue-3.png","slug":"novedades-vue-3","color":"green","url":"https://pro.codely.com/library/novedades-vue-3/about/"},{"title":"Buenas prácticas con CSS: Layouts","emoji":"📐","summary":"","authors":["nuria-soriano","rafa-gomez"],"releaseDate":{"start":"2020-10-01","end":"2020-10-16"},"tags":[],"categories":["frontend","metodologias-buenas-practicas"],"sticker":"/img/cursos/layouts-css.png","slug":"layouts-css","color":"yellow","url":"https://pro.codely.com/library/layouts-css/about/"},{"title":"Refactoring de Code Smells a Clean Code: Bloaters","emoji":"🧼","summary":"Aprende a detectar y lidiar con código incomprensible 🤟","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2020-09-24","end":"2020-10-22"},"tags":[],"categories":["arquitectura-software","metodologias-buenas-practicas"],"sticker":"/img/cursos/refactoring-code-smells-clean-code-bloaters.png","slug":"refactoring-code-smells-clean-code-bloaters","color":"pink","url":"https://pro.codely.com/library/refactoring-code-smells-clean-code-bloaters/about/"},{"title":"Teclados Mecánicos","emoji":"⌨️","summary":"Monta tu teclado perfecto y personalizado al 100%","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2020-09-16","end":"2020-09-30"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/teclados-mecanicos.png","slug":"teclados-mecanicos","color":"yellow","url":"https://pro.codely.com/library/teclados-mecanicos/about/"},{"title":"Makefiles","emoji":"🐂","summary":"El centralizar tareas de nuestras aplicaciones es algo muy importante, y con los Makefiles se simplifica mucho.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2020-08-19","end":"2020-09-02"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/makefiles.png","slug":"makefiles","color":"green","url":"https://pro.codely.com/library/makefiles/about/"},{"title":"Monitoring con Prometheus","emoji":"🔥","summary":"La observabilidad es una de las cosas más importantes de la programación y el Monitoring uno de sus principales pilares.","authors":["ruben-cougil","rafa-gomez"],"releaseDate":{"start":"2020-08-12","end":"2020-08-26"},"tags":[],"categories":["devops"],"sticker":"/img/cursos/prometheus.png","slug":"prometheus","color":"violet","url":"https://pro.codely.com/library/prometheus/about/"},{"title":"Visualiza métricas de Prometheus con Grafana","emoji":"👁‍🗨","summary":"Aprende a crear un panel de 10 utilizando Grafana con Prometheus como datasource.","authors":["ruben-cougil","rafa-gomez"],"releaseDate":{"start":"2020-08-12","end":"2020-08-26"},"tags":[],"categories":["devops"],"sticker":"/img/cursos/grafana-con-prometheus.png","slug":"grafana-con-prometheus","color":"yellow","url":"https://pro.codely.com/library/curso-grafana-con-prometheus/about/"},{"title":"Notion: Productividad en equipo","emoji":"🌈","summary":"Centraliza toda la documentación de tu equipo de trabajo y la gestión de tareas en 1 única herramienta: Notion.","authors":["javier-ferrer"],"releaseDate":{"start":"2020-05-22","end":"2020-07-31"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/notion.png","slug":"notion","color":"green","url":"https://pro.codely.com/library/notion/about/"},{"title":"Bash para el día a día: Scripting & Productividad","emoji":"💻","summary":"Aprende a usar la navaja suiza de los programadores 😬","authors":["rafa-gomez"],"releaseDate":{"start":"2020-05-29","end":"2020-06-10"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/bash.png","slug":"bash","color":"yellow","url":"https://pro.codely.com/library/curso-bash/about/"},{"title":"Todo sobre los dotfiles","emoji":"🚀","summary":"Aprende a automatizar, centralizar y compartir todas tus configuraciones gracias a los dotfiles.","authors":["rafa-gomez"],"releaseDate":{"start":"2020-04-23","end":"2020-05-07"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/todo-sobre-los-dotfiles.png","slug":"todo-sobre-los-dotfiles","color":"pink","url":"https://pro.codely.com/library/todo-sobre-los-dotfiles/about/"},{"title":"Productividad con iTerm: Terminal macOS","emoji":"💨","summary":"Veremos cómo tener una terminal rapidísima y muy productiva gracias a unos simple (y escondidos) tips.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2020-04-23","end":"2020-05-07"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/iterm.png","slug":"iterm","color":"yellow","url":"https://pro.codely.com/library/iterm/about/"},{"title":"Automatiza tu flujo de trabajo con GitHub Actions","emoji":"🤖","summary":"Crearemos nuestras propias actions (¡hasta publicaremos alguna en el Marketplace!) que nos puedan ser muy útiles en nuestro día a día.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2020-03-04","end":"2020-04-08"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/automatizacion-con-github-actions.png","slug":"automatizacion-con-github-actions","color":"violet","url":"https://pro.codely.com/library/automatizacion-con-github-actions/about/"},{"title":"Terminal 100% productiva con Zsh","emoji":"💻","summary":"Consigue ser un Productivity Raptor™ con tu terminal gracias a Zsh, Oh My Zsh, Zim y funciones avanzadas.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2020-03-04","end":"2020-04-08"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/terminal-zsh.png","slug":"terminal-zsh","color":"green","url":"https://pro.codely.com/library/terminal-zsh/about/"},{"title":"Integración Continua con GitHub Actions","emoji":"🤖","summary":"¡Consigue una Integración Continua de la que te puedas fiar y que sea rapidísima! Gracias a GitHub Actions veremos como lograrlo.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2020-03-04","end":"2020-04-08"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/github-actions-de-0-a-integracion-continua.png","slug":"github-actions-de-0-a-integracion-continua","color":"pink","url":"https://pro.codely.com/library/github-actions-de-0-a-integracion-continua/about/"},{"title":"Exprimiendo IntelliJ","emoji":"⚡","summary":"¡Mejora tu productividad exprimiendo IntelliJ! Consigue un aspecto minimalista, crea ficheros con plantillas personalizadas, atajos secretos, y mucho más.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2020-03-04","end":"2020-04-08"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/intellij.png","slug":"intellij","color":"yellow","url":"https://pro.codely.com/library/intellij/about/"},{"title":"DDD en Java","emoji":"☕","summary":"Crea paso a paso tu aplicación Java siguiendo Domain-Driven Design. Estructura de carpetas, integración con BD, sistema de colas, CQRS y más.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2019-09-19","end":"2019-12-31"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/ddd-en-java.png","slug":"ddd-en-java","color":"green","url":"https://pro.codely.com/library/ddd-en-java/about/"},{"title":"DDD en PHP","emoji":"🐘","summary":"Crea paso a paso tu aplicación PHP siguiendo Domain-Driven Design. Estructura de carpetas, integración con BD, sistema de colas, CQRS y más.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2019-07-30","end":"2019-08-28"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/ddd-en-php.png","slug":"ddd-en-php","color":"pink","url":"https://pro.codely.com/library/ddd-en-php/about/"},{"title":"Git: Introducción y trabajo en equipo","emoji":"🔀","summary":"Aprende a trabajar en equipo con Git y sacarle todo el provecho con aspectos avanzados como debugging, estrategias de merge, y mucho más.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2019-06-26","end":"2019-08-07"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/git-introduccion-y-trabajo-en-equipo.png","slug":"git-introduccion-y-trabajo-en-equipo","color":"green","url":"https://pro.codely.com/library/git-introduccion-y-trabajo-en-equipo/about/"},{"title":"Testing: Introducción y buenas prácticas","emoji":"✅","summary":"Aprende qué aporta el testing, cómo testear y buenas prácticas para evitar que mantener tus tests sea un infierno con ejemplos de El Mundo Real™","authors":["javier-ferrer","rafa-gomez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["arquitectura-software","metodologias-buenas-practicas"],"sticker":"/img/cursos/testing-introduccion-y-buenas-practicas.png","slug":"testing-introduccion-y-buenas-practicas","color":"yellow","url":"https://pro.codely.com/library/testing-introduccion-y-buenas-practicas/about/"},{"title":"Introducción a Go: Tu primera app","emoji":"⚡","summary":"Desarrolla tu primer comando de consola con Go mientras aprendes qué hace diferente al lenguaje de moda.","authors":["joan-lopez-de-la-franca","adrian-perez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["backend"],"sticker":"/img/cursos/introduccion-a-go-tu-primera-app.png","slug":"introduccion-a-go-tu-primera-app","color":"violet","url":"https://pro.codely.com/library/introduccion-a-go-tu-primera-app/about/"},{"title":"Domain-Driven Design","emoji":"🗿","summary":"Aprende a modelar tus aplicaciones centrándote en tu dominio, definir Bounded Contexts, agregados, value objects, y mucho más. Todo de forma práctica y con ejemplos de código","authors":["javier-ferrer","rafa-gomez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/domain-driven-design-ddd.png","slug":"domain-driven-design-ddd","color":"pink","url":"https://pro.codely.com/library/domain-driven-design-ddd/about/"},{"title":"ReactJS: De 0 a deploy","emoji":"⚛️","summary":"Crea tu primera aplicación de React llevándola hasta producción y siguiendo buenas prácticas","authors":["dani-martin"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/reactjs-de-0-a-deploy.png","slug":"reactjs-de-0-a-deploy","color":"yellow","url":"https://pro.codely.com/library/reactjs-de-0-a-deploy-siguiendo-buenas-practicas/about/"},{"title":"Kubernetes para desarrolladores","emoji":"⛵","summary":"Aprende a orquestrar contenedores de Docker y desplegarlos en Azure, GCE, o AWS siguiendo buenas prácticas","authors":["jose-armesto"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["devops"],"sticker":"/img/cursos/kubernetes-para-desarrolladores.png","slug":"kubernetes-para-desarrolladores","color":"violet","url":"https://pro.codely.com/library/kubernetes-para-desarrolladores/about/"},{"title":"Migrando a VueJS progresivamente","emoji":"♻️️","summary":"Aprende cómo migrar un frontend ya existente a Vue.js partiendo de HTML, CSS y JS generado por backend","authors":["juanma-garrido"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/migrando-a-vuejs-progresivamente-desde-0.png","slug":"migrando-a-vuejs-progresivamente-desde-0","color":"green","url":"https://pro.codely.com/library/migrando-a-vuejs-progresivamente-desde-0/about/"},{"title":"ELK: Centraliza logs con Elastic Stack","emoji":"📊","summary":"Aprende a montar un stack para poder explotar toda la información de tus logs gracias a Elasticsearch, Logstash o Beats, y Kibana","authors":["ruben-cougil","javier-ferrer"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["devops","backend"],"sticker":"/img/cursos/elkbeats-centraliza-la-gestion-de-logs-con-the-elastic-stack.png","slug":"elkbeats-centraliza-la-gestion-de-logs-con-the-elastic-stack","color":"yellow","url":"https://pro.codely.com/library/elkbeats-centraliza-la-gestion-de-logs-con-the-elastic-stack/about/"},{"title":"Principios SOLID aplicados","emoji":"🧱","summary":"Si ya sabes desarrollar software, pero quieres ir un paso más allá y mejorar la calidad de tu código, este es tu curso","authors":["javier-ferrer","rafa-gomez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/principios-solid-aplicados.png","slug":"principios-solid-aplicados","color":"pink","url":"https://pro.codely.com/library/principios-solid-aplicados/about/"},{"title":"Comunicación entre microservicios: Event-Driven Architecture","emoji":"💬","summary":"Publica y consume eventos de dominio, consistencia eventual, RabbitMQ y AWS SNS-SQS, migración de monolito a servicios, y mucho más.","authors":["javier-ferrer","rafa-gomez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/comunicacion-entre-microservicios-event-driven-architecture.png","slug":"comunicacion-entre-microservicios-event-driven-architecture","color":"green","url":"https://pro.codely.com/library/comunicacion-entre-microservicios-event-driven-architecture/about/"},{"title":"Programación funcional: Refactor de OO a TypeClasses","emoji":"ƛ","summary":"Introducción a la programación funcional pura en Scala y a sus ventajas de la mano de las type classes.","authors":["juan-manuel-serrano","javier-fuentes"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["backend"],"sticker":"/img/cursos/programacion-funcional-refactorizando-codigo-orientado-a-objetos-con-typeclasses.png","slug":"programacion-funcional-refactorizando-codigo-orientado-a-objetos-con-typeclasses","color":"yellow","url":"https://pro.codely.com/library/programacion-funcional-refactorizando-codigo-orientado-a-objetos-con-typeclasses/about/"},{"title":"Docker: De 0 a deploy","emoji":"🐳","summary":"Aprende qué es Docker y cómo sacar el mayor partido a los contenedores. Empezando desde el principio, veremos cómo usar Docker para levantar tu aplicación en local como si fuese producción, arrancando una base de datos con Docker Compose.","authors":["jose-armesto"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["devops"],"sticker":"/img/cursos/docker-de-0-a-deployment.png","slug":"docker-de-0-a-deployment","color":"violet","url":"https://pro.codely.com/library/docker-de-0-a-deployment/about/"},{"title":"Exprimiendo las vistas de Android","emoji":"🖌️","summary":"Aprenderás a diseñar en Android cualquier diseño que te propongas. Empezando desde la base, iremos analizando todos los componentes hasta llegar a conceptos avanzados para que no se te resista ningún reto.","authors":["ilia-berlana"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["mobile"],"sticker":"/img/cursos/exprimiendo-las-vistas-de-android.png","slug":"exprimiendo-las-vistas-de-android","color":"yellow","url":"https://pro.codely.com/library/exprimiendo-las-vistas-de-android/about/"},{"title":"CQRS y Event Sourcing con Kotlin y Axon Framework","emoji":"🤹","summary":"Aprenderemos qué es Event Sourcing y cómo se complementa con la arquitectura CQRS. La parte práctica del curso consistirá en un desarrollo de un carrito de la compra para un ecommerce usando Kotlin y el framework Axon.","authors":["jordi-llonch","ramon-aranda"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["backend","arquitectura-software"],"sticker":"/img/cursos/cqrs-y-event-sourcing-con-kotlin-y-axon-framework.png","slug":"cqrs-y-event-sourcing-con-kotlin-y-axon-framework","color":"green","url":"https://pro.codely.com/library/cqrs-y-event-sourcing-con-kotlin-y-axon-framework/about/"},{"title":"Tu primera API HTTP con Scala","emoji":"🗣️","summary":"Habiendo hecho el primer curso de introducción a Scala ya nos podemos meter en materia y desarrollar nuestra primera API HTTP con Scala, Akka, base de datos, y mucho más.","authors":["javier-ferrer","rafa-gomez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["backend"],"sticker":"/img/cursos/api-http-con-scala-y-akka.png","slug":"api-http-con-scala-y-akka","color":"pink","url":"https://pro.codely.com/library/api-http-con-scala-y-akka/about/"},{"title":"Arquitectura Hexagonal","emoji":"🎯","summary":"Domain-Driven Design se apoya en la Arquitectura Hexagonal como uno de sus pilares a nivel técnico. Aprende a implementarla con CodelyTV!","authors":["javier-ferrer","rafa-gomez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/arquitectura-hexagonal.png","slug":"arquitectura-hexagonal","color":"yellow","url":"https://pro.codely.com/library/arquitectura-hexagonal/about/"},{"title":"AWS: Escalando apps - Load Balancers y Auto Scaling Groups","emoji":"📈","summary":"José Armesto seguirá la serie de cursos sobre AWS hablando de cómo escalar. Introduciremos los Load Balancers y Auto Scaling Groups de AWS.","authors":["jose-armesto"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["devops"],"sticker":"/img/cursos/aws-autoescalado-de-aplicaciones-con-alb-y-asg.png","slug":"aws-autoescalado-de-aplicaciones-con-alb-y-asg","color":"violet","url":"https://pro.codely.com/library/aws-autoescalado-de-aplicaciones-con-alb-y-asg/about/"},{"title":"Crea una app MEAN profesional con AngularJS y Webpack","emoji":"🛡️","summary":"JuanMa Garrido nos explica cómo crear aplicaciones profesionales desde 0 basándonos en MongoDB, Express, AngularJS, y Node.js siguiendo buenas prácticas y usando Webpack.","authors":["juanma-garrido"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/crea-una-app-mean-profesional-con-angularjs-y-webpack.png","slug":"crea-una-app-mean-profesional-con-angularjs-y-webpack","color":"yellow","url":"https://pro.codely.com/library/crea-una-app-mean-profesional-con-angularjs-y-webpack/about/"},{"title":"Testing unidirectional dataflow con Vuex y Jest","emoji":"🍄","summary":"Explicaremos la implementación de arquitectura de flujo unidireccional de Vuex y veremos cómo ayuda al desarrollo de aplicaciones con una jerarquía de componentes más compleja.","authors":["alberto-gualis","javier-rubio"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/testing-unidirectional-dataflow-vuex-y-jest.png","slug":"testing-unidirectional-dataflow-vuex-y-jest","color":"pink","url":"https://pro.codely.com/library/testing-unidirectional-dataflow-vuex-y-jest/about/"},{"title":"Crea una app con VueJS y Jest aplicando TDD","emoji":"✌️","summary":"Alberto Gualis y Javi Rubio nos explicarán cómo testean aplicaciones VueJS con Jest en los Coding Stones. Incluye sesión práctica de TDD en Frontend. A lo loco!","authors":["alberto-gualis","javier-rubio"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/crea-una-app-con-vuejs-y-jest-aplicando-tdd.png","slug":"crea-una-app-con-vuejs-y-jest-aplicando-tdd","color":"violet","url":"https://pro.codely.com/library/crea-una-app-con-vuejs-y-jest-aplicando-tdd/about/"},{"title":"Buenas prácticas de BDD con Gherkin","emoji":"🥒","summary":"Aprenderás desde los conceptos básicos para testear tu aplicación con Cucumber o Behat, hasta consejos de buenas prácticas para hacer que tu suite de tests sea más fácilmente mantenible.","authors":["alberto-gualis","javier-rubio","dani-latorre"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["backend"],"sticker":"/img/cursos/buenas-practicas-de-bdd-con-cucumber.png","slug":"buenas-practicas-de-bdd-con-cucumber","color":"green","url":"https://pro.codely.com/library/buenas-practicas-de-bdd-con-cucumber/about/"},{"title":"Introducción a Scala","emoji":"🌀","summary":"Scala es un lenguaje conciso, poco verboso, y que permite la programación funcional sin olvidar la POO. Aprenderemos cómo configurar el entorno, las bases del lenguaje, asincronía y otros tips para empezar.","authors":["javier-ferrer","rafa-gomez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["backend"],"sticker":"/img/cursos/introduccion-a-scala.png","slug":"introduccion-a-scala","color":"violet","url":"https://pro.codely.com/library/introduccion-a-scala/about/"},{"title":"UI Testing en iOS con KIF","emoji":"📱","summary":"Aprende una de las técnicas de testing más potentes que existen para desarrollo móvil, aprende a hacer tests funcionales de UI para aplicaciones iOS con Sergio Gutierrez de Karumi.","authors":["jorge-barroso","sergio-gutierrez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["mobile"],"sticker":"/img/cursos/ui-testing-en-ios-con-kif.png","slug":"ui-testing-en-ios-con-kif","color":"yellow","url":"https://pro.codely.com/library/ui-testing-en-ios-con-kif/about/"},{"title":"Screenshot testing en iOS","emoji":"🖼️","summary":"Sergio Gutierrez de Karumi nos explicará cómo y qué aporta hacer Screenshot Testing en iOS. Veremos desde cómo empezar a escribir nuestros primeros tests, hasta algunos trucos a tener en cuenta pasando por la integración continua.","authors":["jorge-barroso","sergio-gutierrez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["mobile"],"sticker":"/img/cursos/screenshot-testing-en-ios.png","slug":"screenshot-testing-en-ios","color":"green","url":"https://pro.codely.com/library/screenshot-testing-en-ios-3af3e7f1/about/"},{"title":"Screenshot testing en Android","emoji":"📸","summary":"Jorge Barroso de Karumi nos explicará cómo y qué aporta hacer Screenshot Testing en Android. Veremos desde cómo empezar a escribir nuestros primeros tests, hasta algunos trucos a tener en cuenta pasando por la integración continua.","authors":["jorge-barroso","sergio-gutierrez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["mobile"],"sticker":"/img/cursos/screenshot-testing-en-android.png","slug":"screenshot-testing-en-android","color":"pink","url":"https://pro.codely.com/library/screenshot-testing-en-android-f1bc7a25/about/"},{"title":"UI Testing en Android con Espresso","emoji":"🎨","summary":"En el mundo mobile la parte más importante y grande que debemos cubrir con tests es la interfaz de usuario. En este curso aprenderemos las claves para escribir buenos tests de UI con Jorge Barroso de Karumi.","authors":["jorge-barroso","sergio-gutierrez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["mobile"],"sticker":"/img/cursos/ui-testing-en-android-con-espresso.png","slug":"ui-testing-en-android-con-espresso","color":"yellow","url":"https://pro.codely.com/library/ui-testing-en-android-con-espresso/about/"},{"title":"AWS EC2: Tu primer deploy","emoji":"☁️","summary":"Aprende las bases de Amazon Web Services para levantar tu aplicación en la nube. Crea tu propia VPC, elige la instancia adecuada de EC2, configura SSH, elige tu AMI base, define Security Groups, deploya, y configura Route53 como DNS!","authors":["jose-armesto"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["devops"],"sticker":"/img/cursos/aws-deploy-en-ec2.png","slug":"aws-deploy-en-ec2","color":"green","url":"https://pro.codely.com/library/aws-deploy-en-ec2/about/"},{"title":"Agile: Cómo mejorar tus retrospectivas","emoji":"🤝","summary":"A pesar de parecer simple, llevar a cabo buenas retrospectivas no siempre es fácil. En este curso José Huerta de Smoking Brains nos explicará cómo mejorar.","authors":["jose-rodriguez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/agile-retrospectivas.png","slug":"agile-retrospectivas","color":"pink","url":"https://pro.codely.com/library/agile-retrospectivas/about/"},{"title":"CQRS: Command Query Responsibility Segregation","emoji":"🚌","summary":"Aumenta el rendimiento y el desacoplamiento de tu backend mediante CQRS. Veremos conceptos e implementaciones de buses síncronos y asíncronos.","authors":["javier-ferrer","rafa-gomez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/cqrs-command-query-responsibility-segregation.png","slug":"cqrs-command-query-responsibility-segregation","color":"violet","url":"https://pro.codely.com/library/cqrs-command-query-responsibility-segregation-3719e4aa/about/"}] 2 | -------------------------------------------------------------------------------- /02-jq/2-combine_filter_json/_output.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "titulo": "💎 API HTTP en Kotlin aplicando Arquitectura Hexagonal", 4 | "titulo_largo": "si" 5 | }, 6 | { 7 | "titulo": "🛰 DDD en TypeScript: Comunicación entre servicios y aplicaciones", 8 | "titulo_largo": "si" 9 | }, 10 | { 11 | "titulo": "🪆 Desarrolla plugins de Figma con TypeScript", 12 | "titulo_largo": "no" 13 | }, 14 | { 15 | "titulo": "🔷 DDD en TypeScript: Modelado y arquitectura", 16 | "titulo_largo": "no" 17 | }, 18 | { 19 | "titulo": "🧹 Refactoring de Code Smells a Clean Code: Change Preventers", 20 | "titulo_largo": "si" 21 | }, 22 | { 23 | "titulo": "⛳ API HTTP en Go aplicando Arquitectura Hexagonal", 24 | "titulo_largo": "no" 25 | }, 26 | { 27 | "titulo": "🐘 PHP 8: Novedades y ejemplos para el Mundo Real™", 28 | "titulo_largo": "no" 29 | }, 30 | { 31 | "titulo": "✌️ Vue 3: Novedades aplicadas al mundo real", 32 | "titulo_largo": "no" 33 | }, 34 | { 35 | "titulo": "🧼 Refactoring de Code Smells a Clean Code: Bloaters", 36 | "titulo_largo": "no" 37 | }, 38 | { 39 | "titulo": "👁‍🗨 Visualiza métricas de Prometheus con Grafana", 40 | "titulo_largo": "no" 41 | }, 42 | { 43 | "titulo": "💻 Bash para el día a día: Scripting & Productividad", 44 | "titulo_largo": "no" 45 | }, 46 | { 47 | "titulo": "💨 Productividad con iTerm: Terminal macOS", 48 | "titulo_largo": "no" 49 | }, 50 | { 51 | "titulo": "🤖 Automatiza tu flujo de trabajo con GitHub Actions", 52 | "titulo_largo": "no" 53 | }, 54 | { 55 | "titulo": "🤖 Integración Continua con GitHub Actions", 56 | "titulo_largo": "no" 57 | }, 58 | { 59 | "titulo": "✅ Testing: Introducción y buenas prácticas", 60 | "titulo_largo": "no" 61 | }, 62 | { 63 | "titulo": "💬 Comunicación entre microservicios: Event-Driven Architecture", 64 | "titulo_largo": "si" 65 | }, 66 | { 67 | "titulo": "ƛ Programación funcional: Refactor de OO a TypeClasses", 68 | "titulo_largo": "si" 69 | }, 70 | { 71 | "titulo": "🤹 CQRS y Event Sourcing con Kotlin y Axon Framework", 72 | "titulo_largo": "no" 73 | }, 74 | { 75 | "titulo": "📈 AWS: Escalando apps - Load Balancers y Auto Scaling Groups", 76 | "titulo_largo": "si" 77 | }, 78 | { 79 | "titulo": "🛡️ Crea una app MEAN profesional con AngularJS y Webpack", 80 | "titulo_largo": "si" 81 | }, 82 | { 83 | "titulo": "🍄 Testing unidirectional dataflow con Vuex y Jest", 84 | "titulo_largo": "no" 85 | }, 86 | { 87 | "titulo": "✌️ Crea una app con VueJS y Jest aplicando TDD", 88 | "titulo_largo": "no" 89 | }, 90 | { 91 | "titulo": "🚌 CQRS: Command Query Responsibility Segregation", 92 | "titulo_largo": "no" 93 | } 94 | ] 95 | -------------------------------------------------------------------------------- /02-jq/2-combine_filter_json/execute.sh: -------------------------------------------------------------------------------- 1 | jq '[.[] | {titulo: (.emoji + " " + .title), titulo_largo: (if .title | length > 50 then "si" else "no" end)} | select(.titulo | length > 40)]' "$PWD/_input.json" 2 | -------------------------------------------------------------------------------- /02-jq/2-combine_filter_json/test.sh: -------------------------------------------------------------------------------- 1 | source "../../_shared/compare_json.sh" 2 | 3 | it_should_output_the_expected_json "$PWD/execute.sh" "$PWD/_output.json" 4 | -------------------------------------------------------------------------------- /02-jq/3-aggregate_sort_json/README.md: -------------------------------------------------------------------------------- 1 | # 🔥 Challenge 2 | 3 | We want to check if there are any course emojis repeated in our input data. In order to do so: 4 | 5 | 1. Format the courses JSON array input to the following schema. That is, group the courses array by their emoji and provide some useful information: 6 | ```json 7 | [ 8 | { 9 | "emoji": $EMOJI, 10 | "total": $TOTAL, 11 | "courses": [ 12 | $COURSE_1_TITLE, 13 | $COURSE_2_TITLE, 14 | … 15 | ] 16 | }, 17 | … 18 | ] 19 | ``` 20 | Properties: 21 | * `$EMOJI`: The `.emoji` value that we grouped by 22 | * `$TOTAL`: Number of times that emoji appears as a course emoji 23 | * `$COURSE_TITLES`: Array containing the courses titles of the courses that have that emoji set 24 | 2. Sort the output array prioritizing the emojis with more appearances 25 | 3. Filter out the output array in order to only keep the emojis that appear more than once 26 | -------------------------------------------------------------------------------- /02-jq/3-aggregate_sort_json/_input.json: -------------------------------------------------------------------------------- 1 | [{"title":"React de 0 aplicando buenas prácticas","emoji":"🎛️","summary":"Introdúcete en React desde 0 creando tu developer dashboard personal dónde podrás consultar las métricas de tus repositorios favoritos.","authors":["isma-navarro","javier-ferrer"],"releaseDate":{"start":"2022-11-17","end":"2022-12-29"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/react-desde-0.png","slug":"react-desde-0","color":"yellow","url":"https://pro.codely.com/library/react-de-0-aplicando-buenas-practicas-192069/about/"},{"title":"API HTTP en Kotlin aplicando Arquitectura Hexagonal","emoji":"💎","summary":"Aprende a desarrollar tu primera API HTTP en Kotlin aplicando algunos de los fundamentos de la Arquitectura Hexagonal.","authors":["isa-garrido","rafa-gomez"],"releaseDate":{"start":"2022-10-27","end":"2022-11-24"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/api-kotlin-hexagonal.png","slug":"api-http-en-kotlin-aplicando-arquitectura-hexagonal","color":"green","url":"https://pro.codely.com/library/api-http-en-kotlin-aplicando-arquitectura-hexagonal-189116/456277/about/"},{"title":"DDD en TypeScript: Comunicación entre servicios y aplicaciones","emoji":"🛰","summary":"Comunica servicios y aplicaciones usando Domain-Driven Design (DDD) y TypeScript y consigue así que el software y los equipos escalen de forma progresiva.","authors":["fernando-vilas","ruben-salado","dani-santamaria"],"releaseDate":{"start":"2022-10-06","end":"2022-11-03"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/ddd-en-typescript-eda.png","slug":"ddd-en-typescript-comunicacion-entre-servicios-y-aplicaciones","color":"pink","url":"https://pro.codely.com/library/ddd-en-typescript-comunicacion-entre-servicios-y-aplicaciones-189024/449177/about/"},{"title":"Linting en JavaScript y TypeScript","emoji":"🔦","summary":"Aprende a sacarle todo el partido a ESLint para llevar tu código al siguiente nivel.","authors":["nuria-soriano","rafa-gomez"],"releaseDate":{"start":"2022-09-09","end":"2022-09-22"},"tags":[],"categories":["tooling","frontend","backend"],"sticker":"/img/cursos/linting-js-ts.png","slug":"linting-en-javascript-y-typescript","color":"yellow","url":"https://pro.codely.com/library/linting-en-javascript-y-typescript-188432/446893/about/"},{"title":"Desarrolla plugins de Figma con TypeScript","emoji":"🪆","summary":"Ves un paso más allá y desarrolla plugins mantenibles, escalables y testables para figma con TypeScript. Diseño y desarrollo se dan la mano.","authors":["carmen-ansio","javier-ferrer"],"releaseDate":{"start":"2022-08-31","end":"2022-09-30"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/plugins-figma.png","slug":"desarrolla-plugins-de-figma-mantenibles-con-typescript","color":"violet","url":"https://pro.codely.com/library/desarrolla-plugins-de-figma-mantenibles-con-typescript-187373/about/"},{"title":"Patrones de Diseño de Comportamiento","emoji":"🐝","summary":"Aprende las implicaciones a nivel de SOLID y de mantenimiento de los Patrones de Diseño de Comportamiento.","authors":["dani-santamaria","rafa-gomez"],"releaseDate":{"start":"2022-07-07","end":"2022-08-03"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/patrones-comportamiento.png","slug":"patrones-de-comportamiento","color":"green","url":"https://pro.codely.com/library/patrones-de-diseno-de-comportamiento-185034/about/"},{"title":"TypeScript Avanzado: Más alla de any","emoji":"🚜","summary":"En este curso vamos a sentar las bases de TypeScript avanzado con el objetivo de ir estableciendo los conocimientos básicos para futuros cursos en los que profundizaremos más en otros aspectos de esta herramienta de desarrollo.","authors":["isma-navarro","javier-ferrer"],"releaseDate":{"start":"2022-05-25","end":"2022-06-08"},"tags":[],"categories":["frontend","backend"],"sticker":"/img/cursos/typescript-avanzado.png","slug":"typescript-avanzando","color":"pink","url":"https://pro.codely.com/library/typescript-avanzado-mas-alla-de-any-182513/about/"},{"title":"Maquetando la web de Codely desde 0","emoji":"🍍","summary":"Llevaremos un diseño en Figma a una web en producción, con un design system escalable y teniendo en cuenta performance, SEO, y accesibilidad.","authors":["nuria-soriano","rafa-gomez"],"releaseDate":{"start":"2022-05-18","end":"2022-06-15"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/maquetando-la-web-de-codely.png","slug":"maquetando-la-web-de-codely-desde-0","color":"yellow","url":"https://pro.codely.com/library/maquetando-la-web-de-codely-desde-0-181753/"},{"title":"Gestión de logs con Loki y Grafana","emoji":"🏵️","summary":"Aprende a gestionar tus logs con Grafana y Loki, las buenas prácticas y cómo se diferencia del stack de ELKi","authors":["joan-lopez-de-la-franca","rafa-gomez"],"releaseDate":{"start":"2022-03-24","end":"2022-04-20"},"tags":[],"categories":["backend","devops"],"sticker":"/img/cursos/gestion-de-logs-con-loki-y-grafana.png","slug":"gestion-de-logs-con-loki-y-grafana","color":"pink","url":"https://pro.codely.com/library/gestion-de-logs-con-loki-y-grafana-179996/407529/about/"},{"title":"Entrevistas sobre eXtreme Programming","emoji":"🎤","summary":"Contenido adicional del curso de eXtreme Programming","authors":["nino-dafonte"],"releaseDate":{"start":"2022-04-01","end":"2022-04-01"},"tags":[],"categories":["metodologias-buenas-practicas"],"sticker":"/img/cursos/entrevistas-sobre-extreme-programming.png","slug":"entrevistas-sobre-extreme-programming","color":"green","url":"https://pro.codely.com/library/entrevistas-sobre-extreme-programming-179419/about/"},{"title":"TDD: Test-Driven Development","emoji":"♻️","summary":"Aprende Test-Driven Development (TDD) y las diferentes formas y estilos de aplicarlo en aplicaciones del Mundo Real™️","authors":["dani-santamaria","javier-ferrer"],"releaseDate":{"start":"2022-03-24","end":"2022-04-20"},"tags":[],"categories":["arquitectura-software","metodologias-buenas-practicas"],"sticker":"/img/cursos/tdd.png","slug":"tdd","color":"violet","url":"https://pro.codely.com/library/tdd-test-driven-development-179143/"},{"title":"Directos exclusivos CodelyTV Pro","emoji":"🎥","summary":"Directos exclusivos resolviendo dudas, teniendo debates, y preparando siguientes cursos en base a vuestro feedback","authors":["javier-ferrer","rafa-gomez","isma-navarro","dani-santamaria","nino-dafonte","nuria-soriano"],"releaseDate":{"start":"2021-05-26","end":"2022-03-11"},"tags":[],"categories":["arquitectura-software","frontend","backend"],"sticker":"/img/cursos/pro-streaming.png","slug":"pro-streaming","color":"violet","url":"https://pro.codely.com/library/directos-exclusivos-codelytv-pro-166172/about/"},{"title":"Setup macOS para Programar","emoji":"","summary":"Configura tu ordenador con Mac tal y cómo lo tienen Nino y Rafa para programar lo más cómodamente posible.","authors":["nino-dafonte","rafa-gomez"],"releaseDate":{"start":"2022-03-03","end":"2022-03-16"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/setup-mac.png","slug":"setup-mac","color":"yellow","url":"https://pro.codely.com/library/setup-macos-para-programar-178003/"},{"title":"Lightning Talks","emoji":"⚡","summary":"Charlas de 10-20 minutos sobre temas variados. Hasta ahora eran internas al equipo Codely, pero… si a nosotros nos aportan valor, puede que a ti también","authors":["nuria-soriano"],"releaseDate":{"start":"2022-02-16","end":"2022-02-16"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/lightning-talks.png","slug":"lightning-talks","color":"green","url":"https://pro.codely.com/library/lightning-talks-177049/about/"},{"title":"eXtreme Programming","emoji":"🧑‍🔬","summary":"Descubre las prácticas de eXtreme Programming y su aplicación en el Mundo Real™","authors":["nino-dafonte","dani-santamaria"],"releaseDate":{"start":"2022-01-26","end":"2022-02-23"},"tags":[],"categories":["metodologias-buenas-practicas"],"sticker":"/img/cursos/extreme-programming.png","slug":"extreme-programming","color":"pink","url":"https://pro.codely.com/library/extreme-programming-171308"},{"title":"Introducción a Kotlin: Tu primera app","emoji":"🐈","summary":"Desarrolla tu primer comando de consola con Kotlin mientras aprendes qué hace tan potente a este lenguaje.","authors":["isa-garrido","rafa-gomez"],"releaseDate":{"start":"2022-01-05","end":"2022-02-03"},"tags":[],"categories":["backend"],"sticker":"/img/cursos/introduccion-a-kotlin.png","slug":"introduccion-a-kotlin","color":"yellow","url":"https://pro.codely.com/library/introduccion-a-kotlin-tu-primera-app-174088/"},{"title":"DDD en TypeScript: Modelado y arquitectura","emoji":"🔷","summary":"Crea paso a paso tu aplicación TypeScript siguiendo Domain-Driven Design.","authors":["fernando-vilas","ruben-salado","javier-ferrer"],"releaseDate":{"start":"2021-11-24","end":"2021-12-22"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/ddd-en-typescript-modelado-arquitectura.png","slug":"ddd-en-typescript-modelado-arquitectura","color":"violet","url":"https://pro.codely.com/library/ddd-en-typescript-modelado-y-arquitectura-172533"},{"title":"Auditorías y Acompañamientos","emoji":"🐷","summary":"Sesión de auditoría en la que se revisa el diseño y arquitectura de software de una parte de tus sistemas y de Acompañamiento dónde te ayudamos a mejorar tu aprendizaje","authors":["javier-ferrer","rafa-gomez"],"releaseDate":{"start":"2021-11-26","end":"2022-07-27"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/auditoria-acompanamientos.png","slug":"auditoria-acompanamientos","color":"green","url":"https://pro.codely.com/library/auditorias-y-acompanamientos-172662/375960/about/"},{"title":"Gestión de Estado en React","emoji":"🍥","summary":"Conoce las distintas herramientas con la que puedes gestionar el estado en tu aplicación React.","authors":["isma-navarro","javier-ferrer","ricardo-borillo"],"releaseDate":{"start":"2021-11-03","end":"2021-12-01"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/gestion-estado-react.png","slug":"gestion-estado-react","color":"yellow","url":"https://pro.codely.com/library/gestion-estado-en-react/"},{"title":"Web performance","emoji":"🌪️","summary":"Aprende a optimizar tus aplicaciones web y a crear una cultura de performance para mantenerla a largo plazo.","authors":["nino-dafonte","nuria-soriano"],"releaseDate":{"start":"2021-09-29","end":"2021-10-27"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/web-performance.png","slug":"web-performance","color":"pink","url":"https://pro.codely.com/library/web-performance-168675/"},{"title":"Patrones de Diseño: Creacionales","emoji":"🏭","summary":"Aprende las implicaciones a nivel de SOLID y de mantenimiento de los Patrones de Diseño Creacionales.","authors":["dani-santamaria","javier-ferrer"],"releaseDate":{"start":"2021-09-08","end":"2021-10-06"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/patrones-diseno-creacionales.png","slug":"patrones-diseno-creacionales","color":"violet","url":"https://pro.codely.com/library/patrones-de-diseno-creacionales-167860/"},{"title":"CSS Flex a fondo","emoji":"🤸","summary":"Aprende a sacar todo el potencial de CSS Flex para crear layouts adaptables fácilmente.","authors":["isma-navarro","rafa-gomez"],"releaseDate":{"start":"2021-09-01","end":"2021-09-15"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/css-flex.png","slug":"css-flex","color":"green","url":"https://pro.codely.com/library/css-flex-a-fondo/"},{"title":"De JavaScript a TypeScript","emoji":"🏗️","summary":"Aprende TypeScript partiendo de un ejemplo de JavaScript en el que haremos el proceso de refactor poco a poco y analizando las principales características de TypeScript.","authors":["isma-navarro","rafa-gomez","nuria-soriano"],"releaseDate":{"start":"2021-06-14","end":"2021-07-28"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/de-javascript-a-typescript.png","slug":"de-javascript-a-typescript","color":"yellow","url":"https://pro.codely.com/library/de-javascript-a-typescript-128106/"},{"title":"Symfony mantenible y escalable","emoji":"🎶","summary":"Aprende herramientas y prácticas con Symfony para conseguir una mayor mantenibilidad y escalabilidad de tus aplicaciones.","authors":["dani-santamaria","javier-ferrer"],"releaseDate":{"start":"2021-06-10","end":"2021-07-05"},"tags":[],"categories":["backend"],"sticker":"/img/cursos/symfony-mantenible-escalable.png","slug":"symfony-mantenible-escalable","color":"pink","url":"https://pro.codely.com/library/symfony-mantenible-y-escalable-127478/"},{"title":"CSS Grid a fondo","emoji":"🍱","summary":"Aprende a sacar provecho de CSS Grid para crear layouts flexibles sin necesidad de recurrir a frameworks.","authors":["nuria-soriano","rafa-gomez","isma-navarro"],"releaseDate":{"start":"2021-06-02","end":"2021-06-16"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/css-grid.png","slug":"css-grid","color":"violet","url":"https://pro.codely.com/library/css-grid-a-fondo-126731/"},{"title":"Setup Linux para Programar","emoji":"🐧","summary":"Configura tu ordenador con Linux tal y cómo lo tiene Dani para programar lo más cómodamente posible.","authors":["dani-santamaria","rafa-gomez"],"releaseDate":{"start":"2021-05-13","end":"2021-05-26"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/setup-linux.png","slug":"setup-linux","color":"green","url":"https://pro.codely.com/library/setup-linux-para-programar-124104/"},{"title":"JavaScript moderno","emoji":"🐥","summary":"Aprende buenas prácticas para empezar aplicaciones JavaScript vanilla desde 0 y refactorizar código legacy dando soporte a navegadores antiguos.","authors":["nuria-soriano","javier-ferrer","isma-navarro"],"releaseDate":{"start":"2021-04-07","end":"2021-05-19"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/javascript-moderno.png","slug":"javascript-moderno","color":"yellow","url":"https://pro.codely.com/library/js-moderno/about/"},{"title":"Refactoring de Code Smells a Clean Code: Change Preventers","emoji":"🧹","summary":"Aprende a detectar y lidiar con código que genera aversión al cambio. Curso centrado en Code Smells de tipo Change Preventers.","authors":["javier-ferrer","rafa-gomez","dani-santamaria"],"releaseDate":{"start":"2021-04-15","end":"2021-04-28"},"tags":[],"categories":["arquitectura-software","metodologias-buenas-practicas"],"sticker":"/img/cursos/refactoring-change-preventers.png","slug":"refactoring-change-preventers","color":"pink","url":"https://pro.codely.com/library/refactoring-change-preventers/about/"},{"title":"Light & Dark themes accesibles","emoji":"🌚🌝","summary":"Aprende a implementar temas claros y oscuros en una página web de forma accesible, cómo integrarlo en tu arquitectura CSS y cómo adaptar los diseños para que te queden unos temas finísimos.","authors":["nuria-soriano","rafa-gomez"],"releaseDate":{"start":"2021-03-03","end":"2021-03-17"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/light-dark-themes-accesibles.png","slug":"light-dark-themes-accesibles","color":"violet","url":"https://pro.codely.com/library/light-dark-themes-accesibles/about/"},{"title":"API HTTP en Go aplicando Arquitectura Hexagonal","emoji":"⛳","summary":"Aprende a desarrollar tu primera API HTTP en Go aplicando algunos de los fundamentos de la Arquitectura Hexagonal.","authors":["adrian-perez","joan-lopez-de-la-franca","javier-ferrer"],"releaseDate":{"start":"2021-01-27","end":"2021-02-24"},"tags":[],"categories":["backend","arquitectura-software"],"sticker":"/img/cursos/api-go-hexagonal.png","slug":"api-go-hexagonal","color":"yellow","url":"https://pro.codely.com/library/api-go-hexagonal/about/"},{"title":"Testing en frontend","emoji":"🐙","summary":"Aprende cómo testear tus aplicaciones frontend, aplicando buenas prácticas para conseguir unos tests mantenibles que aporten confianza.","authors":["nuria-soriano","javier-ferrer"],"releaseDate":{"start":"2021-01-21","end":"2021-02-17"},"tags":[],"categories":["frontend","metodologias-buenas-practicas"],"sticker":"/img/cursos/testing-frontend.png","slug":"testing-frontend","color":"green","url":"https://pro.codely.com/library/testing-frontend/about/"},{"title":"Karabiner: Atajos de teclado para todo","emoji":"🎱","summary":"¡Automatiza todo en tu mac a golpe de atajos de teclado y mejor tu productividad!","authors":["rafa-gomez"],"releaseDate":{"start":"2021-01-13","end":"2021-01-13"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/karabiner.png","slug":"karabiner","color":"yellow","url":"https://pro.codely.com/library/karabiner/about/"},{"title":"Arquitectura CSS","emoji":"🗼","summary":"Aprende los fundamentos de una buena arquitectura CSS para que tus estilos sean fáciles de mantener y escalar.","authors":["nuria-soriano","rafa-gomez"],"releaseDate":{"start":"2020-11-25","end":"2020-12-24"},"tags":[],"categories":["frontend","arquitectura-software"],"sticker":"/img/cursos/arquitectura-css.png","slug":"arquitectura-css","color":"pink","url":"https://pro.codely.com/library/arquitectura-css/about/"},{"title":"PHP 8: Novedades y ejemplos para el Mundo Real™","emoji":"🐘","summary":"Migra tus aplicaciones a PHP 8 paso a paso, consigue tests más mantenibles gracias a Named Arguments, Value Objects más simples con Constructor Property Promotion, reemplaza PECL (obsoleto), y mucho más.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2020-11-18","end":"2020-12-02"},"tags":[],"categories":["backend"],"sticker":"/img/cursos/php-8.png","slug":"php-8","color":"violet","url":"https://pro.codely.com/library/php-8/about/"},{"title":"Vue 3: Novedades aplicadas al mundo real","emoji":"✌️","summary":"Veremos cómo exprimir las novedades de Vue 3 con ejemplos reales y aplicando buenas prácticas.","authors":["nuria-soriano","javier-ferrer"],"releaseDate":{"start":"2020-10-28","end":"2020-11-11"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/novedades-vue-3.png","slug":"novedades-vue-3","color":"green","url":"https://pro.codely.com/library/novedades-vue-3/about/"},{"title":"Buenas prácticas con CSS: Layouts","emoji":"📐","summary":"","authors":["nuria-soriano","rafa-gomez"],"releaseDate":{"start":"2020-10-01","end":"2020-10-16"},"tags":[],"categories":["frontend","metodologias-buenas-practicas"],"sticker":"/img/cursos/layouts-css.png","slug":"layouts-css","color":"yellow","url":"https://pro.codely.com/library/layouts-css/about/"},{"title":"Refactoring de Code Smells a Clean Code: Bloaters","emoji":"🧼","summary":"Aprende a detectar y lidiar con código incomprensible 🤟","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2020-09-24","end":"2020-10-22"},"tags":[],"categories":["arquitectura-software","metodologias-buenas-practicas"],"sticker":"/img/cursos/refactoring-code-smells-clean-code-bloaters.png","slug":"refactoring-code-smells-clean-code-bloaters","color":"pink","url":"https://pro.codely.com/library/refactoring-code-smells-clean-code-bloaters/about/"},{"title":"Teclados Mecánicos","emoji":"⌨️","summary":"Monta tu teclado perfecto y personalizado al 100%","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2020-09-16","end":"2020-09-30"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/teclados-mecanicos.png","slug":"teclados-mecanicos","color":"yellow","url":"https://pro.codely.com/library/teclados-mecanicos/about/"},{"title":"Makefiles","emoji":"🐂","summary":"El centralizar tareas de nuestras aplicaciones es algo muy importante, y con los Makefiles se simplifica mucho.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2020-08-19","end":"2020-09-02"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/makefiles.png","slug":"makefiles","color":"green","url":"https://pro.codely.com/library/makefiles/about/"},{"title":"Monitoring con Prometheus","emoji":"🔥","summary":"La observabilidad es una de las cosas más importantes de la programación y el Monitoring uno de sus principales pilares.","authors":["ruben-cougil","rafa-gomez"],"releaseDate":{"start":"2020-08-12","end":"2020-08-26"},"tags":[],"categories":["devops"],"sticker":"/img/cursos/prometheus.png","slug":"prometheus","color":"violet","url":"https://pro.codely.com/library/prometheus/about/"},{"title":"Visualiza métricas de Prometheus con Grafana","emoji":"👁‍🗨","summary":"Aprende a crear un panel de 10 utilizando Grafana con Prometheus como datasource.","authors":["ruben-cougil","rafa-gomez"],"releaseDate":{"start":"2020-08-12","end":"2020-08-26"},"tags":[],"categories":["devops"],"sticker":"/img/cursos/grafana-con-prometheus.png","slug":"grafana-con-prometheus","color":"yellow","url":"https://pro.codely.com/library/curso-grafana-con-prometheus/about/"},{"title":"Notion: Productividad en equipo","emoji":"🌈","summary":"Centraliza toda la documentación de tu equipo de trabajo y la gestión de tareas en 1 única herramienta: Notion.","authors":["javier-ferrer"],"releaseDate":{"start":"2020-05-22","end":"2020-07-31"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/notion.png","slug":"notion","color":"green","url":"https://pro.codely.com/library/notion/about/"},{"title":"Bash para el día a día: Scripting & Productividad","emoji":"💻","summary":"Aprende a usar la navaja suiza de los programadores 😬","authors":["rafa-gomez"],"releaseDate":{"start":"2020-05-29","end":"2020-06-10"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/bash.png","slug":"bash","color":"yellow","url":"https://pro.codely.com/library/curso-bash/about/"},{"title":"Todo sobre los dotfiles","emoji":"🚀","summary":"Aprende a automatizar, centralizar y compartir todas tus configuraciones gracias a los dotfiles.","authors":["rafa-gomez"],"releaseDate":{"start":"2020-04-23","end":"2020-05-07"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/todo-sobre-los-dotfiles.png","slug":"todo-sobre-los-dotfiles","color":"pink","url":"https://pro.codely.com/library/todo-sobre-los-dotfiles/about/"},{"title":"Productividad con iTerm: Terminal macOS","emoji":"💨","summary":"Veremos cómo tener una terminal rapidísima y muy productiva gracias a unos simple (y escondidos) tips.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2020-04-23","end":"2020-05-07"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/iterm.png","slug":"iterm","color":"yellow","url":"https://pro.codely.com/library/iterm/about/"},{"title":"Automatiza tu flujo de trabajo con GitHub Actions","emoji":"🤖","summary":"Crearemos nuestras propias actions (¡hasta publicaremos alguna en el Marketplace!) que nos puedan ser muy útiles en nuestro día a día.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2020-03-04","end":"2020-04-08"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/automatizacion-con-github-actions.png","slug":"automatizacion-con-github-actions","color":"violet","url":"https://pro.codely.com/library/automatizacion-con-github-actions/about/"},{"title":"Terminal 100% productiva con Zsh","emoji":"💻","summary":"Consigue ser un Productivity Raptor™ con tu terminal gracias a Zsh, Oh My Zsh, Zim y funciones avanzadas.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2020-03-04","end":"2020-04-08"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/terminal-zsh.png","slug":"terminal-zsh","color":"green","url":"https://pro.codely.com/library/terminal-zsh/about/"},{"title":"Integración Continua con GitHub Actions","emoji":"🤖","summary":"¡Consigue una Integración Continua de la que te puedas fiar y que sea rapidísima! Gracias a GitHub Actions veremos como lograrlo.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2020-03-04","end":"2020-04-08"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/github-actions-de-0-a-integracion-continua.png","slug":"github-actions-de-0-a-integracion-continua","color":"pink","url":"https://pro.codely.com/library/github-actions-de-0-a-integracion-continua/about/"},{"title":"Exprimiendo IntelliJ","emoji":"⚡","summary":"¡Mejora tu productividad exprimiendo IntelliJ! Consigue un aspecto minimalista, crea ficheros con plantillas personalizadas, atajos secretos, y mucho más.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2020-03-04","end":"2020-04-08"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/intellij.png","slug":"intellij","color":"yellow","url":"https://pro.codely.com/library/intellij/about/"},{"title":"DDD en Java","emoji":"☕","summary":"Crea paso a paso tu aplicación Java siguiendo Domain-Driven Design. Estructura de carpetas, integración con BD, sistema de colas, CQRS y más.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2019-09-19","end":"2019-12-31"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/ddd-en-java.png","slug":"ddd-en-java","color":"green","url":"https://pro.codely.com/library/ddd-en-java/about/"},{"title":"DDD en PHP","emoji":"🐘","summary":"Crea paso a paso tu aplicación PHP siguiendo Domain-Driven Design. Estructura de carpetas, integración con BD, sistema de colas, CQRS y más.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2019-07-30","end":"2019-08-28"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/ddd-en-php.png","slug":"ddd-en-php","color":"pink","url":"https://pro.codely.com/library/ddd-en-php/about/"},{"title":"Git: Introducción y trabajo en equipo","emoji":"🔀","summary":"Aprende a trabajar en equipo con Git y sacarle todo el provecho con aspectos avanzados como debugging, estrategias de merge, y mucho más.","authors":["rafa-gomez","javier-ferrer"],"releaseDate":{"start":"2019-06-26","end":"2019-08-07"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/git-introduccion-y-trabajo-en-equipo.png","slug":"git-introduccion-y-trabajo-en-equipo","color":"green","url":"https://pro.codely.com/library/git-introduccion-y-trabajo-en-equipo/about/"},{"title":"Testing: Introducción y buenas prácticas","emoji":"✅","summary":"Aprende qué aporta el testing, cómo testear y buenas prácticas para evitar que mantener tus tests sea un infierno con ejemplos de El Mundo Real™","authors":["javier-ferrer","rafa-gomez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["arquitectura-software","metodologias-buenas-practicas"],"sticker":"/img/cursos/testing-introduccion-y-buenas-practicas.png","slug":"testing-introduccion-y-buenas-practicas","color":"yellow","url":"https://pro.codely.com/library/testing-introduccion-y-buenas-practicas/about/"},{"title":"Introducción a Go: Tu primera app","emoji":"⚡","summary":"Desarrolla tu primer comando de consola con Go mientras aprendes qué hace diferente al lenguaje de moda.","authors":["joan-lopez-de-la-franca","adrian-perez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["backend"],"sticker":"/img/cursos/introduccion-a-go-tu-primera-app.png","slug":"introduccion-a-go-tu-primera-app","color":"violet","url":"https://pro.codely.com/library/introduccion-a-go-tu-primera-app/about/"},{"title":"Domain-Driven Design","emoji":"🗿","summary":"Aprende a modelar tus aplicaciones centrándote en tu dominio, definir Bounded Contexts, agregados, value objects, y mucho más. Todo de forma práctica y con ejemplos de código","authors":["javier-ferrer","rafa-gomez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/domain-driven-design-ddd.png","slug":"domain-driven-design-ddd","color":"pink","url":"https://pro.codely.com/library/domain-driven-design-ddd/about/"},{"title":"ReactJS: De 0 a deploy","emoji":"⚛️","summary":"Crea tu primera aplicación de React llevándola hasta producción y siguiendo buenas prácticas","authors":["dani-martin"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/reactjs-de-0-a-deploy.png","slug":"reactjs-de-0-a-deploy","color":"yellow","url":"https://pro.codely.com/library/reactjs-de-0-a-deploy-siguiendo-buenas-practicas/about/"},{"title":"Kubernetes para desarrolladores","emoji":"⛵","summary":"Aprende a orquestrar contenedores de Docker y desplegarlos en Azure, GCE, o AWS siguiendo buenas prácticas","authors":["jose-armesto"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["devops"],"sticker":"/img/cursos/kubernetes-para-desarrolladores.png","slug":"kubernetes-para-desarrolladores","color":"violet","url":"https://pro.codely.com/library/kubernetes-para-desarrolladores/about/"},{"title":"Migrando a VueJS progresivamente","emoji":"♻️️","summary":"Aprende cómo migrar un frontend ya existente a Vue.js partiendo de HTML, CSS y JS generado por backend","authors":["juanma-garrido"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/migrando-a-vuejs-progresivamente-desde-0.png","slug":"migrando-a-vuejs-progresivamente-desde-0","color":"green","url":"https://pro.codely.com/library/migrando-a-vuejs-progresivamente-desde-0/about/"},{"title":"ELK: Centraliza logs con Elastic Stack","emoji":"📊","summary":"Aprende a montar un stack para poder explotar toda la información de tus logs gracias a Elasticsearch, Logstash o Beats, y Kibana","authors":["ruben-cougil","javier-ferrer"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["devops","backend"],"sticker":"/img/cursos/elkbeats-centraliza-la-gestion-de-logs-con-the-elastic-stack.png","slug":"elkbeats-centraliza-la-gestion-de-logs-con-the-elastic-stack","color":"yellow","url":"https://pro.codely.com/library/elkbeats-centraliza-la-gestion-de-logs-con-the-elastic-stack/about/"},{"title":"Principios SOLID aplicados","emoji":"🧱","summary":"Si ya sabes desarrollar software, pero quieres ir un paso más allá y mejorar la calidad de tu código, este es tu curso","authors":["javier-ferrer","rafa-gomez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/principios-solid-aplicados.png","slug":"principios-solid-aplicados","color":"pink","url":"https://pro.codely.com/library/principios-solid-aplicados/about/"},{"title":"Comunicación entre microservicios: Event-Driven Architecture","emoji":"💬","summary":"Publica y consume eventos de dominio, consistencia eventual, RabbitMQ y AWS SNS-SQS, migración de monolito a servicios, y mucho más.","authors":["javier-ferrer","rafa-gomez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/comunicacion-entre-microservicios-event-driven-architecture.png","slug":"comunicacion-entre-microservicios-event-driven-architecture","color":"green","url":"https://pro.codely.com/library/comunicacion-entre-microservicios-event-driven-architecture/about/"},{"title":"Programación funcional: Refactor de OO a TypeClasses","emoji":"ƛ","summary":"Introducción a la programación funcional pura en Scala y a sus ventajas de la mano de las type classes.","authors":["juan-manuel-serrano","javier-fuentes"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["backend"],"sticker":"/img/cursos/programacion-funcional-refactorizando-codigo-orientado-a-objetos-con-typeclasses.png","slug":"programacion-funcional-refactorizando-codigo-orientado-a-objetos-con-typeclasses","color":"yellow","url":"https://pro.codely.com/library/programacion-funcional-refactorizando-codigo-orientado-a-objetos-con-typeclasses/about/"},{"title":"Docker: De 0 a deploy","emoji":"🐳","summary":"Aprende qué es Docker y cómo sacar el mayor partido a los contenedores. Empezando desde el principio, veremos cómo usar Docker para levantar tu aplicación en local como si fuese producción, arrancando una base de datos con Docker Compose.","authors":["jose-armesto"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["devops"],"sticker":"/img/cursos/docker-de-0-a-deployment.png","slug":"docker-de-0-a-deployment","color":"violet","url":"https://pro.codely.com/library/docker-de-0-a-deployment/about/"},{"title":"Exprimiendo las vistas de Android","emoji":"🖌️","summary":"Aprenderás a diseñar en Android cualquier diseño que te propongas. Empezando desde la base, iremos analizando todos los componentes hasta llegar a conceptos avanzados para que no se te resista ningún reto.","authors":["ilia-berlana"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["mobile"],"sticker":"/img/cursos/exprimiendo-las-vistas-de-android.png","slug":"exprimiendo-las-vistas-de-android","color":"yellow","url":"https://pro.codely.com/library/exprimiendo-las-vistas-de-android/about/"},{"title":"CQRS y Event Sourcing con Kotlin y Axon Framework","emoji":"🤹","summary":"Aprenderemos qué es Event Sourcing y cómo se complementa con la arquitectura CQRS. La parte práctica del curso consistirá en un desarrollo de un carrito de la compra para un ecommerce usando Kotlin y el framework Axon.","authors":["jordi-llonch","ramon-aranda"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["backend","arquitectura-software"],"sticker":"/img/cursos/cqrs-y-event-sourcing-con-kotlin-y-axon-framework.png","slug":"cqrs-y-event-sourcing-con-kotlin-y-axon-framework","color":"green","url":"https://pro.codely.com/library/cqrs-y-event-sourcing-con-kotlin-y-axon-framework/about/"},{"title":"Tu primera API HTTP con Scala","emoji":"🗣️","summary":"Habiendo hecho el primer curso de introducción a Scala ya nos podemos meter en materia y desarrollar nuestra primera API HTTP con Scala, Akka, base de datos, y mucho más.","authors":["javier-ferrer","rafa-gomez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["backend"],"sticker":"/img/cursos/api-http-con-scala-y-akka.png","slug":"api-http-con-scala-y-akka","color":"pink","url":"https://pro.codely.com/library/api-http-con-scala-y-akka/about/"},{"title":"Arquitectura Hexagonal","emoji":"🎯","summary":"Domain-Driven Design se apoya en la Arquitectura Hexagonal como uno de sus pilares a nivel técnico. Aprende a implementarla con CodelyTV!","authors":["javier-ferrer","rafa-gomez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/arquitectura-hexagonal.png","slug":"arquitectura-hexagonal","color":"yellow","url":"https://pro.codely.com/library/arquitectura-hexagonal/about/"},{"title":"AWS: Escalando apps - Load Balancers y Auto Scaling Groups","emoji":"📈","summary":"José Armesto seguirá la serie de cursos sobre AWS hablando de cómo escalar. Introduciremos los Load Balancers y Auto Scaling Groups de AWS.","authors":["jose-armesto"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["devops"],"sticker":"/img/cursos/aws-autoescalado-de-aplicaciones-con-alb-y-asg.png","slug":"aws-autoescalado-de-aplicaciones-con-alb-y-asg","color":"violet","url":"https://pro.codely.com/library/aws-autoescalado-de-aplicaciones-con-alb-y-asg/about/"},{"title":"Crea una app MEAN profesional con AngularJS y Webpack","emoji":"🛡️","summary":"JuanMa Garrido nos explica cómo crear aplicaciones profesionales desde 0 basándonos en MongoDB, Express, AngularJS, y Node.js siguiendo buenas prácticas y usando Webpack.","authors":["juanma-garrido"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/crea-una-app-mean-profesional-con-angularjs-y-webpack.png","slug":"crea-una-app-mean-profesional-con-angularjs-y-webpack","color":"yellow","url":"https://pro.codely.com/library/crea-una-app-mean-profesional-con-angularjs-y-webpack/about/"},{"title":"Testing unidirectional dataflow con Vuex y Jest","emoji":"🍄","summary":"Explicaremos la implementación de arquitectura de flujo unidireccional de Vuex y veremos cómo ayuda al desarrollo de aplicaciones con una jerarquía de componentes más compleja.","authors":["alberto-gualis","javier-rubio"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/testing-unidirectional-dataflow-vuex-y-jest.png","slug":"testing-unidirectional-dataflow-vuex-y-jest","color":"pink","url":"https://pro.codely.com/library/testing-unidirectional-dataflow-vuex-y-jest/about/"},{"title":"Crea una app con VueJS y Jest aplicando TDD","emoji":"✌️","summary":"Alberto Gualis y Javi Rubio nos explicarán cómo testean aplicaciones VueJS con Jest en los Coding Stones. Incluye sesión práctica de TDD en Frontend. A lo loco!","authors":["alberto-gualis","javier-rubio"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["frontend"],"sticker":"/img/cursos/crea-una-app-con-vuejs-y-jest-aplicando-tdd.png","slug":"crea-una-app-con-vuejs-y-jest-aplicando-tdd","color":"violet","url":"https://pro.codely.com/library/crea-una-app-con-vuejs-y-jest-aplicando-tdd/about/"},{"title":"Buenas prácticas de BDD con Gherkin","emoji":"🥒","summary":"Aprenderás desde los conceptos básicos para testear tu aplicación con Cucumber o Behat, hasta consejos de buenas prácticas para hacer que tu suite de tests sea más fácilmente mantenible.","authors":["alberto-gualis","javier-rubio","dani-latorre"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["backend"],"sticker":"/img/cursos/buenas-practicas-de-bdd-con-cucumber.png","slug":"buenas-practicas-de-bdd-con-cucumber","color":"green","url":"https://pro.codely.com/library/buenas-practicas-de-bdd-con-cucumber/about/"},{"title":"Introducción a Scala","emoji":"🌀","summary":"Scala es un lenguaje conciso, poco verboso, y que permite la programación funcional sin olvidar la POO. Aprenderemos cómo configurar el entorno, las bases del lenguaje, asincronía y otros tips para empezar.","authors":["javier-ferrer","rafa-gomez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["backend"],"sticker":"/img/cursos/introduccion-a-scala.png","slug":"introduccion-a-scala","color":"violet","url":"https://pro.codely.com/library/introduccion-a-scala/about/"},{"title":"UI Testing en iOS con KIF","emoji":"📱","summary":"Aprende una de las técnicas de testing más potentes que existen para desarrollo móvil, aprende a hacer tests funcionales de UI para aplicaciones iOS con Sergio Gutierrez de Karumi.","authors":["jorge-barroso","sergio-gutierrez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["mobile"],"sticker":"/img/cursos/ui-testing-en-ios-con-kif.png","slug":"ui-testing-en-ios-con-kif","color":"yellow","url":"https://pro.codely.com/library/ui-testing-en-ios-con-kif/about/"},{"title":"Screenshot testing en iOS","emoji":"🖼️","summary":"Sergio Gutierrez de Karumi nos explicará cómo y qué aporta hacer Screenshot Testing en iOS. Veremos desde cómo empezar a escribir nuestros primeros tests, hasta algunos trucos a tener en cuenta pasando por la integración continua.","authors":["jorge-barroso","sergio-gutierrez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["mobile"],"sticker":"/img/cursos/screenshot-testing-en-ios.png","slug":"screenshot-testing-en-ios","color":"green","url":"https://pro.codely.com/library/screenshot-testing-en-ios-3af3e7f1/about/"},{"title":"Screenshot testing en Android","emoji":"📸","summary":"Jorge Barroso de Karumi nos explicará cómo y qué aporta hacer Screenshot Testing en Android. Veremos desde cómo empezar a escribir nuestros primeros tests, hasta algunos trucos a tener en cuenta pasando por la integración continua.","authors":["jorge-barroso","sergio-gutierrez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["mobile"],"sticker":"/img/cursos/screenshot-testing-en-android.png","slug":"screenshot-testing-en-android","color":"pink","url":"https://pro.codely.com/library/screenshot-testing-en-android-f1bc7a25/about/"},{"title":"UI Testing en Android con Espresso","emoji":"🎨","summary":"En el mundo mobile la parte más importante y grande que debemos cubrir con tests es la interfaz de usuario. En este curso aprenderemos las claves para escribir buenos tests de UI con Jorge Barroso de Karumi.","authors":["jorge-barroso","sergio-gutierrez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["mobile"],"sticker":"/img/cursos/ui-testing-en-android-con-espresso.png","slug":"ui-testing-en-android-con-espresso","color":"yellow","url":"https://pro.codely.com/library/ui-testing-en-android-con-espresso/about/"},{"title":"AWS EC2: Tu primer deploy","emoji":"☁️","summary":"Aprende las bases de Amazon Web Services para levantar tu aplicación en la nube. Crea tu propia VPC, elige la instancia adecuada de EC2, configura SSH, elige tu AMI base, define Security Groups, deploya, y configura Route53 como DNS!","authors":["jose-armesto"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["devops"],"sticker":"/img/cursos/aws-deploy-en-ec2.png","slug":"aws-deploy-en-ec2","color":"green","url":"https://pro.codely.com/library/aws-deploy-en-ec2/about/"},{"title":"Agile: Cómo mejorar tus retrospectivas","emoji":"🤝","summary":"A pesar de parecer simple, llevar a cabo buenas retrospectivas no siempre es fácil. En este curso José Huerta de Smoking Brains nos explicará cómo mejorar.","authors":["jose-rodriguez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["tooling"],"sticker":"/img/cursos/agile-retrospectivas.png","slug":"agile-retrospectivas","color":"pink","url":"https://pro.codely.com/library/agile-retrospectivas/about/"},{"title":"CQRS: Command Query Responsibility Segregation","emoji":"🚌","summary":"Aumenta el rendimiento y el desacoplamiento de tu backend mediante CQRS. Veremos conceptos e implementaciones de buses síncronos y asíncronos.","authors":["javier-ferrer","rafa-gomez"],"releaseDate":{"start":"2019-04-04","end":"2019-04-04"},"tags":[],"categories":["arquitectura-software"],"sticker":"/img/cursos/cqrs-command-query-responsibility-segregation.png","slug":"cqrs-command-query-responsibility-segregation","color":"violet","url":"https://pro.codely.com/library/cqrs-command-query-responsibility-segregation-3719e4aa/about/"}] 2 | -------------------------------------------------------------------------------- /02-jq/3-aggregate_sort_json/_output.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "emoji": "⚡", 4 | "total": 3, 5 | "courses": [ 6 | "Lightning Talks", 7 | "Exprimiendo IntelliJ", 8 | "Introducción a Go: Tu primera app" 9 | ] 10 | }, 11 | { 12 | "emoji": "🤖", 13 | "total": 2, 14 | "courses": [ 15 | "Automatiza tu flujo de trabajo con GitHub Actions", 16 | "Integración Continua con GitHub Actions" 17 | ] 18 | }, 19 | { 20 | "emoji": "💻", 21 | "total": 2, 22 | "courses": [ 23 | "Bash para el día a día: Scripting & Productividad", 24 | "Terminal 100% productiva con Zsh" 25 | ] 26 | }, 27 | { 28 | "emoji": "🐘", 29 | "total": 2, 30 | "courses": [ 31 | "PHP 8: Novedades y ejemplos para el Mundo Real™", 32 | "DDD en PHP" 33 | ] 34 | }, 35 | { 36 | "emoji": "✌️", 37 | "total": 2, 38 | "courses": [ 39 | "Vue 3: Novedades aplicadas al mundo real", 40 | "Crea una app con VueJS y Jest aplicando TDD" 41 | ] 42 | } 43 | ] 44 | -------------------------------------------------------------------------------- /02-jq/3-aggregate_sort_json/execute.sh: -------------------------------------------------------------------------------- 1 | jq '[. | 2 | group_by(.emoji) | 3 | map({emoji: .[0].emoji, total: length, courses: map(.title)}) | 4 | sort_by(.total) | 5 | reverse | 6 | .[] | 7 | select(.total | length > 1)]' "$PWD/_input.json" 8 | -------------------------------------------------------------------------------- /02-jq/3-aggregate_sort_json/test.sh: -------------------------------------------------------------------------------- 1 | source "../../_shared/compare_json.sh" 2 | 3 | it_should_output_the_expected_json "$PWD/execute.sh" "$PWD/_output.json" 4 | -------------------------------------------------------------------------------- /03-jq_challenge/1-problem/README.md: -------------------------------------------------------------------------------- 1 | # 🔥 Challenge 2 | 3 | We want to know the top contributors of a GitHub repository based on the number of open Pull Requests (PRs). For this example, we will be using the [dotly](https://github.com/CodelyTV/dotly) repository. In order to do so: 4 | 5 | 1. Format the output JSON according to the following schema: 6 | ```json 7 | [ 8 | { 9 | "user": "$GITHUB_USER$", 10 | "total_prs": $NUM_PRS_USER$, 11 | "prs_title": [ 12 | "$PR_1_TITLE$", 13 | "$PR_2_TITLE$", 14 | … 15 | ] 16 | }, 17 | … 18 | ``` 19 | Properties: 20 | * `$GITHUB_USER$`: GitHub username 21 | * `$NUM_PRS_USER$`: Number of PRs open by that user 22 | * `$PR_NUM_TITLE`: PRs title following the schema: `created_at: title` 23 | 2. Sort the output array prioritizing the users with more PRs 24 | 3. Filter out the output array in order to only keep users that has contributed with more than 1 PR 25 | -------------------------------------------------------------------------------- /03-jq_challenge/2-solution/README.md: -------------------------------------------------------------------------------- 1 | # 🔥 Challenge 2 | 3 | We want to know the top contributors of a GitHub repository based on the number of open Pull Requests (PRs). For this example, we will be using the [dotly](https://github.com/CodelyTV/dotly) repository. In order to do so: 4 | 5 | 1. Format the output JSON according to the following schema: 6 | ```json 7 | [ 8 | { 9 | "user": "$GITHUB_USER$", 10 | "total_prs": $NUM_PRS_USER$, 11 | "prs_title": [ 12 | "$PR_1_TITLE$", 13 | "$PR_2_TITLE$", 14 | … 15 | ] 16 | }, 17 | … 18 | ``` 19 | Properties: 20 | * `$GITHUB_USER$`: GitHub username 21 | * `$NUM_PRS_USER$`: Number of PRs open by that user 22 | * `$PR_NUM_TITLE`: PRs title following the schema: `created_at: title` 23 | 2. Sort the output array prioritizing the users with more PRs 24 | 3. Filter out the output array in order to only keep users that has contributed with more than 1 PR 25 | -------------------------------------------------------------------------------- /03-jq_challenge/2-solution/_output.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "user": "rgomezcasas", 4 | "total_prs": 8, 5 | "prs_title": [ 6 | "2022-09-26T17:56:02Z: style: use tabs to indent", 7 | "2022-05-30T12:35:12Z: feat: backup already existing files on install", 8 | "2022-05-30T09:00:36Z: feat: improve package dump message", 9 | "2022-05-29T14:34:34Z: feat: improve update_all apps process", 10 | "2022-05-29T13:00:08Z: feat: allow to lint and static analysis dotfiles", 11 | "2022-05-18T12:26:33Z: feat: update theme to use the new branding", 12 | "2022-02-19T12:03:12Z: docs: improve docker docs", 13 | "2021-11-12T17:03:37Z: docs: improve readme" 14 | ] 15 | }, 16 | { 17 | "user": "borjapazr", 18 | "total_prs": 5, 19 | "prs_title": [ 20 | "2021-11-23T11:50:23Z: doc(readme): fix typo in README.md", 21 | "2021-11-13T12:02:47Z: feat: Add .editorconfig to dotfiles_template", 22 | "2021-11-13T01:10:58Z: feat(format): Add .editorconfig default options", 23 | "2021-11-07T14:08:23Z: Fix lint job in the CI workflow", 24 | "2021-11-07T12:35:03Z: Set the correct command name in the documentation of static_analysis script" 25 | ] 26 | }, 27 | { 28 | "user": "gtrabanco", 29 | "total_prs": 3, 30 | "prs_title": [ 31 | "2021-09-12T12:48:19Z: Fix user autocompletions folder naming when loading", 32 | "2021-08-22T22:13:59Z: [Fix] #183", 33 | "2021-07-27T21:25:36Z: Fixed issue with LAST_CODE" 34 | ] 35 | }, 36 | { 37 | "user": "ismanapa", 38 | "total_prs": 2, 39 | "prs_title": [ 40 | "2022-05-27T14:15:52Z: feat: add winget support", 41 | "2022-05-27T13:16:38Z: feat: add support to wsl paths" 42 | ] 43 | } 44 | ] 45 | -------------------------------------------------------------------------------- /03-jq_challenge/2-solution/execute.sh: -------------------------------------------------------------------------------- 1 | jq '[. | 2 | group_by(.user.login) | 3 | map({user: .[0].user.login, total_prs: length, prs_title: map(.created_at + ": " +.title)}) | 4 | sort_by(.total_prs) | 5 | reverse | 6 | .[] | 7 | select(.total_prs > 1)]' "$PWD/_input.json" 8 | -------------------------------------------------------------------------------- /03-jq_challenge/2-solution/test.sh: -------------------------------------------------------------------------------- 1 | source "../../_shared/compare_json.sh" 2 | 3 | it_should_output_the_expected_json "$PWD/execute.sh" "$PWD/_output.json" 4 | -------------------------------------------------------------------------------- /04-yaml_and_xml/1-handle_yamls/README.md: -------------------------------------------------------------------------------- 1 | # 🔥 Challenge 2 | 3 | Transform all `services.yaml` files to `xml`: 4 | * Setting the `autowire` property to false 5 | * Deleting the `autoconfigure` property 6 | -------------------------------------------------------------------------------- /04-yaml_and_xml/1-handle_yamls/_input/app/controllers/services.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | _defaults: 3 | autowire: true 4 | autoconfigure: true 5 | 6 | Controllers: 7 | resource: '../app/' 8 | -------------------------------------------------------------------------------- /04-yaml_and_xml/1-handle_yamls/_input/src/mooc/comments/infrastructure/services.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | _defaults: 3 | autowire: true 4 | autoconfigure: true 5 | 6 | App: 7 | resource: '../src/' 8 | exclude: 9 | - '../src/Kernel' 10 | -------------------------------------------------------------------------------- /04-yaml_and_xml/1-handle_yamls/_input/src/mooc/videos/infrastructure/services.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | _defaults: 3 | autowire: true 4 | autoconfigure: true 5 | 6 | App: 7 | resource: '../src/' 8 | exclude: 9 | - '../src/DependencyInjection/' 10 | - '../src/Entity/' 11 | - '../src/Kernel' 12 | -------------------------------------------------------------------------------- /04-yaml_and_xml/1-handle_yamls/execute.sh: -------------------------------------------------------------------------------- 1 | find _input -name *.yaml -exec bash -c "yq -o=xml '.services._defaults.autowire = false | del(.services._defaults.autoconfigure)' {} > {}.xml" \; 2 | -------------------------------------------------------------------------------- /04-yaml_and_xml/2-handle_xmls/README.md: -------------------------------------------------------------------------------- 1 | # 🔥 Challenge 2 | 3 | Transform the old orm YAML syntax to XML. The format is: 4 | ```xml 5 | 6 | 7 | 8 | enabled 9 | 10 | 11 | ``` 12 | -------------------------------------------------------------------------------- /04-yaml_and_xml/2-handle_xmls/_input.orm.yaml: -------------------------------------------------------------------------------- 1 | CodelyTv\Mooc\Videos\Domain\Video: 2 | type: entity 3 | table: videos 4 | 5 | id: 6 | id: 7 | type: video_id 8 | column: id 9 | length: 36 10 | -------------------------------------------------------------------------------- /04-yaml_and_xml/2-handle_xmls/_output.orm.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | enabled 5 | 6 | 7 | -------------------------------------------------------------------------------- /04-yaml_and_xml/2-handle_xmls/execute.sh: -------------------------------------------------------------------------------- 1 | yq -o=xml '. | { 2 | "+p_xml": "version=\"1.0\" encoding=\"UTF-8\"", 3 | "doctrine-mapping": { 4 | "entity": { 5 | "+@name": (. | keys)[0], 6 | "+@table": (map(.table))[0], 7 | "id": { 8 | "+@name": ((map(.id))[0] | keys)[0], 9 | "+@type": (map((map(.id))[0]))[0].type, 10 | "+@column": (map((map(.id))[0]))[0].column, 11 | "+@length": (map((map(.id))[0]))[0].length, 12 | "+content": "enabled" 13 | } 14 | } 15 | } 16 | }' _input.orm.yaml 17 | -------------------------------------------------------------------------------- /05-csv/1-csv_with_coreutils/README.md: -------------------------------------------------------------------------------- 1 | # 🔥 Challenge 2 | 3 | 1. Filter out the `_input2.csv` keeping: 4 | * Header 5 | * NYA players 6 | * 2000 year players 7 | -------------------------------------------------------------------------------- /05-csv/1-csv_with_coreutils/_input.csv: -------------------------------------------------------------------------------- 1 | id,team,player,bio,year,stint,lg,g,ab,r,h,X2b,X3b,hr,rbi,sb,cs,bb,so,ibb,hbp,sh,sf,gidp 2 | 88641,NYA,womacto01,"De toda la vida",2000,2,NL,19,50,6,14,1,0,1,2.0,1.0,1.0,4,4.0,0.0,0.0,3.0,0.0,0.0 3 | 88643,SBL,schilcu01,"Sant Boi a tope",2005,1,AL,31,2,0,1,0,0,0,0.0,0.0,0.0,0,1.0,0.0,0.0,0.0,0.0,0.0 4 | 88645,LAC,myersmi01,"",2006,1,AL,62,0,0,0,0,0,0,0.0,0.0,0.0,0,0.0,0.0,0.0,0.0,0.0,0.0 5 | 88649,LAC,helliri01,"Home ruuuun",2006,1,NL,20,3,0,0,0,0,0,0.0,0.0,0.0,0,2.0,0.0,0.0,0.0,0.0,0.0 6 | 88650,NYA,JavierCane,"Programo, hago vídeos y baseball",2000,1,AL,33,6,0,1,0,0,0,0.0,0.0,0.0,0,4.0,0.0,0.0,0.0,0.0,0.0 7 | 88652,SBL,finLASest01,"",2006,1,NL,139,426,66,105,21,12,6,40.0,7.0,0.0,46,55.0,2.0,2.0,3.0,4.0,6.0 8 | 88653,NYA,gonzalu01,"De siempre",2000,1,NL,153,586,93,159,52,2,15,73.0,0.0,1.0,69,58.0,10.0,7.0,0.0,6.0,14.0 9 | 88662,LAC,ANTINYA12,"",2006,1,NL,28,26,2,5,1,0,0,0.0,0.0,0.0,1,7.0,0.0,0.0,6.0,0.0,1.0 10 | 89177,NYA,francju01,"Corro mucho",2007,2,NL,15,40,1,10,3,0,0,8.0,0.0,0.0,4,10.0,1.0,0.0,0.0,1.0,1.0 11 | -------------------------------------------------------------------------------- /05-csv/1-csv_with_coreutils/_output.csv: -------------------------------------------------------------------------------- 1 | id,team,player,bio,year,stint,lg,g,ab,r,h,X2b,X3b,hr,rbi,sb,cs,bb,so,ibb,hbp,sh,sf,gidp 2 | 88641,NYA,womacto01,"De toda la vida",2000,2,NL,19,50,6,14,1,0,1,2.0,1.0,1.0,4,4.0,0.0,0.0,3.0,0.0,0.0 3 | 88653,NYA,gonzalu01,"De siempre",2000,1,NL,153,586,93,159,52,2,15,73.0,0.0,1.0,69,58.0,10.0,7.0,0.0,6.0,14.0 4 | -------------------------------------------------------------------------------- /05-csv/1-csv_with_coreutils/codely_example/1-importer.sh: -------------------------------------------------------------------------------- 1 | cp user_progress_report.csv test.csv 2 | head -n 1 test.csv | gsed 's/,/\n/g' | cat -n 3 | 4 | # [OPTIONAL] Move the `last_name` column to the last one: 5 | # awk -F',' -v OFS=, '{tmp=$3; for(i=3;i<=NF;i++) $i=$(i+1); $NF=tmp}1' user_progress_report.csv > tmp && mv tmp user_progress_report.csv 6 | 7 | --- validar que el último campo es last name 8 | 9 | # Add the `Start Day` column 10 | awk -F',' -v OFS=, '{s=(NR==1)?"Start Day":substr($12,0,10);$0=$0 OFS s}1' test.csv > tmp && mv tmp test.csv 11 | 12 | # Move the `course_id` column to the last one 13 | awk -F',' -v OFS=, '{tmp=$7; for(i=7;i<=NF;i++) $i=$(i+1); $NF=tmp}1' test.csv > tmp && mv tmp test.csv 14 | 15 | # Move the `cohort_id` column to the last one 16 | awk -F',' -v OFS=, '{tmp=$8; for(i=8;i<=NF;i++) $i=$(i+1); $NF=tmp}1' test.csv > tmp && mv tmp test.csv 17 | 18 | # Add completion_date column 19 | awk -F',' -v OFS=, '{s=(NR==1)?"completion_date":"";$0=$0 OFS s}1' test.csv > tmp && mv tmp test.csv 20 | 21 | # Move the completion_date column 22 | awk -F',' -v OFS=, '{tmp=$NF; for( i=NF;i>11;i-- ) {$i=$(i-1)}; $11=tmp ; print}' test.csv > tmp && mv tmp test.csv 23 | 24 | # Move the `last_registration_activity` column to the last one 25 | awk -F',' -v OFS=, '{tmp=$13; for(i=13;i<=NF;i++) $i=$(i+1); $NF=tmp}1' test.csv > tmp && mv tmp test.csv 26 | 27 | # Move the `discount_code` column to the last one 28 | awk -F',' -v OFS=, '{tmp=$17; for(i=17;i<=NF;i++) $i=$(i+1); $NF=tmp}1' test.csv > tmp && mv tmp test.csv 29 | 30 | head -n 1 test.csv | gsed 's/,/\n/g' | cat -n 31 | 32 | #--- validar campos igual a: 33 | # 34 | # 1 user_id 35 | # 2 first_name 36 | # 3 email 37 | # 4 profile_bio 38 | # 5 profile_location 39 | # 6 registration_role 40 | # 7 course_name 41 | # 8 cohort_name 42 | # 9 progress_pct 43 | # 10 start_date 44 | # 11 completion_date 45 | # 12 last_session_time 46 | # 13 points_earned 47 | # 14 points_missed 48 | # 15 points_available 49 | # 16 score 50 | # 17 last_name 51 | # 18 Start Day 52 | # 19 course_id 53 | # 20 cohort_id 54 | # 21 last_registration_activity 55 | # 22 discount_code 56 | # 57 | #--- si ok 58 | 59 | rm user_progress_report.csv 60 | mv test.csv user_progress_report.csv 61 | -------------------------------------------------------------------------------- /05-csv/1-csv_with_coreutils/codely_example/2-importer.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -euo pipefail 4 | 5 | # Helper functions 6 | find_index_of() { 7 | local -r index_name=$1 8 | header=$(head -n1 "user_progress_report.csv") 9 | 10 | head -n1 "user_progress_report.csv" | sed -n $'1s/,/\\\n/gp' | grep -nx "$index_name" | awk -F':' '{print $1}' 11 | } 12 | 13 | echo "👷 Generating the \`user_progress_report.csv\` file based on the \`all_fields_user_progress_report.csv\`…" 14 | 15 | # Immutability 16 | cp all_fields_user_progress_report.csv user_progress_report.csv 17 | 18 | # Uncomment to debug faster 19 | # head -n100 all_fields_user_progress_report.csv > user_progress_report.csv 20 | 21 | # Remove any line break inside any of the CSVs values such as `profile_bio` 22 | awk 'BEGIN{RS="\n\n" ; ORS=" ";}{ print }' user_progress_report.csv > tmp && mv tmp user_progress_report.csv 23 | 24 | # Replace too long course names 25 | sed -i 's/"Buenas prácticas de BDD con Gherkin (Cucumber, Behat…)"/Buenas prácticas de BDD con Gherkin/g' user_progress_report.csv 26 | 27 | # Convert `CR+LF` line endings to `LF` in order to avoid `awk` adding extra lines 28 | tr -d '\r' < user_progress_report.csv > tmp && mv tmp user_progress_report.csv 29 | 30 | # Remove any comma inside any of the CSVs values 31 | awk -F'"' -v OFS='' '{ for (i=2; i<=NF; i+=2) gsub(",", "", $i) } 1' user_progress_report.csv > tmp && mv tmp user_progress_report.csv 32 | 33 | # Modify the CSV structure in order to match previous generated reports and avoid having to modify the script and the G Spreadsheet report dynamic tables 34 | user_id_position=$(find_index_of "user_id") 35 | first_name_position=$(find_index_of "first_name") 36 | email_position=$(find_index_of "email") 37 | profile_bio_position=$(find_index_of "profile_bio") 38 | profile_location_position=$(find_index_of "profile_location") 39 | registration_role_position=$(find_index_of "registration_role") 40 | course_name_position=$(find_index_of "course_name") 41 | cohort_name_position=$(find_index_of "cohort_name") 42 | progress_pct_position=$(find_index_of "progress_pct") 43 | start_date_position=$(find_index_of "start_date") 44 | completion_date_position=$(find_index_of "completion_date") 45 | last_session_time_position=$(find_index_of "last_session_time") 46 | points_earned_position=$(find_index_of "points_earned") 47 | points_missed_position=$(find_index_of "points_missed") 48 | points_available_position=$(find_index_of "points_available") 49 | score_position=$(find_index_of "score") 50 | last_name_position=$(find_index_of "last_name") 51 | course_id_position=$(find_index_of "course_id") 52 | cohort_id_position=$(find_index_of "cohort_id") 53 | last_registration_activity_position=$(find_index_of "last_registration_activity") 54 | discount_code_position=$(find_index_of "discount_code") 55 | 56 | user_progress=$(awk -F',' \ 57 | -v user_id="$user_id_position" \ 58 | -v first_name="$first_name_position" \ 59 | -v email="$email_position" \ 60 | -v profile_bio="$profile_bio_position" \ 61 | -v profile_location="$profile_location_position" \ 62 | -v registration_role="$registration_role_position" \ 63 | -v course_name="$course_name_position" \ 64 | -v cohort_name="$cohort_name_position" \ 65 | -v progress_pct="$progress_pct_position" \ 66 | -v start_date="$start_date_position" \ 67 | -v completion_date="$completion_date_position" \ 68 | -v last_session_time="$last_session_time_position" \ 69 | -v points_earned="$points_earned_position" \ 70 | -v points_missed="$points_missed_position" \ 71 | -v points_available="$points_available_position" \ 72 | -v score="$score_position" \ 73 | -v last_name="$last_name_position" \ 74 | -v course_id="$course_id_position" \ 75 | -v cohort_id="$cohort_id_position" \ 76 | -v last_registration_activity="$last_registration_activity_position" \ 77 | -v discount_code="$discount_code_position" \ 78 | '{print $user_id","$first_name","$email","$profile_bio","$profile_location","$registration_role","$course_name","$cohort_name","$progress_pct","$start_date","$completion_date","$last_session_time","$points_earned","$points_missed","$points_available","$score","$last_name","substr($start_date,1,10)","$course_id","$cohort_id","$last_registration_activity","$discount_code}' "user_progress_report.csv" | 79 | sed 's/start_date/Start Day/2' | 80 | # Remove users with line breaks in their bio descriptions (we have tried to remove them with awk and lose the battle) 81 | grep -v ",,,,,,,,,,,,,,,,,,," | 82 | # Remove courses that never came to public or that we renamed them before publishing 83 | grep -v "Setup producción de contenido" | 84 | grep -v "Introducción a Kotlin: Tu primera app de consola" | 85 | grep -v "Bienvenida colaboradores" 86 | ) 87 | 88 | echo "$user_progress" > user_progress_report.csv 89 | 90 | ## Test out the CSV columns order 91 | test "$(head -n1 user_progress_report.csv)" = "user_id,first_name,email,profile_bio,profile_location,registration_role,course_name,cohort_name,progress_pct,start_date,completion_date,last_session_time,points_earned,points_missed,points_available,score,last_name,Start Day,course_id,cohort_id,last_registration_activity,discount_code" && echo "✅ user_progress_report.csv has the needed columns in order after the transformation" || echo "❌ user_progress_report.csv does not has the needed columns in the correct order after the transformation" 92 | -------------------------------------------------------------------------------- /05-csv/1-csv_with_coreutils/codely_example/_input.csv: -------------------------------------------------------------------------------- 1 | user_id,first_name,last_name,email,profile_bio,profile_location,registration_id,registration_role,course_id,course_name,path_type,cohort_id,cohort_name,progress_pct,start_date,completion_date,access_expiration,last_session_time,last_registration_activity,points_earned,points_missed,points_available,score,discount_code 2 | 344310,Javier,Ferrer,javier.ferrer[at]codely.tv,,,1579920,Teacher,52283,Automatiza tu flujo de trabajo con GitHub Actions,Course,113898,CodelyTV Pro,0.0,2020-03-12 14:24:53.616830+00:00,,,2022-09-23 16:34:58.666583+00:00,2020-03-12 14:24:53.651001+00:00,0,0,0,, 3 | 371792,Rafa,Gómez,rafa.gomez[at]codely.tv,"👨‍💻 Construyendo CodelyTV 🚀. He pasado (y a veces sigo yendo) por La Salle, letgo, Akamon, Thatzad... Never Stop Learning!",Barcelona,2879844,Teacher,174088,Introducción a Kotlin: Tu primera app,Course,381069,CodelyTV Pro,0.0,2022-01-05 14:51:46.154101+00:00,,,2022-09-30 17:09:56.580617+00:00,2022-01-07 10:34:56.867169+00:00,0,0,0,, 4 | 5 | -------------------------------------------------------------------------------- /05-csv/1-csv_with_coreutils/execute.sh: -------------------------------------------------------------------------------- 1 | awk -F, 'NR==1 || $2=="NYA" && $5==2000' _input.csv 2 | -------------------------------------------------------------------------------- /05-csv/2-csv_with_yq/README.md: -------------------------------------------------------------------------------- 1 | # 🔥 Challenge 2 | 3 | 1. Filter out the `_input2.csv` keeping: 4 | * Header 5 | * NYA players 6 | * 2000 year players 7 | -------------------------------------------------------------------------------- /05-csv/2-csv_with_yq/_input.csv: -------------------------------------------------------------------------------- 1 | id,team,player,bio,year,stint,lg,g,ab,r,h,X2b,X3b,hr,rbi,sb,cs,bb,so,ibb,hbp,sh,sf,gidp 2 | 88641,NYA,womacto01,"De toda la vida",2000,2,NL,19,50,6,14,1,0,1,2.0,1.0,1.0,4,4.0,0.0,0.0,3.0,0.0,0.0 3 | 88643,SBL,schilcu01,"Sant Boi a tope",2005,1,AL,31,2,0,1,0,0,0,0.0,0.0,0.0,0,1.0,0.0,0.0,0.0,0.0,0.0 4 | 88645,LAC,myersmi01,"",2006,1,AL,62,0,0,0,0,0,0,0.0,0.0,0.0,0,0.0,0.0,0.0,0.0,0.0,0.0 5 | 88649,LAC,helliri01,"Home ruuuun",2006,1,NL,20,3,0,0,0,0,0,0.0,0.0,0.0,0,2.0,0.0,0.0,0.0,0.0,0.0 6 | 88650,NYA,JavierCane,"Programo, hago vídeos y baseball",2000,1,AL,33,6,0,1,0,0,0,0.0,0.0,0.0,0,4.0,0.0,0.0,0.0,0.0,0.0 7 | 88652,SBL,finLASest01,"",2006,1,NL,139,426,66,105,21,12,6,40.0,7.0,0.0,46,55.0,2.0,2.0,3.0,4.0,6.0 8 | 88653,NYA,gonzalu01,"De siempre",2000,1,NL,153,586,93,159,52,2,15,73.0,0.0,1.0,69,58.0,10.0,7.0,0.0,6.0,14.0 9 | 88662,LAC,ANTINYA12,"",2006,1,NL,28,26,2,5,1,0,0,0.0,0.0,0.0,1,7.0,0.0,0.0,6.0,0.0,1.0 10 | 89177,NYA,francju01,"Corro mucho",2007,2,NL,15,40,1,10,3,0,0,8.0,0.0,0.0,4,10.0,1.0,0.0,0.0,1.0,1.0 11 | -------------------------------------------------------------------------------- /05-csv/2-csv_with_yq/_output.csv: -------------------------------------------------------------------------------- 1 | id,team,player,bio,year,stint,lg,g,ab,r,h,X2b,X3b,hr,rbi,sb,cs,bb,so,ibb,hbp,sh,sf,gidp 2 | 88641,NYA,womacto01,De toda la vida,2000,2,NL,19,50,6,14,1,0,1,2.0,1.0,1.0,4,4.0,0.0,0.0,3.0,0.0,0.0 3 | 88650,NYA,JavierCane,"Programo, hago vídeos y baseball",2000,1,AL,33,6,0,1,0,0,0,0.0,0.0,0.0,0,4.0,0.0,0.0,0.0,0.0,0.0 4 | 88653,NYA,gonzalu01,De siempre,2000,1,NL,153,586,93,159,52,2,15,73.0,0.0,1.0,69,58.0,10.0,7.0,0.0,6.0,14.0 5 | -------------------------------------------------------------------------------- /05-csv/2-csv_with_yq/execute.sh: -------------------------------------------------------------------------------- 1 | yq -p csv -o csv 'map(select(.team == "NYA" and .year == 2000))' _input.csv 2 | -------------------------------------------------------------------------------- /06-csv_challenge/1-problem/README.md: -------------------------------------------------------------------------------- 1 | # 🔥 Challenge 2 | 3 | Generate 3 files: 4 | 1. categories.csv 5 | * Fields: 6 | * name 7 | * With no duplicates 8 | 2. sellers.csv 9 | * Fields: 10 | * id 11 | * name 12 | * With no duplicates 13 | * With no sellers without id 14 | 3. products.json 15 | * Fields 16 | * id (asin) 17 | * brand 18 | * price (final_price currency) 19 | * formats 20 | * name 21 | * price 22 | * publish_date (timestamp) 23 | * categories 24 | * Keeping only products in stock 25 | -------------------------------------------------------------------------------- /06-csv_challenge/1-problem/execute.sh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CodelyTV/awesome-bash-challenges/70cd3d25ad3ded205d839e9d2619569faa77f0e5/06-csv_challenge/1-problem/execute.sh -------------------------------------------------------------------------------- /06-csv_challenge/2-solution/README.md: -------------------------------------------------------------------------------- 1 | # 🔥 Challenge 2 | 3 | Generate 3 files: 4 | 1. categories.csv 5 | * Fields: 6 | * name 7 | * With no duplicates 8 | 2. sellers.csv 9 | * Fields: 10 | * id 11 | * name 12 | * With no duplicates 13 | * With no sellers without id 14 | 3. products.json 15 | * Fields 16 | * id (asin) 17 | * brand 18 | * price (final_price currency) 19 | * formats 20 | * name 21 | * price 22 | * publish_date (timestamp) 23 | * categories 24 | * Keeping only products in stock 25 | -------------------------------------------------------------------------------- /06-csv_challenge/2-solution/categories.sh: -------------------------------------------------------------------------------- 1 | yq -p csv -o csv '[map(.categories)[] | .[] | {"category": .}]' _input.csv | sort -ur 2 | -------------------------------------------------------------------------------- /06-csv_challenge/2-solution/output/categories.csv: -------------------------------------------------------------------------------- 1 | category 2 | World 3 | Women's Fiction 4 | United States 5 | Travel 6 | Thrillers & Suspense 7 | Teen & Young Adult 8 | Social Sciences 9 | Short Stories & Anthologies 10 | Self-Help 11 | Science Fiction & Fantasy 12 | Romance 13 | Religions 14 | Religion & Spirituality 15 | Relationships 16 | Regional & International 17 | Reference 18 | Psychology & Counseling 19 | Professionals & Academics 20 | Politics & Social Sciences 21 | Politics & Government 22 | New Age & Spirituality 23 | Mythology & Folk Tales 24 | Mystery 25 | Medicine 26 | Medical Books 27 | Management & Leadership 28 | Literature & Fiction 29 | Leaders & Notable People 30 | LGBTQ+ Books 31 | Job Hunting & Careers 32 | Investing 33 | Humor & Entertainment 34 | Humor 35 | Home Improvement & Design 36 | History & Criticism 37 | History 38 | Historical 39 | Happiness 40 | Growing Up & Facts of Life 41 | Graphic Novels 42 | Genre Fiction 43 | Europe 44 | Engineering & Transportation 45 | Engineering 46 | Education & Reference 47 | Early Learning 48 | Dramas & Plays 49 | Diets & Weight Loss 50 | Crafts & Hobbies 51 | Cooking Education & Reference 52 | Contemporary 53 | Comics & Graphic Novels 54 | Classics 55 | Christian Living 56 | Christian Books & Bibles 57 | Children's Books 58 | Business Culture 59 | Business & Money 60 | Books 61 | Biographies & Memoirs 62 | Arts & Literature 63 | Animals 64 | Americas 65 | Alternative Medicine 66 | Aging 67 | Action & Adventure 68 | "Writing, Research & Publishing Guides" 69 | "Mystery, Thriller & Suspense" 70 | "Health, Fitness & Dieting" 71 | "Crafts, Hobbies & Home" 72 | "Cookbooks, Food & Wine" 73 | "Arts, Music & Photography" 74 | "Activities, Crafts & Games" 75 | -------------------------------------------------------------------------------- /06-csv_challenge/2-solution/output/sellers.csv: -------------------------------------------------------------------------------- 1 | id,name 2 | AZOLNCI5GS0EX,Basi6 InternationalBasi6 International 3 | ATVPDKIKX0DER,worldofbooksinc 4 | ATVPDKIKX0DER,saveherenow 5 | ATVPDKIKX0DER,owl_of_minerva_books 6 | ATVPDKIKX0DER,illventure 7 | ATVPDKIKX0DER,goodwill_ind_of_mid_tn 8 | ATVPDKIKX0DER,glenthebookseller 9 | ATVPDKIKX0DER,giggil 10 | ATVPDKIKX0DER,gatecitybooks 11 | ATVPDKIKX0DER,desert18 12 | ATVPDKIKX0DER,cratehog 13 | ATVPDKIKX0DER,big_river_books 14 | ATVPDKIKX0DER,ZBK Books 15 | ATVPDKIKX0DER,YMCA at Virginia Tech Thrift Shop 16 | ATVPDKIKX0DER,YHHWORLDREAD 17 | ATVPDKIKX0DER,Vivé Liber Books LLC 18 | ATVPDKIKX0DER,Village Books & Media 19 | ATVPDKIKX0DER,Valleys Books & More 20 | ATVPDKIKX0DER,VMG Books & Media 21 | ATVPDKIKX0DER,TrustedMarketing 22 | ATVPDKIKX0DER,Treasures & Goods 23 | ATVPDKIKX0DER,ThriftBooks-Reno 24 | ATVPDKIKX0DER,The BookBank 25 | ATVPDKIKX0DER,TLF Company 26 | ATVPDKIKX0DER,Surfin' Jonny's Used Books. 27 | ATVPDKIKX0DER,SpotlightBooks 28 | ATVPDKIKX0DER,Seattlegoodwill 29 | ATVPDKIKX0DER,Sayvmore 30 | ATVPDKIKX0DER,SIMYAH 31 | ATVPDKIKX0DER,Rye Berry Books 32 | ATVPDKIKX0DER,Rich Media Direct 33 | ATVPDKIKX0DER,Ricehoppers13 34 | ATVPDKIKX0DER,Reuseaworld 35 | ATVPDKIKX0DER,Retaliation Resale 36 | ATVPDKIKX0DER,Red Pool 37 | ATVPDKIKX0DER,Rebound Media 38 | ATVPDKIKX0DER,R&K Accounting 39 | ATVPDKIKX0DER,Prime 1 Books 40 | ATVPDKIKX0DER,Open Books 41 | ATVPDKIKX0DER,Old Cary Books 42 | ATVPDKIKX0DER,Novatechs 43 | ATVPDKIKX0DER,Nextgenbooks 44 | ATVPDKIKX0DER,Murfbooks 45 | ATVPDKIKX0DER,Mortuus Books 46 | ATVPDKIKX0DER,Momma's Media 47 | ATVPDKIKX0DER,MollyinTexas 48 | ATVPDKIKX0DER,Missouri_Goodwill_Industries 49 | ATVPDKIKX0DER,MediaFlow 50 | ATVPDKIKX0DER,Media Relay LLC 51 | ATVPDKIKX0DER,MaddysAttic2019 52 | ATVPDKIKX0DER,Luxifi 53 | ATVPDKIKX0DER,KathrynAshleyGallery 54 | ATVPDKIKX0DER,KJS Direct 55 | ATVPDKIKX0DER,Joe's Online Emporium 56 | ATVPDKIKX0DER,Jerz Products LLC 57 | ATVPDKIKX0DER,Jenson Books Inc. 58 | ATVPDKIKX0DER,Jenson Books Inc 59 | ATVPDKIKX0DER,Ivy_League_Books 60 | ATVPDKIKX0DER,Housing Works Online Bookstore 61 | ATVPDKIKX0DER,HarryBat 62 | ATVPDKIKX0DER,Great Time Books 63 | ATVPDKIKX0DER,Goodwill of North Georgia 64 | ATVPDKIKX0DER,Goodwill of Colorado 65 | ATVPDKIKX0DER,Goodwill Minnesota 66 | ATVPDKIKX0DER,Goodwill Industries of Southern Nevada 67 | ATVPDKIKX0DER,GG 10 LLC 68 | ATVPDKIKX0DER,Frank C Fluharty 69 | ATVPDKIKX0DER,FindAnyBook 70 | ATVPDKIKX0DER,Find It HERE For LESS 71 | ATVPDKIKX0DER,Fast Same Day Products 72 | ATVPDKIKX0DER,EZSHOP7 73 | ATVPDKIKX0DER,Clickgoodwill 74 | ATVPDKIKX0DER,California Book Bag 75 | ATVPDKIKX0DER,Books and Books Etc. 76 | ATVPDKIKX0DER,Blessed Book 77 | ATVPDKIKX0DER,Bibliopolium LLC 78 | ATVPDKIKX0DER,Benjamins Bookshelf 79 | ATVPDKIKX0DER,Bear Books Outlet 80 | ATVPDKIKX0DER,Bahamut Media 81 | ATVPDKIKX0DER,B&D ENTERPRISES LLC 82 | ATVPDKIKX0DER,Artemis Speed 83 | ATVPDKIKX0DER,Amazon Warehouse 84 | ATVPDKIKX0DER,Amazon 85 | ATVPDKIKX0DER,Alston & Oak 86 | ATVPDKIKX0DER,Alex BooksandMore 87 | ATVPDKIKX0DER,AZ e-slinger 88 | ATVPDKIKX0DER,AP Books and More 89 | ATVPDKIKX0DER,AJ's Pop-up Shop 90 | ATVPDKIKX0DER,-OnTimeBooks- 91 | ATVPDKIKX0DER,"James River Sales, LLC" 92 | ATVPDKIKX0DER,"Goodwill Retail Services, Inc." 93 | ATVPDKIKX0DER,"Goodwill Industries - Big Bend, Inc." 94 | AI52QYRZ75KGI,DuctTape LaneDuctTape Lane-OnTimeBooks- 95 | AD4OCGA82CJ4V,Lower-Christian-PricesLower-Christian-Prices 96 | A3VDBZQBPSHJYL,Learning with BooksLearning with BooksJenson Books Inc 97 | A3RWNCIC4F4RRY,XpressDealsUSXpressDealsUSManor379 98 | A3J0TXP0S3TWCN,P&G CONCEPTP&G CONCEPTBeyond Compare Store 99 | A3420Q4BSHRD7X,ThiBsThiBs 100 | A30UH7RV1UCIV3,tabletoparttabletopart 101 | A2LV0SRZBF8L1P,BOOKS etc. _BOOKS etc. _ 102 | A2KFQ672Z6FN1W,DTXMARKETSDTXMARKETSGREENWORLD BOOKS 103 | A25X5FLQ1MMXNX,TheWorldShopUSATheWorldShopUSA 104 | A1RX8T1COSPQUU,medialeadersmedialeaders 105 | A1OUQDLXYX7Q0J,TIP TOP STORETIP TOP STOREDesert Pueblo Books 106 | A10PKMS7VWJCNG,desert18desert18HarryBat 107 | -------------------------------------------------------------------------------- /06-csv_challenge/2-solution/products.sh: -------------------------------------------------------------------------------- 1 | yq -p csv -o json 'map( 2 | select(.availability == "In Stock.") | 3 | { 4 | "id": .asin, 5 | "brand": .brand, 6 | "price": (.final_price + " " + .currency), 7 | "formats": (.format | map({"name": .name, "price": .price})), 8 | "publish_date": .timestamp, 9 | "categories": .categories 10 | } 11 | )' _input.csv 12 | -------------------------------------------------------------------------------- /06-csv_challenge/2-solution/sellers.sh: -------------------------------------------------------------------------------- 1 | yq -p csv -o csv 'map({"id": .seller_id, "name": .seller_name})' _input.csv | grep -Ev "^," | sort -ur 2 | -------------------------------------------------------------------------------- /07-sql/1-handle_sqls/README.md: -------------------------------------------------------------------------------- 1 | # 🔥 Challenge 2 | 3 | 1. Transform the `_input.sql` to csv 4 | -------------------------------------------------------------------------------- /07-sql/1-handle_sqls/execute.sh: -------------------------------------------------------------------------------- 1 | input_file="_input.sql" 2 | processed_elements=0 3 | batch_size=100 4 | tail_value=0 5 | while [ $processed_elements -ne 1 ]; do 6 | output=$(tail -n +$tail_value "$input_file" | head -$batch_size | awk -F\' '{print $2","$4","$6}') 7 | echo "$output" 8 | processed_elements=$(echo "$output" | wc -l) 9 | 10 | tail_value=$((tail_value + batch_size)) 11 | 12 | echo 13 | echo "Total processed: $tail_value" 14 | done 15 | -------------------------------------------------------------------------------- /07-sql/1-handle_sqls/generate_big_input.sh: -------------------------------------------------------------------------------- 1 | input_file="_input.sql" 2 | output_file="_input2.sql" 3 | cp "$input_file" "$output_file" 4 | 5 | times_to_execute=300 6 | while [ $times_to_execute -ne 0 ]; do 7 | 8 | cat "$input_file" >> "$output_file" 9 | 10 | times_to_execute=$((times_to_execute - 1)) 11 | done 12 | -------------------------------------------------------------------------------- /07-sql/2-handle_live_sqls/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:3.14 2 | WORKDIR /app 3 | 4 | RUN apk add --no-cache bash uuidgen mysql-client 5 | -------------------------------------------------------------------------------- /07-sql/2-handle_live_sqls/README.md: -------------------------------------------------------------------------------- 1 | # 🔥 Challenge 2 | 3 | 1. Enable the general log in `codely-awesome_bash_challenges-7_2-mariadb` 4 | 2. Transform every insert into `courses` to json 5 | -------------------------------------------------------------------------------- /07-sql/2-handle_live_sqls/docker-compose.yaml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | mariadb: 5 | container_name: codely-awesome_bash_challenges-7_2-mariadb 6 | image: mariadb:10.7.4 7 | ports: 8 | - "3360:3306" 9 | environment: 10 | - MYSQL_ROOT_PASSWORD= 11 | - MYSQL_ALLOW_EMPTY_PASSWORD=yes 12 | - MARIADB_DATABASE=mooc 13 | volumes: 14 | - ./sql:/docker-entrypoint-initdb.d 15 | healthcheck: 16 | test: ["CMD", "mysqladmin", "--user=root", "--password=", "--host=127.0.0.1", "ping", "--silent"] 17 | interval: 2s 18 | timeout: 10s 19 | retries: 10 20 | command: ["--default-authentication-plugin=mysql_native_password"] 21 | 22 | random_course_creator: 23 | container_name: codely-awesome_bash_challenges-7_2-random_course_creator 24 | user: "${UID}:${GID}" 25 | build: 26 | context: . 27 | dockerfile: Dockerfile 28 | restart: unless-stopped 29 | volumes: 30 | - ./random_course_creator:/app:delegated 31 | depends_on: 32 | - mariadb 33 | command: bash creator.sh 34 | -------------------------------------------------------------------------------- /07-sql/2-handle_live_sqls/execute.sh: -------------------------------------------------------------------------------- 1 | docker exec -it codely-awesome_bash_challenges-7_2-mariadb tail -f ./var/lib/mysql/general.log | 2 | grep "INSERT INTO courses" | 3 | awk -F\' '{print "{\"id\":\""$2"\",\"name\":\""$4"\",\"duration\":\""$6"\"}"}' 4 | -------------------------------------------------------------------------------- /07-sql/2-handle_live_sqls/random_course_creator/courses_words.txt: -------------------------------------------------------------------------------- 1 | & 2 | - 3 | 0 4 | 100% 5 | api 6 | aws 7 | aws: 8 | acompañamientos 9 | actions 10 | agile: 11 | android 12 | angularjs 13 | architecture 14 | arquitectura 15 | atajos 16 | auditorías 17 | auto 18 | automatiza 19 | avanzado: 20 | axon 21 | bdd 22 | balancers 23 | bash 24 | bloaters 25 | buenas 26 | cqrs 27 | cqrs: 28 | css 29 | css: 30 | centraliza 31 | change 32 | clean 33 | code 34 | code: 35 | codely 36 | codelytv 37 | command 38 | cómo 39 | comportamiento 40 | comunicación 41 | continua 42 | crea 43 | creacionales 44 | ddd 45 | dark 46 | de 47 | desarrolla 48 | design 49 | development 50 | directos 51 | diseño 52 | diseño: 53 | docker: 54 | domain-driven 55 | ec2: 56 | elk: 57 | elastic 58 | entrevistas 59 | escalando 60 | espresso 61 | estado 62 | event 63 | event-driven 64 | exprimiendo 65 | figma 66 | flex 67 | framework 68 | gestión 69 | gherkin 70 | git: 71 | github 72 | go 73 | go: 74 | grafana 75 | grid 76 | groups 77 | http 78 | hexagonal 79 | integración 80 | intellij 81 | introducción 82 | java 83 | javascript 84 | jest 85 | kif 86 | karabiner: 87 | kotlin 88 | kotlin: 89 | kubernetes 90 | layouts 91 | light 92 | lightning 93 | linting 94 | linux 95 | load 96 | loki 97 | mean 98 | makefiles 99 | maquetando 100 | más 101 | mecánicos 102 | migrando 103 | modelado 104 | monitoring 105 | mundo 106 | notion: 107 | novedades 108 | oo 109 | php 110 | patrones 111 | preventers 112 | principios 113 | pro 114 | productividad 115 | programación 116 | programar 117 | programming 118 | prometheus 119 | query 120 | react 121 | reactjs: 122 | real™ 123 | refactor 124 | refactoring 125 | responsibility 126 | solid 127 | scala 128 | scaling 129 | screenshot 130 | scripting 131 | segregation 132 | setup 133 | smells 134 | sourcing 135 | stack 136 | symfony 137 | tdd 138 | tdd: 139 | talks 140 | teclados 141 | terminal 142 | test-driven 143 | testing 144 | testing: 145 | todo 146 | tu 147 | typeclasses 148 | typescript 149 | typescript: 150 | ui 151 | visualiza 152 | vue 153 | vuejs 154 | vuex 155 | web 156 | webpack 157 | zsh 158 | a 159 | accesibles 160 | al 161 | alla 162 | any 163 | aplicaciones 164 | aplicadas 165 | aplicados 166 | aplicando 167 | app 168 | apps 169 | arquitectura 170 | buenas 171 | con 172 | dataflow 173 | de 174 | deploy 175 | desarrolladores 176 | desde 177 | día 178 | día: 179 | dotfiles 180 | extreme 181 | ejemplos 182 | el 183 | en 184 | entre 185 | equipo 186 | escalable 187 | exclusivos 188 | flujo 189 | fondo 190 | frontend 191 | funcional: 192 | ios 193 | iterm: 194 | la 195 | las 196 | logs 197 | los 198 | macos 199 | mantenible 200 | mejorar 201 | métricas 202 | microservicios: 203 | moderno 204 | mundo 205 | para 206 | performance 207 | plugins 208 | prácticas 209 | primer 210 | primera 211 | productiva 212 | profesional 213 | progresivamente 214 | real 215 | retrospectivas 216 | servicios 217 | sobre 218 | teclado 219 | testing 220 | themes 221 | todo 222 | trabajo 223 | tu 224 | tus 225 | una 226 | unidirectional 227 | vistas 228 | web 229 | y 230 | -------------------------------------------------------------------------------- /07-sql/2-handle_live_sqls/random_course_creator/creator.sh: -------------------------------------------------------------------------------- 1 | function random_course_name() { 2 | name=$(shuf -n4 ./courses_words.txt | xargs echo) 3 | 4 | echo "${name^}" 5 | } 6 | 7 | function random_duration() { 8 | echo $((RANDOM % 50 + 1)) "hours" 9 | } 10 | 11 | function generate_random_course_insert() { 12 | course_id=$(uuidgen) 13 | course_name=$(random_course_name) 14 | course_duration=$(random_duration) 15 | 16 | echo "INSERT INTO courses (id, name, duration) VALUES ('$course_id', '$course_name', '$course_duration');" 17 | } 18 | 19 | total_inserts=0 20 | while true; do 21 | number_of_inserts_per_second=$(<./number_of_inserts_per_second) 22 | seconds_between_inserts=$(echo "scale=2; 1 / $number_of_inserts_per_second" | bc) 23 | 24 | insert=$(generate_random_course_insert) 25 | mysql -uroot -hcodely-awesome_bash_challenges-7_2-mariadb --database=mooc -e"$insert" 26 | total_inserts=$((total_inserts + 1)) 27 | echo "$total_inserts> ($number_of_inserts_per_second inserts/s): '$insert' - Executed" 28 | 29 | sleep "$seconds_between_inserts" 30 | done 31 | -------------------------------------------------------------------------------- /07-sql/2-handle_live_sqls/random_course_creator/number_of_inserts_per_second: -------------------------------------------------------------------------------- 1 | 100 2 | -------------------------------------------------------------------------------- /07-sql/2-handle_live_sqls/sql/01-courses.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `courses` 2 | ( 3 | `id` CHAR(36) NOT NULL, 4 | `name` VARCHAR(255) NOT NULL, 5 | `duration` VARCHAR(255) NOT NULL, 6 | PRIMARY KEY (`id`) 7 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 8 | -------------------------------------------------------------------------------- /08-sql_challenge/1-problem/README.md: -------------------------------------------------------------------------------- 1 | # 🔥 Challenge 2 | 3 | 1. Transform all courses inside `codely-awesome_bash_challenges-8_1-mariadb` into json with the better performance possible 4 | -------------------------------------------------------------------------------- /08-sql_challenge/1-problem/docker-compose.yaml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | mariadb: 5 | container_name: codely-awesome_bash_challenges-8_1-mariadb 6 | image: mariadb:10.7.4 7 | ports: 8 | - "3360:3306" 9 | environment: 10 | - MYSQL_ROOT_PASSWORD= 11 | - MYSQL_ALLOW_EMPTY_PASSWORD=yes 12 | - MARIADB_DATABASE=mooc 13 | volumes: 14 | - ./sql:/docker-entrypoint-initdb.d 15 | healthcheck: 16 | test: ["CMD", "mysqladmin", "--user=root", "--password=", "--host=127.0.0.1", "ping", "--silent"] 17 | interval: 2s 18 | timeout: 10s 19 | retries: 10 20 | command: ["--default-authentication-plugin=mysql_native_password"] 21 | -------------------------------------------------------------------------------- /08-sql_challenge/1-problem/execute.sh: -------------------------------------------------------------------------------- 1 | docker exec -it codely-awesome_bash_challenges-8_1-mariadb mysql -Bse "SELECT * FROM mooc.courses;" 2 | -------------------------------------------------------------------------------- /08-sql_challenge/1-problem/sql/01-courses.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `courses` 2 | ( 3 | `id` CHAR(36) NOT NULL, 4 | `name` VARCHAR(255) NOT NULL, 5 | `duration` VARCHAR(255) NOT NULL, 6 | PRIMARY KEY (`id`) 7 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 8 | -------------------------------------------------------------------------------- /08-sql_challenge/2-solution/README.md: -------------------------------------------------------------------------------- 1 | # 🔥 Challenge 2 | 3 | 1. Transform all courses inside `codely-awesome_bash_challenges-8_1-mariadb` into json with the better performance possible 4 | -------------------------------------------------------------------------------- /08-sql_challenge/2-solution/docker-compose.yaml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | mariadb: 5 | container_name: codely-awesome_bash_challenges-8_2-mariadb 6 | image: mariadb:10.7.4 7 | ports: 8 | - "3360:3306" 9 | environment: 10 | - MYSQL_ROOT_PASSWORD= 11 | - MYSQL_ALLOW_EMPTY_PASSWORD=yes 12 | - MARIADB_DATABASE=mooc 13 | volumes: 14 | - ./sql:/docker-entrypoint-initdb.d 15 | healthcheck: 16 | test: ["CMD", "mysqladmin", "--user=root", "--password=", "--host=127.0.0.1", "ping", "--silent"] 17 | interval: 2s 18 | timeout: 10s 19 | retries: 10 20 | command: ["--default-authentication-plugin=mysql_native_password"] 21 | -------------------------------------------------------------------------------- /08-sql_challenge/2-solution/execute.sh: -------------------------------------------------------------------------------- 1 | docker exec -it codely-awesome_bash_challenges-8_2-mariadb mysql -Bse "SELECT * FROM mooc.courses;" | 2 | awk '{print "{\"id\":\""$1"\",\"name\":\""$2"\",\"duration\":\""$3"\"}"}' 3 | -------------------------------------------------------------------------------- /08-sql_challenge/2-solution/execute_optimized.sh: -------------------------------------------------------------------------------- 1 | docker exec -it codely-awesome_bash_challenges-8_2-mariadb mysql -Bse "SELECT CONCAT('{\"id\": \"', id, '\",\"name\":\"', name, '\",\"duration\":\"', duration, '\"}') FROM mooc.courses;" 2 | -------------------------------------------------------------------------------- /08-sql_challenge/2-solution/sql/01-courses.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `courses` 2 | ( 3 | `id` CHAR(36) NOT NULL, 4 | `name` VARCHAR(255) NOT NULL, 5 | `duration` VARCHAR(255) NOT NULL, 6 | PRIMARY KEY (`id`) 7 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 8 | -------------------------------------------------------------------------------- /08-sql_challenge/3-domain_events_legacy/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:3.14 2 | WORKDIR /app 3 | 4 | RUN apk add --no-cache bash uuidgen mysql-client 5 | -------------------------------------------------------------------------------- /08-sql_challenge/3-domain_events_legacy/docker-compose.yaml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | mariadb: 5 | container_name: codely-awesome_bash_challenges-9_1-mariadb 6 | image: mariadb:10.7.4 7 | ports: 8 | - "3360:3306" 9 | environment: 10 | - MYSQL_ROOT_PASSWORD= 11 | - MYSQL_ALLOW_EMPTY_PASSWORD=yes 12 | - MARIADB_DATABASE=mooc 13 | volumes: 14 | - ./sql:/docker-entrypoint-initdb.d 15 | healthcheck: 16 | test: ["CMD", "mysqladmin", "--user=root", "--password=", "--host=127.0.0.1", "ping", "--silent"] 17 | interval: 2s 18 | timeout: 10s 19 | retries: 10 20 | command: ["--default-authentication-plugin=mysql_native_password --log-bin"] 21 | 22 | random_course_creator: 23 | container_name: codely-awesome_bash_challenges-9_1-random_course_creator 24 | user: "${UID}:${GID}" 25 | build: 26 | context: . 27 | dockerfile: Dockerfile 28 | restart: unless-stopped 29 | volumes: 30 | - ./random_course_creator:/app:delegated 31 | depends_on: 32 | - mariadb 33 | command: bash creator.sh 34 | -------------------------------------------------------------------------------- /08-sql_challenge/3-domain_events_legacy/execute.sh: -------------------------------------------------------------------------------- 1 | docker exec -it codely-awesome_bash_challenges-9_1-mariadb tail -f ./var/lib/mysql/general.log | 2 | grep "INSERT INTO courses" | 3 | awk -F\' '{print "{\"id\":\""$2"\",\"name\":\""$4"\",\"duration\":\""$6"\"}"}' 4 | -------------------------------------------------------------------------------- /08-sql_challenge/3-domain_events_legacy/random_course_creator/courses_words.txt: -------------------------------------------------------------------------------- 1 | & 2 | - 3 | 0 4 | 100% 5 | api 6 | aws 7 | aws: 8 | acompañamientos 9 | actions 10 | agile: 11 | android 12 | angularjs 13 | architecture 14 | arquitectura 15 | atajos 16 | auditorías 17 | auto 18 | automatiza 19 | avanzado: 20 | axon 21 | bdd 22 | balancers 23 | bash 24 | bloaters 25 | buenas 26 | cqrs 27 | cqrs: 28 | css 29 | css: 30 | centraliza 31 | change 32 | clean 33 | code 34 | code: 35 | codely 36 | codelytv 37 | command 38 | cómo 39 | comportamiento 40 | comunicación 41 | continua 42 | crea 43 | creacionales 44 | ddd 45 | dark 46 | de 47 | desarrolla 48 | design 49 | development 50 | directos 51 | diseño 52 | diseño: 53 | docker: 54 | domain-driven 55 | ec2: 56 | elk: 57 | elastic 58 | entrevistas 59 | escalando 60 | espresso 61 | estado 62 | event 63 | event-driven 64 | exprimiendo 65 | figma 66 | flex 67 | framework 68 | gestión 69 | gherkin 70 | git: 71 | github 72 | go 73 | go: 74 | grafana 75 | grid 76 | groups 77 | http 78 | hexagonal 79 | integración 80 | intellij 81 | introducción 82 | java 83 | javascript 84 | jest 85 | kif 86 | karabiner: 87 | kotlin 88 | kotlin: 89 | kubernetes 90 | layouts 91 | light 92 | lightning 93 | linting 94 | linux 95 | load 96 | loki 97 | mean 98 | makefiles 99 | maquetando 100 | más 101 | mecánicos 102 | migrando 103 | modelado 104 | monitoring 105 | mundo 106 | notion: 107 | novedades 108 | oo 109 | php 110 | patrones 111 | preventers 112 | principios 113 | pro 114 | productividad 115 | programación 116 | programar 117 | programming 118 | prometheus 119 | query 120 | react 121 | reactjs: 122 | real™ 123 | refactor 124 | refactoring 125 | responsibility 126 | solid 127 | scala 128 | scaling 129 | screenshot 130 | scripting 131 | segregation 132 | setup 133 | smells 134 | sourcing 135 | stack 136 | symfony 137 | tdd 138 | tdd: 139 | talks 140 | teclados 141 | terminal 142 | test-driven 143 | testing 144 | testing: 145 | todo 146 | tu 147 | typeclasses 148 | typescript 149 | typescript: 150 | ui 151 | visualiza 152 | vue 153 | vuejs 154 | vuex 155 | web 156 | webpack 157 | zsh 158 | a 159 | accesibles 160 | al 161 | alla 162 | any 163 | aplicaciones 164 | aplicadas 165 | aplicados 166 | aplicando 167 | app 168 | apps 169 | arquitectura 170 | buenas 171 | con 172 | dataflow 173 | de 174 | deploy 175 | desarrolladores 176 | desde 177 | día 178 | día: 179 | dotfiles 180 | extreme 181 | ejemplos 182 | el 183 | en 184 | entre 185 | equipo 186 | escalable 187 | exclusivos 188 | flujo 189 | fondo 190 | frontend 191 | funcional: 192 | ios 193 | iterm: 194 | la 195 | las 196 | logs 197 | los 198 | macos 199 | mantenible 200 | mejorar 201 | métricas 202 | microservicios: 203 | moderno 204 | mundo 205 | para 206 | performance 207 | plugins 208 | prácticas 209 | primer 210 | primera 211 | productiva 212 | profesional 213 | progresivamente 214 | real 215 | retrospectivas 216 | servicios 217 | sobre 218 | teclado 219 | testing 220 | themes 221 | todo 222 | trabajo 223 | tu 224 | tus 225 | una 226 | unidirectional 227 | vistas 228 | web 229 | y 230 | -------------------------------------------------------------------------------- /08-sql_challenge/3-domain_events_legacy/random_course_creator/creator.sh: -------------------------------------------------------------------------------- 1 | function random_course_name() { 2 | name=$(shuf -n4 ./courses_words.txt | xargs echo) 3 | 4 | echo "${name^}" 5 | } 6 | 7 | function random_duration() { 8 | echo $((RANDOM % 50 + 1)) "hours" 9 | } 10 | 11 | function generate_random_course_insert() { 12 | course_id=$(uuidgen) 13 | course_name=$(random_course_name) 14 | course_duration=$(random_duration) 15 | 16 | echo "INSERT INTO courses (id, name, duration) VALUES ('$course_id', '$course_name', '$course_duration');" 17 | } 18 | 19 | total_inserts=0 20 | while true; do 21 | number_of_inserts_per_second=$(<./number_of_inserts_per_second) 22 | seconds_between_inserts=$(echo "scale=2; 1 / $number_of_inserts_per_second" | bc) 23 | 24 | insert=$(generate_random_course_insert) 25 | mysql -uroot -hcodely-awesome_bash_challenges-9_1-mariadb --database=mooc -e"$insert" 26 | total_inserts=$((total_inserts + 1)) 27 | echo "$total_inserts> ($number_of_inserts_per_second inserts/s): '$insert' - Executed" 28 | 29 | sleep "$seconds_between_inserts" 30 | done 31 | -------------------------------------------------------------------------------- /08-sql_challenge/3-domain_events_legacy/random_course_creator/number_of_inserts_per_second: -------------------------------------------------------------------------------- 1 | 100 2 | -------------------------------------------------------------------------------- /08-sql_challenge/3-domain_events_legacy/sql/01-courses.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `courses` 2 | ( 3 | `id` CHAR(36) NOT NULL, 4 | `name` VARCHAR(255) NOT NULL, 5 | `duration` VARCHAR(255) NOT NULL, 6 | PRIMARY KEY (`id`) 7 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 8 | -------------------------------------------------------------------------------- /09-conclusions/1-interesting_tooling/01-youplot.sh: -------------------------------------------------------------------------------- 1 | uplot bar -H -d, -t "Home runs" _simple_input.csv 2 | -------------------------------------------------------------------------------- /09-conclusions/1-interesting_tooling/02-awk.sh: -------------------------------------------------------------------------------- 1 | awk -F, '{print $3","$8}' _input.csv 2 | -------------------------------------------------------------------------------- /09-conclusions/1-interesting_tooling/03-yq.sh: -------------------------------------------------------------------------------- 1 | yq -p csv -o yaml '.[] | {"player": .player, "hr": .home_runs}' _input.csv 2 | -------------------------------------------------------------------------------- /09-conclusions/1-interesting_tooling/04-miller.sh: -------------------------------------------------------------------------------- 1 | mlr -csv sort -nr home_runs _input.csv 2 | -------------------------------------------------------------------------------- /09-conclusions/1-interesting_tooling/05-combine.sh: -------------------------------------------------------------------------------- 1 | mlr -csv sort -nr home_runs _input.csv | awk -F, '{print $3","$8}' | uplot bar -H -d, -t "Home runs" 2 | -------------------------------------------------------------------------------- /09-conclusions/1-interesting_tooling/_input.csv: -------------------------------------------------------------------------------- 1 | id,team,player,bio,year,stint,lg,home_runs,ab,r,h,X2b,X3b,hr,rbi,sb,cs,bb,so,ibb,hbp,sh,sf,gidp 2 | 88641,NYA,womacto01,"De toda la vida",2000,2,NL,19,50,6,14,1,0,1,2.0,1.0,1.0,4,4.0,0.0,0.0,3.0,0.0,0.0 3 | 88643,SBL,schilcu01,"Sant Boi a tope",2005,1,AL,31,2,0,1,0,0,0,0.0,0.0,0.0,0,1.0,0.0,0.0,0.0,0.0,0.0 4 | 88645,LAC,myersmi01,"",2006,1,AL,62,0,0,0,0,0,0,0.0,0.0,0.0,0,0.0,0.0,0.0,0.0,0.0,0.0 5 | 88649,LAC,helliri01,"Home ruuuun",2006,1,NL,20,3,0,0,0,0,0,0.0,0.0,0.0,0,2.0,0.0,0.0,0.0,0.0,0.0 6 | 88650,NYA,JavierCane,"Programo",2000,1,AL,159,6,0,1,0,0,0,0.0,0.0,0.0,0,4.0,0.0,0.0,0.0,0.0,0.0 7 | 88652,SBL,finLASest01,"",2006,1,NL,139,426,66,105,21,12,6,40.0,7.0,0.0,46,55.0,2.0,2.0,3.0,4.0,6.0 8 | 88653,NYA,gonzalu01,"De siempre",2000,1,NL,153,586,93,159,52,2,15,73.0,0.0,1.0,69,58.0,10.0,7.0,0.0,6.0,14.0 9 | 88662,LAC,ANTINYA12,"",2006,1,NL,28,26,2,5,1,0,0,0.0,0.0,0.0,1,7.0,0.0,0.0,6.0,0.0,1.0 10 | 89177,NYA,francju01,"Corro mucho",2007,2,NL,15,40,1,10,3,0,0,8.0,0.0,0.0,4,10.0,1.0,0.0,0.0,1.0,1.0 11 | -------------------------------------------------------------------------------- /09-conclusions/1-interesting_tooling/_simple_input.csv: -------------------------------------------------------------------------------- 1 | player,home_runs 2 | womacto01,10 3 | schilcu01,15 4 | myersmi01,35 5 | helliri01,12 6 | JavierCane,159 7 | finLASest01,153 8 | gonzalu01,12 9 | ANTINYA12,30 10 | francju01,2 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | 4 | 5 | 6 | Codely logo 7 | 8 | 9 |

10 | 11 |

12 | 🎲 Awesome Bash Challenges 13 |

14 | 15 |

16 | Build status 17 | Codely Open Source 18 | CodelyTV Courses 19 |

20 | 21 |

22 | Bash challenges to dominate JSONs, CSVs, YAMLs…. 23 |

24 | 25 |

26 | Stars are welcome 😊 27 |

28 | -------------------------------------------------------------------------------- /_shared/compare_json.sh: -------------------------------------------------------------------------------- 1 | function it_should_output_the_expected_json() { 2 | executor_file="$1" 3 | expected_output_file="$2" 4 | actual_output=$(sh "$executor_file") 5 | 6 | diff <(echo "$actual_output" | jq --sort-keys .) <(jq --sort-keys . "$expected_output_file") && echo "✅ All ok!" && exit 0 || echo "❌ The output is not the expected" && exit 1 7 | } 8 | -------------------------------------------------------------------------------- /_shared/compare_text.sh: -------------------------------------------------------------------------------- 1 | function it_should_output_the_expected_text() { 2 | executor_file="$1" 3 | expected_output_file="$2" 4 | actual_output=$(sh "$executor_file") 5 | 6 | diff "$expected_output_file" <(echo "$actual_output") && echo "✅ All ok!" && exit 0 || echo "❌ The output is not the expected" && exit 1 7 | } 8 | --------------------------------------------------------------------------------