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.

SQLite
Roteiro de exercícios auto aplicáveis

Roteiro de Exercícios Práticos com SQLite Studio para uma Loja de Açaí

Neste post, você encontrará um roteiro autoaplicado com 10 exercícios práticos para trabalhar com o SQLite Studio. Assumimos que o banco de dados já foi criado e abrimos o editor SQL para que você possa seguir cada passo, criando e manipulando tabelas relacionadas a uma loja de açaí: clientes, produtos, materiais, vendas e consumo.


Exercício 1: Criação das Tabelas

Objetivo: Criar a estrutura básica do banco de dados com as tabelas clientes, produtos, materiais, vendas e consumo.

Tarefa: Execute os comandos abaixo no editor SQL do SQLite Studio para definir as tabelas:


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

-- Tabela de Produtos (opções de açaí)
CREATE TABLE produtos (
  id_produto INTEGER PRIMARY KEY AUTOINCREMENT,
  nome TEXT NOT NULL,
  preco REAL NOT NULL
);

-- Tabela de Materiais (ingredientes e insumos)
CREATE TABLE materiais (
  id_material INTEGER PRIMARY KEY AUTOINCREMENT,
  nome TEXT NOT NULL,
  custo REAL
);

-- Tabela de 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)
);

-- Tabela de Consumo (itens consumidos em cada venda)
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)
);

Dica: Execute os comandos um a um para verificar a criação correta de cada tabela.


Exercício 2: Inserção de Dados na Tabela de Clientes

Objetivo: Inserir registros para simular os clientes da loja.

Tarefa: Cadastre pelo menos 3 registros utilizando comandos INSERT INTO:


INSERT INTO clientes (nome, telefone, email) VALUES ('Ana Silva', '123456789', 'ana@gmail.com');
INSERT INTO clientes (nome, telefone, email) VALUES ('Bruno Souza', '987654321', 'bruno@hotmail.com');
INSERT INTO clientes (nome, telefone, email) VALUES ('Carlos Pereira', '555123456', 'carlos@exemplo.com');

Cada comando adiciona um cliente, enquanto o id_cliente é gerado automaticamente.


Exercício 3: Inserção de Dados na Tabela de Produtos

Objetivo: Cadastrar os produtos ofertados pela loja (por exemplo, diferentes tamanhos ou opções do açaí).

Tarefa: Insira registros com nome do produto e preço:


INSERT INTO produtos (nome, preco) VALUES ('Açaí Pequeno', 12.50);
INSERT INTO produtos (nome, preco) VALUES ('Açaí Médio', 18.00);
INSERT INTO produtos (nome, preco) VALUES ('Açaí Grande', 25.00);

Esses comandos simulam as diferentes porções de açaí oferecidas.


Exercício 4: Inserção de Dados na Tabela de Materiais

Objetivo: Registrar os ingredientes (materiais) utilizados na preparação dos produtos.

Tarefa: Cadastre os insumos com nome e custo:


INSERT INTO materiais (nome, custo) VALUES ('Polpa de Açaí', 5.00);
INSERT INTO materiais (nome, custo) VALUES ('Granola', 2.00);
INSERT INTO materiais (nome, custo) VALUES ('Leite Condensado', 3.00);

Cada material possui um custo que pode ser utilizado para cálculos financeiros e de lucratividade.


Exercício 5: Inserção de Registros na Tabela de Vendas

Objetivo: Registrar as vendas realizadas e associá-las aos clientes.

Tarefa: Insira registros de vendas, relacionando cada venda a um cliente, com data e valor total:


INSERT INTO vendas (id_cliente, data_venda, total) VALUES (1, '2025-04-10', 25.00);
INSERT INTO vendas (id_cliente, data_venda, total) VALUES (2, '2025-04-10', 18.00);

Observe que o id_cliente referencia um cliente já cadastrado, e a data segue o formato ‘YYYY-MM-DD’.


Exercício 6: Inserção de Registros na Tabela de Consumo

Objetivo: Associar cada venda aos produtos consumidos, detalhando a quantidade.

Tarefa: Registre os itens consumidos por venda:


INSERT INTO consumo (id_venda, id_produto, quantidade) VALUES (1, 3, 1);
INSERT INTO consumo (id_venda, id_produto, quantidade) VALUES (2, 2, 2);

Exemplo: A venda com id_venda = 1 incluiu 1 unidade do produto com id_produto = 3 (Açaí Grande), e a venda com id_venda = 2 registrou 2 unidades do produto com id_produto = 2.


Exercício 7: Consultas Simples (SELECT)

Objetivo: Visualizar os dados inseridos em cada tabela.

Tarefa: Crie consultas SELECT para mostrar todos os registros:


SELECT * FROM clientes;
SELECT * FROM produtos;
SELECT * FROM materiais;
SELECT * FROM vendas;
SELECT * FROM consumo;

Essas consultas permitem verificar a correta inserção dos dados.


Exercício 8: Consultas com JOIN

Objetivo: Unir dados de tabelas relacionadas, por exemplo, vincular clientes às suas vendas.

Tarefa: Crie uma consulta que mostre o ID da venda, nome do cliente, data e total da venda:


SELECT v.id_venda, c.nome AS Cliente, v.data_venda, v.total 
FROM vendas v
JOIN clientes c ON v.id_cliente = c.id_cliente;

O comando JOIN associa cada venda ao cliente correspondente, facilitando a visualização dos registros.


Exercício 9: Funções de Agregação

Objetivo: Utilizar funções de agregação para resumir informações dos dados.

Tarefa: Crie consultas para calcular:

  • O valor total de todas as vendas.
  • A média dos valores das vendas.

-- Total das Vendas:
SELECT SUM(total) AS Total_Vendas FROM vendas;

-- Média dos Valores das Vendas:
SELECT AVG(total) AS Media_Vendas FROM vendas;

Essas funções são úteis para análises gerenciais dos resultados de vendas.


Exercício 10: Atualização e Exclusão de Registros

Objetivo: Praticar comandos de modificação de dados com UPDATE e DELETE.

Tarefa: Realize as seguintes operações:

  1. Atualize o preço de um produto.
  2. Exclua um registro de cliente (por exemplo, um registro duplicado ou inativo).

-- Atualizar o preço do produto com id_produto = 2:
UPDATE produtos SET preco = 20.00 WHERE id_produto = 2;

-- Excluir um cliente específico (supondo que o cliente com id_cliente = 3 seja removido):
DELETE FROM clientes WHERE id_cliente = 3;

Revisar sempre as condições para evitar atualizações ou exclusões indesejadas.


Considerações Finais

Com esses 10 exercícios, você poderá explorar desde a criação das tabelas até consultas avançadas e manipulação de dados utilizando o SQLite Studio para um banco de dados fictício de uma loja de açaí. Aproveite para experimentar variações e aprofundar seus conhecimentos, criando índices, views ou novas relações entre as tabelas.

Bom estudo e prática!

SQLite
Introdução SQLite

Treinamento Integrado: História, SGBD, SQL, Python com SQLite e o Futuro dos Bancos de Dados

Bem-vindo(a)! Neste treinamento, vamos explorar como os dados são organizados e gerenciados – desde a sua história até as tendências que estão moldando o futuro dos bancos de dados.

1. Introdução

Neste treinamento, você vai conhecer os Sistemas de Gerenciamento de Banco de Dados (SGBDs), aprender a utilizar a linguagem SQL para manipular os dados, entender como o Python se integra com o SQLite e ainda conhecer um pouco da história dos bancos de dados, além de explorar as principais tendências para o futuro.

2. História dos Bancos de Dados

  • Inícios e Arquivos Planos: Nos primeiros dias da computação, os dados eram armazenados em arquivos simples (arquivos planos), o que dificultava a organização, consulta e segurança das informações.
  • Surgimento dos SGBDs: Na década de 1960, com o aumento da complexidade e volume de informações, surgiram os SGBDs para organizar os dados de forma estruturada e eficiente.
  • O Modelo Relacional: Na década de 1970, Edgar F. Codd introduziu o modelo relacional, que organizava os dados em tabelas e utilizava chaves para relacioná-las, revolucionando a forma de armazenar informações.
  • Padronização e Evolução do SQL: Com a popularização dos bancos de dados relacionais, a linguagem SQL foi padronizada, facilitando a comunicação entre os desenvolvedores e os bancos de dados.
  • Diversificação e Inovações: A partir dos anos 2000, novas abordagens surgiram, como os bancos de dados NoSQL e o SQLite, que oferecem maior flexibilidade e são ideais para aplicações mais leves.

3. Sistemas de Gerenciamento de Banco de Dados (SGBDs)

Um Sistema de Gerenciamento de Banco de Dados (SGBD) é um software que organiza, armazena e gerencia os dados, permitindo operações como inserção, consulta, atualização e exclusão de informações de forma segura e estruturada.

  • Organização dos Dados: Armazena as informações de maneira estruturada para fácil acesso.
  • Segurança: Possui mecanismos para controlar o acesso e proteger os dados.
  • Escalabilidade: Atende desde pequenos projetos até sistemas empresariais complexos.

Exemplos de SGBDs incluem: MySQL, PostgreSQL, Oracle, Microsoft SQL Server e, para aplicações mais leves, o SQLite.

4. SQL: A Linguagem de Consulta

A linguagem SQL (Structured Query Language) é o padrão para interagir com os bancos de dados. Com ela, é possível:

  • Consultar Dados: Exemplo: SELECT * FROM alunos;
  • Inserir Dados: Exemplo: INSERT INTO alunos (nome, idade) VALUES ('João', 16);
  • Atualizar Dados: Exemplo: UPDATE alunos SET idade = 17 WHERE nome = 'João';
  • Excluir Dados: Exemplo: DELETE FROM alunos WHERE nome = 'João';

O SQL torna a manipulação dos dados simples e eficiente, mesmo para iniciantes, sem a necessidade de conhecer os detalhes internos do armazenamento.

5. Integração de Python com SQLite

O Python possui o módulo nativo sqlite3, que permite a integração com o SQLite de forma direta e prática. Essa combinação é ideal para o desenvolvimento de aplicações locais, protótipos e scripts, sem a necessidade de um servidor dedicado.

  • Leveza e Portabilidade: O SQLite armazena os dados em um único arquivo, eliminando a complexidade de configurar servidores.
  • Facilidade de Uso: Com o módulo sqlite3, você pode executar comandos SQL diretamente no Python.

Confira o exemplo prático a seguir:

import sqlite3

# Conectando ou criando um banco de dados
conn = sqlite3.connect('meu_banco.db')

# Criando um cursor para executar comandos SQL
cursor = conn.cursor()

# Criando uma tabela chamada "usuarios"
cursor.execute("""
    CREATE TABLE IF NOT EXISTS usuarios (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        nome TEXT NOT NULL,
        idade INTEGER
    )
""")

# Inserindo um registro na tabela "usuarios"
cursor.execute("INSERT INTO usuarios (nome, idade) VALUES (?, ?)", ('Ana', 21))

# Salvando as alterações
conn.commit()

# Consultando os registros da tabela
cursor.execute("SELECT * FROM usuarios")
registros = cursor.fetchall()

# Exibindo os registros
for registro in registros:
    print(registro)

# Fechando a conexão com o banco de dados
conn.close()

6. Tendências Futuras dos Bancos de Dados

  • Dados em Nuvem: Os bancos de dados estão migrando para a nuvem, permitindo acesso remoto e escalabilidade dinâmica.
  • Bancos de Dados Distribuídos: Sistemas que distribuem dados por múltiplos servidores garantem alta disponibilidade e desempenho, mesmo em caso de falhas.
  • Integração com IoT: O crescimento da Internet das Coisas gera uma grande quantidade de dados que precisam ser processados em tempo real.
  • Inteligência Artificial e Machine Learning: Tecnologias que analisam grandes volumes de dados e automatizam processos estão em expansão.
  • NoSQL e Dados Não Estruturados: Além dos bancos relacionais, os bancos NoSQL oferecem maior flexibilidade para lidar com dados em formatos variados.

7. Conclusão

Neste treinamento, exploramos a história dos bancos de dados, os fundamentos dos SGBDs e da linguagem SQL, e como o Python se integra com o SQLite para facilitar o gerenciamento de dados. Também discutimos as tendências que estão revolucionando o armazenamento e a análise das informações na era digital.

Entender como os dados são organizados e manipulados é fundamental para quem deseja ingressar no mundo da tecnologia. As habilidades aprendidas aqui abrem portas para diversas áreas, como desenvolvimento de software, análise de dados e inteligência artificial.

Esperamos que este treinamento inspire você a explorar mais sobre este fascinante universo dos dados!

SQLite
Mini treinamento sobre SQLite

A seguir, um mini treinamento prático sobre SQLite, abordando os conceitos básicos, comandos essenciais e exemplos de uso.


1. Introdução ao SQLite

O que é SQLite?
SQLite é um sistema de gerenciamento de banco de dados relacional (SGBDR) leve, sem servidor e baseado em arquivos. Ele é ideal para aplicações que necessitam de um banco de dados simples, portátil e de fácil configuração. Alguns pontos importantes:

  • Leve e Portátil: O banco de dados é armazenado em um único arquivo.
  • Zero Configuração: Não há necessidade de instalar um servidor separado.
  • Amplamente Suportado: Utilizado em aplicações móveis, navegadores e projetos embarcados.

2. Instalação do SQLite

A instalação do SQLite varia de acordo com o sistema operacional:

  • Linux: Geralmente já vem instalado. Se não, você pode instalar via gerenciador de pacotes, por exemplo: sudo apt-get install sqlite3
  • Windows e macOS: Baixe o executável do site oficial do SQLite e siga as instruções para o seu sistema.

Para verificar se a instalação foi bem-sucedida, abra o terminal (ou prompt de comando) e digite:

sqlite3 --version

3. Criando e Conectando a um Banco de Dados

Para criar (ou abrir) um banco de dados, basta executar o comando:

sqlite3 meu_banco.db

Isso criará um arquivo chamado meu_banco.db no diretório atual e abrirá o ambiente interativo do SQLite.


4. Comandos SQL Básicos

Dentro do ambiente interativo do SQLite, você pode executar comandos SQL. Aqui estão os comandos essenciais:

a. Criar uma Tabela

CREATE TABLE usuarios (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nome TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
idade INTEGER
);

Esse comando cria a tabela usuarios com colunas para ID, nome, email e idade.

b. Inserir Dados

INSERT INTO usuarios (nome, email, idade) VALUES ('Ana Silva', 'ana@example.com', 28);
INSERT INTO usuarios (nome, email, idade) VALUES ('Bruno Souza', 'bruno@example.com', 35);

c. Consultar Dados

SELECT * FROM usuarios;

Esse comando exibe todos os registros da tabela usuarios.

d. Atualizar Dados

UPDATE usuarios
SET idade = 29
WHERE nome = 'Ana Silva';

e. Deletar Dados

DELETE FROM usuarios
WHERE id = 2;

5. Exemplos Práticos

Imagine que você precise gerenciar informações de usuários. Seguem alguns comandos de exemplo:

  1. Criar a Tabela
    Execute: sqlCopiarCREATE TABLE usuarios ( id INTEGER PRIMARY KEY AUTOINCREMENT, nome TEXT NOT NULL, email TEXT UNIQUE NOT NULL, idade INTEGER );
  2. Inserir Dados
    Para adicionar um novo usuário: sqlCopiarINSERT INTO usuarios (nome, email, idade) VALUES ('Carlos Pereira', 'carlos@example.com', 42);
  3. Consultar Dados
    Para listar todos os usuários: sqlCopiarSELECT * FROM usuarios;
  4. Atualizar Dados
    Para atualizar a idade do Carlos: sqlCopiarUPDATE usuarios SET idade = 43 WHERE nome = 'Carlos Pereira';
  5. Excluir um Registro
    Para remover um usuário, por exemplo, com ID 1: sqlCopiarDELETE FROM usuarios WHERE id = 1;

6. Ferramentas Adicionais e Recursos

  • DB Browser for SQLite: Uma ferramenta gráfica para visualizar e editar bancos de dados SQLite. É útil para quem prefere uma interface visual ao invés do terminal.
  • Documentação Oficial: A documentação do SQLite é um excelente recurso para aprender mais sobre comandos avançados e otimizações.

7. Dicas e Boas Práticas

  • Backup Regular: Como o banco de dados é um único arquivo, faça backups regulares para evitar perda de dados.
  • Validação de Dados: Utilize restrições como NOT NULL, UNIQUE e CHECK para manter a integridade dos dados.
  • Índices: Crie índices em colunas que são frequentemente utilizadas em condições de busca (WHERE) para melhorar a performance.

8. Exercícios Propostos

  1. Criar uma nova tabela chamada produtos com os campos id, nome, preco e quantidade.
  2. Inserir dados na tabela produtos com pelo menos três registros.
  3. Realizar uma consulta que retorne todos os produtos com preço acima de um determinado valor.
  4. Atualizar a quantidade de um produto específico.
  5. Deletar um produto com base em seu id.
Python
Programação Orientado a Objetos em Python

A programação orientada a objetos (POO) é um paradigma de programação que organiza o código em “objetos” – estruturas que combinam dados (atributos) e comportamentos (métodos). Python, por ser uma linguagem multiparadigma, possui um suporte robusto à POO, permitindo que desenvolvedores criem aplicações mais organizadas, reutilizáveis e de fácil manutenção. Neste artigo, abordaremos os principais princípios da orientação a objetos: encapsulamento, herança, polimorfismo e abstração, apresentando exemplos didáticos para cada um.


1. Conceitos Básicos de Orientação a Objetos

Antes de explorarmos os princípios, vamos relembrar dois conceitos fundamentais:

  • Classe: É um “molde” ou “projeto” que define os atributos (dados) e os métodos (funções) que seus objetos terão.
  • Objeto: É uma instância de uma classe. Cada objeto possui seu próprio estado, representado pelos valores dos atributos.

Exemplo simples de classe e objeto em Python:

class Pessoa:
    def __init__(self, nome, idade):
        self.nome = nome
        self.idade = idade

    def apresentar(self):
        print(f"Olá, meu nome é {self.nome} e tenho {self.idade} anos.")

# Criação de objetos
p1 = Pessoa("Alice", 30)
p2 = Pessoa("Bruno", 25)

p1.apresentar()  # Saída: Olá, meu nome é Alice e tenho 30 anos.
p2.apresentar()  # Saída: Olá, meu nome é Bruno e tenho 25 anos.

2. Princípios da Orientação a Objetos

2.1 Encapsulamento

Encapsulamento é o mecanismo que agrupa dados e métodos que operam sobre esses dados dentro de uma mesma unidade (classe), restringindo o acesso direto a alguns componentes. Isso ajuda a proteger o estado interno do objeto e permite modificar a implementação interna sem afetar a interface pública.

Exemplo de encapsulamento com atributos privados:

class ContaBancaria:
    def __init__(self, saldo_inicial):
        self.__saldo = saldo_inicial  # Atributo privado

    def depositar(self, valor):
        if valor > 0:
            self.__saldo += valor
            print(f"Depósito de R${valor} realizado com sucesso.")

    def sacar(self, valor):
        if 0 < valor <= self.__saldo:
            self.__saldo -= valor
            print(f"Saque de R${valor} realizado com sucesso.")
        else:
            print("Saldo insuficiente ou valor inválido.")

    def mostrar_saldo(self):
        print(f"Saldo atual: R${self.__saldo}")

# Uso da classe
conta = ContaBancaria(1000)
conta.depositar(500)
conta.sacar(300)
conta.mostrar_saldo()

# A tentativa de acesso direto ao atributo privado resultará em erro:
# print(conta.__saldo)  -> AttributeError

No exemplo acima, o atributo __saldo é privado e não pode ser acessado diretamente fora da classe. Os métodos depositar, sacar e mostrar_saldo formam a interface pública para interagir com esse dado.


2.2 Herança

Herança permite que uma classe herde atributos e métodos de outra, promovendo a reutilização de código e a criação de hierarquias. A classe que herda é chamada de subclasse ou classe derivada, enquanto a classe de onde se herda é chamada de superclasse ou classe base.

Exemplo de herança:

class Veiculo:
    def __init__(self, marca, modelo):
        self.marca = marca
        self.modelo = modelo

    def exibir_info(self):
        print(f"Marca: {self.marca}, Modelo: {self.modelo}")

# Classe derivada que herda de Veiculo
class Carro(Veiculo):
    def __init__(self, marca, modelo, portas):
        super().__init__(marca, modelo)  # Chama o construtor da superclasse
        self.portas = portas

    def exibir_info(self):
        super().exibir_info()
        print(f"Portas: {self.portas}")

# Uso das classes
veiculo = Veiculo("Genérico", "Modelo X")
veiculo.exibir_info()

print("----")

carro = Carro("Toyota", "Corolla", 4)
carro.exibir_info()

Aqui, a classe Carro herda de Veiculo e adiciona o atributo portas, além de sobrescrever o método exibir_info para incluir informações específicas do carro.


2.3 Polimorfismo

Polimorfismo é a capacidade de diferentes classes responderem de forma específica à mesma mensagem (método). Ou seja, métodos com o mesmo nome podem ter implementações diferentes em classes distintas.

Exemplo de polimorfismo:

class Animal:
    def emitir_som(self):
        pass  # Método abstrato, sem implementação

class Cachorro(Animal):
    def emitir_som(self):
        print("Au Au")

class Gato(Animal):
    def emitir_som(self):
        print("Miau")

# Função que recebe um objeto do tipo Animal e chama emitir_som
def fazer_animal_emitir_som(animal):
    animal.emitir_som()

# Uso do polimorfismo
cachorro = Cachorro()
gato = Gato()

fazer_animal_emitir_som(cachorro)  # Saída: Au Au
fazer_animal_emitir_som(gato)      # Saída: Miau

Apesar dos objetos Cachorro e Gato serem instâncias de classes diferentes, ambos implementam o método emitir_som. Assim, a função fazer_animal_emitir_som pode receber qualquer objeto derivado de Animal e executar o método correspondente.


2.4 Abstração

Abstração consiste em ocultar os detalhes de implementação e mostrar apenas a funcionalidade essencial ao usuário. Em Python, podemos utilizar classes abstratas para definir métodos que devem ser implementados por suas subclasses. A biblioteca abc (Abstract Base Classes) facilita a criação de classes abstratas.

Exemplo de abstração usando o módulo abc:

from abc import ABC, abstractmethod

class FormaGeometrica(ABC):
    @abstractmethod
    def calcular_area(self):
        pass

class Quadrado(FormaGeometrica):
    def __init__(self, lado):
        self.lado = lado

    def calcular_area(self):
        return self.lado ** 2

class Circulo(FormaGeometrica):
    def __init__(self, raio):
        self.raio = raio

    def calcular_area(self):
        import math
        return math.pi * (self.raio ** 2)

# Tentativa de instanciar a classe abstrata gera erro:
# forma = FormaGeometrica()  -> TypeError

# Uso das classes concretas
quadrado = Quadrado(4)
circulo = Circulo(3)

print(f"Área do quadrado: {quadrado.calcular_area()}")  # Saída: 16
print(f"Área do círculo: {circulo.calcular_area():.2f}")  # Saída: valor aproximado

No exemplo, FormaGeometrica é uma classe abstrata que define o método calcular_area como abstrato. As classes Quadrado e Circulo implementam esse método de acordo com suas fórmulas específicas.


Conclusão

A orientação a objetos em Python oferece uma maneira estruturada e intuitiva de organizar o código. Ao utilizar os princípios de encapsulamento, herança, polimorfismo e abstração, os desenvolvedores podem criar sistemas mais robustos, modulares e fáceis de manter. Esperamos que os exemplos apresentados neste artigo ajudem a compreender melhor esses conceitos e inspirem a aplicação deles em seus projetos!

treinamentos
Resumão da disciplina Metodologias Ágeis

Aula 1 – [SIS]ANO1C3B1S1A1.pdf

  • Introdução e Conceitos:
    • Definição do levantamento de requisitos e sua importância para o sucesso dos projetos de desenvolvimento de software.
    • Diferenciação entre requisitos funcionais (o que o sistema deve fazer) e não funcionais (como o sistema deve se comportar).
  • Atividade Prática:
    • Exemplo com cenário de um aplicativo para agendamento de consultas, enfatizando a coleta e análise dos requisitos.

Aula 2 – [SIS]ANO1C3B1S1A2.pdf

  • Técnicas e Ferramentas:
    • Abordagens e métodos para coletar requisitos, com ênfase em técnicas como entrevistas, workshops e brainstorming.
    • Comparação entre metodologias ágeis e tradicionais na coleta de requisitos.
  • Estudo de Caso:
    • Exemplo prático utilizando um software de e-commerce, detalhando os requisitos funcionais e não funcionais.
  • Atividades e Quizzes:
    • Exercícios e questionários para fixação dos conceitos apresentados.

Aula 3 – [SIS]ANO1C3B1S1A3.pdf

  • Desafios e Gestão de Mudanças:
    • Identificação dos principais desafios do levantamento de requisitos, como a comunicação com stakeholders e a gestão de alterações no escopo.
    • Estratégias para lidar com mudanças inesperadas nos requisitos, incluindo análise de riscos e impacto.
  • Exercícios Práticos:
    • Atividades que simulam situações reais de mudanças de requisitos, com foco na adaptação e na negociação entre as partes envolvidas.

II. Testes de Software

(Arquivos: S7A3, S7A1, S7A2, S2A3, S2A1, S2A2)

A. Testes Funcionais: Conceitos e Metodologias

Aula 1 – [SIS]ANO1C3B1S7A1.pdf

  • Fundamentos dos Testes Funcionais:
    • Importância de testar se o software atende aos requisitos funcionais definidos.
    • Etapas do processo de teste: planejamento, preparação do ambiente, levantamento de requisitos, design dos casos de teste, execução e registro de defeitos, além da elaboração do relatório de teste.
  • Desenvolvimento de Casos de Teste:
    • Criação de cenários que cobrem as funcionalidades essenciais do software.

Aula 2 – [SIS]ANO1C3B1S7A2.pdf

  • Metodologias de Teste:
    • Comparação entre abordagens tradicionais (modelo cascata) e ágeis (iterativas e incrementais).
    • Integração dos testes funcionais no ciclo das sprints e a importância da automação para testes repetitivos.
  • Atividade Prática:
    • Criação de fluxogramas que ilustrem o processo de teste funcional e discussão sobre estratégias de execução.

Aula 3 – [SIS]ANO1C3B1S7A3.pdf

  • Melhores Práticas e Estratégias:
    • Planejamento, execução e gerenciamento dos testes funcionais.
    • Uso de ferramentas e tecnologias para automatização e organização dos testes.
    • Avaliação de riscos e priorização dos testes com base no impacto dos defeitos.

B. Introdução aos Testes de Software e Tipos de Testes

Aula 1 – [SIS]ANO1C3B1S2A1.pdf

  • Conceitos Básicos:
    • Introdução aos testes de software, destacando a importância dos processos de verificação e validação.
    • Objetivos dos testes: garantir qualidade, identificar defeitos e prevenir problemas na operação.
  • Exercício Prático:
    • Desenvolvimento de um plano de teste simples para uma aplicação de to-do list.

Aula 2 – [SIS]ANO1C3B1S2A2.pdf

  • Diversidade e Tipos de Testes:
    • Diferenciação entre testes funcionais e não funcionais (desempenho, usabilidade, segurança, etc.).
    • Comparação entre testes manuais e automatizados, com exemplos de ferramentas como Selenium, JUnit, JMeter, entre outras.
    • Abordagem dos testes de regressão, que garantem que novas alterações não comprometam funcionalidades já existentes.

Aula 3 – [SIS]ANO1C3B1S2A3.pdf

  • Gerenciamento de Testes:
    • Estratégias para o desenvolvimento de um plano de testes abrangente, alinhando os objetivos de negócio às atividades de teste.
    • Organização e priorização dos casos de teste com base na criticidade das funcionalidades e impacto no negócio.
    • Uso de métricas para rastrear a eficácia dos testes (taxa de cobertura, tempo médio para correção, entre outros).
  • Atividade Prática:
    • Elaboração de fluxogramas e relatórios que demonstram o processo de teste em cenários práticos (exemplo: máquina de cartão de crédito).

III. Modelagem de Dados e Conceitos Fundamentais

(Arquivos: [SIS]ANO1C3B1S3A1.pdf, [SIS]ANO1C3B1S3A2.pdf, [SIS]ANO1C3B1S3A3.pdf)

  • Conceito e Importância:
    • A modelagem de dados é essencial para estruturar, organizar e armazenar informações de forma eficiente.
    • Facilita a comunicação entre analistas, desenvolvedores e usuários, garantindo integridade e qualidade dos dados.
  • Abordagens e Tipos de Modelos:
    • Modelagem Conceitual: Criação de diagramas (por exemplo, ER) para representar entidades, relacionamentos e regras de negócio sem entrar em detalhes técnicos.
    • Modelagem Lógica: Detalha a estrutura dos dados com definição de tabelas, colunas, tipos de dados e restrições, independente da implementação física.
    • Modelagem Física: Implementa o modelo lógico em um sistema de banco de dados, otimizando o desempenho com técnicas como particionamento e índices.
    • Normalização: Processo de organizar dados para reduzir redundâncias e melhorar a integridade.
  • Arquitetura de Dados e Tendências:
    • Discussão sobre diferentes abordagens de arquitetura, como data warehouses, data lakes e arquiteturas orientadas a serviços.
    • Consideração sobre tendências futuras, como o uso de Big Data, IoT, blockchain e a importância da segurança e conformidade (LGPD).
  • Atividade Prática:
    • Exercício de criação de um esquema de banco de dados para uma livraria on-line, envolvendo identificação de entidades (livro, autor, pedido, cliente), definição de atributos e relacionamento entre elas.

IV. UML – Introdução e Visão Geral dos Diagramas

(Arquivos: [SIS]ANO1C3B1S4A1.pdf, [SIS]ANO1C3B1S4A2.pdf, [SIS]ANO1C3B1S4A3.pdf)

  • Conceito e Origem:
    • A UML (Unified Modeling Language) é uma linguagem padrão para visualização, especificação, construção e documentação de sistemas de software.
    • Surgiu a partir da unificação de métodos de modelagem orientada a objetos (Booch, OMT, OOSE) nos anos 1990.
  • Componentes e Elementos Básicos:
    • Classes, Objetos e Relacionamentos: Base para a modelagem de sistemas, permitindo representar entidades e suas interações.
    • Diagramas:
      • Casos de Uso: Representam as funcionalidades do sistema a partir da perspectiva dos usuários.
      • Diagramas de Classe: Mostram a estrutura estática do sistema, com atributos e métodos.
      • Diagramas de Sequência e Colaboração: Detalham a interação entre objetos ao longo do tempo.
      • Diagramas de Atividade e de Estado: Representam fluxos de trabalho, processos e os diferentes estados de um objeto durante seu ciclo de vida.
  • Aplicação Prática:
    • Uso de UML para documentar e comunicar requisitos de software de forma rápida, inclusive em ambientes ágeis.
    • Atividades práticas incluíram a elaboração de diagramas para processos como “resgate de senha” e a criação de apresentações para explicar a UML a colegas.

V. Programação Orientada a Objetos (POO) e Seus Pilares

(Arquivos: [SIS]ANO1C3B1S5A1.pdf, [SIS]ANO1C3B1S5A2.pdf, [SIS]ANO1C3B1S5A3.pdf)

  • Fundamentos da POO:
    • Paradigma que utiliza “objetos” – entidades que combinam dados (atributos) e comportamentos (métodos) – para modelar problemas do mundo real.
    • Permite a criação de sistemas modulares, reutilizáveis e de fácil manutenção.
  • Quatro Pilares da POO:
    • Encapsulamento: Protege os dados internos dos objetos, permitindo acesso somente por meio de métodos definidos.
    • Abstração: Simplifica a complexidade, focando nos aspectos essenciais e ignorando detalhes irrelevantes.
    • Herança: Permite que classes derivadas herdem atributos e comportamentos de classes base, promovendo a reutilização de código.
    • Polimorfismo: Habilidade de diferentes classes responderem de maneira própria a métodos com a mesma assinatura, facilitando o tratamento uniforme de objetos.
  • Conceitos Complementares:
    • Classes e Objetos: As classes servem como moldes (receitas) para a criação de objetos concretos.
    • Métodos: Funções internas às classes que definem o comportamento dos objetos.
    • Padrões de Projeto e Princípios SOLID: Orientam o design de software para garantir sistemas flexíveis e manuteníveis, exemplificados por padrões criacionais, estruturais e comportamentais.
  • Atividades Práticas:
    • Exercícios de definição e criação de classes com atributos e métodos (exemplo: classe “Cachorro” e objeto “Bidu”).
    • Divisão de um contexto (como um sistema de gerenciamento de pedidos) em classes, estabelecendo relacionamentos e métodos apropriados, com elaboração de resposta em formato de e-mail.

VI. Técnicas de Elicitação de Requisitos

(Base: [SIS]ANO1C3B1S6A1.pdf ​, [SIS]ANO1C3B1S6A2.pdf ​, [SIS]ANO1C3B1S6A3.pdf ​)

  • Aula 1 – Fundamentos da Elicitação:
    • Definição e importância da elicitação de requisitos para o sucesso dos projetos.
    • Diferença entre requisitos de usuário, sistema e funcionais.
    • Técnicas básicas como entrevistas, questionários, workshops e observação para coletar informações.
    • Enfoque na validação e negociação dos requisitos para assegurar que reflitam as reais necessidades dos stakeholders.
  • Aula 2 – Estratégias Avançadas:
    • Uso de modelagem e prototipagem para visualizar e testar funcionalidades antes da implementação.
    • Análise de stakeholders para identificar e envolver todas as partes impactadas.
    • Aplicação de técnicas de elicitação em metodologias ágeis, com ciclos iterativos, uso de User Stories, backlog grooming e feedback contínuo.
    • Atividade prática: criação de um questionário, diagrama de fluxo e esboço de agenda para um evento, consolidando as informações necessárias.
  • Aula 3 – Comunicação, Colaboração e Gestão de Conflitos:
    • Importância das habilidades de comunicação (escuta ativa, feedback construtivo, clareza e uso de ferramentas visuais) durante a elicitação.
    • Condução de workshops para reunir stakeholders e definir requisitos de forma colaborativa.
    • Técnicas para identificar e resolver conflitos que podem surgir durante a coleta dos requisitos.
    • Atividade prática: simulação de resposta a um e-mail de conflito, propondo um plano de ação para alinhar as expectativas da equipe.

VII. Modelagem de Dados Relacional

(Base: [SIS]ANO1C3B1S8A1.pdf ​, [SIS]ANO1C3B1S8A2.pdf ​, [SIS]ANO1C3B1S8A3.pdf ​)

  • Aula 1 – Fundamentos da Modelagem Relacional:
    • Introdução à modelagem relacional, definindo conceitos básicos como entidades, atributos, chaves primárias e estrangeiras.
    • Explicação do processo de normalização, visando minimizar a redundância e garantir a integridade dos dados.
    • Exemplos práticos (como a modelagem de um banco de dados escolar com entidades “Estudante” e “Curso”).
  • Aula 2 – Técnicas de Relacionamento e Integridade:
    • Detalhamento dos tipos de relacionamentos: um-para-um, um-para-muitos e muitos-para-muitos.
    • Abordagem sobre como modelar associações e a importância da integridade referencial, garantindo que as chaves estrangeiras referenciem registros válidos.
    • Atividade prática: elaboração de um modelo para um novo recurso (exemplo: integração de “Evento de Curso” com a entidade “Alunos”) com a definição dos relacionamentos e, quando necessário, a criação de tabelas de associação.
  • Aula 3 – Técnicas Avançadas e Tendências:
    • Discussão sobre estratégias avançadas, como a desnormalização, quando e como aplicá-la para melhorar o desempenho das consultas.
    • Utilização de índices para otimizar a performance e considerações para adaptação da modelagem relacional em contextos de Big Data.
    • Atividade prática: planejamento de uma estratégia de desnormalização para um cenário onde o desempenho das consultas está comprometido, com discussão dos impactos e vantagens da técnica.

Esses novos tópicos ampliam os conhecimentos anteriores, reforçando tanto a importância de técnicas eficazes para a coleta de requisitos (desde os fundamentos até estratégias avançadas e resolução de conflitos) quanto os princípios e técnicas avançadas para modelar dados de forma relacional, garantindo a integridade e o desempenho dos bancos de dados. Conforme forem enviados novos materiais, podemos continuar atualizando e complementando este resumão.

Desenvolvimento de Software treinamentos
Resumão da aula de Carreira e Competências para o Mercado de Trabalho.

1. Autoconhecimento e Autoavaliação

  • Conceito: Processo de se conhecer profundamente, identificando suas experiências, conquistas, pontos fortes e áreas para melhoria.
  • Ferramentas Utilizadas:
    • Linha do Tempo: Registra os marcos e momentos importantes da vida para entender a própria história.
    • Diário de Autoconhecimento: Permite reflexões diárias sobre metas, sucessos e aprendizados.
  • Importância: Base para o desenvolvimento pessoal e profissional, pois facilita a tomada de decisões e o autodesenvolvimento.


2. Testes de Personalidade

  • Exemplo Principal: O teste das 16 personalidades (MBTI).
  • Conceito: Classifica o perfil pessoal com base em dimensões como extroversão/introversão, sensação/intuição, entre outras.
  • Objetivo: Auxiliar na compreensão do próprio perfil e orientar escolhas profissionais e comportamentais.


3. Inteligência Emocional

  • Definição: Capacidade de reconhecer, compreender e gerenciar as próprias emoções e as dos outros.
  • Referência Clássica: Daniel Goleman, que destaca a importância da autogestão emocional e do autoconhecimento para manter o equilíbrio diante de desafios.
  • Aplicação: Melhora relacionamentos, facilita a resolução de conflitos e potencializa o desempenho no ambiente profissional.


4. Matriz SWOT Pessoal

  • Conceito: Ferramenta de análise estratégica que divide os aspectos pessoais em:
    • Forças (Strengths)
    • Fraquezas (Weaknesses)
    • Oportunidades (Opportunities)
    • Ameaças (Threats)
  • Objetivo: Auxiliar na identificação de aspectos internos (que você pode controlar) e externos (que podem ser aproveitados ou minimizados) para o autodesenvolvimento.


5. Mandala Ikigai

  • Conceito: Ferramenta de autoconhecimento originária do Japão que ajuda a encontrar o propósito de vida (o “razão de ser”).
  • Componentes:
    • O que amo fazer: Atividades que trazem alegria e satisfação.
    • O que faço bem: Habilidades e talentos pessoais.
    • Pelo que posso ser pago: Atividades que podem ser transformadas em fonte de renda.
    • Do que o mundo precisa: Contribuições que impactam positivamente a sociedade.
  • Objetivo: Identificar a interseção desses elementos para descobrir seu Ikigai.


6. Pitch Pessoal e Marca Pessoal

  • Pitch Pessoal:
    • Definição: Uma apresentação breve (discurso de elevador) que resume sua história, habilidades e experiências de forma clara e impactante.
    • Objetivo: Criar uma boa primeira impressão em entrevistas, reuniões e networking.
  • Marca Pessoal:
    • Definição: A imagem e identidade que você constrói profissionalmente com base em seu autoconhecimento e no modo como comunica sua história.


7. Habilidades e Competências para o Mercado de Trabalho

  • Habilidades Técnicas (Hard Skills):
    • Definição: Conhecimentos e capacidades específicas adquiridos por meio de formação e experiência (ex.: domínio de uma linguagem de programação, Excel avançado).
  • Habilidades Socioemocionais (Soft Skills):
    • Definição: Habilidades interpessoais e comportamentais, como comunicação, resiliência, empatia e trabalho em equipe.
  • Competência (Modelo CHA):
    • Definição: Conjunto integrado de Conhecimento, Habilidade e Atitude, que resulta em desempenho eficaz.
  • Ferramenta – Árvore de Competências:
    • Conceito: Representação visual onde:
      • Raízes: Competências fundamentais.
      • Tronco: Competências gerais.
      • Galhos: Competências específicas.
      • Frutos: Resultados alcançados.
      • Solo: Ambiente organizacional que influencia o desenvolvimento.

8. Iniciação Empreendedora

  • Conceito de Empreendedorismo:
    • Trata-se de identificar oportunidades, assumir riscos e transformar ideias em negócios ou iniciativas que gerem valor econômico e/ou social.
    • Envolve o entendimento histórico do termo, suas origens e a evolução do conceito – desde os primeiros registros até a visão moderna, ligada à inovação e à transformação de mercados.
  • Tipos de Empreendedorismo:
    • Por Necessidade: Quando o empreendedor se lança no mercado por falta de oportunidades no trabalho formal ou para suprir necessidades básicas.
    • Por Oportunidade: Motivado pela identificação de uma demanda ou desejo de inovar, criando soluções a partir de oportunidades percebidas no mercado.
    • Empreendedorismo Social: Focado em gerar impacto social, resolvendo problemas como acesso à educação, saúde, ou sustentabilidade, muitas vezes com um modelo de negócio híbrido que une lucro e valor social.
  • Perfis de Empreendedor:
    • Diversos perfis são apresentados, como o empreendedor nato, o idealista, o situacionista, o herdeiro, entre outros, cada um com motivações e características específicas.
    • Atividades em sala incentivam os alunos a refletirem sobre seus próprios perfis por meio de quizzes e debates, relacionando-os com exemplos práticos da área de Desenvolvimento de Sistemas.

9. Interesses x Competências

  • Definição e Distinção:
    • Interesses: São as áreas, atividades ou assuntos pelos quais você é apaixonado e que despertam sua curiosidade. Exemplo: gostar de tecnologia, arte ou esportes.
    • Competências: São as habilidades e conhecimentos que você desenvolveu ao longo do tempo – técnicas, socioemocionais e práticas – que lhe permitem executar tarefas com eficácia.
  • Ferramenta de Alinhamento com a Pirâmide de Maslow:
    • A Pirâmide de Maslow é utilizada para identificar as necessidades básicas e superiores. Ao compreender essas necessidades, é possível alinhar seus interesses pessoais às competências profissionais, de modo que o trabalho não só satisfaça demandas básicas (como segurança e estabilidade), mas também contribua para a autorrealização.
  • Aplicação Prática:
    • Atividades em sala incluem a criação de mapas conceituais, a definição de metas (usando ferramentas como o 5W2H) e o desenvolvimento de uma linha do tempo que ilustre o caminho futuro da carreira, integrando interesses e competências.

10. Autoconhecimento Profissional e Estilos de Trabalho

  • Conceito de Autoconhecimento Profissional:
    • Envolve compreender suas habilidades, interesses, valores e preferências no ambiente de trabalho para tomar decisões de carreira mais alinhadas com seu perfil.
    • Diferencia-se do autoconhecimento pessoal, pois foca especificamente nas competências e atitudes que influenciam o desempenho profissional.
  • Estilos de Trabalho:
    • São as preferências individuais sobre como se trabalhar melhor – seja em equipe, de forma individual ou adotando um estilo integrador que combine ambos.
    • Ferramentas, como o teste de estilo de trabalho da Fundação Estudar, ajudam a identificar características como agilidade, atenção aos detalhes, orientação para resultados, entre outros.
  • Jornada do Autoconhecimento Profissional:
    • Atividades práticas, como a “Jornada do Autoconhecimento Profissional”, guiam os alunos por meio de estações (como a criação de uma mandala profissional) onde eles refletem sobre seus pontos fortes, preferências e objetivos.
    • Essa prática estimula a integração de diversos instrumentos de autoconhecimento (Mandala Ikigai, SWOT, Linha do Tempo, Elevator Pitch) para construir uma visão mais clara sobre o futuro profissional e facilitar a escolha de ambientes de trabalho compatíveis.
  • Pesquisa e Mapeamento de Oportunidades:
    • Além do autoconhecimento, é enfatizada a importância de pesquisar as profissões e empresas de interesse, utilizando recursos como a Classificação Brasileira de Ocupações (CBO) e mapas conceituais para organizar informações sobre missão, visão e valores das organizações.
    • Essa abordagem prepara os alunos para criar um portfólio e um planejamento estratégico para a carreira, fundamentado na autoavaliação e no entendimento do mercado.

11. Habilidades Empreendedoras e Mentalidade de Crescimento

  • Definição e Importância:
    Esta seção enfatiza que o empreendedorismo não se resume apenas a uma ideia brilhante, mas envolve desenvolver um conjunto de habilidades que podem ser aprimoradas com esforço contínuo.
  • Elementos-Chave:
    • Mindset de Crescimento: A crença de que é possível aprender, adaptar-se e evoluir, transformando desafios em oportunidades.
    • Exemplos Práticos: São apresentados casos, como o de Anna Lisboa, que, ao enfrentar dificuldades, inovou (por exemplo, ao utilizar estratégias digitais para expandir seu negócio).
    • Ferramentas de Autoconhecimento: O Canvas Pessoal é introduzido como uma ferramenta visual que ajuda a mapear habilidades, valores e metas, facilitando a construção de um “modelo de negócio pessoal”.
  • Objetivo:
    Capacitar os alunos a reconhecerem suas potencialidades e a desenvolver atitudes empreendedoras para aplicar em iniciativas pessoais ou em empreendimentos sociais.




12. Panorama Atual e Tendências do Mercado de Trabalho

  • Mudanças e Transformações:
    Esta parte aborda as significativas transformações no ambiente profissional, destacando a evolução do contexto de trabalho e a necessidade de adaptação contínua.
  • Conceitos Fundamentais:
    • Mundo VUCA versus Mundo BANI:
      • VUCA descreve um cenário de Volatilidade, Incerteza, Complexidade e Ambiguidade, enquanto
      • BANI – um conceito mais atual – ressalta um ambiente Frágil, Ansioso, Não Linear e Incompreensível, enfatizando a imprevisibilidade e a necessidade de resiliência.
    • Novos Modelos de Trabalho:
      • A emergência de conceitos como anywhere office e o perfil do profissional slash mostram que hoje a flexibilidade, a capacidade de adaptação e a integração de múltiplas habilidades são essenciais para prosperar.
    • Empregabilidade e Trabalhabilidade:
      • São discutidas as diferenças entre estar preparado para o mercado (empregabilidade) e a capacidade de criar múltiplas fontes de renda (trabalhabilidade), refletindo a importância de se atualizar constantemente.
  • Estratégias para o Futuro:
    Os alunos são incentivados a desenvolver planos para a progressão profissional, alinhando suas competências com as demandas de um mercado em rápida evolução e integrando aspectos tecnológicos, sociais e econômicos.




Esses tópicos ampliam a jornada de autoconhecimento e orientação profissional, preparando os alunos para enfrentar os desafios do mundo empreendedor e se adaptar às tendências do mercado de trabalho contemporâneo.

treinamentos
Principais Jargões

1. Levantamento de Requisitos

  • Fundamentos e Importância:
    Os documentos iniciais apresentam a importância de levantar os requisitos para o desenvolvimento de software, garantindo que as necessidades dos usuários e do negócio sejam capturadas de forma clara.
  • Requisitos Funcionais vs. Não Funcionais:
    São abordadas as diferenças entre requisitos que definem “o que” o sistema deve fazer (funcionais) e aqueles que especificam “como” o sistema deve se comportar (não funcionais).
  • Gestão de Mudanças:
    São apresentadas estratégias para identificar, avaliar e mitigar os riscos decorrentes de alterações nos requisitos, além de práticas para comunicação efetiva entre stakeholders.

2. Testes de Software e Testes Funcionais

  • Objetivos dos Testes:
    Os PDFs dedicados aos testes enfatizam que os testes funcionais têm o papel de validar se o software cumpre os requisitos estabelecidos, enquanto os testes não funcionais avaliam aspectos como desempenho, segurança, usabilidade e confiabilidade.
  • Metodologias e Ferramentas:
    São comparadas abordagens tradicionais (modelo cascata) e ágeis (sprints, integração contínua) e destacadas ferramentas para automação e gestão de testes, como Selenium, JUnit, Jenkins, entre outras.
  • Processo de Teste:
    O ciclo de testes inclui planejamento, preparação do ambiente, execução, registro de defeitos e elaboração de relatórios, com ênfase na importância dos testes de regressão para assegurar que novas alterações não prejudiquem funcionalidades já consolidadas.

3. Técnicas de Elicitação de Requisitos

  • Técnicas Avançadas:
    São exploradas técnicas para coletar requisitos de forma eficaz, como entrevistas, questionários, workshops e sessões de brainstorming, que ajudam na modelagem e prototipagem dos requisitos.
  • Análise de Stakeholders:
    Aborda o processo de identificar, envolver e analisar as expectativas de todos os envolvidos no projeto, garantindo que os requisitos coletados sejam completos e alinhados às necessidades do negócio.
  • Comunicação e Colaboração:
    Destaca a importância da comunicação clara, da escuta ativa e do uso de ferramentas visuais para facilitar o entendimento e a resolução de conflitos durante a elicitação.

4. Modelagem de Dados Relacional

  • Conceitos Básicos:
    Os documentos sobre modelagem de dados explicam os fundamentos dos bancos de dados relacionais, incluindo a definição de entidades (objetos ou conceitos do mundo real) e atributos (propriedades que descrevem as entidades).
  • Relacionamentos e Integridade:
    São detalhados os tipos de relacionamentos (um-para-um, um-para-muitos e muitos-para-muitos) e a importância das chaves primárias e estrangeiras para manter a integridade referencial entre as tabelas.
  • Normalização e Desnormalização:
    A normalização é apresentada como método para minimizar redundâncias e dependências, enquanto a desnormalização é discutida como uma técnica para melhorar o desempenho das consultas em situações específicas.
  • Técnicas Avançadas e Tendências:
    São abordadas também técnicas de indexação e adaptações para modelagem de dados em ambientes de Big Data, evidenciando a evolução e as demandas modernas dos sistemas de banco de dados.

Considerações Finais

Esses PDFs formam uma base abrangente para o desenvolvimento de sistemas, abrangendo desde a coleta e gestão dos requisitos até a validação através de testes e a correta modelagem dos dados que suportam o sistema. Cada conjunto de documentos foca em uma etapa crucial do ciclo de vida do software, enfatizando metodologias ágeis e práticas modernas que garantem a qualidade, a eficiência e a adaptabilidade dos projetos de desenvolvimento.

Este resumo integra os conceitos e técnicas apresentados, servindo como um guia geral sobre os fundamentos do levantamento de requisitos, testes de software, técnicas de elicitação e modelagem de dados relacionais.

Jargões

  • Requisitos Funcionais:
    Especificam as funcionalidades que o sistema deve oferecer – o “o que” o software deve fazer.
  • Requisitos Não Funcionais:
    Definem os atributos de qualidade do sistema, como desempenho, segurança, usabilidade e confiabilidade – o “como” o sistema deve se comportar.
  • Stakeholders:
    Todas as partes interessadas no projeto, como clientes, usuários, desenvolvedores e gestores, que têm influência ou são impactados pelo sistema.
  • Elicitação de Requisitos:
    Processo de coleta, análise e validação das necessidades e expectativas dos stakeholders para definir os requisitos do sistema.
  • Modelagem e Prototipagem:
    Técnicas utilizadas para criar representações visuais ou funcionais do sistema (por meio de diagramas, wireframes ou protótipos) antes de sua implementação.
  • Workshops de Requisitos:
    Sessões colaborativas com os stakeholders para discutir, definir e priorizar os requisitos do projeto.
  • Brainstorming:
    Técnica de geração de ideias de forma colaborativa para identificar possíveis requisitos e soluções.
  • CI/CD (Integração Contínua/Entrega Contínua):
    Práticas que permitem testar, integrar e entregar alterações de forma automatizada e contínua, facilitando a manutenção e a evolução do software.
  • Testes Funcionais:
    Conjunto de testes que verificam se as funcionalidades do sistema estão de acordo com os requisitos estabelecidos.
  • Testes Não Funcionais:
    Avaliam aspectos como desempenho, segurança, usabilidade e confiabilidade, que não estão diretamente relacionados às funcionalidades.
  • Testes de Regressão:
    Testes repetidos após alterações no sistema para garantir que funcionalidades já implementadas não foram comprometidas.
  • Automação de Testes:
    Uso de ferramentas (como Selenium, JUnit, Jenkins) para executar testes de forma automática, aumentando a eficiência e a repetibilidade do processo.
  • Modelagem de Dados Relacional:
    Técnica para estruturar bancos de dados relacionais por meio da definição de entidades, atributos e relacionamentos, garantindo integridade e eficiência no armazenamento.
  • Entidades e Atributos:
    • Entidades: Representam objetos ou conceitos do mundo real (ex.: Estudante, Curso).
    • Atributos: São as características ou propriedades que descrevem as entidades (ex.: Nome, Data de Nascimento).
  • Chaves Primárias e Estrangeiras:
    • Chave Primária: Atributo único que identifica cada registro de uma tabela.
    • Chave Estrangeira: Atributo que cria uma ligação entre duas tabelas, referenciando a chave primária de outra.
  • Normalização e Desnormalização:
    • Normalização: Processo de organizar dados para minimizar redundâncias e dependências indesejadas.
    • Desnormalização: Técnica que reintroduz redundância de forma controlada para melhorar o desempenho das consultas.
  • Indexação:
    Criação de índices nas tabelas para acelerar a busca e recuperação de dados.
  • MER/DER (Modelo/Diagrama Entidade-Relacionamento):
    Representações gráficas que ilustram as entidades, os atributos e os relacionamentos em um banco de dados.
  • Big Data:
    Termo que se refere ao tratamento e análise de grandes volumes de dados, muitas vezes exigindo tecnologias e modelos de dados adaptados às altas escalas.

Esses termos formam a base da terminologia utilizada nos processos de levantamento de requisitos, testes de software e modelagem de dados, fundamentais para o desenvolvimento de sistemas robustos e eficientes.

Estrangeirismos e seus significados

Stakeholders:
Partes interessadas no projeto (ex.: clientes, usuários, equipe técnica) que têm impacto ou são impactados pelo produto.

CI/CD (Continuous Integration/Continuous Delivery):
Práticas de Integração Contínua e Entrega Contínua que automatizam a compilação, testes e implantação de software, permitindo entregas frequentes e seguras.

Scrum:
Metodologia ágil de gerenciamento de projetos, focada em ciclos curtos de desenvolvimento (sprints) e colaboração intensa entre os membros da equipe.

Kanban:
Método ágil que utiliza cartões e quadros visuais para gerenciar e otimizar o fluxo de trabalho, permitindo a visualização e controle das tarefas em andamento.

Brainstorming:
Técnica de geração de ideias em grupo, onde os participantes contribuem livremente com sugestões para solucionar problemas ou definir requisitos.

Workshop:
Sessão colaborativa e prática, geralmente realizada com stakeholders, para discutir, definir e priorizar requisitos ou soluções.

Selenium:
Ferramenta de automação utilizada para testar aplicações web, simulando interações de usuários em navegadores.

JUnit:
Framework para testes unitários em aplicações Java, ajudando a validar a funcionalidade de pequenas partes do código.

Jenkins:
Ferramenta de automação para integração contínua, que permite executar testes e implantar software automaticamente após alterações no código.

Big Data:
Conjunto de dados de grande volume, variedade e velocidade, que exige tecnologias e abordagens específicas para armazenamento, processamento e análise.

MER (Modelo de Entidade-Relacionamento):
Representação gráfica dos dados (entidades, atributos e relacionamentos) utilizada para estruturar bancos de dados relacionais.

DER (Diagrama de Entidade-Relacionamento):
Diagrama que ilustra as entidades de um sistema, seus atributos e como estão inter-relacionadas, auxiliando no design do banco de dados.

Feedback:
Retorno de informações, críticas ou avaliações que ajudam a ajustar e melhorar processos ou produtos.

Prototype (Prototipagem):
Criação de um modelo inicial (wireframe, mockup ou versão funcional simplificada) do sistema, usado para testar conceitos e obter feedback dos usuários.

Regression Testing (Testes de Regressão):
Conjunto de testes realizados após alterações no sistema para garantir que funcionalidades já implementadas não foram afetadas negativamente.

Normalization (Normalização):
Processo de organização dos dados em um banco de dados para reduzir redundâncias e garantir a integridade dos dados.

Desnormalization (Desnormalização):
Técnica que reintroduz redundância de forma controlada para melhorar a performance de consultas em determinadas situações.

DOCTO
Diário de Bordo – 16/02/2025

Correções no firmware do PH

  • Implementação do controle de FinalizaCOMANDO em todos os comandos
  • Ajuste e aplicação no comando MAN
  • Ajuste e aplicação MoverEsquerda

Hardware Modulo 2

  • Isolação de fios com temo retrátil

Operador Windows

  • Implementação tela de receitas, (COMANDOS de TRANSPORTE)

Firmware Transporte

  • Correção em funções EnviaParaSerial2 e Le_Serial2

Print Screen

Comandos de Transporte

Implementação Comandos de Módulos

Desta forma as receitas podem ser facilmente gerenciadas.