2 puntos por GN⁺ 2024-02-10 | 1 comentarios | Compartir por WhatsApp

GrafanaCON 2024: ¡Regístrate hoy y aparta tu lugar!

  • GrafanaCON 2024 es el evento comunitario más grande del año y el registro ya comenzó oficialmente.
  • Este evento ofrecerá una experiencia inmersiva presencial en Ámsterdam durante abril.

Opinión de GN⁺

  • GrafanaCON 2024 es un evento importante para quienes están interesados en la visualización de datos y el monitoreo. Será un espacio donde la comunidad de usuarios y desarrolladores de Grafana podrá reunirse para compartir las últimas tendencias y tecnologías.
  • El evento, que se llevará a cabo en Ámsterdam, ofrecerá a los asistentes oportunidades de networking y aprendizaje, y se espera que incluya sesiones que ayuden a profundizar la comprensión de las herramientas de análisis y visualización de datos.
  • La apertura del registro es una noticia emocionante para los usuarios de Grafana, y será una gran oportunidad para los profesionales del sector de adquirir nuevos conocimientos e intercambiar con colegas de la industria.

1 comentarios

 
GN⁺ 2024-02-10
Opiniones de Hacker News
  • The Valid method takes a context (which is optional but has been useful for me in the past) and returns a map. If there is a problem with a field, its name is used as the key, and a human-readable explanation of the issue is set as the value.

    • Método de validación: recibe un contexto opcional y devuelve un mapa donde los campos con problemas se usan como clave y la descripción del problema como valor. Menciona que este enfoque le ha resultado útil en el pasado.
  • I used to do this, but ever since reading Lexi Lambda's "Parse, Don't Validate," I've found validators to be much more error-prone than leveraging Go's built-in type checker.

    • Parsear en vez de validar: después de leer "Parse, Don't Validate" de Lexi Lambda, siente que aprovechar el verificador de tipos integrado de Go tiene menos posibilidades de error que usar validadores.
  • For example, imagine you wanted to defend against the user picking an illegal username. Like you want to make sure the user can't ever specify a username with angle brackets in it.

    • Ejemplo de validación de nombre de usuario: plantea el caso de impedir que un usuario elija un nombre inválido, por ejemplo uno que incluya signos de menor y mayor que.
  • With the Validator approach, you have to remember to call the validator on 100% of code paths where the username value comes from an untrusted source.

    • Problema del enfoque con validador: hay que recordar llamar al validador en el 100% de las rutas de código donde el nombre de usuario proviene de una fuente no confiable.
  • Instead of using a validator, you can do this:

    • Alternativa a la validación: propone otro método en lugar de usar un validador.
  • That guarantees that you can never forget to validate the username through any codepath. If you have a Username object, you know that it was validated because there was no other way to create the object.

    • Garantía mediante creación del objeto: como la validación ocurre al crear el objeto Username, no hay forma de olvidar validarlo en ninguna ruta de código.
  • I really like Mat Ryer's work, and I've applied most of the ideas in the 2018 version of this article to all of my Go projects since then.

    • Aprecio por el trabajo de Mat Ryer: le gusta mucho el trabajo de Mat Ryer y ha aplicado la mayoría de las ideas de la versión de 2018 de este artículo en todos sus proyectos de Go desde entonces.
  • The one weak spot for me is this aspect:

    • Señalamiento de un punto débil: menciona el aspecto que considera problemático.
  • This has always felt wrong to me, but I've never been able to figure out a better solution.

    • Sin una mejor solución: dice que siempre le ha parecido incorrecto, pero no ha logrado encontrar una alternativa mejor.
  • It means that a huge chunk of your code has a huge amount of unnecessary shared state.

    • Problema del estado compartido: señala que una gran parte del código termina teniendo una enorme cantidad de estado compartido innecesario.
  • I often end up writing HTTP handlers that only need access to a tiny amount of the shared state.

    • Handlers HTTP y estado compartido: comenta que a menudo escribe handlers HTTP que solo necesitan acceder a una parte mínima del estado compartido.
  • Nothing against Mat Ryer, as his pattern is the best I've found, but I still feel like there's some better solution out there.

    • Respeto por el patrón de Mat Ryer: aclara que no tiene nada en contra de Mat Ryer, y que su patrón es el mejor que ha encontrado, aunque sigue sintiendo que debe existir una solución mejor.
  • one of my biggest pet peeves is when people take a Config object, which represents the configuration of an entire system, and pass it around mutably.

    • Molestia con el objeto Config: una de las cosas que más le molestan es cuando se pasa de forma mutable un objeto Config que representa la configuración de todo un sistema.
  • When you do that, you're coupling everything together through the config object.

    • Acoplamiento por medio de Config: al hacerlo, todo queda acoplado a través del objeto Config.
  • I've worked on systems where you had to configure the parts in a specific order in order for things to work, because someone decided to write back to the config object when it was passed to them.

    • Dependencia del orden en Config: ha trabajado en sistemas donde era necesario configurar las partes en un orden específico para que funcionaran, porque alguien decidió escribir de vuelta en el objeto Config cuando se lo pasaban.
  • Or another case was where I've seen it such that you couldn't disable a portion of the system because it wrote data into the config object that was read by some other subsystem later.

    • Dificultad para desactivar partes del sistema: también ha visto casos en los que no se podía desactivar una parte del sistema porque esta escribía datos en el objeto Config y luego otro subsistema los leía.
  • The pattern of "your configuration is one big value, which is mutable" is one of the more annoying patterns that I've seen before, both in Go and in other languages.

    • Crítica al patrón de configuración mutable: considera muy molesto el patrón de "tu configuración es un único valor grande y mutable", tanto en Go como en otros lenguajes.
  • I agree with a lot of this, I'll add my own opinions:

    • Acuerdo y opiniones propias: coincide con gran parte de esto y añade sus propias opiniones.
  • I would pass a waitgroup with the app context to service structs.

    • Propuesta de pasar waitgroup y contexto: propone pasar un waitgroup junto con el contexto de la app a las structs de servicio.
  • This way the interrupt can trigger the app shutdown via the context and the main goroutine can wait on the waitgroup before actually killing the app.

    • Uso de interrupciones y waitgroup para el cierre: así, una interrupción puede activar el cierre de la app mediante el contexto y la goroutine principal puede esperar en el waitgroup antes de terminar realmente la app.
  • If writing a CLI program, then testing stdout, stdin, stderr, args, env, etc. is useful.

    • Utilidad de probar programas CLI: al escribir un programa CLI, es útil probar stdout, stdin, stderr, args, env, etc.
  • But for an http server, this is less true.

    • Enfoque distinto para servidores HTTP: en el caso de un servidor HTTP, eso resulta menos aplicable.
  • I would pass structured config to the run function to let those tests be more focused.

    • Config estructurada para pruebas más enfocadas: propone pasar una configuración estructurada a la función run para que esas pruebas sean más específicas.
  • I disagree with parsing templates using sync.Once in a handler because I don't think handlers should do template parsing at all.

    • Desacuerdo con parsear templates en handlers: no está de acuerdo con parsear templates usando sync.Once dentro de un handler, porque considera que los handlers no deberían encargarse de eso.
  • I would do this when the app starts: if the template cannot be parsed, the app should not become ready to receive any requests and should rather exit with a non-zero exit code.

    • Propuesta de parsear templates al iniciar: sugiere hacerlo al arrancar la app; si el template no se puede parsear, la app no debería quedar lista para recibir solicitudes y debería salir con un código distinto de cero.
  • I found fx to be a super simple yet versatile tool to design my application around.

    • Simplicidad y versatilidad de fx: encontró en fx una herramienta muy simple pero versátil para diseñar su aplicación.
  • All the advice in the article is still helpful, but it takes the "how do I make sure X is initialized when Y needs it" part completely out of the equation and reduces it from an N*M problem to an N problem.

    • Consejos del artículo y ventaja de fx: dice que todos los consejos del artículo siguen siendo útiles, pero que fx elimina por completo el problema de "cómo asegurar que X esté inicializado cuando Y lo necesita" y lo reduce de un problema N*M a uno de N.
  • I've used quite a few dependency injection libraries in various languages over the years (and implemented a couple myself) and the simplicity and versatility of fx makes it my favorite so far.

    • Preferencia por fx: ha usado muchas librerías de inyección de dependencias en varios lenguajes a lo largo de los años, e incluso implementó algunas, pero la simplicidad y versatilidad de fx la convierten en su favorita hasta ahora.
  • I've recently been playing with ogen:

    • Experiencia con ogen: recientemente ha estado probando ogen.
  • Write openapi definition, it'll do routing, definition of structs, validation of JSON schemas, etc.

    • Definición openapi y funciones de ogen: al escribir una definición openapi, ogen se encarga del routing, la definición de structs, la validación de esquemas JSON, etc.
  • All I need to do is implement the service.

    • Simplificación al implementar el servicio: menciona que lo único que necesita hacer es implementar el servicio.
  • Validating an integer range for a querystring parameter is just too boring. And too easy to mistype when writing it manually.

    • Desventajas de validar rangos enteros en querystring: validar manualmente el rango de un entero en un parámetro de querystring le parece demasiado aburrido y además muy propenso a errores tipográficos.
  • Anyways, so far only been playing, so haven't found the bad parts yet.

    • Evaluación inicial de ogen: de momento solo ha estado experimentando con ogen, así que todavía no ha encontrado sus puntos negativos.
  • Great article with lots of interesting ideas. Can't believe I didn't know about signal.NotifyContext. Finally I'll be able to actually rememeber how to respond to signals instead of copy-pasting that between projects.

    • Valoración positiva del artículo y de signal.NotifyContext: considera que es un gran artículo con muchas ideas interesantes y le sorprende no haber conocido antes signal.NotifyContext. Por fin podrá recordar cómo responder a señales sin tener que copiar y pegar ese código entre proyectos.
  • I like a lot of what they've done here. My testing looks a bit different however.

    • Afinidad con el enfoque y diferencia en pruebas: le gusta mucho de lo que hicieron aquí, aunque su forma de hacer pruebas es un poco distinta.
  • srv, err := newTestServer()

    • Ejemplo de creación de servidor de prueba: muestra un ejemplo de código para crear un nuevo servidor de prueba.
  • require.NoError(t, err)

    • Ejemplo de verificación de error: muestra un ejemplo de código para comprobar que no haya error.
  • defer srv.Close()

    • Ejemplo de cierre del servidor: muestra un ejemplo de código para cerrar el servidor al terminar la prueba.
  • resp, err := http.Post(fmt.Sprintf("http://localhost:%d/signup/json";, srv.Port()), "application/json", strings.NewReader({ "email": "test@example.com", "password": "p@55Word", "password_copy": "p@55Word" }))

    • Ejemplo de solicitud HTTP POST: presenta un ejemplo de código que envía una solicitud HTTP POST.
  • In my newTestServer, I spin up a server with fakes for my dependencies.

    • Servidor falso para dependencias: en su newTestServer, levanta un servidor con implementaciones falsas de sus dependencias.
  • If I want to test a dependency error, I replace that property with a fake that will return an error.

    • Cómo prueba errores de dependencias: si quiere probar un error en una dependencia, reemplaza esa propiedad por una implementación falsa que devolverá un error.
  • I can validate my error paths. I can validate my log entries. I can validate my metric emission. I can validate timeouts and graceful shutdowns.

    • Posibilidades de validación: puede validar rutas de error, entradas de log, emisión de métricas, timeouts y apagados ordenados.
  • After the server starts, I inspect to determine which port it is running on (default is :0 so I have to wait to see what it got bound to).

    • Inspección del puerto tras iniciar: después de que el servidor arranca, inspecciona en qué puerto está corriendo; como el valor por defecto es :0, tiene que esperar para ver a qué puerto quedó enlazado.
  • My "unit" tests can test at the handler level or the http level, making sure that I can fully test the code as the users of my system will see it, exercising all middleware or none.

    • Alcance de las pruebas "unitarias": sus pruebas "unitarias" pueden hacerse a nivel de handler o a nivel HTTP, asegurando que pueda probar por completo el código tal como lo verán los usuarios del sistema, usando todo el middleware o ninguno.
  • I can spin up N instances and run my tests in parallel.

    • Ejecución paralela de pruebas: puede levantar N instancias y ejecutar sus pruebas en paralelo.
  • I don't write go, but I like these patterns. Feels fairly universal for testable code.

    • Preferencia por los patrones aunque no use Go: no programa en Go, pero le gustan estos patrones y le parecen bastante universales para escribir código fácil de probar.