remove posts and fix rss images path

This commit is contained in:
juancmandev 2025-03-26 12:32:46 -06:00
parent 18c93ff3bb
commit 2b399b3ae1
25 changed files with 42 additions and 595 deletions

View File

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 36 KiB

View File

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 37 KiB

View File

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

View File

@ -6,7 +6,7 @@ const contentSchema = z.object({
description: z.string(), description: z.string(),
image: z.string(), image: z.string(),
imageCaption: z.string(), imageCaption: z.string(),
date: z.coerce.date(), date: z.coerce.date().optional(),
tags: z.array(z.string()), tags: z.array(z.string()),
author: z.string(), author: z.string(),
rss: z.boolean(), rss: z.boolean(),

View File

@ -2,14 +2,14 @@
title: Build a fullstack web app title: Build a fullstack web app
description: Build a fullstack web app using Next.js as meta-framework and PostgreSQL as database. description: Build a fullstack web app using Next.js as meta-framework and PostgreSQL as database.
tags: [Next.js, PostgreSQL, Prisma, Auth.js, tailwindcss, shadcn/ui] tags: [Next.js, PostgreSQL, Prisma, Auth.js, tailwindcss, shadcn/ui]
image: /portfolio/build-a-fullstack-app/banner.png image: /blog/build-a-fullstack-app/banner.png
imageCaption: Banner with the tech stack used in this tutorial, Next.js, TailwindCSS, shadcn/ui, Prisma, PostgreSQL and Auth.js. imageCaption: Banner with the tech stack used in this tutorial, Next.js, TailwindCSS, shadcn/ui, Prisma, PostgreSQL and Auth.js.
date: 2024-1-18 date: 2024-1-18
author: Juan Manzanero author: Juan Manzanero
rss: true rss: true
--- ---
![Banner with the tech stack used in this tutorial, Next.js, TailwindCSS, shadcn/ui, Prisma, PostgreSQL and Auth.js](@/assets/portfolio/build-a-fullstack-app/banner.png) ![Banner with the tech stack used in this tutorial, Next.js, TailwindCSS, shadcn/ui, Prisma, PostgreSQL and Auth.js](@/assets/blog/build-a-fullstack-app/banner.png)
_Tech stack used in this tutorial_ _Tech stack used in this tutorial_
[GitHub repo](https://github.com/juancmandev/fullstack-app) [GitHub repo](https://github.com/juancmandev/fullstack-app)

View File

@ -1,76 +0,0 @@
---
title: Human to JS
description: Translate human language to JavaScript code!
tags: [ChatGPT, Next.js, JavaScript, Vercel]
image: /portfolio/human-to-js/banner.png
imageCaption: Human to JS Banner
date: 2023-4-14
author: Juan Manzanero
rss: true
---
![Human to JS banner](@/assets/portfolio/human-to-js/banner.png) _Human to JS diagram_
_This project has been achieved._
## Background
Im always looking to grow my career by learning new technologies as well known
Software Engineer; however, that could be dangerous because Software Engineer is
not about using the ultimate tech stack but making things happen.
## Inspiration source
I was checking Twitter until I found a tweet where a person created a side
project over a weekend. That project is
[SQL Translator](https://www.sqltranslate.app/), a simple UI to put text input
describing a query; then you get the query into SQL, simple!
[@whoiskatrin](https://twitter.com/whoiskatrin?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1634973237829599233%7Ctwgr%5Eb49b9d28e6ea7383ef16ea3c8c6040656ff0c944%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fpublish.twitter.com%2F%3Fquery%3Dhttps3A2F2Ftwitter.com2Fwhoiskatrin2Fstatus2F1634973237829599233widget%3DTweet)
used ChatGPT API to send a prompt typed by the user, and then show SQL response
into a component to copy to the clipboard. That was enough to get the deserved
attention of the community.
[Tweet link](https://twitter.com/whoiskatrin/status/1634973237829599233)
## My idea
> _“Why not a web app to type a prompt to generate JavaScript code?”_
So I started to build my idea using this tech stack:
- **Next.js**: Web framework to build the UI and Next.js provides you with an
API directory to communicate with ChatGPT API
- **MUI**: To use the UI components and as a design system
- **Formik & Yup**: To manage the state of the prompt form and create validation
schemas
Using all these technologies I build a simple UI with a MUI Card component, then
I created a form where I manage all the inputs with Formik, the text and select
inputs are directly from MUI, and to create the validation schema I used Yup to
mark as required those fields and dont send them empty.
With the UI finished, I started creating the endpoint in the API directory to
consume ChatGPTs API, just using a fetch
like [@whoiskatrin](https://twitter.com/whoiskatrin?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1634973237829599233%7Ctwgr%5Eb49b9d28e6ea7383ef16ea3c8c6040656ff0c944%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fpublish.twitter.com%2F%3Fquery%3Dhttps3A2F2Ftwitter.com2Fwhoiskatrin2Fstatus2F1634973237829599233widget%3DTweet)s
project, indicating which OpenAI model to use, in this case, *text-davinci-003*,
you can learn more about those
models [here](https://platform.openai.com/docs/api-reference/models/list).
Obviously, in that request, I send the prompt from the user into a string
indicating ChatGPT to only give me the code, without comments or more results.
## Added value
Yes, therere options like GitHub Copilot that resolve that problem, thats why
I added a select option to choose if the syntax should be an arrow function or a
simple function.
Ill add more features, like a TypeScript option, and use a TS Interface to use
as a reference, but now Im working on more projects!
## Inspiring people!
The cool thing about side projects is that inspires people like us, we can use
our tech skill that serves the bread on the table to transform ideas into
products, and products into a community, as
[@Serudda](https://twitter.com/serudda) talks in this
[video](https://www.youtube.com/watch?v=LXgPNdw8avI&t) (video audio in Spanish).

View File

@ -1,36 +0,0 @@
---
title: I will not continue creating content in Spanish for my website
description:
I had the idea of maintaining my website in both English and Spanish; however,
that is giving me some trouble, like taking more time to create content.
tags: [Personal]
image: /blog/i-will-not-continue-creating-content-in-spanish-for-my-website/banner.jpg
imageCaption: Letters mixed
date: 2024-2-20
author: Juan Manzanero
rss: false
draft: true
---
![Letters mixed](@/assets/blog/i-will-not-continue-creating-content-in-spanish-for-my-website/banner.jpg)
_Mixed letters. Photo by
[Jason Leung](https://unsplash.com/@ninjason?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash)
on
[Unsplash](https://unsplash.com/photos/red-alphabet-decors-0sBTrm726C8?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash)_
_Note: I retaked redacting in Spanish for my website, but I'll keep this post
anyway_
I had the idea of maintaining my website in both English and Spanish; however,
that is giving me some trouble, like taking more time to create content.
That's why I have decided to only create content in English for now and in the
future.
It doesn't mean that I reject my mother tongue or something like that, but just
practicality.
I'll try to update the links to my posts shared on social media, as this website
will be just juancman.dev/blog instead of juancman.dev/[locale]/blog.
However, if you want to contact me in Spanish, feel free to do it.

View File

@ -2,14 +2,14 @@
title: Next Intl Blog Template title: Next Intl Blog Template
description: Start your blog in multiple languages! description: Start your blog in multiple languages!
tags: [Next.js, next-intl, tailwindcss] tags: [Next.js, next-intl, tailwindcss]
image: /portfolio/next-intl-blog-template/banner.png image: /blog/next-intl-blog-template/banner.png
imageCaption: Next Intl Blog Template banner imageCaption: Next Intl Blog Template banner
date: 2023-12-18 date: 2023-12-18
author: Juan Manzanero author: Juan Manzanero
rss: true rss: true
--- ---
![Next Intl Blog Template banner](@/assets/portfolio/next-intl-blog-template/banner.png) ![Next Intl Blog Template banner](@/assets/blog/next-intl-blog-template/banner.png)
_Next Intl Blog Template banner_ _Next Intl Blog Template banner_
[GitHub](https://github.com/juancmandev/next-intl-blog-template) [GitHub](https://github.com/juancmandev/next-intl-blog-template)

View File

@ -1,65 +0,0 @@
---
title: Peddler App
description: You hear the ice cream man in his truck, you try to catch him, but the guy is already far away.
tags: [Tech, SideProject]
image: "/blog/peddler-app/banner.png"
imageCaption: Peddler App provisional logo
date: 2023-12-11
author: Juan Manzanero
rss: true
---
![Peddler App provisional logo](@/assets/blog/peddler-app/banner.png) _Peddler App
provisional logo_
## The idea
You hear the ice cream man in his truck, you try to catch him, but the guy is already far away.
Why not get a notification on your phone when the ice cream man is near you? So
you can just tap the notification and request the ice cream man to go to your
location.
That's the purpose of this app.
## Overwhelming for me
I'd never developed a big app just by myself, but I want to try and see what
happens.
I want to follow the Indie Hacker way, sharing in public the progress, and
getting feedback from the community.
This post is the first step before designing in Figma or even creating the
landing page, so I want to hear if you're interested, why you're not, or what
would be great for the app.
## Starting small
I really want to start small, launching a Minimum Viable Product (MVP), with the
next features:
- User registration and login
- Two types of users, peddlers and customers
- Peddlers
- If the user is a peddler (wants to sell), redirect to the peddler form
- Peddlers can create a profile with the name of their company and products
that offer, for example ice cream, candy, etc
- Once the registration is finished, peddlers can start routes
- The app gets the location of the peddler, showing it on a map
- The backend will detect if the peddler enters a radius of a customer, and
send a push notification to the customer
- Once the peddler has a request, the app will show the location of the
requesting customer on the map
- The peddler can go to the destination, and fulfill the transaction
- Customers
- Customers can just create a profile with their name or alias, and set
locations, for example: house
- Once a peddler is near, the backend will send a notification to the customer
- The customer taps and confirms the notification
Of course, customers would change notifications settings and more, but that's
the core idea.
For the MVP I don't want to implement in-app payments, but of course, it could
be a future feature.

View File

@ -2,14 +2,14 @@
title: Website migrated to Astro title: Website migrated to Astro
description: I migrated this website to Astro, so I can test it and I really like it the features of Astro. description: I migrated this website to Astro, so I can test it and I really like it the features of Astro.
tags: [Astro] tags: [Astro]
image: /portfolio/website-migrated-to-astro/banner.png image: /blog/website-migrated-to-astro/banner.png
imageCaption: Next Intl Blog Template banner imageCaption: Next Intl Blog Template banner
date: 2024-6-26 date: 2024-6-26
author: Juan Manzanero author: Juan Manzanero
rss: true rss: true
--- ---
![Banner showing the tech stack](@/assets/portfolio/website-migrated-to-astro/banner.png) ![Banner showing the tech stack](@/assets/blog/website-migrated-to-astro/banner.png)
_Tech stack used. Astro, React, TailwindCSS, MDX_ _Tech stack used. Astro, React, TailwindCSS, MDX_
So yeah, I proved this tool for building static websites, as Vercel has been taking weird decisions about the direction of the development of Next.js. So yeah, I proved this tool for building static websites, as Vercel has been taking weird decisions about the direction of the development of Next.js.

View File

@ -1,74 +0,0 @@
---
title: Workarise
description: Workarise Web App, manage tasks with your team.
tags: [React.js, Vite.js, MUI, Firebase, GCP, Node.js]
image: /portfolio/workarise/banner.png
imageCaption: Workarise Banner
date: 2023-4-13
author: Juan Manzanero
rss: true
---
![Workarise Banner](@/assets/portfolio/workarise/banner.png) _Workarise Banner_
[Website](https://workarise.com)
## Overview
[Workarise](http://workarise.com) is a Team Manager Software as a Service to
create task cards assigning people, set a start and due date, add attachments
files, etc.
You can use the Calendar to see the tasks' due dates and schedule Google Meet
events authorizing the use of your Google Calendar. You can edit and delete
events which sync with your Google Calendar and guests' Google Calendars. The
Gantt provides you with a timeline to check task duration.
The web app is developed with [React.js](https://react.dev/),
using [Vite.js](https://vitejs.dev/) to run the development environment. For
functionality like modals, and popovers we use [MUI](https://mui.com/). To
manage the state of components were using useContext.
To create Google Meet events and sync the calendar we'd develop a small Node.js
API to use Google OAuth 2 API, as we need to prompt our users to give access to
their Google Calendars.
Currently, Workarise is in the first version,
using [Firebase](https://firebase.google.com/) to authenticate users and store
raw data and files. Firebase
uses [Firestore](https://firebase.google.com/docs/firestore), a NoSQL DB,
however were developing an API using [Django](https://www.djangoproject.com/)
running on [Cloud Run](https://cloud.google.com/run) connected
to [Cloud SQL](https://cloud.google.com/sql) to a MySQL instance, as well be
using a SQL DB in the future. Currently the web app and landing are deployed on
Firebase Hosting, but well move the landing page to Vercel, and itll be
updated to use Next.js in the future to optimize SEO and publish blog posts.
## My impact in Workarise
Currently, were developing an MVP, and everyone is working part-time on this
project. I joined in December, but before there wasnt a product that users can
use, so as I was the only Frontend Engineer at that moment I taked full
responsibility for delivering something that can be considered an MVP.
It took me like 3 months to achieve that, I updated some dependencies of the
project to improve the development flow, and I suggested using Firebase as
Backend and Hosting.
Thanks to all this we got our first users and feedback, so were working on that
feedback to keep improving our app, our users like the design and simplicity!
At the moment therere 3 engineers in the team, 2 on the front (including me)
and 1 on the back, but Im helping to our Backend Engineer to deploy on GCP to
production the API and DB, and I'm guiding the new Frontend to deliver new
features, hed developed the responsive design and some features to complement
the task cards.
Im happy to test my skills in this project, its not easy to take more
responsibility with less than 2 years of labor experience, and itd help me to
grow a lot in these months.
Even if the market doesnt consider my years of experience as a senior, I think
that doesnt matter at all, the only thing that matters is that you can
understand why youre using code, to create solutions and reach people across
their computers.

View File

@ -2,14 +2,14 @@
title: Construye una App Fullstack title: Construye una App Fullstack
description: Construye una app fullstack usando Next.js como meta-framework y PostgreSQL como base de datos. description: Construye una app fullstack usando Next.js como meta-framework y PostgreSQL como base de datos.
tags: [Next.js, PostgreSQL, Prisma, Auth.js, tailwindcss, shadcn/ui] tags: [Next.js, PostgreSQL, Prisma, Auth.js, tailwindcss, shadcn/ui]
image: /portfolio/build-a-fullstack-app/banner.png image: /blog/build-a-fullstack-app/banner.png
imageCaption: "Banner con el teck stack usado en este tutorial, Next.js, TailwindCSS, shadcn/ui, Prisma, PostgreSQL y Auth.js." imageCaption: "Banner con el teck stack usado en este tutorial, Next.js, TailwindCSS, shadcn/ui, Prisma, PostgreSQL y Auth.js."
date: 2024-1-18 date: 2024-1-18
author: Juan Manzanero author: Juan Manzanero
rss: true rss: true
--- ---
![Banner con el teck stack usado en este tutorial, Next.js, TailwindCSS, shadcn/ui, Prisma, PostgreSQL y Auth.js.](@/assets/portfolio/build-a-fullstack-app/banner.png) ![Banner con el teck stack usado en este tutorial, Next.js, TailwindCSS, shadcn/ui, Prisma, PostgreSQL y Auth.js.](@/assets/blog/build-a-fullstack-app/banner.png)
_Tech stack usado en este tutorial_ _Tech stack usado en este tutorial_
[GitHub repo](https://github.com/juancmandev/fullstack-app) [GitHub repo](https://github.com/juancmandev/fullstack-app)

View File

@ -1,49 +0,0 @@
---
title: Human to JS
description: ¡Traduce lenguaje humano a código JavaScript!
tags: [ChatGPT, Next.js, JavaScript, Vercel]
image: /portfolio/human-to-js/banner.png
imageCaption: Human to JS Banner
date: 2023-4-14
author: Juan Manzanero
rss: true
---
![Human to JS banner](@/assets/portfolio/human-to-js/banner.png) _Human to JS diagram_
_Este proyecto ha sido archivado._
## Retrospectiva
Siempre estoy buscando crecer mi carrera aprendiendo nuevas tecnologías como buen Ingeniero en Software; sin embargo, eso puede ser peligroso ya que la Ingeniería en Software no es sobre usar el último tech stack, sino de hacer que las cosas ocurran.
## Fuente de inspiración
Estaba revisando Twitter hasta que encontré un tweet de una persona que había creado un **side project** en un fin de semana. Ese proyecto es [SQL Translator](https://www.sqltranslate.app/), una simple UI para escribir un texto describiendo una consulta, entonces obtienes la consulta en código SQL, ¡simple!
[@woiskatring](https://twitter.com/whoiskatrin?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1634973237829599233%7Ctwgr%5Eb49b9d28e6ea7383ef16ea3c8c6040656ff0c944%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fpublish.twitter.com%2F%3Fquery%3Dhttps3A2F2Ftwitter.com2Fwhoiskatrin2Fstatus2F1634973237829599233widget%3DTweet) usó la API de ChatGPT para enviar un prompt escrito por el user, devolviendo una respuesta en SQL dentro de un component para copiar al portapapeles. Eso fue suficiente para obtener la atención merecida por la comunidad. [Tweet link](https://twitter.com/whoiskatrin/status/1634973237829599233))
## Mi idea
> _¿Por qué no una web app para escribir un prompt y genera código JavaScript?_
Así que comencé a construir mi idea usando este tech stack:
- **Next.js**: Framework web para construir la UI y como Next.js provee un directorio API para comunicarte con la API de ChatGPT
- **MUI**: Para usar los UI components como sistema de diseño
- **Fromik & Yup**: Para manejar el estado del formulario del prompt y crear esquemas de validación
- **react-syntax-highlighter**: Para mostrar la respuesta de ChatGPT
Usando todas estas tecnologías construí una UI simple usando el MUI Card component, entonces creé el form donde manejé todos los inputs con Formik, los inputs de tipo text y select son los por defecto de MUI, y para crear el esquema de validación usé Yup para marcar como required aquellos inputs para no enviarlos vacíos.
Con la UI finalizada, comencé a crear el endpoint en el directorio de la API para consumir la API de ChatGPT, tan solo usando un fetch como en el proyecto de [@whoiskatrin](https://twitter.com/whoiskatrin?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1634973237829599233%7Ctwgr%5Eb49b9d28e6ea7383ef16ea3c8c6040656ff0c944%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fpublish.twitter.com%2F%3Fquery%3Dhttps3A2F2Ftwitter.com2Fwhoiskatrin2Fstatus2F1634973237829599233widget%3DTweet). indicando qué modelo de OpenAI utilizar, en este caso _text-davinci-003_, puedes aprender más de los esos modelos [aquí](https://platform.openai.com/docs/api-reference/models/list). Obviamente en la petición envié el prompt del user dentro de un string indicando a ChatGPT que solo me de el código, sin comentarios o resultados adicionales.
## Valor añadido
Sí, hay opciones como GitHub Copilot que resuelven ese problema, y eso es por qué agregué la opción de escoger qué tipo de sintaxis usar, arrow function o simple function.
Añadiré más features, como una opción para TypeScript, y usar una TS Interface para que se use como referencia, ¡pero ahora estoy trabajando en más proyectos!
## Inspirando personas
Lo genial de los side projects is que inspira personas como nosotros, podemos usar nuestras habilidades técnicas que llevan el pan a la mesa para transformar ideas en productos, y productos en comunidades, tal como [@Serudda](https://twitter.com/serudda) habla en este [video](https://www.youtube.com/watch?v=LXgPNdw8avI&t).

View File

@ -2,14 +2,14 @@
title: Next Intl Blog Template title: Next Intl Blog Template
description: ¡Comienza tu blog en múltiples idiomas! description: ¡Comienza tu blog en múltiples idiomas!
tags: [Next.js, next-intl, tailwindcss] tags: [Next.js, next-intl, tailwindcss]
image: /portfolio/next-intl-blog-template/banner.png image: /blog/next-intl-blog-template/banner.png
imageCaption: Next Intl Blog Template banner imageCaption: Next Intl Blog Template banner
date: 2023-12-18 date: 2023-12-18
author: Juan Manzanero author: Juan Manzanero
rss: true rss: true
--- ---
![Next Intl Blog Template banner](@/assets/portfolio/next-intl-blog-template/banner.png) ![Next Intl Blog Template banner](@/assets/blog/next-intl-blog-template/banner.png)
_Next Intl Blog Template banner_ _Next Intl Blog Template banner_
[GitHub](https://github.com/juancmandev/next-intl-blog-template) [GitHub](https://github.com/juancmandev/next-intl-blog-template)

View File

@ -1,54 +0,0 @@
---
title: Peddler App
description: Escuchas al heladero en su camioneta, intentas alcanzarlo, pero ya está lejos.
tags: [Tech, SideProject]
image: /blog/peddler-app/banner.png
imageCaption: Logo provisional de Peddler App
date: 2023-12-11
author: Juan Manzanero
rss: true
---
![Logo provisional de Peddler App](@/assets/blog/peddler-app/banner.png) _Logo provisional de Peddler App_
## La idea
Escuchas al heladero en su camioneta, intentas alcanzarlo, pero ya está lejos.
¿Por qué no recibir una notificación en tu celular cuando el heladero está cerca de ti?, así puedes tocar la
notificación y solicitar al heladero que pase en tu ubicación.
Ese es el propósito de esta app.
## Abrumador para mi
Nunca he desarrollado una app grande por mi mismo, pero quiero intentarlo y ver qué ocurre.
Quiero seguir el camino Indie Hacker, compartiendo en público el progreso, y recibiendo feedback
de la comunidad.
Este post es el primer paso antes de diseñarlo en Figma o incluso crear la landing page, así que
quiero escuchar si te interesa, por qué no, o que sería genial para la app.
## Empezando pequeño
Realmente quiero empezar pequeño, lanzando un Minimum Viable Product (MVP), con las siguientes funcionalidades:
- Registro de usuarios y login
- Dos tipos de usuarios, "peddlers" (vendedores ambulantes) y clientes
- Peddlers
- Si el usuario es peddler (quiere vender), redireccionar al formulario de peddlers
- Peddlers pueden crear un perfil con el nombre de su empresa y productos que ofrece, por ejemplo helado, dulces, etc
- Una vez que el registro es finalizado, peddlers pueden iniciar rutas
- La app obtiene la ubicación del peddler, mostrándolo en el mapa
- El backend detectará si el peddler entra en el radio de un cliente, y enviará una notificación push al cliente
- Una vez que el peddler tiene una solicitud, la app mostrará la ubicación del cliente solicitante en el mapa
- El peddler puede ir a la ubicación, y completar la transacción
- Clientes
- Clientes pueden crear una perfil con su nombre o alias, y registrar ubicaciones, por ejemplo: casa
- Una vez que un peddler está cerca, el backend enviará una notificación push al cliente
- El cliente toca y confirma la notificación
Por supuesto, clientes pueden cambiar la configuración de las notificaciones, pero esa es la idea core.
Para el MVP no quiero implementar pagos dentro de la app, pero desde luego, podría ser un feature futuro.

View File

@ -2,14 +2,14 @@
title: Website migrado a Astro title: Website migrado a Astro
description: Migré este website a Astro, de tal forma para probarlo, me terminó gustando. description: Migré este website a Astro, de tal forma para probarlo, me terminó gustando.
tags: [Astro] tags: [Astro]
image: /portfolio/website-migrated-to-astro/banner.png image: /blog/website-migrated-to-astro/banner.png
imageCaption: Next Intl Blog Template banner imageCaption: Next Intl Blog Template banner
date: 2024-6-26 date: 2024-6-26
author: Juan Manzanero author: Juan Manzanero
rss: true rss: true
--- ---
![Banner mostrando el tech stack](@/assets/portfolio/website-migrated-to-astro/banner.png) ![Banner mostrando el tech stack](@/assets/blog/website-migrated-to-astro/banner.png)
_Tech stack usado. Astro, React, TailwindCSS, MDX_ _Tech stack usado. Astro, React, TailwindCSS, MDX_
Migré este website a Astro, de tal forma para probarlo, me terminó gustando. Migré este website a Astro, de tal forma para probarlo, me terminó gustando.

View File

@ -1,40 +0,0 @@
---
title: Workarise
description: Workarise Web App, administra tareas con tu equipo.
tags: [React.js, Vite.js, MUI, Firebase, GCP, Node.js]
image: /portfolio/workarise/banner.png
imageCaption: Workarise Banner
date: 2023-4-13
author: Juan Manzanero
rss: true
---
![Workarise Banner](@/assets/portfolio/workarise/banner.png) _Workarise Banner_
[Website](https://workarise.com)
## Descripción General
[Workarise](https://workarise.com) es un Software como Servicio para administrar equipos mediante task cards asignadas a personas, establece una fecha de inicio y final, agregar archivos, etc.
Puedes usar el Calendario para ver las fechas de entrega de las tareas y agendar eventos de Google Meet autorizando el uso de tu Google Calendar. Puedes editar y borrar eventos los cuales se sincronizan con tu Google Calendar y el de los invitados. El Gantt te provee con una línea del tiempo para ver la duración de las tareas.
La web app está desarrollada con [React.js](https://react.dev/), usando [Vite.js](https://vitejs.dev/) para correr el entorno de desarrollo. Para funcionalidades como modals y popovers usamos [MUI](https://mui.com/). Para manejar el estado de los componentes usamos useContext.
Para crear eventos Google Meet y sincronizar el calendario hemos desarrollado una pequeña API con Node.js para usar la API de Google OAuth 2, ya que necesitamos pedir permiso para acceder al Google Calendar del user.
Actualmente, Workarise está en su primera versión, usando [Firebase](https://firebase.google.com/) para autenticar a los users, guardar datos y archivos. Firebase utiliza [Firestore](https://firebase.google.com/docs/firestore), una Base de Datos NoSQL, sin embargo estamos desarrollando una API con [Django](https://www.djangoproject.com/) corriendo en [Cloud Run](https://cloud.google.com/run)) conectado a [Cloud SQL](https://cloud.google.com/sql) a una instancia MySQL, ya que usaremos una Base de Datos SQL en el futuro. Actualmente la web app y la landing están desplegadas en Firebase Hosting, pero moveremos la landing a Vercel, y será actualizada a Next.js in el futuro para optimizar el SEO y publicar blog posts.
## Mi impacto en Workarise
Actualmente, estamos desarrollando un MVP, y todos estamos a tiempo parcial en este proyecto. Me uní en Diciembre, pero antes no había un producto que los users pudieran usar, y como era el único Ingeniero Frontend en ese momento tomé toda la responsabilidad de entregar algo que pudiera considerarse un MVP.
Me tomó alrededor de 3 meses para conseguir eso, actualicé algunas de las dependencias del proyecto para mejorar el flujo de desarrollo, y sugerí usar Firebase como Backend y Hosting.
Gracias a todo esto obtuvimos nuestros primeros users y feedback, así que ahora estamos trabajando con ese feedback para mantener mejorando nuestra app, ¡a nuestros users les gusta el diseño y la simplicidad!
Ahora mismo hay 3 engineers en el equipo, 2 en el front (incluyéndome) y 1 en el back, pero estoy ayudando a nuestra Backend Engineer para desplegar en GCP a producción la API y Base de Datos, y estoy guiando al nuevo Frontend Engineer para entregar nuevos features, él ha desarrollado el responsive design y algunos features que complementan las task cards.
Estoy feliz de poner a prueba mis habilidades en este proyecto, no es fácil tomar más responsabilidad con menos de 2 años de experiencia laboral, y me ha ayudado a crecer mucho en estos meses.
Incluso si el mercado no considera mis años como senior, creo que eso no importa tanto, lo único que importa es que puedas entender por qué usas código, para crear soluciones y alcanzar a las personas a través de sus computadoras.

View File

@ -0,0 +1,20 @@
---
title: La Privacidad en la Era Actual
description: En la era de los datos, estos mismos son valen más de lo que crees.
tags:
- Tech
- Freedom
- Libre
image: /blog/how-computers-works/banner.jpg
imageCaption: Video thumbnail.
date: 7/25/2024
author: Juan Manzanero
rss: true
---
![Open laptop](@/assets/blog/how-computers-works/banner.jpg) _An open laptop.
Photo by
[Philipp Katzenberger](https://unsplash.com/@fantasyflip?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText')
on
[Unsplash](https://unsplash.com/photos/iIJrUoeRoCQ?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)_

View File

@ -1,184 +0,0 @@
---
title: Nadie Entiende la Privacidad
description: Hablar de privacidad es complicado, ya que muy pocos la entienden.
tags:
- Tech
- Freedom
- Libre
image: /blog/how-computers-works/banner.jpg
imageCaption: Video thumbnail.
date: 7/25/2024
author: Juan Manzanero
rss: true
---
![Open laptop](@/assets/blog/how-computers-works/banner.jpg) _An open laptop.
Photo by
[Philipp Katzenberger](https://unsplash.com/@fantasyflip?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText')
on
[Unsplash](https://unsplash.com/photos/iIJrUoeRoCQ?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)_
## Lo que los normies dicen al escuchar "privacidad"
"¿Por qué te interesa la privacidad?, ¿acaso haces algo ilegal?"
"A mi no me interesa la privacidad, ni que tuviese algo que esconder."
"De todas formas somos espiados, no vale la pena preocuparse por la privacidad."
Estas son solo algunas de las respuestas más comunes cuando se menciona la
palabra "privacidad", pero esto solo aplica en el ecosistema digital.
## No es que tengas algo que ocultar, la privacidad es un derecho humano
Curioso, porque la mayoria de las personas cuando vamos al baño, cerramos la
puerta; son muy contadas las personas a las que permitiríamos entrar.
¿Por qué?, digo, todos sabemos lo que se hace en un baño, pero aún así, es un
espacio personal donde queremos estar a solas.
Y es que de eso se trata la privacidad, es una necesidad humana, un derecho.
La gente confunde privacidad con secretismo, creen que por querer ocultar algo,
es porque sabemos que es malo.
Pero ir al baño a satisfacer nuestras necesidas fisiológicas no es algo ilegal.
Entonces, ¿por qué la gente en general es tan cínica con respecto a la
privacidad?
## La conveniencia de los servicios de las Big Tech a cambio de tus datos
Bueno, no es sorpresa que la mayoría de estas personas son normies, gente que
usa Windows/macOS en sus PCs, quienes usan todos los servicios "gratuitos" de
Google, Facebook, Microsoft y Apple.
Estas empresas, las conocidas como "Big Tech" no son organizaciones sin ánimos
de lucro que crean servicios gratuitos, para nada.\_createMdxContent
Al contrario, son de las empresas más poderosas que han existido en la historia
de la humanidad, y su valor en la bolsa no deja de crecer.
Y es simple, aunque puedas pagar por algunas funcionalidades premium en sus
servicios, la realidad es que su verdadero producto eres **TÚ**, para ser más
específico, tus datos.
Google Chrome y Microsoft Edge no son gratuitos, recolectan tus datos para
venderte anuncios personalizados.
Tus fotos que guardas en Google Photos son analizadas por Google, pero dirás que
no te tomas fotos sin ropa...
## No hizo algo ilegal, pero fue castigado
No necesariamente debes evitar subir ese tipo de fotos (sin prejuicios), prueba
de ello está este caso de un padre de un bebé en San Francisco, California.
En resumidas cuentas, un padre tomó fotos de los genitales de su hijo debido a
un problema, se las envió a su doctor de confianza para que realizara un
diagnóstico (esto fue durante la pandemia, en 2021).
El problema fue que el padre tenía su celular con Android con el backup de fotos
con Google Photos, y dicha foto fue subida a los servers de Google.
Google desde luego tiene bots que analizan las fotos que son subidas para evitar
almacenar cosas ilegales, como pornografía infantil, y es debido a esto que el
padre fue flaggeado por el algoritmo de Google como un criminal.
Su cuenta de Google fue deshabilitada, perdió acceso a su celular y a todos sus
datos que tenía almacenados en los servicios de Google, y desde luego, Google
notificó a la policía.
Después del juicio, el jurado declaró que no se había cometido crimen alguno,
pero Google se negó a restaurar el acceso a la cuenta del padre.
Esta persona no tenía algo que esconder, y aún así fue castigado por una Big
Tech, no solo prohibiendo acceso a su cuenta, sino incluso notificando a la
policía.
Y este es el problema cuando delegas tus fotos a una empresa que analiza cada
imagen que subes, estás a la merced de los "Términos y Condiciones", o en este
caso, a la interpretación de un bot de los Términos y Condiciones.
Desde luego, nadie quiere que usen los servers de Google para guardar contenido
ilegal, pero estas medidas terminan afectando a personas que no cometieron un
crimen.
## Preocuparse por la privacidad es como preocuparse por tu salud, poco a poco antes que sea demasiado tarde
Lo sé, comenzar a preocuparse por la privacidad es intimidante, ya que es un
tema en el que hay que indagar bastante, ya que la mayoría de las personas son
muy ignorantes al respecto, pero no es necesario formatear todos tus drivers y
comenzar a usar alguna distro de Linux enfocada en privacidad desde el día cero.
Puedes comenzar dando pequeños pasos.
Este tema no es uno de blanco y negro, de ignorancia total o absoluta paranoia,
es más bien un espectro, en donde puedes situarte poco a poco más del lado de la
privacidad, pero sin llegar a ser extremista.
## Primeros pasos y alternativas
Por ejemplo, comienza cambiando tu navegador de Internet, en lugar de Chrome o
Edge, podrías usar Brave, o mejor aún, Firefox con un User.js como BetterFox,
otra alternativa es LibreWolf, un fork de Firefox con mejoras en seguridad y
privacidad.
Igual lo ideal es que no uses el gestor de contraseñas que viene por defecto en
tu navegador, lo ideal es que uses uno independiente como Bitwarden o Proton
Pass, estos cuentan con add-ons para navegadores basados en Chrome y Firefox.
De igual manera un gran paso que puedes tomar es cambiando tu email en lugar de
utilizar Outlook o Gmail, una buena alternativa es Proton Mail.
A su vez, intenta usar menos redes sociales, o como mínimo no compartas lo que
estás haciendo en ese momento, ya que puedes revelar información que no te
gustaría que sea usada en tu contra.
## Sigue así
Una vez que hayas tomados estos primeros pasos, lo ideal es que liberes por
completo tus dispositivos.
En tu computadora para empezar, instalando alguna distro de Linux, una muy buena
para gente novata en Linux es Linux Mint, basada en una de las distros más
populares (Ubuntu) pero sin las malas decisiones que ha implementado Canonical
(la empresa detrás de Ubuntu).
De igual manera tu celular es un dispositivo muy delicado, y desafortunadamente
difícil de liberar.
Para empezar, si usas un iPhone, lo mejor que podrías hacer es jailbreakearlo,
pero no es muy viable usar un iPhone si lo que te preocupa es la privacidad.
Y sí, Apple profesa mucho que los iPhones son seguros, pero eso es mentira
(hablaré más de esto en el futuro).
El dispositivo ideal sería un Android, en específico un Google Pixel reciente,
ya que estos se pueden instalar un Custom ROM de Android, una buena opción es
GrapheneOS.
Repito, no hace falta que tomes todos estos pasos de una, puedes ir poco a poco.
## No caigas en la trampa del cinismo o el pesimismo
Pero dirás: "las empresas ya tienen mis datos, de nada me sirve preocuparme
ahora".
Eso es una estupidez, es como que alguien venga a golpearte y tu no te defiendas
ya que ya te golpearon; no, lo primero que haces es defenderte.
De eso se trata la privacidad hoy en día, es un tema de defensa de los derechos,
no querer ocultar actividades ilegales.
Curiosamente, los políticos se preocupan más por su privacidad, y no
necesariamente para ocultar sus obras de caridad, pero el gobierno es quien más
va a querer restar bloqueos para poder espiar a sus ciudadanos, tal es el caso
de Estados Unidos, o en casos más extremos; China y Corea del Norte.
En fin, espero que con este video pienses dos veces cuando escuches a un normie
que no tiene nada que esconder, con lo cual puedes responder "si bien no tengo
algo que esconder, tampoco tengo algo en particular que quiera compartir
contigo".
No permitas que 1984 de George Orwell pase de ser ciencia ficción a una
predicción del futuro.

View File

@ -10,7 +10,7 @@ import type { ImageMetadata } from 'astro';
const markdownParser = new MarkdownIt(); const markdownParser = new MarkdownIt();
const imagesBlog = import.meta.glob<{ default: ImageMetadata }>( const imagesBlog = import.meta.glob<{ default: ImageMetadata }>(
'/src/assets/blog/**/**/*.{jpeg,jpg,png,gif,webp}' '/src/assets/blog/**/*.{jpeg,jpg,png,gif,webp}'
); );
export async function GET(context: any) { export async function GET(context: any) {

View File

@ -10,7 +10,7 @@ import type { ImageMetadata } from 'astro';
const markdownParser = new MarkdownIt(); const markdownParser = new MarkdownIt();
const imagesBlog = import.meta.glob<{ default: ImageMetadata }>( const imagesBlog = import.meta.glob<{ default: ImageMetadata }>(
'/src/assets/blog/**/**/*.{jpeg,jpg,png,gif,webp}' '/src/assets/blog/**/*.{jpeg,jpg,png,gif,webp}'
); );
export async function GET(context: any) { export async function GET(context: any) {

View File

@ -1,6 +1,6 @@
type TPostItem = { type TPostItem = {
id: string; id: string;
date: Date | string; date: Date | string | undefined;
title: string; title: string;
type: 'blog' | 'portfolio' | 'videos'; type: 'blog' | 'portfolio' | 'videos';
lang: string; lang: string;

View File

@ -27,7 +27,12 @@ const meses = [
'Diciembre', 'Diciembre',
]; ];
export default function formatDate(date: Date | string, lang: string) { export default function formatDate(
date: Date | string | undefined,
lang: string
) {
if (date === undefined) return '';
const newDate = new Date(date); const newDate = new Date(date);
const month = months[newDate.getMonth()]; const month = months[newDate.getMonth()];
const mes = meses[newDate.getMonth()]; const mes = meses[newDate.getMonth()];