levxyca / diciotech

Um dicionário tech para pessoas que querem aprender mais sobre termos técnicos dentro da tecnologia 📖
https://diciotech.netlify.app/
GNU General Public License v3.0
391 stars 69 forks source link

Automação de criação de novos termos e resolução de colisões na geração de IDs #100

Closed rwietter closed 4 months ago

rwietter commented 11 months ago

Colisão de IDs

Tivemos dois pr's para a feature de cards favoritos, o primeiro #77 cria a feature de favoritar cards e coloca uma identificação única sequencial. O pr #87 faz um refactor nessa feature e altera o id sequencial para id baseado no título. Isso é bom pois evita adicionar manualmente o id.

Mas ainda ocorre de o mesmo título servir para conceitos diferentes, ou no caso do gif abaixo onde é removido caracteres que não são letras e o título fica para ambos c e c. Como mostrado no gif abaixo, onde o click no segundo card aciona apenas o primeiro já que ambos tem os mesmo id. Utilizar um UUID dinamicamente também é um problema, pois toda vez que a página for carregada, o id será outro e o id salvo no localStorage não será igual ao id do card.

duplicated-title-id

Para resolver este inconveniente, apliquei um algoritmo de hash simples que gera um id baseado em conteúdo, mais específicamente, a partir da descrição do conceito, que é uma cadeia de caracteres maior. Isso elimina tal problemática e não necessita o uso de dependências externas.

Automação de inserção de termos por CLI

Essa issue também se destina para a discussão de um Script JS executado pelo Node.js com zero dependências externas, no qual já estou desenvolvendo, para adicionar novos conceitos via CLI (Command-line interface).

Por exemplo, para rodar script pode ser com yarn new ou npm run new ou então pnpm run new. Onde new é um script do package.json.

$ npm run new
Digite o valor para title: Lambda
Digite o valor para description: Uma função lambda permite a criação de funções anônimas de primeira classe...
Digite o valor para tags: Conceito
Digite o valor para code: quadrado = lambda x: x**2

Por exemplo, a saída seria o novo termo gravado juntamente com o restante do cards_pt-br.json:

[
   {},
   {},
   {
    "id": "3090d928-b9a7-4fbd-9089-16d265075ef1",
    "title": "Lambda",
    "description": "Uma função lambda permite a criação de funções anônimas de primeira classe...",
    "tags": [
      "Conceito"
    ],
    "content": {
      "code": "quadrado = lambda x: x**2"
    }
  }
]

Nesse caso, o id é gerado automaticamente pelo crypto.randomUUID do Node, não seria necessário usar nenhuma biblioteca externa ao Node.js para fazer isso. Nesse caso, quando o termo for gerado pelo Script, terá por padrão um id e o código do card já trabalhará com este id ao invés do id gerado pelo algoritmo de hash de conteúdo descrito acima. Ou seja, ambos são suportados, podendo criar um novo termo manualmente mudando o código ou gerando a partir do CLI.

As bibliotecas utilizadas do Node são:

const fs = require("node:fs");
const path = require("node:path");
const readline = require("node:readline");
const { stdin: input, stdout: output } = require("node:process");
const crypto = require("node:crypto");

Isso visa automatizar o processo de adição de novos termos. Também visa escalabilidade já que após o arquivo cards_pt-br vier a ter milhares de linhas, torna-se mais pesado para abrir e pode ocorrer erros de comma, bracket, etc.

rwietter commented 11 months ago

@levxyca pode atribuir a mim esse problema. Posso fazer dois Pull Requests, o primeiro corrigindo o problema de colisões do pr #87 e depois podemos discutir sobre o CLI.

Assim que eles forem mesclados, eu resolvo os conflitos se houver e já subo o fix.

freitaschz commented 11 months ago

Magnífico, @rwietter !! Quando abri o PR #87 realmente não me atentei a isso, como no caso dos termos C e C++. Essa issue soma muito ao projeto e vai deixar tudo mais dinâmico.

levxyca commented 11 months ago

sensacional @rwietter! vou atribuir a issue a você! atualmente um dos desafios do diciotech é justamente a inserção de novos termos e isso vai facilitar muito!

levxyca commented 10 months ago

@levxyca pode atribuir a mim esse problema. Posso fazer dois Pull Requests, o primeiro corrigindo o problema de colisões do pr #87 e depois podemos discutir sobre o CLI.

Assim que eles forem mesclados, eu resolvo os conflitos se houver e já subo o fix.

@rwietter o plano dessa semana é dar merge nos PR's referente aos favoritos, o #77 já no jeito e assim que o @thiagofqs atualizar a branch dele dou merge no #77 e no #87 em seguida.