Blog

  • Por que testes automatizados?

    Quando implementamos um programa, procedimento ou classe, temos expectativas sobre seu comportamento:

    • Numa função de soma esperamos que ao passar por argumentos os números “3” e “4” o resultado seja “7”.
    • Num método de um repositório para inserir um recurso em uma base de dados, que ele seja persistido, o que seria confirmado por uma consulta à base de dados.

    Nestas situações, como é que garantimos que nossa solução funciona?

    Mutas vezes testando manualmente através do terminal, com print(), interagimos com a interface gráfica, ou com o – misteriosamente esquecido – debugger.

    Para um componente simples isso pode parecer suficiente, mas e nos casos em que existem vários fluxos de execução, lançamento de exceções ou complexa mutação de estado?

    Teremos que testar todos fluxos possíveis do nosso componente a cada modificação do código-fonte!

    A natureza repetitiva dos testes manuais nos leva ao erro e à frustração, concentrando nossos esforços em uma atividade manual em vez de criativa.

    Além disso, os testes dão ao desenvolvedor segurança de que a implementação de novas funcionalidades ou a refatoração não produzirão regressões:

    "Desenvolvimento orientado a testes é uma forma de administrar o medo durante a programação"- Kent Beck

    Desenvolvimento de software é quase sempre uma atividade coletiva. Todos os dias são integradas modificações em repositórios de forma paralela.

    É importante garantir que a feature que estamos desenvolvendo não produza efeitos colaterais em outras partes do sistema.

    Como é impraticável para o desenvolvedor testar toda a aplicação, uma alternativa é desenvolver uma pipeline de integração continua (CI) com execução de testes automatizados, delegando à máquina a maior parte desse esforço.

    Testando o comportamento

    Há várias abordagens para implementação de testes automatizados. Aqui vamos nos ater ao proposto por Daniel-Terhorst e Chris Matts no Desenvolvimento Orientado a Comportamento (BDD).

    Como próprio nome sugere, a proposta é testar o comportamento dos componentes de forma agnóstica – independente aos detalhes da implementação -.

    Nessa proposta um teste consiste por três estágios:

    • Given (Dado): a entrada; ou estado inicial da aplicação para testar o comportamento.
    • When (Quando): a execucao do comportamento a ser testado
    • Then (Então): a comparação entre o comportamento esperado e o comportamento produzido.

    Em Python, podemos utilizar o framework Pytest para implementar e executar testes. No contexto de um método de soma:

    def test_add():
        calc = Calculator()     # DADA uma instância de calculadora
        result = calc.add(2, 2) # QUANDO eu chamar o método de soma com 2 e 2
        assert result == 4      # ENTÃO o resultado deve ser 4

    Podemos testar também o lançamento de exceções e mensagens de erro:

    def test_divide_by_zero():
        calc = Calculator()     # DADA uma instância de calculadora
        try:
            calc.divide(5, 0)   # QUANDO eu dividir um número por zero
        except ValueError as e:
            assert str(e) == 'Cannot divide by zero' # ENTÃO uma exceção deve ser lançada com a mensagem 'Cannot divide by zero'

    Com um conjunto abrangente de testes, qualquer pessoa pode rapidamente testar um sistema, estando cobertos os fluxos de falha e sucesso.

    Notem que esses são exemplos muito granulares. Estão sendo testados unidades de comportamento isoladamente.

    No entanto, as aplicações que desenvolvemos tem um ciclo muito mais complexo. Os dados são processados de forma assíncrona, por vários componentes integrados, trafegam pela rede, são serializados e desserializados…

    Essa complexidade tornam relevantes os

    Testes de integração (integration tests)

    Embora não exista uma definição rigorosa de teste de integração, vamos considerar integração como a circunstancia em que a aplicação interage com sistemas externos, como o sistema de arquivos, um web service ou um banco de dados.

    Vamos imaginar um aplicativo de catálogo de filmes usando TypeScript – a variante fortemente tipada do JavaScript – e o framework de testes Jest.

    Ela interage com uma base de dados SQL para persistir dados relevantes sobre filmes.

    Um filme, entidade Movie, tem os atributos: movie_id, create_at, title, director, rating.

    Todas as operações relacionados a interação com o banco de dados são implementadas na camada de repositório com os seguintes métodos:

    • save(Movie): insere na tabela movies do banco de dados os atributos de uma entidade Movie.
    • getMovieById(movieId): retorna os todos os atributos de um filme por movie_id.
    • deleteMovieById(movieId): remove do banco de dados todos os atributos relativos a um movie_id.
    export default class MovieRepositoryDatabase implements MovieRepository {
    	constructor(readonly connection: DatabaseConnection) {}
    
    	async save(movie: Movie) {
    		await this.connection.query(
    			"insert into movie_store.movies (movie_id, created_at, title, director, rating) values ($1, $2, $3, $4, $5)",
    			[
    				movie.getMovieId(),
    				movie.getCreatedAt().toDateString(),
    				movie.getMovietitle(),
    				movie.getDirector(),
    				movie.getRating(),
    			],
    		);
    	}
    
    	async getByMovieById(movieId: string) {
    		const [movieData] = await this.connection.query(
    			"SELECT movie_id, created_at, title, director, rating FROM movie_store.movies WHERE movie_id = $1",
    			[movieId],
    		);
    		if (!movieData) return;
    		return Movie.restore(
    			movieData.movie_id,
    			movieData.created_at,
    			movieData.title,
    			movieData.director,
    			movieData.rating,
    		);
    	}
    
    	async deleteByMovieId(movieId: string) {
    		await this.connection.query(
    			"delete from movie_store.movies where movie_id = $1",
    			[movieId],
    		);
    	}
    }

    Como poderíamos implementar um teste para as operações desse repositório?

    Começando pelo método save(movie), seguindo o padrão “Given, When, Then”:

    • Given, ou o estado inicial da aplicação para testar o comportamento:
      • Banco de dados SQL de nome movie_store e tabela movies, com todos os atributos da entidade Movie: movie_id, create_at, title, director, rating.
      • Conexão com o banco de dados, abstraída pela entidade DatabaseConnection.
      • Instância de MovieRepository passando a entidade DatabaseConnection por argumento.
      • Instância da entidade Movie com os atributos a serem persistidos n banco de dados.
    const connection = new DatabaseConnection();
    const movieRepository = new MovieRepositoryDatabase(connection);
    const movie = new Movie("1", new Date(), "Inception", "Christopher Nolan", 5);
    • When, o comportamento a ser testado:
      • Invocamos o método save(Movie) do MovieRepository passando a entidade Movie por argumento.
    await movieRepository.save(movie);
    • Then, a comparação entre o comportamento esperado e o produzido:
      • Utilizando o método getByMovieById(movieId) vamos comparar os astributos de Movie persistidos na base de dados com os passados inicialmente.
    expect(savedMovie).toEqual(movie);

    A implementação completa:

    test("deve salvar um filme na base de dados", async () => {
    	const connection = new DatabaseConnection();
    	const movieRepository = new MovieRepositoryDatabase(connection);
    	const movie = new Movie("1", new Date(), "Inception", "Christopher Nolan", 5);
    	await movieRepository.save(movie);
    	const savedMovie = await movieRepository.getByMovieById("1");
    	expect(savedMovie).toEqual(movie);
    });

    Em comparação com o teste unitário, o teste de integração segue por um fluxo mais próximo do funcionamento normal da aplicação.

    Ele garante o funcionamento básico de nosso repositório e a integração da aplicação com o banco de dados.

    Mas é um teste mais caro e complexo, porque exige uma uma base de dados execução e integra com outros componentes.

    Ainda assim, podemos desenvolver testes ainda mais abrangentes: os

    Testes ponta-a-ponta (end-to-end tests)

    Em testes ponta-a-ponta, testamos a aplicação a partir da interface do usuário.

    Embora nem todas as aplicações tenham interface gráfica (GUI), a predominância de aplicações web levou ao surgimento de frameworks de testes front-end como pupeteer, playwright, cypress.

    Com eles é possível interagir com elementos da DOM (document object model) disparar eventos e verificar o seu estado.

    Em um exemplo com o framework cypress:

    • Given: Acessa o endereço http://localhost:3000
    • When:
      • Checa existência de elementos de input de um formulário com atributos input[name=”nome” e input[email=”email” na DOM
      • Preenche os campos de input
      • Simula o clique de submissão de formulário
    • Then: Verifica se um elemento contendo “Obrigado, João!” está visível para o usuário.
    describe('Exemplo de teste e2e com Cypress', () => {
      it('Deve preencher o formulário e verificar o resultado', () => {
        cy.visit('http://localhost:3000'); 
        cy.get('input[name="nome"]').type('João Silva'); 
        cy.get('input[email="email"]').type('joao.silva@example.com');email
        cy.get('button[type="submit"]').click();
        cy.contains('Obrigado, João').should('be.visible');
      });
    });

    Estes são os testes mais caros em termos de infraestrutura necessária, do tempo de execução e das camadas de abstração que abrangem. No entanto, são os que mais se aproximam do fluxo completo de uma aplicação.

    A pirâmide de testes

    É uma metáfora visual proposta por Mike Cohn para visualizar as diferentes camadas de tipos de teste e o quanto testar em cada uma delas.

    Quanto mais alta a integração – como nos testes ponta-a-ponta -, mais cara e lenta é a execução do teste. Na base da pirâmide temos os performáticos testes unitários.

    A proposta é concentrar o maior número de testes no nível mais baixo, testando uma ampla variedade de fluxos de execução. E no nível mais alto, testar apenas os principais fluxos de execução.

    Conclusão

    • Testes automatizados poupam o desenvolvedor de esforços repetitivos e sujeitos a erro.
    • Criam um ciclo de feedback rápido para preventivamente identificar bugs; dão segurança para que sejam feitas refatorações e integração continua.
    • Existem frameworks para testar inclusive interfaces gráficas de aplicações web.
    • Tem diferentes níveis de granularidade e integração, idealmente nos levando a implementar uma maior quantidade de testes de baixo nível.

    Recursos úteis

  • Uso do requirements.txt em Projetos Python

    Introdução

    O arquivo requirements.txt é essencial em projetos Python, especialmente em desenvolvimento colaborativo ou quando se trabalha com ambientes virtuais. Ele permite que as dependências de um projeto sejam facilmente instaladas em qualquer ambiente, garantindo que todos os colaboradores estejam usando as mesmas versões de bibliotecas e evitando problemas de compatibilidade. Além disso, facilita o processo de deploy em produção, tornando o ambiente de produção idêntico ao ambiente de desenvolvimento.


    Passo a Passo para Usar o requirements.txt

    1- Criando um Ambiente Virtual Para garantir que você tenha um ambiente isolado e controlado, é recomendável criar um ambiente virtual. Isso impede que as dependências do projeto afetem outros projetos.

    # Python
    python3 -m venv venv
    

    2- Ativando o Ambiente Virtual Após a criação do ambiente, ative-o. Em sistemas operacionais diferentes, o comando pode variar:

    ● No Windows:

    # Python
    venv\Scripts\activate
    

    ● No MacOS / Linux:

    # Python
    source venv/bin/activate
    

    3- Instalando Dependências do Projeto Com o ambiente virtual ativado, instale as bibliotecas necessárias. Por exemplo:

    # Python
    pip install flask numpy pandas
    

    4- Criando o requirements.txt Após instalar as bibliotecas, gere o arquivo requirements.txt com as dependências que foram instaladas no ambiente. Esse arquivo listará automaticamente as versões das bibliotecas utilizadas:

    # Python
    pip freeze > requirements.txt
    

    5- Instalando Dependências a Partir do requirements.txt Para configurar o ambiente de outra pessoa ou de produção com as mesmas dependências, utilize o requirements.txt. Com o ambiente virtual ativo, basta rodar o comando:

    # Python
    pip install -r requirements.txt
    

    6- Atualizando o requirements.txt Sempre que uma nova biblioteca é adicionada ao projeto, lembre-se de atualizar o requirements.txt para que todos os membros da equipe possam instalar as dependências corretamente:

    # Python
    pip freeze > requirements.txt
    

    Conclusão

    O requirements.txt é uma ferramenta simples, mas poderosa, que permite que desenvolvedores garantam consistência nas dependências de um projeto Python. Ele facilita a configuração de novos ambientes de desenvolvimento e produção e reduz problemas de compatibilidade. Usando o requirements.txt de forma adequada, o processo de desenvolvimento se torna mais fluido, seguro e eficiente, especialmente em projetos colaborativos e ambientes de produção.

  • Como Iniciar um Projeto Django: Um Guia Passo a Passo

    Django Start

    Introdução

    Django é um dos frameworks mais populares para desenvolvimento web em Python, conhecido por sua robustez, facilidade de uso e rapidez para construir aplicações web. Com o lema “The Web framework for perfectionists with deadlines” (O framework web para perfeccionistas com prazos), Django oferece uma estrutura que permite desenvolver aplicativos seguros e escaláveis com rapidez. Neste artigo, vamos explorar como iniciar um projeto Django, passando pelo ambiente virtual, instalação do Django e criação de uma aplicação básica. Ao final, você terá uma base sólida para expandir e construir aplicações mais complexas.

    Passo a Passo para Iniciar um Projeto Django

    É uma boa prática utilizar um ambiente virtual ao desenvolver em Python, pois ele ajuda a isolar as dependências do projeto. Para configurar, siga as instruções abaixo:

    # Python
    
    # Navegue até a pasta onde deseja criar seu projeto
    cd ~/meus-projetos
    
    # Crie o ambiente virtual (substitua "venv" pelo nome que preferir)
    python3 -m venv venv
    
    # Ative o ambiente virtual
    source venv/bin/activate  # Para Linux ou MacOS
    venv\Scripts\activate  # Para Windows
    
    

    Com o ambiente virtual ativado, todas as bibliotecas que instalarmos estarão contidas nesse ambiente, sem interferir com outras instalações Python no sistema.

    Passo 2: Instalando o Django

    Com o ambiente virtual ativo, o próximo passo é instalar o Django usando o comando abaixo:

    # Python
    pip install django
    

    Para verificar se a instalação foi bem-sucedida e ver a versão do Django instalada, execute:

    # Python
    django-admin --version
    

    Passo 3: Criando um Novo Projeto Django

    Agora, vamos criar um novo projeto Django. Esse projeto servirá como a estrutura principal para nossa aplicação web.

    # Python
    # Substitua "meuprojeto" pelo nome do seu projeto
    django-admin startproject meuprojeto
    cd meuprojeto
    

    Esse comando criará uma estrutura de pastas com a seguinte configuração:

    # Python
    meuprojeto/
    ├── manage.py
    ├── meuprojeto/
        ├── __init__.py
        ├── settings.py
        ├── urls.py
        ├── asgi.py
        └── wsgi.py
    

    Passo 4: Rodando o Servidor de Desenvolvimento

    Com o projeto configurado, vamos iniciar o servidor de desenvolvimento para garantir que tudo está funcionando corretamente. Execute o seguinte comando:

    # Python
    python manage.py runserver
    

    Se tudo estiver funcionando, você verá uma mensagem indicando que o servidor está rodando. Abra seu navegador e acesse http://127.0.0.1:8000/ para ver a página inicial padrão do Django.

    Passo 5: Criando um Aplicativo Django

    No Django, um “aplicativo” representa uma parte da funcionalidade de um site. Vamos criar um aplicativo chamado blog como exemplo:

    # Python
    python manage.py startapp blog
    

    Esse comando criará uma nova pasta chamada blog dentro do diretório do projeto, contendo os arquivos necessários para o funcionamento do aplicativo.

    Passo 6: Configurando o Aplicativo no Projeto

    Para que o Django reconheça o novo aplicativo, precisamos adicioná-lo na configuração do projeto. Abra o arquivo settings.py e, na seção INSTALLED_APPS, adicione o nome do aplicativo:

    # Python
    # em meuprojeto/settings.py
    INSTALLED_APPS = [
        ...
        'blog',
    ]
    

    Passo 7: Criando a Primeira View

    Vamos criar uma view simples no aplicativo blog. No arquivo views.py dentro da pasta blog, adicione o seguinte código:

    # Python
    # blog/views.py
    from django.http import HttpResponse
    
    def homepage(request):
        return HttpResponse("Bem-vindo ao meu Blog!")
    

    Passo 8: Configurando a URL

    Para que a view esteja acessível, precisamos definir uma URL para ela. Crie um novo arquivo chamado urls.py na pasta blog e adicione o seguinte conteúdo:

    # Python
    # blog/urls.py
    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('', views.homepage, name='homepage'),
    ]
    

    Agora, abra o arquivo urls.py do projeto e inclua as URLs do aplicativo blog:

    # Python
    # meuprojeto/urls.py
    from django.contrib import admin
    from django.urls import path, include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('', include('blog.urls')),
    ]
    

    Passo 9: Testando a Aplicação

    Com tudo configurado, inicie novamente o servidor e acesse http://127.0.0.1:8000/. Se tudo foi feito corretamente, você verá a mensagem “Bem-vindo ao meu Blog!” na página inicial.

    # Python
    python manage.py runserver
    

    Conclusão:

    Com esse guia, você aprendeu o básico para iniciar um projeto Django: desde a configuração do ambiente virtual até a criação de um aplicativo com uma view simples. Django é uma ferramenta poderosa que oferece inúmeras funcionalidades para desenvolver aplicações robustas e escaláveis rapidamente. Com essa base, você está pronto para explorar mais sobre o framework e criar aplicações cada vez mais complexas!

  • Proof of Participation

    Proof of Participation – Sistema Tokenizado em Blockchain para Prova de Presença

    O Problema com os Sistemas de Comprovação de Presença Atuais

    Os métodos tradicionais de comprovação de presença são amplamente vulneráveis a fraudes e ineficiências. Muitas vezes, participantes conseguem validar sua presença mesmo sem estar fisicamente no local, utilizando sistemas suscetíveis a falhas humanas ou técnicas, como listas manuais, aplicativos pouco seguros ou cartões de ponto. Isso não apenas compromete a credibilidade do evento ou treinamento, mas também prejudica a rastreabilidade e a transparência para organizadores e participantes.

    Em um contexto onde confiança, segurança e automação são imprescindíveis, um sistema inovador de prova de presença presencial baseado em blockchain se torna não apenas uma solução, mas um padrão a ser seguido.

    A Solução: Proof of Participation

    O Proof of Participation é uma plataforma tokenizada que registra presenças em eventos, cursos, treinamentos, hackathons, inspeções, trabalho e outras atividades presenciais de forma automatizada e imutável. Utilizando blockchain como base para autenticação, o sistema garante que a presença registrada não pode ser alterada ou falsificada.

    Simplicidade de Uso: A Jornada do Usuário

    1. Ao chegar no evento, o participante escaneia um QR Code exibido no local.
    2. O sistema solicita apenas o endereço de e-mail e, de forma automática, registra dados como geolocalização, horário e IP.
    3. O usuário recebe um e-mail com um link único para finalizar seu cadastro e pode inserir informações adicionais, como nome completo.
    4. Durante o evento, outros QR Codes permitem registrar a participação em atividades específicas.
    5. Ao término do evento os certificados são gerados e enviados automaticamente por e-mail aos participantes.
    6. Os certificados podem ser verificados publicamente por qualquer pessoa, utilizando a blockchain como prova de autenticidade.

    Sem necessidade de apps, senhas ou processos complexos. Um celular com acesso à internet é suficiente para participar e gerenciar os dados.

    Por que o Sistema é Revolucionário?

    • Segurança: Certificados registrados em blockchain são imutáveis e auditáveis.
    • Simplicidade: Interface amigável sem a necessidade de aplicativos ou senhas.
    • Automação: Geração automática de certificados com validação de autenticidade integrada.
    • Rastreabilidade: Cada registro de presença é documentado com geolocalização, horário e IP.

    Tecnologias e Ferramentas Utilizadas

    • AWS CloudFront: Distribuição de conteúdo com alta disponibilidade e baixo custo.
    • Amazon S3: Armazenamento de arquivos, incluindo a imagem dos certificados e metadados JSON.
    • Amazon DynamoDB: Banco de dados NoSQL para armazenar chaves públicas, metadados e registros do usuário.
    • API Gateway: Gerenciamento seguro das APIs que conectam o frontend ao backend.
    • AWS Lambda: Execução de rotinas serverless para manipulação de dados, interação com blockchain e geração de certificados.
    • Pillow (Python): Biblioteca gráfica para criação de certificados personalizados a partir de camadas gráficas.
    • React: Frontend responsivo e intuitivo para interações do usuário.
    • Blockchain: Registro imutável de certificados, garantindo autenticidade e rastreabilidade.

    Por que este Sistema Deve Ser um Padrão?

    O Proof of Participation redefine como a presença é registrada e validada, eliminando vulnerabilidades dos sistemas tradicionais. Ao adotar esta tecnologia:

    • Organizadores ganham credibilidade e automação.
    • Participantes têm acesso rápido e seguro aos seus certificados.
    • Empresas e instituições reduzem custos operacionais e fraudes.

    Criado pela Comunidade Python Floripa, este projeto representa uma abordagem colaborativa, inovadora e de impacto social, alinhada com os princípios de código aberto. Ele está aberto a voluntários interessados em contribuir para o avanço da tecnologia blockchain e a melhoria contínua da plataforma.

    Evolução do Projeto

    Repositório GitHub

    Primeiro Meeting – 06/11/24

    Segundo Meeting – 13/11/24

    Terceiro Meeting – 20/11/24

    Release da Reunião – Proof of Participation

    Data: 20/11/2024
    Duração: 98 minutos
    Participantes: Jardel Godinho, Lucas Oliveira, Luiz Bruno Vianna, Ricardo May

    Definições

    1. Estratégia para Contribuições Comunitárias:

    • Publicação das tarefas no GitHub com prazos definidos (deadlines).
    • Após o prazo, caso não haja contribuições, a equipe interna assume a execução da tarefa.
    • Incentivar a comunidade por meio de divulgação ativa, destacando os benefícios de participar.

    2. Arquitetura e Uso de Tecnologias:

    • Continuidade com o uso do Amazon S3 como principal solução de armazenamento.
    • Consideração de uso complementar do IPFS (InterPlanetary File System) para distribuição descentralizada de arquivos.
    • Implementação inicial de serviços serverless com AWS Lambda e API Gateway.

    3. Certificados:

    • Utilização da biblioteca Pillow (Python) para manipulação de camadas gráficas e geração de certificados em formato otimizado para divulgação (PNG/JPEG).
    • Certificados serão públicos, com dados sensíveis mascarados, mas autenticação e validação garantidas pela blockchain.

    4. Divulgação e Identidade Visual:

    • Os certificados terão elementos visuais padronizados que remetam à identidade da Python Floripa, garantindo autenticidade e divulgação da marca.
    • As empresas ou eventos parceiros poderão personalizar elementos gráficos (e.g., logo, selos), respeitando os padrões estabelecidos.

    5. Princípios de Segurança e Confiança:

    • Blockchain como base para garantir autenticidade imutável dos certificados.
    • Redundância no armazenamento para mitigar riscos de perda de dados.

    Próximos Passos

    1. Tarefas de Prioridade:

    • Configuração inicial de GitHub para organização das tarefas e controle de versões.
    • Implementação do fluxo de autenticação (código 2FA enviado por e-mail).
    • Desenvolvimento do serviço para validação de tokens enviados ao usuário.

    2. Estruturação do MVP:

    • Implementação do processo de check-in e registro de presença.
    • Geração de certificados em lotes ao término do evento.
    • Armazenamento de certificados prontos no S3 para otimização de consultas futuras.

    3. Divulgação e Envolvimento Comunitário:

    • Preparação de postagens para redes sociais (Instagram, LinkedIn) incentivando a contribuição ao projeto.
    • Realização de um release para atrair mais desenvolvedores, detalhando as tarefas disponíveis e os próximos marcos.

    Compromissos Assumidos

    Jardel Godinho:

    • Coordenar a publicação de tarefas no GitHub e definir deadlines.
    • Preparar materiais para divulgação nas redes sociais.
    • Prototipar templates de certificados com elementos visuais definidos.

    Lucas Oliveira:

    • Desenhar fluxo detalhado de comunicação do backend com blockchain.
    • Validar tokens recebidos no backend e garantir a segurança do fluxo.
    • Garantir a conformidade com os princípios de blockchain e segurança.

    Luiz Bruno Vianna:

    • Testar e avaliar o uso do IPFS para armazenamento complementar e propor cenários de uso.
    • Desenvolver métodos, modelos e definir cadencia de comunicação por e-mail com o usuário, dispensando uso de senhas.
    • Prototipar e apresentar soluções para montagem dinâmica de certificados.

    Ricardo May:

    • Estruturar o esquema inicial do banco de dados no DynamoDB.
    • Avaliar estratégias para redundância no armazenamento de arquivos.
    • Propor melhorias para integração entre backend e blockchain.
    • Desenvolver estratégias de otimização dos serviços AWS.

    A reunião reforçou o comprometimento da equipe com prazos e a importância de envolver a comunidade no projeto. Com um MVP bem definido, a Python Floripa visa tornar este sistema um padrão em eventos presenciais, garantindo segurança, eficiência e simplicidade.

    Quarto Meeting – 27/11/24

    Release da Reunião – 27/11/2024

    Data: 27/11/2024
    Duração: 93 minutos
    Participantes: Jardel Godinho, Jonathan Batista, Luiz Bruno Vianna, Maxson Almeida, Otavio Augusto, Ricardo May


    A reunião teve como objetivo discutir o desenvolvimento de um sistema para geração e validação de certificados digitais durante eventos, com foco em usabilidade, eficiência e integração com tecnologias modernas, como blockchain. Durante o encontro, foram apresentadas as soluções já implementadas, testados fluxos e definidos próximos passos para evolução do projeto.

    Definições

    1. Estrutura do Sistema:

    O sistema será composto por três níveis de usuários:

    • Participante: Responsável por acessar e atualizar seus próprios dados.
    • Colaborador do Evento: Com capacidade de visualizar e corrigir informações de participantes no contexto do evento.
    • Administrador do Evento: Pode cadastrar eventos, gerenciar participantes e colaboradores, além de finalizar eventos para a geração de certificados.

    •Os certificados incluirão selos de atividades realizadas pelos participantes, destacando sua participação nas palestras e trilhas do evento.

    2. Login por Magic Link:

    Foi validado o fluxo de autenticação sem senha via magic link, enviado para o e-mail do usuário. O processo foi bem recebido e será mantido como padrão.

    3. Geração de Certificados:

    Cada certificado conterá:

    • Nome completo do participante.
    • Códigos de validação únicos em formato hexadecimal.
    • Selos das atividades realizadas.
    • Os certificados serão gerados e enviados de forma cadenciada, para otimizar recursos e evitar bloqueios por servidores de e-mail.

    4. Registro de Localização e Horário:

    Durante o check-in nas atividades, será registrado o horário e a localização do usuário, proporcionando maior confiabilidade aos certificados.

    5. Uso de Blockchain:

    Por enquanto, um simulador de blockchain será utilizado para armazenar os dados. Futuramente, a solução será migrada para redes reais, como a Stellar, devido à sua eficiência energética e econômica.

    Próximos Passos

    1. Teste no Evento de 30/11/2024:

    O sistema será testado no 81º Encontro Python Floripa, enviando certificados ao término do evento e observando a reação dos participantes.

    Verificar adesão e engajamento dos usuários com os certificados, especialmente publicações em redes sociais como LinkedIn.

    2. Evolução do Sistema:

    Implementar interface administrativa para geração e gerenciamento de QR Codes associados às atividades do evento.

    Explorar o registro de check-out dos participantes para futuros eventos que demandem controle de tempo de permanência.

    3. Aprimoramento da Infraestrutura:

    Estudar soluções para reduzir o impacto no envio de e-mails em massa, incluindo escalonamento por filas e melhorias na credibilidade do domínio.

    Avaliar ferramentas mais performáticas para manipulação de imagens e geração de certificados.

    4. Benchmarking Energético:

    Avaliar o consumo energético do sistema atual e realizar comparações entre Stellar, Ethereum e Bitcoin para fundamentar decisões futuras.


    A reunião consolidou pontos críticos do projeto e definiu um caminho claro para os próximos testes e melhorias. O sistema será validado em um ambiente real no evento de 30/11/2024, proporcionando insights valiosos para ajustes futuros.

    Release da Reunião – 11/12/2024

    Data: 11/12/2024
    Duração: 81 minutos
    Participantes: Jardel Godinho, Jonathan Batista, Luiz Bruno Vianna, Ricardo May

    A reunião teve como objetivo discutir o desenvolvimento do sistema de emissão e validação de certificados com integração a blockchain, explorando pontos técnicos, desafios de implementação e privacidade, além de definir os próximos passos e responsabilidades para os membros da equipe.

    Definições

    1. Estrutura do Certificado:

    • O certificado será representado por um hash único gerado a partir da imagem ou dos dados.
    • Incluirá informações básicas como nome do evento, data, hora e localização (latitude/longitude).
    • Um hash será registrado na blockchain para validação posterior, preservando a privacidade do usuário.
    • O hash será enviado ao usuário, garantindo validação do certificado na primeira versão.
    • Avanços de versão devem prever o envio da chave publica e privada permitindo a portabilidade e validação independente.

    2. Privacidade e LGPD:

    Nenhum dado pessoal, como nome ou e-mail, será armazenado diretamente na blockchain. Hashs derivados desses dados serão utilizados para preservar a privacidade.

    3. Intermediação da Plataforma:

    A plataforma será a intermediária no registro e validação dos certificados, mas a estrutura será preparada para futura descentralização, permitindo independência do sistema.

    4. Interfaces do Usuário:

    Painel Administrador do Evento

    • Registrar / Editar Evento: Data, Horário, Local, Atividades, Background Certificado, Logo, Selos (referente as atividades), Definir dados do form pós-checkin, Incluir Staff, Checkout (S/N).
    • Gera URLs / QR-CODEs de checkin, atividades e checkout.
    • Gerar Certificados (validar se os dados necessários existem e submeter apenas os com dados completos) e Lista de presença.

    Painel Participante do Evento

    • Enriquecer / Editar dados pessoais, ver os proprios certificados, definir se deseja dar acesso publico ao certificado ou não.

    Página do usuario

    • Exibe certificados públicos do usuário.

    Pagina de validação do certificado

    • Permite que qualquer pessoa valide um certificado a partir do seu código.

    5. Blockchain e Registro:

    Serão realizados testes com uma rede blockchain de teste (Stellar). O hash será gerado com base na imagem ou dados do certificado e registrado para validação futura.

    Próximos Passos

    1. Interface do Usuário:

    Jonathan Batista desenvolverá as telas principais em React, incluindo cadastro de eventos, check-in/check-out e validação de certificados.

    2. Fluxo de Validação:

    Luiz Bruno Vianna criará um fluxograma detalhado do processo de validação e registro, destacando o uso de blockchain e hash. Também iniciará os testes de integração com a Stellar.

    3. Geração de Certificados:

    Jardel Godinho coordenará ajustes na geração de certificados com Maxson, com propósito de aperfeiçoar o processo que já funcionou bem nos testes preliminares realizados durante o ultimo Python Floripa.

    4. Segurança e Testes:

    Ricardo May se ocupará de integrar com o Jonathan o serviço de Magic Link e disparos automatizados de e-mails com a submição dos forms de checkin e confirmações de atualização de dados.


    A próxima reunião será em 18/12/2024, com o objetivo de revisar as entregas de cada membro e será avaliado o início de testes de integração entre as funcionalidades desenvolvidas.

    Release da Reunião – 18/12/2024

    Data: 18/12/2024
    Duração: 91 minutos
    Participantes: Jardel Godinho, Jonathan Batista, Luiz Bruno Vianna, Ricardo May

    A reunião focou em detalhar os fluxos de geração e validação de certificados digitais integrados a blockchain, bem como as definições de arquitetura e próximos passos para o desenvolvimento do projeto.

    Definições

    1. Arquitetura do Sistema:

    • O sistema usará AWS DynamoDB para armazenamento de dados com partições específicas para eventos, organizações e usuários.
    • Haverá quatro perfis de usuário: participante, staff do evento, administrador do evento e super administrador.
    • As operações do sistema serão distribuídas via AWS Lambda, garantindo escalabilidade e manuseio de falhas com SQS (fila).
    • Os certificados serão gerados como imagens, armazenados no S3, apartir das quais serão geradas hash’s para serem vinculadas à blockchain para validação pública.

    2. Fluxo de Participantes:

    • Participantes realizarão check-in via QR Code ou URL, validando identidade por Magic Link enviado por e-mail.
    • Serão gerados certificados automaticamente para todos os inscritos no evento.
    • O acesso aos certificados será feito por um painel com login protegido, exibindo uma lista de eventos e certificados.

    3. Geração de Certificados:

    • Certificados serão processados em lotes utilizando SQS e AWS Lambda para evitar sobrecarga e custos elevados.
    • Será usado um sistema de controle de concorrência para evitar duplicidades ou falhas.
    • Hashes dos certificados serão gerados e registrados na blockchain para garantir autenticidade.

    4. Painel Administrativo:

    • Administração incluirá criação de eventos, cadastro de atividades e geração de certificados com relatórios de participantes.
    • Painel exibirá estatísticas de eventos e permitirá gerenciar a emissão e envio de certificados.
    • Funcionalidade de envio automático de e-mails com certificados para participantes ao término do evento.

    5. Validação de Certificados:

    • Certificados poderão ser validados publicamente por um código único associado a cada hash na blockchain.
    • A interface de validação será acessível a todos e integrada ao sistema de armazenamento.

    Próximos Passos

    1. Fluxo de Participantes:

    • Jonathan Batista desenvolverá telas e fluxos para participantes, staff, administradores de evento e painel de certificados.

    2. Integração com Blockchain:

    • Luiz Bruno Vianna realizará testes com o registro de hashes na blockchain e ajustes na integração com Stellar.

    3. Geração de Certificados:

    • Jardel Godinho definirá os ajustes finais para geração de certificados em lotes e validação do fluxo de emissão.

    4. Testes e Segurança:

    • Ricardo May implementará validações adicionais para garantir consistência e segurança nos fluxos de autenticação e geração de certificados.

    A próxima reunião será em 08/01/2025 para revisão de tarefas, validação de implementações e preparação para testes iniciais do sistema.

    Release da Reunião – 29/01/2025

    Data: 29/01/2025

    Duração: 65 minutos

    Participantes: Daniel Soares Martins, Jardel Godinho, Jonathan Batista, Luiz Bruno Vianna, Ricardo May

    A reunião teve como objetivo discutir a implementação dos fluxos de autenticação e geração de certificados digitais, além das integrações necessárias com serviços AWS e blockchain.

    Definições

    1. Arquitetura do Sistema:

    • A estrutura será baseada em serviços AWS (S3, API Gateway, Lambda, Cognito e DynamoDB).

    • O armazenamento das informações será feito em buckets S3 e na base de dados DynamoDB.

    • Front-end utilizará React, distribuído por meio do CloudFront, com comunicação via API Gateway.

    • AWS Lambda será utilizada para processamento de funções específicas, incluindo autenticação e geração de certificados.

    • O registro dos certificados será feito em lote na blockchain Stellar.

    2. Fluxo de Participantes:

    • O check-in será feito por QR Code ou URL, validando o e-mail do participante com Magic Link.

    • Os dados geográficos (latitude e longitude) serão coletados automaticamente no check-in.

    • Em caso de falha na verificação de localização, o sistema registrará a tentativa no banco de dados, mas sem bloquear o processo.

    3. Geração e Validação de Certificados:

    • Os certificados serão gerados em lotes após o término dos eventos, com uma hash registrada na blockchain.

    • O certificado incluirá dados como nome, evento, data, local e hash para validação futura.

    • A validação dos certificados será feita via QR Code, com verificação cruzada entre as informações armazenadas na blockchain e no banco de dados.

    4. Painel Administrativo:

    • O painel permitirá o gerenciamento de eventos, configuração de atividades e emissão de certificados.

    • Haverá opções para ativar ou desativar requisitos como validação de localização.

    • Relatórios de participação e logs de validação estarão disponíveis no painel.

    Próximos Passos

    1. Integração e Implementação:

    • Jonathan Batista: Desenvolverá as telas do front-end, com foco no login e fluxo de check-in.

    • Luiz Bruno Vianna: Irá desenvolver o Smart Contract para registro das hashes na blockchain.

    • Daniel Soares Martins: Assumirá a documentação dos micro serviços (APIs, endpoints e respostas) usando OpenAPI.

    • Ricardo May: Criará a estrutura para funções Lambda, aprimorando as integrações com API Gateway e Cognito.

    Considerações Gerais:

    • O projeto terá etapas iterativas, com validações constantes para ajuste da arquitetura.

    • A documentação do sistema será essencial para garantir consistência no desenvolvimento.

    • A equipe buscará expandir a aplicação do sistema para outros cenários além de eventos, como validações presenciais em locais remotos.

    Encerramento:

    A reunião foi concluída às 16h01min, com a definição das tarefas imediatas e próximos pontos de validação.

  • Python Floripa no Hackathon Summit Saúde 2024 – Lista dos Participantes

    É com grande orgulho que anunciamos a lista de membros da nossa comunidade que estarão participando do maior hackathon de saúde de Santa Catarina, o Hackathon Summit Saúde 2024!

    Nosso grupo de desenvolvedores está pronto para enfrentar desafios, colaborar com especialistas do setor e criar soluções inovadoras que podem transformar a saúde e salvar vidas.

    Queremos convidar toda a comunidade Python Floripa a acompanhar este evento e torcer pelo sucesso dos nossos representantes! Sua participação e apoio são fundamentais para motivar e inspirar nossos membros durante essa jornada.

    Fique ligado em nossas redes e acompanhe as histórias, conquistas e aprendizados dessa experiência incrível!

    Vamos mostrar toda a força e união da Python Floripa e torcer para que nossos membros brilhem no evento!

  • Participe do Hackathon Summit Saúde 2024

    Quer participar do maior hackathon de saúde em SC sem custo? Desenvolvedores da Python Floripa podem aplicar gratuitamente para o Hackathon Summit Saúde, e ganhar ingressos oferecidas pela ACM e parceiros para os Membros da Comunidade Python Floripa.

    Está pronto para uma experiência transformadora? No Hackathon Summit Saúde você pode criar soluções inovadoras para desafios reais no setor de saúde em SC!

    Por que Participar pela Python Floripa

    Ao se inscrever pelo nosso link, você pode garantir sua vaga gratuitamente. Temos uma cota especial de inscrições isentas, que aumentará conforme a comunidade se engaja. Quanto mais membros aplicarem e interagirem em redes sociais, mais ingressos gratuitos conseguiremos para o evento! Esse é o momento de mostrar o Python Power e conquistar mais vagas para nossa comunidade.

    Propósito e Impacto

    Este hackathon vai além de uma competição: é sua chance de usar suas habilidades para resolver problemas concretos, com impacto direto na saúde das pessoas. Profissionais do setor estarão ao lado de desenvolvedores para transformar ideias em soluções aplicáveis.

    Benefícios e Oportunidades

    Desenvolva sua rede de contatos com médicos, gestores e investidores. O evento conta com mais de mil especialistas prontos para apoiar ideias promissoras, e as equipes mistas permitirão unir forças para criar soluções com potencial real de aplicação.

    Veja a Lista dos Participantes

  • Trabalho na Gringa – Como se preparar, aplicar e os desafios de uma jornada internacional

  • PyNews (29/09/24)

  • Serverless e Event-Driven: Facilitando a Criação de Arquiteturas na Nuvem

  • Introdução a Blockchain usando Python

    Autor: Lucas Oliveira
    Posições: Head of Education @ Nearx | Senior Blockchain Engineer | Matemático

    O que é Blockchain?

    Blockchain é uma tecnologia que resolve problema de confiança entre partes. Para entendermos melhor como a tecnologia funciona vamos dividir em partes: Wallet, Transações, Blocos e Consenso.

    Como funciona?

    “As Wallets armazenam chaves para gerenciar os ativos digitais. Essas chaves assinam Transações que são registros de transferências. Blocos agrupam transações, e são ligados formando uma cadeia de blocos, a blockchain. Consenso entre os participantes valida os blocos, e garante a segurança dos dados na rede.”

    Agora vamos ver no detalhe como isso funciona…

    Wallets

    São aplicações, de software ou hardware que armazenam suas chaves, privada e pública. A chave privada é utilizada para assinar transações, enquanto a chave pública é visível para todos e usada para identificar o usuário.

    Transações

    Representam a transferência de ativos digitais. Existem transações de vários tipos como: transferência de valor, criação de smartcontrats, interação com os smartcontracts entre outras.

    Cada transação (ou tx) possui um valor que está sendo enviado (que pode ser zero), uma taxa um remetente e um destinatário e precisa ser assinada com a chave privada do remetente.

    Blocos

    As transações são agrupadas em blocos que contêm um header e um body. No header temos metadados como o identificador único do bloco (hash), o hash do bloco anterior (prev-hash) e os dados da transação.

    Esses hashes criam uma estrutura encadeada de blocos, ou seja a blockchain.

    Consenso

    É o processo que garante que todos os participantes da rede (nós) concordem sobre o estado atual da blockchain. Isso é essencial para garantir a segurança e integridade dos dados, impedindo que transações duplicadas ou fraudulentas sejam registradas.

    Também é responsável pelo Throughput da rede. A Rede de nós validadores é o que chamamos de rede blockchain ou rede do bitcoin ou até blockchain do Bitcoin.

    Smartcontracts

    Nada mais é do que um código sem runtime como uma função serveless. Existem algumas diferenças entre um smartcontract e uma função serverless:

    ServerlessSmartcontract
    StatelessStatefull
    Executa em um cloud centralizada: AWS, GCP, AzureExecuta em um blockchain descentralizada: Ethereum, Solana, Polkadot
    “Não precisa de runtime”“Não precisa de runtime”
    Apenas uma função pequenaUma classes com métodos e estados internos
    Executa: JavaScript, Python, Java, Go, …Apenas o que a máquina suporta. EVM
    Diferença entre Serverless e Smartcontract

    Hoje na indústria de blockchain, EVM é a plataforma mais utilizada, sendo a segunda solução o WASM. Para blockchains que suportam EVM, temos várias linguagens sendo a principal Solidity seguida de Vyper.

    Linguagens EVM: Solidity e Vyper

    VyperSolidity
    Mais simples e restritaMenos restrições e mais complexidade
    Menos materiais e suporte da comunidadeMaior número de conteúdo e suporte
    Foco em: Simplicidade e SegurançaFoco: Flexibilidade e liberdade de uso
    Inspirada em PythonInspirada em JavaScript e C++
    Diferença entre Solidity e Vyper

    Frameworks EVM 2024

    Para desenvolver contratos precisamos de um kit de ferramentas para facilitar nossa vida. Hoje (2024) temos 3 grandes frameworks: Foundry, Hardhat, ApeWorx. Cada um com seu pró e contra, todos eles focam em entregar produtividade no processo de desenvolvimento de smartcontracts.

    Apesar de comparar eles, dessa vez vamos focar no ApeWorx que é escrito em Python.

    CaracterísticasHardhatFoundryApeWorx
    Linguagem de ScriptJavaScriptSolidityPython
    PerformanceLentoMuito RápidoLento
    Momentojá consolidado, mais 10.000 commitsEm crescimento, mais 4.000 commitsOportunidade, menos de 1.500 commits
    EcosistemaHerda tudo do JavaScriptHerda tudo do RustHerda tudo do Python
    Comparação entre Hardhat, Foundry, ApeWorx

    Hands-on

    Para acompanhar o hands-on siga as instruções do README.md do repo: Python Floripa – Blockchain

Entrar