viernes, 15 de septiembre de 2023

No pude hacer pan de trigo pero si pan de yuca

¡He conseguido hacer exitosamente pan de yuca, este es mi pan favorito! Me encanta demasiado este pan y tenía que aprender a prepararlo, pero antes de preparar este pan tuvieron que pasar varios días y 3 intentos fallidos para hacer pan. El primer intento hice la masa con su respectiva levadura, queso, harina de trigo, sal y azúcar, la amasé un par de minutos y la dejé en reposo para que la levadura se activara. 1 hora después la masa seguía igual y no había crecido ni un milímetro, sabía que algo andaba mal, pero como era mi primer pan decidí meterlo al horno, después de 60 minutos había hecho un desastre, por fuera se miraba fenomenal, pero por dentro la masa estaba dura y fea. Ese día con mucho dolor tuve que tirar a la basura todo el resultado, nadie comería ese pan.

Supe que en ese primer intento mi error fue no dejar activar la levadura, así que para el segundo intento usé los mismos ingredientes, pero esta vez amase por mucho más tiempo y usé otra levadura porque quizás la que tenía en casa estaba dañada, también recurrí a un método que encontré en internet que consiste en dejar que la levadura se active por separado en un mínimo de harina de trigo con agua tibia, luego este se revuelve con el resto de la masa y esperé que la levadura se activara, 2 horas después noté que la levadura había hecho efecto, pero era muy mínimo e insuficiente, aun así decidí continuar y hornear. El resultado fue otro desastre, aunque no tanto como el 1.er intento, esta vez pude comer pan, pero solo las partes que quedaron parcialmente bien, el resto tuve que botarlo, intenté darlo a las aves a través de la ventana de mi casa y ni las palomas quisieron comerlo.

Mis dos intentos anteriores siempre los hice en la tarde, pensé que quizás si empezaba desde temprano a preparar la masa podría dar el tiempo suficiente para activar la levadura, para este momento recién había aprendido que la levadura se activa dependiendo de la temperatura ambiente y que en zonas de frío es muy difícil, así entendí que por esta razón fallaba mi proceso, pues donde estoy la temperatura por lo general está bajo los 16 grados centígrados. Sabiendo esto, decidí hacer un tercer intento, esta vez amasando la masa por mucho tiempo y dejando la masa esperando que la levadura se activara durante muchas horas, también intenté replicar un ambiente húmedo y temperatura ideal para la levadura poniendo el horno a una temperatura de 25 grados más o menos y con agua en el fondo del horno en otro recipiente para intentar humedecer el interior del horno. En la tarde noche decidí hornear lo que sería el 3.er desastre.

Frustrado de no poder hacer pan, pero sabiendo que principalmente la falla fue activar la levadura, decidí parar mis intentos de hacer pan de trigo. Tuve una charla con una amiga que sabe hacer pan y le he comentado todos los problemas que tuve, ella me ha sugerido hacer pan de yuca porque no requiere activar la levadura, cuando escuché eso mi cerebro se iluminó y rápidamente recuperé mis esperanzas de hacer pan. Al siguiente día fui a la tienda y compré 1 libra de almidón de yuca, 500 gramos de queso campesino y 1 litro de leche entera para luego comenzar a preparar el pan, lo amase con otros ingredientes que ya tenía en casa y deje un rato que la levadura se activara, obviamente sabía que no lo lograría, pero había que intentarlo una última vez. Como imaginarán, ningún hongo de levadura se movió, todo siguió igual, la masa no había crecido ni cambiado de color, pero esto no me importaba en absoluto porque sabía que para este pan eso no era muy relevante. Hice las bolitas de pan con las manos, y lo dejé sobre la bandeja de latón que previamente había preparado con mantequilla en la superficie para evitar que se pegara el pan. Después de 20 minutos de horneado ya había logrado hacer por primera vez pan de yuca, quedó esponjoso y muy delicioso, todo perfecto, excepto que durante el horneado el pan creció tanto que se pegaron los unos con los otros. Tengo pendiente hacer una segunda versión mejorada, esta vez con las bolitas de pan más pequeñas y más separadas para evitar que se peguen.

miércoles, 16 de agosto de 2023

Tras la huella del Error: Cómo Solucioné un Problema de Render en React

Ayer, miércoles 16 de agosto, desde el equipo de QA me llegó un reporte de un error en uno de los desarrollos que había realizado, un error atípico y difícil de diagnosticar. Estuve en la mañana colocando Logs y debuggers por todos lados, los componentes afectados en los últimos cambios aparentemente no mostraban inconsistencias y renderizaciones fuera de lo normal. Pude replicar el error, pues sucedía al desplazarme por una serie de Tabs y el contenido correspondiente a cada Tab provocaba bloqueos en el sitio web. Usar la extensión React Devtools era imposible, pues al tener un error de bloqueo total de la pagina no era posible navegar, inspeccionar y usar extensiones de Chrome durante el crash.

Al tener un bloqueo de la pagina web es común pensar en una serie de excepciones que van rompiendo todo, también es cierto que en un contexto de desarrollo web puede tratarse de iteraciones indefinidas de un mismo elemento, componente o función, por eso, al llegar a la conclusión de que el problema debía ser un renderizado incontrolado de algún componente de React esta debía ser la sospecha #1.

Primer intento

Revisión superficial del problema y diagnostico inicial. Los nuevos cambios involucraban llamados a diferentes Queries de Grahpql y renderizado de componentes nuevos, por ello fue necesario validar los siguientes puntos:
  • Peticiones: Desde el navegador web, abrir el inspeccionador de elementos e ir hasta el Tab "Red" (o "Network" en Inglés) para validar que no existan llamados recurrentes e innecesarios de los queries de Graphql.
    • Resultado: Todo a la normalidad.
  • Errores en consola: Revisar que no se tengan errores o advertencias en la consola del navegador (Tab "Consola").
    • Resultado: Todo a la normalidad.
  • Profiling: Intentar hacer Profiling de los componentes de React usando la extension React Devtools.
    • Resultado: No se pudo realizar profiling debido al bloqueo de la pagina al momento de activar la opción cuando el bug se había presentado.
  • Error Boundary: Agregar como padre uno de los componentes custom llamado ErrorBoundary que sirve par capturar errores en los componentes hijos.
    • Resultado: No hubo errores, por lo tanto ErrorBoundary estaba puesto en vano.

Segundo intento

Lo primero que debía hacer era descartar que se trataba de un error en los componentes principales, por eso, el segundo intento para detectar el problema fue abrir el inspeccionador de elementos de Google Chrome y desde la opción de "Fuentes" (o "Sources" en Inglés) activar la casilla "Detenerse cuando se detecten excepciones". Una vez activada la detección de excepciones se procede a navegar en el sitio web para desencadenar todo tipo de excepciones sea cual sea que ocurran durante la navegación, así cuando el Bug se presente lo podremos ver en cuestión (siempre y cuando arroje una excepción).

Un par de horas después, había realizado el proceso de depuración de varios errores, encontrando y solucionando algunos problemas mínimos con la ayuda del step-by-step del inspecionador del navegador web. Este primer intento se consolida al detectar varios errores provocados por la carga Lazy Load de algunos componentes de React, sin embargo, tenia que intentar esta opción a pesar que no sirva para detectar errores de renderizado infinito en React. En conclusión, este segundo intento me sirvió para encontrar puntos de mejora y validaciones extra, pero no para hallar el problema real.

Tercer intento

Después de despejar la mente, almorzar y caminar un rato por la calle, volví a casa, hice masa de pan y la puse en un recipiente para que la levadura se activara y la masa creciera, luego abrí el sitio web de Mercado Libre (o MELI) para buscar algunos productos de intereses, y al cabo de unos minutos no había comprado nada pero si me encontraba inspeccionando el sitio web con la extension de React Devtools, encontré que algunos componentes de MELI se están renderizando de forma innecesaria con solo hacer unas pocas acciones como un hover, también vi que usan servicios Graphql y las traducciones de los productos vienen desde Backend.

En fin, durante esta inspección he terminado descubriendo de forma accidental y activando la casilla "Highlight updates when components render" ubicada en "React Developer Tools > View Settings > General > Highlight updates when components render". Activar la visualización de cambios me permitió ver cada update en los componentes de MELI, esta característica resultó ser muy útil para identificar qué componentes se están actualizando durante la navegación en el sitio web.


Una vez encontrada y activada esta característica, seguí indagando sobre el problema inicial. Durante el primer diagnostico, al intentar hacer Profiling durante la replicación del problema no se lograba iniciar y procesar debido al bloqueo de la pagina, provocando un colapso de todo el sitio web e impidiendo realizar cualquier acción, la única salida era el cierre forzado de la pestaña del navegador, sin embargo, una vez dejando activada la visualización de cambios podía navegar por el sitio web y luego replicar el problema para poder observar segundos antes del colapso qué componentes se estaban renderizando de manera descontrolada. Y así fue que logré identificar el componente a corregir.

Todo se resumió a un problema, regeneración de referencias de objetos que pasan como props a otros componentes. Los componentes recibían estos props y realizaban una acción con un useEffect, este luego realizaba otra acción que cambiaba la referencia de una de sus dependencias, y así sucesivamente hasta el final de los tiempos. Esto provocaba una cantidad de iteraciones indefinidas en el ciclo de ejecución de un componente, haciendo que a su vez los componentes hijos también sufrieran un re-renderizado. En fin, todo esto ocurrió al trabajar en la versión "16" de React, en las versiones posteriores también deben haber problemas de infinite loops en useEffects pero se deberían controlan mejor para evitar crashes en el sitio web.

Conclusiones

  • La Persistencia en la Depuración: A pesar de la complejidad y frustración inicial, aprendí la importancia de persistir en la depuración y no rendirte ante problemas difíciles de diagnosticar.
  • Enfoque Iterativo: Descubrí que abordar un problema técnico de manera iterativa, probando diferentes enfoques y herramientas, puede llevar finalmente a la identificación y resolución del problema.
  • Exploración de Herramientas de Desarrollo: Mi experiencia mostró la utilidad de aprovechar al máximo las herramientas de desarrollo disponibles, como el inspector de elementos y las extensiones como React Devtools, para analizar y entender el comportamiento de tus componentes.
  • Descubrimiento Casual: A veces, los descubrimientos más valiosos pueden surgir de manera casual. El hallazgo accidental de la opción "Highlight updates when components render" ilustra cómo explorar diversas características puede revelar soluciones inesperadas.
  • Control de Referencias y Ciclos de Vida: Aprendí sobre la importancia de controlar las referencias y las actualizaciones en los componentes de React, especialmente al trabajar con efectos en el ciclo de vida de los componentes.

viernes, 4 de agosto de 2023

Un viaje como Frontend Developer

¡Bienvenidos a mi nuevo blog! Mi blog anterior fue construido usando Gatsby y publicado desde Netlify, sin embargo, estoy buscando una forma mucho más rápida y Low Code para mantener mi blog. Por cierto, mi primer blog estaba en Médium, escribí muchos post de todo tipo, sueños, tutoriales y otras cosas personales.

Hoy quiero compartir con ustedes un poco más acerca de quién soy y cómo me he convertido en un Frontend Developer. Mi nombre es Julian, y mi pasión por la tecnología y la programación ha sido el motor que me ha impulsado en este fascinante camino.

A mediados del 2010 y 2011, desde una edad temprana, siempre me sentí atraído por el mundo de la informática. Recuerdo con cariño mis primeros días jugando con las computadoras de la escuela, tratando de entender cómo funcionaban y cómo podía interactuar con ellas. Mi curiosidad me llevó a profundizar en los conceptos básicos de programación, y pronto me encontré desarrollando mis primeros proyectos simples, pero emocionantes. Emocionantes porque mis primeros códigos fueron escritos en Bash y comúnmente escribía sentencias peligrosas para eliminar el System32, abrir cientos de ventanas de Paint hasta bloquear la computadora, y otros Scripts delicados. En varios casos estos archivos Bash venían con un icono personalizado de una carpeta con el nombre de "P0xN0", las personas que miraban esta "carpeta" con aquel supuesto contenido videográfico terminaban dando doble click y por ende dando muerte a la computadora, adiós System32.

A medida que crecía, mi fascinación por la tecnología solo aumentaba, y mi objetivo se volvía más claro: quería convertirme en un profesional de la programación y ayudar a crear aplicaciones y sitios web innovadores que impactaran la vida de las personas de manera positiva.

Mi camino hacia convertirme en Frontend Developer no fue fácil, pero cada desafío que enfrenté fue una oportunidad para aprender y mejorar mis habilidades. Estudié arduamente y me sumergí en una amplia gama de tecnologías, desde los fundamentos como HTML, CSS y JavaScript, hasta frameworks y librerías más avanzadas como React y Angular. Amo profundamente programar en TypeScript, así que todo lo que escribo suele venir bien tipado, odio usar los "any" excepto donde no hay escapatoria para no usarlo.

A lo largo de mi carrera, he enfrentado desafíos en el diseño y desarrollo de interfaces de usuario altamente interactivas, garantizando que la experiencia del usuario sea fluida y atractiva. También he tenido la oportunidad de colaborar con diseñadores, analistas y otros desarrolladores para comprender las necesidades del usuario y traducirlas en productos finales que superen sus expectativas.

La tecnología nunca deja de avanzar, y eso es lo que más me emociona de ser un Frontend Developer. Cada día hay algo nuevo que aprender, ya sea una nueva técnica de diseño, un framework emergente o una metodología de desarrollo. Mantenerme actualizado en este entorno en constante evolución es un desafío que abrazo con entusiasmo. Suelo usar Twitter, YouTube y charlas con amigos para mantenerme al día.

A través de mi trayectoria como Frontend Developer, he aprendido la importancia de la empatía y la comprensión del usuario. Al final del día, nuestro trabajo no solo se trata de escribir código, sino de resolver problemas y mejorar la vida de quienes interactúan con nuestras creaciones, por eso, todo lo que hago suele venir acompañado de buena accesibilidad Web, vivo enamorado de A11y.

Me siento bendecido de poder dedicar mi vida profesional a lo que amo, y estoy emocionado de seguir creciendo y evolucionando en este campo tan apasionante. En este blog, compartiré mis conocimientos, experiencias y consejos relacionados con el desarrollo frontend, con la esperanza de inspirar y ayudar a otros desarrolladores en su propio viaje.

Así que únanse a mí en este viaje, donde exploraremos juntos el fascinante mundo del desarrollo frontend y cómo podemos dar vida a nuestras ideas a través del código.

¡Gracias por leer! Si tienes alguna pregunta o tema que te gustaría que aborde en futuras publicaciones, no dudes en dejar un comentario. ¡Hagamos crecer esta comunidad de desarrolladores apasionados por la tecnología!

¡Nos vemos en la próxima entrada del blog!

viernes, 6 de enero de 2023

La noche es joven

La noche es joven. La luna se esconde sobre el cielo que irrumpe su luz azul, las nubes son negras y preparadas están, para liberar lágrimas sobre los techos que albergan seres durmientes. Aparece un segundo protagonista ante la fría noche, ella toca la puerta cuando al mismo tiempo se pregunta si habrá alguien al otro lado. Nadie abre aquella puerta de hierro oxidado con manijas de roble, tallada con el aire que roza su rostro. Piso de piedra rústica cubre aquel hogar de una mente perdida en la falsa realidad, una serie de pensamientos que ella quizás no comprenda. Él la desea tanto. Cree que ella es el camino al verdadero mundo, uno en donde todo se observa desde la misma perspectiva. Ella camina en sus sueños a lado de la distante presencia de aquel hombre, que deambula en el otro lado de la inmensa puerta negra.

martes, 6 de diciembre de 2022

Como criar un gato para que no sea loco y callejero

La mejor manera de criar un gato para que no sea loco y callejero es darle un buen comienzo en la vida. Esto incluye cosas como proporcionarle un ambiente seguro y estable, brindarle amor y atención adecuados, y asegurarse de que reciba una nutrición adecuada y un cuidado médico regular.

También es importante acostumbrar al gato a estar en casa y a interactuar con las personas de una manera positiva desde una edad temprana. Esto puede ayudar a que el gato se sienta cómodo y seguro en el hogar y tenga menos probabilidades de convertirse en un gato callejero.

Otras cosas que pueden ayudar a prevenir que un gato se vuelva loco y callejero incluyen:
  • Proporcionar al gato una variedad de juguetes y actividades para mantenerlo entretenido y estimulado.
  • Ofrecerle un espacio seguro y cómodo donde pueda dormir y descansar.
  • Evitar castigar al gato o tratarlo de manera cruel. Esto puede causar estrés y trauma en el gato y puede contribuir a que se vuelva agresivo o temeroso.
  • Asegurarse de que el gato esté desparasitado y vacunado regularmente. Esto ayudará a prevenir enfermedades y problemas de salud que pueden contribuir a comportamientos inapropiados en el gato.
  • Criar un gato para que sea un miembro feliz y saludable de la familia puede requerir tiempo y esfuerzo, pero puede ser muy gratificante. Con paciencia y amor, su gato puede crecer para ser un compañero leal y afectuoso.
Información dada por https://openai.com/blog/chatgpt/ ante la pregunta: "cómo criar un gato para que no sea loco y callejero".

viernes, 14 de enero de 2022

Amplitude Experiment + React

In this post, you'll learn:

  • Use amplitude experiments with React.
  • Create AB tests on any react component.

Requirements

But... What is Amplitude Experiments?

Amplitude Experiment embeds analytics and customer behavior into A/B testing and rollout workflows, so teams learn faster and adapt experiences for key segments.

martes, 31 de agosto de 2021

Pasión por la vida

La pregunta de la pasión por la vida, es profunda, una vez me la hicieron y tuve que pararme a pensar un buen rato. ¿Cual es tu pasión por la vida?, realmente hay preguntas para reflexionar sobre la vida y sobre el sentido que se le da a la misma. Pasión por la vida, en ese entonces la respondí de forma vaga comentando lo que me dedicaba a nivel laboral, sin embargo desde ese entonces siempre llevo esa pregunta en mente. Me identifico con un sentimiento, una etapa extraña. Tener todo lo que se necesita, cumplir todas las metas, y dejar pasar el tiempo y plantear nuevas metas, a nivel material y salud nada falta, pero a la vez hay ausencia de algo, algo falta, pero exactamente qué. Pararse a pensar, si compro X cosa quizás mejore la condicion actual, pero luego imagino un tiempo teniendo esa X cosa por unos meses y creo que la felicidad acaba. Luego pienso, ¿qué tal si hago mi anhelado viaje por el mundo en motocicleta?, quizás eso sea lo que busco, pero luego pienso, hago el viaje y después qué sigue?. Esa es la cuestión, buscando de forma casi desesperada ese algo que falta. De pronto de eso se trate la vida, una búsqueda constante de la felicidad. La felicidad de los demás no es la misma de uno. No debemos aferrarnos a nada, y siempre hay que vivir descubriendo eso que nos llene, o eso que nos mate, creo que esa es la esencia de la pasión por la vida.

Hace poco escuché un Podcast, lo cierto es que empecé a escucharlo por solo curiosidad y además riéndome un poco de su título jaja, se llama "Importaculismo Práctico", en mi día a día ya practicaba muchos de los conceptos que aparecen ahí, pero aprendí varias cosas más que me han servido. Dejaré el link por aquí: https://open.spotify.com/album/7jp26DMrnZncVCOtpQpDQp?si=8Lzf8bHtRxGd8k34D1kGEA&dl_branch=1

Saludos,
Julian.

lunes, 12 de octubre de 2020

Guide: Text2locale

Extract all the texts of any project with HTML files and generate a KV (Key-Value) file, key = reference key, value = extracted text.

Install

$ npm install -g github:juliandavidmr/text2locale

Usage

$ text2locale input "./example/src" -o "./example/locale/" -l en -t es,de,zh
More command info: $ text2locale input --help

API

input command options

OptionDescriptionDefault
-l--langLanguage of the texts to be extracted.en
-o--outputOutput directory../
-s--separatorSeparator to generate the key names._
-t--templatesGenerate template for other languages.en,es

Whats Next?

The generated files can be manipulated by the i18n-editor website, you can add/remove/edit all translation resources from multiple JSON files at the time.

Referencias:



domingo, 24 de noviembre de 2019

C + WASM + Linux

WASM (WebAssembly) es un área del desarrollo Web que está tomando mucha fuerza últimamente. He estado realizando algunas pruebas de WASM y C, y para esta oportunidad comparto con ustedes esta publicación que detallan los pasos requeridos para montar una prueba exitosa de una función en C ejecutada desde Javascript en el navegador.
Los pasos a continuación fueron probados en Ubuntu, también son aplicables a otros sistemas operativos basados en este. Los pasos que hacen uso de la terminal fueron ejecutados desde una misma sesión (de terminal).

Pasos

Paso 1: Instalación de emscripten:

# Ubicarse en una carpeta donde desee proceder con la instalación
cd Documents

# Descargar codigo fuente de Emscripten (emsdk repo)
git clone https://github.com/emscripten-core/emsdk.git

# Entrar al directorio
cd emsdk

# Descargar e instalar lo más reciente del SDK tools.
./emsdk install latest

# Construir el "latest" SDK y "active" para el usuario actual. (escribe el archivo ~/.emscripten)
./emsdk activate latest

# Activar el PATH y otras variables de entorno en la terminal actual
source ./emsdk_env.sh

Paso 2: Escribir código C

A continuación, creamos la función myFunction que mostrará un mensaje y retornará el argumento numérico argc multiplicado por 2.

/// main.c

#include <stdio.h>
#include <stdlib.h>
#include <emscripten/emscripten.h>

int main(int argc, char ** argv) {
        printf("WebAssembly module loadedn");
        return 0;
}

#ifdef __cplusplus
extern "C" {
#endif

int EMSCRIPTEN_KEEPALIVE myFunction(int argc, char ** argv) {
        printf("MyFunction Called");
        return argc * 2;
}

#ifdef __cplusplus
}
#endif

Notas:
  1. La librería emscripten/emscripten.h estará disponible una vez se ha completado el paso 1.
  2. La etiqueta EMSCRIPTEN_KEEPALIVE hace que la función myFunction esté disponible en JavaScript después de la compilación.

Paso 3: Compilar C en WASM

emcc main.c -O3 -o index.js -s "EXTRA_EXPORTED_RUNTIME_METHODS=['ccall', 'cwrap']"
Notas:
  1. El comando toma main.c como archivo de entrada y genera el archivo index.js.
  2. El archivo index.js expone la función ccall que será usada posteriormente para ejecutar myFunction.
  3. El comando genera otro archivo llamado index.wasm el cual contiene todo el código compilado.

Paso 4: Cargar código compilado en el navegador.

PASO 4.1: CREAR ARCHIVO MAIN.HTML

<!DOCTYPE html>
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>WebAssembly Example</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
  </head>
  <body>
    <button id="myFunc">Call myFunction</button>
    <!-- Include the JavaScript glue code. -->
    <!-- This will load the WebAssembly module and run its main. --> 
    <script async src="index.js"></script>
    <script>
    	document.getElementById('myFunc').addEventListener('click', function(ev) {
	    	var result = Module.ccall(
		    'myFunction',     // name of C function 
		    'number',       // return type
		    ['number'],     // argument types
		    [42]);          // arguments

            console.log('Result:', result);
    	});
    </script>
  </body>
</html>
Notas: Cada vez que el botón “Call myFunction” sea presionado, se ejecuta la función myFunction con el argumento 42 de tipo number.

PASO 4.2: MONTAR SERVIDOR LOCAL

Este paso es opcional si ya dispones de alguna herramienta para montar un servidor local.
1. Instalar el paquete global local-web-server de npm.
npm i local-web-server -g
2. Crear un archivo con el nombre lws.config.js y agregar el siguiente contenido:
module.exports = {
   mime: {
      'application/wasm': ['wasm']
   }
};
Este archivo hace que el navegador efectúe correctamente el llamado del archivo index.wasm, si esto no se agrega es posible que el navegador no pueda procesar el mime application/wasm, y no se carga el código compilado.

3. Correr servidor HTTP local:
ws
# Muestra algo como: Listening on http://david:8000, http://127.0.0.1:8000
4. Abrir un navegador web (Google Chrome o Firefox) con alguno de los enlaces mostrados en el paso anterior a este, por ejemplo: http://127.0.0.1:8000.

5. Abrir la ventana de desarrollo del navegador web (F12) y entrar a la pestaña “Console”. Luego, dentro de la pagina web debes presionar el botón “Call myFunction”, en la consola aparecerá un mensaje con el resultado de nuestra función myFunction => Result: 84.

Finalmente podemos entender todo el flujo de ejecución de WASM así:

lunes, 21 de octubre de 2019

Creación e historia de i18n-editor

i18n-editor es una herramienta para edición de recursos de traducción en formato JSON.

La administración centralizada de recursos de traducción muchas veces resulta ser una tarea muy compleja. Una actividad tan sencilla como corregir una palabra en un idioma determinado y tener que actualizar el texto en todos los demás idiomas puede demandar bastante tiempo, terminando así en la ejecución de una tarea que no debería tomar mucho tiempo.

Dado lo anterior, empecé usando herramientas (públicas y de pago), estas no se adaptaban completamente a mis necesidades, excepto babeledit. Usé babeledit en el periodo de prueba gratis, despues de terminar el Trial pensé: "Yo puedo crear e implementar un sistema que posea las funciones básicas de babeledit". La chispa se encendió e inicié de una vez por todas creando un sitio web con Angular. En cuestión de unas pocas horas ya disponía de una base funcional para edición de recursos, sin embargo la interface visual de ese momento era con 0% de CSS, parecía un sitio de los años 2000 😅.

Despues de algunos días de uso excesivo de i18n-editor durante mi trabajo, hice varios ajustes y mejoras, y lo mas importante es que mi productividad mejoró considerablemente; ya no tenía que dividir mi pantalla en segmentos de 10 pestañas de VSCode en paralelo para poder visualizar/editar cada archivo JSON (inclusive un monitor ultra-wide quedaba pequeña), ahora i18n-editor me permitía abrir una sola ventana para realizar la misma operación (y solo ocupaba la mitad o menos del espacio del monitor) 😻.

Al ver que esta herramienta resultaba muy útil, decidí difundir dentro de mi circulo de compañeros esta herramienta. Recibí varios comentarios constructivos e inclusive más adelante llegaría el primer contribuidor que le daría soporte a la carga de archivos de Excel.

Finalmente, escribo este primer post para dar a conocer el inicio de esta historia e invitar a todos aquellos que deseen contribuir y usar libremente i18n-editor.

domingo, 24 de junio de 2018

Sueño: El gato y el revolver

Me encontraba en medio de la fiesta que transcurría en el anochecer que apenas empezaba, algunas personas se encontraban charlando con sus familiares y amigos, de repente el chófer de un bus se bajó de lugar de trabajo y rápidamente sale a paso ligero hacia su casa la cual se encontraba pasando una calle angosta a tan sólo pocos metros de mi izquierda, antes de entrar a la puerta, el señor deja caer de forma inconsciente la funda de una pistola pequeña tipo revolver, quizás iba cargada pero la situación daba para pensar otras cosas. — Pocos segundos más tarde, el señor vuelve a salir a toda prisa de su casa. Se sentía un aire espeso y peligroso, un ambiente que el señor había pintado con su llegada furiosa. Esto hizo que varias personas (incluyéndome) silieran corriendo hacia el interior de la casa más cercana.

En medio de la agitada situación, logré entrar por la parte de atrás de una casa, el cual resultó ser la misma casa que el hombre armado acababa de entrar. Detrás de una gruesa columna visualizaba la peligrosa historia que se desenvolvia dentro de la casa de estilo antiguo y con un área descubierta al techo en la parte central, muchas plantas y gruesas columnas de madera alrededor eran el sitio de aquel inicio de una posible tragedia.

Muchos gritos abundaban en el lugar, el señor armado apuntaba a tan sólo pocos metros a un niño, varias personas protegían al pequeño hombre. Me encontraba a unos cuantos pasos del niño desde atrás, cuando de repente se aparece un gato a mi derecha de color amarillo con blanco bajando de un árbol delgado pero más alto que el techo de la casa, de manera consecutiva a la bajada del gato, noté la presencia de un extraño animal escondida bajo la sombra de una matera, la criatura desconocida parecía ser anfibio pero eran suposiciones ya que sólo miraba bajo la oscuridad su cuerpo. De un zarpazo la criatura atrapó del cuello al pequeño gato que acababa de tocar el suelo. Bajo la luz se observaba aquel animal que moría aficciado por la mandíbula de la rara criatura que jamás había visto ni en Discovery Channel.

¿Podrá la primera AGI aburrirse?

Sí, la primera AGI (inteligencia artificial general) puede aburrirse. En 2026, la AGI no existe públicamente, y dudo que realmente exista ha...