ezequiasOR
perfil do usuáriogithub.com/ezequiasOR
Foto de Ezequias Rocha
Analista de Sistemas e Pesquisador
LSI/UFCG

Ezequias
Rocha

Bacharel em Ciência da Computação pela UFCG e mestrando. No Laboratório de Sistemas de Informação, trabalha como analista de sistemas e pesquisador.

No GitHub: um paper de inferência de vínculos sociais reimplementado em PyTorch, uma API FastAPI com lint e cobertura na esteira de testes, um fix de teclado ABNT num projeto open source de ditado por voz e anos de listas de algoritmos montadas para alunos.

O painel ao lado é a matéria da trilha avançada que ele ensinava. Escolha um intervalo e veja quais nós a operação toca.

no GitHub desde
out/2018
repos públicos
50
seguidores
138
commits autorais
~1.110 em 22 repos

Organização: EssentIA (@EssentIA-Agents), voltada a agentes de IA. Repositórios privados.

Soma em intervalo, atualização em intervalo

tempo: O(log n) por operação memória: 2n−1 nós, n = 8

update soma v a todo a[l..r]. query devolve a soma de a[l..r]. Um nó totalmente coberto não desce: guarda a tag lazy e só empurra para os filhos quando uma operação futura precisar passar por ele. Clique nas folhas para escolher l e r.

Aguardando submissão.array inicial: [5, 2, 7, 1, 3, 8, 4, 6]
  1. Rode um update e depois uma query que corte o mesmo trecho: o push aparece no log.
visitado, parcial coberto inteiro tag lazy pendente soma ainda sem a tag de um ancestral
problemset · 12 problemas

Problemas

Cada projeto como um problema: o enunciado é o que ele resolve, os limites são reais e os casos de teste são as tecnologias que passaram.

#ProblemaTagsAnoCommits dele
AAmizades a partir de check-ins
replication-ANES
pytorchembeddingspaper
2024·
BO apóstrofo que virava til
turbo-whisper
pythonqtwaylandopen source
set/20263
CCRUD que passa no lint antes do teste
fast_zero
fastapipydantic v2pytest
2025·
DStatus de um banco em container
clone-tabnews
next.jspostgresdocker
2023–24·
EPontos de coleta em três plataformas
Ecoleta
typescriptknexexpo
2020124
FDevs por perto, em tempo real
DevRadar
socket.iomongodbgeo
2020123
GAPI testada antes do app
be-the-hero
jestsupertestreact native
2020122
HTrilhas de Aprendizado de Algoritmos
aa-iniciante · aa
segment treelazymovjudge
2020, 2025·
IATAL por paradigma
atal-ufcg
dpgulosografoscodeforces
2021·
JQuizzes de Inteligência Artificial
ia-ufcg
jupyteria
2022–23·
KUm editor escrito em Lua
nvim · tmux
lualsptreesitter
2022–24·
LSeis anos de estudo versionado
Web-Estudos · Python-Estudos · …
javascriptsqljava
2019–25479 + 105

Amizades a partir de check-ins

limite de tempo: 1000 iteraçõeslimite de memória: 5 aspectos × 128 dimensões
Python · PyTorch · 2024replication-ANES ↗doi do artigo ↗

Enunciado

Dadas as trajetórias de check-in de usuários do Foursquare em Nova York, decida quais pares de usuários são amigos. Não existe rótulo de amizade no treino. O sinal vem só de onde, quando e em que tipo de lugar cada pessoa esteve.

O repositório replica Aspect-oriented unsupervised social link inference on user trajectory data (Byun, Choi e Kim, Information Sciences, vol. 626, 2023) em cerca de 2.400 linhas de Python, divididas em 8 módulos.

Entrada

Check-ins com usuário, POI, horário, categoria e coordenadas. O horário vira um de 168 slots semanais (dia da semana × hora), com o fuso corrigido pelo offset em minutos.

168 slots = 7 dias × 24 horas. Destacado: um slot, segunda às 19h.

Saída

Para cada par de usuários, amigo ou não. A avaliação usa os recortes NYC_20, NYC_40, NYC_60, NYC_80 e NYC_100, cada um com pares verdadeiros e falsos separados em treino, validação e teste.

Observações

  • Cinco tabelas de embedding independentes, 128 dimensões cada: usuário, POI, tempo, categoria e geografia. Variantes no código: ANES, ANES_GEO, ANES_GEO_YELP, ANES_GEO_Others e LBGC_v4.
  • Cada check-in vira uma tripla aspecto-orientada, projetada no estilo TransH, TransR e TransD, a família de embeddings de grafo de conhecimento.
  • A perda soma três termos: margin loss, orthogonal loss (mantém o vetor de relação ortogonal ao hiperplano) e norm loss.
  • A amostragem negativa faz busca binária sobre a CDF da distribuição: O(log n) por amostra em vez de varrer tudo.
  • Treino com lr 1e-4, distância L1 e 1000 iterações. t-SNE para olhar o espaço aprendido.

Arquivos da solução

replication-ANES/
├── preprocessing.py
├── ANES.py          treino
├── model.py         776 linhas
├── data.py
├── loss.py          margin · orthogonal · norm
├── projection.py    TransH/R/D
├── graphutils.py
└── utils.py

Veredito

Accepted8 testes
  1. #1PyTorch, 8 módulosok
  2. #2embeddings 5 × 128ok
  3. #3projeção TransH/R/Dok
  4. #4margin lossok
  5. #5orthogonal + norm lossok
  6. #6negativos via CDF, O(log n)ok
  7. #7168 slots com fusook
  8. #8t-SNE do espaçook

O apóstrofo que virava til

limite de tempo: um atalho globallimite de pilha: wtype → xdotool → evdev → PyAutoGUI → clipboard
Python · PyQt6 · set/2026 · contribuição open sourceturbo-whisper ↗

Enunciado

O turbo-whisper é um app de ditado por voz no estilo SuperWhisper: atalho global, waveform na tela, transcrição com OpenAI Whisper em 99 idiomas, interface em PyQt6. Ezequias fez um fork de knowall-ai/turbo-whisper e, num teclado brasileiro, o texto ditado chegava errado.

A causa: o evdev injeta scancodes crus de um teclado US-QWERTY. A tecla física que produz ' no layout americano produz ~ no ABNT. A transcrição estava certa. A digitação, não.

Exemplo

falacaminhotexto digitadoveredito
pau d'arcoevdev, layout ABNTpau d~arco
pau d'arcowtype ou xdotoolpau d'arcoAC

Solução

Digitar por ferramentas que respeitam o layout ativo e deixar o evdev como último recurso. O código detecta Wayland por WAYLAND_DISPLAY ou XDG_SESSION_TYPE, tenta wtype, depois xdotool type --clearmodifiers --delay, e só então cai para evdev, PyAutoGUI e clipboard.

# ordem de tentativas (esquema simplificado; o código real está no commit)
def type_text(text):
    wayland = os.environ.get("WAYLAND_DISPLAY") or \
              os.environ.get("XDG_SESSION_TYPE") == "wayland"
    if wayland and which("wtype"):
        return run(["wtype", text])
    if which("xdotool"):
        return run(["xdotool", "type", "--clearmodifiers",
                    "--delay", DELAY, text])
    # evdev: scancodes US-QWERTY; no ABNT, ' sai como ~
    return evdev(text) or pyautogui(text) or clipboard(text)

Submissões dele

  1. fix: prefer xdotool/wtype over evdev for auto-typingO fix do ABNT descrito ao lado.
  2. feat: language selection, headless recording, clearer offline error+143 linhas em api.py, config.py e main.py.
  3. docs: self-hosted setup notes for Pop!_OSServidor faster-whisper em Docker com CUDA (--gpus all), modelo Systran/faster-whisper-small, porta exposta só em 127.0.0.1, cache do HuggingFace montado, áudio por PipeWire/PortAudio.

Veredito

Accepted7 testes
  1. #1detecção de Waylandok
  2. #2wtypeok
  3. #3xdotool --clearmodifiersok
  4. #4fallback evdev/PyAutoGUI/clipboardok
  5. #5seleção de idioma, headlessok
  6. #6faster-whisper + CUDA em Dockerok
  7. #7porta só em 127.0.0.1ok

CRUD que passa no lint antes do teste

versão: Python 3.14regras de lint: I, F, E, W, PL, PT (preview)
FastAPI · Pydantic v2 · 2025fast_zero ↗

Enunciado

Uma API REST de usuários em FastAPI. O CRUD é o pretexto. O interesse está em como ela é verificada: cada task test roda o lint antes e gera o relatório de cobertura depois, sem ninguém lembrar de rodar nada à mão.

Entrada

Corpo validado por schemas Pydantic v2: UserSchema na entrada, com EmailStr no campo de e-mail.

Saída

UserPublic para um usuário, UserList para a listagem, UserDB para o registro interno. Status codes com HTTPStatus. Usuário inexistente devolve 404 tratado.

Esteira

pre_testlint com Ruff
testpytest + pytest-cov
post_testcoverage html

Encadeado com taskipy. O TestClient do FastAPI vem de uma fixture do pytest.

Ferramentas

  • Poetry para dependências.
  • Ruff com as regras I (imports), F, E, W, PL (pylint) e PT (estilo pytest), modo preview.
  • pytest-cov com relatório HTML.

Veredito

Accepted6 testes
  1. #1schemas Pydantic v2ok
  2. #2EmailStrok
  3. #3404 tratadook
  4. #4ruff I F E W PL PTok
  5. #5pytest + covok
  6. #6taskipy pre/postok

Status de um banco em container

runtime: Node fixado no .nvmrcbanco: Postgres via Docker Compose
Next.js 13 · 2023–24clone-tabnews ↗demo ↗

Enunciado

Um clone do TabNews em Next.js 13, com o cliente pg conversando com um Postgres local que sobe por infra/compose.yaml. O primeiro endpoint é /api/v1/status, e ele nasce coberto por teste de integração em Jest.

O resto é higiene de projeto que costuma ficar para depois: Prettier, .editorconfig, versão do Node travada no .nvmrc e deploy na Vercel.

Veredito

Accepted5 testes
  1. #1Postgres em Docker Composeok
  2. #2GET /api/v1/statusok
  3. #3integração com Jestok
  4. #4Prettier + .editorconfigok
  5. #5deploy na Vercelok

Pontos de coleta em três plataformas

alvos: API, web, mobilecommits: 124
TypeScript · 2020 · NLWEcoleta ↗

Marketplace de pontos de coleta de resíduos por geolocalização, o mesmo domínio em três bases de código.

  • API: Node, Express, Knex com migrations e seeds, SQLite, validação Celebrate/Joi, upload com Multer, CORS.
  • Web: React + TypeScript, mapa com Leaflet/react-leaflet, upload arrasta-e-solta com react-dropzone.
  • Mobile: React Native + Expo, react-native-maps, expo-location, expo-mail-composer, React Navigation.
  1. #1Knex migrationsok
  2. #2Celebrate/Joiok
  3. #3Leaflet + Expo mapsok

Devs por perto, em tempo real

consulta: geoespacialcommits: 123
2020 · Semana OmnistackDevRadar ↗

Cadastra devs pela API do GitHub e acha quem está perto. Quando alguém novo entra no raio, os clientes conectados ficam sabendo na hora.

  • Backend: Express, MongoDB/Mongoose com consultas geoespaciais, Socket.io, axios para a API do GitHub.
  • Web: React.
  • Mobile: Expo com mapas, localização, WebView e socket.io-client.
  1. #1consulta geo no Mongook
  2. #2Socket.io pushok
  3. #3API do GitHubok

API testada antes do app

testes: Jest + Supertestcommits: 122
2020 · Semana Omnistackbe-the-hero ↗

API em Express + Knex + SQLite, validada com Celebrate e exercitada por testes HTTP com Supertest. cross-env separa o ambiente de teste. Por cima, um front em React e um app React Native/Expo.

  1. #1Jest + Supertestok
  2. #2Celebrateok
  3. #3React + Expook

Quizzes de Inteligência Artificial

formato: Jupyter
2022–23 · UFCGia-ufcg ↗

Os quizzes da disciplina de Inteligência Artificial na UFCG, resolvidos em notebooks Jupyter.

Um editor escrito em Lua

ambiente: Neovim + tmux

Config de Neovim escrita em Lua, mais a do tmux. Plugins carregados:

LSPTelescopeTreesitterHarpoonFugitiveUndotreeTroubleZen Moderefactoringcloak

Seis anos de estudo versionado

Web-Estudos: 844 commits, 479 dele
  • Web-Estudos (2019 a 2025): JS do zero a map/filter/reduce, imperativo vs declarativo, AJAX com XHR, fetch, axios e jQuery, Express, Gulp, Webpack, Vue, React, SQL com joins e agregação, MongoDB com lookup.
  • Python-Estudos (105 commits dele): consultas parametrizadas, incluindo “selecionar sem SQL injection”, CRUD, paginação com limit/offset.
  • ibdmd: datasets para BI, lojas × gerentes × vendas.
  • Java na UFCG (2020): coisa (Controle Institucional da Situação Acadêmica), agenda-de-contatos, controle-de-alunos.
  • audio-speed-controller (2020): extensão que acelera áudios do WhatsApp Web. Mais bin2dec, casa-criativa e doe (MaratonaDev).
problema H · editorial

Editorial

Ele montou trilhas semanais de Aprendizado de Algoritmos, com listas no vJudge, e gravou vídeos resolvendo as questões para os alunos.

Trilha iniciante

aa-iniciante ↗
  1. etapa 01
    Ad hocProblema sem técnica nomeada: ler com cuidado e simular.
  2. etapa 02
    Two pointersDois índices andando no mesmo array em vez de um laço dentro do outro.
  3. etapa 03
    Soma acumuladaPrefixos para responder soma de intervalo em O(1).
  4. etapa 04
    Busca bináriaNo array e na resposta.
  5. etapa 05
    Estruturas de dadosFila, heap, pilha, set e mapa.
  6. etapa 06
    Teoria dos númerosGCD/LCM e crivo.
  7. etapa 07
    Aritmética modularE exponenciação binária.

Trilha avançada

aa ↗
  1. etapa 01
    Segment TreeConsulta e atualização pontual em O(log n). A soma acumulada da etapa 03 da iniciante deixa de servir quando o array muda.
  2. etapa 02
    Lazy PropagationAtualização em intervalo sem descer até as folhas. É o problema 0 lá em cima.
  3. etapa 03
    Square Root DecompositionBlocos de tamanho √n e o algoritmo de Mo para consultas offline.

A trilha avançada ganhou nova turma em 2025, no repositório aa. A iniciante começou em 2020.

I · ATAL por paradigma

Análise e Técnicas de Algoritmos, UFCG, 2021. Soluções de problemas do Codeforces organizadas pela técnica que resolve. atal-ufcg ↗

01Força brutaenumerar tudo cabe no limite
02Backtrackingenumerar e podar cedo
03Gulosoa escolha local que não se arrepende
04Divisão e conquistapartir, resolver, juntar
05Programação dinâmicasubproblema guardado uma vez
06GrafosBFS e DFS
status · mais recentes primeiro

Submissões

A linha do tempo dos repositórios. Datas no nível de ano, exceto onde o commit tem mês conhecido.

#QuandoRepositórioSubmissãoVeredito
2026
22set/2026turbo-whisperfix: prefer xdotool/wtype over evdev for auto-typingo apóstrofo volta a ser apóstrofo no ABNT → AC
21set/2026turbo-whisperfeat: language selection, headless recording, clearer offline error+143 linhasAC
20set/2026turbo-whisperdocs: self-hosted setup notes for Pop!_OSfaster-whisper em Docker com CUDAAC
2025
192025fast_zeroAPI FastAPI com Ruff, pytest-cov e taskipyAC
182025aanova turma de algoritmosAC
172025Web-Estudosúltimo ano do repositório aberto em 2019479 commits dele no totalAC
2024
162024replication-ANESreplicação do paper em PyTorchpesquisaAC
152024tmuxconfig do tmuxAC
2023
142023–24clone-tabnewsNext.js + Postgres em Docker Compose, teste de integraçãoAC
2022
132022–23ia-ufcgquizzes de IA na UFCGAC
122022–23nvimNeovim configurado em LuaAC
2021
112021atal-ufcgCodeforces por paradigmaAC
2020
102020aa-iniciantecomeça a ensinar algoritmosAC
92020EcoletaNLW: API, web e mobile em TypeScript124 commits deleAC
82020DevRadarSemana Omnistack: Socket.io + MongoDB geo123 commits deleAC
72020be-the-heroSemana Omnistack: Jest + Supertest122 commits deleAC
62020audio-speed-controlleracelera áudios do WhatsApp WebAC
52020coisaJava na UFCGcom agenda-de-contatos e controle-de-alunosAC
2019
42019Python-Estudosconsultas parametrizadas, CRUD, paginação105 commits deleAC
32019Web-Estudosprimeiro commit: JavaScript do zeroAC
2018
2out/2018ezequiasORconta criada no GitHubAC
não é rating

Commits por ano

O formato lembra um gráfico de rating, mas o eixo é contagem de commits autorais em 22 repositórios próprios, sem forks. Total de cerca de 1.110.

Commits / ano

22 repos próprios · sem forks · 2026 só tem a contribuição open source

Commits por ano: 2019, 21; 2020, 207; 2021, 200; 2022, 256; 2023, 172; 2024, 193; 2025, 61; 2026, 3.

Volume por linguagem

bytes de código nos repos próprios · volume, não domínio

  • JavaScript828 KB
  • CSS392 KB
  • HTML330 KB
  • Jupyter294 KB
  • Python223 KB
  • TypeScript55 KB
  • Java36 KB
  • Lua11 KB
  • Vue11 KB
  • SQL6 KB

Escala linear, em bytes. Mede quanto código existe, não quanto ele sabe: muito do JavaScript, CSS e HTML vem dos repositórios de estudo.

tags

Stack

Só o que aparece no código dos repositórios.

IA & dados

PythonPyTorchscikit-learnPandasNumPyJupyterTransH/R/DWhisperfaster-whisper

Backend

FastAPIPydanticNode.jsExpressNext.js API routesKnexMongooseSocket.io

Frontend & mobile

TypeScriptReactReact NativeExpoNext.jsLeafletVue

Bancos

PostgreSQLSQLiteMongoDBMySQL/SQL

Qualidade & infra

pytestJestSupertestRuffPrettierPoetryDockerDocker ComposeCUDAVercelGit

Ambiente

Linux (Pop!_OS)Neovim/LuatmuxWayland/X11
enviar mensagem

Contato

O código está aberto. A conversa começa por um destes quatro.

Os 50 repositórios públicos estão no GitHub, com o histórico de cada problema desta página.