Posts
Desafios de Elixir
Ontem terminei todos os desafios Elixir que tinha que fazer esta semana.
Hoje vou continuar trabalhando no printf.
Posts
Structs e Agents
Ontem eu terminei um módulo inteiro do curso de Elixir que estou fazendo. Aprendi sobre Agentes e Structs.
Hoje vou terminar os desafios desse módulo e continuarei trabalhando no printf.
Posts
Trecho de casa
Ontem eu implementei formatação em tudo exceto strings, e meu printf está passando em 80% de todos os testes! Estou tão feliz por estar tao perto de terminar este projeto.
Aprendi muito sobre estruturação, depuração e refatoração, mas não foi um projeto bacana com uma solução intuitiva: Passei um total de 70 horas executando meu código repetidamente para torná-lo compatível com especificações arbitrárias e mal-documentadas.
Acho que é um rito de passagem por aqui: É o primeiro grande projeto que fazemos com muitas peças móveis.
Posts
Devagar mais indo
Ontem fiz 4 desafios do meu bootcamp. Também isolei e refatorei um monte de coisas no meu printf.
Eu realmente gosto da estrutura atual do projeto: é extremamente organizado, fácil de ler, testar e depurar.
A coisa mais importante que aprendi durante este projeto é que C é muito sensível a codigo bagunçado. Mesmo quando o codigo é bem escrito é dificil de debugar; já debugar código C bagunçado é um processo tão lento e tedioso que você procastinará até nunca.
Posts
Formatando inteiros
Ontem terminei as conversões de inteiro com todas as possíveis combinações de flags. Estou muito feliz que essa parte acabou e tenho quase certeza que estou no 70%: As outras conversões são muito semelhantes a de inteiro, exceto que têm menos exceções, então deve ser muito fácil portar minha lógica para elas.
Meu parser das flags ficou muito robusto com toda a refatoração e reestruturação que fiz. A última coisa desafiadora que me resta é lidar com todas as flags para a conversão % s.
Posts
FLag que nao acaba
Ontem refatorei meu código de acordo com as especificações de flags desta documentação:
https://www.cplusplus.com/reference/cstdio/printf/ Isso simplificou muito meu parsing e está facilitando a correção de bugs.
Esta é a melhor documentação sobre sinalizadores de printf que eu encontrei até agora e gostaria de tê-lo encontrado antes. A comunidade também está ajudando e estou conseguindo fazer progresso.
Achei este artigo incrível sobre como Discord usou Rust para estender Elixir e otimizar seu sistema de notificação:
Posts
Aniversario
Ontem terminei todos os desafios de Elixir do bootcamp que estou fazendo. Também criei uma applicação rails para me ajudar a gerenciar meus estudos (W.I.P):
https://github.com/librity/campus_code_study_on_rails Hoje é meu aniversário e tirei algumas horas de folga para comemorar. Joguei Wind Waker e me diverti muito.
Fiz um bom progresso no meu printf: Refatorei muito do meu código e agora ele está passando em mais testes.
Também aprendi que long e long int são a mesma coisa:
Posts
Segurança entre threads
Ontem estudei simultaneidade e paralelismo no Elixir. Eu quero fazer um tutorial em C explorando esses conceitos também.
Escrever código thread-safe em C é extremamente difícil e antiquado quando comparado a linguagems como Rust. Apesar disso, acredito que tem muito valor: escrever código thread-safe em C nos dá uma compreensão profunda de como os computadores funcionam e como podemos otimizá-los em diferentes domínios.
Também criei um repositório modelo de Hugo pronto para implantação: Se você deseja ter um site estático instalado e funcionando no Netlify sem configurar uma monte de coisas, basta fazer um fork e deploy.
Posts
Otimizando recursividade
Ontem eu aprendi sobre tail-call optimization em funções recursivas:
https://dino.codes/posts/tail-call-optimization-in-elixir/ Resumindo, podemos usar variáveis acumuladoras para reduzir a quantidade de instrucoes que o compilador executa em chamadas recursivas. Vou usar um exemplo do Elixir ja que otimizações em C dependem muito do compilador:
https://stackoverflow.com/questions/3514283/c-tail-call-optimization defmodule UnoptimizedSum do def call(list), do: sum(list) defp sum([]), do: 0 defp sum([head | tail]), do: head + sum(tail) end Em UnoptimizedSum, só começamos a adicionar os valores após o último sum() chamado:
Posts
Debuggando meu printf
Ontem eu consertei muitos bugs no meu printf. Tenho certeza de que ficara pronto até quarta-feira o mais tardar.
Aprendi a usar valgrind e gdb nestes projetos. Elas são ferramentas incríveis que estão me economizando muito tempo.
Tutorial de Valgrind Tutorial de GNU Debugger Você pode executá-los diretamente do shell ou pode integrá-los com VSCode seguindo estas simples etapas:
Crie uma tarefa de construção com Terminal > Configure Default Build Task.
Posts
42 Dev Diaries
Ontem eu resolvi botar todos meus updates diarios num site estatico com Hugo. Achei uma boa oportunidade de aprender a tecnologia, e estou gostando muito. Tambem estudei outras coisas e nao consegui trabalhar muito no printf.
https://42devdiaries.netlify.app/ Hoje vou continuar trabalhando no printf.
Posts
Includes e portabilidade
Ontem avancei no printf: o meu printf ja esta fazendo todas as flags exceto a de wildcard '*', que eh a mais dificil. Tambem aprendi que existem algums defines que ficam em headers diferentes dependendo do sistema. Um exemplo eh o ARG_MAX, que ficam com limits.h em macos, e em linux/limits.h em linux. Por questoes de portabilidade eh legal verificar e incluir o header apropiado nos projetos, especialmente para quem esta fazando em linux.