2 pontos por GN⁺ 2024-02-10 | 1 comentários | Compartilhar no WhatsApp

GrafanaCON 2024: inscreva-se hoje e reserve sua vaga!

  • A GrafanaCON 2024 é o maior evento da comunidade neste ano, e as inscrições foram oficialmente abertas.
  • O evento oferecerá uma experiência imersiva com participação presencial em Amsterdã, em abril.

Opinião do GN⁺

  • A GrafanaCON 2024 é um evento importante para quem se interessa por visualização de dados e monitoramento. O encontro será um espaço para a comunidade de usuários e desenvolvedores do Grafana se reunir e compartilhar as tendências e tecnologias mais recentes.
  • Realizado em Amsterdã, o evento deve oferecer aos participantes oportunidades de networking e aprendizado, com expectativa de sessões que ajudem a aprofundar o entendimento sobre ferramentas de análise e visualização de dados.
  • A abertura das inscrições é uma notícia empolgante para usuários do Grafana e também uma ótima oportunidade para profissionais da área adquirirem novos conhecimentos e trocarem experiências com colegas do setor.

1 comentários

 
GN⁺ 2024-02-10
Comentários do 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 validação: recebe um contexto opcional e retorna um mapa em que os campos com problema são usados como chave e a descrição do problema como valor. O autor comenta que isso já foi útil no passado.
  • 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.

    • Parse em vez de validação: depois de ler "Parse, Don't Validate", de Lexi Lambda, passou a achar que usar o verificador de tipos embutido do Go gera menos erros do que 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.

    • Exemplo de validação de nome de usuário: imagine a situação de impedir que o usuário escolha um nome inválido, como um nome que contenha sinais de menor e maior.
  • 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 da abordagem com validador: é preciso lembrar de chamar o validador em 100% dos caminhos de código em que o nome de usuário venha de uma fonte não confiável.
  • Instead of using a validator, you can do this:

    • Alternativa à validação: sugere outro método em vez de usar um 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.

    • Garantia via criação do objeto: como a validação acontece na criação do objeto Username, não há como esquecer de validar o nome de usuário em nenhum caminho 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.

    • Apreço pelo trabalho de Mat Ryer: gosta muito do trabalho de Mat Ryer e aplicou a maioria das ideias da versão de 2018 do artigo em todos os seus projetos Go desde então.
  • The one weak spot for me is this aspect:

    • Apontando um ponto fraco: menciona qual parte considera problemática.
  • This has always felt wrong to me, but I've never been able to figure out a better solution.

    • Falta de solução melhor: diz que isso sempre pareceu errado, mas nunca conseguiu encontrar uma solução melhor.
  • It means that a huge chunk of your code has a huge amount of unnecessary shared state.

    • Problema do estado compartilhado: aponta que uma grande parte do código acaba tendo uma quantidade excessiva de estado compartilhado desnecessário.
  • I often end up writing HTTP handlers that only need access to a tiny amount of the shared state.

    • Handlers HTTP e estado compartilhado: comenta que frequentemente escreve handlers HTTP que precisam acessar só uma pequena parte do estado compartilhado.
  • 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.

    • Respeito pelo padrão de Mat Ryer: diz que o padrão de Mat Ryer é o melhor que encontrou até agora, mas ainda sente que deve existir uma solução melhor.
  • 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.

    • Incômodo com o objeto Config: reclama de quando um objeto Config, que representa a configuração de todo o sistema, é passado adiante de forma mutável.
  • When you do that, you're coupling everything together through the config object.

    • Acoplamento via Config: isso acaba acoplando tudo por meio do 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.

    • Dependência de ordem por causa do Config: relata ter trabalhado em sistemas em que era preciso configurar as partes em uma ordem específica para tudo funcionar, porque alguém decidiu gravar de volta no objeto Config recebido.
  • 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.

    • Impossibilidade de desativar partes do sistema: também já viu casos em que não era possível desligar uma parte do sistema porque ela escrevia dados no objeto Config, que depois eram lidos por outro subsistema.
  • 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 ao grande objeto mutável de configuração: considera esse padrão de “uma configuração única, grande e mutável” um dos mais irritantes, tanto em Go quanto em outras linguagens.
  • I agree with a lot of this, I'll add my own opinions:

    • Concordância e complemento: concorda com muitos pontos e acrescenta suas próprias opiniões.
  • I would pass a waitgroup with the app context to service structs.

    • Sugestão de passar waitgroup e contexto: sugere passar um waitgroup junto com o contexto da aplicação para as structs de serviço.
  • 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 interrupt e waitgroup no encerramento: assim, um interrupt pode acionar o encerramento do app via contexto, e a goroutine principal pode esperar no waitgroup antes de de fato finalizar a aplicação.
  • If writing a CLI program, then testing stdout, stdin, stderr, args, env, etc. is useful.

    • Utilidade de testes em CLI: ao escrever um programa de CLI, é útil testar stdout, stdin, stderr, args, env etc.
  • But for an http server, this is less true.

    • Abordagem diferente para servidor HTTP: para um servidor HTTP, isso é menos relevante.
  • I would pass structured config to the run function to let those tests be more focused.

    • Config estruturada para testes mais focados: sugere passar uma configuração estruturada para a função run, permitindo testes mais direcionados.
  • I disagree with parsing templates using sync.Once in a handler because I don't think handlers should do template parsing at all.

    • Discordância sobre parse de templates no handler: discorda de fazer parse de templates com sync.Once dentro de um handler, porque acha que handlers não deveriam fazer parse de templates.
  • 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.

    • Sugestão de parsear templates na inicialização: faria isso quando o app inicia; se o template não puder ser parseado, a aplicação não deve ficar pronta para receber requisições e deve encerrar com código diferente de zero.
  • I found fx to be a super simple yet versatile tool to design my application around.

    • Simplicidade e versatilidade do fx: considera fx uma ferramenta extremamente simples e versátil para estruturar a aplicação.
  • 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.

    • Conselhos do artigo e vantagem do fx: diz que todos os conselhos do artigo ainda são úteis, mas que fx elimina completamente a parte de “como garantir que X esteja inicializado quando Y precisar” e reduz o problema de N*M para 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.

    • Preferência pelo fx: já usou várias bibliotecas de injeção de dependência em diversas linguagens ao longo dos anos, além de ter implementado algumas, e por isso considera fx sua favorita até agora pela simplicidade e versatilidade.
  • I've recently been playing with ogen:

    • Experiência com ogen: comenta que recentemente tem experimentado ogen.
  • Write openapi definition, it'll do routing, definition of structs, validation of JSON schemas, etc.

    • Definição OpenAPI e recursos do ogen: ao escrever uma definição openapi, o ogen cuida de routing, definição de structs, validação de esquemas JSON etc.
  • All I need to do is implement the service.

    • Simplificação da implementação: diz que tudo o que precisa fazer é implementar o serviço.
  • Validating an integer range for a querystring parameter is just too boring. And too easy to mistype when writing it manually.

    • Desvantagens da validação manual: validar manualmente um intervalo de inteiros para um parâmetro de query string é tedioso e muito sujeito a erros de digitação.
  • Anyways, so far only been playing, so haven't found the bad parts yet.

    • Avaliação inicial do ogen: por enquanto só está experimentando e ainda não encontrou os pontos 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.

    • Avaliação positiva do artigo e de signal.NotifyContext: considera o artigo excelente e cheio de ideias interessantes, e se surpreende por não conhecer signal.NotifyContext; agora finalmente poderá lembrar como reagir a sinais sem ficar copiando e colando isso entre projetos.
  • I like a lot of what they've done here. My testing looks a bit different however.

    • Gosto pela abordagem, mas com testes diferentes: gosta de muita coisa que foi feita ali, embora sua forma de testar seja um pouco diferente.
  • srv, err := newTestServer()

    • Exemplo de criação de servidor de teste: mostra um exemplo de código para criar um novo servidor de teste.
  • require.NoError(t, err)

    • Exemplo de verificação de erro: mostra um exemplo de código para verificar que não houve erro.
  • defer srv.Close()

    • Exemplo de encerramento do servidor: mostra um exemplo de código para fechar o servidor ao final do teste.
  • 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" }))

    • Exemplo de requisição HTTP POST: mostra um exemplo de código que envia uma requisição HTTP POST.
  • In my newTestServer, I spin up a server with fakes for my dependencies.

    • Servidor com dependências falsas: no newTestServer, sobe um servidor usando fakes para suas dependências.
  • If I want to test a dependency error, I replace that property with a fake that will return an error.

    • Como testar erro de dependência: quando quer testar um erro de dependência, substitui a propriedade correspondente por um fake que retorna erro.
  • 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.

    • Várias possibilidades de validação: consegue validar caminhos de erro, entradas de log, emissão de métricas, timeouts e encerramentos graciosos.
  • 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).

    • Inspeção da porta após inicialização: depois que o servidor inicia, verifica em qual porta ele está rodando; como o padrão é :0, precisa esperar para ver em qual porta foi associado.
  • 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.

    • Escopo dos testes "unitários": seus testes “unitários” podem atuar no nível do handler ou no nível HTTP, garantindo que consiga testar completamente o código da forma como os usuários do sistema o verão, exercitando todo o middleware ou nenhum.
  • I can spin up N instances and run my tests in parallel.

    • Execução paralela de testes: consegue subir N instâncias e executar os testes em paralelo.
  • I don't write go, but I like these patterns. Feels fairly universal for testable code.

    • Sem experiência com Go, mas com apreço pelos padrões: diz que não programa em Go, mas gosta desses padrões, que parecem bastante universais para código testável.