LearningSea


Este blog foi criado por mim, Leonardo, em Março de 2026.

O objetivo é registrar, em ordem cronológica, minha jornada de aprendizado e meus experimentos na área de programação. Além de servir como um histórico da minha evolução, escrever sobre os temas estudados também me ajuda a consolidar os conceitos recém-aprendidos.

Entretanto, em Julho deste ano, o projeto foi completamente refeito do zero em Ruby on Rails. O novo blog está disponível em xyz-leo blog.

Código-fonte

Todo o código-fonte deste blog é aberto e pode ser encontrado no meu GitHub: xyz-leo/learningsea-blog.

A proposta é que toda a aplicação possa ser configurada e executada com um único comando:
docker compose up --build -d. Após sua execução, o ambiente já estará totalmente funcional.

Stack

  • Infraestrutura: Docker
  • Linguagem: Python
  • Banco de dados: PostgreSQL
  • Framework: Django

  • Servidor de aplicação: Gunicorn

  • Servidor web (reverse proxy): Caddy

  • Frontend: Tailwind CSS e Django Templates

Componentes auxiliares

  • Edição de conteúdo: Summernote e Markdown

  • Segurança: Django Axes, middleware do Django e Bleach

  • Processamento de mídia: Pillow

  • Arquivos estáticos: Caddy e WhiteNoise

Blocos de código


Abaixo, seguem alguns exemplos de blocos de código.

Python — Depth-First Search (DFS)

from collections import defaultdict

class Graph:
    def __init__(self):
        self.graph = defaultdict(list)

    def add_edge(self, source, target):
        self.graph[source].append(target)

    def dfs(self, start):
        visited = set()

        def visit(node):
            if node in visited:
                return

            visited.add(node)
            print(node)

            for neighbor in self.graph[node]:
                visit(neighbor)

        visit(start)


graph = Graph()
graph.add_edge("A", "B")
graph.add_edge("A", "C")
graph.add_edge("B", "D")
graph.add_edge("C", "E")
graph.add_edge("E", "F")

graph.dfs("A")

Docker Compose

services:
  web:
    image: nginx:latest
    container_name: learningsea-web
    ports:
      - "8080:80"
    volumes:
      - ./public:/usr/share/nginx/html:ro
    restart: unless-stopped

  api:
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      APP_ENV: production
      DATABASE_URL: postgres://postgres:postgres@db:5432/app
    depends_on:
      - db

  db:
    image: postgres:17
    environment:
      POSTGRES_DB: app
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

C — atoi

#include <ctype.h>

int my_atoi(const char *str) {
    while (isspace((unsigned char)*str)) {
        str++;
    }

    int sign = 1;

    if (*str == '+' || *str == '-') {
        if (*str == '-') {
            sign = -1;
        }
        str++;
    }

    int result = 0;

    while (isdigit((unsigned char)*str)) {
        result = result * 10 + (*str - '0');
        str++;
    }

    return sign * result;
}

Imagens


Favicon

Table of contents (mobile)

Marginalia

Certos termos vêm acompanhados de notas chamadas "marginalia". Clique em uma palavra destacada para ver seu significado sem interromper a leitura.

Desktop

Mobile

Considerações finais


Este foi o meu primeiro projeto desenvolvido para resolver um problema real e também o primeiro que recebeu deploy em um servidor próprio. Ao longo dos meses de uso, fui identificando diversos pontos que poderiam ser aprimorados — aspectos que, durante o desenvolvimento inicial, eu ainda não possuía conhecimento ou experiência suficientes para perceber.

Grande parte dessas melhorias foi incorporada à nova versão deste blog, mencionada no início deste post: xyz-leo blog.

Enfim, pude aprender muito sobre o desenvolvimento de uma aplicação full stack, desde a modelagem do banco de dados e a implementação do backend até a construção da interface e o processo de deploy. Mais importante do que o resultado final, foi a experiência adquirida ao longo do projeto. Foi durante esse processo que compreendi, na prática, a importância de escrever código mais organizado, projetar uma arquitetura sustentável e pensar na manutenção da aplicação a longo prazo.

Embora hoje eu enxergue diversas decisões que tomaria de forma diferente, esse projeto foi um marco importante na minha trajetória. Ele serviu não apenas para resolver um problema real, mas também como uma oportunidade de aprendizado contínuo, cujas lições foram aplicadas na nova versão deste blog.