Sem categoria
Exercicios de revisado

1. Criar tabela

CREATE TABLE usuarios (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nome TEXT NOT NULL,
email TEXT,
idade INTEGER,
ativo INTEGER DEFAULT 1,
dtcad TEXT DEFAULT CURRENT_TIMESTAMP
);

No SQLite, os tipos mais usados são:

INTEGER
TEXT
REAL
BLOB
NUMERIC

2. Inserir dados

INSERT INTO usuarios (nome, email, idade)
VALUES ('Marcelo', 'marcelo@email.com', 45);

Inserir vários registros:

INSERT INTO usuarios (nome, email, idade)
VALUES
('João', 'joao@email.com', 30),
('Maria', 'maria@email.com', 25);

3. Consultar dados

SELECT * FROM usuarios;

Selecionar campos específicos:

SELECT id, nome, email
FROM usuarios;

Com filtro:

SELECT *
FROM usuarios
WHERE ativo = 1;

Com ordenação:

SELECT *
FROM usuarios
ORDER BY nome ASC;

Limitar resultados:

SELECT *
FROM usuarios
LIMIT 10;

4. Atualizar dados

UPDATE usuarios
SET nome = 'Marcelo Maurin',
email = 'novo@email.com'
WHERE id = 1;

Sempre use WHERE, senão atualiza todos os registros.


5. Excluir dados

DELETE FROM usuarios
WHERE id = 1;

Excluir todos os registros:

DELETE FROM usuarios;

6. Criar índice

CREATE INDEX idx_usuarios_nome
ON usuarios (nome);

Índice único:

CREATE UNIQUE INDEX idx_usuarios_email
ON usuarios (email);

7. Alterar tabela

Adicionar coluna:

ALTER TABLE usuarios
ADD COLUMN telefone TEXT;

Renomear tabela:

ALTER TABLE usuarios
RENAME TO pessoas;

Renomear coluna:

ALTER TABLE pessoas
RENAME COLUMN telefone TO celular;

8. Apagar tabela

DROP TABLE usuarios;

Apagar somente se existir:

DROP TABLE IF EXISTS usuarios;

9. Verificar tabelas existentes

SELECT name
FROM sqlite_master
WHERE type = 'table';

Ver estrutura da tabela:

PRAGMA table_info(usuarios);

10. Chave estrangeira

CREATE TABLE ordens_servico (
id INTEGER PRIMARY KEY AUTOINCREMENT,
id_usuario INTEGER NOT NULL,
descricao TEXT,
dtcad TEXT DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (id_usuario) REFERENCES usuarios(id)
);

Ativar suporte a chave estrangeira:

PRAGMA foreign_keys = ON;

11. JOIN entre tabelas

SELECT 
os.id,
os.descricao,
u.nome AS usuario
FROM ordens_servico os
LEFT JOIN usuarios u ON u.id = os.id_usuario;

12. Funções úteis

Contar registros:

SELECT COUNT(*) FROM usuarios;

Maior valor:

SELECT MAX(id) FROM usuarios;

Menor valor:

SELECT MIN(id) FROM usuarios;

Média:

SELECT AVG(idade) FROM usuarios;

Soma:

SELECT SUM(idade) FROM usuarios;

13. Agrupamento

SELECT ativo, COUNT(*) AS total
FROM usuarios
GROUP BY ativo;

Com filtro no agrupamento:

SELECT ativo, COUNT(*) AS total
FROM usuarios
GROUP BY ativo
HAVING COUNT(*) > 5;

14. Busca com LIKE

SELECT *
FROM usuarios
WHERE nome LIKE '%Marcelo%';

Começa com:

SELECT *
FROM usuarios
WHERE nome LIKE 'Mar%';

Termina com:

SELECT *
FROM usuarios
WHERE nome LIKE '%lo';

15. Datas no SQLite

Data atual:

SELECT date('now');

Data e hora atual:

SELECT datetime('now');

Data/hora local:

SELECT datetime('now', 'localtime');

Usando em tabela:

INSERT INTO usuarios (nome, dtcad)
VALUES ('Marcelo', datetime('now', 'localtime'));

16. Transação

BEGIN TRANSACTION;INSERT INTO usuarios (nome) VALUES ('Teste 1');
INSERT INTO usuarios (nome) VALUES ('Teste 2');COMMIT;

Cancelar:

ROLLBACK;

17. UPSERT

Insere ou atualiza se já existir:

INSERT INTO usuarios (id, nome, email)
VALUES (1, 'Marcelo', 'marcelo@email.com')
ON CONFLICT(id) DO UPDATE SET
nome = excluded.nome,
email = excluded.email;

18. Apagar dados e reiniciar AUTOINCREMENT

DELETE FROM usuarios;DELETE FROM sqlite_sequence
WHERE name = 'usuarios';

19. Ver SQL usado para criar tabela

SELECT sql
FROM sqlite_master
WHERE type = 'table'
AND name = 'usuarios';

20. Modelo básico para seus sistemas

CREATE TABLE exemplo (
id INTEGER PRIMARY KEY AUTOINCREMENT,
descricao TEXT NOT NULL,
ativo INTEGER DEFAULT 1,
dtcad TEXT DEFAULT CURRENT_TIMESTAMP,
dtalt TEXT
);

Para alterar:

UPDATE exemplo
SET descricao = 'Nova descrição',
dtalt = datetime('now', 'localtime')
WHERE id = 1;

Esse é o conjunto principal que você mais vai usar no SQLite com Lazarus, PHP ou Python.

Sem categoria
Trabalho Elementos de Eletronica

Resolução – Experimento 1 (LED com 6 V)

Dados:
V_fonte = 6 V • LED: V_F = 1,8 V @ I = 20 mA (0,02 A)

a) Valor do resistor R

b) Resistor comercial mais próximo

Séries usuais (E12/E24): 220 Ω é o valor mais próximo.

c) Montagem

Ligue o resistor em série com o LED (polaridade do LED correta: anodo no resistor, catodo ao retorno).

d) Corrente no LED a partir da tensão medida no resistor

Meça VRV_RVR​ nos terminais do resistor e use:

Ex.: com R = 220 Ω, se

Observações rápidas

  • Dissipação no resistor (com 220 Ω):
  • Use 1/4 W para folga.
  • Se o LED ficar muito brilhante, pode usar 270 Ω para reduzir a corrente (~15–16 mA).

Experimento 2 — Retificador de Onda Completa (ponte com 1N4007, Trafo 127→12 Vrms, RL=10 kΩ)

Dados de base (60 Hz – Brasil)

a) Montagem

Ponte de diodos no secundário de 12 Vrms; + e da ponte vão para RL=10 kΩR_L=10\ \text{k}\OmegaRL​=10 kΩ. Primário em 127 Vrms. (1N4007 serve folgado.)

b) Formas de onda e funcionamento

  • Entrada (secundário): seno de 12 Vrms, 60 Hz.
  • Saída (sem capacitor): onda retificada de onda completa (módulo do seno), 120 Hz; sempre positiva.
  • Função dos diodos: em cada semiciclo, dois conduzem e dois ficam reversamente polarizados, invertendo a polaridade negativa para positiva no resistor.

c) Medições no osciloscópio (sem capacitor)

  • Pico (saída):15,6 V (ver acima).
  • Valor DC (médio) da saída:
  • RMS (saída): para onda retificada ideal é igual ao VrmsV_{rms}Vrms​ do secundário; com diodos cai levemente. Na prática você verá ~11–12 Vrms.

Dica de medição: referencie o canal ao da ponte (secundário isolado, então o GND do scope é seguro no secundário).

d) Cálculos teóricos (sem capacitor) para comparação

e) Com capacitor C=10 μFC=10\,\mu\text{F}C=10μF em paralelo com RLR_LRL​

O capacitor carrega no pico (~15,6 V) e descarga por RLR_LRL​ entre picos ⇒ tensão quase contínua com ripple em 120 Hz.

f) Formas de onda com capacitor

  • Saída: quase contínua perto do pico, com dente de serra (ripple) pequeno a 120 Hz.
  • O capacitor “suporta” a tensão quando a senoide cai, reduzindo a ondulação.

g) Medição do ripple

No scope, AC-couple (ou subtraia o valor médio) e leia o Vpp da ondulação a 120 Hz.

h) Cálculo do ripple (aprox.) e comparação

Para retificação de onda completa:

Checklist rápido de resultados esperados

Sem categoria
Trabalho de Computação para lancamento de dados
class LancadorDeDados:
def init(self, nro_lancamentos):
self.nro_lancamentos = nro_lancamentos
self.nro_ocorrencias = 6 # dado com 6 faces

def calculaPercentual(self):
"""Calcula o percentual usando a fórmula: (1/nro_ocorrencias)^nro_lancamentos."""
return (1 / self.nro_ocorrencias) ** self.nro_lancamentos * 100

def mostrar_percentual(self):
"""Mostra o resultado do cálculo."""
percentual = self.calculaPercentual()
print(f"Lançamentos: {self.nro_lancamentos} → Percentual: {percentual:.4f}%")

==========================

Programa principal no Colab

==========================

for n in range(1, 6): # Calcula de 1 até 5 lançamentos consecutivos
dado = LancadorDeDados(nro_lancamentos=n)
dado.mostrar_percentual()

🎲 Probabilidade de Lançamentos Consecutivos de um Dado

Este programa calcula a probabilidade percentual de ocorrer uma sequência específica de resultados ao lançar um dado de 6 faces diversas vezes de forma consecutiva.

Ele utiliza a fórmula de probabilidade para eventos independentes:

Percentual = (1 / nro_faces) ^ nro_lancamentos × 100


🧠 Conceito por trás do cálculo

Cada lançamento de um dado justo de 6 faces possui probabilidade igual de 1/6 para cada face.

Como os lançamentos são eventos independentes, a chance de obter o mesmo resultado consecutivamente é dada pela multiplicação das probabilidades.

Para transformar isso em percentual, multiplicamos o resultado por 100.

Exemplos:

1 lançamento:

P = (1 / 6) × 100 ≈ 16,67%

2 lançamentos consecutivos iguais:

P = (1 / 6)² × 100 ≈ 2,78%

3 lançamentos consecutivos iguais:

P = (1 / 6)³ × 100 ≈ 0,46%

🖥️ O que o programa faz

  1. Define uma classe chamada LancadorDeDados.
  2. Recebe como parâmetro o número de lançamentos consecutivos que será analisado.
  3. Aplica a fórmula de probabilidade usando o número de faces do dado (6) e a quantidade de lançamentos informada.
  4. Exibe o resultado em percentual.

📌 Saída esperada

O programa mostra o percentual de chance para cada quantidade de lançamentos consecutivos:

Testando o resultado

Neste programa testaremos se o resultado apresentado, condiz com a prática.

A idéia é lançar o dado muitas vezes e acompanhar as estatísticas de seu lançamento.

class LancadorDeDados:
def init(self):
self.resultados = [] # Lista para armazenar os lançamentos

def registrar_lancamento(self, valor):
    """Registra o valor digitado pelo usuário."""
    if 1 <= valor <= 6:
        self.resultados.append(valor)
    else:
        print("⚠️ Valor inválido! Digite apenas números de 1 a 6.")

def calculaPercentual(self, ocorrencias, total):
    """Calcula o percentual de ocorrência."""
    return (ocorrencias / total) * 100 if total > 0 else 0

def mostrar_estatistica(self):
    """Exibe a estatística atualizada após cada lançamento."""
    total = len(self.resultados)
    print(f"\n📊 Estatística após {total} lançamentos:")
    for face in range(1, 7):
        ocorrencias = self.resultados.count(face)
        percentual = self.calculaPercentual(ocorrencias, total)
        print(f"Face {face}: {ocorrencias} ocorrências ({percentual:.2f}%)")

def mostrar_relatorio_final(self):
    """Exibe o relatório final consolidado."""
    print("\n✅ Relatório Final:")
    self.mostrar_estatistica()

==========================

Programa principal no Colab

==========================

dado = LancadorDeDados()

print("🎲 Digite os valores obtidos no lançamento do dado (1 a 6).")
print("Digite 0 para encerrar.\n")

while True:
valor = int(input("Digite o valor do dado (1 a 6) ou 0 para sair: "))
if valor == 0:
break
dado.registrar_lancamento(valor)
dado.mostrar_estatistica()

Relatório final consolidado

dado.mostrar_relatorio_final()

🎲 Programa de Estatística de Lançamentos de Dado

Este programa permite registrar manualmente os resultados de lançamentos de um dado e calcular a estatística de frequência e percentual de cada face (1 a 6) em tempo real.
O programa segue um loop contínuo onde o usuário digita o valor obtido em cada lançamento, e ao digitar 0 o sistema encerra e apresenta o relatório final consolidado.


🧠 Conceito

A estatística apresentada pelo programa é baseada na frequência relativa de cada face, calculada como:


Percentual da Face = (Número de ocorrências da face / Total de lançamentos) × 100

Isso permite observar a distribuição das faces e como ela evolui à medida que mais lançamentos são registrados.


🖥️ Funcionalidades

  • O programa é estruturado com a classe LancadorDeDados.
  • Permite entradas manuais dos resultados dos lançamentos do dado.
  • A cada número digitado, a estatística de todas as faces (1 a 6) é atualizada e exibida.
  • O programa continua recebendo valores até que o usuário digite 0.
  • Ao encerrar, é exibido um relatório final consolidado.

🔑 Métodos da Classe

__init__(self)

  • Inicializa a lista self.resultados para armazenar os lançamentos.

registrar_lancamento(self, valor)

  • Registra o valor digitado pelo usuário (de 1 a 6).
  • Ignora e alerta se o valor for inválido.

calculaPercentual(self, ocorrencias, total)

  • Calcula o percentual de ocorrências de uma face específica em relação ao total de lançamentos.

mostrar_estatistica(self)

  • Mostra a estatística atualizada (ocorrências e percentuais) após cada lançamento digitado.

mostrar_relatorio_final(self)

  • Exibe o relatório final consolidado com os resultados e percentuais finais de todas as faces.

🎯 Tarefa: Aplicando Estatística com Lançamentos de Dado

Objetivo:

Utilizar o programa de estatística de lançamentos de dado para registrar resultados reais e comparar com os valores teóricos de probabilidade, entendendo como a frequência relativa se aproxima da probabilidade real à medida que aumentamos o número de lançamentos.


📝 Instruções:

  1. Acesse e execute o programa no Google Colab que registra os lançamentos de um dado e calcula as estatísticas.
  2. Simule lançamentos reais:
    • Use um dado físico (se disponível) ou um simulador online.
    • Digite no programa o resultado de cada lançamento.
    • Continue lançando até atingir diferentes tamanhos de amostra:
      • 10 lançamentos
      • 30 lançamentos
      • 50 lançamentos
      • 100 lançamentos
  3. Observe como os percentuais calculados pelo programa se aproximam dos valores teóricos (aproximadamente 16,67% para cada face).
  4. Finalize digitando “0” para encerrar e visualizar o relatório final consolidado.

🔎 Reflexão:

  • Compare os resultados obtidos para amostras pequenas (10 ou 30 lançamentos) com os resultados para amostras grandes (50 ou 100 lançamentos).
  • Responda:
    • Quanto maior o número de lançamentos, os percentuais ficaram mais próximos do valor esperado (16,67%)?
    • Por que isso acontece?

📌 Conclusão Esperada:

Os alunos devem perceber que:

  • Com poucos lançamentos, a distribuição é mais irregular e os percentuais variam bastante.
  • Com mais lançamentos (maior amostra), os percentuais tendem a se estabilizar e se aproximar dos valores teóricos de probabilidade.

Isso demonstra, na prática, a Lei dos Grandes Números, um princípio fundamental da estatística e probabilidade.

Google Colab Exemplo

Sem categoria
Ferramentas de Treinamento para Redes Neurais: Automatizando Coleta, Processamento e Organização de Dados

O desenvolvimento de modelos de inteligência artificial depende diretamente da qualidade e da diversidade dos dados utilizados para treinamento. Entretanto, a construção dessas bases costuma ser um grande desafio, exigindo ferramentas específicas para coleta, análise e organização de dados multimodais (texto, áudio, vídeo, imagens, documentos e produtos comerciais).

Pensando nessa necessidade, foi criado o projeto Ferramentas de Treinamento para Redes Neurais, um pacote integrado que oferece automação e gestão de dados para pesquisa, treinamento e experimentação em IA.


🎯 Objetivo do Projeto

O projeto visa fornecer um ecossistema unificado para coleta e preparação de dados de treinamento, eliminando processos manuais e descentralizados.

Ele integra diferentes módulos que atuam em conjunto:

  • Captura de voz e chatbot inteligente: interação com linguagem natural, registrando perguntas e respostas no banco.
  • Coleta de vídeos e transcrições do YouTube: extração de legendas ou áudio com filtros e segmentação automática.
  • Análise e processamento de documentos: leitura automatizada de PDFs, textos, planilhas e arquivos DOCX.
  • Monitoramento de e-mails e POP3: captura de mensagens e anexos para análise contextual.
  • Busca de produtos no Mercado Livre: extração de informações técnicas e comerciais.
  • Captura de imagens e faces via câmera ou Kinect: armazenamento em banco para análise visual.
  • Interface web integrada (Streamlit): gerenciamento visual das bases e resultados em tempo real.

🔑 Embasamento e Necessidade

A IA moderna exige grandes volumes de dados rotulados e variados para treinar modelos capazes de generalizar bem em situações reais.
Muitas vezes, os dados disponíveis estão dispersos em fontes distintas, sem padronização ou acessibilidade prática. Isso gera problemas como:

  • Alto tempo de preparação de dados antes de qualquer experimento.
  • Falta de rastreabilidade sobre a origem e o processamento dos dados.
  • Complexidade na integração de múltiplas fontes (vídeo, áudio, texto e imagem).

Além disso, empresas e pesquisadores que não possuem infraestrutura especializada têm dificuldade para replicar pipelines consistentes de treinamento de modelos.

Este projeto surge como uma solução modular e acessível, reunindo automação e banco de dados estruturado em MySQL, simplificando a criação de datasets ricos para experimentos de IA.


✅ Vantagens do Projeto

  1. 🔗 Integração Completa:
    Todos os módulos (voz, vídeo, documentos, e-mails e produtos) compartilham uma única base de dados estruturada, facilitando cruzamento e análise.
  2. 🖥️ Interface Web Gerencial:
    Desenvolvida em Streamlit, permite operar todas as funções do sistema sem linha de comando, tornando-o amigável até para usuários não técnicos.
  3. 📊 Dados Organizados e Escaláveis:
    O uso de MySQL garante integridade, rastreabilidade e flexibilidade para consultas avançadas.
  4. ⚡ Automação Extrema:
    Desde a captura de dados multimodais até a classificação e preparação final para treinamento, tudo é automatizado.
  5. 🎧 Interação em Voz com IA:
    O assistente de voz integrado permite perguntas naturais e devolve respostas faladas, criando e testando modelos e protótipos tanto falados como escritos em chatbot.
  6. 🌐 Código Aberto e Extensível:
    O repositório é público (GitHub), permitindo colaboração e personalização para contextos específicos.

🧠 Vantagens do Modelo de Uso

  • Preparação rápida para treinamentos em NLP, visão computacional e multimodalidade.
  • Compatibilidade com frameworks como TensorFlow, PyTorch e spaCy, que podem consumir diretamente as saídas organizadas do banco.
  • Facilidade para prototipar modelos e validar hipóteses rapidamente, sem esforço manual na coleta e limpeza dos dados.
  • Ambiente controlado e replicável, essencial para projetos acadêmicos e P&D corporativo.

🔗 Repositório Oficial

O código-fonte completo está disponível no GitHub:
➡️ https://github.com/marcelomaurin/TreinamentosIA


🖼️ Diagrama do Projeto

Diagrama do Projeto

Próximos passos

Criação e teste em diversos modelos de IA online e offline.

Melhora dos processos de classificação de documentos, palavras chaves de busca, referencias , síntese.

Uso de IAs para gerar melhora na qualidade dos dados.

🚀 Conclusão

O projeto Ferramentas de Treinamento para Redes Neurais democratiza a preparação de datasets e a experimentação em IA, permitindo que desenvolvedores, pesquisadores e equipes técnicas acelerem seu ciclo de desenvolvimento de modelos.

Com uma estrutura modular, aberta e escalável, ele resolve um dos principais gargalos da área: a obtenção e organização de dados para treinar inteligências artificiais robustas e eficazes.

nodejs
Criando um projeto no nodejs

Para criar um novo projeto use o npm

npm create vite@latest
  1. Indique o nome do projeto. [seu projeto]
  2. Selecione React
  3. TypeScript + SWC

Para rodar

cd pasta do projeto

npm install

npm run dev

Permitindo que o nodejs rode em outras máquinas em DEV

Na pasta da aplicação vite.config.ts

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [react()],
  server: {
    host: '0.0.0.0',    // ✅ permite acesso externo
    port: 5173,          // ✅ porta padrão (pode mudar)
  }
})

Agora é necessário desbloquear a porta no linux.

sudo ufw allow 5173 # ou
sudo ufw disable # (temporário)

Por fim, é só roda

npm run dev

Agora é só chamar na outra máquina pelo browser.

Sem categoria
Introdução a criação de Fluxogramas

Introdução

O Fluxograma é uma representação gráfica de um processo, onde são descritas as etapas, decisões e o fluxo de execução de forma sequencial. Amplamente utilizado na administração, engenharia, programação e até na educação, ele é uma ferramenta poderosa para visualizar processos e melhorar a tomada de decisões.

Neste artigo, você vai entender o que é um fluxograma, quais são os tipos, os principais símbolos utilizados e como criar um fluxograma eficiente.


O que é um Fluxograma?

O Fluxograma é um tipo de diagrama que utiliza símbolos padronizados para representar o fluxo de um processo ou sistema. Ele descreve de maneira simples e objetiva:

  • A sequência de atividades.
  • Os pontos de decisão.
  • As entradas e saídas do processo.

É ideal para mapear processos complexos e identificar gargalos, redundâncias ou oportunidades de melhoria.


Para que serve um Fluxograma?

✅ Visualizar e entender processos.
✅ Padronizar procedimentos.
✅ Melhorar a eficiência e produtividade.
✅ Facilitar treinamentos e comunicação.
✅ Apoiar na tomada de decisões.


Principais tipos de Fluxograma

1. Fluxograma de Processo

O mais comum. Mostra a sequência lógica das etapas de um processo, desde o início até o fim.

2. Fluxograma de Documentos

Evidencia o fluxo de documentos dentro de um processo.

3. Fluxograma de Sistema

Descreve o fluxo de dados entre os componentes de um sistema.

4. Fluxograma de Programação

Muito usado na lógica de programação para desenhar algoritmos antes de codificar.


Símbolos principais do Fluxograma

SímboloSignificado
Início ou fim do processo
Atividade ou tarefa
Decisão ou condição
⬇️Direção do fluxo

Além desses, podem ser usados outros símbolos dependendo da complexidade do processo e da norma seguida (ANSI, ISO, BPMN).


Como fazer um Fluxograma?

  1. Defina o objetivo do fluxograma.
  2. Liste todas as etapas do processo.
  3. Organize as etapas na sequência correta.
  4. Escolha os símbolos adequados para cada tipo de ação.
  5. Desenhe o fluxograma, conectando as etapas com setas.
  6. Revise para garantir que todas as etapas estão corretas e bem representadas.

Exemplo prático de Fluxograma

Exemplo: Processo de compra online

  1. Cliente escolhe produto.
  2. Cliente adiciona ao carrinho.
  3. Cliente realiza o pagamento.
  4. Sistema verifica pagamento:
     → Se aprovado: envia confirmação.
     → Se negado: solicita novo pagamento.

Esse exemplo poderia ser desenhado com símbolos, mostrando claramente o fluxo de decisão e ação.


Melhores ferramentas para criar Fluxogramas

  • Lucidchart
  • draw.io (diagrams.net)
  • Microsoft Visio
  • Canva (para fluxogramas mais visuais)
  • Bizagi (para fluxogramas BPMN)

Vantagens do uso de Fluxogramas

✅ Facilita o entendimento de processos complexos.
✅ Reduz falhas e retrabalhos.
✅ Ajuda na padronização de processos.
✅ Suporta auditorias e certificações de qualidade.


Conclusão

O Fluxograma é uma ferramenta indispensável para qualquer pessoa ou empresa que queira otimizar processos e melhorar a comunicação interna. Com ele, fica muito mais fácil identificar pontos de melhoria e garantir que todas as etapas sejam executadas corretamente.

Sem categoria
Diagrama de Sequência

O que é um Diagrama de Sequência? Guia Completo com Exemplos

Introdução

O Diagrama de Sequência é um dos principais diagramas utilizados na modelagem de sistemas orientados a objetos, especialmente na UML (Unified Modeling Language). Ele é fundamental para descrever como os objetos interagem entre si ao longo do tempo, representando a ordem das mensagens e a sequência de eventos em um determinado cenário.

Neste artigo, você vai entender o que é um diagrama de sequência, sua importância, principais elementos, como criar um e exemplos práticos.


O que é um Diagrama de Sequência?

O Diagrama de Sequência é um tipo de diagrama de interação que ilustra como os processos operam com um outro e em que ordem. Ele é particularmente útil para visualizar:

  • A ordem das mensagens entre objetos.
  • O fluxo de controle do sistema.
  • A linha do tempo dos eventos.

Cada elemento do diagrama é posicionado de maneira vertical e cronológica, com as mensagens fluindo de cima para baixo.


Para que serve o Diagrama de Sequência?

Este diagrama é utilizado principalmente para:

✅ Modelar o fluxo de interações em um caso de uso.
✅ Entender e documentar o comportamento do sistema.
✅ Identificar responsabilidades e dependências entre classes.
✅ Auxiliar na implementação de funcionalidades complexas.


Elementos principais de um Diagrama de Sequência

1. Participantes (Actors ou Objects)

São os elementos que interagem no sistema, como classes, objetos ou usuários.

2. Linha de Vida (Lifeline)

Representa a existência de um objeto durante a interação. É desenhada como uma linha vertical.

3. Mensagens

São as comunicações entre os participantes, representadas por setas horizontais. Podem ser chamadas de métodos, retornos de dados ou sinais.

4. Ativação

Indica quando um objeto está ativo ou executando uma operação, geralmente ilustrado por um retângulo fino sobre a linha de vida.

5. Notas e Condições

Adicionam detalhes ou restrições, como loops, condições ou alternativas.


Como criar um Diagrama de Sequência?

  1. Identifique o cenário que será modelado.
  2. Liste os participantes que interagem no cenário.
  3. Defina a sequência de mensagens entre os participantes.
  4. Desenhe as linhas de vida para cada participante.
  5. Inclua as mensagens, ativando e desativando objetos conforme necessário.
  6. Adicione detalhes como loops, condições ou retornos.

Exemplo de Diagrama de Sequência

Imagine o seguinte cenário: um cliente faz login em um sistema.

Participantes:

  • Cliente
  • Interface de Login
  • Sistema de Autenticação
  • Banco de Dados

Sequência:

  1. Cliente solicita autenticação.
  2. Interface de Login encaminha os dados ao Sistema de Autenticação.
  3. Sistema de Autenticação consulta o Banco de Dados.
  4. Banco de Dados retorna a validação.
  5. Sistema de Autenticação envia o resultado à Interface de Login.
  6. Interface de Login informa o Cliente.

Este exemplo pode ser representado visualmente em um diagrama de sequência simples, facilitando o entendimento do fluxo.


Melhores ferramentas para criar Diagramas de Sequência

  • Lucidchart
  • draw.io (diagrams.net)
  • Visual Paradigm
  • StarUML
  • PlantUML (ideal para quem prefere código)

Conclusão

O Diagrama de Sequência é uma ferramenta essencial na modelagem de sistemas, proporcionando uma visão clara das interações entre objetos e facilitando a comunicação entre analistas, desenvolvedores e stakeholders.

Se você trabalha com análise de sistemas ou desenvolvimento de software, dominar a criação e interpretação de diagramas de sequência é um diferencial competitivo!

Python SQLite
Finalizando a web api

Tutorial: Web Services em Python para Todas as Tabelas da Loja de Açaí

Neste tutorial, aprenderemos a criar uma API REST simples em Python utilizando o Flask para consumir as tabelas do banco de dados de uma loja de açaí. Serão abordadas as tabelas:

  • Clientes
  • Produtos
  • Materiais
  • Vendas
  • Consumo

Utilizaremos os verbos HTTP GET, POST, PUT e DELETE para realizar operações de leitura, criação, atualização e exclusão dos registros.


Requisitos

  • Python 3 instalado
  • Pacote Flask (instalável via pip install flask)
  • Banco de dados SQLite (loja_acai.db) já criado com as tabelas definidas conforme o tutorial anterior.

Estrutura das Tabelas

Para referência, veja abaixo a estrutura básica de cada tabela:


-- Clientes:
CREATE TABLE clientes (
  id_cliente INTEGER PRIMARY KEY AUTOINCREMENT,
  nome TEXT NOT NULL,
  telefone TEXT,
  email TEXT
);

-- Produtos:
CREATE TABLE produtos (
  id_produto INTEGER PRIMARY KEY AUTOINCREMENT,
  nome TEXT NOT NULL,
  preco REAL NOT NULL
);

-- Materiais:
CREATE TABLE materiais (
  id_material INTEGER PRIMARY KEY AUTOINCREMENT,
  nome TEXT NOT NULL,
  custo REAL
);

-- Vendas:
CREATE TABLE vendas (
  id_venda INTEGER PRIMARY KEY AUTOINCREMENT,
  id_cliente INTEGER,
  data_venda TEXT,
  total REAL,
  FOREIGN KEY (id_cliente) REFERENCES clientes(id_cliente)
);

-- Consumo:
CREATE TABLE consumo (
  id_consumo INTEGER PRIMARY KEY AUTOINCREMENT,
  id_venda INTEGER,
  id_produto INTEGER,
  quantidade INTEGER,
  FOREIGN KEY (id_venda) REFERENCES vendas(id_venda),
  FOREIGN KEY (id_produto) REFERENCES produtos(id_produto)
);

Com as tabelas criadas, já podemos construir nossa API.


Código Completo do Web Service

O código a seguir implementa os endpoints para cada uma das tabelas, seguindo o mesmo padrão para facilitar a manutenção e a compreensão:


from flask import Flask, request, jsonify, abort
import sqlite3

app = Flask(__name__)
DATABASE = 'loja_acai.db'  # Nome do banco de dados SQLite

def get_db():
    """Retorna uma conexão com o banco de dados configurada para retornar dicionários."""
    conn = sqlite3.connect(DATABASE)
    conn.row_factory = sqlite3.Row
    return conn

# ===================== Clientes =====================

@app.route('/clientes', methods=['GET'])
def get_clientes():
    conn = get_db()
    clientes = conn.execute("SELECT * FROM clientes").fetchall()
    conn.close()
    return jsonify([dict(row) for row in clientes])

@app.route('/clientes/<int:id>', methods=['GET'])
def get_cliente(id):
    conn = get_db()
    cliente = conn.execute("SELECT * FROM clientes WHERE id_cliente = ?", (id,)).fetchone()
    conn.close()
    if cliente is None:
        abort(404)
    return jsonify(dict(cliente))

@app.route('/clientes', methods=['POST'])
def create_cliente():
    if not request.json or 'nome' not in request.json:
        abort(400)
    cliente = {
        'nome': request.json['nome'],
        'telefone': request.json.get('telefone', ''),
        'email': request.json.get('email', '')
    }
    conn = get_db()
    cur = conn.cursor()
    cur.execute("INSERT INTO clientes (nome, telefone, email) VALUES (?, ?, ?)",
                (cliente['nome'], cliente['telefone'], cliente['email']))
    conn.commit()
    cliente['id_cliente'] = cur.lastrowid
    conn.close()
    return jsonify(cliente), 201

@app.route('/clientes/<int:id>', methods=['PUT'])
def update_cliente(id):
    if not request.json:
        abort(400)
    campos = []
    valores = []
    for campo in ['nome', 'telefone', 'email']:
        if campo in request.json:
            campos.append(f"{campo} = ?")
            valores.append(request.json[campo])
    if not campos:
        abort(400)
    valores.append(id)
    conn = get_db()
    conn.execute(f"UPDATE clientes SET {', '.join(campos)} WHERE id_cliente = ?", valores)
    conn.commit()
    conn.close()
    return jsonify({'result': True})

@app.route('/clientes/<int:id>', methods=['DELETE'])
def delete_cliente(id):
    conn = get_db()
    conn.execute("DELETE FROM clientes WHERE id_cliente = ?", (id,))
    conn.commit()
    conn.close()
    return jsonify({'result': True})

# ===================== Produtos =====================

@app.route('/produtos', methods=['GET'])
def get_produtos():
    conn = get_db()
    produtos = conn.execute("SELECT * FROM produtos").fetchall()
    conn.close()
    return jsonify([dict(row) for row in produtos])

@app.route('/produtos/<int:id>', methods=['GET'])
def get_produto(id):
    conn = get_db()
    produto = conn.execute("SELECT * FROM produtos WHERE id_produto = ?", (id,)).fetchone()
    conn.close()
    if produto is None:
        abort(404)
    return jsonify(dict(produto))

@app.route('/produtos', methods=['POST'])
def create_produto():
    if not request.json or 'nome' not in request.json or 'preco' not in request.json:
        abort(400)
    produto = {
        'nome': request.json['nome'],
        'preco': request.json['preco']
    }
    conn = get_db()
    cur = conn.cursor()
    cur.execute("INSERT INTO produtos (nome, preco) VALUES (?, ?)",
                (produto['nome'], produto['preco']))
    conn.commit()
    produto['id_produto'] = cur.lastrowid
    conn.close()
    return jsonify(produto), 201

@app.route('/produtos/<int:id>', methods=['PUT'])
def update_produto(id):
    if not request.json:
        abort(400)
    campos = []
    valores = []
    for campo in ['nome', 'preco']:
        if campo in request.json:
            campos.append(f"{campo} = ?")
            valores.append(request.json[campo])
    if not campos:
        abort(400)
    valores.append(id)
    conn = get_db()
    conn.execute(f"UPDATE produtos SET {', '.join(campos)} WHERE id_produto = ?", valores)
    conn.commit()
    conn.close()
    return jsonify({'result': True})

@app.route('/produtos/<int:id>', methods=['DELETE'])
def delete_produto(id):
    conn = get_db()
    conn.execute("DELETE FROM produtos WHERE id_produto = ?", (id,))
    conn.commit()
    conn.close()
    return jsonify({'result': True})

# ===================== Materiais =====================

@app.route('/materiais', methods=['GET'])
def get_materiais():
    conn = get_db()
    materiais = conn.execute("SELECT * FROM materiais").fetchall()
    conn.close()
    return jsonify([dict(row) for row in materiais])

@app.route('/materiais/<int:id>', methods=['GET'])
def get_material(id):
    conn = get_db()
    material = conn.execute("SELECT * FROM materiais WHERE id_material = ?", (id,)).fetchone()
    conn.close()
    if material is None:
        abort(404)
    return jsonify(dict(material))

@app.route('/materiais', methods=['POST'])
def create_material():
    if not request.json or 'nome' not in request.json:
        abort(400)
    material = {
        'nome': request.json['nome'],
        'custo': request.json.get('custo', 0.0)
    }
    conn = get_db()
    cur = conn.cursor()
    cur.execute("INSERT INTO materiais (nome, custo) VALUES (?, ?)",
                (material['nome'], material['custo']))
    conn.commit()
    material['id_material'] = cur.lastrowid
    conn.close()
    return jsonify(material), 201

@app.route('/materiais/<int:id>', methods=['PUT'])
def update_material(id):
    if not request.json:
        abort(400)
    campos = []
    valores = []
    for campo in ['nome', 'custo']:
        if campo in request.json:
            campos.append(f"{campo} = ?")
            valores.append(request.json[campo])
    if not campos:
        abort(400)
    valores.append(id)
    conn = get_db()
    conn.execute(f"UPDATE materiais SET {', '.join(campos)} WHERE id_material = ?", valores)
    conn.commit()
    conn.close()
    return jsonify({'result': True})

@app.route('/materiais/<int:id>', methods=['DELETE'])
def delete_material(id):
    conn = get_db()
    conn.execute("DELETE FROM materiais WHERE id_material = ?", (id,))
    conn.commit()
    conn.close()
    return jsonify({'result': True})

# ===================== Vendas =====================

@app.route('/vendas', methods=['GET'])
def get_vendas():
    conn = get_db()
    vendas = conn.execute("SELECT * FROM vendas").fetchall()
    conn.close()
    return jsonify([dict(row) for row in vendas])

@app.route('/vendas/<int:id>', methods=['GET'])
def get_venda(id):
    conn = get_db()
    venda = conn.execute("SELECT * FROM vendas WHERE id_venda = ?", (id,)).fetchone()
    conn.close()
    if venda is None:
        abort(404)
    return jsonify(dict(venda))

@app.route('/vendas', methods=['POST'])
def create_venda():
    if not request.json or 'id_cliente' not in request.json or 'data_venda' not in request.json or 'total' not in request.json:
        abort(400)
    venda = {
        'id_cliente': request.json['id_cliente'],
        'data_venda': request.json['data_venda'],
        'total': request.json['total']
    }
    conn = get_db()
    cur = conn.cursor()
    cur.execute("INSERT INTO vendas (id_cliente, data_venda, total) VALUES (?, ?, ?)",
                (venda['id_cliente'], venda['data_venda'], venda['total']))
    conn.commit()
    venda['id_venda'] = cur.lastrowid
    conn.close()
    return jsonify(venda), 201

@app.route('/vendas/<int:id>', methods=['PUT'])
def update_venda(id):
    if not request.json:
        abort(400)
    campos = []
    valores = []
    for campo in ['id_cliente', 'data_venda', 'total']:
        if campo in request.json:
            campos.append(f"{campo} = ?")
            valores.append(request.json[campo])
    if not campos:
        abort(400)
    valores.append(id)
    conn = get_db()
    conn.execute(f"UPDATE vendas SET {', '.join(campos)} WHERE id_venda = ?", valores)
    conn.commit()
    conn.close()
    return jsonify({'result': True})

@app.route('/vendas/<int:id>', methods=['DELETE'])
def delete_venda(id):
    conn = get_db()
    conn.execute("DELETE FROM vendas WHERE id_venda = ?", (id,))
    conn.commit()
    conn.close()
    return jsonify({'result': True})

# ===================== Consumo =====================

@app.route('/consumo', methods=['GET'])
def get_consumo():
    conn = get_db()
    consumos = conn.execute("SELECT * FROM consumo").fetchall()
    conn.close()
    return jsonify([dict(row) for row in consumos])

@app.route('/consumo/<int:id>', methods=['GET'])
def get_consumo_item(id):
    conn = get_db()
    consumo = conn.execute("SELECT * FROM consumo WHERE id_consumo = ?", (id,)).fetchone()
    conn.close()
    if consumo is None:
        abort(404)
    return jsonify(dict(consumo))

@app.route('/consumo', methods=['POST'])
def create_consumo():
    if not request.json or 'id_venda' not in request.json or 'id_produto' not in request.json or 'quantidade' not in request.json:
        abort(400)
    consumo = {
        'id_venda': request.json['id_venda'],
        'id_produto': request.json['id_produto'],
        'quantidade': request.json['quantidade']
    }
    conn = get_db()
    cur = conn.cursor()
    cur.execute("INSERT INTO consumo (id_venda, id_produto, quantidade) VALUES (?, ?, ?)",
                (consumo['id_venda'], consumo['id_produto'], consumo['quantidade']))
    conn.commit()
    consumo['id_consumo'] = cur.lastrowid
    conn.close()
    return jsonify(consumo), 201

@app.route('/consumo/<int:id>', methods=['PUT'])
def update_consumo(id):
    if not request.json:
        abort(400)
    campos = []
    valores = []
    for campo in ['id_venda', 'id_produto', 'quantidade']:
        if campo in request.json:
            campos.append(f"{campo} = ?")
            valores.append(request.json[campo])
    if not campos:
        abort(400)
    valores.append(id)
    conn = get_db()
    conn.execute(f"UPDATE consumo SET {', '.join(campos)} WHERE id_consumo = ?", valores)
    conn.commit()
    conn.close()
    return jsonify({'result': True})

@app.route('/consumo/<int:id>', methods=['DELETE'])
def delete_consumo(id):
    conn = get_db()
    conn.execute("DELETE FROM consumo WHERE id_consumo = ?", (id,))
    conn.commit()
    conn.close()
    return jsonify({'result': True})

if __name__ == '__main__':
    app.run(debug=True)

Entendendo os Verbos HTTP Utilizados

Nesta API, utilizamos os seguintes métodos HTTP:

  • GET: Recupera dados dos registros. Por exemplo, GET /clientes retorna todos os clientes e GET /clientes/<id> retorna um cliente específico.
  • POST: Cria um novo registro. Por exemplo, POST /produtos espera dados em JSON para criar um novo produto.
  • PUT: Atualiza um registro existente. Por exemplo, PUT /materiais/<id> atualiza as informações do material indicado.
  • DELETE: Remove um registro do banco. Exemplo: DELETE /vendas/<id> remove a venda informada.

Como Executar e Testar a API

Siga os passos abaixo para executar e testar a API:

  1. Salve o código em um arquivo, por exemplo, app.py.
  2. Verifique se o banco de dados loja_acai.db existe e está configurado com as tabelas apresentadas.
  3. Instale o Flask, se ainda não o fez: pip install flask
  4. Execute o aplicativo: python app.py
  5. Utilize ferramentas como Postman ou curl para testar cada endpoint.

Conclusão

Este tutorial demonstrou como criar web services em Python para consumir as tabelas de um banco de dados SQLite da loja de açaí, abrangendo as tabelas Clientes, Produtos, Materiais, Vendas e Consumo. Ao utilizar o Flask e os principais verbos HTTP, você obteve uma API REST simples e modular, facilitando a integração com outras aplicações.

Experimente testar cada endpoint e ajustar o código conforme as necessidades do seu projeto!

Python SQLite
Exemplo prático de Python para loja Açaí

Tutorial: Web Services em Python para a Tabela Clientes

Neste tutorial, vamos criar uma API REST simples em Python utilizando o Flask para consumir a tabela Clientes de um banco de dados SQLite. Você aprenderá como utilizar os principais verbos HTTP (GET, POST, PUT e DELETE) para realizar operações de leitura, criação, atualização e exclusão de registros.


Requisitos

  • Python 3 instalado
  • Pacote Flask (instalável via pip install flask)
  • Banco de dados SQLite já criado com a tabela clientes

Estrutura da Tabela Clientes

Considere que a tabela clientes foi criada com a seguinte estrutura:


CREATE TABLE clientes (
  id_cliente INTEGER PRIMARY KEY AUTOINCREMENT,
  nome TEXT NOT NULL,
  telefone TEXT,
  email TEXT
);

Código do Web Service

O código a seguir implementa uma API REST utilizando Flask. Ele define uma rota para cada operação (GET, POST, PUT e DELETE) na tabela clientes:


from flask import Flask, request, jsonify, abort
import sqlite3

app = Flask(__name__)
DATABASE = 'loja_acai.db'  # Nome do banco de dados SQLite

def get_db():
    """Abre uma conexão com o banco de dados e define o row_factory para retornar dicts."""
    conn = sqlite3.connect(DATABASE)
    conn.row_factory = sqlite3.Row
    return conn

# 1. GET /clientes - Retorna todos os clientes
@app.route('/clientes', methods=['GET'])
def get_clientes():
    conn = get_db()
    clientes = conn.execute("SELECT * FROM clientes").fetchall()
    conn.close()
    return jsonify([dict(row) for row in clientes])

# 2. GET /clientes/&lt;id&gt; - Retorna um cliente específico
@app.route('/clientes/&lt;int:id&gt;', methods=['GET'])
def get_cliente(id):
    conn = get_db()
    cliente = conn.execute("SELECT * FROM clientes WHERE id_cliente = ?", (id,)).fetchone()
    conn.close()
    if cliente is None:
        abort(404)
    return jsonify(dict(cliente))

# 3. POST /clientes - Cria um novo cliente
@app.route('/clientes', methods=['POST'])
def create_cliente():
    if not request.json or 'nome' not in request.json:
        abort(400)
    cliente = {
        'nome': request.json['nome'],
        'telefone': request.json.get('telefone', ''),
        'email': request.json.get('email', '')
    }
    conn = get_db()
    cur = conn.cursor()
    cur.execute("INSERT INTO clientes (nome, telefone, email) VALUES (?, ?, ?)",
                (cliente['nome'], cliente['telefone'], cliente['email']))
    conn.commit()
    cliente['id_cliente'] = cur.lastrowid
    conn.close()
    return jsonify(cliente), 201

# 4. PUT /clientes/&lt;id&gt; - Atualiza um cliente existente
@app.route('/clientes/&lt;int:id&gt;', methods=['PUT'])
def update_cliente(id):
    if not request.json:
        abort(400)
    campos = []
    valores = []
    for campo in ['nome', 'telefone', 'email']:
        if campo in request.json:
            campos.append(f"{campo} = ?")
            valores.append(request.json[campo])
    if not campos:
        abort(400)
    valores.append(id)
    conn = get_db()
    conn.execute(f"UPDATE clientes SET {', '.join(campos)} WHERE id_cliente = ?", valores)
    conn.commit()
    conn.close()
    return jsonify({'result': True})

# 5. DELETE /clientes/&lt;id&gt; - Remove um cliente
@app.route('/clientes/&lt;int:id&gt;', methods=['DELETE'])
def delete_cliente(id):
    conn = get_db()
    conn.execute("DELETE FROM clientes WHERE id_cliente = ?", (id,))
    conn.commit()
    conn.close()
    return jsonify({'result': True})

if __name__ == '__main__':
    app.run(debug=True)

Entendendo os Verbos HTTP

Neste exemplo, utilizamos os seguintes métodos HTTP:

  • GET: Utilizado para recuperar dados. Temos dois endpoints:
    • GET /clientes – retorna todos os clientes;
    • GET /clientes/<id> – retorna um cliente específico.
  • POST: Utilizado para criar um novo recurso. O endpoint POST /clientes recebe dados no formato JSON para inserir um novo cliente.
  • PUT: Utilizado para atualizar um recurso existente. O endpoint PUT /clientes/<id> recebe os campos que devem ser atualizados do cliente informado.
  • DELETE: Utilizado para remover um recurso. O endpoint DELETE /clientes/<id> exclui o cliente com o id informado.

Como Executar e Testar a API

Siga os passos abaixo para executar e testar a API:

  1. Salve o código em um arquivo, por exemplo, app.py.
  2. Certifique-se de que o banco de dados loja_acai.db existe e contém a tabela clientes.
  3. Instale o Flask se ainda não o fez: pip install flask
  4. Execute o aplicativo: python app.py
  5. Acesse os endpoints utilizando ferramentas como Postman ou o curl via linha de comando.

Conclusão

Este tutorial apresentou de forma didática como criar web services em Python para a tabela clientes utilizando Flask, explorando os verbos HTTP básicos necessários para a manipulação dos dados (GET, POST, PUT e DELETE). Essa estrutura pode ser facilmente expandida para incluir outras tabelas e funcionalidades em seu projeto.

Experimente testar e modificar os endpoints para adaptar à sua aplicação.

en_USEnglish