diff --git a/.github/workflows/multilingual.yaml b/.github/workflows/multilingual.yaml index 599499d..8a46e32 100644 --- a/.github/workflows/multilingual.yaml +++ b/.github/workflows/multilingual.yaml @@ -32,6 +32,12 @@ jobs: - name: Check Go modules with Bundler vendor directory run: bundle exec ruby scripts/test_go_modules.rb + - name: Test post creation and migration + run: bundle exec ruby scripts/test_post_layout.rb + + - name: Check post directory convention + run: bundle exec ruby scripts/check_post_layout.rb + - name: Test native multilingual behavior run: bundle exec ruby scripts/test_multilingual.rb diff --git a/README.md b/README.md index 188e2d8..e8fa57b 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,16 @@ My "blog" is a space where I document what I learn and the challenges I face, se [Deploy on my blog](https://kellen-xavier.github.io/ladydebug.github.io/) +## Navegação + +- [Ambiente e execução local](#ambiente-e-execução-local) +- [Comandos e scripts do projeto](#comandos-e-scripts-do-projeto) +- [Criando um post novo](#criando-um-post-novo) +- [Português e inglês](#português-e-inglês-com-o-seletor-nativo) +- [Testes](#testes) +- [Comandos de testes e validação](#comandos-de-testes-e-validação) +- [Changelog e releases](#changelog-e-releases) + ## Started This project is my person notebook where I'm describ about my studies on Linux @@ -24,20 +34,20 @@ Preview with: Use the language button to select English. Hugo connects the matching files automatically; it does not translate the text for you. -Before publishing, run: - -bundle exec ruby scripts/test_multilingual.rb -bundle exec mdl content README.md -hugo --gc --minify +Antes de publicar, execute a [verificação completa](#executar-todas-as-verificações). +Consulte também a [tabela de comandos do projeto](#comandos-e-scripts-do-projeto). -## Testando localmente +## Ambiente e execução local **Pré-requisitos:** [Hugo extended](https://gohugo.io/installation/) `0.147.9`+ e [Go](https://go.dev/dl/) (só é usado pra baixar o tema via Hugo Modules, não tem código Go no projeto). Se preferir não instalar nada na sua máquina, o repo já vem pronto pra abrir num Dev Container (`.devcontainer/`) ou no [Gitpod](https://gitpod.io/#https://github.com/kellen-xavier/ladydebug.github.io) — -os dois sobem o ambiente completo (Hugo, Go, Ruby) sozinhos. +os dois preparam Hugo, Go e Ruby. Para executar todas as verificações, use +Ruby `3.3` com Bundler e Node.js `24`, como nos workflows de CI. +Instale as dependências Ruby com `bundle install`; os testes JavaScript usam +o executor nativo do Node.js, sem instalação de pacotes npm. ```bash git clone https://github.com/kellen-xavier/ladydebug.github.io.git @@ -55,45 +65,110 @@ e `-F` mostra posts com data no futuro — assim dá pra revisar tudo antes de publicar. Qualquer mudança em `content/`, `layouts/`, `assets/` ou `data/` recarrega a página sozinha. -Antes de abrir um PR, vale rodar também o [lint](#lint-de-markdown) e um build -de produção igual ao do CI, pra pegar erro de template que só aparece com -`--minify`: +Antes de abrir um PR, siga a [sequência de testes e validações](#executar-todas-as-verificações). + +## Comandos e Scripts do Projeto + +Execute os comandos a partir da raiz do repositório. As verificações ficam +separadas na [tabela de comandos de testes](#comandos-de-testes-e-validação), +com a [descrição de cada suíte](#testes). + +| Comando | Script ou ferramenta | Para que serve | +| --- | --- | --- | +| `git clone https://github.com/kellen-xavier/ladydebug.github.io.git` | Git | Baixar o repositório para a máquina local. | +| `cd ladydebug.github.io` | Shell | Entrar na raiz do projeto após clonar. | +| `bundle install` | [Gemfile](Gemfile) | Instalar o `mdl` e suas dependências Ruby. | +| `hugo mod tidy` | Hugo Modules; [go.mod](go.mod) | Resolver o tema Hextra e atualizar os arquivos de módulos quando necessário. Requer Go no `PATH`. | +| `hugo server -D -F` | Hugo | Abrir a prévia em `http://localhost:1313/`, incluindo rascunhos e posts futuros, com recarga automática. | +| `hugo --gc --minify` | Hugo | Gerar o site de produção em `public/`, respeitando as regras de publicação dos posts. | +| `ruby scripts/new_post.rb` | [new_post.rb](scripts/new_post.rb) | Criar um post com a data de hoje, perguntando título e tags. | +| `ruby scripts/new_post.rb "Título" "tag1, tag2"` | [new_post.rb](scripts/new_post.rb) | Criar um post com título e tags informados, como rascunho. | +| `ruby scripts/new_post.rb --date 2023-02-04 "Título" "tag1, tag2"` | [new_post.rb](scripts/new_post.rb) | Criar um post com uma data específica. As tags são opcionais. | +| `ruby scripts/new_post.rb --help` | [new_post.rb](scripts/new_post.rb) | Consultar as opções do criador. | +| `hugo new drafts/nome.md` | Hugo | Criar uma página na área de rascunhos da doca, separada dos posts em `content/docs/`. | +| `ruby scripts/migrate_posts.rb` | [migrate_posts.rb](scripts/migrate_posts.rb) | Simular a reorganização de posts e imagens, mostrando os destinos sem alterar arquivos. | +| `ruby scripts/migrate_posts.rb --apply` | [migrate_posts.rb](scripts/migrate_posts.rb) | Aplicar a reorganização, ajustando imagens e referências entre posts. | +| `ruby scripts/migrate_posts.rb --help` | [migrate_posts.rb](scripts/migrate_posts.rb) | Consultar as opções da migração. | +| `bundle exec ruby scripts/fix_markdown.rb --dry-run` | [fix_markdown.rb](scripts/fix_markdown.rb) | Mostrar as correções automáticas de Markdown sem gravar alterações. | +| `bundle exec ruby scripts/fix_markdown.rb` | [fix_markdown.rb](scripts/fix_markdown.rb) | Aplicar as correções automáticas e listar os problemas que exigem revisão manual. | +| `bundle exec ruby scripts/fix_markdown.rb content/docs/2023/fevereiro/04-02/meu-post.md` | [fix_markdown.rb](scripts/fix_markdown.rb) | Corrigir apenas o arquivo indicado; substitua o caminho pelo arquivo desejado. | + +O módulo [scripts/lib/post_layout.rb](scripts/lib/post_layout.rb) concentra +as regras de nomes, datas e migração usadas pelos scripts. É uma biblioteca, +sem comando próprio para executar. + +## Criando um post novo ```bash -hugo --gc --minify +ruby scripts/new_post.rb "Título do post" "tag1, tag2" ``` -## Criando um post novo +O script usa a data de hoje, cria as pastas e preenche título, data, slug, +tags e `draft: true`. Sem argumentos, pergunta o título e as tags. +Para registrar um texto antigo, informe a data original: ```bash -ruby scripts/new_post.rb "Título do post" "tag1, tag2" +ruby scripts/new_post.rb --date 2023-02-04 "Meu post" "testes, desempenho" ``` -Gera `content/docs///.md` (criando as pastas de -ano/mês se ainda não existirem) com o front matter já preenchido — `title`, -`date` (data de hoje), `slug` (gerado a partir do título) e `tags` — e -`draft: true`. Título e tags também podem ser omitidos na chamada: o script -pergunta interativamente. Quando o post estiver pronto pra publicar, troque -`draft: true` para `draft: false` manualmente. +Todos os posts seguem esta estrutura. Os meses usam apenas o nome em português, sem prefixo numérico e sem acentos. +As pastas dos dias seguem o formato `DD-MM`: -## Lint de Markdown +```text +content/docs/ +└── 2023/ + └── fevereiro/ + ├── 04-02/ + │ ├── meu-post.md + │ └── meu-post.en.md + ├── 15-02/ + │ └── outro-post.md + └── images/ + ├── meu-post--resultado.png + └── outro-post--resultado.png +``` -Os posts são checados com o [`mdl`](https://github.com/markdownlint/markdownlint) (regras em -`.mdl_style.rb`). Roda automaticamente em todo PR e push para `develop`/`main` -(`.github/workflows/lint.yaml`); para rodar localmente: +A pasta `04-02` significa **dia 04 de fevereiro**. Vários posts podem ficar +no mesmo dia, cada um com seu nome descritivo. As imagens ficam na pasta +`images` do mês, compartilhadas entre português e inglês. Use o nome do post +como prefixo da imagem para evitar colisões: -```bash -bundle install -bundle exec mdl content README.md +```markdown +![Resultado do teste](../images/meu-post--resultado.png) ``` -O `mdl` só aponta os problemas, não corrige. Pra corrigir automaticamente o que dá pra -corrigir sem risco (ver `scripts/fix_markdown.rb` pra saber exatamente o quê): +A data do front matter determina a organização. Para publicar, revise o +texto e troque `draft: true` por `draft: false`. O criador recusa datas inválidas +e nunca sobrescreve um post existente. Os arquivos `_index.md` e `_index.en.md` +da seção `docs` continuam sendo índices da seção. + +### Migrar e conferir a estrutura + +Os posts existentes foram reorganizados mantendo suas URLs no campo `url` +do front matter. Preserve esse campo ao editar ou traduzir esses textos. +A migração ajusta referências de imagens e `relref`, mantém os arquivos de +imagem e recusa colisões entre posts antes de gravar. ```bash -bundle exec ruby scripts/fix_markdown.rb +# Apenas mostrar os destinos, sem alterar arquivos +ruby scripts/migrate_posts.rb + +# Aplicar a migração em conteúdo importado no formato antigo +ruby scripts/migrate_posts.rb --apply ``` +Os scripts encontram a raiz do projeto pela própria localização, mesmo quando +chamados de outro diretório. O CI verifica a estrutura, a criação de posts, +a segurança da migração e as imagens nas traduções. Veja os +[testes de organização dos posts](#organização-criação-e-migração-de-posts). + +## Lint de Markdown + +As regras de escrita ficam em [.mdl_style.rb](.mdl_style.rb). O lint aponta +problemas de formatação; a explicação e o comando estão em +[Lint e build do site](#lint-e-build-do-site). Para aplicar correções automáticas, +consulte os comandos de `fix_markdown.rb` na [tabela do projeto](#comandos-e-scripts-do-projeto). + ## Português e inglês com o seletor nativo O blog usa o modo multilíngue do Hugo e o seletor de idioma do tema Hextra. @@ -108,32 +183,187 @@ depende de um serviço externo de tradução. As traduções são arquivos Markdown separados, com o mesmo nome e o sufixo `.en`: ```text -content/docs/2026/outubro/meu-post.md -content/docs/2026/outubro/meu-post.en.md - -content/docs/2026/julho/meu-projeto/index.md -content/docs/2026/julho/meu-projeto/index.en.md +content/docs/2026/outubro/29-10/meu-post.md +content/docs/2026/outubro/29-10/meu-post.en.md ``` Traduza o título e o conteúdo, preservando data, slug e estado de rascunho. -Em page bundles, o Hugo compartilha as imagens entre as traduções. Em posts -soltos com imagens externas ao bundle, use caminhos que resolvam também em `/en/`. +Nos posts migrados, mantenha a URL original do português e use a mesma URL +com o prefixo `/en/` na tradução. Por exemplo, `url: /docs/meu-post/` +e `url: /en/docs/meu-post/`. Posts novos não precisam desse campo. +Ambos os idiomas usam `../images/nome-do-post--imagem.png`, com uma única +cópia de cada imagem na pasta do mês. Os posts publicados já têm versões em inglês; rascunhos continuam como estão. Novos posts precisam de uma versão `.en.md` antes de serem publicados. -### Testes do modo multilíngue +Os cenários cobertos pelo seletor e pelas traduções estão descritos nos +[testes de integração multilíngue](#integração-multilíngue). + +## Testes + +Esta seção reúne os testes automatizados e as validações do blog. +Os comandos usam os pré-requisitos de [Ambiente e execução local](#ambiente-e-execução-local). +Execute-os na raiz do projeto, após `bundle install`. + +Os testes Ruby usam verificações próprias com mensagens `PASS`/`FAIL`; +os JavaScript usam `node:test`. Uma falha encerra o comando com código diferente +de zero. Os testes de migração e integração criam arquivos em diretórios +temporários; a validação de estrutura e o lint leem o conteúdo real do blog. + +### Comandos de testes e validação + +| Comando | Arquivo ou ferramenta | O que verifica | +| --- | --- | --- | +| `bundle exec ruby scripts/test_post_layout.rb` | [test_post_layout.rb](scripts/test_post_layout.rb) | [Organização, criação e migração de posts](#organização-criação-e-migração-de-posts), com exemplos temporários. | +| `bundle exec ruby scripts/check_post_layout.rb` | [check_post_layout.rb](scripts/check_post_layout.rb) | [Estrutura do acervo real](#estrutura-do-acervo-real), incluindo as pastas de imagens. | +| `bundle exec ruby scripts/test_go_modules.rb` | [test_go_modules.rb](scripts/test_go_modules.rb) | [Regressão de módulos Go](#módulos-go-e-vendoring), reproduzindo `vendor/bundle`. | +| `bundle exec ruby scripts/test_multilingual.rb` | [test_multilingual.rb](scripts/test_multilingual.rb) | [Integração multilíngue](#integração-multilíngue), com builds Hugo temporários. | +| `node --test tests/*.test.cjs` | [tests/](tests/) | Executar todas as suítes JavaScript: calendário, cursor e cores dos links. | +| `node --test tests/calendar.test.cjs` | [calendar.test.cjs](tests/calendar.test.cjs) | [Calendário](#testes-do-calendário), isoladamente. | +| `node --test tests/cursor-trail.test.cjs` | [cursor-trail.test.cjs](tests/cursor-trail.test.cjs) | [Brilho no cursor](#testes-do-brilho-no-cursor), isoladamente. | +| `node --test tests/link-colors.test.cjs` | [link-colors.test.cjs](tests/link-colors.test.cjs) | [Cores dos links](#testes-das-cores-dos-links), isoladamente. | +| `bundle exec mdl content README.md` | `mdl`; [.mdl_style.rb](.mdl_style.rb) | [Lint de Markdown](#lint-e-build-do-site), sem corrigir arquivos. | +| `hugo --gc --minify` | Hugo | [Build de produção](#lint-e-build-do-site), com saída em `public/`. | +| `hugo --buildDrafts --buildFuture --minify --destination /tmp/ladydebug-content-check` | Hugo | [Build de todo o conteúdo](#lint-e-build-do-site), incluindo rascunhos e datas futuras. | + +[Voltar aos comandos do projeto](#comandos-e-scripts-do-projeto). + +### Organização, criação e migração de posts + +Arquivo: [scripts/test_post_layout.rb](scripts/test_post_layout.rb). + +- Confere o padrão `ano/mês/DD-MM/nome-do-post.md` e a versão `.en.md`, sem número antes do nome do mês. +- Executa o criador com uma data histórica e verifica título com acentos, aspas, tags e `draft: true` no YAML. +- Permite vários posts no mesmo dia e recusa nomes duplicados sem sobrescrever conteúdo. +- Rejeita datas inválidas antes de criar pastas. +- Migra posts e traduções preservando data, URLs e conteúdo dos arquivos de imagem, inclusive imagens com nomes repetidos. +- Preserva legendas, parâmetros de consulta e fragmentos nas referências das imagens. +- Rejeita pastas de mês com prefixo numérico e testa sua migração sem renomear imagens mensais já organizadas. +- Confirma que simular a migração não altera arquivos e que aplicá-la novamente não modifica o resultado. +- Recusa colisões de destino antes de mover ou apagar os arquivos de origem. + +### Estrutura do acervo real + +Arquivo: [scripts/check_post_layout.rb](scripts/check_post_layout.rb). + +Percorre `content/docs/` e confere se o caminho de cada post corresponde à data +do front matter e ao padrão de nomes. Verifica se as imagens estão diretamente +em `ano/mês/images/`, com um nome de mês válido. Os índices `_index.md` e +`_index.en.md` da seção são exceções previstas. Diferentemente dos testes com +exemplos temporários, esta validação detecta arquivos reais fora do padrão. -Com os mesmos pré-requisitos do blog, execute: +### Módulos Go e vendoring + +Arquivo: [scripts/test_go_modules.rb](scripts/test_go_modules.rb). + +Reproduz em um diretório temporário a pasta `vendor/bundle` criada pelo Bundler. +Usa o `GOFLAGS` definido no workflow multilíngue e executa `go list -m -json all`. +Confirma que o tema Hextra é resolvido e que `go.mod` e `go.sum` permanecem iguais. +Esse teste cobre a regressão de CI com a mensagem `inconsistent vendoring`. +Requer Go no `PATH` e acesso aos módulos, por cache ou rede. + +### Integração multilíngue + +Arquivo: [scripts/test_multilingual.rb](scripts/test_multilingual.rb). + +Gera sites temporários com Hugo, tanto na raiz do domínio quanto sob `/blog/`, +e inspeciona o HTML resultante. Os cenários incluem: + +- URLs originais do português e prefixo `/en/` para o inglês. +- Seletor nativo com semântica acessível e troca entre as versões do mesmo post. +- Retorno à página inicial do idioma quando não existe tradução. +- Links de idioma funcionando em hospedagem sob um subdiretório. +- Página inicial em inglês com posts, rótulos e meses no idioma correto. +- Imagens mensais compartilhadas pelos dois idiomas, com arquivos de destino válidos e URLs antigas dos posts preservadas. +- Ausência da antiga integração externa com Google Translate. +- Nomes acessíveis dos botões da doca mesmo quando os rótulos visuais ficam ocultos. +- Existência de um arquivo `.en.md` para cada post publicado do acervo real. +- Controles e dados do calendário localizados, preservando a data do evento. +- Inclusão dos arquivos do brilho no cursor e preservação da doca no HTML. + +### Testes do calendário + +Arquivo: [tests/calendar.test.cjs](tests/calendar.test.cjs). + +- Fevereiro em anos bissextos e não bissextos. +- Alinhamento dos dias da semana e preenchimento da grade mensal, inclusive meses que começam no domingo. +- Navegação entre meses atravessando a mudança de ano. +- Data de hoje conforme o horário local do visitante. +- Seleção de todos os eventos de um dia, sem incluir eventos de outras datas. +- Rótulos em português e inglês sem deslocar o dia selecionado. +- Aceitação de links web e rejeição de URLs executáveis ou malformadas nos eventos. + +### Testes do brilho no cursor + +Arquivo: [tests/cursor-trail.test.cjs](tests/cursor-trail.test.cjs). + +- Criação de partículas nas coordenadas do mouse. +- Ausência de partículas para toque, caneta, dispositivos apenas de toque e preferência de movimento reduzido. +- Funcionamento de eventos reais de mouse quando o navegador não informa o tipo de dispositivo. +- Limites de frequência, quantidade e tempo de vida das partículas. +- Limpeza das partículas ao mudar a preferência de movimento, sair da página ou ocultar a aba. +- Remoção de partículas, temporizadores e eventos ao destruir o efeito. + +### Testes das cores dos links + +Arquivo: [tests/link-colors.test.cjs](tests/link-colors.test.cjs). + +Verifica se as cores dos links nos temas claro e escuro pertencem à família +de cores de destaque do blog. É uma checagem da paleta definida no CSS; +não compara capturas de tela nem valida contraste ou aparência em navegadores. + +### Lint e build do site + +O `mdl` verifica a formatação dos posts e deste README conforme +[.mdl_style.rb](.mdl_style.rb). Não modifica arquivos; para corrigir problemas, +use os [comandos de manutenção do Markdown](#comandos-e-scripts-do-projeto). + +O build de produção verifica se o Hugo consegue gerar o site publicável. +O build com `--buildDrafts --buildFuture` inclui também conteúdo que ficaria +oculto na produção e pode revelar erros de template, referências ou front matter +nesses posts. A opção `--destination` permite gravar essa saída fora do projeto. + +Os testes JavaScript verificam comportamento com objetos simulados; os de +integração inspecionam HTML gerado. Eles não substituem a revisão visual no +navegador, em português e inglês, nos temas claro e escuro e em telas menores. + +### Executar todas as verificações + +Após instalar as dependências, execute a sequência abaixo antes de abrir um PR. +O `set -e` interrompe a sequência na primeira falha: ```bash +set -e +bundle exec ruby scripts/test_post_layout.rb +bundle exec ruby scripts/check_post_layout.rb +bundle exec ruby scripts/test_go_modules.rb bundle exec ruby scripts/test_multilingual.rb +node --test tests/*.test.cjs +bundle exec mdl content README.md +hugo --gc --minify +hugo --buildDrafts --buildFuture --minify --destination /tmp/ladydebug-content-check ``` -Os testes geram um site temporário e verificam o seletor nativo, a troca entre -posts equivalentes, o fallback sem tradução, URLs em subdiretórios, textos -localizados e imagens compartilhadas. Também verificam se cada post publicado -tem um arquivo em inglês. O workflow `multilingual.yaml` executa os testes nos -PRs e pushes para `develop` e `main`. +Para uma correção de comportamento, siga TDD: primeiro escreva o teste e +confirme a falha, implemente a mudança e execute novamente a suíte afetada. +Antes de concluir, rode as verificações acima. + +### Testes no CI + +Estes workflows rodam em PRs e em pushes para `develop` e `main`: + +| Workflow | Verificações | +| --- | --- | +| [multilingual.yaml](.github/workflows/multilingual.yaml) | Módulos Go, criação e migração de posts, estrutura do acervo, integração multilíngue e build incluindo rascunhos e posts futuros. | +| [calendar-tests.yaml](.github/workflows/calendar-tests.yaml) | Todas as suítes JavaScript, incluindo calendário, cursor e cores dos links. | +| [lint.yaml](.github/workflows/lint.yaml) | Lint de `content/` e `README.md`. | + +O [deploy](.github/workflows/pages.yaml) e a +[release](.github/workflows/release.yaml) são automações separadas acionadas +por pushes em `main`; não substituem as verificações listadas aqui. + +[Voltar aos comandos de testes](#comandos-de-testes-e-validação) · +[Voltar aos comandos do projeto](#comandos-e-scripts-do-projeto). ## Changelog e releases @@ -187,12 +417,9 @@ navegar pelos meses. As alterações aparecem depois do build e deploy do blog. O calendário funciona sem serviços externos; sem JavaScript, a janela mostra uma lista dos eventos cadastrados. -Para validar o calendário e sua integração com os idiomas: - -```bash -node --test tests/calendar.test.cjs -bundle exec ruby scripts/test_multilingual.rb -``` +A cobertura está descrita em [Testes do calendário](#testes-do-calendário) +e [Integração multilíngue](#integração-multilíngue). Os comandos ficam na +[tabela de testes](#comandos-de-testes-e-validação). Ícones: [Pixelarticons](https://github.com/halfmage/pixelarticons) (MIT). @@ -204,11 +431,8 @@ interceptam cliques nem alteram o layout. O efeito fica desativado para toque, caneta e preferência de movimento reduzido do sistema. Os arquivos são `assets/js/cursor-trail.js` e `assets/css/cursor-trail-style.css`. -Para testar o comportamento do cursor e do calendário: - -```bash -node --test tests/*.test.cjs -``` +A cobertura está descrita em [Testes do brilho no cursor](#testes-do-brilho-no-cursor). +Consulte os [comandos de testes](#comandos-de-testes-e-validação) para executar a suíte. Fonte: [Pixelify Sans](https://fonts.google.com/specimen/Pixelify+Sans) (OFL, licença em `assets/font/pixelify-sans/OFL.txt`), self-hosted como WOFF2 — diff --git a/content/docs/2023/fevereiro/teste-de-performance-ingresso-com/index.en.md b/content/docs/2023/fevereiro/04-02/teste-de-performance-uma-breve-analise-do-site-ingresso-com.en.md similarity index 79% rename from content/docs/2023/fevereiro/teste-de-performance-ingresso-com/index.en.md rename to content/docs/2023/fevereiro/04-02/teste-de-performance-uma-breve-analise-do-site-ingresso-com.en.md index 509f781..a58c876 100644 --- a/content/docs/2023/fevereiro/teste-de-performance-ingresso-com/index.en.md +++ b/content/docs/2023/fevereiro/04-02/teste-de-performance-uma-breve-analise-do-site-ingresso-com.en.md @@ -5,6 +5,7 @@ slug: teste-de-performance-uma-breve-analise-do-site-ingresso-com description: "A record from 2023 about performance problems during ticket presales and the importance of performance testing." tags: [testes, performance, qualidade] draft: false +url: "/en/docs/2023/fevereiro/teste-de-performance-uma-breve-analise-do-site-ingresso-com/" --- > Originally published on [Medium](https://medium.com/@kellenxaviier/teste-de-performance-uma-breve-an%C3%A1lise-do-site-ingresso-com-90e89aacb9e6) on February 4, 2023. This record preserves the original article and images; the English text is a translation. @@ -31,13 +32,13 @@ Today we will discuss Black Friday and Ingresso.com as examples for exploring ** Around noon, a peak time, on November 29, 2021, ingresso.com, one of the largest cinema ticket sales websites, could not handle the number of simultaneous visitors buying presale tickets for the most anticipated movie of the year. -![Spider-Man: No Way Home page on ingresso.com](ingresso-com-pre-venda.png "Image taken from ingresso.com") +![Spider-Man: No Way Home page on ingresso.com](../images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--ingresso-com-pre-venda.png "Image taken from ingresso.com") The instability was so severe that some people spent *more than an hour trying to complete a purchase*. Some users who managed to complete the purchase flow were charged but did not receive their tickets and had to request a refund. -![Loading indicator during the ingresso.com purchase flow](ingresso-com-falha-na-compra.png "Image taken from ingresso.com") +![Loading indicator during the ingresso.com purchase flow](../images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--ingresso-com-falha-na-compra.png "Image taken from ingresso.com") -![Connection error displayed on ingresso.com](ingresso-com-instabilidade.png "Image taken from ingresso.com") +![Connection error displayed on ingresso.com](../images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--ingresso-com-instabilidade.png "Image taken from ingresso.com") ### Other problems also occurred @@ -52,21 +53,21 @@ The instability was so severe that some people spent *more than an hour trying t - Movie no longer available: the site displayed the movie as though it were no longer showing; - Generic messages: users encountered errors, but the messages were imprecise. The same message appeared for several different errors, making the flow frustrating; -![Ingresso.com reporting no upcoming movies](ingresso-com-erros.png "ingresso.com website") +![Ingresso.com reporting no upcoming movies](../images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--ingresso-com-erros.png "ingresso.com website") ### The instability was so severe that it generated memes -![Memes about instability during the Spider-Man ticket presale](meme-instabilidade.png) +![Memes about instability during the Spider-Man ticket presale](../images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--meme-instabilidade.png) ### Others were not so happy -![Comments on ingresso.com's Instagram post about the presale](instagram-reclamacoes-1.png "Instagram — @ingressocom") +![Comments on ingresso.com's Instagram post about the presale](../images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--instagram-reclamacoes-1.png "Instagram — @ingressocom") -![Users reporting ticket purchase failures](instagram-reclamacoes-2.png "Instagram — @ingressocom") +![Users reporting ticket purchase failures](../images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--instagram-reclamacoes-2.png "Instagram — @ingressocom") ### Post with a statement from ingresso.com -![Ingresso.com's statement about record simultaneous traffic](instagram-nota-de-esclarecimento.png "Instagram — @ingressocom") +![Ingresso.com's statement about record simultaneous traffic](../images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--instagram-nota-de-esclarecimento.png "Instagram — @ingressocom") > Performance tests help prevent the situations described above and maintain an application's quality and scalability! diff --git a/content/docs/2023/fevereiro/teste-de-performance-ingresso-com/index.md b/content/docs/2023/fevereiro/04-02/teste-de-performance-uma-breve-analise-do-site-ingresso-com.md similarity index 84% rename from content/docs/2023/fevereiro/teste-de-performance-ingresso-com/index.md rename to content/docs/2023/fevereiro/04-02/teste-de-performance-uma-breve-analise-do-site-ingresso-com.md index 5bd5980..4ee6084 100644 --- a/content/docs/2023/fevereiro/teste-de-performance-ingresso-com/index.md +++ b/content/docs/2023/fevereiro/04-02/teste-de-performance-uma-breve-analise-do-site-ingresso-com.md @@ -5,6 +5,7 @@ slug: teste-de-performance-uma-breve-analise-do-site-ingresso-com description: "Registro de 2023 sobre problemas de desempenho na pré-venda de ingressos e a importância dos testes de performance." tags: [testes, performance, qualidade] draft: false +url: "/docs/2023/fevereiro/teste-de-performance-uma-breve-analise-do-site-ingresso-com/" --- > Publicado originalmente no [Medium](https://medium.com/@kellenxaviier/teste-de-performance-uma-breve-an%C3%A1lise-do-site-ingresso-com-90e89aacb9e6) em 4 de fevereiro de 2023. Este registro preserva o texto e as imagens do artigo original. @@ -31,13 +32,13 @@ Hoje vamos falar sobre a Black Friday e a Ingresso.com, esses serão nossos exem Por volta do meio-dia (horário de pico) em 29 de novembro de 2021, o site ingresso.com, uma das maiores páginas de vendas de ingressos de cinema, não aguentou a quantidade de acessos simultâneos para as compras dos ingressos na pré-venda do filme mais aguardado do ano. -![Página do filme Homem-Aranha: Sem Volta para Casa no ingresso.com](ingresso-com-pre-venda.png "imagem retirada do site ingresso.com") +![Página do filme Homem-Aranha: Sem Volta para Casa no ingresso.com](../images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--ingresso-com-pre-venda.png "imagem retirada do site ingresso.com") A instabilidade foi tanta que houve pessoas que ficaram *mais de 1 hora para realizar a compra*. Alguns que conseguiram realizar o fluxo de compra tiveram o valor descontado mas não receberam os ingressos, e tiveram que solicitar o estorno do valor. -![Indicador de carregamento do ingresso.com durante o fluxo de compra](ingresso-com-falha-na-compra.png "imagem retirada do site ingresso.com") +![Indicador de carregamento do ingresso.com durante o fluxo de compra](../images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--ingresso-com-falha-na-compra.png "imagem retirada do site ingresso.com") -![Mensagem de erro de conexão exibida no ingresso.com](ingresso-com-instabilidade.png "imagem retirada do site ingresso.com") +![Mensagem de erro de conexão exibida no ingresso.com](../images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--ingresso-com-instabilidade.png "imagem retirada do site ingresso.com") ### Outros problemas ocorreram também, como @@ -52,21 +53,21 @@ A instabilidade foi tanta que houve pessoas que ficaram *mais de 1 hora para rea - Filme não está mais disponível — exibindo como se o filme não estivesse mais em cartaz; - Mensagens Genérica — o erro ocorria ao usuário, porém a mensagem informada não era nada precisa, sendo a mesma para diversos erros diferentes, gerando frustração no fluxo; -![Página do ingresso.com informando que não há filmes em breve](ingresso-com-erros.png "site ingresso.com") +![Página do ingresso.com informando que não há filmes em breve](../images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--ingresso-com-erros.png "site ingresso.com") ### Foi tão grande a instabilidade que gerou alguns memes -![Montagem de memes sobre a instabilidade na pré-venda de Homem-Aranha](meme-instabilidade.png) +![Montagem de memes sobre a instabilidade na pré-venda de Homem-Aranha](../images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--meme-instabilidade.png) ### Já outros não estavam tão contentes assim… -![Comentários na publicação do Instagram do ingresso.com sobre a pré-venda](instagram-reclamacoes-1.png "instagram — @ingressocom") +![Comentários na publicação do Instagram do ingresso.com sobre a pré-venda](../images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--instagram-reclamacoes-1.png "instagram — @ingressocom") -![Comentários de usuários relatando falhas na compra de ingressos](instagram-reclamacoes-2.png "instagram — @ingressocom") +![Comentários de usuários relatando falhas na compra de ingressos](../images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--instagram-reclamacoes-2.png "instagram — @ingressocom") ### Postagem: nota de esclarecimento do site ingresso.com -![Nota de esclarecimento do ingresso.com sobre o recorde de acessos simultâneos](instagram-nota-de-esclarecimento.png "instagram — @ingressocom") +![Nota de esclarecimento do ingresso.com sobre o recorde de acessos simultâneos](../images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--instagram-nota-de-esclarecimento.png "instagram — @ingressocom") > Os Teste de Performance no sistema servem para que não ocorram essas situações citadas, para manter a qualidade e escalabilidade da aplicação! diff --git a/content/docs/2023/fevereiro/teste-de-performance-ingresso-com/ingresso-com-erros.png b/content/docs/2023/fevereiro/images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--ingresso-com-erros.png similarity index 100% rename from content/docs/2023/fevereiro/teste-de-performance-ingresso-com/ingresso-com-erros.png rename to content/docs/2023/fevereiro/images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--ingresso-com-erros.png diff --git a/content/docs/2023/fevereiro/teste-de-performance-ingresso-com/ingresso-com-falha-na-compra.png b/content/docs/2023/fevereiro/images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--ingresso-com-falha-na-compra.png similarity index 100% rename from content/docs/2023/fevereiro/teste-de-performance-ingresso-com/ingresso-com-falha-na-compra.png rename to content/docs/2023/fevereiro/images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--ingresso-com-falha-na-compra.png diff --git a/content/docs/2023/fevereiro/teste-de-performance-ingresso-com/ingresso-com-instabilidade.png b/content/docs/2023/fevereiro/images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--ingresso-com-instabilidade.png similarity index 100% rename from content/docs/2023/fevereiro/teste-de-performance-ingresso-com/ingresso-com-instabilidade.png rename to content/docs/2023/fevereiro/images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--ingresso-com-instabilidade.png diff --git a/content/docs/2023/fevereiro/teste-de-performance-ingresso-com/ingresso-com-pre-venda.png b/content/docs/2023/fevereiro/images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--ingresso-com-pre-venda.png similarity index 100% rename from content/docs/2023/fevereiro/teste-de-performance-ingresso-com/ingresso-com-pre-venda.png rename to content/docs/2023/fevereiro/images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--ingresso-com-pre-venda.png diff --git a/content/docs/2023/fevereiro/teste-de-performance-ingresso-com/instagram-nota-de-esclarecimento.png b/content/docs/2023/fevereiro/images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--instagram-nota-de-esclarecimento.png similarity index 100% rename from content/docs/2023/fevereiro/teste-de-performance-ingresso-com/instagram-nota-de-esclarecimento.png rename to content/docs/2023/fevereiro/images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--instagram-nota-de-esclarecimento.png diff --git a/content/docs/2023/fevereiro/teste-de-performance-ingresso-com/instagram-reclamacoes-1.png b/content/docs/2023/fevereiro/images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--instagram-reclamacoes-1.png similarity index 100% rename from content/docs/2023/fevereiro/teste-de-performance-ingresso-com/instagram-reclamacoes-1.png rename to content/docs/2023/fevereiro/images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--instagram-reclamacoes-1.png diff --git a/content/docs/2023/fevereiro/teste-de-performance-ingresso-com/instagram-reclamacoes-2.png b/content/docs/2023/fevereiro/images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--instagram-reclamacoes-2.png similarity index 100% rename from content/docs/2023/fevereiro/teste-de-performance-ingresso-com/instagram-reclamacoes-2.png rename to content/docs/2023/fevereiro/images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--instagram-reclamacoes-2.png diff --git a/content/docs/2023/fevereiro/teste-de-performance-ingresso-com/meme-instabilidade.png b/content/docs/2023/fevereiro/images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--meme-instabilidade.png similarity index 100% rename from content/docs/2023/fevereiro/teste-de-performance-ingresso-com/meme-instabilidade.png rename to content/docs/2023/fevereiro/images/teste-de-performance-uma-breve-analise-do-site-ingresso-com--meme-instabilidade.png diff --git a/content/docs/2024/outubro/cypress-boas-praticas/index.en.md b/content/docs/2024/outubro/24-10/cypress-e-boas-praticas-de-automacao.en.md similarity index 83% rename from content/docs/2024/outubro/cypress-boas-praticas/index.en.md rename to content/docs/2024/outubro/24-10/cypress-e-boas-praticas-de-automacao.en.md index 6dfe012..9314564 100644 --- a/content/docs/2024/outubro/cypress-boas-praticas/index.en.md +++ b/content/docs/2024/outubro/24-10/cypress-e-boas-praticas-de-automacao.en.md @@ -5,15 +5,16 @@ slug: cypress-e-boas-praticas-de-automacao tags: [cypress, automacao, boas, praticas, docs] draft: false featured: true +url: "/en/docs/2024/outubro/cypress-e-boas-praticas-de-automacao/" --- Avoiding *false positives* with Cypress. Below is an example of some code and a commands file with a simple application login: -![Example of poor practices](exemplo-praticas-ruins.png) +![Example of poor practices](../images/cypress-e-boas-praticas-de-automacao--exemplo-praticas-ruins.png) This application was encountering an error during login. The following code was added to the automation to make login succeed: -![What does this code do?](o_que_o_erro_faz.png) +![What does this code do?](../images/cypress-e-boas-praticas-de-automacao--o-que-o-erro-faz.png) But what does that code mean? It suppresses errors that occur in the application while Cypress tests run. @@ -21,7 +22,7 @@ How? Using `cy.on('uncaught:exception')` and returning false tells Cypress to ig Why is removing `cy.on('uncaught:exception')` important? In this case, manipulating the test to ignore the error by returning false introduces a false positive. See below: -![Login reported as successful](login_com_sucesso.png) +![Login reported as successful](../images/cypress-e-boas-praticas-de-automacao--login-com-sucesso.png) ## Alternatives for handling loading time and avoiding false positives diff --git a/content/docs/2024/outubro/cypress-boas-praticas/index.md b/content/docs/2024/outubro/24-10/cypress-e-boas-praticas-de-automacao.md similarity index 87% rename from content/docs/2024/outubro/cypress-boas-praticas/index.md rename to content/docs/2024/outubro/24-10/cypress-e-boas-praticas-de-automacao.md index 488604d..13a7382 100644 --- a/content/docs/2024/outubro/cypress-boas-praticas/index.md +++ b/content/docs/2024/outubro/24-10/cypress-e-boas-praticas-de-automacao.md @@ -5,15 +5,16 @@ slug: cypress-e-boas-praticas-de-automacao tags: [cypress, automacao, boas, praticas, docs] draft: false featured: true +url: "/docs/2024/outubro/cypress-e-boas-praticas-de-automacao/" --- Evitando o uso de *Falsos Positivos* com Cypress. Segue abaixo um exemplo de um código, e um arquivo commands com um simples login na aplicação: -![exemplo-praticas-ruins](exemplo-praticas-ruins.png) +![exemplo-praticas-ruins](../images/cypress-e-boas-praticas-de-automacao--exemplo-praticas-ruins.png) Essa aplicação estava ocorrendo um certo erro ao realizar o login, e foi adicionado o seguinte trecho de código na automação para poder realizar o login com sucesso: -![o que o erro faz?](o_que_o_erro_faz.png) +![o que o erro faz?](../images/cypress-e-boas-praticas-de-automacao--o-que-o-erro-faz.png) Mas o que esse trecho diz? Serve para suprimir os erros que ocorrem na aplicação durante a execução dos testes do Cypress. @@ -21,7 +22,7 @@ Como assim? Ao usar ```cy.on('uncaught:exception')``` e retornar false, está in Por que remover ```cy.on('uncaught:exception')``` é importante? Nesse caso, como está sendo manipulado o teste, forçando a “ignorar esse erro retornando que ele seja falso” é adicionado um falso positivo no nosso teste. Segue abaixo: -![alt text](login_com_sucesso.png) +![alt text](../images/cypress-e-boas-praticas-de-automacao--login-com-sucesso.png) ## Alternativas e soluções para lidar com o tempo de carregamento e evitar adicionar “falso positivo” diff --git a/content/docs/2024/outubro/cypress-boas-praticas/exemplo-praticas-ruins.png b/content/docs/2024/outubro/images/cypress-e-boas-praticas-de-automacao--exemplo-praticas-ruins.png similarity index 100% rename from content/docs/2024/outubro/cypress-boas-praticas/exemplo-praticas-ruins.png rename to content/docs/2024/outubro/images/cypress-e-boas-praticas-de-automacao--exemplo-praticas-ruins.png diff --git a/content/docs/2024/outubro/cypress-boas-praticas/login_com_sucesso.png b/content/docs/2024/outubro/images/cypress-e-boas-praticas-de-automacao--login-com-sucesso.png similarity index 100% rename from content/docs/2024/outubro/cypress-boas-praticas/login_com_sucesso.png rename to content/docs/2024/outubro/images/cypress-e-boas-praticas-de-automacao--login-com-sucesso.png diff --git a/content/docs/2024/outubro/cypress-boas-praticas/o_que_o_erro_faz.png b/content/docs/2024/outubro/images/cypress-e-boas-praticas-de-automacao--o-que-o-erro-faz.png similarity index 100% rename from content/docs/2024/outubro/cypress-boas-praticas/o_que_o_erro_faz.png rename to content/docs/2024/outubro/images/cypress-e-boas-praticas-de-automacao--o-que-o-erro-faz.png diff --git a/content/docs/2025/abril/pesquisa-de-sites-mercado-foco-em-academias.en.md b/content/docs/2025/abril/17-04/pesquisa-de-sites-mercado-foco-em-academias.en.md similarity index 97% rename from content/docs/2025/abril/pesquisa-de-sites-mercado-foco-em-academias.en.md rename to content/docs/2025/abril/17-04/pesquisa-de-sites-mercado-foco-em-academias.en.md index 194be2d..ddd60bf 100644 --- a/content/docs/2025/abril/pesquisa-de-sites-mercado-foco-em-academias.en.md +++ b/content/docs/2025/abril/17-04/pesquisa-de-sites-mercado-foco-em-academias.en.md @@ -4,6 +4,7 @@ date: 2025-04-17 slug: pesquisa-de-sites-mercado-foco-em-academias tags: [pesquisa, ux, design] draft: false +url: "/en/docs/2025/abril/pesquisa-de-sites-mercado-foco-em-academias/" --- ### Studies and general analysis of gym websites diff --git a/content/docs/2025/abril/pesquisa-de-sites-mercado-foco-em-academias.md b/content/docs/2025/abril/17-04/pesquisa-de-sites-mercado-foco-em-academias.md similarity index 97% rename from content/docs/2025/abril/pesquisa-de-sites-mercado-foco-em-academias.md rename to content/docs/2025/abril/17-04/pesquisa-de-sites-mercado-foco-em-academias.md index 94320ec..9926f0a 100644 --- a/content/docs/2025/abril/pesquisa-de-sites-mercado-foco-em-academias.md +++ b/content/docs/2025/abril/17-04/pesquisa-de-sites-mercado-foco-em-academias.md @@ -4,6 +4,7 @@ date: 2025-04-17 slug: pesquisa-de-sites-mercado-foco-em-academias tags: [pesquisa, ux, design] draft: false +url: "/docs/2025/abril/pesquisa-de-sites-mercado-foco-em-academias/" --- ### Estudos e Análise Geral de Sites de Academias de Atividades Físicas diff --git a/content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/index.en.md b/content/docs/2025/abril/24-04/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software.en.md similarity index 77% rename from content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/index.en.md rename to content/docs/2025/abril/24-04/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software.en.md index 13b88b0..1252790 100644 --- a/content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/index.en.md +++ b/content/docs/2025/abril/24-04/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software.en.md @@ -4,6 +4,7 @@ date: 2025-04-24 slug: promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software tags: [design-thinking, ux, inovacao] draft: false +url: "/en/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/" --- I am applying these studies to the strength training studio I attend in northern Porto Alegre. I asked the owner, who started the business in January 2025, for permission to apply the studies and develop a project for a real business with real needs. @@ -24,19 +25,19 @@ As a gym member, I ran into questions: what are the prices? How do the packages Based on this, I organized the information I had and talked to the owner to understand and refine the questions. Using design thinking techniques, I applied the **Value Proposition Canvas** to get the ideas out of my head and share them with the person involved: the business owner. See below: -![Value Proposition Canvas](value-proposition-canvas.png) +![Value Proposition Canvas](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--value-proposition-canvas.png) -![Value Proposition Canvas applied to the studio project](aplicado-value-proposition-canvas.png) +![Value Proposition Canvas applied to the studio project](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--aplicado-value-proposition-canvas.png) I also used ChatGPT to structure the details and organize the information in the appropriate places, so I would not lose focus on the details. ### ChatGPT -![Using ChatGPT to organize information](chatgpt-1.png) +![Using ChatGPT to organize information](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--chatgpt-1.png) Below, I used a checklist of the information I had already mapped to stay organized throughout the process: -![Checklist of mapped information](checklist.png) +![Checklist of mapped information](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--checklist.png) To make the interview clearer, I decided to create a form for the owner to answer. **This corresponds to the "Define" stage mentioned and applied here.** @@ -46,7 +47,7 @@ To make the interview clearer, I decided to create a form for the owner to answe The ChatGPT output above gives us the following: -![ChatGPT during ideation](chatgpt-ideacao.png) +![ChatGPT during ideation](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--chatgpt-ideacao.png) I will reorganize some points I consider important based on the needs mapped with the **Value Proposition Canvas**. @@ -62,17 +63,17 @@ Landing page solution brainstorm, edited: ### 4. Prototype -![Initial prototype](prototipagem-1.png) +![Initial prototype](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--prototipagem-1.png) I am terrible at design 😭, **so I used Canva to bring this to life** instead of letting that stop me. **Note:** a quick reminder of the live class discussion: "Great, let's go and do it." -![Live class about prototyping](prototipagem-2.png) +![Live class about prototyping](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--prototipagem-2.png) I do not know design. -![Prototyping attempt in Canva](prototipagem-3.png) +![Prototyping attempt in Canva](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--prototipagem-3.png) --- @@ -80,19 +81,19 @@ I do not know design. Creating the prototype: as mentioned, this prototype was made in Canva to visualize the planning from the Value Proposition Canvas. Below is the screen sequence: -![Prototype screen 1](teste-prototipo-1.png) +![Prototype screen 1](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--teste-prototipo-1.png) -![Prototype screen 2](teste-prototipo-2.png) +![Prototype screen 2](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--teste-prototipo-2.png) Include the remaining service information once the form has been answered. -![Prototype screen 3](teste-prototipo-3.png) +![Prototype screen 3](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--teste-prototipo-3.png) -![Prototype screen 4](teste-prototipo-4.png) +![Prototype screen 4](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--teste-prototipo-4.png) -![Prototype screen 5](teste-prototipo-5.png) +![Prototype screen 5](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--teste-prototipo-5.png) -![Prototype screen 6](teste-prototipo-6.png) +![Prototype screen 6](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--teste-prototipo-6.png) This initial prototype draft was developed to validate the owner's needs for serving customers. @@ -143,7 +144,7 @@ For use in the **Empathize and Define** stages with the client. **See the website prototype:** [https://site-academia-app.vercel.app/](https://site-academia-app.vercel.app/) -Website research for the fitness studio market — [link]({{< relref "/docs/2025/abril/pesquisa-de-sites-mercado-foco-em-academias.en.md" >}}). +Website research for the fitness studio market — [link]({{< relref "/docs/2025/abril/17-04/pesquisa-de-sites-mercado-foco-em-academias.en.md" >}}). **Study references:** diff --git a/content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/index.md b/content/docs/2025/abril/24-04/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software.md similarity index 79% rename from content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/index.md rename to content/docs/2025/abril/24-04/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software.md index 86771a5..5070046 100644 --- a/content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/index.md +++ b/content/docs/2025/abril/24-04/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software.md @@ -4,6 +4,7 @@ date: 2025-04-24 slug: promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software tags: [design-thinking, ux, inovacao] draft: false +url: "/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/" --- Eu estou aplicando o estudo com a estúdio de musculação que frequento, aqui na Zona Norte de Porto Alegre. Solicitei permissão ao dono da academia — que está iniciando o negócio desde janeiro de 2025 — para aplicar estes estudos e desenvolver um projeto em um negócio real, baseado em necessidades reais. @@ -24,19 +25,19 @@ Como sou usuária da academia, enfrentei alguns problemas, como: quais são os v Com base nisso, organizei todas as informações que tinha em mãos e conversei com o dono do negócio para entender e refinar as questões. Utilizando técnicas de design thinking, apliquei o **Value Proposition Canvas** para não deixar tudo apenas dentro da minha cabeça e também compartilhar com o envolvido — o dono do negócio. Segue abaixo: -![Value Proposition Canvas](value-proposition-canvas.png) +![Value Proposition Canvas](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--value-proposition-canvas.png) -![Value Proposition Canvas aplicado ao projeto do estúdio](aplicado-value-proposition-canvas.png) +![Value Proposition Canvas aplicado ao projeto do estúdio](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--aplicado-value-proposition-canvas.png) Utilizei também o ChatGPT para estruturar de forma detalhada e organizar todas as informações nos devidos lugares, a fim de não perder o foco nos detalhes. ### ChatGPT -![Uso do ChatGPT para organizar as informações](chatgpt-1.png) +![Uso do ChatGPT para organizar as informações](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--chatgpt-1.png) Abaixo, utilizei como um checklist das informações que já havia mapeado, para manter a organização e não me perder no processo: -![Checklist de informações mapeadas](checklist.png) +![Checklist de informações mapeadas](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--checklist.png) Para tornar a entrevista mais clara, resolvi criar um formulário para enviar ao dono do negócio responder; **isso corresponde às "Definições" citadas e aplicadas aqui.** @@ -46,7 +47,7 @@ Para tornar a entrevista mais clara, resolvi criar um formulário para enviar ao Visto acima no ChatGPT temos o seguinte: -![ChatGPT na fase de ideação](chatgpt-ideacao.png) +![ChatGPT na fase de ideação](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--chatgpt-ideacao.png) Vou mudar alguns pontos que acho importante reorganizar com base nas necessidades vistas lá no mapeamento com o **Value Proposition Canvas**. @@ -62,17 +63,17 @@ Brainstorm para soluções da Landing Page: EDITADA ### 4. Prototipagem -![Prototipagem inicial](prototipagem-1.png) +![Prototipagem inicial](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--prototipagem-1.png) Eu sou péssima com Design 😭 **então utilizei a ferramenta do Canva para dar vida** a isso, e não deixar isso ser meu impedimento. **OBS**: vamos relembrar brevemente da aula ao vivo sobre "legal, vamos lá fazer isso" -![Aula ao vivo sobre prototipagem](prototipagem-2.png) +![Aula ao vivo sobre prototipagem](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--prototipagem-2.png) EU não sei design -![Tentativa de prototipagem no Canva](prototipagem-3.png) +![Tentativa de prototipagem no Canva](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--prototipagem-3.png) --- @@ -80,19 +81,19 @@ EU não sei design Criação do protótipo: como citado, este protótipo foi feito no Canva, com o objetivo de tornar visual todo o planejamento do Value Proposition Canvas. Abaixo, segue a sequência das telas: -![Tela 1 do protótipo](teste-prototipo-1.png) +![Tela 1 do protótipo](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--teste-prototipo-1.png) -![Tela 2 do protótipo](teste-prototipo-2.png) +![Tela 2 do protótipo](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--teste-prototipo-2.png) Incluir parte dos serviços que falta para responder do formulário. -![Tela 3 do protótipo](teste-prototipo-3.png) +![Tela 3 do protótipo](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--teste-prototipo-3.png) -![Tela 4 do protótipo](teste-prototipo-4.png) +![Tela 4 do protótipo](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--teste-prototipo-4.png) -![Tela 5 do protótipo](teste-prototipo-5.png) +![Tela 5 do protótipo](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--teste-prototipo-5.png) -![Tela 6 do protótipo](teste-prototipo-6.png) +![Tela 6 do protótipo](../images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--teste-prototipo-6.png) Foi desenvolvido este rascunho inicial do protótipo, com o objetivo de validar as necessidades do proprietário do negócio em relação ao atendimento de seus clientes. diff --git a/content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/aplicado-value-proposition-canvas.png b/content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--aplicado-value-proposition-canvas.png similarity index 100% rename from content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/aplicado-value-proposition-canvas.png rename to content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--aplicado-value-proposition-canvas.png diff --git a/content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/chatgpt-1.png b/content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--chatgpt-1.png similarity index 100% rename from content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/chatgpt-1.png rename to content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--chatgpt-1.png diff --git a/content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/chatgpt-ideacao.png b/content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--chatgpt-ideacao.png similarity index 100% rename from content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/chatgpt-ideacao.png rename to content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--chatgpt-ideacao.png diff --git a/content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/checklist.png b/content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--checklist.png similarity index 100% rename from content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/checklist.png rename to content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--checklist.png diff --git a/content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/prototipagem-1.png b/content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--prototipagem-1.png similarity index 100% rename from content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/prototipagem-1.png rename to content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--prototipagem-1.png diff --git a/content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/prototipagem-2.png b/content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--prototipagem-2.png similarity index 100% rename from content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/prototipagem-2.png rename to content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--prototipagem-2.png diff --git a/content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/prototipagem-3.png b/content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--prototipagem-3.png similarity index 100% rename from content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/prototipagem-3.png rename to content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--prototipagem-3.png diff --git a/content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/teste-prototipo-1.png b/content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--teste-prototipo-1.png similarity index 100% rename from content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/teste-prototipo-1.png rename to content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--teste-prototipo-1.png diff --git a/content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/teste-prototipo-2.png b/content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--teste-prototipo-2.png similarity index 100% rename from content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/teste-prototipo-2.png rename to content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--teste-prototipo-2.png diff --git a/content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/teste-prototipo-3.png b/content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--teste-prototipo-3.png similarity index 100% rename from content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/teste-prototipo-3.png rename to content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--teste-prototipo-3.png diff --git a/content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/teste-prototipo-4.png b/content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--teste-prototipo-4.png similarity index 100% rename from content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/teste-prototipo-4.png rename to content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--teste-prototipo-4.png diff --git a/content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/teste-prototipo-5.png b/content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--teste-prototipo-5.png similarity index 100% rename from content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/teste-prototipo-5.png rename to content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--teste-prototipo-5.png diff --git a/content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/teste-prototipo-6.png b/content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--teste-prototipo-6.png similarity index 100% rename from content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/teste-prototipo-6.png rename to content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--teste-prototipo-6.png diff --git a/content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/value-proposition-canvas.png b/content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--value-proposition-canvas.png similarity index 100% rename from content/docs/2025/abril/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software/value-proposition-canvas.png rename to content/docs/2025/abril/images/promover-a-inovacao-em-seu-ambiente-de-desenvolvimento-de-software--value-proposition-canvas.png diff --git a/content/docs/2025/dezembro/linux-basico.md b/content/docs/2025/dezembro/01-12/linux-basico.md similarity index 78% rename from content/docs/2025/dezembro/linux-basico.md rename to content/docs/2025/dezembro/01-12/linux-basico.md index 3df6da9..6b5442d 100644 --- a/content/docs/2025/dezembro/linux-basico.md +++ b/content/docs/2025/dezembro/01-12/linux-basico.md @@ -4,6 +4,7 @@ date: 2025-12-01 weight: 1 tags: [linux, terminal, estudos] draft: true +url: "/docs/2025/dezembro/linux-basico/" --- ## Minhas anotações sobre o básicos do Linux diff --git a/content/docs/2025/dezembro/images/.gitkeep b/content/docs/2025/dezembro/images/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/content/docs/2025/junho/piramide-de-testes-para-dev.en.md b/content/docs/2025/junho/05-06/piramide-de-testes-para-dev.en.md similarity index 97% rename from content/docs/2025/junho/piramide-de-testes-para-dev.en.md rename to content/docs/2025/junho/05-06/piramide-de-testes-para-dev.en.md index ecbd43f..1aedb3e 100644 --- a/content/docs/2025/junho/piramide-de-testes-para-dev.en.md +++ b/content/docs/2025/junho/05-06/piramide-de-testes-para-dev.en.md @@ -4,6 +4,7 @@ date: 2025-06-05 slug: piramide-de-testes-para-dev tags: [testes, qualidade, piramide-de-testes] draft: false +url: "/en/docs/2025/junho/piramide-de-testes-para-dev/" --- ### 1. What is development testing? diff --git a/content/docs/2025/junho/piramide-de-testes-para-dev.md b/content/docs/2025/junho/05-06/piramide-de-testes-para-dev.md similarity index 98% rename from content/docs/2025/junho/piramide-de-testes-para-dev.md rename to content/docs/2025/junho/05-06/piramide-de-testes-para-dev.md index 8c56038..4ed98c9 100644 --- a/content/docs/2025/junho/piramide-de-testes-para-dev.md +++ b/content/docs/2025/junho/05-06/piramide-de-testes-para-dev.md @@ -4,6 +4,7 @@ date: 2025-06-05 slug: piramide-de-testes-para-dev tags: [testes, qualidade, piramide-de-testes] draft: false +url: "/docs/2025/junho/piramide-de-testes-para-dev/" --- ### 1. O que é Dev Teste? diff --git a/content/docs/2025/junho/praticas-ruins-de-testes-para-evitar-ou/index.en.md b/content/docs/2025/junho/05-06/praticas-ruins-de-testes-para-evitar-ou.en.md similarity index 97% rename from content/docs/2025/junho/praticas-ruins-de-testes-para-evitar-ou/index.en.md rename to content/docs/2025/junho/05-06/praticas-ruins-de-testes-para-evitar-ou.en.md index eb44c80..2090aa4 100644 --- a/content/docs/2025/junho/praticas-ruins-de-testes-para-evitar-ou/index.en.md +++ b/content/docs/2025/junho/05-06/praticas-ruins-de-testes-para-evitar-ou.en.md @@ -4,13 +4,14 @@ date: 2025-06-05 slug: praticas-ruins-de-testes-para-evitar-ou tags: [testes, automacao, qualidade] draft: false +url: "/en/docs/2025/junho/praticas-ruins-de-testes-para-evitar-ou/" --- Read this, print it, maybe print it and stick it on a few people's computers… --- -![Tired cat](cat-cansado.png) +![Tired cat](../images/praticas-ruins-de-testes-para-evitar-ou--cat-cansado.png) ## 1. Inadequate definition and planning diff --git a/content/docs/2025/junho/praticas-ruins-de-testes-para-evitar-ou/index.md b/content/docs/2025/junho/05-06/praticas-ruins-de-testes-para-evitar-ou.md similarity index 97% rename from content/docs/2025/junho/praticas-ruins-de-testes-para-evitar-ou/index.md rename to content/docs/2025/junho/05-06/praticas-ruins-de-testes-para-evitar-ou.md index f36300c..b0663aa 100644 --- a/content/docs/2025/junho/praticas-ruins-de-testes-para-evitar-ou/index.md +++ b/content/docs/2025/junho/05-06/praticas-ruins-de-testes-para-evitar-ou.md @@ -4,13 +4,14 @@ date: 2025-06-05 slug: praticas-ruins-de-testes-para-evitar-ou tags: [testes, automacao, qualidade] draft: false +url: "/docs/2025/junho/praticas-ruins-de-testes-para-evitar-ou/" --- Leia isso, imprimir, talvez imprima e cole no computador de uns aí… --- -![Gato cansado](cat-cansado.png) +![Gato cansado](../images/praticas-ruins-de-testes-para-evitar-ou--cat-cansado.png) ## 1. Definição e Planejamento Inadequados diff --git a/content/docs/2025/junho/processo-shift-left-testing-basico.en.md b/content/docs/2025/junho/05-06/processo-shift-left-testing-basico.en.md similarity index 96% rename from content/docs/2025/junho/processo-shift-left-testing-basico.en.md rename to content/docs/2025/junho/05-06/processo-shift-left-testing-basico.en.md index da8758d..34b4f7e 100644 --- a/content/docs/2025/junho/processo-shift-left-testing-basico.en.md +++ b/content/docs/2025/junho/05-06/processo-shift-left-testing-basico.en.md @@ -4,6 +4,7 @@ date: 2025-06-05 slug: processo-shift-left-testing-basico tags: [testes, qualidade, shift-left] draft: false +url: "/en/docs/2025/junho/processo-shift-left-testing-basico/" --- Here is a brief overview of introducing a basic quality process to a team. diff --git a/content/docs/2025/junho/processo-shift-left-testing-basico.md b/content/docs/2025/junho/05-06/processo-shift-left-testing-basico.md similarity index 97% rename from content/docs/2025/junho/processo-shift-left-testing-basico.md rename to content/docs/2025/junho/05-06/processo-shift-left-testing-basico.md index 679fcd7..e454798 100644 --- a/content/docs/2025/junho/processo-shift-left-testing-basico.md +++ b/content/docs/2025/junho/05-06/processo-shift-left-testing-basico.md @@ -4,6 +4,7 @@ date: 2025-06-05 slug: processo-shift-left-testing-basico tags: [testes, qualidade, shift-left] draft: false +url: "/docs/2025/junho/processo-shift-left-testing-basico/" --- Segue um breve resumo de aplicar um mínimo de processo de qualidade em um time. diff --git a/content/docs/2025/junho/testing-library-exemplos-de-configuracao/index.en.md b/content/docs/2025/junho/05-06/testing-library-exemplos-de-configuracao.en.md similarity index 92% rename from content/docs/2025/junho/testing-library-exemplos-de-configuracao/index.en.md rename to content/docs/2025/junho/05-06/testing-library-exemplos-de-configuracao.en.md index 68ad523..de86a94 100644 --- a/content/docs/2025/junho/testing-library-exemplos-de-configuracao/index.en.md +++ b/content/docs/2025/junho/05-06/testing-library-exemplos-de-configuracao.en.md @@ -4,6 +4,7 @@ date: 2025-06-05 slug: testing-library-exemplos-de-configuracao tags: [cypress, testing-library, e2e] draft: false +url: "/en/docs/2025/junho/testing-library-exemplos-de-configuracao/" --- Below is an example of code that uses `data-cy` to locate elements in Cypress E2E automation. @@ -12,7 +13,7 @@ Below is an example of code that uses `data-cy` to locate elements in Cypress E2 Using **Testing Library** is useful when an element has not been defined for E2E testing, meaning it has no data-test/cy attribute. For Testing Library to recognize it in the automation, the element Cypress searches for should not have `data-cy`; Testing Library then finds it using the pattern `findByText.('Sua palavra mágica').click();`. -![Cypress and Testing Library](cypress-testinglibrary.png) +![Cypress and Testing Library](../images/testing-library-exemplos-de-configuracao--cypress-testinglibrary.png) **Option 1 — Configure the `setup-tests.js` file, Cypress v10+:** diff --git a/content/docs/2025/junho/testing-library-exemplos-de-configuracao/index.md b/content/docs/2025/junho/05-06/testing-library-exemplos-de-configuracao.md similarity index 92% rename from content/docs/2025/junho/testing-library-exemplos-de-configuracao/index.md rename to content/docs/2025/junho/05-06/testing-library-exemplos-de-configuracao.md index fe87155..c0a48a5 100644 --- a/content/docs/2025/junho/testing-library-exemplos-de-configuracao/index.md +++ b/content/docs/2025/junho/05-06/testing-library-exemplos-de-configuracao.md @@ -4,6 +4,7 @@ date: 2025-06-05 slug: testing-library-exemplos-de-configuracao tags: [cypress, testing-library, e2e] draft: false +url: "/docs/2025/junho/testing-library-exemplos-de-configuracao/" --- Segue exemplo abaixo de um código que usa o `data-cy` para capturar elementos nas automação E2E com Cypress. @@ -12,7 +13,7 @@ Segue exemplo abaixo de um código que usa o `data-cy` para capturar elementos n O uso do **Testing Library** é interessante quando não temos o elemento definido no E2E, ou seja, sem o data-test/cy. Para que o Testing Library reconheça dentro da automação, precisamos que, não tenha no elemento que vai ser buscado pelo cypress o `data-cy` e então, o Testing Library o reconhece buscando pelo padrão `findByText.('Sua palavra mágica').click();` -![Cypress e Testing Library](cypress-testinglibrary.png) +![Cypress e Testing Library](../images/testing-library-exemplos-de-configuracao--cypress-testinglibrary.png) **Opção 1: Configurar no arquivo `setup-tests.js` (Cypress v10+):** diff --git a/content/docs/2025/junho/adocao-de-principios-de-design-e-arquitetura.md b/content/docs/2025/junho/10-06/adocao-de-principios-de-design-e-arquitetura.md similarity index 98% rename from content/docs/2025/junho/adocao-de-principios-de-design-e-arquitetura.md rename to content/docs/2025/junho/10-06/adocao-de-principios-de-design-e-arquitetura.md index 098dd05..2f92f33 100644 --- a/content/docs/2025/junho/adocao-de-principios-de-design-e-arquitetura.md +++ b/content/docs/2025/junho/10-06/adocao-de-principios-de-design-e-arquitetura.md @@ -4,6 +4,7 @@ date: 2025-06-10 slug: adocao-de-principios-de-design-e-arquitetura tags: [arquitetura, design, qualidade] draft: true +url: "/docs/2025/junho/adocao-de-principios-de-design-e-arquitetura/" --- Trabalho - Pós-graduação | Projeto e Arquitetura de Software diff --git a/content/docs/2025/junho/api-estudos.md b/content/docs/2025/junho/13-06/api-estudos.md similarity index 97% rename from content/docs/2025/junho/api-estudos.md rename to content/docs/2025/junho/13-06/api-estudos.md index be4fc9b..017e8b8 100644 --- a/content/docs/2025/junho/api-estudos.md +++ b/content/docs/2025/junho/13-06/api-estudos.md @@ -4,6 +4,7 @@ date: 2025-06-13 slug: api-estudos tags: [api, java, boas-praticas] draft: true +url: "/docs/2025/junho/api-estudos/" --- ### Estudos, construindo uma API básica diff --git a/content/docs/2025/junho/comandos-git/index.en.md b/content/docs/2025/junho/17-06/comandos-git.en.md similarity index 96% rename from content/docs/2025/junho/comandos-git/index.en.md rename to content/docs/2025/junho/17-06/comandos-git.en.md index 5dfb05a..8ab2462 100644 --- a/content/docs/2025/junho/comandos-git/index.en.md +++ b/content/docs/2025/junho/17-06/comandos-git.en.md @@ -4,6 +4,7 @@ date: 2025-06-17 slug: comandos-git tags: [git, terminal, boas-praticas] draft: false +url: "/en/docs/2025/junho/comandos-git/" --- This post started as a few practical Git commands for everyday use. But I had no written collection of terminal studies either: what a terminal is, how to use one, and where to read more before getting into Git commands. @@ -30,7 +31,7 @@ A terminal is a text interface for interacting directly with the operating syste Generally, navigating in a terminal means entering and leaving folders and handling files. It is like navigating a visual interface, but with commands. When we say "do this in the project/automation repository", we mean inside that folder. -![Navigating folders](navegando-em-pastas.png) +![Navigating folders](../images/comandos-git--navegando-em-pastas.png) Visually, we have a screen and somewhere to navigate. When opening a terminal on Windows, for example, you may see `C:\Users\meu.nome\Sua-pasta`. In the screenshot, this would be something like `C:\Users\kellen.xavier\Documents\Estudos\docs-estudos-obsidian`. My personal organization puts projects in Documents, inside the study folder. So when I say "enter the Obsidian study project and run git pull", that is the location I mean. @@ -65,7 +66,7 @@ cd Documents\Estudos\docs-estudos-obsidian Now I have entered the folder: -![Entering the folder through the terminal](entrando-na-pasta.png) +![Entering the folder through the terminal](../images/comandos-git--entrando-na-pasta.png) --- @@ -73,7 +74,7 @@ Now I have entered the folder: Here is a sequence of useful commands, especially when working on projects with more than one contributor. Do not forget them. -![Computer on fire](pc-fire.png) +![Computer on fire](../images/comandos-git--pc-fire.png) **To merge your current branch into the main branch, follow these steps:** diff --git a/content/docs/2025/junho/comandos-git/index.md b/content/docs/2025/junho/17-06/comandos-git.md similarity index 97% rename from content/docs/2025/junho/comandos-git/index.md rename to content/docs/2025/junho/17-06/comandos-git.md index 9ecc457..364c987 100644 --- a/content/docs/2025/junho/comandos-git/index.md +++ b/content/docs/2025/junho/17-06/comandos-git.md @@ -4,6 +4,7 @@ date: 2025-06-17 slug: comandos-git tags: [git, terminal, boas-praticas] draft: false +url: "/docs/2025/junho/comandos-git/" --- Esse post começou com a ideia de ser somente sobre alguns "comandos de Git" que são práticos no dia a dia. Porém, eu não tinha nada por escrito que reunisse um compilado de estudos sobre o assunto de terminais também: o que é um terminal, como usar um, onde ler mais sobre terminais, antes de entrar em comandos Git. @@ -30,7 +31,7 @@ Um terminal é uma interface de texto para interação direta com o sistema oper Quando de modo geral, vamos navegar em um terminal, ou seja, entrar e sair de pastas manipular arquivos, é igual como se fosse navegar em uma tela, mas aqui é por comandos. Quando aqui a gente dizer "faça tal coisa no repositório projeto/automação" estamos comentando que é dentro da pasta em questão. -![Navegando em pastas](navegando-em-pastas.png) +![Navegando em pastas](../images/comandos-git--navegando-em-pastas.png) Visualmente temos, uma tela e onde precisa navegar. Quando abri o terminal (exemplo no ambiente Windows) talvez você veja algo como `C:\Users\meu.nome\Sua-pasta` no exemplo da imagem seria algo como: `C:\Users\kellen.xavier\Documents\Estudos\docs-estudos-obsidian` aqui minha organização pessoal é por em Documentos, dentro da pasta estudo, então aqui quando me referir a "entre no projeto de estudos obsidian, faça o git pull". @@ -63,7 +64,7 @@ cd Documents\Estudos\docs-estudos-obsidian Aqui entrei na pasta: -![Entrando na pasta pelo terminal](entrando-na-pasta.png) +![Entrando na pasta pelo terminal](../images/comandos-git--entrando-na-pasta.png) --- @@ -71,7 +72,7 @@ Aqui entrei na pasta: Segue abaixo uma sequência de comandos para utilizar, quando se (e principalmente) está trabalhando em projetos com mais de uma pessoa atuando. — Não esquecer — -![PC pegando fogo](pc-fire.png) +![PC pegando fogo](../images/comandos-git--pc-fire.png) **Para fazer um merge da sua branch atual para a branch principal ("main"), você pode seguir esses passos:** diff --git a/content/docs/2025/junho/asserts-em-testes/index.md b/content/docs/2025/junho/27-06/asserts-em-testes.md similarity index 90% rename from content/docs/2025/junho/asserts-em-testes/index.md rename to content/docs/2025/junho/27-06/asserts-em-testes.md index 83e3bb1..7720031 100644 --- a/content/docs/2025/junho/asserts-em-testes/index.md +++ b/content/docs/2025/junho/27-06/asserts-em-testes.md @@ -4,6 +4,7 @@ date: 2025-06-27 slug: asserts-em-testes tags: [testes, automacao] draft: true +url: "/docs/2025/junho/asserts-em-testes/" --- ```java @@ -14,7 +15,7 @@ public void suaQuantidadeDeAcordoComTamanhoUltimasPecas(String messageKey) { } ``` -![Assert de exemplo](image.png) +![Assert de exemplo](../images/asserts-em-testes--image.png) Abaixo o assert que existe: diff --git a/content/docs/2025/junho/asserts-em-testes/image.png b/content/docs/2025/junho/images/asserts-em-testes--image.png similarity index 100% rename from content/docs/2025/junho/asserts-em-testes/image.png rename to content/docs/2025/junho/images/asserts-em-testes--image.png diff --git a/content/docs/2025/junho/comandos-git/entrando-na-pasta.png b/content/docs/2025/junho/images/comandos-git--entrando-na-pasta.png similarity index 100% rename from content/docs/2025/junho/comandos-git/entrando-na-pasta.png rename to content/docs/2025/junho/images/comandos-git--entrando-na-pasta.png diff --git a/content/docs/2025/junho/comandos-git/navegando-em-pastas.png b/content/docs/2025/junho/images/comandos-git--navegando-em-pastas.png similarity index 100% rename from content/docs/2025/junho/comandos-git/navegando-em-pastas.png rename to content/docs/2025/junho/images/comandos-git--navegando-em-pastas.png diff --git a/content/docs/2025/junho/comandos-git/pc-fire.png b/content/docs/2025/junho/images/comandos-git--pc-fire.png similarity index 100% rename from content/docs/2025/junho/comandos-git/pc-fire.png rename to content/docs/2025/junho/images/comandos-git--pc-fire.png diff --git a/content/docs/2025/junho/praticas-ruins-de-testes-para-evitar-ou/cat-cansado.png b/content/docs/2025/junho/images/praticas-ruins-de-testes-para-evitar-ou--cat-cansado.png similarity index 100% rename from content/docs/2025/junho/praticas-ruins-de-testes-para-evitar-ou/cat-cansado.png rename to content/docs/2025/junho/images/praticas-ruins-de-testes-para-evitar-ou--cat-cansado.png diff --git a/content/docs/2025/junho/testing-library-exemplos-de-configuracao/cypress-testinglibrary.png b/content/docs/2025/junho/images/testing-library-exemplos-de-configuracao--cypress-testinglibrary.png similarity index 100% rename from content/docs/2025/junho/testing-library-exemplos-de-configuracao/cypress-testinglibrary.png rename to content/docs/2025/junho/images/testing-library-exemplos-de-configuracao--cypress-testinglibrary.png diff --git a/content/docs/2025/setembro/bpmn-fluxogramas.en.md b/content/docs/2025/setembro/01-09/bpmn-fluxogramas.en.md similarity index 98% rename from content/docs/2025/setembro/bpmn-fluxogramas.en.md rename to content/docs/2025/setembro/01-09/bpmn-fluxogramas.en.md index a54bb33..0291d6d 100644 --- a/content/docs/2025/setembro/bpmn-fluxogramas.en.md +++ b/content/docs/2025/setembro/01-09/bpmn-fluxogramas.en.md @@ -4,6 +4,7 @@ date: 2025-09-01 slug: bpmn-fluxogramas tags: [bpmn, fluxogramas, processos] draft: false +url: "/en/docs/2025/setembro/bpmn-fluxogramas/" --- For anyone starting to draw flowcharts, here are the BPMN event options. diff --git a/content/docs/2025/setembro/bpmn-fluxogramas.md b/content/docs/2025/setembro/01-09/bpmn-fluxogramas.md similarity index 98% rename from content/docs/2025/setembro/bpmn-fluxogramas.md rename to content/docs/2025/setembro/01-09/bpmn-fluxogramas.md index ec60e8b..72ff31d 100644 --- a/content/docs/2025/setembro/bpmn-fluxogramas.md +++ b/content/docs/2025/setembro/01-09/bpmn-fluxogramas.md @@ -4,6 +4,7 @@ date: 2025-09-01 slug: bpmn-fluxogramas tags: [bpmn, fluxogramas, processos] draft: false +url: "/docs/2025/setembro/bpmn-fluxogramas/" --- Para quem esta começando a desenhar fluxogramas, segue as opções para os eventos do BPMN. diff --git a/content/docs/2025/setembro/configurando-o-sonar-qube-localmente/index.en.md b/content/docs/2025/setembro/20-09/configurando-o-sonar-qube-localmente.en.md similarity index 82% rename from content/docs/2025/setembro/configurando-o-sonar-qube-localmente/index.en.md rename to content/docs/2025/setembro/20-09/configurando-o-sonar-qube-localmente.en.md index dfcba54..99c37dc 100644 --- a/content/docs/2025/setembro/configurando-o-sonar-qube-localmente/index.en.md +++ b/content/docs/2025/setembro/20-09/configurando-o-sonar-qube-localmente.en.md @@ -4,6 +4,7 @@ date: 2025-09-20 weight: 1 tags: [sonarqube, qualidade-de-codigo, docker] featured: true +url: "/en/docs/2025/setembro/configurando-o-sonar-qube-localmente/" --- **This is not a tutorial.** These are study notes on understanding the tool and applying it to small and medium-sized projects in private repositories. Since I already had SonarQube installed on my machine, here is how I configured Docker. @@ -16,7 +17,7 @@ I had configured it for a code analysis study project as part of my postgraduate `docker rm sonarqube` -![Removing the existing container](image1.png) +![Removing the existing container](../images/configurando-o-sonar-qube-localmente--image1.png) Now I can run the command to start a new container: @@ -24,7 +25,7 @@ Now I can run the command to start a new container: > Yes, this is the free version, for learning before paying for something I do not yet know how to use. -![Starting a new container](image2.png) +![Starting a new container](../images/configurando-o-sonar-qube-localmente--image2.png) ### Option 2 — Replace the container automatically @@ -59,11 +60,11 @@ The first step is adjusting Docker, so make sure it is running correctly without Done! SonarQube is running locally. -![SonarQube running locally](image3.png) +![SonarQube running locally](../images/configurando-o-sonar-qube-localmente--image3.png) Adjust the password settings and continue to the page: -![SonarQube configuration page](image4.png) +![SonarQube configuration page](../images/configurando-o-sonar-qube-localmente--image4.png) ### SonarQube configuration @@ -109,7 +110,7 @@ sonar.login=SEU_TOKEN_AQUI ## Problems encountered -![Problem encountered when running the scan](problema-encontrado-ao-rodar-o-escaneamento-2025-09-20-09-24.png) +![Problem encountered when running the scan](../images/configurando-o-sonar-qube-localmente--problema-encontrado-ao-rodar-o-escaneamento-2025-09-20-09-24.png) ERROR: You're not authorized to run analysis. Please contact the project administrator. @@ -121,6 +122,6 @@ SonarScanner is trying to send the analysis results to SonarQube, but the config Now it is ready: running `sonar-scanner` scans the project and displays the results. -![Successful terminal output](terminal-sucesso-2025-09-20-09-33.png) +![Successful terminal output](../images/configurando-o-sonar-qube-localmente--terminal-sucesso-2025-09-20-09-33.png) -![Completed scan](executado-2025-09-20-09-32.png) +![Completed scan](../images/configurando-o-sonar-qube-localmente--executado-2025-09-20-09-32.png) diff --git a/content/docs/2025/setembro/configurando-o-sonar-qube-localmente/index.md b/content/docs/2025/setembro/20-09/configurando-o-sonar-qube-localmente.md similarity index 85% rename from content/docs/2025/setembro/configurando-o-sonar-qube-localmente/index.md rename to content/docs/2025/setembro/20-09/configurando-o-sonar-qube-localmente.md index 8f878ea..2e70292 100644 --- a/content/docs/2025/setembro/configurando-o-sonar-qube-localmente/index.md +++ b/content/docs/2025/setembro/20-09/configurando-o-sonar-qube-localmente.md @@ -4,6 +4,7 @@ date: 2025-09-20 weight: 1 tags: [sonarqube, qualidade-de-codigo, docker] featured: true +url: "/docs/2025/setembro/configurando-o-sonar-qube-localmente/" --- **Isso não é um tutorial,** é mais para o entendimento e estudo sobre a ferramenta e como aplicar ela em projetos pequenos, até médio porte, em repositórios fechados (código privado). Bom, como eu já tinha o SonarQube instalado na minha máquina, abaixo segue como configurar o Docker. @@ -16,7 +17,7 @@ Para um trabalho de Pós-graduação eu tinha configurado para um projeto de est `docker rm sonarqube` -![image1.png](image1.png) +![image1.png](../images/configurando-o-sonar-qube-localmente--image1.png) Agora posso executar o comando para subir um novo container: @@ -25,7 +26,7 @@ Agora posso executar o comando para subir um novo container: > Sim, a versão é gratuíta, para aprendizado antes de sair pagando algo que não sabe usar. > -![image2.png](image2.png) +![image2.png](../images/configurando-o-sonar-qube-localmente--image2.png) ### **Opção 2: Substituir o container automaticamente** @@ -60,11 +61,11 @@ Aqui a primeira parte de ajustar o docker então precisa se atentar a deixar ele Pronto! SonarQube rodando localmente. -![image3.png](image3.png) +![image3.png](../images/configurando-o-sonar-qube-localmente--image3.png) Ajuste as configurações de senha e segue para a página: -![image4.png](image4.png) +![image4.png](../images/configurando-o-sonar-qube-localmente--image4.png) ### **Configuração do SonarQube** @@ -110,7 +111,7 @@ sonar.login=SEU_TOKEN_AQUI ## **Problemas encontrados** -![problema encontrado ao rodar o escaneamento](problema-encontrado-ao-rodar-o-escaneamento-2025-09-20-09-24.png) +![problema encontrado ao rodar o escaneamento](../images/configurando-o-sonar-qube-localmente--problema-encontrado-ao-rodar-o-escaneamento-2025-09-20-09-24.png) ERROR: You're not authorized to run analysis. Please contact the project administrator. @@ -122,6 +123,6 @@ O SonarScanner está tentando enviar os resultados da análise para o SonarQube, Agora pronto: quando executar o comando `sonar-scanner` vai executar o escaneamento no projeto e seguida mostrar em tela os resultados. -![terminal com sucesso](terminal-sucesso-2025-09-20-09-33.png) +![terminal com sucesso](../images/configurando-o-sonar-qube-localmente--terminal-sucesso-2025-09-20-09-33.png) -![executado](executado-2025-09-20-09-32.png) +![executado](../images/configurando-o-sonar-qube-localmente--executado-2025-09-20-09-32.png) diff --git a/content/docs/2025/setembro/configurando-o-sonar-qube-localmente/executado-2025-09-20-09-32.png b/content/docs/2025/setembro/images/configurando-o-sonar-qube-localmente--executado-2025-09-20-09-32.png similarity index 100% rename from content/docs/2025/setembro/configurando-o-sonar-qube-localmente/executado-2025-09-20-09-32.png rename to content/docs/2025/setembro/images/configurando-o-sonar-qube-localmente--executado-2025-09-20-09-32.png diff --git a/content/docs/2025/setembro/configurando-o-sonar-qube-localmente/image1.png b/content/docs/2025/setembro/images/configurando-o-sonar-qube-localmente--image1.png similarity index 100% rename from content/docs/2025/setembro/configurando-o-sonar-qube-localmente/image1.png rename to content/docs/2025/setembro/images/configurando-o-sonar-qube-localmente--image1.png diff --git a/content/docs/2025/setembro/configurando-o-sonar-qube-localmente/image2.png b/content/docs/2025/setembro/images/configurando-o-sonar-qube-localmente--image2.png similarity index 100% rename from content/docs/2025/setembro/configurando-o-sonar-qube-localmente/image2.png rename to content/docs/2025/setembro/images/configurando-o-sonar-qube-localmente--image2.png diff --git a/content/docs/2025/setembro/configurando-o-sonar-qube-localmente/image3.png b/content/docs/2025/setembro/images/configurando-o-sonar-qube-localmente--image3.png similarity index 100% rename from content/docs/2025/setembro/configurando-o-sonar-qube-localmente/image3.png rename to content/docs/2025/setembro/images/configurando-o-sonar-qube-localmente--image3.png diff --git a/content/docs/2025/setembro/configurando-o-sonar-qube-localmente/image4.png b/content/docs/2025/setembro/images/configurando-o-sonar-qube-localmente--image4.png similarity index 100% rename from content/docs/2025/setembro/configurando-o-sonar-qube-localmente/image4.png rename to content/docs/2025/setembro/images/configurando-o-sonar-qube-localmente--image4.png diff --git a/content/docs/2025/setembro/configurando-o-sonar-qube-localmente/problema-encontrado-ao-rodar-o-escaneamento-2025-09-20-09-24.png b/content/docs/2025/setembro/images/configurando-o-sonar-qube-localmente--problema-encontrado-ao-rodar-o-escaneamento-2025-09-20-09-24.png similarity index 100% rename from content/docs/2025/setembro/configurando-o-sonar-qube-localmente/problema-encontrado-ao-rodar-o-escaneamento-2025-09-20-09-24.png rename to content/docs/2025/setembro/images/configurando-o-sonar-qube-localmente--problema-encontrado-ao-rodar-o-escaneamento-2025-09-20-09-24.png diff --git a/content/docs/2025/setembro/configurando-o-sonar-qube-localmente/terminal-sucesso-2025-09-20-09-33.png b/content/docs/2025/setembro/images/configurando-o-sonar-qube-localmente--terminal-sucesso-2025-09-20-09-33.png similarity index 100% rename from content/docs/2025/setembro/configurando-o-sonar-qube-localmente/terminal-sucesso-2025-09-20-09-33.png rename to content/docs/2025/setembro/images/configurando-o-sonar-qube-localmente--terminal-sucesso-2025-09-20-09-33.png diff --git a/content/docs/2026/abril/fluxograma-o-que-e-como-se-utilizar.md b/content/docs/2026/abril/01-04/fluxograma-o-que-e-como-se-utilizar.md similarity index 94% rename from content/docs/2026/abril/fluxograma-o-que-e-como-se-utilizar.md rename to content/docs/2026/abril/01-04/fluxograma-o-que-e-como-se-utilizar.md index 1b13d97..a82802b 100644 --- a/content/docs/2026/abril/fluxograma-o-que-e-como-se-utilizar.md +++ b/content/docs/2026/abril/01-04/fluxograma-o-que-e-como-se-utilizar.md @@ -4,6 +4,7 @@ date: 2026-04-01 slug: fluxograma-o-que-e-como-se-utilizar tags: [fluxogramas, processos] draft: true +url: "/docs/2026/abril/fluxograma-o-que-e-como-se-utilizar/" --- O que seria Fluxogramas e como aplicar? Padrões formais de modelagem de fluxos e também tipos de fluxogramas (diagramas) com nomenclaturas distintas, em Engenharia de Software e Processos. Segue uma listagem de quais existem atualmente: diff --git a/content/docs/2026/abril/protondb-com-deepwiki.md b/content/docs/2026/abril/01-04/protondb-com-deepwiki.md similarity index 79% rename from content/docs/2026/abril/protondb-com-deepwiki.md rename to content/docs/2026/abril/01-04/protondb-com-deepwiki.md index 90d3852..e65f26d 100644 --- a/content/docs/2026/abril/protondb-com-deepwiki.md +++ b/content/docs/2026/abril/01-04/protondb-com-deepwiki.md @@ -4,6 +4,7 @@ date: 2026-04-01 slug: protondb-com-deepwiki tags: [linux, gaming] draft: true +url: "/docs/2026/abril/protondb-com-deepwiki/" --- Link: diff --git a/content/docs/2026/abril/repositorio-de-documentacoes-wiki-ia.md b/content/docs/2026/abril/17-04/repositorio-de-documentacoes-wiki-ia.md similarity index 83% rename from content/docs/2026/abril/repositorio-de-documentacoes-wiki-ia.md rename to content/docs/2026/abril/17-04/repositorio-de-documentacoes-wiki-ia.md index 6e2b36d..13692ab 100644 --- a/content/docs/2026/abril/repositorio-de-documentacoes-wiki-ia.md +++ b/content/docs/2026/abril/17-04/repositorio-de-documentacoes-wiki-ia.md @@ -4,6 +4,7 @@ date: 2026-04-17 slug: repositorio-de-documentacoes-wiki-ia tags: [ia, documentacao] draft: true +url: "/docs/2026/abril/repositorio-de-documentacoes-wiki-ia/" --- --- diff --git a/content/docs/2026/abril/images/.gitkeep b/content/docs/2026/abril/images/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/content/docs/2026/agosto/analise-de-codigo-quality-gate-manutencao-e-notas.md b/content/docs/2026/agosto/26-08/analise-de-codigo-quality-gate-manutencao-e-notas.md similarity index 91% rename from content/docs/2026/agosto/analise-de-codigo-quality-gate-manutencao-e-notas.md rename to content/docs/2026/agosto/26-08/analise-de-codigo-quality-gate-manutencao-e-notas.md index d6bf756..b113926 100644 --- a/content/docs/2026/agosto/analise-de-codigo-quality-gate-manutencao-e-notas.md +++ b/content/docs/2026/agosto/26-08/analise-de-codigo-quality-gate-manutencao-e-notas.md @@ -4,6 +4,7 @@ date: 2026-08-26 slug: analise-de-codigo-quality-gate-manutencao-e-notas tags: [analise-de-codigo, qualidade] draft: true +url: "/docs/2026/agosto/analise-de-codigo-quality-gate-manutencao-e-notas/" --- Quando me solicitam para fazer uma análise de código e entender como está o repositório não é somente ler o repositório por cima — ou mandar uma IA gerar arquivos `.md` tão extensos que ela vai comer todos os tokens possíveis — mas, entender o que foi feito, porque foi feito daquela maneira, entender quais os pontos negativos, e depois, fazer pequenas refatorações e migrações (caso necessário de tecnologia) com responsabilidade, visando a manutenção ao longo prazo. Ah, obviamente, claro, se por acaso isso está ajudando a equipe, ou solução técnica. diff --git a/content/docs/2026/agosto/images/.gitkeep b/content/docs/2026/agosto/images/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/index.en.md b/content/docs/2026/janeiro/11-01/crush-agente-de-configuracao-no-terminal-tui-ui.en.md similarity index 83% rename from content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/index.en.md rename to content/docs/2026/janeiro/11-01/crush-agente-de-configuracao-no-terminal-tui-ui.en.md index abc2846..fb83898 100644 --- a/content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/index.en.md +++ b/content/docs/2026/janeiro/11-01/crush-agente-de-configuracao-no-terminal-tui-ui.en.md @@ -4,6 +4,7 @@ date: 2026-01-11 slug: crush-agente-de-configuracao-no-terminal-tui-ui tags: [crush, tui, ia, windows] draft: false +url: "/en/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/" --- Continuing my **terminal and TUI studies**, here I explore CRUSH on a Windows machine: how I configured it and how it has worked so far. I tested it with a simple open-source repository for setting up a Windows development environment. @@ -22,7 +23,7 @@ Let developers use **AI assistance directly in the terminal**, without switching ### My first test on Windows -![Configuring Crush on Windows](configurando-windows.jpg) +![Configuring Crush on Windows](../images/crush-agente-de-configuracao-no-terminal-tui-ui--configurando-windows.jpg) --- @@ -66,7 +67,7 @@ My first request was to analyze the project in general terms, looking for possib > analyze possible errors -![Analyzing errors as requested](analisando-erros.jpg) +![Analyzing errors as requested](../images/crush-agente-de-configuracao-no-terminal-tui-ui--analisando-erros.jpg) I had forgotten to create [AGENT.md](https://github.com/kellen-xavier/scripts-config-windows/blob/main/AGENTS.md). CRUSH itself recommends it on screen, so I went ahead and created it. This is the original instruction block: @@ -150,36 +151,36 @@ I tried to include everything I understood to be appropriate for creating this s **Then I asked it to execute the AGENT file:** based on the AGENT.md file execute. -![Running AGENT in a Windows setup repository with Crush](executando-agent.jpg) +![Running AGENT in a Windows setup repository with Crush](../images/crush-agente-de-configuracao-no-terminal-tui-ui--executando-agent.jpg) Based on the first command, it returned: -![Request for corrections](solicitacao-correcao.jpg) +![Request for corrections](../images/crush-agente-de-configuracao-no-terminal-tui-ui--solicitacao-correcao.jpg) Processing the AGENT file: -![Processing AGENT](processando-agent.jpg) +![Processing AGENT](../images/crush-agente-de-configuracao-no-terminal-tui-ui--processando-agent.jpg) I opened VS Code to see how it was behaving: -![Changes viewed in VS Code](modificacoes-vscode.jpg) +![Changes viewed in VS Code](../images/crush-agente-de-configuracao-no-terminal-tui-ui--modificacoes-vscode.jpg) Running lint: -![Running lint](executando-lint.jpg) +![Running lint](../images/crush-agente-de-configuracao-no-terminal-tui-ui--executando-lint.jpg) Running tests: -![Running tests](executando-testes.jpg) +![Running tests](../images/crush-agente-de-configuracao-no-terminal-tui-ui--executando-testes.jpg) -![Analyzing the repository and updating the README](analyze-repo-update-readme.jpg) +![Analyzing the repository and updating the README](../images/crush-agente-de-configuracao-no-terminal-tui-ui--analyze-repo-update-readme.jpg) I asked for a README.md update: -![README.md update](update-readme.jpg) +![README.md update](../images/crush-agente-de-configuracao-no-terminal-tui-ui--update-readme.jpg) -![README successfully updated](readme-update-ok.jpg) +![README successfully updated](../images/crush-agente-de-configuracao-no-terminal-tui-ui--readme-update-ok.jpg) Final project structure: -![Final project structure](estrutura-final-projeto.jpg) +![Final project structure](../images/crush-agente-de-configuracao-no-terminal-tui-ui--estrutura-final-projeto.jpg) diff --git a/content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/index.md b/content/docs/2026/janeiro/11-01/crush-agente-de-configuracao-no-terminal-tui-ui.md similarity index 85% rename from content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/index.md rename to content/docs/2026/janeiro/11-01/crush-agente-de-configuracao-no-terminal-tui-ui.md index 6846aa2..c8018d7 100644 --- a/content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/index.md +++ b/content/docs/2026/janeiro/11-01/crush-agente-de-configuracao-no-terminal-tui-ui.md @@ -4,6 +4,7 @@ date: 2026-01-11 slug: crush-agente-de-configuracao-no-terminal-tui-ui tags: [crush, tui, ia, windows] draft: false +url: "/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/" --- Seguindo a **saga de estudos em Terminais/TUIs**, aqui vamos para o entendimento sobre o CRUSH em uma máquina Windows: como foi que configurei e como está sendo o uso até o momento, realizando um teste com um repositório open source bem simples, voltado à configuração de ambiente de desenvolvimento no Windows. @@ -22,7 +23,7 @@ Permitir que desenvolvedores tenham **assistência de IA diretamente no terminal ### Segue abaixo o primeiro teste em ambiente Windows -![Configurando o Crush no Windows](configurando-windows.jpg) +![Configurando o Crush no Windows](../images/crush-agente-de-configuracao-no-terminal-tui-ui--configurando-windows.jpg) --- @@ -66,7 +67,7 @@ Primeira pergunta pedi para analisar o projeto: de forma mais geral, tipo possí > analyze possible errors -![Analisando erros conforme solicitado](analisando-erros.jpg) +![Analisando erros conforme solicitado](../images/crush-agente-de-configuracao-no-terminal-tui-ui--analisando-erros.jpg) Eu tinha esquecido de criar o arquivo [AGENT.md](https://github.com/kellen-xavier/scripts-config-windows/blob/main/AGENTS.md), o próprio CRUSH recomenda isso em tela, mas aí fui lá criar. @@ -150,36 +151,36 @@ Tentei por tudo o que entendi ser o correto desta vez para criar o setup, eu tiv **Agora solicitei para executar o arquivo do AGENT**: based on the AGENT.md file execute -![Executando o AGENT em um repositório de setup Windows com Crush](executando-agent.jpg) +![Executando o AGENT em um repositório de setup Windows com Crush](../images/crush-agente-de-configuracao-no-terminal-tui-ui--executando-agent.jpg) Com base no primeiro comando ele retornou: -![Solicitação para correção](solicitacao-correcao.jpg) +![Solicitação para correção](../images/crush-agente-de-configuracao-no-terminal-tui-ui--solicitacao-correcao.jpg) Processando o arquivo AGENT: -![Processando o AGENT](processando-agent.jpg) +![Processando o AGENT](../images/crush-agente-de-configuracao-no-terminal-tui-ui--processando-agent.jpg) No VS Code quis dar uma olhada em como ele estava se comportando: -![Modificações vistas no VS Code](modificacoes-vscode.jpg) +![Modificações vistas no VS Code](../images/crush-agente-de-configuracao-no-terminal-tui-ui--modificacoes-vscode.jpg) Executando Lint: -![Executando lint](executando-lint.jpg) +![Executando lint](../images/crush-agente-de-configuracao-no-terminal-tui-ui--executando-lint.jpg) Executando Testes: -![Executando testes](executando-testes.jpg) +![Executando testes](../images/crush-agente-de-configuracao-no-terminal-tui-ui--executando-testes.jpg) -![Analisando o repositório e atualizando o README](analyze-repo-update-readme.jpg) +![Analisando o repositório e atualizando o README](../images/crush-agente-de-configuracao-no-terminal-tui-ui--analyze-repo-update-readme.jpg) Solicitei para fazer um update do README.md: -![Update no README.md](update-readme.jpg) +![Update no README.md](../images/crush-agente-de-configuracao-no-terminal-tui-ui--update-readme.jpg) -![README atualizado com sucesso](readme-update-ok.jpg) +![README atualizado com sucesso](../images/crush-agente-de-configuracao-no-terminal-tui-ui--readme-update-ok.jpg) Estrutura final do projeto: -![Estrutura final do projeto](estrutura-final-projeto.jpg) +![Estrutura final do projeto](../images/crush-agente-de-configuracao-no-terminal-tui-ui--estrutura-final-projeto.jpg) diff --git a/content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-linux/index.md b/content/docs/2026/janeiro/15-01/crush-agente-de-configuracao-no-terminal-linux.md similarity index 75% rename from content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-linux/index.md rename to content/docs/2026/janeiro/15-01/crush-agente-de-configuracao-no-terminal-linux.md index c5ddd09..7024ddc 100644 --- a/content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-linux/index.md +++ b/content/docs/2026/janeiro/15-01/crush-agente-de-configuracao-no-terminal-linux.md @@ -4,6 +4,7 @@ date: 2026-01-15 slug: crush-agente-de-configuracao-no-terminal-linux tags: [crush, tui, ia, linux, omarchy] draft: true +url: "/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-linux/" --- Estava acompanhando algumas atualizações e também estou estudando mais sobre terminais de comando — resolvi entrar de cabeça no universo de terminais depois de ler sobre TUIs, do inglês **Terminal User Interfaces** ou *Text-based User Interfaces*. Então acabei descobrindo o CRUSH via update do sistema do Omarchy e no [post do DHH](https://world.hey.com/dhh/promoting-ai-agents-3ee04945) e na sequência o [Akita](https://akitaonrails.com/2026/01/09/omarchy-3-um-dos-melhores-agentes-pra-programacao-crush/) também — 😅 acompanho os dois em jornadas de estudos tech. Ainda não testei o [OpenCode](https://opencode.ai/), depois crio uma nota sobre ele aqui. Abaixo seguem notas pessoais e estudo do CRUSH. @@ -16,26 +17,26 @@ Estava acompanhando algumas atualizações e também estou estudando mais sobre No sistema que estou utilizando, o [Omarchy](https://omarchy.org/), ele vem com o CRUSH como opção para instalar nas configurações dele. -![Opção de instalar o Crush pelas configurações do Omarchy](omarchy-crush-opcao-1.png) +![Opção de instalar o Crush pelas configurações do Omarchy](../images/crush-agente-de-configuracao-no-terminal-linux--omarchy-crush-opcao-1.png) -![Confirmando a instalação do Crush](omarchy-crush-opcao-2.png) +![Confirmando a instalação do Crush](../images/crush-agente-de-configuracao-no-terminal-linux--omarchy-crush-opcao-2.png) Então eu simplesmente selecionei a opção e segui a instalação, em seguida no terminal executei o comando `crush`. -![Executando o Crush pela primeira vez](executando-crush.png) +![Executando o Crush pela primeira vez](../images/crush-agente-de-configuracao-no-terminal-linux--executando-crush.png) Configurei a chave da [API aqui neste tutorial](https://platform.openai.com/docs/quickstart?desktop-os=macOS): clicar em "criar chave de API", gerar e colar no crush após selecionar o seu LLM. -![Configurando a API key no Crush](configurando-api-key.png) +![Configurando a API key no Crush](../images/crush-agente-de-configuracao-no-terminal-linux--configurando-api-key.png) --- Para esse teste, com o crush peguei o seguinte [repositório setup-linux-mint](https://github.com/kellen-xavier/setup-linux) para fazer uma refatoração. Para isso fui até o caminho do repo localmente, executo o comando crush. Então segue a tela de inicialização. -![Crush aberto com o repositório](crush-aberto-com-repo.png) +![Crush aberto com o repositório](../images/crush-agente-de-configuracao-no-terminal-linux--crush-aberto-com-repo.png) Veja a frase abaixo: opção de analisar todo o projeto e mostrar o resultado. Porém precisa do arquivo `AGENT.md`. -![Examinando o código do projeto](examine-code-project.png) +![Examinando o código do projeto](../images/crush-agente-de-configuracao-no-terminal-linux--examine-code-project.png) ### Criando o arquivo para o projeto diff --git a/content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-linux/configurando-api-key.png b/content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-linux--configurando-api-key.png similarity index 100% rename from content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-linux/configurando-api-key.png rename to content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-linux--configurando-api-key.png diff --git a/content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-linux/crush-aberto-com-repo.png b/content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-linux--crush-aberto-com-repo.png similarity index 100% rename from content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-linux/crush-aberto-com-repo.png rename to content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-linux--crush-aberto-com-repo.png diff --git a/content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-linux/examine-code-project.png b/content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-linux--examine-code-project.png similarity index 100% rename from content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-linux/examine-code-project.png rename to content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-linux--examine-code-project.png diff --git a/content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-linux/executando-crush.png b/content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-linux--executando-crush.png similarity index 100% rename from content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-linux/executando-crush.png rename to content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-linux--executando-crush.png diff --git a/content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-linux/omarchy-crush-opcao-1.png b/content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-linux--omarchy-crush-opcao-1.png similarity index 100% rename from content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-linux/omarchy-crush-opcao-1.png rename to content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-linux--omarchy-crush-opcao-1.png diff --git a/content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-linux/omarchy-crush-opcao-2.png b/content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-linux--omarchy-crush-opcao-2.png similarity index 100% rename from content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-linux/omarchy-crush-opcao-2.png rename to content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-linux--omarchy-crush-opcao-2.png diff --git a/content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/analisando-erros.jpg b/content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-tui-ui--analisando-erros.jpg similarity index 100% rename from content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/analisando-erros.jpg rename to content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-tui-ui--analisando-erros.jpg diff --git a/content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/analyze-repo-update-readme.jpg b/content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-tui-ui--analyze-repo-update-readme.jpg similarity index 100% rename from content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/analyze-repo-update-readme.jpg rename to content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-tui-ui--analyze-repo-update-readme.jpg diff --git a/content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/configurando-windows.jpg b/content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-tui-ui--configurando-windows.jpg similarity index 100% rename from content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/configurando-windows.jpg rename to content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-tui-ui--configurando-windows.jpg diff --git a/content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/estrutura-final-projeto.jpg b/content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-tui-ui--estrutura-final-projeto.jpg similarity index 100% rename from content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/estrutura-final-projeto.jpg rename to content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-tui-ui--estrutura-final-projeto.jpg diff --git a/content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/executando-agent.jpg b/content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-tui-ui--executando-agent.jpg similarity index 100% rename from content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/executando-agent.jpg rename to content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-tui-ui--executando-agent.jpg diff --git a/content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/executando-lint.jpg b/content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-tui-ui--executando-lint.jpg similarity index 100% rename from content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/executando-lint.jpg rename to content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-tui-ui--executando-lint.jpg diff --git a/content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/executando-testes.jpg b/content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-tui-ui--executando-testes.jpg similarity index 100% rename from content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/executando-testes.jpg rename to content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-tui-ui--executando-testes.jpg diff --git a/content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/modificacoes-vscode.jpg b/content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-tui-ui--modificacoes-vscode.jpg similarity index 100% rename from content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/modificacoes-vscode.jpg rename to content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-tui-ui--modificacoes-vscode.jpg diff --git a/content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/processando-agent.jpg b/content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-tui-ui--processando-agent.jpg similarity index 100% rename from content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/processando-agent.jpg rename to content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-tui-ui--processando-agent.jpg diff --git a/content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/readme-update-ok.jpg b/content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-tui-ui--readme-update-ok.jpg similarity index 100% rename from content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/readme-update-ok.jpg rename to content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-tui-ui--readme-update-ok.jpg diff --git a/content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/solicitacao-correcao.jpg b/content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-tui-ui--solicitacao-correcao.jpg similarity index 100% rename from content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/solicitacao-correcao.jpg rename to content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-tui-ui--solicitacao-correcao.jpg diff --git a/content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/update-readme.jpg b/content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-tui-ui--update-readme.jpg similarity index 100% rename from content/docs/2026/janeiro/crush-agente-de-configuracao-no-terminal-tui-ui/update-readme.jpg rename to content/docs/2026/janeiro/images/crush-agente-de-configuracao-no-terminal-tui-ui--update-readme.jpg diff --git a/content/docs/2026/julho/bot-planner-projeto-para-acompanhamento-do-desenvolvimento/index.en.md b/content/docs/2026/julho/06-07/bot-planner-projeto-para-acompanhamento-do-desenvolvimento-pessoal.en.md similarity index 93% rename from content/docs/2026/julho/bot-planner-projeto-para-acompanhamento-do-desenvolvimento/index.en.md rename to content/docs/2026/julho/06-07/bot-planner-projeto-para-acompanhamento-do-desenvolvimento-pessoal.en.md index fbbef1e..f14453b 100644 --- a/content/docs/2026/julho/bot-planner-projeto-para-acompanhamento-do-desenvolvimento/index.en.md +++ b/content/docs/2026/julho/06-07/bot-planner-projeto-para-acompanhamento-do-desenvolvimento-pessoal.en.md @@ -2,6 +2,7 @@ title: "Bot Planner — Tracking personal development work" date: 2026-07-06 slug: bot-planner-projeto-para-acompanhamento-do-desenvolvimento-pessoal +url: "/en/docs/2026/julho/bot-planner-projeto-para-acompanhamento-do-desenvolvimento-pessoal/" --- Recently I have been developing some AI study projects, and I needed a way to organize how long I spent working on them: elapsed time. @@ -20,13 +21,13 @@ I created the repository at Consideravelmente bem mais rápido. -![Resultado mais rápido](resultado-mais-rapido.png) +![Resultado mais rápido](../images/correcao-ladingpage-simples-aprendizados--resultado-mais-rapido.png) --- O Claude Code preenche de forma melhor que muito dev aprendiz. -![Claude Code preenchendo a documentação](claude-code-preenchendo.png) +![Claude Code preenchendo a documentação](../images/correcao-ladingpage-simples-aprendizados--claude-code-preenchendo.png) diff --git a/content/docs/2026/julho/09-07/estudando-xp-na-pratica.md b/content/docs/2026/julho/09-07/estudando-xp-na-pratica.md new file mode 100644 index 0000000..a2a28ec --- /dev/null +++ b/content/docs/2026/julho/09-07/estudando-xp-na-pratica.md @@ -0,0 +1,16 @@ +--- +title: "Estudando XP na Prática" +date: 2026-07-09 +slug: estudando-xp-na-pratica +tags: [xp, metodologias-ageis] +draft: true +url: "/docs/2026/julho/estudando-xp-na-pratica/" +--- + +### Tentando praticar o XP + +![Estudando XP na prática 1](../images/estudando-xp-na-pratica--xp-1.png) + +![Estudando XP na prática 2](../images/estudando-xp-na-pratica--xp-2.png) + +![Estudando XP na prática 3](../images/estudando-xp-na-pratica--xp-3.png) diff --git a/content/docs/2026/julho/refactor-blog/index.en.md b/content/docs/2026/julho/10-07/refactor-blog.en.md similarity index 97% rename from content/docs/2026/julho/refactor-blog/index.en.md rename to content/docs/2026/julho/10-07/refactor-blog.en.md index d4202e9..a6a2ee4 100644 --- a/content/docs/2026/julho/refactor-blog/index.en.md +++ b/content/docs/2026/julho/10-07/refactor-blog.en.md @@ -5,13 +5,14 @@ slug: refactor-blog tags: [nextjs, notion, refactor] draft: false featured: true +url: "/en/docs/2026/julho/refactor-blog/" --- ## Analysis of the notion-blog repository My personal blog was full of bugs because I had not done the necessary maintenance since creating it, perhaps two years ago. Now the idea is to fix bugs and add features I would like. -![Old blog using Next.js and Notion](repo-atual-notion-blog.png) +![Old blog using Next.js and Notion](../images/refactor-blog--repo-atual-notion-blog.png) Broken pagination, slow loading, and content centralized in one tool. @@ -121,7 +122,7 @@ scripts/create-table.js # Cria a tabela-modelo no Notion via API privada ## Blog fixes -![Fixes applied to the blog](correcoes-blog.png) +![Fixes applied to the blog](../images/refactor-blog--correcoes-blog.png) First I requested an analysis through claude.ai, then wrote the following instructions: diff --git a/content/docs/2026/julho/refactor-blog/index.md b/content/docs/2026/julho/10-07/refactor-blog.md similarity index 98% rename from content/docs/2026/julho/refactor-blog/index.md rename to content/docs/2026/julho/10-07/refactor-blog.md index c41688c..f5e2006 100644 --- a/content/docs/2026/julho/refactor-blog/index.md +++ b/content/docs/2026/julho/10-07/refactor-blog.md @@ -5,13 +5,14 @@ slug: refactor-blog tags: [nextjs, notion, refactor] draft: false featured: true +url: "/docs/2026/julho/refactor-blog/" --- ## Análise do repositório `notion-blog` Meu blog pessoal estava cheio de bugs pois eu só não fiz a devida manutenção que precisava ao longo do período desde que criei — talvez 2 anos. Agora a ideia é corrigir bugs e funcionalidades que eu gostaria de adicionar. -![Blog antigo em Next.js + Notion](repo-atual-notion-blog.png) +![Blog antigo em Next.js + Notion](../images/refactor-blog--repo-atual-notion-blog.png) Paginação com erros, demora no carregamento, conteúdo centralizado em ferramenta. @@ -121,7 +122,7 @@ scripts/create-table.js # Cria a tabela-modelo no Notion via API privada ## Correções no Blog -![Correções aplicadas no blog](correcoes-blog.png) +![Correções aplicadas no blog](../images/refactor-blog--correcoes-blog.png) Primeiro foi solicitado para realizar uma análise utilizando o claude.ai, seguindo foi escrito o seguinte script. diff --git a/content/docs/2026/julho/tuis-gerador-de-dets-repositorio-de-scripts.md b/content/docs/2026/julho/13-07/tuis-gerador-de-dets-repositorio-de-scripts.md similarity index 94% rename from content/docs/2026/julho/tuis-gerador-de-dets-repositorio-de-scripts.md rename to content/docs/2026/julho/13-07/tuis-gerador-de-dets-repositorio-de-scripts.md index 7620128..1bc7937 100644 --- a/content/docs/2026/julho/tuis-gerador-de-dets-repositorio-de-scripts.md +++ b/content/docs/2026/julho/13-07/tuis-gerador-de-dets-repositorio-de-scripts.md @@ -4,6 +4,7 @@ date: 2026-07-13 slug: tuis-gerador-de-dets-repositorio-de-scripts tags: [tui, automacao, qualidade] draft: true +url: "/docs/2026/julho/tuis-gerador-de-dets-repositorio-de-scripts/" --- Criei o repositório [ladydebug-generator-dets](https://github.com/kellen-xavier/ladydebug-generator-dets) para gerar DETs (Documentos de Evidência de Testes) de forma fácil e rápida, sem depender de uma etapa manual. A ferramenta é uma TUI que automatiza a criação das pastas de Release e ID CARD, organiza as subpastas de cada caso de teste e gera o documento final em `.docx`, com opção de exportar em PDF (individual ou compilado), a partir de uma planilha de testes. diff --git a/content/docs/2026/julho/library-gaming-minha-biblioteca-pessoal-de-games/index.md b/content/docs/2026/julho/18-07/library-gaming-minha-biblioteca-pessoal-de-games.md similarity index 82% rename from content/docs/2026/julho/library-gaming-minha-biblioteca-pessoal-de-games/index.md rename to content/docs/2026/julho/18-07/library-gaming-minha-biblioteca-pessoal-de-games.md index 4c4b5a2..73fc8d6 100644 --- a/content/docs/2026/julho/library-gaming-minha-biblioteca-pessoal-de-games/index.md +++ b/content/docs/2026/julho/18-07/library-gaming-minha-biblioteca-pessoal-de-games.md @@ -4,13 +4,14 @@ date: 2026-07-18 slug: library-gaming-minha-biblioteca-pessoal-de-games tags: [gaming, automacao, organizacao] draft: true +url: "/docs/2026/julho/library-gaming-minha-biblioteca-pessoal-de-games/" --- ## Baixe todos os games e organize Estava precisando configurar minhas pastas com os jogos que eu havia baixado — não só recentemente, mas eu já tinha ISO e BIOS — configurada e perdida em pastas diversas pelo computador pessoal e nos drives de nuvem da vida. Resolvi então pegar tudo e organizar de forma centralizada. Criei o script que faz isso de forma prática, ele cria as pastas conforme os jogos de PS1, MEGA, Nintendo etc. Me baseei na organização do repositório aqui: -![Pastas organizadas por console](pastas-organizadas.png) +![Pastas organizadas por console](../images/library-gaming-minha-biblioteca-pessoal-de-games--pastas-organizadas.png) --- diff --git a/content/docs/2026/julho/configurando-de-verdade-omarchy-linux.md b/content/docs/2026/julho/24-07/configurando-de-verdade-omarchy-linux.md similarity index 83% rename from content/docs/2026/julho/configurando-de-verdade-omarchy-linux.md rename to content/docs/2026/julho/24-07/configurando-de-verdade-omarchy-linux.md index dfa54ce..1c06678 100644 --- a/content/docs/2026/julho/configurando-de-verdade-omarchy-linux.md +++ b/content/docs/2026/julho/24-07/configurando-de-verdade-omarchy-linux.md @@ -4,6 +4,7 @@ date: 2026-07-24 slug: configurando-de-verdade-omarchy-linux tags: [linux, omarchy] draft: true +url: "/docs/2026/julho/configurando-de-verdade-omarchy-linux/" --- Este post serve para poder configurar o Omarchy. Atualmente eu tenho um setup configurado aqui no github: diff --git a/content/docs/2026/julho/estudando-xp-na-pratica/index.md b/content/docs/2026/julho/estudando-xp-na-pratica/index.md deleted file mode 100644 index c7e2d42..0000000 --- a/content/docs/2026/julho/estudando-xp-na-pratica/index.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: "Estudando XP na Prática" -date: 2026-07-09 -slug: estudando-xp-na-pratica -tags: [xp, metodologias-ageis] -draft: true ---- - -### Tentando praticar o XP - -![Estudando XP na prática 1](xp-1.png) - -![Estudando XP na prática 2](xp-2.png) - -![Estudando XP na prática 3](xp-3.png) diff --git a/content/docs/2026/julho/bot-planner-projeto-para-acompanhamento-do-desenvolvimento/image-1.png b/content/docs/2026/julho/images/bot-planner-projeto-para-acompanhamento-do-desenvolvimento-pessoal--image-1.png similarity index 100% rename from content/docs/2026/julho/bot-planner-projeto-para-acompanhamento-do-desenvolvimento/image-1.png rename to content/docs/2026/julho/images/bot-planner-projeto-para-acompanhamento-do-desenvolvimento-pessoal--image-1.png diff --git a/content/docs/2026/julho/bot-planner-projeto-para-acompanhamento-do-desenvolvimento/image-2.png b/content/docs/2026/julho/images/bot-planner-projeto-para-acompanhamento-do-desenvolvimento-pessoal--image-2.png similarity index 100% rename from content/docs/2026/julho/bot-planner-projeto-para-acompanhamento-do-desenvolvimento/image-2.png rename to content/docs/2026/julho/images/bot-planner-projeto-para-acompanhamento-do-desenvolvimento-pessoal--image-2.png diff --git a/content/docs/2026/julho/bot-planner-projeto-para-acompanhamento-do-desenvolvimento/image-3.png b/content/docs/2026/julho/images/bot-planner-projeto-para-acompanhamento-do-desenvolvimento-pessoal--image-3.png similarity index 100% rename from content/docs/2026/julho/bot-planner-projeto-para-acompanhamento-do-desenvolvimento/image-3.png rename to content/docs/2026/julho/images/bot-planner-projeto-para-acompanhamento-do-desenvolvimento-pessoal--image-3.png diff --git a/content/docs/2026/julho/bot-planner-projeto-para-acompanhamento-do-desenvolvimento/image-4.png b/content/docs/2026/julho/images/bot-planner-projeto-para-acompanhamento-do-desenvolvimento-pessoal--image-4.png similarity index 100% rename from content/docs/2026/julho/bot-planner-projeto-para-acompanhamento-do-desenvolvimento/image-4.png rename to content/docs/2026/julho/images/bot-planner-projeto-para-acompanhamento-do-desenvolvimento-pessoal--image-4.png diff --git a/content/docs/2026/julho/bot-planner-projeto-para-acompanhamento-do-desenvolvimento/image-5.png b/content/docs/2026/julho/images/bot-planner-projeto-para-acompanhamento-do-desenvolvimento-pessoal--image-5.png similarity index 100% rename from content/docs/2026/julho/bot-planner-projeto-para-acompanhamento-do-desenvolvimento/image-5.png rename to content/docs/2026/julho/images/bot-planner-projeto-para-acompanhamento-do-desenvolvimento-pessoal--image-5.png diff --git a/content/docs/2026/julho/bot-planner-projeto-para-acompanhamento-do-desenvolvimento/image.png b/content/docs/2026/julho/images/bot-planner-projeto-para-acompanhamento-do-desenvolvimento-pessoal--image.png similarity index 100% rename from content/docs/2026/julho/bot-planner-projeto-para-acompanhamento-do-desenvolvimento/image.png rename to content/docs/2026/julho/images/bot-planner-projeto-para-acompanhamento-do-desenvolvimento-pessoal--image.png diff --git a/content/docs/2026/julho/correcao-ladingpage-simples-aprendizados/claude-code-preenchendo.png b/content/docs/2026/julho/images/correcao-ladingpage-simples-aprendizados--claude-code-preenchendo.png similarity index 100% rename from content/docs/2026/julho/correcao-ladingpage-simples-aprendizados/claude-code-preenchendo.png rename to content/docs/2026/julho/images/correcao-ladingpage-simples-aprendizados--claude-code-preenchendo.png diff --git a/content/docs/2026/julho/correcao-ladingpage-simples-aprendizados/correcao-1.png b/content/docs/2026/julho/images/correcao-ladingpage-simples-aprendizados--correcao-1.png similarity index 100% rename from content/docs/2026/julho/correcao-ladingpage-simples-aprendizados/correcao-1.png rename to content/docs/2026/julho/images/correcao-ladingpage-simples-aprendizados--correcao-1.png diff --git a/content/docs/2026/julho/correcao-ladingpage-simples-aprendizados/correcao-2.png b/content/docs/2026/julho/images/correcao-ladingpage-simples-aprendizados--correcao-2.png similarity index 100% rename from content/docs/2026/julho/correcao-ladingpage-simples-aprendizados/correcao-2.png rename to content/docs/2026/julho/images/correcao-ladingpage-simples-aprendizados--correcao-2.png diff --git a/content/docs/2026/julho/correcao-ladingpage-simples-aprendizados/correcao-3.png b/content/docs/2026/julho/images/correcao-ladingpage-simples-aprendizados--correcao-3.png similarity index 100% rename from content/docs/2026/julho/correcao-ladingpage-simples-aprendizados/correcao-3.png rename to content/docs/2026/julho/images/correcao-ladingpage-simples-aprendizados--correcao-3.png diff --git a/content/docs/2026/julho/correcao-ladingpage-simples-aprendizados/correcao-4.png b/content/docs/2026/julho/images/correcao-ladingpage-simples-aprendizados--correcao-4.png similarity index 100% rename from content/docs/2026/julho/correcao-ladingpage-simples-aprendizados/correcao-4.png rename to content/docs/2026/julho/images/correcao-ladingpage-simples-aprendizados--correcao-4.png diff --git a/content/docs/2026/julho/correcao-ladingpage-simples-aprendizados/repo-original.png b/content/docs/2026/julho/images/correcao-ladingpage-simples-aprendizados--repo-original.png similarity index 100% rename from content/docs/2026/julho/correcao-ladingpage-simples-aprendizados/repo-original.png rename to content/docs/2026/julho/images/correcao-ladingpage-simples-aprendizados--repo-original.png diff --git a/content/docs/2026/julho/correcao-ladingpage-simples-aprendizados/resultado-mais-rapido.png b/content/docs/2026/julho/images/correcao-ladingpage-simples-aprendizados--resultado-mais-rapido.png similarity index 100% rename from content/docs/2026/julho/correcao-ladingpage-simples-aprendizados/resultado-mais-rapido.png rename to content/docs/2026/julho/images/correcao-ladingpage-simples-aprendizados--resultado-mais-rapido.png diff --git a/content/docs/2026/julho/correcao-ladingpage-simples-aprendizados/script-inline.png b/content/docs/2026/julho/images/correcao-ladingpage-simples-aprendizados--script-inline.png similarity index 100% rename from content/docs/2026/julho/correcao-ladingpage-simples-aprendizados/script-inline.png rename to content/docs/2026/julho/images/correcao-ladingpage-simples-aprendizados--script-inline.png diff --git a/content/docs/2026/julho/estudando-xp-na-pratica/xp-1.png b/content/docs/2026/julho/images/estudando-xp-na-pratica--xp-1.png similarity index 100% rename from content/docs/2026/julho/estudando-xp-na-pratica/xp-1.png rename to content/docs/2026/julho/images/estudando-xp-na-pratica--xp-1.png diff --git a/content/docs/2026/julho/estudando-xp-na-pratica/xp-2.png b/content/docs/2026/julho/images/estudando-xp-na-pratica--xp-2.png similarity index 100% rename from content/docs/2026/julho/estudando-xp-na-pratica/xp-2.png rename to content/docs/2026/julho/images/estudando-xp-na-pratica--xp-2.png diff --git a/content/docs/2026/julho/estudando-xp-na-pratica/xp-3.png b/content/docs/2026/julho/images/estudando-xp-na-pratica--xp-3.png similarity index 100% rename from content/docs/2026/julho/estudando-xp-na-pratica/xp-3.png rename to content/docs/2026/julho/images/estudando-xp-na-pratica--xp-3.png diff --git a/content/docs/2026/julho/library-gaming-minha-biblioteca-pessoal-de-games/pastas-organizadas.png b/content/docs/2026/julho/images/library-gaming-minha-biblioteca-pessoal-de-games--pastas-organizadas.png similarity index 100% rename from content/docs/2026/julho/library-gaming-minha-biblioteca-pessoal-de-games/pastas-organizadas.png rename to content/docs/2026/julho/images/library-gaming-minha-biblioteca-pessoal-de-games--pastas-organizadas.png diff --git a/content/docs/2026/julho/refactor-blog/correcoes-blog.png b/content/docs/2026/julho/images/refactor-blog--correcoes-blog.png similarity index 100% rename from content/docs/2026/julho/refactor-blog/correcoes-blog.png rename to content/docs/2026/julho/images/refactor-blog--correcoes-blog.png diff --git a/content/docs/2026/julho/refactor-blog/repo-atual-notion-blog.png b/content/docs/2026/julho/images/refactor-blog--repo-atual-notion-blog.png similarity index 100% rename from content/docs/2026/julho/refactor-blog/repo-atual-notion-blog.png rename to content/docs/2026/julho/images/refactor-blog--repo-atual-notion-blog.png diff --git a/content/docs/2026/setembro/Editor de PDFs Stirling.md b/content/docs/2026/marco/16-03/editor-de-pdfs-stirling.md similarity index 67% rename from content/docs/2026/setembro/Editor de PDFs Stirling.md rename to content/docs/2026/marco/16-03/editor-de-pdfs-stirling.md index 0041ffb..9dab5c9 100644 --- a/content/docs/2026/setembro/Editor de PDFs Stirling.md +++ b/content/docs/2026/marco/16-03/editor-de-pdfs-stirling.md @@ -4,11 +4,12 @@ date: 2026-03-16 slug: servidor-nas-truenas-pessoal tags: [nas, truenas, self-hosted, redes] draft: true +url: "/docs/2026/setembro/servidor-nas-truenas-pessoal/" --- Como funciona essa esse programa? -![01-layout-editor-de-pdfs](/home/kellen/Projects/ladydebug.github.io/content/docs/2026/setembro/01-layout-editor-de-pdfs.png) +![01-layout-editor-de-pdfs](../images/editor-de-pdfs-stirling--01-layout-editor-de-pdfs.png) Configuração como configurar? diff --git a/content/docs/2026/marco/servidor-nas-truenas-pessoal.md b/content/docs/2026/marco/16-03/servidor-nas-truenas-pessoal.md similarity index 93% rename from content/docs/2026/marco/servidor-nas-truenas-pessoal.md rename to content/docs/2026/marco/16-03/servidor-nas-truenas-pessoal.md index 7a2d3d8..856a498 100644 --- a/content/docs/2026/marco/servidor-nas-truenas-pessoal.md +++ b/content/docs/2026/marco/16-03/servidor-nas-truenas-pessoal.md @@ -4,6 +4,7 @@ date: 2026-03-16 slug: servidor-nas-truenas-pessoal tags: [nas, truenas, self-hosted, redes] draft: true +url: "/docs/2026/marco/servidor-nas-truenas-pessoal/" --- Guia pessoal de configuração para o TrueNAS - servidor pessoal para arquivos e mídia, com Plex. diff --git a/content/docs/2026/setembro/01-layout-editor-de-pdfs.png b/content/docs/2026/marco/images/editor-de-pdfs-stirling--01-layout-editor-de-pdfs.png similarity index 100% rename from content/docs/2026/setembro/01-layout-editor-de-pdfs.png rename to content/docs/2026/marco/images/editor-de-pdfs-stirling--01-layout-editor-de-pdfs.png diff --git a/content/docs/2026/novembro/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot.md b/content/docs/2026/novembro/03-11/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot.md similarity index 88% rename from content/docs/2026/novembro/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot.md rename to content/docs/2026/novembro/03-11/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot.md index 9bb347c..e129b5e 100644 --- a/content/docs/2026/novembro/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot.md +++ b/content/docs/2026/novembro/03-11/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot.md @@ -4,6 +4,7 @@ date: 2026-11-03 slug: testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot tags: [jogo] draft: true +url: "/docs/2026/novembro/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot/" --- ## Um pouco sobre Jogos, arquitetura e Testes @@ -18,7 +19,7 @@ Fui pesquisar um pouco sobre então, como é a arquitetura de um Jogo Uma arquitetura de jogo não é simplesmente uma organização de arquivos. Ela define como as responsabilidades são distribuídas, como os componentes se comunicam e como o estado do jogo evolui a cada atualização. -![image](images/arquitetura-conceitual.svg) +![image](../images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--arquitetura-conceitual.svg) Essas camadas podem ser compreendidas da seguinte forma: @@ -151,7 +152,7 @@ O framework de automação C++ **não exige que todos os plugins de teste esteja Para evoluir o laboratório, proponho uma separação entre regras de domínio, integração com a Unreal e apresentação. -![image](images/arquitetura-proposta-game-enginee.svg) +![image](../images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--arquitetura-proposta-game-enginee.svg) Essa separação permite utilizar testes de diferentes níveis sem duplicar responsabilidades. @@ -205,7 +206,7 @@ vulkaninfo --summary ### Retornos dos comandos -![image](images/image.png) +![image](../images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image.png) Como minha placa de vídeo é da NVIDIA precisei conferir os drives dela (NVIDIA geralmente é a que menos tem compatibilidade com o Linux) @@ -213,7 +214,7 @@ Como minha placa de vídeo é da NVIDIA precisei conferir os drives dela (NVIDIA nvidia-smi ``` -![image](images/image%201.png) +![image](../images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-1.png) - placa de vídeo com compatibilidade = ok @@ -264,11 +265,11 @@ Install Esta dentro do recomendado. -![image](images/image%202.png) +![image](../images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-2.png) Omarchy setup -![image](images/image%203.png) +![image](../images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-3.png) ## Pesquisa de Jogo para Testes @@ -299,31 +300,31 @@ Em particular este jogo bastante pontos que é possível validar, seguindo o tut Unreal Engine Open -![image](images/image%204.png) +![image](../images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-4.png) Game adicionado a biblioteca -![image](images/image%205.png) +![image](../images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-5.png) -![image](images/image%206.png) +![image](../images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-6.png) Login conta Epic -![image](images/image%207.png) +![image](../images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-7.png) Selecionar o game para abrir o projeto -![image](images/image%208.png) +![image](../images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-8.png) Selecionando pasta do projeto para criar -![image](images/image%209.png) +![image](../images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-9.png) Download -![image](images/image%2010.png) +![image](../images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-10.png) -![image](images/image%2011.png) +![image](../images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-11.png) --- @@ -353,13 +354,13 @@ Se você prefere um sample de jogo para baixar, a alternativa é **Stack O’ Bo Escolhi este jogo mas também precisei organizar o projeto na pasta para que fique dentro Unreal Projects -![alt text](images/image%2012.png) +![alt text](../images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-12.png) -![alt text](images/image%2013.png) +![alt text](../images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-13.png) Clica no jogo para abrir e segue, pode adicionar o plugin de testes -![alt text](images/image%2014.png) +![alt text](../images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-14.png) --- diff --git a/content/docs/2026/novembro/criando-um-site-portfolio-e-como-estou-organizando-os-trabalhos-realizados.en.md b/content/docs/2026/novembro/06-11/criando-um-site-portfolio-e-como-estou-organizando-os-trabalhos-realizados.en.md similarity index 98% rename from content/docs/2026/novembro/criando-um-site-portfolio-e-como-estou-organizando-os-trabalhos-realizados.en.md rename to content/docs/2026/novembro/06-11/criando-um-site-portfolio-e-como-estou-organizando-os-trabalhos-realizados.en.md index 9546879..e00312c 100644 --- a/content/docs/2026/novembro/criando-um-site-portfolio-e-como-estou-organizando-os-trabalhos-realizados.en.md +++ b/content/docs/2026/novembro/06-11/criando-um-site-portfolio-e-como-estou-organizando-os-trabalhos-realizados.en.md @@ -4,6 +4,7 @@ date: 2026-11-06 slug: criando-um-site-portfolio-e-como-estou-organizando-os-trabalhos-realizados tags: [portfolio, engenharia-de-software, testes, documentacao] draft: false +url: "/en/docs/2026/novembro/criando-um-site-portfolio-e-como-estou-organizando-os-trabalhos-realizados/" --- ## Building a portfolio website and organizing the work I have done diff --git a/content/docs/2026/novembro/criando-um-site-portfolio-e-como-estou-organizando-os-trabalhos-realizados.md b/content/docs/2026/novembro/06-11/criando-um-site-portfolio-e-como-estou-organizando-os-trabalhos-realizados.md similarity index 98% rename from content/docs/2026/novembro/criando-um-site-portfolio-e-como-estou-organizando-os-trabalhos-realizados.md rename to content/docs/2026/novembro/06-11/criando-um-site-portfolio-e-como-estou-organizando-os-trabalhos-realizados.md index 2ea285a..fb688f5 100644 --- a/content/docs/2026/novembro/criando-um-site-portfolio-e-como-estou-organizando-os-trabalhos-realizados.md +++ b/content/docs/2026/novembro/06-11/criando-um-site-portfolio-e-como-estou-organizando-os-trabalhos-realizados.md @@ -4,6 +4,7 @@ date: 2026-11-06 slug: criando-um-site-portfolio-e-como-estou-organizando-os-trabalhos-realizados tags: [portfolio, engenharia-de-software, testes, documentacao] draft: false +url: "/docs/2026/novembro/criando-um-site-portfolio-e-como-estou-organizando-os-trabalhos-realizados/" --- ## Criando um site portfolio - E como estou organizando os trabalhos realizados diff --git a/content/docs/2026/novembro/refatorando-o-blog-parte-2.md b/content/docs/2026/novembro/06-11/refatorando-o-blog-parte-2.md similarity index 72% rename from content/docs/2026/novembro/refatorando-o-blog-parte-2.md rename to content/docs/2026/novembro/06-11/refatorando-o-blog-parte-2.md index 0794388..8e86dd0 100644 --- a/content/docs/2026/novembro/refatorando-o-blog-parte-2.md +++ b/content/docs/2026/novembro/06-11/refatorando-o-blog-parte-2.md @@ -4,6 +4,7 @@ date: 2026-11-06 slug: refatorando-o-blog-parte-2 tags: [] draft: true +url: "/docs/2026/novembro/refatorando-o-blog-parte-2/" --- ## Refatorando o Blog parte 2 diff --git a/content/docs/2026/novembro/images/arquitetura-conceitual.svg b/content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--arquitetura-conceitual.svg similarity index 100% rename from content/docs/2026/novembro/images/arquitetura-conceitual.svg rename to content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--arquitetura-conceitual.svg diff --git a/content/docs/2026/novembro/images/arquitetura-proposta-game-enginee.svg b/content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--arquitetura-proposta-game-enginee.svg similarity index 100% rename from content/docs/2026/novembro/images/arquitetura-proposta-game-enginee.svg rename to content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--arquitetura-proposta-game-enginee.svg diff --git a/content/docs/2026/novembro/images/image 1.png b/content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-1.png similarity index 100% rename from content/docs/2026/novembro/images/image 1.png rename to content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-1.png diff --git a/content/docs/2026/novembro/images/image 10.png b/content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-10.png similarity index 100% rename from content/docs/2026/novembro/images/image 10.png rename to content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-10.png diff --git a/content/docs/2026/novembro/images/image 11.png b/content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-11.png similarity index 100% rename from content/docs/2026/novembro/images/image 11.png rename to content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-11.png diff --git a/content/docs/2026/novembro/images/image 12.png b/content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-12.png similarity index 100% rename from content/docs/2026/novembro/images/image 12.png rename to content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-12.png diff --git a/content/docs/2026/novembro/images/image 13.png b/content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-13.png similarity index 100% rename from content/docs/2026/novembro/images/image 13.png rename to content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-13.png diff --git a/content/docs/2026/novembro/images/image 14.png b/content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-14.png similarity index 100% rename from content/docs/2026/novembro/images/image 14.png rename to content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-14.png diff --git a/content/docs/2026/novembro/images/image 2.png b/content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-2.png similarity index 100% rename from content/docs/2026/novembro/images/image 2.png rename to content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-2.png diff --git a/content/docs/2026/novembro/images/image 3.png b/content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-3.png similarity index 100% rename from content/docs/2026/novembro/images/image 3.png rename to content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-3.png diff --git a/content/docs/2026/novembro/images/image 4.png b/content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-4.png similarity index 100% rename from content/docs/2026/novembro/images/image 4.png rename to content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-4.png diff --git a/content/docs/2026/novembro/images/image 5.png b/content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-5.png similarity index 100% rename from content/docs/2026/novembro/images/image 5.png rename to content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-5.png diff --git a/content/docs/2026/novembro/images/image 6.png b/content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-6.png similarity index 100% rename from content/docs/2026/novembro/images/image 6.png rename to content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-6.png diff --git a/content/docs/2026/novembro/images/image 7.png b/content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-7.png similarity index 100% rename from content/docs/2026/novembro/images/image 7.png rename to content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-7.png diff --git a/content/docs/2026/novembro/images/image 8.png b/content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-8.png similarity index 100% rename from content/docs/2026/novembro/images/image 8.png rename to content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-8.png diff --git a/content/docs/2026/novembro/images/image 9.png b/content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-9.png similarity index 100% rename from content/docs/2026/novembro/images/image 9.png rename to content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image-9.png diff --git a/content/docs/2026/novembro/images/image.png b/content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image.png similarity index 100% rename from content/docs/2026/novembro/images/image.png rename to content/docs/2026/novembro/images/testando-um-jogo-existente-na-unreal-objetivos-e-portal-no-stack-o-bot--image.png diff --git a/content/docs/2026/outubro/bem-vindo-outubro-primeira-programacao-em-hardware-limpo-programando-um-lembregotchi.md b/content/docs/2026/outubro/01-10/bem-vindo-outubro-primeira-programacao-em-hardware-limpo-programando-um-lembregotchi.md similarity index 91% rename from content/docs/2026/outubro/bem-vindo-outubro-primeira-programacao-em-hardware-limpo-programando-um-lembregotchi.md rename to content/docs/2026/outubro/01-10/bem-vindo-outubro-primeira-programacao-em-hardware-limpo-programando-um-lembregotchi.md index 411c3a4..14ee9aa 100644 --- a/content/docs/2026/outubro/bem-vindo-outubro-primeira-programacao-em-hardware-limpo-programando-um-lembregotchi.md +++ b/content/docs/2026/outubro/01-10/bem-vindo-outubro-primeira-programacao-em-hardware-limpo-programando-um-lembregotchi.md @@ -4,6 +4,7 @@ date: 2026-10-01 slug: bem-vindo-outubro-primeira-programacao-em-hardware-limpo-programando-um-lembregotchi tags: [lembregotchi, programming] draft: true +url: "/docs/2026/outubro/bem-vindo-outubro-primeira-programacao-em-hardware-limpo-programando-um-lembregotchi/" --- ## Bem-vindo Outrubro - Programando um projeto de agenda - o "Lembregotchi" diff --git a/content/docs/2026/outubro/antes-de-automatizar-um-teste.md b/content/docs/2026/outubro/29-10/antes-de-automatizar-um-teste.md similarity index 96% rename from content/docs/2026/outubro/antes-de-automatizar-um-teste.md rename to content/docs/2026/outubro/29-10/antes-de-automatizar-um-teste.md index 0346e02..04c1aea 100644 --- a/content/docs/2026/outubro/antes-de-automatizar-um-teste.md +++ b/content/docs/2026/outubro/29-10/antes-de-automatizar-um-teste.md @@ -5,6 +5,7 @@ description: "Como transformar uma regra de negócio em cenários de teste, vali slug: antes-de-automatizar-um-teste tags: [testes, qualidade, automacao, javascript] draft: true +url: "/docs/2026/outubro/antes-de-automatizar-um-teste/" --- Quando falamos de automação de testes, é fácil começar pela ferramenta. Qual framework usar? Como configurar a execução no pipeline? Como organizar as pastas? @@ -27,7 +28,7 @@ Para este exemplo, vamos definir o contrato: O uso de centavos mantém os valores deste exemplo como inteiros. Validação de entrada e cálculo dos descontos ficam fora desta função; precisam de contratos e testes próprios no sistema que a utilizar. -Essa conversa sobre a regra já faz parte do trabalho de qualidade. É o mesmo ponto que aparece nas [notas sobre shift-left testing]({{< relref "/docs/2025/junho/processo-shift-left-testing-basico.md" >}}): discutir critérios de aceitação antes da implementação ajuda a explicitar o que será validado. +Essa conversa sobre a regra já faz parte do trabalho de qualidade. É o mesmo ponto que aparece nas [notas sobre shift-left testing]({{< relref "/docs/2025/junho/05-06/processo-shift-left-testing-basico.md" >}}): discutir critérios de aceitação antes da implementação ajuda a explicitar o que será validado. ## Transformar o limite em cenários diff --git a/content/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc.en.md b/content/docs/2026/outubro/29-10/uma-analise-de-lancamentos-de-jogos-no-pc.en.md similarity index 83% rename from content/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc.en.md rename to content/docs/2026/outubro/29-10/uma-analise-de-lancamentos-de-jogos-no-pc.en.md index 266e895..4789e03 100644 --- a/content/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc.en.md +++ b/content/docs/2026/outubro/29-10/uma-analise-de-lancamentos-de-jogos-no-pc.en.md @@ -2,6 +2,7 @@ title: "An analysis of PC game releases" date: 2026-10-29T15:53:10-03:00 draft: false +url: "/en/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc/" --- Simple but crucial examples of testing in your project. @@ -12,15 +13,15 @@ With PC gaming becoming increasingly prominent, Sony made a major announcement i Sony gained a dedicated page on **Steam**, one of the largest PC gaming platforms, followed by its own official site listing releases for these platforms. Games that were once console exclusives can now be played on PC by many more people, including those using entry-level hardware, with excellent performance. -![PlayStation Studios page on Steam](/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc-imagens/playstation-studios-steam.png) +![PlayStation Studios page on Steam](../images/uma-analise-de-lancamentos-de-jogos-no-pc--playstation-studios-steam.png) This week, as March draws to a close, we have had some good game releases. Actually, they are not entirely new games: one is a remastered game with **performance improvements and graphical fixes**, the acclaimed **Resident Evil 4**. -![Resident Evil 4 page on Steam](/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc-imagens/resident-evil-4-steam.png) +![Resident Evil 4 page on Steam](../images/uma-analise-de-lancamentos-de-jogos-no-pc--resident-evil-4-steam.png) The other release reaching PC is Sony's acclaimed exclusive **The Last of Us Part I**. Anyone who did not play it on PlayStation 3, PS4, or the latest console generation at the time, PS5, can now play it on PC. **Or try to play it on PC.** -![The Last of Us Part I page on Steam](/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc-imagens/the-last-of-us-steam.png) +![The Last of Us Part I page on Steam](../images/uma-analise-de-lancamentos-de-jogos-no-pc--the-last-of-us-steam.png) Since its PC release, the game has faced valid criticism from users reporting **performance problems on PCs**. Even high-end machines **cannot run the game** without a variety of bugs. Reviews report issues including: @@ -32,13 +33,13 @@ Since its PC release, the game has faced valid criticism from users reporting ** The game is clearly having problems. Naughty Dog and Iron Galaxy released a statement and a patch of only 36 MB. -![Naughty Dog announcement about the PC hotfix](/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc-imagens/naughty-dog-hotfix.png) +![Naughty Dog announcement about the PC hotfix](../images/uma-analise-de-lancamentos-de-jogos-no-pc--naughty-dog-hotfix.png) -![Summary of The Last of Us Part I reviews on Steam](/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc-imagens/avaliacoes-resumo-steam.png) +![Summary of The Last of Us Part I reviews on Steam](../images/uma-analise-de-lancamentos-de-jogos-no-pc--avaliacoes-resumo-steam.png) -![User reviews of The Last of Us Part I on Steam](/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc-imagens/avaliacoes-usuarios-steam.png) +![User reviews of The Last of Us Part I on Steam](../images/uma-analise-de-lancamentos-de-jogos-no-pc--avaliacoes-usuarios-steam.png) -![A graphical issue in The Last of Us Part I](/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc-imagens/problema-grafico-the-last-of-us.png) +![A graphical issue in The Last of Us Part I](../images/uma-analise-de-lancamentos-de-jogos-no-pc--problema-grafico-the-last-of-us.png) ## What can we think about this? Testing was missing @@ -70,7 +71,7 @@ Adrenaline video: The Last of Us Part 1 on PC — testing hardware live! Adrenal Adrenaline video: The Last of Us Part 1 — five reasons it is one of the worst ports ever made. -![Joel in a scene from The Last of Us Part I](/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc-imagens/joel-the-last-of-us.png) +![Joel in a scene from The Last of Us Part I](../images/uma-analise-de-lancamentos-de-jogos-no-pc--joel-the-last-of-us.png) ## A tip for improving team communication diff --git a/content/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc.md b/content/docs/2026/outubro/29-10/uma-analise-de-lancamentos-de-jogos-no-pc.md similarity index 86% rename from content/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc.md rename to content/docs/2026/outubro/29-10/uma-analise-de-lancamentos-de-jogos-no-pc.md index 62900b4..e3ba647 100644 --- a/content/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc.md +++ b/content/docs/2026/outubro/29-10/uma-analise-de-lancamentos-de-jogos-no-pc.md @@ -2,6 +2,7 @@ title: "Uma análise de lançamentos de jogos no PC" date: 2026-10-29T15:53:10-03:00 draft: false +url: "/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc/" --- Exemplos simples mas cruciais de testes no seu projeto; @@ -12,15 +13,15 @@ Com esse destaque de jogos nos computadores, que vem crescendo cada vez mais, ti A Sony ganhou uma página exclusiva na **Steam**, uma das maiores plataformas de jogos eletrônicos para PC e na sequência um site oficial da própria Sony com a lista de lançamentos para as plataformas. Jogos que antes eram somente exclusivos do console agora com várias pessoas podendo jogar no PC – incluíndo aqueles hardwares de entrada – com uma ótima performance que rodam muito bem. -![Página da PlayStation Studios na Steam](uma-analise-de-lancamentos-de-jogos-no-pc-imagens/playstation-studios-steam.png) +![Página da PlayStation Studios na Steam](../images/uma-analise-de-lancamentos-de-jogos-no-pc--playstation-studios-steam.png) E nessa semana se encaminhando para o final de março tivemos bons lançamentos de jogos, na verdade, não são bem lançados de jogos no quesito “novo”, mas um jogo remasterizado para **melhorias de performance e correções gráficas** o aclamado jogo da franquia **Resident Evil 4.** -![Página de Resident Evil 4 na Steam](uma-analise-de-lancamentos-de-jogos-no-pc-imagens/resident-evil-4-steam.png) +![Página de Resident Evil 4 na Steam](../images/uma-analise-de-lancamentos-de-jogos-no-pc--resident-evil-4-steam.png) Já o outro lançamento chegando para a plataforma PC, o exclusivo da Sony e aclamado **The Last Of Us Parte 1.** Quem não jogou no PlayStation 3, PS4 e na última geração do console (atualmente) PS5, agora pode jogar no PC. **Ou tentar jogar no PC.** -![Página de The Last of Us Part I na Steam](uma-analise-de-lancamentos-de-jogos-no-pc-imagens/the-last-of-us-steam.png) +![Página de The Last of Us Part I na Steam](../images/uma-analise-de-lancamentos-de-jogos-no-pc--the-last-of-us-steam.png) Desde o seu lançamento no pc o jogo está enfrentando críticas, e válidas dos usuários. Relatando **problemas de performance nos PC** – Computadores de última geração **não estão conseguindo rodar o jogo** ocorrendo diversos tipos de bugs – As reviews são diversas com os seguintes problemas: @@ -36,13 +37,13 @@ Desde o seu lançamento no pc o jogo está enfrentando críticas, e válidas dos O jogo claro está enfrentando problemas e as empresas Naughty Dog e Iron Galaxy lançaram um nota de esclarecimento e também já soltou um path de correção com apenas 36Mb. -![Comunicado da Naughty Dog sobre o hotfix para The Last of Us Part I no PC](uma-analise-de-lancamentos-de-jogos-no-pc-imagens/naughty-dog-hotfix.png) +![Comunicado da Naughty Dog sobre o hotfix para The Last of Us Part I no PC](../images/uma-analise-de-lancamentos-de-jogos-no-pc--naughty-dog-hotfix.png) -![Resumo das avaliações de The Last of Us Part I na Steam](uma-analise-de-lancamentos-de-jogos-no-pc-imagens/avaliacoes-resumo-steam.png) +![Resumo das avaliações de The Last of Us Part I na Steam](../images/uma-analise-de-lancamentos-de-jogos-no-pc--avaliacoes-resumo-steam.png) -![Avaliações de usuários de The Last of Us Part I na Steam](uma-analise-de-lancamentos-de-jogos-no-pc-imagens/avaliacoes-usuarios-steam.png) +![Avaliações de usuários de The Last of Us Part I na Steam](../images/uma-analise-de-lancamentos-de-jogos-no-pc--avaliacoes-usuarios-steam.png) -![Captura de um problema gráfico em The Last of Us Part I](uma-analise-de-lancamentos-de-jogos-no-pc-imagens/problema-grafico-the-last-of-us.png) +![Captura de um problema gráfico em The Last of Us Part I](../images/uma-analise-de-lancamentos-de-jogos-no-pc--problema-grafico-the-last-of-us.png) ## E o que podemos pensar sobre isso? Faltou Testes @@ -74,7 +75,7 @@ Vídeo do Adrenaline: The Last of Us Part 1 no PC: testando hardwares ao vivo! V Vídeo do Adrenaline: The Last of Us Part 1: 5 motivos que fazem um dos piores ports já feitos -![Joel em uma cena de The Last of Us Part I](uma-analise-de-lancamentos-de-jogos-no-pc-imagens/joel-the-last-of-us.png) +![Joel em uma cena de The Last of Us Part I](../images/uma-analise-de-lancamentos-de-jogos-no-pc--joel-the-last-of-us.png) ## Dica de melhoria na comunicação da equipe diff --git a/content/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc-imagens/avaliacoes-resumo-steam.png b/content/docs/2026/outubro/images/uma-analise-de-lancamentos-de-jogos-no-pc--avaliacoes-resumo-steam.png similarity index 100% rename from content/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc-imagens/avaliacoes-resumo-steam.png rename to content/docs/2026/outubro/images/uma-analise-de-lancamentos-de-jogos-no-pc--avaliacoes-resumo-steam.png diff --git a/content/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc-imagens/avaliacoes-usuarios-steam.png b/content/docs/2026/outubro/images/uma-analise-de-lancamentos-de-jogos-no-pc--avaliacoes-usuarios-steam.png similarity index 100% rename from content/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc-imagens/avaliacoes-usuarios-steam.png rename to content/docs/2026/outubro/images/uma-analise-de-lancamentos-de-jogos-no-pc--avaliacoes-usuarios-steam.png diff --git a/content/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc-imagens/joel-the-last-of-us.png b/content/docs/2026/outubro/images/uma-analise-de-lancamentos-de-jogos-no-pc--joel-the-last-of-us.png similarity index 100% rename from content/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc-imagens/joel-the-last-of-us.png rename to content/docs/2026/outubro/images/uma-analise-de-lancamentos-de-jogos-no-pc--joel-the-last-of-us.png diff --git a/content/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc-imagens/naughty-dog-hotfix.png b/content/docs/2026/outubro/images/uma-analise-de-lancamentos-de-jogos-no-pc--naughty-dog-hotfix.png similarity index 100% rename from content/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc-imagens/naughty-dog-hotfix.png rename to content/docs/2026/outubro/images/uma-analise-de-lancamentos-de-jogos-no-pc--naughty-dog-hotfix.png diff --git a/content/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc-imagens/playstation-studios-steam.png b/content/docs/2026/outubro/images/uma-analise-de-lancamentos-de-jogos-no-pc--playstation-studios-steam.png similarity index 100% rename from content/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc-imagens/playstation-studios-steam.png rename to content/docs/2026/outubro/images/uma-analise-de-lancamentos-de-jogos-no-pc--playstation-studios-steam.png diff --git a/content/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc-imagens/problema-grafico-the-last-of-us.png b/content/docs/2026/outubro/images/uma-analise-de-lancamentos-de-jogos-no-pc--problema-grafico-the-last-of-us.png similarity index 100% rename from content/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc-imagens/problema-grafico-the-last-of-us.png rename to content/docs/2026/outubro/images/uma-analise-de-lancamentos-de-jogos-no-pc--problema-grafico-the-last-of-us.png diff --git a/content/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc-imagens/resident-evil-4-steam.png b/content/docs/2026/outubro/images/uma-analise-de-lancamentos-de-jogos-no-pc--resident-evil-4-steam.png similarity index 100% rename from content/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc-imagens/resident-evil-4-steam.png rename to content/docs/2026/outubro/images/uma-analise-de-lancamentos-de-jogos-no-pc--resident-evil-4-steam.png diff --git a/content/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc-imagens/the-last-of-us-steam.png b/content/docs/2026/outubro/images/uma-analise-de-lancamentos-de-jogos-no-pc--the-last-of-us-steam.png similarity index 100% rename from content/docs/2026/outubro/uma-analise-de-lancamentos-de-jogos-no-pc-imagens/the-last-of-us-steam.png rename to content/docs/2026/outubro/images/uma-analise-de-lancamentos-de-jogos-no-pc--the-last-of-us-steam.png diff --git a/layouts/_markup/render-image.html b/layouts/_markup/render-image.html new file mode 100644 index 0000000..383522a --- /dev/null +++ b/layouts/_markup/render-image.html @@ -0,0 +1,66 @@ +{{/* Adapted from Hextra v0.12.3; preserve its image rendering and zoom behavior. */}} +{{- $alt := .PlainText | safeHTML -}} +{{- $lazyLoading := .Page.Site.Params.enableImageLazyLoading | default true -}} +{{- $enableImageZoom := .Page.Site.Params.imageZoom.enable | default false -}} +{{- if not (eq .Page.Params.imageZoom nil) -}} + {{- $enableImageZoom = .Page.Params.imageZoom -}} +{{- end -}} +{{- $dest := .Destination -}} +{{- $url := urls.Parse $dest -}} + +{{- $isLocal := not $url.Scheme -}} +{{- $isPage := and (eq .Page.Kind "page") (not .Page.BundleType) -}} +{{- $startsWithSlash := hasPrefix $dest "/" -}} +{{- $startsWithRelative := hasPrefix $dest "../" -}} + +{{- if and $dest $isLocal -}} + {{- if hasPrefix $url.Path "../images/" -}} + {{/* Resolve shared monthly images from the source directory, independently of the post URL and language. */}} + {{- $source := path.Clean (path.Join .Page.File.Dir $url.Path) -}} + {{- $query := cond $url.RawQuery (printf "?%s" $url.RawQuery) "" -}} + {{- $fragment := cond $url.Fragment (printf "#%s" $url.Fragment) "" -}} + {{- $dest = printf "%s%s%s" (relURL $source) $query $fragment -}} + {{- else if $startsWithSlash -}} + {{- with or (.PageInner.Resources.Get $url.Path) (resources.Get $url.Path) -}} + {{/* Images under assets directory */}} + {{- $query := cond $url.RawQuery (printf "?%s" $url.RawQuery) "" -}} + {{- $fragment := cond $url.Fragment (printf "#%s" $url.Fragment) "" -}} + {{- $dest = printf "%s%s%s" .RelPermalink $query $fragment -}} + {{- else -}} + {{/* Images under static directory */}} + {{- $dest = (relURL (strings.TrimPrefix "/" $dest)) -}} + {{- end -}} + {{- else -}} + {{/* Resolve page bundle resource for multilingual permalink */}} + {{- with .PageInner.Resources.Get (strings.TrimPrefix "./" $url.Path) -}} + {{- $query := cond $url.RawQuery (printf "?%s" $url.RawQuery) "" -}} + {{- $fragment := cond $url.Fragment (printf "#%s" $url.Fragment) "" -}} + {{- $dest = printf "%s%s%s" .RelPermalink $query $fragment -}} + {{- else -}} + {{- if and $isPage (not $startsWithRelative) -}} + {{ $dest = (printf "../%s" $dest) }} + {{- end -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{- $attributes := "" -}} +{{- range $key, $value := .Attributes -}} + {{- if $value -}} + {{- $pair := printf "%s=%q" $key ($value | transform.HTMLEscape) -}} + {{- $attributes = printf "%s %s" $attributes $pair -}} + {{- end -}} +{{- end -}} + +{{- if $enableImageZoom -}} + {{- .Page.Store.Set "hasImageZoom" true -}} +{{- end -}} + +{{- with .Title -}} +
+ {{ $alt }} +
{{ . }}
+
+{{- else -}} + {{ $alt }} +{{- end -}} diff --git a/scripts/check_post_layout.rb b/scripts/check_post_layout.rb new file mode 100644 index 0000000..94cfce4 --- /dev/null +++ b/scripts/check_post_layout.rb @@ -0,0 +1,11 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require_relative 'lib/post_layout' + +begin + PostLayout.validate! + puts 'PASS Estrutura dos posts: AAAA/mês/DD-MM/post.md e imagens mensais.' +rescue ArgumentError => error + abort(error.message) +end diff --git a/scripts/fix_markdown.rb b/scripts/fix_markdown.rb index 5c3fbcc..b995013 100755 --- a/scripts/fix_markdown.rb +++ b/scripts/fix_markdown.rb @@ -47,6 +47,9 @@ # bundle exec ruby scripts/fix_markdown.rb --dry-run # só mostra o que mudaria, não escreve nada # bundle exec ruby scripts/fix_markdown.rb caminho.md # roda só num arquivo (ainda usa o mdl geral p/ MD036) +require_relative 'lib/post_layout' +Dir.chdir(PostLayout::ROOT) + require 'open3' require 'set' diff --git a/scripts/lib/post_layout.rb b/scripts/lib/post_layout.rb new file mode 100644 index 0000000..5d7ea0c --- /dev/null +++ b/scripts/lib/post_layout.rb @@ -0,0 +1,227 @@ +# frozen_string_literal: true + +require 'date' +require 'digest' +require 'fileutils' +require 'json' +require 'open3' +require 'pathname' +require 'uri' +require 'yaml' + +module PostLayout + ROOT = File.expand_path('../..', __dir__) + POSTS_ROOT = File.join(ROOT, 'content/docs') + MONTHS = %w[janeiro fevereiro marco abril maio junho julho agosto setembro outubro novembro dezembro].freeze + IMAGE = /(!\[[^\]\n]*\]\()(<[^>]+>|[^\s)]+)([^\n)]*\))/ + Record = Struct.new(:path, :metadata, :header, :body, keyword_init: true) + + module_function + + def slugify(text) + text.unicode_normalize(:nfkd).encode('ASCII', invalid: :replace, undef: :replace, replace: '').downcase.gsub(/[^a-z0-9]+/, '-').gsub(/\A-|-\z/, '') + end + + def date_of(metadata) + Date.iso8601(metadata.fetch('date').to_s[0, 10]) + end + + def month_relative_path(metadata) + date = date_of(metadata) + File.join(date.year.to_s, MONTHS.fetch(date.month - 1)) + end + + def post_relative_path(metadata, source) + stem = File.basename(source).sub(/(?:\.en)?\.md\z/, '') + stem = metadata['slug'] || File.basename(File.dirname(source)) if stem == 'index' + stem = slugify(stem) + raise ArgumentError, "Nome de post inválido: #{source}" if stem.empty? + extension = source.end_with?('.en.md') ? '.en.md' : '.md' + File.join(month_relative_path(metadata), date_of(metadata).strftime('%d-%m'), stem + extension) + end + + def read_post(path) + match = File.read(path).match(/\A---\r?\n(.*?)\r?\n---\r?\n(.*)\z/m) + raise ArgumentError, "Front matter inválido: #{path}" unless match + metadata = YAML.safe_load(match[1], permitted_classes: [Date, Time]) + date_of(metadata) + Record.new(path: path, metadata: metadata, header: match[1], body: match[2]) + end + + def posts(root) + Dir.glob(File.join(root, '**/*.md')).reject { |path| File.basename(path).start_with?('_index') }.map { |path| read_post(path) } + end + + def legacy_url(relative, metadata) + return metadata['url'] if metadata['url'] + parts = relative.sub(/(?:\.en)?\.md\z/, '').split('/') + parts.pop if parts.last == 'index' + parts[-1] = metadata['slug'] if metadata['slug'] + URI::DEFAULT_PARSER.escape("#{relative.end_with?('.en.md') ? '/en' : ''}/docs/#{parts.join('/')}/") + end + + def ensure_images(month) + directory = File.join(month, 'images') + FileUtils.mkdir_p(directory) + FileUtils.touch(File.join(directory, '.gitkeep')) if Dir.empty?(directory) + end + + def validate!(root = POSTS_ROOT) + errors = posts(root).filter_map do |post| + relative = Pathname.new(post.path).relative_path_from(Pathname.new(root)).to_s + relative unless relative == post_relative_path(post.metadata, post.path) + end + Dir.glob(File.join(root, '**/*')).select { |path| File.file?(path) && !path.end_with?('.md') }.each do |path| + relative = Pathname.new(path).relative_path_from(Pathname.new(root)).to_s + errors << relative unless relative.match?(%r{\A\d{4}/(?:#{MONTHS.join('|')})/images/[^/]+\z}) + end + raise ArgumentError, "Estrutura fora do padrão:\n#{errors.join("\n")}" unless errors.empty? + true + end + + class Migration + def initialize(posts_root: POSTS_ROOT, repo_root: ROOT) + @root, @repo = posts_root, repo_root + end + + def relative(path) + Pathname.new(path).relative_path_from(Pathname.new(@root)).to_s + end + + # Reconhece também arquivos movidos manualmente sem alterar seu conteúdo. + def original_paths + out, _, status = Open3.capture3('git', '-C', @repo, 'ls-tree', '-rz', 'HEAD', '--', 'content/docs') + return {} unless status.success? + out.split("\0").each_with_object({}) do |entry, result| + info, name = entry.split("\t", 2) + next unless name&.end_with?('.md') + (result[info.split.last] ||= []) << name.delete_prefix('content/docs/') + end + end + + def resolve_asset(post, destination) + return if destination.match?(%r{\A(?:[a-z]+:|//)}i) + path = URI::DEFAULT_PARSER.unescape(destination.delete_prefix('<').delete_suffix('>').split(/[?#]/, 2).first) + candidates = [File.expand_path(path, File.dirname(post.path))] + candidates << File.join(@repo, path.delete_prefix('/')) if path.start_with?('/content/') + candidates << File.join(@repo, 'content', path.delete_prefix('/')) if path.start_with?('/docs/') + candidates << File.expand_path(path, File.dirname(File.join(@root, @old_relative.fetch(post.path)))) + candidates << File.join(File.dirname(post.path), File.basename(path)) + candidates.find { |candidate| @assets.include?(candidate) } + end + + def plan + records = PostLayout.posts(@root) + originals = original_paths + @old_relative = records.to_h do |post| + bytes = File.binread(post.path) + candidates = originals.fetch(Digest::SHA1.hexdigest("blob #{bytes.bytesize}\0" + bytes), []) + current = relative(post.path) + [post.path, candidates.include?(current) || candidates.empty? ? current : candidates.first] + end + targets = records.to_h { |post| [post.path, File.join(@root, PostLayout.post_relative_path(post.metadata, post.path))] } + raise ArgumentError, 'Dois posts possuem o mesmo destino; ajuste seus nomes antes de migrar.' unless targets.values.uniq.length == targets.length + @assets = Dir.glob(File.join(@root, '**/*')).select { |p| File.file?(p) && !p.end_with?('.md') } + owners = Hash.new { |hash, key| hash[key] = [] } + records.each do |post| + post.body.scan(IMAGE).each do |_, destination, _| + asset = resolve_asset(post, destination) + owners[asset] << post if asset + end + end + image_targets = {} + used = {} + @assets.each do |asset| + users = owners[asset] + if users.empty? + users = [records.max_by do |post| + a, b = File.dirname(post.path).split('/'), asset.split('/') + a.zip(b).take_while { |x, y| x == y }.length + end].compact + end + raise ArgumentError, "Imagem sem mês de referência: #{asset}" if users.empty? + image_targets[asset] = {} + users.group_by { |post| PostLayout.month_relative_path(post.metadata) }.each do |month, posts| + stem = File.basename(targets.fetch(posts.first.path)).sub(/(?:\.en)?\.md\z/, '') + name = if relative(asset).match?(%r{\A\d{4}/(?:\d{2}-)?(?:#{MONTHS.join('|')})/images/[^/]+\z}) + File.basename(asset) + else + "#{stem}--#{PostLayout.slugify(File.basename(asset, '.*'))}#{File.extname(asset).downcase}" + end + directory = File.join(@root, month, 'images') + target = File.dirname(asset) == directory ? asset : File.join(directory, name) + suffix = 1 + while used.key?(target) && used[target] != asset + suffix += 1 + target = File.join(directory, "#{File.basename(name, '.*')}-#{suffix}#{File.extname(name)}") + end + used[target] = asset + image_targets[asset][month] = target + end + end + aliases = targets.merge(@old_relative.to_h { |source, old| [File.join(@root, old), targets.fetch(source)] }) + posts = records.map do |post| + month = PostLayout.month_relative_path(post.metadata) + body = post.body.gsub(IMAGE) do + opening, destination, closing = Regexp.last_match.captures + asset = resolve_asset(post, destination) + if asset + suffix = destination.delete_prefix('<').delete_suffix('>')[/[?#].*\z/] || '' + "#{opening}../images/#{File.basename(image_targets.fetch(asset).fetch(month))}#{suffix}#{closing}" + else + "#{opening}#{destination}#{closing}" + end + end + body = body.gsub(/(\{\{<\s*relref\s+")([^\"]+)("\s*>\}\})/) do + opening, source, closing = Regexp.last_match.captures + target = aliases[File.join(@repo, 'content', source.delete_prefix('/'))] + "#{opening}#{target ? '/docs/' + relative(target) : source}#{closing}" + end + header = post.header + if targets[post.path] != post.path && !post.metadata['url'] + header += "\nurl: #{JSON.generate(PostLayout.legacy_url(@old_relative.fetch(post.path), post.metadata))}" + end + { source: post.path, target: targets.fetch(post.path), content: "---\n#{header}\n---\n#{body}" } + end + images = image_targets.flat_map { |source, months| months.values.uniq.map { |target| { source: source, target: target } } } + (posts + images).each do |entry| + raise ArgumentError, "Destino já existe: #{entry[:target]}" if entry[:source] != entry[:target] && File.exist?(entry[:target]) + end + { posts: posts, images: images } + end + + def apply! + changes = plan + created = [] + updated = {} + begin + (changes[:images] + changes[:posts]).each do |entry| + next if entry[:source] == entry[:target] && !entry.key?(:content) + bytes = entry[:content] || File.binread(entry[:source]) + next if File.file?(entry[:target]) && File.binread(entry[:target]) == bytes + FileUtils.mkdir_p(File.dirname(entry[:target])) + if entry[:source] == entry[:target] + updated[entry[:target]] = File.binread(entry[:target]) + File.binwrite(entry[:target], bytes) + else + File.open(entry[:target], File::WRONLY | File::CREAT | File::EXCL) { |file| file.write(bytes) } + created << entry[:target] + end + end + rescue StandardError + created.each { |path| File.unlink(path) } + updated.each { |path, bytes| File.binwrite(path, bytes) } + raise + end + entries = changes[:posts] + changes[:images] + destinations = entries.map { |entry| entry[:target] } + entries.map { |entry| entry[:source] }.uniq.each { |path| File.unlink(path) unless destinations.include?(path) } + PostLayout.posts(@root).each { |post| PostLayout.ensure_images(File.join(@root, PostLayout.month_relative_path(post.metadata))) } + Dir.glob(File.join(@root, '[0-9][0-9][0-9][0-9]/[0-9][0-9]-*/images/.gitkeep')).each do |placeholder| + File.unlink(placeholder) if File.zero?(placeholder) && Dir.children(File.dirname(placeholder)) == ['.gitkeep'] + end + Dir.glob(File.join(@root, '**/*')).select { |p| File.directory?(p) }.sort_by(&:length).reverse_each { |p| Dir.rmdir(p) if Dir.empty?(p) } + changes.transform_values(&:length) + end + end +end diff --git a/scripts/migrate_posts.rb b/scripts/migrate_posts.rb new file mode 100644 index 0000000..a0cb05b --- /dev/null +++ b/scripts/migrate_posts.rb @@ -0,0 +1,28 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require 'optparse' +require_relative 'lib/post_layout' + +begin + apply = false + OptionParser.new do |options| + options.banner = 'Uso: ruby scripts/migrate_posts.rb [--apply] (sem opção: apenas simular)' + options.on('--apply', 'Aplicar migração') { apply = true } + end.parse! + raise ArgumentError, 'Argumentos inesperados.' unless ARGV.empty? + migration = PostLayout::Migration.new + plan = migration.plan + (plan[:posts] + plan[:images]).each do |entry| + next if entry[:source] == entry[:target] + puts "#{entry[:source].delete_prefix(PostLayout::POSTS_ROOT + '/')} -> #{entry[:target].delete_prefix(PostLayout::POSTS_ROOT + '/')}" + end + if apply + puts migration.apply!.inspect + PostLayout.validate! + else + puts 'Simulação: nenhum arquivo alterado. Use --apply para migrar.' + end +rescue ArgumentError => error + abort(error.message) +end diff --git a/scripts/new_post.rb b/scripts/new_post.rb index 08d1730..e833458 100755 --- a/scripts/new_post.rb +++ b/scripts/new_post.rb @@ -1,84 +1,35 @@ #!/usr/bin/env ruby # frozen_string_literal: true -# Cria um novo post em content/docs///.md já com o front -# matter no formato usado pelo resto do blog (ver qualquer post existente em -# content/docs/), criando a pasta do ano/mês automaticamente se ainda não -# existir. -# -# Uso: -# bundle exec ruby scripts/new_post.rb "Título do post" [tag1,tag2,...] -# -# Se o título não for passado como argumento, o script pergunta -# interativamente. Tags são opcionais (separadas por vírgula). -# -# draft sempre nasce como `true` — o fluxo é escrever o post, revisar, e só -# então trocar manualmente para `false` quando estiver pronto pra publicar -# (é isso que tira o post da lista "draft" e faz ele entrar no blog/RSS/sitemap). - -require 'date' -require 'fileutils' - -MESES_PT = %w[ - janeiro fevereiro marco abril maio junho - julho agosto setembro outubro novembro dezembro -].freeze - -ACCENTS = { - 'á' => 'a', 'à' => 'a', 'ã' => 'a', 'â' => 'a', 'ä' => 'a', - 'é' => 'e', 'è' => 'e', 'ê' => 'e', 'ë' => 'e', - 'í' => 'i', 'ì' => 'i', 'î' => 'i', 'ï' => 'i', - 'ó' => 'o', 'ò' => 'o', 'õ' => 'o', 'ô' => 'o', 'ö' => 'o', - 'ú' => 'u', 'ù' => 'u', 'û' => 'u', 'ü' => 'u', - 'ç' => 'c', 'ñ' => 'n' -}.freeze - -def slugify(text) - slug = text.downcase - ACCENTS.each { |accented, plain| slug = slug.gsub(accented, plain) } - slug = slug.gsub(/[^a-z0-9]+/, '-') - slug.gsub(/^-+|-+$/, '') -end - -def prompt(label) - print("#{label}: ") - $stdin.gets&.strip -end - -title = ARGV[0] || prompt('Título do post') -abort('Título não pode ser vazio.') if title.nil? || title.strip.empty? - -tags_arg = ARGV[1] || prompt('Tags (separadas por vírgula, pode deixar em branco)') -tags = (tags_arg || '').split(',').map(&:strip).reject(&:empty?) - -today = Date.today -slug = slugify(title) -abort("Não foi possível gerar um slug a partir de \"#{title}\".") if slug.empty? - -mes = MESES_PT[today.month - 1] -dir = File.join(__dir__, '..', 'content', 'docs', today.year.to_s, mes) -path = File.join(dir, "#{slug}.md") - -if File.exist?(path) - abort("Já existe um post em #{File.expand_path(path)} — escolha outro título ou apague o arquivo antigo.") +require 'optparse' +require_relative 'lib/post_layout' + +begin + date = Date.today + OptionParser.new do |options| + options.banner = 'Uso: ruby scripts/new_post.rb [--date AAAA-MM-DD] "Título" [tag1,tag2]' + options.on('--date DATE', 'Data do post (padrão: hoje)') do |value| + raise ArgumentError, 'Use uma data válida no formato AAAA-MM-DD.' unless value.match?(/\A\d{4}-\d{2}-\d{2}\z/) + date = Date.iso8601(value) + end + end.parse! + interactive = ARGV.empty? + print('Título do post: ') if interactive + title = interactive ? $stdin.gets&.strip : ARGV.shift + raise ArgumentError, 'Título não pode ser vazio.' if title.nil? || title.strip.empty? + print('Tags (separadas por vírgula): ') if interactive + tags = (interactive ? $stdin.gets.to_s : ARGV.shift.to_s).split(',').map(&:strip).reject(&:empty?) + raise ArgumentError, 'Argumentos excedentes.' unless ARGV.empty? + slug = PostLayout.slugify(title) + info = { 'title' => title, 'date' => date.iso8601, 'slug' => slug, 'tags' => tags, 'draft' => true } + path = File.join(PostLayout::POSTS_ROOT, PostLayout.post_relative_path(info, "#{slug}.md")) + raise ArgumentError, "Já existe um post em #{path}." if File.exist?(path) + FileUtils.mkdir_p(File.dirname(path)) + PostLayout.ensure_images(File.join(PostLayout::POSTS_ROOT, PostLayout.month_relative_path(info))) + File.open(path, File::WRONLY | File::CREAT | File::EXCL) { |file| file.write(info.to_yaml + "---\n\n") } + puts "Post criado em #{path}" + puts 'Imagens: ../images/nome-do-post--imagem.png' + puts 'draft: true — troque para false quando terminar de escrever.' +rescue ArgumentError, OptionParser::ParseError => error + abort(error.message) end - -FileUtils.mkdir_p(dir) - -tags_yaml = tags.empty? ? '[]' : "[#{tags.join(', ')}]" - -front_matter = <<~MD - --- - title: "#{title}" - date: #{today.strftime('%Y-%m-%d')} - slug: #{slug} - tags: #{tags_yaml} - draft: true - --- - -MD - -File.write(path, front_matter) - -puts "Post criado em #{File.expand_path(path)}" -puts 'draft: true — troque para false quando terminar de escrever.' diff --git a/scripts/test_go_modules.rb b/scripts/test_go_modules.rb index 44b0a1d..ef53bc4 100644 --- a/scripts/test_go_modules.rb +++ b/scripts/test_go_modules.rb @@ -8,7 +8,9 @@ require 'tmpdir' require 'yaml' -root = File.expand_path('..', __dir__) +require_relative 'lib/post_layout' + +root = PostLayout::ROOT workflow = YAML.safe_load(File.read(File.join(root, '.github/workflows/multilingual.yaml'))) flags = workflow.dig('jobs', 'multilingual', 'env', 'GOFLAGS') || '' diff --git a/scripts/test_multilingual.rb b/scripts/test_multilingual.rb index 19bd3f4..6e12d97 100644 --- a/scripts/test_multilingual.rb +++ b/scripts/test_multilingual.rb @@ -10,7 +10,9 @@ require 'uri' require 'yaml' -ROOT = File.expand_path('..', __dir__) +require_relative 'lib/post_layout' + +ROOT = PostLayout::ROOT def assert(condition, message) raise message unless condition @@ -30,16 +32,17 @@ def menu_links(html) '_index.en.md' => "---\ntitle: Blog\n---\nMy notes.\n", 'docs/_index.md' => "---\ntitle: Posts\ncascade:\n type: blog\n---\n", 'docs/_index.en.md' => "---\ntitle: Posts\ncascade:\n type: blog\n---\n", - 'docs/example/index.md' => "---\ntitle: Meu estudo\ndate: 2020-01-01\nfeatured: true\n---\nTexto em português.\n", - 'docs/example/index.en.md' => "---\ntitle: My study\ndate: 2020-01-01\nfeatured: true\n---\nEnglish text.\n\n![Example](image.jpg)\n", - 'docs/only-portuguese.md' => "---\ntitle: Sem tradução\ndate: 2020-01-02\n---\nPortuguês.\n" + 'docs/2020/janeiro/01-01/meu-estudo.md' => "---\ntitle: Meu estudo\nurl: /docs/example/\ndate: 2020-01-01\nfeatured: true\n---\nTexto em português.\n\n![Example](../images/image.jpg)\n", + 'docs/2020/janeiro/01-01/meu-estudo.en.md' => "---\ntitle: My study\nurl: /en/docs/example/\ndate: 2020-01-01\nfeatured: true\n---\nEnglish text.\n\n![Example](../images/image.jpg)\n", + 'docs/2020/janeiro/02-01/sem-traducao.md' => "---\ntitle: Sem tradução\nurl: /docs/only-portuguese/\ndate: 2020-01-02\n---\nPortuguês.\n" } fixtures.each do |name, text| path = File.join(content, name) FileUtils.mkdir_p(File.dirname(path)) File.write(path, text) end - FileUtils.cp(File.join(ROOT, 'assets/image/icons/cat-icon.jpg'), File.join(content, 'docs/example/image.jpg')) + FileUtils.mkdir_p(File.join(content, 'docs/2020/janeiro/images')) + FileUtils.cp(File.join(ROOT, 'assets/image/icons/cat-icon.jpg'), File.join(content, 'docs/2020/janeiro/images/image.jpg')) data = File.join(work, 'data') FileUtils.mkdir_p(data) FileUtils.cp(File.join(ROOT, 'data/dock.yaml'), File.join(data, 'dock.yaml')) @@ -89,12 +92,18 @@ def menu_links(html) %w[Highlights January].each { |label| assert(html.include?(label), "Missing English label #{label}") } assert(html.include?('On this page'), 'English contents label missing') end - checks['translated page bundles reuse images without copying them'] = lambda do - html = page.call('en/docs/example') - image = html.scan(/]*)>/m).map { |a| a.first.scan(/([\w-]+)="([^"]*)"/).to_h }.find { |a| a['alt'] == 'Example' } - assert(image, 'Translated post image missing') - path = URI.join('https://example.org/en/docs/example/', image['src']).path - assert(File.file?(File.join(builds.fetch('root'), path.delete_prefix('/'))), 'Translated image URL does not resolve') + checks['dated posts share monthly images while keeping their published URLs'] = lambda do + %w[root subpath].each do |build| + %w[docs/example en/docs/example].each do |route| + html = page.call(route, build) + image = html.scan(/]*)>/m).map { |a| a.first.scan(/([\w-]+)="([^"]*)"/).to_h }.find { |a| a['alt'] == 'Example' } + assert(image, 'Post image missing') + path = URI.join("https://example.org/#{route}/", image['src']).path + prefix = build == 'subpath' ? '/blog/' : '/' + assert(path.start_with?(prefix), 'Image ignores the hosting subdirectory') + assert(File.file?(File.join(builds.fetch(build), path.delete_prefix(prefix))), 'Shared image URL does not resolve') + end + end end checks['the external Google Translate integration is absent'] = lambda do assert(!page.call('').include?('translate.google.com'), 'External translation link still exists') diff --git a/scripts/test_post_layout.rb b/scripts/test_post_layout.rb new file mode 100644 index 0000000..52a6d7f --- /dev/null +++ b/scripts/test_post_layout.rb @@ -0,0 +1,176 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require 'date' +require 'digest' +require 'fileutils' +require 'open3' +require 'rbconfig' +require 'tmpdir' +require 'yaml' +require_relative 'lib/post_layout' if File.file?(File.join(__dir__, 'lib/post_layout.rb')) + +ROOT = File.expand_path('..', __dir__) + +def assert(condition, message) + raise message unless condition +end + +def with_project + Dir.mktmpdir('ladydebug-post-layout-') do |root| + FileUtils.cp_r(File.join(ROOT, 'scripts'), root) + yield root, File.join(root, 'content/docs') + end +end + +def write_post(path, title:, slug:, body: '', language: nil) + FileUtils.mkdir_p(File.dirname(path)) + metadata = { 'title' => title, 'date' => '2023-02-04', 'slug' => slug, 'draft' => true } + metadata['lang'] = language if language + File.write(path, metadata.to_yaml + "---\n\n#{body}\n") +end + +def metadata(path) + YAML.safe_load(File.read(path).split('---', 3)[1], permitted_classes: [Date, Time]) +end + +def snapshot(root) + Dir.glob(File.join(root, '**/*'), File::FNM_DOTMATCH).select { |path| File.file?(path) } + .to_h { |path| [path.delete_prefix(root), Digest::SHA256.file(path).hexdigest] } +end + +checks = {} +checks['paths use year, Portuguese month without a numeric prefix, day-month and descriptive filenames'] = lambda do + info = { 'date' => '2023-02-04T00:35:15Z', 'slug' => 'meu-estudo' } + assert(PostLayout.post_relative_path(info, 'index.md') == '2023/fevereiro/04-02/meu-estudo.md', 'Incorrect Portuguese path') + assert(PostLayout.post_relative_path(info, 'index.en.md') == '2023/fevereiro/04-02/meu-estudo.en.md', 'Incorrect English path') +end +checks['the creator supports historical dates and escapes YAML titles and tags'] = lambda do + with_project do |root, posts| + title = 'Uma análise: "ação"' + out, err, status = Open3.capture3(RbConfig.ruby, File.join(root, 'scripts/new_post.rb'), '--date', '2023-02-04', title, 'testes, desempenho', chdir: Dir.tmpdir) + assert(status.success?, "Creator failed: #{out}#{err}") + file = File.join(posts, '2023/fevereiro/04-02/uma-analise-acao.md') + data = metadata(file) + assert(data['title'] == title && data['tags'] == %w[testes desempenho] && data['draft'], 'Invalid front matter') + assert(File.directory?(File.join(posts, '2023/fevereiro/images')), 'Month images directory missing') + end +end +checks['multiple posts on one day coexist and duplicate names never overwrite content'] = lambda do + with_project do |root, posts| + script = File.join(root, 'scripts/new_post.rb') + %w[Primeiro Segundo].each do |title| + _, _, status = Open3.capture3(RbConfig.ruby, script, '--date', '2023-02-04', title, '') + assert(status.success?, 'Different posts must coexist') + end + before = snapshot(posts) + _, _, status = Open3.capture3(RbConfig.ruby, script, '--date', '2023-02-04', 'Primeiro', '') + assert(!status.success? && before == snapshot(posts), 'Duplicate post overwrote existing files') + end +end +checks['invalid dates are rejected before creating directories'] = lambda do + with_project do |root, posts| + _, _, status = Open3.capture3(RbConfig.ruby, File.join(root, 'scripts/new_post.rb'), '--date', '2023-02-30', 'Inválido', '') + assert(!status.success? && !File.exist?(posts), 'Invalid date created content') + end +end +checks['migration preserves languages, published URLs, image bytes and date metadata'] = lambda do + with_project do |root, posts| + a = File.join(posts, '2023/fevereiro/primeiro') + b = File.join(posts, '2023/fevereiro/segundo') + write_post(File.join(a, 'index.md'), title: 'Primeiro', slug: 'primeiro', body: '![Foto](image.png)') + write_post(File.join(a, 'index.en.md'), title: 'First', slug: 'primeiro', body: '![Photo](image.png)') + write_post(File.join(b, 'index.md'), title: 'Segundo', slug: 'segundo', body: '![Outra](image.png)') + File.write(File.join(a, 'image.png'), 'first-image-bytes') + File.write(File.join(b, 'image.png'), 'second-image-bytes') + PostLayout::Migration.new(posts_root: posts, repo_root: root).apply! + expected = File.join(posts, '2023/fevereiro/04-02/primeiro.md') + english = expected.sub(/\.md$/, '.en.md') + assert(metadata(expected)['url'] == '/docs/2023/fevereiro/primeiro/', 'Portuguese URL changed') + assert(metadata(english)['url'] == '/en/docs/2023/fevereiro/primeiro/', 'English URL changed') + assert(metadata(expected)['date'] == '2023-02-04', 'Original date changed') + images = Dir.glob(File.join(posts, '2023/fevereiro/images/*')) + assert(images.map { |p| File.binread(p) }.sort == %w[first-image-bytes second-image-bytes], 'Images overwritten or lost') + [expected, english].each do |path| + src = File.read(path)[/!\[[^\]]*\]\(([^)]+)\)/, 1] + assert(src.start_with?('../images/') && File.file?(File.expand_path(src, File.dirname(path))), 'Relative image path is broken') + end + end +end +checks['migration preserves image captions, queries and fragments'] = lambda do + with_project do |root, posts| + directory = File.join(posts, '2023/fevereiro/exemplo') + write_post(File.join(directory, 'index.md'), title: 'Exemplo', slug: 'exemplo', body: '![Foto](image.png?download=1#preview "Legenda original")') + File.write(File.join(directory, 'image.png'), 'image-bytes') + PostLayout::Migration.new(posts_root: posts, repo_root: root).apply! + migrated = File.read(File.join(posts, '2023/fevereiro/04-02/exemplo.md')) + assert(migrated.include?('![Foto](../images/exemplo--image.png?download=1#preview "Legenda original")'), 'Image caption, query or fragment changed') + end +end +checks['validation rejects numbered month folders'] = lambda do + with_project do |_root, posts| + write_post(File.join(posts, '2023/fevereiro/04-02/exemplo.md'), title: 'Exemplo', slug: 'exemplo') + PostLayout.validate!(posts) + image = File.join(posts, '2023/02-fevereiro/images/foto.png') + FileUtils.mkdir_p(File.dirname(image)) + File.write(image, 'image-bytes') + rejected = false + begin + PostLayout.validate!(posts) + rescue ArgumentError + rejected = true + end + assert(rejected, 'An incorrectly numbered month was accepted') + end +end +checks['migration removes month prefixes without renaming shared images'] = lambda do + with_project do |root, posts| + source = File.join(posts, '2023/02-fevereiro/04-02/exemplo.md') + write_post(source, title: 'Exemplo', slug: 'exemplo', body: '![Foto](../images/exemplo--foto.png)') + images = File.join(posts, '2023/02-fevereiro/images') + FileUtils.mkdir_p(images) + File.write(File.join(images, 'exemplo--foto.png'), 'image-bytes') + PostLayout::Migration.new(posts_root: posts, repo_root: root).apply! + target = File.join(posts, '2023/fevereiro/04-02/exemplo.md') + assert(File.file?(target), 'Month prefix was not removed') + assert(File.read(target).include?('![Foto](../images/exemplo--foto.png)'), 'Shared image name changed') + assert(File.read(File.join(posts, '2023/fevereiro/images/exemplo--foto.png')) == 'image-bytes', 'Shared image was lost') + end +end +checks['dry runs leave every source file untouched and migration is idempotent'] = lambda do + with_project do |root, posts| + write_post(File.join(posts, '2023/fevereiro/antigo.md'), title: 'Antigo', slug: 'antigo') + before = snapshot(posts) + migration = PostLayout::Migration.new(posts_root: posts, repo_root: root) + migration.plan + assert(before == snapshot(posts), 'Planning modified files') + migration.apply! + after = snapshot(posts) + PostLayout::Migration.new(posts_root: posts, repo_root: root).apply! + assert(after == snapshot(posts), 'Running migration twice changed content') + end +end +checks['destination collisions abort before moving or deleting any file'] = lambda do + with_project do |root, posts| + %w[a b].each { |folder| write_post(File.join(posts, "2023/fevereiro/#{folder}/index.md"), title: folder, slug: 'mesmo-post') } + before = snapshot(posts) + failed = false + begin + PostLayout::Migration.new(posts_root: posts, repo_root: root).apply! + rescue ArgumentError + failed = true + end + assert(failed && before == snapshot(posts), 'Collision did not safely abort') + end +end + +failures = checks.count do |name, check| + check.call + puts "PASS #{name}" + false +rescue StandardError => error + warn "FAIL #{name}: #{error.message}" + true +end +puts "#{checks.length - failures}/#{checks.length} checks passed" +exit(failures.zero? ? 0 : 1)