From ac4536d26cb119d7b7246248c7e70d6f0ef5ec76 Mon Sep 17 00:00:00 2001 From: Fabricio J Barth Date: Tue, 3 Sep 2024 15:25:13 -0300 Subject: [PATCH] Deployed 3df73ef with MkDocs version: 1.6.0 --- 404.html | 84 ++ _snippets/alunos/index.html | 84 ++ _snippets/plano-de-aulas/index.html | 84 ++ _snippets/skills-code/index.html | 84 ++ _snippets/skills-community/index.html | 84 ++ _snippets/skills-impact/index.html | 84 ++ _snippets/skills-tutorial/index.html | 84 ++ agenda_apresentacoes/index.html | 84 ++ assessment/index.html | 84 ++ aulas/09-cultura-livre/index.html | 84 ++ aulas/09-cultura-livre/slides/index.html | 84 ++ aulas/11-contribuicoes-externas/index.html | 84 ++ .../slides/index.html | 84 ++ aulas/12-projeto/slides/index.html | 84 ++ .../index.html | 851 ++++++++++++++++ .../index.html | 867 ++++++++++++++++ delivery/class-03-guide/index.html | 899 +++++++++++++++++ delivery/class_3_running_guide/index.html | 936 ++++++++++++++++++ delivery/ericalp_readme/index.html | 796 +++++++++++++++ delivery/ericalp_requirements.txt | Bin 0 -> 314 bytes delivery/image-1.png | Bin 0 -> 31200 bytes delivery/image.png | Bin 0 -> 46867 bytes delivery/index.html | 84 ++ .../readme_arthumsb_rodrigoap8_pedrobb.MD | 49 + .../index.html | 895 +++++++++++++++++ impact-2019/index.html | 86 ++ impact-2020/index.html | 84 ++ impact-2021/index.html | 84 ++ impact-2022/index.html | 84 ++ impact/index.html | 102 +- index.html | 84 ++ lessons/01-distributed-workflow/index.html | 84 ++ .../01-distributed-workflow/slides/index.html | 84 ++ .../slides_fb/index.html | 84 ++ .../02-software-and-communities/index.html | 84 ++ .../slides/index.html | 84 ++ .../slides_fb/index.html | 84 ++ .../02-xpresentations-communities/index.html | 84 ++ lessons/03-software-documentation/index.html | 84 ++ .../slides/index.html | 84 ++ .../slides_fb/index.html | 84 ++ lessons/04-professional-project/index.html | 86 +- .../04-professional-project/slides/index.html | 84 ++ lessons/05-python-packaging/index.html | 247 ++++- .../06-localization-translation/index.html | 84 ++ .../slides/index.html | 84 ++ lessons/07-code-quality/index.html | 84 ++ lessons/08-automated-testing/index.html | 84 ++ .../08-automated-testing/slides/index.html | 84 ++ lessons/09-releases/index.html | 84 ++ lessons/10-first-contribution/index.html | 84 ++ .../10-first-contribution/slides/index.html | 84 ++ lessons/11-floss-people/index.html | 84 ++ lessons/12-licenses/index.html | 84 ++ lessons/12-licenses/slides/index.html | 84 ++ plugins/notification/index.html | 84 ++ projects/2024/2/index.html | 786 +++++++++++++++ search/search_index.json | 2 +- sitemap.xml | 129 ++- sitemap.xml.gz | Bin 633 -> 760 bytes students/index.html | 84 ++ syllabus/index.html | 84 ++ 62 files changed, 10373 insertions(+), 54 deletions(-) create mode 100644 delivery/README_paulohmf_leonardos15_rodrigosm11/index.html create mode 100644 delivery/README_skill3_ricardorr7_thiagohpr/index.html create mode 100644 delivery/class-03-guide/index.html create mode 100644 delivery/class_3_running_guide/index.html create mode 100644 delivery/ericalp_readme/index.html create mode 100644 delivery/ericalp_requirements.txt create mode 100644 delivery/image-1.png create mode 100644 delivery/image.png create mode 100644 delivery/readme_arthumsb_rodrigoap8_pedrobb.MD create mode 100644 delivery/skill3_lidiaacd_anandajgc_guilhermefl3/index.html create mode 100644 projects/2024/2/index.html diff --git a/404.html b/404.html index 346fbaed..34196964 100644 --- a/404.html +++ b/404.html @@ -423,6 +423,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -577,6 +598,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/_snippets/alunos/index.html b/_snippets/alunos/index.html index 34e6c156..1166a758 100644 --- a/_snippets/alunos/index.html +++ b/_snippets/alunos/index.html @@ -425,6 +425,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -579,6 +600,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/_snippets/plano-de-aulas/index.html b/_snippets/plano-de-aulas/index.html index 8ce8065c..49656958 100644 --- a/_snippets/plano-de-aulas/index.html +++ b/_snippets/plano-de-aulas/index.html @@ -425,6 +425,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -579,6 +600,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/_snippets/skills-code/index.html b/_snippets/skills-code/index.html index 510422ac..df4be01f 100644 --- a/_snippets/skills-code/index.html +++ b/_snippets/skills-code/index.html @@ -425,6 +425,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -579,6 +600,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/_snippets/skills-community/index.html b/_snippets/skills-community/index.html index 6e442438..53bc369a 100644 --- a/_snippets/skills-community/index.html +++ b/_snippets/skills-community/index.html @@ -425,6 +425,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -579,6 +600,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/_snippets/skills-impact/index.html b/_snippets/skills-impact/index.html index e690957a..0f4afbf1 100644 --- a/_snippets/skills-impact/index.html +++ b/_snippets/skills-impact/index.html @@ -425,6 +425,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -579,6 +600,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/_snippets/skills-tutorial/index.html b/_snippets/skills-tutorial/index.html index 52a8775c..44fd2858 100644 --- a/_snippets/skills-tutorial/index.html +++ b/_snippets/skills-tutorial/index.html @@ -425,6 +425,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -579,6 +600,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/agenda_apresentacoes/index.html b/agenda_apresentacoes/index.html index c17e538d..6476476f 100644 --- a/agenda_apresentacoes/index.html +++ b/agenda_apresentacoes/index.html @@ -430,6 +430,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -584,6 +605,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/assessment/index.html b/assessment/index.html index 206f60cb..6165028a 100644 --- a/assessment/index.html +++ b/assessment/index.html @@ -444,6 +444,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -598,6 +619,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/aulas/09-cultura-livre/index.html b/aulas/09-cultura-livre/index.html index 386d2b76..ceb19a9b 100644 --- a/aulas/09-cultura-livre/index.html +++ b/aulas/09-cultura-livre/index.html @@ -430,6 +430,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -584,6 +605,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/aulas/09-cultura-livre/slides/index.html b/aulas/09-cultura-livre/slides/index.html index 7ff64aeb..50857d89 100644 --- a/aulas/09-cultura-livre/slides/index.html +++ b/aulas/09-cultura-livre/slides/index.html @@ -430,6 +430,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -584,6 +605,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/aulas/11-contribuicoes-externas/index.html b/aulas/11-contribuicoes-externas/index.html index c2037e65..e0ae6ce7 100644 --- a/aulas/11-contribuicoes-externas/index.html +++ b/aulas/11-contribuicoes-externas/index.html @@ -430,6 +430,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -584,6 +605,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/aulas/11-contribuicoes-externas/slides/index.html b/aulas/11-contribuicoes-externas/slides/index.html index 237d4c5f..0a1a6317 100644 --- a/aulas/11-contribuicoes-externas/slides/index.html +++ b/aulas/11-contribuicoes-externas/slides/index.html @@ -430,6 +430,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -584,6 +605,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/aulas/12-projeto/slides/index.html b/aulas/12-projeto/slides/index.html index c02a0863..73e15b8c 100644 --- a/aulas/12-projeto/slides/index.html +++ b/aulas/12-projeto/slides/index.html @@ -430,6 +430,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -584,6 +605,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/delivery/README_paulohmf_leonardos15_rodrigosm11/index.html b/delivery/README_paulohmf_leonardos15_rodrigosm11/index.html new file mode 100644 index 00000000..c0590294 --- /dev/null +++ b/delivery/README_paulohmf_leonardos15_rodrigosm11/index.html @@ -0,0 +1,851 @@ + + + + + + + + + + + + + + + + + + + + + Dependências e serviços usados - Open Source Development 2024/2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + Skip to content + + +
    +
    + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + +

    Dependências e serviços usados

    +

    Quais tecnologias são usadas no código? Além da linguagem de programação, liste também as bibliotecas/módulos externos usados.

    +
      +
    • Linguagens: Python, SQL, HTML, JS, CSS, SCSS
    • +
    • Tecnologias: sqlite, hashlib, flask, bootstrap
    • +
    +

    A aplicação utiliza um banco de dados. Qual gerenciador? Onde a aplicação busca a base de dados? Quais são as tabelas usadas? Como elas são criadas?

    +

    Utiliza sim, o SQLite.

    +
      +
    • +

      No arquivo softdes.py existem algumas consultas SQL para: + Pegar todos os Quizes, + Pegar um USERQUIZ, + Inserir na tabela USERQUIZ, + Pegar um Quiz, + Setar o password do usuário,

      +
    • +
    • +

      No arquivo adduser.py existe uma consulta SQL para: + Adicionar um novo usuário

      +
    • +
    • +

      As tabelas utilizadas são 3: USER, USERQUIZ, QUIZ. Elas são criadas no arquivo quiz.sql

      +
    • +
    +

    Deploy inicial

    +

    A aplicação usa autenticação? Se sim, qual tipo? Como usuários são criados? Existe algum usuário administrador? Como é feita a segurança das senhas? Qual a senha padrão?

    +

    A aplicação utiliza autenticação, feita através do HTTPBasicAuth do flask. Os usuários são criados a partir do script adduser.py, que lê um arquivo csv e cria usuários no banco de dados. O nome do usuário é encriptado para um hash utilizando a hashlib. Pelo código que existe em softdes.py, sabemos que existe um usuário chamado admin e outro chamado fabioja. Dessa forma a senha dos dois será o hash dessas palavras.

    +

    Quais comandos você usou para rodar a aplicação? Escreva todos desde a criação do banco de dados e dos usuários até o funcionamento completo do projeto.

    +

    Para criar o banco de dados:

    +
      +
    • Criei um arquivo quiz.db
    • +
    • Utilizando a CLI do sqlite3 criei as tabelas do banco de dados
    • +
    +
    sqlite3 quiz.db
    +.read user.sql
    +
    +
      +
    • Criei um arquivo users.csv com os usuários admin e fabioja
    • +
    • +

      Rodei o arquivo adduser.py

      +
    • +
    • +

      Criei um python virtual environment

      +
    • +
    • Fui tentando rodar o arquivo softdes.py e baixando as dependências necessárias: flask e flask_httpauth
    • +
    • Troquei a porta 80, dado que não havia permissão necessária para rodar a aplicação nessa porta com usuário padrão do linux
    • +
    • Aplicação rodando
    • +
    +

    Agora que você consegue rodar a aplicação, explore-a um pouco e descreva em poucas frases para quê ela serve.

    +

    Parece um site da matéria de SoftDes, existe um botão para logout, outro para trocar senha e os desafios/quizes.

    +

    Documentação do projeto

    +

    Se você fosse criar um guia de usuário (aluno) para esta aplicação, quais tarefas descreveria?

    +

    Se você fosse criar um guia de usuário (professor) para esta aplicação, quais tarefas descreveria?

    +

    O quê você descreveria em um guia de desenvolvedor para esta aplicação?

    +
      +
    • Como baixar as dependências
    • +
    • Como criar o banco de dados
    • +
    • O que cada arquivo está fazendo
    • +
    • O que cada rota está fazendo
    • +
    • O que as funções estão fazendo
    • +
    • ...
    • +
    + + + + + + + + + + + + + +
    +
    + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/delivery/README_skill3_ricardorr7_thiagohpr/index.html b/delivery/README_skill3_ricardorr7_thiagohpr/index.html new file mode 100644 index 00000000..ec94f59b --- /dev/null +++ b/delivery/README_skill3_ricardorr7_thiagohpr/index.html @@ -0,0 +1,867 @@ + + + + + + + + + + + + + + + + + + + + + Quiz Server - SoftDes INSPER - Open Source Development 2024/2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + Skip to content + + +
    +
    + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + +

    Quiz Server - SoftDes INSPER

    +

    Used technologies

    +
      +
    • Python
        +
      • Flask
      • +
      +
    • +
    • Bootstrap
    • +
    • HTML, CSS & JavaScript
    • +
    • SQLite DB
    • +
    +

    Database

    +

    The appplication uses the SQLite db, the application uses this db to store quizes, and users for the quizes. The db is created using the quiz.sql file, the tables created are: +- USER +- QUIZ +- USERQUIZ

    +

    How to setup the application:

    +
      +
    1. +

      Install the dependencies: +

      pip install flask Flask-HTTPAuth
      +

      +
    2. +
    3. +

      Create the db using the following script: +

      import sqlite3
      +
      +DB_PATH = "quiz.db"
      +
      +def create_db():
      +    conn = sqlite3.connect(DB_PATH)
      +    cursor = conn.cursor()
      +    with open('quiz.sql') as file:
      +        cursor.executescript(file.read())
      +    conn.commit()
      +    conn.close()
      +
      +
      +if __name__ == "__main__":
      +    create_db()
      +

      +
    4. +
    5. +

      Create the users.csv file: +

      your_user, user_type
      +

      +
    6. +
    7. +

      Create the users using the adduser.py script: +

      python adduser.py
      +

      +
    8. +
    9. +

      Run the application, use the set username as password: +

      python softdes.py
      +

      +
    10. +
    +

    About the aplication

    +

    Flask based Code Exercises server that interacts with SQLite, in each the main api call fetches all the quizzes and evaluates the user answers. +The code itself is not safe, mainly because you can create an user with admin permissions by calling it "fabioja". This allows the user to see every quiz from the server, even those who aren't released yet. Also, if the user creates the the login credentials with the script adduser.py, the password will be the same as the user name.

    + + + + + + + + + + + + + +
    +
    + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/delivery/class-03-guide/index.html b/delivery/class-03-guide/index.html new file mode 100644 index 00000000..af45c70b --- /dev/null +++ b/delivery/class-03-guide/index.html @@ -0,0 +1,899 @@ + + + + + + + + + + + + + + + + + + + + + Class 03 guide - Open Source Development 2024/2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + Skip to content + + +
    +
    + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + +

    Class 03 guide

    + +

    Group: Antonio Martins, Enrrico Gemha e Felipe Catapano

    +

    Guia para Rodar a Plataforma de Quiz

    +

    Este guia fornece um passo a passo para configurar e executar a aplicação de quiz localmente. Siga as instruções abaixo para garantir que todos os componentes necessários estejam instalados e configurados corretamente.

    +

    1. Pré-requisitos

    +
      +
    • Python 3: Certifique-se de que o Python 3 está instalado em sua máquina.
    • +
    • pip: O gerenciador de pacotes pip deve estar instalado.
    • +
    +

    2. Instalação de Dependências

    +

    Navegue até a pasta /src do projeto e instale as dependências necessárias executando o seguinte comando no terminal:

    +
    pip install flask flask_httpauth
    +
    +

    Este comando instala o Flask, um framework web leve para Python, e o flask_httpauth, uma extensão para autenticação HTTP básica.

    +

    3. Criação do Arquivo de Usuários

    +

    Crie um arquivo users.csv para definir os usuários iniciais:

    +
    echo "enriccog,aluno" > users.csv
    +
    +

    Este comando cria um arquivo users.csv com um usuário chamado enriccog e define seu tipo como aluno.

    +

    4. Configuração do Banco de Dados

    +

    Inicialize o banco de dados SQLite com o seguinte comando:

    +
    sqlite3 quiz.db < quiz.sql
    +
    +

    Este comando cria o banco de dados quiz.db usando o script SQL quiz.sql, que deve conter as instruções para criar as tabelas necessárias.

    +

    5. Adição de Usuários ao Banco de Dados

    +

    Execute o script adduser.py para adicionar os usuários do arquivo users.csv ao banco de dados:

    +
    python3 adduser.py
    +
    +

    Este script lê o arquivo users.csv e insere os usuários especificados no banco de dados quiz.db.

    +

    6. Executando a Aplicação

    +

    Defina a variável de ambiente FLASK_APP e inicie o servidor Flask com os comandos:

    +
    export FLASK_APP=softdes.py && flask run
    +
    +

    Este comando configura o arquivo softdes.py como a aplicação Flask a ser executada e inicia o servidor. Por padrão, o servidor Flask estará acessível em http://localhost:5000.

    +

    7. Acessando a Plataforma

    +

    Abra um navegador web e acesse http://localhost:5000 para visualizar a plataforma de quiz.

    +

    Você agora deve estar pronto para usar a plataforma! Se houver quaisquer problemas ou erros durante o processo de configuração, verifique se todas as dependências estão instaladas corretamente e se os arquivos necessários estão no diretório correto.

    + + + + + + + + + + + + + +
    +
    + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/delivery/class_3_running_guide/index.html b/delivery/class_3_running_guide/index.html new file mode 100644 index 00000000..2cc32134 --- /dev/null +++ b/delivery/class_3_running_guide/index.html @@ -0,0 +1,936 @@ + + + + + + + + + + + + + + + + + + + + + Class 3 running guide - Open Source Development 2024/2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + Skip to content + + +
    +
    + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + +

    Class 3 running guide

    + +

    Group: André Melo (andrebbm)

    +

    Manual para Subir a Plataforma de Quiz SoftDes 2018.2

    +

    Passo a passo para corrigir e executar a plataforma de quiz SoftDes 2018.2 a partir do código fonte fornecido.

    +

    1. Pré-requisitos

    +
      +
    • Python 3
    • +
    • pip
    • +
    +

    2. Bibliotecas Necessárias

    +

    Instale as seguintes bibliotecas Python necessárias para executar a plataforma de quiz, como no modelo abaixo:

    +
    pip install flask
    +
    +
      +
    • Flask
    • +
    • flask_httpauth
    • +
    • datetime
    • +
    • sqlite3
    • +
    • hashlib
    • +
    +

    3. Criação do Arquivo de Usuários

    +

    Crie um arquivo users.csv na raiz do projeto para definir os usuários iniciais e adicioná-los ao banco de dados. O conteúdo do arquivo users.csv deve ter o seguinte formato:

    +
    admin,admin
    +
    +

    4. Configuração do Banco de Dados

    +

    No arquivo adduser.py, inclua na função addUser() o seguinte bloco de código entre conn.cursor() e conn.execute():

    +

    cursor.execute("DROP TABLE IF EXISTS USER;")
    +cursor.execute("""
    +    CREATE TABLE USER(
    +    user TEXT NOT NULL PRIMARY KEY,
    +    pass TEXT NOT NULL,
    +    type TEXT NOT NULL);""")
    +
    +a seguir, adicione a seguinte função:

    +
    def addQuiz(id, release, expire, problem, tests, results, diagnosis, numb):
    +    conn = sqlite3.connect('quiz.db')
    +    cursor = conn.cursor()
    +    cursor.execute("DROP TABLE IF EXISTS QUIZ;")
    +    cursor.execute("""
    +        CREATE TABLE QUIZ(
    +        id INTEGER NOT NULL PRIMARY KEY,
    +        release TEXT NOT NULL,
    +        expire TEXT NOT NULL,
    +        problem TEXT NOT NULL,
    +        tests TEXT NOT NULL,
    +        results TEXT NOT NULL,
    +        diagnosis TEXT NOT NULL,
    +        numb INTEGER NOT NULL);""")
    +    cursor.execute('Insert into QUIZ(id,release,expire,problem,tests,results,diagnosis,numb) values({0},"{1}","{2}","{3}","{4}","{5}","{6}",{7});'.format(id, release, expire, problem, tests, results, diagnosis, numb))
    +
    +    cursor.execute("DROP TABLE IF EXISTS USERQUIZ;")
    +    cursor.execute("""
    +        CREATE TABLE USERQUIZ(
    +        id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    +        userid TEXT NOT NULL,
    +        quizid INTEGER NOT NULL,
    +        sent TEXT NOT NULL,
    +        answer TEXT NOT NULL,
    +        result TEXT NOT NULL);""")
    +    conn.commit()
    +    conn.close()
    +
    +

    Por fim, adicione a seguinte chamada de função no final do script:

    +
      addQuiz(1, '2018-01-01 00:00:00', '2018-01-01 00:00:00', 'problem', 'tests', 'results', 'diagnosis', 1)
    +
    +

    5. Adição de Usuários ao Banco de Dados

    +

    Execute o script adduser.py para criar a base e adicionar os usuários do arquivo users.csv ao banco de dados.

    +

    6. Executando a Aplicação

    +

    Execute o script quiz.py para iniciar a aplicação Flask. A aplicação estará disponível em http://192.168.1.144/.

    +
    python3 quiz.py
    +
    +

    7. Acessando a Plataforma

    +

    Abra um navegador web e acesse http://192.168.1.144/ para visualizar a plataforma de quiz.

    +

    A plataforma vai pedir um login e senha, que são os mesmos do arquivo users.csv: admin, admin.

    + + + + + + + + + + + + + +
    +
    + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/delivery/ericalp_readme/index.html b/delivery/ericalp_readme/index.html new file mode 100644 index 00000000..513cec29 --- /dev/null +++ b/delivery/ericalp_readme/index.html @@ -0,0 +1,796 @@ + + + + + + + + + + + + + + + + + + + + + How to run - Open Source Development 2024/2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + Skip to content + + +
    +
    + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + +

    How to run

    +
      +
    1. Install all dependencies from requirements.txt
    2. +
    +
    pip install -r ericalp_requirements.txt
    +
    +
      +
    1. +

      Create users.csv with the desired user values

      +
    2. +
    3. +

      Run the following code to execute quiz.sql and create quiz.db +

      import sqlite3
      +
      +#run quiz.sql to create the database
      +with open('quiz.sql', 'r') as f:
      +    sql = f.read()
      +    conn = sqlite3.connect('quiz.db')
      +    conn.executescript(sql)
      +    conn.commit()
      +    conn.close()
      +    print("Database initialized")
      +

      +
    4. +
    5. +

      Execute adduser.py to add the users in users.csv to the database

      +
    6. +
    7. +

      Execute softdes.py to run the website

      +
    8. +
    9. +

      Log in using your credentials, your password is the same as your username

      +
    10. +
    + + + + + + + + + + + + + +
    +
    + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/delivery/ericalp_requirements.txt b/delivery/ericalp_requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..82e5bb7eb49b3681a795272aa770b078e3e12b89 GIT binary patch literal 314 zcmZ9Hy9&ZU5Jhh-_$f-<#7ARcBO(Zbf_03q7|lxJHh#Q%?<6*|3|Z!!y)*f|_qZWP zi2_GdnDPwJ$Asn3MF*Mjj9g58@o~#Mspq>Ccb1HZG+~X*n3Jcd+t)Gs;_)BrVSz2r z8Z!huaj_(&XkKJ?&VG#p(@LCeS5LP#)6r5j=FO4AwDRPCHt&Wint`vg3&;r+xc X?XCB+hGy+-LV*{*f%9biwr_I2W&JHm literal 0 HcmV?d00001 diff --git a/delivery/image-1.png b/delivery/image-1.png new file mode 100644 index 0000000000000000000000000000000000000000..8f277cd3f3b44b8d46b1d38e0d7e19525fd18d0f GIT binary patch literal 31200 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 Mo6)sA?YmF@1%v$^jsO4v literal 0 HcmV?d00001 diff --git a/delivery/image.png b/delivery/image.png new file mode 100644 index 0000000000000000000000000000000000000000..75708f2502f66d1cd850e435683aa95f0f7a0f00 GIT binary patch literal 46867 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 literal 0 HcmV?d00001 diff --git a/delivery/index.html b/delivery/index.html index 149ea74b..287e9a6e 100644 --- a/delivery/index.html +++ b/delivery/index.html @@ -430,6 +430,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -584,6 +605,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/delivery/readme_arthumsb_rodrigoap8_pedrobb.MD b/delivery/readme_arthumsb_rodrigoap8_pedrobb.MD new file mode 100644 index 00000000..fd66ba18 --- /dev/null +++ b/delivery/readme_arthumsb_rodrigoap8_pedrobb.MD @@ -0,0 +1,49 @@ +# Guia para subir a aplicação + +Execute o comando abaixo para instalar as dependências do projeto: + +```bash +pip install click==8.1.7 +pip install Flask==0.12.2 +pip install itsdangerous==2.2.0 +pip install Jinja2==3.1.4 +pip install MarkupSafe==2.1.5 +pip install Werkzeug==3.0.4 +``` + +Agora é necessário criar a base de dados, antes de subir o server, para isso execute o comando abaixo: + +```bash +import sqlite3 + +db = sqlite3.connect("quiz.db") +print("Opened database successfully") + +cursor = db.cursor() + +startup_file = open("quiz.sql", "r") +startup_script = startup_file.read() +startup_file + +cursor.executescript(startup_script) +``` + +Verifique que foi criado um arquivo chamado `quiz.db` dentro da pasta que você rodou o comando. + +Agora, criei um aquivo chamado `users.csv`, com as colunas iguais a do script sql, ou seja, `user` e `pass`. Dentro deste arquivo, insira os usuários que deseja criar, como por exemplo, `admin,admin`. + + +Agora, rode o comando abaixo de fato adicionar os usuarios a base: + +```bash +python3 adduser.py +``` + +Pronto, agora você esta apto a executar o server novament: + +```bash +python3 softdes.py +``` + +Terminou, parabéns! Agora você pode acessar o site !!! + diff --git a/delivery/skill3_lidiaacd_anandajgc_guilhermefl3/index.html b/delivery/skill3_lidiaacd_anandajgc_guilhermefl3/index.html new file mode 100644 index 00000000..2d62e34d --- /dev/null +++ b/delivery/skill3_lidiaacd_anandajgc_guilhermefl3/index.html @@ -0,0 +1,895 @@ + + + + + + + + + + + + + + + + + + + + + Skill3 lidiaacd anandajgc guilhermefl3 - Open Source Development 2024/2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + +

    Skill3 lidiaacd anandajgc guilhermefl3

    + +

    About the Application

    +

    This application is a web-based platform designed to facilitate the student assignment submission and feedback process for a Software Design (SoftDes) course, specifically labeled as "SoftDes 2018.2." It showcases an example page for "Challenge 1," where the critical functionalities include viewing problem statements, submission deadlines, and feedback/results of submitted assignments. The application features a login functionality so that the users only login with the correct password

    +

    The application is built using Flask, a lightweight WSGI web application framework in Python. Flask is known for being simple to set up and flexible, making it ideal for small to medium-sized applications. The platform uses SQL for managing its database operations. SQL databases are robust, allowing for complex queries and transactions necessary for managing course data, assignments, user accounts, submission records, feedback, and results.

    +

    Language:

    +
      +
    • Python
    • +
    +

    Libraries:

    +
      +
    1. flask:
    2. +
    3. Flask
    4. +
    5. request
    6. +
    7. jsonify
    8. +
    9. abort
    10. +
    11. make_response
    12. +
    13. session
    14. +
    15. render_template
    16. +
    17. flask_httpauth: Extensão para autenticação HTTP básica.
    18. +
    19. HTTPBasicAuth
    20. +
    21. datetime: Módulo para manipulação de datas e horas.
    22. +
    23. datetime
    24. +
    25. sqlite3: Módulo para interação com bancos de dados SQLite.
    26. +
    27. sqlite3
    28. +
    29. json: Módulo para manipulação de dados JSON.
    30. +
    31. json
    32. +
    33. hashlib: Módulo para algoritmos de hash seguros.
    34. +
    35. hashlib
    36. +
    +

    QuickStart

    +
      +
    1. Requirements:
    2. +
    +

    Certifique-se de que SQLite3 está instalado no seu sistema.

    +
      +
    • macOS: +
      brew install sqlite3
      +
    • +
    • Linux (Debian-based, ex.: Ubuntu):
    • +
    +
    sudo apt-get install sqlite3
    +
    +
      +
    • +

      Linux (Fedora-based): +

      sudo dnf install sqlite
      +

      +
    • +
    • +

      Windows: +Baixe o SQLite3 e adicione o binário ao seu PATH.

      +
    • +
    • +

      Install the dependencies

      +
    • +
    +
    pip install flask flask-httpauth
    +
    +
      +
    1. Create the database
    2. +
    +
    sqlite3 quiz.db < quiz.sql
    +
    +
      +
    1. +

      Create the users.csv with your credentials. Example: +

      admin,admin
      +

      +
    2. +
    3. +

      Add your user.

      +
    4. +
    +
    python adduser.py
    +
    +
      +
    1. Start the development server:
    2. +
    +
    python softdes.py
    +
    +

    Now you can see in the terminal something like this: +alt text

    +

    If you open the url, you should see this screen:

    +

    alt text

    + + + + + + + + + + + + + +
    +
    + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/impact-2019/index.html b/impact-2019/index.html index 9fe9dd6d..6adff497 100644 --- a/impact-2019/index.html +++ b/impact-2019/index.html @@ -14,6 +14,8 @@ + + @@ -432,6 +434,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -655,6 +678,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/impact-2020/index.html b/impact-2020/index.html index 6207d9dd..3f9bb63d 100644 --- a/impact-2020/index.html +++ b/impact-2020/index.html @@ -434,6 +434,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -639,6 +660,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/impact-2021/index.html b/impact-2021/index.html index d7cded89..934b0694 100644 --- a/impact-2021/index.html +++ b/impact-2021/index.html @@ -429,6 +429,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -593,6 +614,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/impact-2022/index.html b/impact-2022/index.html index dd81d3bb..0fd55a81 100644 --- a/impact-2022/index.html +++ b/impact-2022/index.html @@ -429,6 +429,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -593,6 +614,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/impact/index.html b/impact/index.html index 71fc2f6f..4b40d6ca 100644 --- a/impact/index.html +++ b/impact/index.html @@ -11,7 +11,7 @@ - + @@ -429,6 +429,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -593,6 +614,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + @@ -629,10 +713,24 @@

    2023/2

    -

    One of the main objectives of Open Development is to actively participate in existing software projects. In the 2023/2 edition, students worked on 0 different projects, contributing with 0 code modifications, of which 0 were incorporated into the original projects. In addition to these projects, students also worked on software developed by Insper professors to be used in various courses. A total of 0 modifications were accepted in these projects.

    +

    One of the main objectives of Open Development is to actively participate in existing software projects. In the 2023/2 edition, students worked on 1 different projects, contributing with 0 code modifications, of which 1 were incorporated into the original projects. In addition to these projects, students also worked on software developed by Insper professors to be used in various courses. A total of 0 modifications were accepted in these projects.

    We also encourage students to participate in external technology events and experience the world outside Insper. In total, students participated in 0 events.

    Code contributions

    +
    + Outros + +

    Issues

    + + +
    +

    Events

    diff --git a/index.html b/index.html index 84f6fd76..21dffbb1 100644 --- a/index.html +++ b/index.html @@ -442,6 +442,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -596,6 +617,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + +
    diff --git a/lessons/01-distributed-workflow/index.html b/lessons/01-distributed-workflow/index.html index c1c72229..f63b7d20 100644 --- a/lessons/01-distributed-workflow/index.html +++ b/lessons/01-distributed-workflow/index.html @@ -536,6 +536,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -690,6 +711,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/lessons/01-distributed-workflow/slides/index.html b/lessons/01-distributed-workflow/slides/index.html index c4c73e89..dae559d9 100644 --- a/lessons/01-distributed-workflow/slides/index.html +++ b/lessons/01-distributed-workflow/slides/index.html @@ -430,6 +430,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -584,6 +605,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/lessons/01-distributed-workflow/slides_fb/index.html b/lessons/01-distributed-workflow/slides_fb/index.html index ec9f6206..a936242f 100644 --- a/lessons/01-distributed-workflow/slides_fb/index.html +++ b/lessons/01-distributed-workflow/slides_fb/index.html @@ -430,6 +430,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -584,6 +605,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/lessons/02-software-and-communities/index.html b/lessons/02-software-and-communities/index.html index f30f8a69..4b3d10ab 100644 --- a/lessons/02-software-and-communities/index.html +++ b/lessons/02-software-and-communities/index.html @@ -446,6 +446,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -600,6 +621,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/lessons/02-software-and-communities/slides/index.html b/lessons/02-software-and-communities/slides/index.html index 10adebff..3d090667 100644 --- a/lessons/02-software-and-communities/slides/index.html +++ b/lessons/02-software-and-communities/slides/index.html @@ -430,6 +430,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -584,6 +605,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/lessons/02-software-and-communities/slides_fb/index.html b/lessons/02-software-and-communities/slides_fb/index.html index 9dcd5629..e7d3113e 100644 --- a/lessons/02-software-and-communities/slides_fb/index.html +++ b/lessons/02-software-and-communities/slides_fb/index.html @@ -430,6 +430,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -584,6 +605,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/lessons/02-xpresentations-communities/index.html b/lessons/02-xpresentations-communities/index.html index 285b2755..df17a926 100644 --- a/lessons/02-xpresentations-communities/index.html +++ b/lessons/02-xpresentations-communities/index.html @@ -494,6 +494,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -648,6 +669,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/lessons/03-software-documentation/index.html b/lessons/03-software-documentation/index.html index 751d5494..58dc25c8 100644 --- a/lessons/03-software-documentation/index.html +++ b/lessons/03-software-documentation/index.html @@ -503,6 +503,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -657,6 +678,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/lessons/03-software-documentation/slides/index.html b/lessons/03-software-documentation/slides/index.html index d414e268..d03e6726 100644 --- a/lessons/03-software-documentation/slides/index.html +++ b/lessons/03-software-documentation/slides/index.html @@ -430,6 +430,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -584,6 +605,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/lessons/03-software-documentation/slides_fb/index.html b/lessons/03-software-documentation/slides_fb/index.html index 97b8b377..f52cb97a 100644 --- a/lessons/03-software-documentation/slides_fb/index.html +++ b/lessons/03-software-documentation/slides_fb/index.html @@ -430,6 +430,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -584,6 +605,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/lessons/04-professional-project/index.html b/lessons/04-professional-project/index.html index a1a0bbe9..8e22f86b 100644 --- a/lessons/04-professional-project/index.html +++ b/lessons/04-professional-project/index.html @@ -14,7 +14,7 @@ - + @@ -509,6 +509,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -663,6 +684,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/lessons/04-professional-project/slides/index.html b/lessons/04-professional-project/slides/index.html index 5c8c33d8..8c25a0de 100644 --- a/lessons/04-professional-project/slides/index.html +++ b/lessons/04-professional-project/slides/index.html @@ -430,6 +430,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -584,6 +605,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/lessons/05-python-packaging/index.html b/lessons/05-python-packaging/index.html index d7252f55..c8e4a3e5 100644 --- a/lessons/05-python-packaging/index.html +++ b/lessons/05-python-packaging/index.html @@ -11,6 +11,10 @@ + + + + @@ -294,17 +298,19 @@ + + -
  • +
  • - + - diff --git a/lessons/06-localization-translation/index.html b/lessons/06-localization-translation/index.html index e79d0d29..e73f82cf 100644 --- a/lessons/06-localization-translation/index.html +++ b/lessons/06-localization-translation/index.html @@ -430,6 +430,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -584,6 +605,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/lessons/06-localization-translation/slides/index.html b/lessons/06-localization-translation/slides/index.html index 5a823d18..b15fd51d 100644 --- a/lessons/06-localization-translation/slides/index.html +++ b/lessons/06-localization-translation/slides/index.html @@ -430,6 +430,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -584,6 +605,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/lessons/07-code-quality/index.html b/lessons/07-code-quality/index.html index 9cafac89..d1e7597f 100644 --- a/lessons/07-code-quality/index.html +++ b/lessons/07-code-quality/index.html @@ -430,6 +430,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -584,6 +605,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/lessons/08-automated-testing/index.html b/lessons/08-automated-testing/index.html index 9319bb8a..51bbe88e 100644 --- a/lessons/08-automated-testing/index.html +++ b/lessons/08-automated-testing/index.html @@ -430,6 +430,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -584,6 +605,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/lessons/08-automated-testing/slides/index.html b/lessons/08-automated-testing/slides/index.html index 3feff339..bb2b60de 100644 --- a/lessons/08-automated-testing/slides/index.html +++ b/lessons/08-automated-testing/slides/index.html @@ -430,6 +430,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -584,6 +605,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/lessons/09-releases/index.html b/lessons/09-releases/index.html index 7935e347..baecb739 100644 --- a/lessons/09-releases/index.html +++ b/lessons/09-releases/index.html @@ -430,6 +430,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -584,6 +605,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/lessons/10-first-contribution/index.html b/lessons/10-first-contribution/index.html index fea7f6ef..01a580be 100644 --- a/lessons/10-first-contribution/index.html +++ b/lessons/10-first-contribution/index.html @@ -430,6 +430,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -584,6 +605,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/lessons/10-first-contribution/slides/index.html b/lessons/10-first-contribution/slides/index.html index 8357b928..16483f84 100644 --- a/lessons/10-first-contribution/slides/index.html +++ b/lessons/10-first-contribution/slides/index.html @@ -430,6 +430,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -584,6 +605,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/lessons/11-floss-people/index.html b/lessons/11-floss-people/index.html index b12bc5b1..870b1aaf 100644 --- a/lessons/11-floss-people/index.html +++ b/lessons/11-floss-people/index.html @@ -430,6 +430,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -584,6 +605,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/lessons/12-licenses/index.html b/lessons/12-licenses/index.html index 215bfce0..eb158745 100644 --- a/lessons/12-licenses/index.html +++ b/lessons/12-licenses/index.html @@ -430,6 +430,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -584,6 +605,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/lessons/12-licenses/slides/index.html b/lessons/12-licenses/slides/index.html index fbfbe9f2..9510309e 100644 --- a/lessons/12-licenses/slides/index.html +++ b/lessons/12-licenses/slides/index.html @@ -430,6 +430,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -584,6 +605,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/plugins/notification/index.html b/plugins/notification/index.html index 311f4e4b..f6a7ec47 100644 --- a/plugins/notification/index.html +++ b/plugins/notification/index.html @@ -430,6 +430,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -584,6 +605,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/projects/2024/2/index.html b/projects/2024/2/index.html new file mode 100644 index 00000000..55168cfe --- /dev/null +++ b/projects/2024/2/index.html @@ -0,0 +1,786 @@ + + + + + + + + + + + + + + + + + + + + + + + 2024/2 - Open Source Development 2024/2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + +

    2024/2

    + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json index 44ff5a9b..eaf57179 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Open Development 2024/2","text":"

    Welcome to the Open Development page for 2024/2. On this site, you will find all the course lessons and syllabus. The learning objectives covered are:

    1. The student is capable of understanding a software project and fixing a bug or implementing an improvement.
    2. The student is capable of making modifications that meet the technical and non-technical requirements of a software project.
    3. The student is capable of interacting with a (remote) development team.

    This course is gamified and entirely done using a git repository. Each student creates a user following the instructions in Lesson 01 and submits a Pull Request to be included in the repository. Each completed activity is delivered via a PR in the course repository and serves as evidence for the learning objectives mentioned above.

    The course revolves around four types of activities:

    • Tutorial: (Guided) Preparatory activities in the classroom.
    • Code: Code contributions to external projects.
    • Community: Non-technical contributions that can benefit users and developers of a project, such as documentation and translations.
    • Impact: Significant results achieved through the student's participation in open projects.

    More information about all possible activities can be found on the Assessment page.

    Current and past instructors

    • Igor Montagner
    • Fabr\u00edcio Barth
    "},{"location":"agenda_apresentacoes/","title":"Apresenta\u00e7\u00f5es sobre cultura livre","text":"

    Este documento descreve a rubrica para avalia\u00e7\u00e3o do trabalho e a agenda das apresenta\u00e7\u00f5es.

    "},{"location":"agenda_apresentacoes/#rubrica","title":"Rubrica","text":"Conceito Descri\u00e7\u00e3o A Apresenta\u00e7\u00e3o realizada dentro do tempo estipulado. O tema foi organizado de forma excelente, com boa sequ\u00eancia l\u00f3gica das ideias. O trabalho foi apresentado de forma clara e concisa, usando so slides de forma coesa com a fala. Tem boa postura e seguran\u00e7a, estabelece contato visual com os participantes durante a apresenta\u00e7\u00e3o. Incorporou elementos visuais de qualidade no material: figuras, tabelas e gr\u00e1ficos s\u00e3o claros e cont\u00eam informa\u00e7\u00f5es suficientes. Fez uso de no m\u00ednimo uma t\u00e9cnica para intera\u00e7\u00e3o com a audi\u00eancia (por exemplo, debate, painel com vota\u00e7\u00f5es, entre outros). B O tempo de apresenta\u00e7\u00e3o foi de mais ou menos 5 min do estabelecido. O tema foi parcialmente bem organizado, com sequ\u00eancia de apresenta\u00e7\u00e3o razo\u00e1vel. Exp\u00f5e o trabalho corretamente, mas n\u00e3o usa os slides de forma coesa com a fala. Postura e seguran\u00e7a razo\u00e1veis. Os elementos visuais s\u00e3o de baixa qualidade: figuras, tabelas e gr\u00e1ficos n\u00e3o s\u00e3o totalmente claros e n\u00e3o cont\u00eam informa\u00e7\u00f5es suficientes para compreens\u00e3o. Fez uso de no m\u00ednimo uma t\u00e9cnica para intera\u00e7\u00e3o com a audi\u00eancia (por exemplo, debate, painel com vota\u00e7\u00f5es, entre outros). C Tempo de apresenta\u00e7\u00e3o foi de mais ou menos 10 min do estabelecido. A organiza\u00e7\u00e3o da apresenta\u00e7\u00e3o \u00e9 confusa, o que prejudica o acompanhamento e compreens\u00e3o das ideias. Comunica\u00e7\u00e3o deficiente, com dificuldade de expor ideias. N\u00e3o usa adequadamente os slides. N\u00e3o tem boa postura e seguran\u00e7a durante a apresenta\u00e7\u00e3o. Os recursos visuas prejudicam a apresenta\u00e7\u00e3o. Fez uso de no m\u00ednimo uma t\u00e9cnica para intera\u00e7\u00e3o com a audi\u00eancia (por exemplo, debate, painel com vota\u00e7\u00f5es, entre outros)."},{"location":"agenda_apresentacoes/#agenda","title":"Agenda","text":"Data e hor\u00e1rio Tema 17/11 (9:45-10:45) GitHub Copilot \u00e9 \u00e9tico? [Eiki Yamashiro e Marcelo Miguel] 17/11 (10:45-11:45) A rela\u00e7\u00e3o entre Software as a Service (SaaS) e projetos de C\u00f3digo Aberto [Caroline Chaim, Felipe Lemos, Jo\u00e3o Farias Araujo] 22/11 (9:45-10:45) Telemetria \u00e9 \"\u00e9tico\"? [Guilherme Lunetta, Rafael Monteiro e Jo\u00e3o Magalh\u00e3es] 22/11 (10:45-11:45) Regulamenta\u00e7\u00f5es futuras na Europa sobre responsabilidade legal dos criadores de IAs [Luiza Silvera, Guilherme Batista e Gabriel Zanetti] 24/11 N\u00e3o teremos aula. Joga do Brasil na Copa do Mundo 29/11 (9:45-10:45) Regulamenta\u00e7\u00f5es recentes na Europa sobre durabilidade de smartphones. [Keiya Nishio e Bruno Freitas] 29/11 (10:45-11:45) Por que Open Source \u00e9 cr\u00edtico para criptomoedas? [Paulo Kim, Raphael Lahiry e Rodrigo Coelho] 01/12 (9:45-10:45) The new open-source economics (Yochai Benkler, 2005). O que mudou de 2005 para 2022? [Jo\u00e3o Pedro Meirelles, Gustavo Molina e Rafael Almada] 01/12 (10:45-11:45) Mantainer burnout [Cesar Ades e Jonathan Sutton]"},{"location":"assessment/","title":"Assessment","text":"

    As you can see in Lesson 01, this course allows for a great deal of freedom, and it is organized through gamification. Each participant creates a profile in the repository and earns skills (and XP) by completing the available activities. All submissions are made via PR to the course repository.

    The final grade is a combination of the total amount of XP received for completing tasks, the amount of XP obtained from group members, and some barrier criteria. The table below summarizes these conditions:

    Grade Score Extra Criteria I ---- Did not complete any tutorial activities D ---- Completed all lesson activities but did not reach a C grade C 45XP
  • 1 x Code Contribution +
  • Accepted Translation! or Documentation Contribution
  • B 90XP
  • Accepted Code Contribution
  • A 150XP A+ 200XP

    Throughout the semester, the scores in the table above may be revised downward, but never upward.

    "},{"location":"assessment/#available-skills","title":"Available Skills","text":"

    Each skill translates into evidence for one of the learning objectives of the course. The collection of all the skills completed during the semester indicates the proficiency of the students in each of the objectives.

    "},{"location":"assessment/#tutorial","title":"Tutorial","text":"

    In this initial part, preparatory activities are carried out to support the development of skills in Code and Community skills.

    id Name Description XP Date 1 First Steps Added to the discipline's repository. 2 25/09 2 Exploring a Project's Environment Researched the history and community of people and services around a project. 3 25/09 3 Undocumented Project Received an undocumented system and got it up and running. 5 25/09 4 Professional Project Refactored poorly written code and created a web page for it. 5 25/09 5 Tested and Approved Created unit tests and interface tests for the challenge server. 5 25/09 6 Python Package Created a Python package installable via pip. 3 25/09 7 Dockerfile Created automated deployment for a Python web system. 3 25/09 8 Basic Translation Used translation tools to translate and localize a small command-line program. 2 25/09 10 FLOSS Research Delivered a long presentation on a recent and relevant topic related to free and open-source software. 5 04/12 11 Better code Addressed linting problems in a poorly written project 5 25/09 12 Release created Created a release and published a binary package for users 5 25/09"},{"location":"assessment/#code","title":"Code","text":"

    Any activity that results in a code contribution to open-source software projects is accepted in the course.

    id Name Description XP Date 21 Code Contribution Submitted a pull request fixing a bug. 7 04/12 22 Contribution Accepted! A non-trivial pull request was accepted by an external project. 13 04/12 23 Simple Contribution Accepted! A simple pull request (with trivial changes or small code refactorings) was accepted by an external project. 3 04/12 24 Bug Report Reported a bug in a repository, and another user was able to reproduce it. 5 04/12 25 Feature Request Made a request for a new feature in a software. 2 04/12 26 INSPER Project Made additional contributions to an INSPER educational project. 5 04/12"},{"location":"assessment/#community","title":"Community","text":"

    A software project is also defined by the interactions of all the people around it: users, developers, and translators. This category includes non-technical contributions that benefit these individuals.

    id Name Description XP Date 40 Indirect Issue Conversations in an issue or pull request led other users to open issues reporting new bugs/improvements. 3 04/12 41 Beta Tester When reproducing a bug, you discovered that it had already been fixed and caused the closure of an issue. 3 04/12 42 Translation Accepted! Made a translation that was accepted in an open-source software. 5 04/12 43 New Languages Added support for translations in a previously non-translatable software. 10 04/12 44 Reviewer Reviewed minor errors in the documentation of a project, and your modifications were accepted. 2 04/12 45 Documentation Contribution Closed an issue marked as docs. 7 04/12 46 Project Pitch Delivered a project pitch. 0 04/12 47 Pitch Accepted! Contributed to a project presented in class. 5 04/12 48 Accepted Suggestion! Another student contributed to the project you pitched. 3 04/12 49 PR Replay Presented (in 15 minutes) the process of resolving a bug in class. 5 04/12"},{"location":"assessment/#impact","title":"Impact","text":"

    This category encompasses skills that represent the impact generated by the activities performed within the context of the course, both on a software project and the community around it. This includes:

    1. Presentations given by students
    2. A large number of accepted contributions to a single project
    3. Mentions of work done by the student on the project's social media
    4. Releases containing commits made within the course's context
    id Name Description XP Date 60 Speaker Gave a talk about libraries or open-source software. 20 04/12 61 Helpdesk Had an accepted answer on sites like StackOverflow or email lists. 4 04/12 62 Published Contribution One of your contributions was included in a release. 10 04/12 63 VIP Guest After making a contribution, someone from the project asked you to perform a task. After delivering the task, add this skill. 5 04/12 64 3 Submitted PRs Submitted 3 pull requests to the same project. 10 04/12 65 3 Accepted PRs 3 pull requests you submitted to a project were accepted. 30 04/12 66 Shoutout Something you did was mentioned by the project on social media or through an official channel. 10 04/12 77 Hacktoberfest Participated in Hacktoberfest by submitting 3 pull requests to external projects. 20 04/12"},{"location":"impact-2019/","title":"Edi\u00e7\u00e3o 2019/2","text":"

    In the 2019/2 edition, students worked on 19 different projects, contributing with 46 code modifications, of which 14 were incorporated into the original projects. In addition to these projects, students also worked on the Servidor de Desafios, a software developed by Insper professors to be used in the Software Design course. A total of 12 accepted modifications have already been used during the semester.

    We also encourage students to participate in external technology events and experience the world outside Insper. In total, students participated in 10 events.

    "},{"location":"impact-2019/#alunos","title":"Alunos","text":"Alessandra Bl\u00fccher Alexandre Edington Antonio Jo\u00e3o Andraues Junior Elisa Mochetti Malzoni Gabriel Lopes Monteiro Gabriel Do Vale Rios Giulia Braga Passarelli Guilherme Leite Hugo Ebert Carl Igor Montagner Leonardo Pereira Medeiros Lucas Scarlato Astur Pedro Cunial Campos Samuel Vinicius Granato De Barros Vinicius Gomes De Lima Vitor Liu"},{"location":"impact-2019/#contribuicoes-de-codigo","title":"Contribui\u00e7\u00f5es de c\u00f3digo","text":"Servidor de desafios
    • https://github.com/Insper/servidor-de-desafios/pull/28 (Elisa Mochetti Malzoni)
    • https://github.com/Insper/servidor-de-desafios/pull/20 (Pedro Cunial Campos)
    • https://github.com/Insper/servidor-de-desafios/issues/13 (Leonardo Pereira Medeiros)
    • https://github.com/Insper/servidor-de-desafios/pull/26 (Samuel Vinicius Granato De Barros)
    • https://github.com/Insper/servidor-de-desafios/pull/30 (Guilherme Leite)
    • https://github.com/Insper/servidor-de-desafios/pull/27 (Alessandra Bl\u00fccher)
    • (Lucas Scarlato Astur)
    • https://github.com/Insper/LogCompTester/issues/2 (Lucas Scarlato Astur)
    • https://github.com/Insper/servidor-de-desafios/pull/29 (Vitor Liu)
    • https://github.com/Insper/servidor-de-desafios/pull/23 (Alexandre Edington)
    • https://github.com/Insper/servidor-de-desafios/pull/32 (Giulia Braga Passarelli)
    • https://github.com/Insper/servidor-de-desafios/pull/38 (Gabriel Do Vale Rios)
    Pandas Pull Requests
    • - https://github.com/pandas-dev/pandas/pull/28183
    • - https://github.com/pandas-dev/pandas/pull/29193
    • - https://github.com/pandas-dev/pandas/pull/29191
    • - https://github.com/pandas-dev/pandas/pull/29087
    • - https://github.com/pandas-dev/pandas/pull/27934
    • - https://github.com/pandas-dev/pandas/pull/28091
    • - https://github.com/pandas-dev/pandas/pull/28032
    • - https://github.com/pandas-dev/pandas/pull/29201
    • - https://github.com/pandas-dev/pandas/pull/28659
    • - https://github.com/pandas-dev/pandas/pull/28265
    • - https://github.com/pandas-dev/pandas/pull/28632
    • - https://github.com/panddev/pandas/pull/28296
    • - https://github.com/lucassa3/pandas/pull/1
    • - https://github.com/pandas-dev/pandas/pull/29701
    • - https://github.com/pandas-dev/pandas/pull/27933
    • - https://github.com/pandas-dev/pandas/pull/29266
    • - https://github.com/pandas-dev/pandas/pull/28696
    • - https://github.com/pandas-dev/pandas/pull/28172
    Issues
    • - https://github.com/pandas-dev/pandas/issues/28218
    Multi-Deployer Issues
    • - https://github.com/HenriquePereiraRosa/multi-deployer/issues/5
    • - https://github.com/HenriquePereiraRosa/multi-deployer/issues/9
    • - https://github.com/HenriquePereiraRosa/multi-deployer/issues/10
    • - https://github.com/HenriquePereiraRosa/multi-deployer/issues/21
    Pull Requests
    • - https://github.com/HenriquePereiraRosa/multi-deployer/pull/6
    • - https://github.com/HenriquePereiraRosa/multi-deployer/pull/12
    • - https://github.com/HenriquePereiraRosa/multi-deployer/pull/11
    • - https://github.com/HenriquePereiraRosa/multi-deployer/pull/7
    • - https://github.com/HenriquePereiraRosa/multi-deployer/pull/22
    • - https://github.com/HenriquePereiraRosa/multi-deployer/pull/23
    • - https://github.com/HenriquePereiraRosa/multi-deployer/pull/24
    • - https://github.com/HenriquePereiraRosa/multi-deployer/pull/26
    • - https://github.com/HenriquePereiraRosa/multi-deployer/pull/15
    • - https://github.com/HenriquePereiraRosa/multi-deployer/pull/28
    • - https://github.com/HenriquePereiraRosa/multi-deployer/pull/13
    Python-Ds Pull Requests
    • - https://github.com/prabhupant/python-ds/pull/250
    • - https://github.com/prabhupant/python-ds/pull/247
    Issues
    • - https://github.com/prabhupant/python-ds/issues/248
    Backtesting Pull Requests
    • - https://github.com/raulikeda/Backtesting/pull/23
    • - https://github.com/raulikeda/Backtesting/pull/22
    Loopdocs Pull Requests
    • - https://github.com/LoopKit/loopdocs/pull/111
    Osu Issues
    • - https://github.com/ppy/osu/issues/6571
    Pull Requests
    • - https://github.com/ppy/osu/issues/2510
    Lector Pull Requests
    • - https://github.com/BasioMeusPuga/Lector/pull/113
    Spacemacs Pull Requests
    • - https://github.com/syl20bnr/spacemacs/pull/12674
    Enzyme Pull Requests
    • - https://github.com/airbnb/enzyme/pull/2271
    Sherlock Pull Requests
    • - https://github.com/sherlock-project/sherlock/pull/372
    Twitter-Scraper Pull Requests
    • - https://github.com/bisguzar/twitter-scraper/pull/80
    Discord-Bot Pull Requests
    • - https://github.com/RPCS3/discord-bot/pull/435
    Scikit-Image Pull Requests
    • - https://github.com/scikit-image/scikit-image/pull/4126
    Issues
    • - https://github.com/scikit-image/scikit-image/issues/4125
    Python-Scripts Pull Requests
    • - https://github.com/ankitdobhal/Python-Scripts/pull/64
    Aos-Reminders Pull Requests
    • - https://github.com/daviseford/aos-reminders/pull/219
    Calcurse Pull Requests
    • - https://github.com/lfos/calcurse/pull/229
    Issues
    • - https://github.com/lfos/calcurse/issues/228
    Scikit-Learn Pull Requests
    • - https://github.com/scikit-learn/scikit-learn/pull/15327
    Nightguard Issues
    • - https://github.com/nightscout/nightguard/issues/61
    Dev-Aberto Issues
    • - https://github.com/Insper/dev-aberto/issues/67
    "},{"location":"impact-2019/#eventos","title":"Eventos","text":""},{"location":"impact-2020/","title":"2020/1","text":"

    In the 2020/1 edition, students worked on 15 different projects, contributing with 27 code modifications, of which 17 were incorporated into the original projects. In addition to these projects, students also worked on the Challenge Server, a software developed by Insper professors to be used in the Software Design course. A total of 7 accepted modifications have already been used during the semester.

    "},{"location":"impact-2020/#alunos","title":"Alunos","text":"Isabella Rocha De Oliveira Bruna Mayumi Kimura Bruno Arthur Cesconetto Eli Jose Abi Ghosn Eric Fernando Otofuji Abrantes Francisco Ciol Rodrigues Aveiro Gabriel Fonseca Moreira Gabriel Valente Francato Hugo Silva Pereira Mendes Igor Dos Santos Montagner Lucca Delchiaro Costabile Martim Ferreira Jose Pedro De La Pe\u00f1a Ferreira Bueno Fonseca Pedro Oliveira De Azambuja Raphael Costa Sabrina Sampaio Simao Victor Laperuta De Moura"},{"location":"impact-2020/#contribuicoes","title":"Contribui\u00e7\u00f5es Melhorias de c\u00f3digo enviadas","text":"Servidor de desafios
    • https://github.com/Insper/servidor-de-desafios/pull/75 (Pedro De La Pe\u00f1a Ferreira Bueno Fonseca)
    • https://github.com/Insper/servidor-de-desafios/pull/72 (Gabriel Valente Francato)
    • https://github.com/Insper/servidor-de-desafios/pull/73 (Gabriel Fonseca Moreira)
    • https://github.com/Insper/servidor-de-desafios/pull/83 (Francisco Ciol Rodrigues Aveiro)
    • https://github.com/Insper/servidor-de-desafios/pull/66 (Pedro Oliveira De Azambuja)
    • https://github.com/Insper/servidor-de-desafios/pull/82 (Martim Ferreira Jose)
    • https://github.com/Insper/servidor-de-desafios/pull/67 (Sabrina Sampaio Simao)
    Pygame/Pygame Pull Requests
    • - https://github.com/pygame/pygame/pull/1909
    • - https://github.com/pygame/pygame/pull/1960
    • - https://github.com/pygame/pygame/pull/1911
    • - https://github.com/pygame/pygame/pull/1923
    • - https://github.com/pygame/pygame/pull/1912
    Pandas-Dev/Pandas Pull Requests
    • - https://github.com/pandas-dev/pandas/pull/32451
    • - https://github.com/pandas-dev/pandas/pull/34267
    • - https://github.com/pandas-dev/pandas/pull/34377
    • - https://github.com/pandas-dev/pandas/pull/34450
    • - https://github.com/pandas-dev/pandas/pull/34812
    Elementary/Code Pull Requests
    • - https://github.com/elementary/code/issues/818
    • - https://github.com/elementary/code/pull/832
    • - https://github.com/elementary/code/pull/833
    Dgilland/Pydash Pull Requests
    • - https://github.com/dgilland/pydash/pull/137
    • - https://github.com/dgilland/pydash/pull/139
    • - https://github.com/dgilland/pydash/pull/138
    Insper/Projeto-Campo-Favela Pull Requests
    • - https://github.com/Insper/projeto-campo-favela/pull/27
    • - https://github.com/Insper/projeto-campo-favela/pull/24
    Hospitalrun/Hospitalrun-Frontend Pull Requests
    • - https://github.com/HospitalRun/hospitalrun-frontend/pull/1983
    • - https://github.com/HospitalRun/hospitalrun-frontend/pull/1977
    Issues
    • - https://github.com/HospitalRun/hospitalrun-frontend/issues/1940
    Bokeh/Bokeh Pull Requests
    • - https://github.com/bokeh/bokeh/pull/10173
    Elementary/Terminal Pull Requests
    • - https://github.com/elementary/terminal/pull/486
    Matplotlib/Matplotlib Pull Requests
    • - https://github.com/matplotlib/matplotlib/pull/16985
    Sorxrob/Covid3D Issues
    • - https://github.com/sorxrob/covid3d/issues/13
    Pull Requests
    • - https://github.com/sorxrob/covid3d/pull/8
    Trekhleb/Covid-19 Pull Requests
    • - https://github.com/trekhleb/covid-19/pull/38
    Elementary/Files Pull Requests
    • - https://github.com/elementary/files/pull/1242
    Antiboomz/Btroblox Pull Requests
    • - https://github.com/AntiBoomz/BTRoblox/pull/24
    Elementary/Appcenter Issues
    • - https://github.com/elementary/appcenter/issues/1321
    Darkreader/Darkreader Issues
    • - https://github.com/darkreader/darkreader/issues/2858
    "},{"location":"impact-2021/","title":"2021/2","text":"

    One of the main objectives of Open Development is to actively participate in existing software projects. In the 2021/2 edition, students worked on 30 different projects, contributing with 56 code modifications, of which 37 were incorporated into the original projects. In addition to these projects, students also worked on software developed by Insper professors to be used in various courses. A total of 0 modifications were accepted in these projects.

    We also encourage students to participate in external technology events and experience the world outside Insper. In total, students participated in 0 events.

    Melhorias de c\u00f3digo enviadas Uutils/Coreutils Pull Requests
    • - https://github.com/uutils/coreutils/pull/2693
    • - https://github.com/uutils/coreutils/pull/2703
    • - https://github.com/uutils/coreutils/pull/2704
    • - https://github.com/uutils/coreutils/pull/2726
    • - https://github.com/uutils/coreutils/pull/2727
    • - https://github.com/uutils/coreutils/pull/2728
    • - https://github.com/uutils/coreutils/pull/2731
    • - https://github.com/uutils/coreutils/pull/2735
    • - https://github.com/uutils/coreutils/pull/2742
    • - https://github.com/uutils/coreutils/pull/2743
    • - https://github.com/uutils/coreutils/pull/2745
    • - https://github.com/uutils/coreutils/pull/2749
    Pandas-Dev/Pandas Pull Requests
    • - https://github.com/pandas-dev/pandas/pull/44806
    • - https://github.com/pandas-dev/pandas/pull/44033
    • - https://github.com/pandas-dev/pandas/pull/44927
    • - https://github.com/pandas-dev/pandas/pull/43791
    • - https://github.com/pandas-dev/pandas/pull/44200
    Robertodoering/Harpy Pull Requests
    • - https://github.com/robertodoering/harpy/pull/471
    • - https://github.com/robertodoering/harpy/pull/473
    • - https://github.com/robertodoering/harpy/pull/474
    • - https://github.com/robertodoering/harpy/pull/483
    Elementary/Code Issues
    • - https://github.com/elementary/code/issues/1096
    Pull Requests
    • - https://github.com/elementary/code/pull/1097
    • - https://github.com/elementary/code/pull/1100
    • - https://github.com/elementary/code/pull/1101
    Outros Pull Requests
    • https://github.com/readthedocs/readthedocs.org/pull/8591
    • https://github.com/plotly/plotly.py/pull/3508
    Backstage/Backstage Pull Requests
    • - https://github.com/backstage/backstage/pull/7594
    • - https://github.com/backstage/backstage/pull/8156
    Nuta/Nsh Pull Requests
    • - https://github.com/nuta/nsh/pull/32
    • - https://github.com/nuta/nsh/pull/37
    Iamashutosh99/Basic-Cpp-Course Pull Requests
    • - https://github.com/iamashutosh99/basic-cpp-course/pull/23
    • - https://github.com/iamashutosh99/basic-cpp-course/pull/22
    Alteryx/Featuretools Pull Requests
    • - https://github.com/alteryx/featuretools/pull/1725
    • - https://github.com/alteryx/featuretools/pull/1733
    Centerofci/Mathesar Pull Requests
    • - https://github.com/centerofci/mathesar/pull/799
    • - https://github.com/centerofci/mathesar/pull/812
    Domokane/Financepy Pull Requests
    • - https://github.com/domokane/FinancePy/pull/121
    • - https://github.com/domokane/FinancePy/pull/119
    Issues
    • - https://github.com/domokane/FinancePy/issues/115
    Tsvillain/Wallbay Pull Requests
    • - https://github.com/tsvillain/Wallbay/pull/8
    • - https://github.com/tsvillain/Wallbay/pull/10
    Issues
    • - https://github.com/tsvillain/Wallbay/issues/7
    • - https://github.com/tsvillain/Wallbay/issues/9
    Numpy/Numpy Pull Requests
    • - https://github.com/numpy/numpy/pull/20389
    Edbmods/Edbpreparecarefully Pull Requests
    • - https://github.com/edbmods/EdBPrepareCarefully/pull/318
    Readthedocs/Common Pull Requests
    • - https://github.com/readthedocs/common/pull/98
    Simple-Icons/Simple-Icons Pull Requests
    • - https://github.com/simple-icons/simple-icons/pull/6825
    Epicmaxco/Vuestic-Admin Pull Requests
    • - https://github.com/epicmaxco/vuestic-admin/pull/845
    Epicmaxco/Vuestic-Ui Pull Requests
    • - https://github.com/epicmaxco/vuestic-ui/pull/1232
    Zulip/Zulip Pull Requests
    • - https://github.com/zulip/zulip/pull/19969
    Pyroscope-Io/Pyroscope Pull Requests
    • - https://github.com/pyroscope-io/pyroscope/pull/492
    Matrix-Org/Matrix-React-Sdk Pull Requests
    • - https://github.com/matrix-org/matrix-react-sdk/pull/6918
    Bootandy/Dust Pull Requests
    • - https://github.com/bootandy/dust/pull/198
    Streamlit/Streamlit Pull Requests
    • - https://github.com/streamlit/streamlit/pull/4051
    Godotengine/Godot Pull Requests
    • - https://github.com/godotengine/godot/pull/55801
    Vector-Im/Element-Desktop Pull Requests
    • - https://github.com/vector-im/element-desktop/pull/274
    Objectbox/Objectbox-Dart Pull Requests
    • - https://github.com/objectbox/objectbox-dart/pull/327
    Tiangolo/Fastapi Pull Requests
    • - https://github.com/tiangolo/fastapi/pull/4042
    Serverless/Serverless Pull Requests
    • - https://github.com/serverless/serverless/pull/10119
    Workalendar/Workalendar Issues
    • - https://github.com/workalendar/workalendar/issues/689
    Twopirllc/Pandas-Ta Issues
    • - https://github.com/twopirllc/pandas-ta/issues/423
    Eventos"},{"location":"impact-2022/","title":"2022/2","text":"

    One of the main objectives of Open Development is to actively participate in existing software projects. In the 2022/2 edition, students worked on 15 different projects, contributing with 20 code modifications, of which 4 were incorporated into the original projects. In addition to these projects, students also worked on software developed by Insper professors to be used in various courses. A total of 0 modifications were accepted in these projects.

    We also encourage students to participate in external technology events and experience the world outside Insper. In total, students participated in 0 events.

    Alunos participantes Bruno Freitas Do Nascimento Rodrigues Caroline Chaim De Lima Carneiro Cesar Ezra Ades Eiki Luis Yamashiro Fabricio Barth Felipe Lemos Gabriel Zanetti Guilherme Carneiro Lunetta Guilherme Teixeira Batista Gustavo Molina Freneda Benites Joao Pedro Farias De Araujo Joao Pedro Montefeltro Junqueira Meirelles Jo\u00e3o Vitor Menezes De Magalh\u00e3es Jonathan Sutton Keiya Nishio Luiza Rodrigues Silveira Marcelo Cesario Miguel Paulo Wook Kim Rafael Alves De Mello Almada Rafael Evangelista Monteiro Raphael Lahiry Rodrigo Guimar\u00e3es Coelho Melhorias de c\u00f3digo enviadas Geekquad/Algobook Pull Requests
    • - https://github.com/geekquad/AlgoBook/pull/563
    • - https://github.com/geekquad/AlgoBook/pull/561
    • - https://github.com/geekquad/AlgoBook/pull/562
    • - https://github.com/geekquad/AlgoBook/pull/564
    Data-8/Datascience Pull Requests
    • - https://github.com/data-8/datascience/pull/563
    • - https://github.com/data-8/datascience/pull/564
    • - https://github.com/data-8/datascience/pull/562
    Adafruit/Adafruit_Circuitpython_Requests Pull Requests
    • - https://github.com/adafruit/Adafruit_CircuitPython_Requests/pull/117
    Ros-Planning/Moveit2 Pull Requests
    • - https://github.com/ros-planning/moveit2/pull/1693
    Grafana/Oncall Pull Requests
    • - https://github.com/grafana/oncall/pull/790
    Neetcode-Gh/Leetcode Pull Requests
    • - https://github.com/neetcode-gh/leetcode/pull/1524
    Outros Pull Requests
    • https://github.com/jfilter/clean-text
    Vael1/-Awesome-Python-Scripts Pull Requests
    • - https://github.com/vael1/-Awesome-Python-Scripts/pull/27
    Civiwiki/Openciviwiki Pull Requests
    • - https://github.com/CiviWiki/OpenCiviWiki/pull/1469
    Aylton-Almeida/Rabbitmq-Pika-Flask Pull Requests
    • - https://github.com/aylton-almeida/rabbitmq-pika-flask/pull/47
    Nidhaloff/Deep-Translator Pull Requests
    • - https://github.com/nidhaloff/deep-translator/pull/166
    Kra53N/Getgit Pull Requests
    • - https://github.com/kra53n/getgit/pull/16
    Commons-App/Apps-Android-Commons Pull Requests
    • - https://github.com/commons-app/apps-android-commons/issues/5100
    Tbillington/Kondo Pull Requests
    • - https://github.com/tbillington/kondo/pull/66
    Matplotlib/Matplotlib Pull Requests
    • - https://github.com/matplotlib/matplotlib/pull/24576
    Eventos"},{"location":"impact/","title":"2023/2","text":"

    One of the main objectives of Open Development is to actively participate in existing software projects. In the 2023/2 edition, students worked on 0 different projects, contributing with 0 code modifications, of which 0 were incorporated into the original projects. In addition to these projects, students also worked on software developed by Insper professors to be used in various courses. A total of 0 modifications were accepted in these projects.

    We also encourage students to participate in external technology events and experience the world outside Insper. In total, students participated in 0 events.

    Code contributions Events"},{"location":"students/","title":"Students","text":"

    The following students are enrolled in this semester.

    Ananda J\u00falia Galv\u00e3o Campelo Andr\u00e9 Felipe Bulc\u00e3o Brito Andr\u00e9 Barboza Braga De Melo Andr\u00e9 Corr\u00eaa Santos Antonio Amaral Egydio Martins Arthur Martins De Souza Barreto Enricco Gemha Eric Andrei Lima Possato Fabr\u00edcio Barth Felipe Aron Nudelman Tabacinik Felipe Catapano Emrich Melo Fernando Alzueta Guilherme Dantas Rameh Guilherme Fontana Louro Igor Montagner Ilana Chaia Finger Jo\u00e3o Ant\u00f4nio Gomes Garcia Leonardo Merlin Paloschi Leonardo Scarlato Lidia Alves Chagas Domingos Lincoln Rodrigo Pereira Melo Lucas Hix Luis Antonio Santana Rodrigues Paulo Henrique Moreira Falc\u00e3o Pedro Bittar Bar\u00e3o Rafael Coca Leventhal Rafael Gordon Paves Rafael Estefam Melhado Araujo Lima Ricardo Ribeiro Rodrigues Rodrigo Anci\u00e3es Patelli Rodrigo Sennati Mattar Thiago Hampl De Pierri Rocha Yuri Tabacof"},{"location":"syllabus/","title":"Syllabus","text":""},{"location":"syllabus/#assessment","title":"Assessment","text":"

    This course has a gamified assessment system. At any time, you can check your grade by running:

    $ ./dev-aberto.py compute-grade your-blackboard-login

    Biweekly reports will be sent with a summary of what has been delivered and which criteria have been met, as well as the student's current grade. There is no possibility of losing points. Although the report is for informational purposes only, if the student is not failing due to absences, they should receive the grade indicated in the biweekly reports.

    Attention

    The complete list of rules is available on the Course Rules page and is the official reference for grade calculation. If there is a discrepancy between the report and the rules page, consider the report to be buggy.

    "},{"location":"syllabus/#schedule","title":"Schedule","text":"
    • MON 13:30 - 15:30
    • WED 13:30 - 15:30
    • Office Hours: on demand
    "},{"location":"syllabus/#student-support-hours","title":"Student support hours","text":"
    • WED 10:00 - 11:30
    "},{"location":"syllabus/#lesson-plan","title":"Lesson Plan","text":"

    The following activities are planned. The program is subject to changes and adaptations as the course progresses.

    Date Question/Problem/Challenge Content 14/08 Introduction to the course and its challenges Workflow with distributed version control: forks, patches, pull requests, and local repositories. Technical and non-technical aspects surrounding software: infrastructure, support, marketing, funding. Reference: FOGEL Ch. 3; Additional reading: TAPSCOTT & WILLIAMS. 19/08 First code contribution Workflow with distributed version control: ammend, rebase, revert. 21/08 Project documentation and what to do when it doesn't exist Types of documentation (user, developer). Source code documentation systems: doxygen, Javadoc, pydoc, sphinx; Reference: FOGEL Ch. 3 (Wikis, Website) 26/08 Studio class for \"Professional Project\" activity Studio class for \"Professional Project\" activity 28/08 Ensuring others can work on the project: API documentation code quality 02/09 Software distribution and versioning Software distribution tools. Types of distribution. Versioning schemes. Reference: FOGEL Ch. 7 04/09 How to make software work in multiple countries? Localization and internationalization. Gettext tool for translations and .po format. 09/09 Software testing Types of software testing: unit, integration, and interface. Testing tools: pytest, selenium. 11/09 Studio class for \"Software Testing\" activity Studio class for \"Software Testing\" activity 16/09 Software licenses Copyrights in Brazil, patents, and software licenses; Reference: LAURENT Ch. 1 and 5, STALLMAN Ch. 6 18/09 Introduction to contributions in open projects - Activity \"My First Contribution\" Studio class for group activity \"My First Contribution\" 23/09 Studio class for group activity \"My First Contribution\" Studio class for group activity \"My First Contribution\" 25/09 Studio class for group activity \"My First Contribution\" Studio class for group activity \"My First Contribution\" 30/09 EXAM WEEK EXAM WEEK 02/10 EXAM WEEK EXAM WEEK 07/10 Working in software communities Assessment metrics for the second part of the course; Communication and teamwork. Reference: RAYMOND Ch. 4 09/10 Course project Studio class for project development 14/10 Course project Studio class for project development 16/10 Course project Studio class for project development 21/10 Course project Studio class for project development 23/10 Course project Studio class for project development 28/10 Course project Studio class for project development 30/10 Course project Studio class for project development 04/11 Course project Studio class for project development 06/11 Course project Studio class for project development 11/11 Course project Studio class for project development 13/11 Course project Studio class for project development 18/11 Topics on free culture and software communities Topics on free culture and software communities 20/11 PUBLIC HOLIDAY PUBLIC HOLIDAY 25/11 Topics on free culture and software communities Topics on free culture and software communities 27/11 Topics on free culture and software communities Topics on free culture and software communities 02/12 EXAM WEEK EXAM WEEK 04/12 EXAM WEEK EXAM WEEK"},{"location":"_snippets/alunos/","title":"Alunos","text":"Ananda J\u00falia Galv\u00e3o Campelo Andr\u00e9 Felipe Bulc\u00e3o Brito Andr\u00e9 Barboza Braga De Melo Andr\u00e9 Corr\u00eaa Santos Antonio Amaral Egydio Martins Arthur Martins De Souza Barreto Enricco Gemha Eric Andrei Lima Possato Fabr\u00edcio Barth Felipe Aron Nudelman Tabacinik Felipe Catapano Emrich Melo Fernando Alzueta Guilherme Dantas Rameh Guilherme Fontana Louro Igor Montagner Ilana Chaia Finger Jo\u00e3o Ant\u00f4nio Gomes Garcia Leonardo Merlin Paloschi Leonardo Scarlato Lidia Alves Chagas Domingos Lincoln Rodrigo Pereira Melo Lucas Hix Luis Antonio Santana Rodrigues Paulo Henrique Moreira Falc\u00e3o Pedro Bittar Bar\u00e3o Rafael Coca Leventhal Rafael Gordon Paves Rafael Estefam Melhado Araujo Lima Ricardo Ribeiro Rodrigues Rodrigo Anci\u00e3es Patelli Rodrigo Sennati Mattar Thiago Hampl De Pierri Rocha Yuri Tabacof"},{"location":"_snippets/plano-de-aulas/","title":"Plano de aulas","text":"Date Question/Problem/Challenge Content 14/08 Introduction to the course and its challenges Workflow with distributed version control: forks, patches, pull requests, and local repositories. Technical and non-technical aspects surrounding software: infrastructure, support, marketing, funding. Reference: FOGEL Ch. 3; Additional reading: TAPSCOTT & WILLIAMS. 19/08 First code contribution Workflow with distributed version control: ammend, rebase, revert. 21/08 Project documentation and what to do when it doesn't exist Types of documentation (user, developer). Source code documentation systems: doxygen, Javadoc, pydoc, sphinx; Reference: FOGEL Ch. 3 (Wikis, Website) 26/08 Studio class for \"Professional Project\" activity Studio class for \"Professional Project\" activity 28/08 Ensuring others can work on the project: API documentation code quality 02/09 Software distribution and versioning Software distribution tools. Types of distribution. Versioning schemes. Reference: FOGEL Ch. 7 04/09 How to make software work in multiple countries? Localization and internationalization. Gettext tool for translations and .po format. 09/09 Software testing Types of software testing: unit, integration, and interface. Testing tools: pytest, selenium. 11/09 Studio class for \"Software Testing\" activity Studio class for \"Software Testing\" activity 16/09 Software licenses Copyrights in Brazil, patents, and software licenses; Reference: LAURENT Ch. 1 and 5, STALLMAN Ch. 6 18/09 Introduction to contributions in open projects - Activity \"My First Contribution\" Studio class for group activity \"My First Contribution\" 23/09 Studio class for group activity \"My First Contribution\" Studio class for group activity \"My First Contribution\" 25/09 Studio class for group activity \"My First Contribution\" Studio class for group activity \"My First Contribution\" 30/09 EXAM WEEK EXAM WEEK 02/10 EXAM WEEK EXAM WEEK 07/10 Working in software communities Assessment metrics for the second part of the course; Communication and teamwork. Reference: RAYMOND Ch. 4 09/10 Course project Studio class for project development 14/10 Course project Studio class for project development 16/10 Course project Studio class for project development 21/10 Course project Studio class for project development 23/10 Course project Studio class for project development 28/10 Course project Studio class for project development 30/10 Course project Studio class for project development 04/11 Course project Studio class for project development 06/11 Course project Studio class for project development 11/11 Course project Studio class for project development 13/11 Course project Studio class for project development 18/11 Topics on free culture and software communities Topics on free culture and software communities 20/11 PUBLIC HOLIDAY PUBLIC HOLIDAY 25/11 Topics on free culture and software communities Topics on free culture and software communities 27/11 Topics on free culture and software communities Topics on free culture and software communities 02/12 EXAM WEEK EXAM WEEK 04/12 EXAM WEEK EXAM WEEK"},{"location":"_snippets/skills-code/","title":"Skills code","text":"id Name Description XP Date 21 Code Contribution Submitted a pull request fixing a bug. 7 04/12 22 Contribution Accepted! A non-trivial pull request was accepted by an external project. 13 04/12 23 Simple Contribution Accepted! A simple pull request (with trivial changes or small code refactorings) was accepted by an external project. 3 04/12 24 Bug Report Reported a bug in a repository, and another user was able to reproduce it. 5 04/12 25 Feature Request Made a request for a new feature in a software. 2 04/12 26 INSPER Project Made additional contributions to an INSPER educational project. 5 04/12"},{"location":"_snippets/skills-community/","title":"Skills community","text":"id Name Description XP Date 40 Indirect Issue Conversations in an issue or pull request led other users to open issues reporting new bugs/improvements. 3 04/12 41 Beta Tester When reproducing a bug, you discovered that it had already been fixed and caused the closure of an issue. 3 04/12 42 Translation Accepted! Made a translation that was accepted in an open-source software. 5 04/12 43 New Languages Added support for translations in a previously non-translatable software. 10 04/12 44 Reviewer Reviewed minor errors in the documentation of a project, and your modifications were accepted. 2 04/12 45 Documentation Contribution Closed an issue marked as docs. 7 04/12 46 Project Pitch Delivered a project pitch. 0 04/12 47 Pitch Accepted! Contributed to a project presented in class. 5 04/12 48 Accepted Suggestion! Another student contributed to the project you pitched. 3 04/12 49 PR Replay Presented (in 15 minutes) the process of resolving a bug in class. 5 04/12"},{"location":"_snippets/skills-impact/","title":"Skills impact","text":"id Name Description XP Date 60 Speaker Gave a talk about libraries or open-source software. 20 04/12 61 Helpdesk Had an accepted answer on sites like StackOverflow or email lists. 4 04/12 62 Published Contribution One of your contributions was included in a release. 10 04/12 63 VIP Guest After making a contribution, someone from the project asked you to perform a task. After delivering the task, add this skill. 5 04/12 64 3 Submitted PRs Submitted 3 pull requests to the same project. 10 04/12 65 3 Accepted PRs 3 pull requests you submitted to a project were accepted. 30 04/12 66 Shoutout Something you did was mentioned by the project on social media or through an official channel. 10 04/12 77 Hacktoberfest Participated in Hacktoberfest by submitting 3 pull requests to external projects. 20 04/12"},{"location":"_snippets/skills-tutorial/","title":"Skills tutorial","text":"id Name Description XP Date 1 First Steps Added to the discipline's repository. 2 25/09 2 Exploring a Project's Environment Researched the history and community of people and services around a project. 3 25/09 3 Undocumented Project Received an undocumented system and got it up and running. 5 25/09 4 Professional Project Refactored poorly written code and created a web page for it. 5 25/09 5 Tested and Approved Created unit tests and interface tests for the challenge server. 5 25/09 6 Python Package Created a Python package installable via pip. 3 25/09 7 Dockerfile Created automated deployment for a Python web system. 3 25/09 8 Basic Translation Used translation tools to translate and localize a small command-line program. 2 25/09 10 FLOSS Research Delivered a long presentation on a recent and relevant topic related to free and open-source software. 5 04/12 11 Better code Addressed linting problems in a poorly written project 5 25/09 12 Release created Created a release and published a binary package for users 5 25/09"},{"location":"aulas/09-cultura-livre/","title":"09 - Trabalho sobre cultura livre","text":"

    Esta aula n\u00e3o tem atividade pr\u00e1tica. As discuss\u00f5es s\u00e3o feitas durante a aula expositiva.

    "},{"location":"aulas/09-cultura-livre/slides/","title":"Cultura de software livre","text":""},{"location":"aulas/09-cultura-livre/slides/#desenvolvimento-aberto","title":"Desenvolvimento Aberto","text":""},{"location":"aulas/09-cultura-livre/slides/#cultura-de-software-livre","title":"Cultura de software livre","text":""},{"location":"aulas/09-cultura-livre/slides/#versao-20222-fabricio-barth-fabriciojbinsperedubr","title":"Vers\u00e3o 2022/2: Fabr\u00edcio Barth ( fabriciojb@insper.edu.br )","text":""},{"location":"aulas/09-cultura-livre/slides/#atividade","title":"Atividade","text":"

    Cultura livre: fazer uma pesquisa profunda e apresentar semin\u00e1rio sobre licen\u00e7as de software e casos recentes em que licen\u00e7as tem papel de destaque

    "},{"location":"aulas/09-cultura-livre/slides/#sua-apresentacao-precisa-ter-alguma-forma-de-interacao-com-a-audiencia","title":"Sua apresenta\u00e7\u00e3o precisa ter alguma forma de intera\u00e7\u00e3o com a audi\u00eancia","text":"
    • debate
    • painel com vota\u00e7\u00f5es
    "},{"location":"aulas/09-cultura-livre/slides/#atividade-sugestoes-de-temas","title":"Atividade - sugest\u00f5es de temas","text":"
    • The new open-source economics (Yochai Benkler, 2005). O que mudou de 2005 para 2022?

    • There is no \"Linux\" platform.

    • Telemetria \u00e9 \"\u00e9tico\"? (exemplo VSCode e outros).

    • GitHub CoPilot \u00e9 \"\u00e9tico\"? Respeita licen\u00e7as de software?

    • Regulamenta\u00e7\u00f5es recentes na Europa sobre durabilidade de smartphones (bateria, right to repair, etc).

    • Maintainer burnout.

    "},{"location":"aulas/09-cultura-livre/slides/#atividade-datas-de-apresentacao","title":"Atividade - datas de apresenta\u00e7\u00e3o","text":"
    • 17/11 - 2 trabalho
    • 22/11 - 2 trabalhos
    • 24/11 - 2 trabalhos
    • 29/11 - 2 trabalhos
    "},{"location":"aulas/09-cultura-livre/slides/#45-minutos-de-apresentacaoatividade-10-minutos-para-perguntas","title":"45 minutos de apresenta\u00e7\u00e3o/atividade + 10 minutos para perguntas","text":""},{"location":"aulas/09-cultura-livre/slides/#hoje","title":"Hoje","text":"
    • Defini\u00e7\u00e3o de temas e datas de apresenta\u00e7\u00e3o
    • Pr\u00e9via de 5 minutos do seu tema na pr\u00f3xima aula
    "},{"location":"aulas/09-cultura-livre/slides/#registrar-seu-grupo-escolha-de-tema-e-dia-de-apresentacao-na-issue-665","title":"Registrar seu grupo, escolha de tema e dia de apresenta\u00e7\u00e3o na issue #665","text":""},{"location":"aulas/11-contribuicoes-externas/","title":"11 - Contribui\u00e7\u00f5es externas","text":"

    Esta aula n\u00e3o tem atividade pr\u00e1tica guidada, mas tem uma parte expositiva importante. N\u00e3o esque\u00e7a de olhar os slides de hoje para relembrar.

    "},{"location":"aulas/11-contribuicoes-externas/slides/","title":"Dicas de Debug","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#desenvolvimento-aberto","title":"Desenvolvimento Aberto","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#_1","title":"Dicas de Debug","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#dicas-de-debug","title":"Dicas de Debug","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#igor-dos-santos-montagner-igorsm1insperedubr","title":"Igor dos Santos Montagner ( igorsm1@insper.edu.br )","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#minha-primeira-contribuicao-de-codigo","title":"Minha primeira contribui\u00e7\u00e3o de c\u00f3digo","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#dicas-para-debugar-qualquer-coisa","title":"Dicas para debugar (qualquer coisa)","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#9-regras-de-debug","title":"9 regras de debug","text":"
    1. UNDERSTAND THE SYSTEM
    2. MAKE IT FAIL
    3. QUIT THINKING AND LOOK
    4. DIVIDE AND CONQUER
    5. CHANGE ONE THING AT A TIME
    6. KEEP AN AUDIT TRAIL
    7. CHECK THE PLUG
    8. GET A FRESH VIEW
    9. IF YOU DIDN'T FIX IT, IT AIN'T FIXED
    "},{"location":"aulas/11-contribuicoes-externas/slides/#1-understand-the-system","title":"1. Understand the system","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#nada-acontece-se-nao-conseguirmos","title":"Nada acontece se n\u00e3o conseguirmos","text":"
    1. Baixar a vers\u00e3o de desenvolvimento
    2. Instalar todas as depend\u00eancias
    3. Compilar nossa pr\u00f3pria vers\u00e3o
    4. Rodar testes na vers\u00e3o do master
    "},{"location":"aulas/11-contribuicoes-externas/slides/#1-understand-the-system_1","title":"1. Understand the system","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#ferramentas-importantes","title":"Ferramentas importantes:","text":"
    1. Virtual environments: venv, virtualenv, pipenv, conda
    2. setuptools - development mode
    3. Debugging
      • pdb
      • fun\u00e7\u00e3o breakpoint() (tutorial)
    "},{"location":"aulas/11-contribuicoes-externas/slides/#1-understand-the-system_2","title":"1. Understand the system","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#conheca-suas-ferramentas","title":"Conhe\u00e7a suas ferramentas","text":"
    • Debugging visual linha a linha
    • Stacktrace
    • Busca em projeto inteiro
    • Ir para defini\u00e7\u00e3o de fun\u00e7\u00e3o
    "},{"location":"aulas/11-contribuicoes-externas/slides/#debugar-usando-print-e-perda-de-tempo","title":"Debugar usando print \u00e9 perda de tempo","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#2-make-it-fail","title":"2. Make it fail","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#reproduza-seu-bug","title":"Reproduza seu bug","text":"
    • Crie um exemplo m\u00ednimo que reproduza o bug desejado ou que usaria a feature que quer implementar
      • entrada de exemplo e sa\u00edda esperada vs sa\u00edda obtida
    • Possivelmente isto j\u00e1 foi descrito na issue escolhida.
    • Anote elementos que te ajudem a encontrar onde isto ocorre no c\u00f3digo (fun\u00e7\u00f5es usadas, elementos de interface gr\u00e1fica, mensagens de erro.)
    "},{"location":"aulas/11-contribuicoes-externas/slides/#3-quit-thinking-and-look","title":"3. Quit thinking and look","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#encontre-onde-esta-o-problema-e-leia-o-codigo-com-atencao","title":"Encontre onde est\u00e1 o problema e leia o c\u00f3digo com aten\u00e7\u00e3o","text":"
    1. Encontre no c\u00f3digo onde o bug pode estar
    2. Comece geral (em qual arquivo est\u00e1 a funcionalidade?) e v\u00e1 restringindo (em qual fun\u00e7\u00e3o o bug \"explode\"?)
    3. Ferramentas de debug s\u00e3o essenciais. Veja o item 1.
      • N\u00e3o atenderei ningu\u00e9m que esteja debugando s\u00f3 com print
    "},{"location":"aulas/11-contribuicoes-externas/slides/#3-quit-thinking-and-look_1","title":"3. Quit thinking and look","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#buscando-por-nomes-de-arquivos","title":"Buscando por nomes de arquivos","text":"

    Comando find (man page)

    Exemplo: procurar por arquivos cujo nome \u00e9 aceito por uma certa express\u00e3o regular come\u00e7ando no diret\u00f3rio atual.

    $ find -iname \"regexp\" .

    "},{"location":"aulas/11-contribuicoes-externas/slides/#3-quit-thinking-and-look_2","title":"3. Quit thinking and look","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#buscando-no-conteudo-dos-arquivos","title":"Buscando no conte\u00fado dos arquivos","text":"

    Comando grep (man page)

    $ grep [OPTIONS] PATTERN FILES

    • PATTERN: express\u00e3o regular
    • FILES: lista de diret\u00f3rios ou arquivos
    "},{"location":"aulas/11-contribuicoes-externas/slides/#3-quit-thinking-and-look-grep","title":"3. Quit thinking and look - grep","text":"

    Exemplo 1: buscar todos arquivos nas pasta atual (.) e subpastas com o texto \"dialog\" ignorando mai\u00fasculas/min\u00fasculas.

    $ grep -r -i dialog .

    "},{"location":"aulas/11-contribuicoes-externas/slides/#_2","title":"Dicas de Debug","text":"

    Exemplo 2: Listas todos os arquivos .cpp que fazem algum include

    $ grep -r --include \"*cpp\" \"#include\" .

    "},{"location":"aulas/11-contribuicoes-externas/slides/#sua-ideeditor-devem-ter-algo-parecido-procure-e-use","title":"Sua IDE/editor devem ter algo parecido. Procure e use.","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#4-divide-and-conquer","title":"4. Divide and Conquer","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#crie-um-plano-de-acao","title":"Crie um plano de a\u00e7\u00e3o","text":"
    1. Por que o bug ocorre?
      • Est\u00e1 relacionado a qual fun\u00e7\u00e3o?
      • Qual vari\u00e1vel tem o valor errado?
    2. O que deve ser mudado para que pare de ocorrer?

    Pr\u00e9-requisito: debugar visualmente usando alguma IDE / editor

    "},{"location":"aulas/11-contribuicoes-externas/slides/#5-change-one-thing-at-a-time","title":"5. Change one thing at a time","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#um-bom-pr-muda-o-minimo-possivel","title":"Um bom PR muda o m\u00ednimo poss\u00edvel","text":"
    • use v\u00e1rias branches se quiser testar ideias diferentes
    • git commit \u00e9 gr\u00e1tis. Quando chegar na vers\u00e3o final \u00e9 s\u00f3 juntar tudo e mandar.
    • git rebase para atualizar seu branch com o master upstream caso necess\u00e1rio.
    "},{"location":"aulas/11-contribuicoes-externas/slides/#6-keep-an-audit-trail","title":"6. Keep an audit trail","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#registre-suas-descobertas","title":"Registre suas descobertas","text":"
    • Log de como voc\u00ea encontrou onde mexer
    • Log de todos arquivos de interesse e seus usos
    • Log de todas as pesquisas feitas
    • Log de todas as modifica\u00e7\u00f5es feitas
    • git commit \u00e9 \u00fatil para registrar testes tamb\u00e9m

    N\u00e3o se esque\u00e7a:git diff \u00e9 seu melhor amigo

    "},{"location":"aulas/11-contribuicoes-externas/slides/#7-check-the-plug","title":"7. Check the plug","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#nunca-se-esqueca-de-testar-a-solucoes-mais-simples-primeiro","title":"Nunca se esque\u00e7a de testar a solu\u00e7\u00f5es mais simples primeiro","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#8-get-a-fresh-view","title":"8. Get a fresh view","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#empacou","title":"Empacou?","text":"

    \u00c9 por isso que voc\u00eas trabalham em grupo no primeiro bug.

    "},{"location":"aulas/11-contribuicoes-externas/slides/#empacou-mesmo","title":"Empacou mesmo?","text":"

    Para isto serve seu grupo.

    "},{"location":"aulas/11-contribuicoes-externas/slides/#empacou-mesmo_1","title":"Empacou mesmo!?!?!?!?","text":"

    Me chame!

    "},{"location":"aulas/11-contribuicoes-externas/slides/#9-if-you-didnt-fix-it-it-aint-fixed","title":"9. If you didn't fix it, it ain't fixed","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#hora-de-programar","title":"Hora de programar","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#tentem-aplicar-estas-ideias-aos-seus-problemas","title":"Tentem aplicar estas ideias aos seus problemas","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#envie-4-prs-para-projetos-participantes-e-ganhe-uma-camiseta","title":"Envie 4 PRs para projetos participantes e ganhe uma camiseta","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#atividade-extra-hacktoberfest","title":"Atividade extra: hacktoberfest","text":"

    Objetivo: Enviar 3 PRs para projetos externos no m\u00eas de outubro.

    \"metadata\": {\"date\": \"2021-10-31\"}

    "},{"location":"aulas/11-contribuicoes-externas/slides/#desenvolvimento-aberto_1","title":"Desenvolvimento Aberto","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#_3","title":"Dicas de Debug","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#dicas-de-debug_1","title":"Dicas de debug","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#igor-dos-santos-montagner-igorsm1insperedubr_1","title":"Igor dos Santos Montagner ( igorsm1@insper.edu.br )","text":""},{"location":"aulas/12-projeto/slides/","title":"Projeto da disciplina","text":""},{"location":"aulas/12-projeto/slides/#desenvolvimento-aberto","title":"Desenvolvimento Aberto","text":""},{"location":"aulas/12-projeto/slides/#projeto-da-disciplina","title":"Projeto da disciplina","text":""},{"location":"aulas/12-projeto/slides/#igor-dos-santos-montagner-igorsm1insperedubr","title":"Igor dos Santos Montagner ( igorsm1@insper.edu.br )","text":""},{"location":"aulas/12-projeto/slides/#ate-agora","title":"At\u00e9 agora","text":"
    • Ferramentas de colabora\u00e7\u00e3o
    • Modifica\u00e7\u00f5es de c\u00f3digo
    • Tradu\u00e7\u00e3o de UI e documenta\u00e7\u00e3o
    • Aspectos n\u00e3o t\u00e9cnicos relacionados
      • licen\u00e7as
      • comunidades
    • Colabora\u00e7\u00e3o em um projeto do Insper
    "},{"location":"aulas/12-projeto/slides/#ate-agora_1","title":"At\u00e9 agora","text":""},{"location":"aulas/12-projeto/slides/#formacao-basica","title":"Forma\u00e7\u00e3o b\u00e1sica","text":"
    • Analisar uma base de c\u00f3digos desconhecida de m\u00e9dio/grande porte e modific\u00e1-la de modo a fazer melhorias e corrigir falhas em um software;
    "},{"location":"aulas/12-projeto/slides/#_1","title":"Projeto da disciplina","text":"
    • Interagir com uma equipe remota de desenvolvedores para entregar c\u00f3digo que atenda aos padr\u00f5es de qualidade e estilo de c\u00f3digo de um projeto;
    "},{"location":"aulas/12-projeto/slides/#projeto-aberto","title":"Projeto Aberto","text":"

    Objetivos:

    1. proporcionar uma experi\u00eancia de trabalho em um projeto real de escolha dos alunos
    2. valorizar diversos tipos de contribui\u00e7\u00f5es, n\u00e3o somente de c\u00f3digo
    3. exercitar autonomia e independ\u00eancia
    "},{"location":"aulas/12-projeto/slides/#projeto-aberto_1","title":"Projeto Aberto","text":""},{"location":"aulas/12-projeto/slides/#organizado-em-dois-blocos-de-5-aulas","title":"Organizado em dois blocos de 5 aulas","text":"
    • 11/05 - 25/05
    • 27/05 - 10/06
    "},{"location":"aulas/12-projeto/slides/#projeto-aberto-pitches-de-projeto","title":"Projeto Aberto - Pitches de projeto","text":"

    Cada bloco se inicia com uma aula de Pitches de Projeto, que \u00e9 uma apresenta\u00e7\u00e3o de 5 minutos apresentando o projeto para o qual voc\u00ea contribuir\u00e1 na semana.

    • Trocar ideias sobre projetos interessantes
    • Ajudar alunos indecisos a escolherem um projeto
    • Se comprometer com uma escolha de projeto
    "},{"location":"aulas/12-projeto/slides/#projeto-aberto-pitch-de-projeto","title":"Projeto Aberto: Pitch de projeto","text":"

    Objetivo: Apresentou um Pitch de projeto. Se o aluno s\u00f3 apresentar o projeto e n\u00e3o fizer contribui\u00e7\u00e3o vale 0 XP.

    \"metadata\": {\"url\": \"url_do_projeto_proposto\", \"filename\": \"pdf da apresentacaoo\"}

    Colocar pdf da apresenta\u00e7\u00e3o na pasta docs/pitches.

    "},{"location":"aulas/12-projeto/slides/#projeto-aberto-pitch-aceito","title":"Projeto Aberto: Pitch aceito!","text":"

    Objetivo: Enviou contribui\u00e7\u00e3o para um projeto apresentado em sala.

    \"metadata\": {\"url\": \"url_do_projeto_proposto\"}

    A ser enviado al\u00e9m da skill da contribui\u00e7\u00e3o.

    "},{"location":"aulas/12-projeto/slides/#projeto-aberto-sugestao-aceita","title":"Projeto Aberto: Sugest\u00e3o aceita!","text":"

    Objetivo: Outro aluno enviou contribui\u00e7\u00e3o para o projeto que voc\u00ea fez Pitch.

    \"metadata\": {\"url\": \"url_da_contribuicao\"}

    A ser enviado pelo aluno que prop\u00f4s o Pitch, que tamb\u00e9m precisa ter contribu\u00eddo.

    "},{"location":"aulas/12-projeto/slides/#projeto-aberto-pitches-de-projeto_1","title":"Projeto Aberto - Pitches de projeto","text":"
    1. Apresentar um pitch \u00e9 uma skill que vale XP
    2. Ajudar colegas interessados no \"seu\" projeto vale XP
    3. Aceitar sugest\u00f5es/ajudas vale XP
    4. Tudo isso \u00e9 al\u00e9m da XP j\u00e1 obtida com as contribui\u00e7\u00f5es
    "},{"location":"aulas/12-projeto/slides/#evitar-alunos-trabalhando-sozinhos","title":"Evitar alunos trabalhando sozinhos.","text":""},{"location":"aulas/12-projeto/slides/#estrategias-para-escolha-um-projeto","title":"Estrat\u00e9gias para escolha um projeto","text":""},{"location":"aulas/12-projeto/slides/#aprendizado-de-tecnologias-novas","title":"Aprendizado de tecnologias novas","text":"
    • Linguagem de programa\u00e7\u00e3o
    • Biblioteca
    • Tipo de tecnologia: web, mobile, desktop
    "},{"location":"aulas/12-projeto/slides/#estrategias-para-escolha-um-projeto_1","title":"Estrat\u00e9gias para escolha um projeto","text":""},{"location":"aulas/12-projeto/slides/#aperfeicoamento-em-tecnologias-que-ja-domina","title":"Aperfei\u00e7oamento em tecnologias que j\u00e1 domina","text":"
    • Linguagem de programa\u00e7\u00e3o espec\u00edfica
    • Tipo de tecnologia: web, mobile, desktop
    "},{"location":"aulas/12-projeto/slides/#estrategias-para-escolha-um-projeto_2","title":"Estrat\u00e9gias para escolha um projeto","text":""},{"location":"aulas/12-projeto/slides/#projetos-de-interesse-pessoal","title":"Projetos de interesse pessoal","text":"
    • Algum software que voc\u00ea usa
    • Melhorar alternativa livre para software propriet\u00e1rio
    • Moonshot: projetos ambiciosos com chance m\u00ednima de sucesso
    • Site AlternativeTo
    "},{"location":"aulas/12-projeto/slides/#hoje","title":"Hoje","text":"
    • Finalizar Projeto DIY
    • Escolher projetos para o primeiro bloco
    • Iniciar trabalhos da segunda parte da disciplina
    "},{"location":"aulas/12-projeto/slides/#desenvolvimento-aberto_1","title":"Desenvolvimento Aberto","text":""},{"location":"aulas/12-projeto/slides/#projeto-da-disciplina_1","title":"Projeto da disciplina","text":""},{"location":"aulas/12-projeto/slides/#igor-dos-santos-montagner-igorsm1insperedubr_1","title":"Igor dos Santos Montagner ( igorsm1@insper.edu.br )","text":""},{"location":"delivery/","title":"Delivery folder","text":"

    In this folder you will find files produced by students.

    "},{"location":"lessons/01-distributed-workflow/","title":"01 - Distributed Development Workflow","text":"

    In this guide, we will work on the standard workflow for contributing to projects hosted on GitHub (which also applies to Git projects in general). Before starting, each student should locate the corresponding issue on the course's GitHub repository for creating their user.

    Our workflow will be based on three main parts. In the first part, we will create a copy of the repository \"insper/dev-aberto\" where we will make all the necessary changes. In the second part, we will send our modifications to the original repository using a Pull Request, which is a request to accept the changes from a forked repository into the original repository. Finally, we will update our fork with modifications sent by colleagues.

    Some key points to highlight in the above workflow:

    1. Even if a user does not have access to the original repository, they can work on their own copy and only submit their modifications to the original repository when everything is ready.
    2. It is necessary for a developer from the original project to \"take responsibility\" for the accepted external modifications.
    3. The Pull requests tab allows developers to discuss proposed modifications and improve them. Every commit made after the creation of the PR is included and can be tested by anyone.
    "},{"location":"lessons/01-distributed-workflow/#creating-your-own-copy","title":"Creating your own copy","text":"

    We will start our workflow by creating a fork of the repository \"insper/dev-aberto\". All our modifications will be made in our fork, on a separate branch (it is recommended to use a different branch for each issue). This way, our modifications are completely isolated from the original code, and we can test them alongside the original code.

    First, create the fork through the GitHub interface. Then, clone your fork and create a new branch called \"issue-X,\" where \"X\" is the number of your issue in the original project.

    $ git checkout -b issue-X

    To ensure that you are in the directory of your fork, execute the following command:

    $ git remote -vv

    The displayed addresses should be those of your fork, not the original project.

    With the fork created and being on the \"issue-X\" branch (you can check using git branch and switch using git checkout issue-X), we will begin making modifications.

    "},{"location":"lessons/01-distributed-workflow/#interacting-with-the-course-repository","title":"Interacting with the course repository","text":"

    The creation of users and addition of skills is done using the command dev-aberto.py.

    Tip

    To use it, you need to install the packages listed in the requirements.txt file.

    Running it in the terminal should list the available commands.

    $ python3 dev-aberto.py

    To check if everything is working correctly, list all registered users. There should be only one registered user (igorsm1).

    "},{"location":"lessons/01-distributed-workflow/#creating-a-user","title":"Creating a user","text":"

    User creation is done with the command:

    $ python3 dev-aberto.py new-user

    This will create three files in the students folder:

    • your-login: basic user information in JSON format.
    • your-login-achievements: encrypted file containing the deliveries of each student in JSON format.
    • your-login.key: cryptographic key for the above file.

    Verify that your user was created correctly by listing the existing users again. Your user should have an asterisk (*) next to the name, indicating that the login.key file is present in the system.

    Danger

    Do not include the *.key file in your PR. It should be sent by email to the professor. Do this now before you forget!

    Also, verify that you can use the command dev-aberto.py compute-grade your-login. If everything is okay, proceed to the next item.

    "},{"location":"lessons/01-distributed-workflow/#adding-a-skill","title":"Adding a skill","text":"

    With the user created, we can add the skill \"First Steps.\" You may have noticed that the professor's key is available (file students/igorsm1.key). This was done so that you have at least one example of how each skill should be added. See below for an example of how the skill should be included:

    $ python3 dev-aberto.py edit-achievements igorsm1

    This will open a file for editing in Vi. The format is a list of objects containing two fields: \"skill_id\" and \"metadata\". See the example below for the first skill

    [\n{\"skill_id\": 1, \"metadata\": {\"date\": \"YYYY-MM-DD\"} }\n]\n

    Tip

    If you want to use another text editor, you can set the environment variable EDITOR just before calling dev-aberto.py.

    Now add the skill to your user following the same pattern seen above. Verify that your skill was correctly added using the compute-grade command.

    Tip

    If your repository is OK, help your classmates.

    "},{"location":"lessons/01-distributed-workflow/#sending-modifications-to-the-original-project","title":"Sending modifications to the original project","text":"

    Now let's create a commit and send it as a Pull Request to the course's repository. Add the created files (excluding the *.key file!) and make a commit with the following message (replace the X with the number of your issue in the repository):

    Add user your-login.\n

    Execute git push and continue.

    With your modifications already in your fork, it's time to send them to the original repository. This is done on the GitHub interface. First, access your fork in the browser, locate your issue-X branch, and click the \"Pull request\" button.

    The title of your Pull Request should be Create user login. Your PR should contain only one commit and should have the branch issue-X created above as the source. In the description of your PR, add the text:

    Closes #X\n

    where X is the number of your user's issue. This automatically closes the issue when (and if) this PR is accepted.

    Warning

    PRs made from main or with more than one commit will not be accepted.

    Use the checklist below to help verify if your work is correct:

    • Created a new user with new-user.
    • Added the \"First Steps\" skill.
    • Checked that the new user has the new skill using compute-grade.
    • Created a PR with only one commit and the correct files.
    • Sent the .key file by email to the professor.
    • Did not include the .key file in the PR.

    Once your PR is accepted, you can remove the issue-X branch.

    "},{"location":"lessons/01-distributed-workflow/#updating-your-fork","title":"Updating your fork","text":"

    After having your PR accepted, you may have noticed that your commit appears in the original project's main branch but does not appear in your fork. This is because a fork is not automatically updated when its corresponding original repository receives new commits.

    To make this happen, you need to perform a manual synchronization. For now, we will use the GitHub interface to do this.

    Visit your fork again. Now, there should be an option to sync your fork with the original repository. Use it to make your main branch receive the new commits.

    Warning

    Sync your repository whenever you work on a new PR. This will prevent many conflicts when merging your modifications into the original repository.

    "},{"location":"lessons/01-distributed-workflow/slides/","title":"Distributed coding workflow","text":""},{"location":"lessons/01-distributed-workflow/slides/#open-source-development","title":"Open Source Development","text":""},{"location":"lessons/01-distributed-workflow/slides/#_1","title":"Distributed coding workflow","text":""},{"location":"lessons/01-distributed-workflow/slides/#course-overview-distributed-coding-workflow","title":"Course overview + Distributed coding workflow","text":""},{"location":"lessons/01-distributed-workflow/slides/#versao-20232-igor-montagner-igorsm1insperedubr","title":"Vers\u00e3o 2023/2: Igor Montagner ( igorsm1@insper.edu.br) )","text":""},{"location":"lessons/01-distributed-workflow/slides/#burocracy","title":"Burocracy","text":""},{"location":"lessons/01-distributed-workflow/slides/#meetings","title":"Meetings","text":"
    • MON 07:30 - 09:30
    • WED 07:30 - 09:30
    "},{"location":"lessons/01-distributed-workflow/slides/#office-hours","title":"Office Hours","text":"
    • On demand
    "},{"location":"lessons/01-distributed-workflow/slides/#assessment","title":"Assessment","text":"
    • Project based course with both individual and group work
    "},{"location":"lessons/01-distributed-workflow/slides/#learning-objectives","title":"Learning Objectives","text":"

    By the end of the course, the student will be able to:

    • Analyze an unfamiliar medium/large codebase and modify it to make improvements and fix software issues.
    • Interact with a remote team of developers to deliver code that meets the quality and code style standards of a project.
    • Understand the differences in open-source software licenses and how they impact the distribution and reuse of a codebase.
    "},{"location":"lessons/01-distributed-workflow/slides/#objectives-summary-version","title":"Objectives (summary version)","text":"

    By the end of the course, the student will be able to:

    • Download, understand, and modify the code of a project.
    • Successfully have their modifications accepted by the original project.
    • Understand aspects related to the distribution of software.
      • Licenses
      • Bug Tracker, Version Control, Governance, etc.
      • Documentation / Internationalization
      • User communities
    "},{"location":"lessons/01-distributed-workflow/slides/#course-syllabus","title":"Course Syllabus","text":"
    1. Software development and commercialization models.
    2. Software licenses and their impact on reuse and distribution.
    3. Tools for collaborative software development (open source or proprietary).
    4. Software and code documentation.
    5. Software translation and internationalization.
    6. Source code compilation and distribution systems.
    7. Human and community aspects in software development.
    8. Case studies of successful projects.
    "},{"location":"lessons/01-distributed-workflow/slides/#textbook","title":"Textbook","text":"

    Available online at https://producingoss.com

    "},{"location":"lessons/01-distributed-workflow/slides/#course-materials","title":"Course Materials","text":"

    GitHub: https://github.com/insper/open-dev

    Website: https://insper.github.io/open-dev/

    Blackboard will be used for announcements only. All content will be available on GitHub.

    "},{"location":"lessons/01-distributed-workflow/slides/#justification-for-the-course","title":"Justification for the Course","text":"

    In previous courses, we worked on:

    • Creating a new project.
    • Projects that typically end after the course.
    • Projects that are never used by anyone.
    "},{"location":"lessons/01-distributed-workflow/slides/#_2","title":"Distributed coding workflow","text":"

    In the industry, we usually work on existing projects:

    • Fixing issues.
    • Making improvements.
    • Projects used by multiple users.
    "},{"location":"lessons/01-distributed-workflow/slides/#why-did-i-create-the-course","title":"Why did I create the course?","text":""},{"location":"lessons/01-distributed-workflow/slides/#my-motivation-igor","title":"My motivation (Igor)","text":""},{"location":"lessons/01-distributed-workflow/slides/#my-motivation-igor_1","title":"My motivation (Igor)","text":""},{"location":"lessons/01-distributed-workflow/slides/#my-motivation-igor_2","title":"My motivation (Igor)","text":"
    • I've worked alone for 5 years
    • I've spent countless hours writting
      • a scientific paper about it
      • documentation for users and developers
    "},{"location":"lessons/01-distributed-workflow/slides/#_3","title":"Distributed coding workflow","text":""},{"location":"lessons/01-distributed-workflow/slides/#_4","title":"Distributed coding workflow","text":"
    • I learned a lot by doing this
    • I might have solved a problem no one has!
    "},{"location":"lessons/01-distributed-workflow/slides/#my-motivation-igor_3","title":"My motivation (Igor)","text":""},{"location":"lessons/01-distributed-workflow/slides/#its-not-enough-anymore-to-create-software-for-learning-purposes","title":"It's not enough (anymore) to create software for learning purposes","text":""},{"location":"lessons/01-distributed-workflow/slides/#i-would-like-to-have-some-impact","title":"I would like to have (some) impact","text":"
    • To create/contribute to software other people use
    • To write texts/tutorials that are read by someone
    • To be a part of a community that would miss me if I stop participating
    "},{"location":"lessons/01-distributed-workflow/slides/#why-are-you-here","title":"Why are you here?","text":"

    https://forms.gle/uDvnDoyxBsVoHy6S8

    "},{"location":"lessons/01-distributed-workflow/slides/#achievements-in-this-course-so-far","title":"Achievements in this Course So Far","text":""},{"location":"lessons/01-distributed-workflow/slides/#vitoria-20182","title":"Vit\u00f3ria - 2018/2","text":""},{"location":"lessons/01-distributed-workflow/slides/#spyder","title":"Spyder","text":"
    • Accepted: [1]
    "},{"location":"lessons/01-distributed-workflow/slides/#pandas","title":"Pandas","text":"
    • Accepted: [1]
    "},{"location":"lessons/01-distributed-workflow/slides/#paulo-20182","title":"Paulo - 2018/2","text":""},{"location":"lessons/01-distributed-workflow/slides/#cataclysm-dda","title":"Cataclysm: DDA","text":"
    • Accepted: [1]
    "},{"location":"lessons/01-distributed-workflow/slides/#class-20192","title":"Class - 2019/2","text":""},{"location":"lessons/01-distributed-workflow/slides/#15-students","title":"15 students","text":""},{"location":"lessons/01-distributed-workflow/slides/#19-different-projects-14-accepted-prs","title":"19 different projects, 14 accepted PRs","text":""},{"location":"lessons/01-distributed-workflow/slides/#pandas-6-accepted-contributions","title":"Pandas - 6 accepted contributions","text":""},{"location":"lessons/01-distributed-workflow/slides/#class-20201","title":"Class 2020/1","text":""},{"location":"lessons/01-distributed-workflow/slides/#16-students","title":"16 students","text":""},{"location":"lessons/01-distributed-workflow/slides/#15-different-projects-17-accepted-prs","title":"15 different projects, 17 accepted PRs","text":""},{"location":"lessons/01-distributed-workflow/slides/#pandas-matplotlib-bokeh-pygame","title":"Pandas, Matplotlib, Bokeh, Pygame","text":""},{"location":"lessons/01-distributed-workflow/slides/#course-introduction","title":"Course Introduction","text":""},{"location":"lessons/01-distributed-workflow/slides/#course-introduction_1","title":"Course Introduction","text":"

    Proposal: The course will be gamified.

    • Each student will create an avatar in the course.
    • Activities for submission earn XP.
    • Each activity is represented by a skill with a funny name.
    • All work submissions are done via Pull Request on the course's repository.
    • Significant freedom of choice
    "},{"location":"lessons/01-distributed-workflow/slides/#course-introduction-skills","title":"Course Introduction (Skills)","text":"
    • Tutorial: Guided preparatory activities in the classroom
    • Code: Code contributions to external projects
    • Community: Non-technical contributions that can benefit users and developers of a project, such as documentation and translations
    • Impact: Significant results achieved by the student's participation in open projects
    "},{"location":"lessons/01-distributed-workflow/slides/#full-list-of-skills","title":"Full list of skills","text":""},{"location":"lessons/01-distributed-workflow/slides/#course-introduction-syllabus","title":"Course Introduction (syllabus)","text":"
    • August/September: Tutorial
      • 30-60 minutes of lecture/discussions
      • Activities focused on specific topics
    • October/November: Project
      • Autonomy to define which tasks will be done
      • Semi-free choice of projects
    "},{"location":"lessons/01-distributed-workflow/slides/#course-introduction-assessment","title":"Course Introduction (assessment)","text":"
    • All submissions are individual.
    • Each learning objective is measured by several skills.
      • Some skills are mandatory.
      • Repeating a skill can earn more or fewer points than the first time.
    • Grades are based on the amount of XP obtained.
      • Freedom to decide where to invest time/effort.
    "},{"location":"lessons/01-distributed-workflow/slides/#course-introduction-assessment_1","title":"Course Introduction (assessment)","text":"
    • Final grade is a combination of XP and acquired skills.
    • Bi-weekly reports sent by email.
    • Complete conditions on the rules and skills page.
    "},{"location":"lessons/01-distributed-workflow/slides/#discussion-development-workflow","title":"Discussion: Development Workflow","text":""},{"location":"lessons/01-distributed-workflow/slides/#how-does-git-work","title":"How does Git work?","text":"

    Source: https://www.slideshare.net/abderrahmanebenbachir/continuous-integration-in-github

    Source: https://www.slideshare.net/abderrahmanebenbachir/continuous-integration-in-github

    "},{"location":"lessons/01-distributed-workflow/slides/#activity-first-steps","title":"Activity: First Steps","text":"

    Objective: Submit your first Pull Request to the course's repository.

    "},{"location":"lessons/01-distributed-workflow/slides/#open-source-development_1","title":"Open Source Development","text":""},{"location":"lessons/01-distributed-workflow/slides/#_5","title":"Distributed coding workflow","text":""},{"location":"lessons/01-distributed-workflow/slides/#course-overview-distributed-coding-workflow_1","title":"Course overview + Distributed coding workflow","text":""},{"location":"lessons/01-distributed-workflow/slides/#versao-20232-igor-montagner-igorsm1insperedubr_1","title":"Vers\u00e3o 2023/2: Igor Montagner ( igorsm1@insper.edu.br) )","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/","title":"Distributed coding workflow","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#open-source-development","title":"Open Source Development","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#_1","title":"Distributed coding workflow","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#course-overview-distributed-coding-workflow","title":"Course overview + Distributed coding workflow","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#versao-20242-fabricio-barth-fabriciojbinsperedubr","title":"Vers\u00e3o 2024/2: Fabricio Barth ( fabriciojb@insper.edu.br) )","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#burocracy","title":"Burocracy","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#meetings","title":"Meetings","text":"
    • MON 1:30 PM - 3:30 PM
    • WED 1:30 PM - 3:30 PM
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#office-hours","title":"Office Hours","text":"
    • On demand
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#assessment","title":"Assessment","text":"
    • Project based course with both individual and group work
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#learning-objectives","title":"Learning Objectives","text":"

    By the end of the course, the student will be able to:

    • Analyze an unfamiliar medium/large codebase and modify it to make improvements and fix software issues.
    • Interact with a remote team of developers to deliver code that meets the quality and code style standards of a project.
    • Understand the differences in open-source software licenses and how they impact the distribution and reuse of a codebase.
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#objectives-summary-version","title":"Objectives (summary version)","text":"

    By the end of the course, the student will be able to:

    • Download, understand, and modify the code of a project.
    • Successfully have their modifications accepted by the original project.
    • Understand aspects related to the distribution of software.
      • Licenses
      • Bug Tracker, Version Control, Governance, etc.
      • Documentation / Internationalization
      • User communities
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#course-syllabus","title":"Course Syllabus","text":"
    1. Software development and commercialization models.
    2. Software licenses and their impact on reuse and distribution.
    3. Tools for collaborative software development (open source or proprietary).
    4. Software and code documentation.
    5. Software translation and internationalization.
    6. Source code compilation and distribution systems.
    7. Human and community aspects in software development.
    8. Case studies of successful projects.
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#textbook","title":"Textbook","text":"

    Available online at https://producingoss.com

    "},{"location":"lessons/01-distributed-workflow/slides_fb/#course-materials","title":"Course Materials","text":"

    GitHub: https://github.com/insper/open-dev

    Website: https://insper.github.io/open-dev/

    Blackboard will be used for announcements only. All content will be available on GitHub.

    "},{"location":"lessons/01-distributed-workflow/slides_fb/#justification-for-the-course","title":"Justification for the Course","text":"

    In previous courses, we worked on:

    • Creating a new project.
    • Projects that typically end after the course.
    • Projects that are never used by anyone.
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#_2","title":"Distributed coding workflow","text":"

    In the industry, we usually work on existing projects:

    • Fixing issues.
    • Making improvements.
    • Projects used by multiple users.
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#why-are-you-here","title":"Why are you here?","text":"

    https://forms.gle/oMEiX5JMDEiuN5BS8

    "},{"location":"lessons/01-distributed-workflow/slides_fb/#achievements-in-this-course-so-far","title":"Achievements in this Course So Far","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#vitoria-20182","title":"Vit\u00f3ria - 2018/2","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#spyder","title":"Spyder","text":"
    • Accepted: [1]
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#pandas","title":"Pandas","text":"
    • Accepted: [1]
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#paulo-20182","title":"Paulo - 2018/2","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#cataclysm-dda","title":"Cataclysm: DDA","text":"
    • Accepted: [1]
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#class-20192","title":"Class - 2019/2","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#15-students","title":"15 students","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#19-different-projects-14-accepted-prs","title":"19 different projects, 14 accepted PRs","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#pandas-6-accepted-contributions","title":"Pandas - 6 accepted contributions","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#class-20201","title":"Class 2020/1","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#16-students","title":"16 students","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#15-different-projects-17-accepted-prs","title":"15 different projects, 17 accepted PRs","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#pandas-matplotlib-bokeh-pygame","title":"Pandas, Matplotlib, Bokeh, Pygame","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#course-introduction","title":"Course Introduction","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#course-introduction_1","title":"Course Introduction","text":"

    Proposal: The course will be gamified.

    • Each student will create an avatar in the course.
    • Activities for submission earn XP.
    • Each activity is represented by a skill with a funny name.
    • All work submissions are done via Pull Request on the course's repository.
    • Significant freedom of choice
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#course-introduction-skills","title":"Course Introduction (Skills)","text":"
    • Tutorial: Guided preparatory activities in the classroom
    • Code: Code contributions to external projects
    • Community: Non-technical contributions that can benefit users and developers of a project, such as documentation and translations
    • Impact: Significant results achieved by the student's participation in open projects
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#full-list-of-skills","title":"Full list of skills","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#course-introduction-syllabus","title":"Course Introduction (syllabus)","text":"
    • August/September: Tutorial
      • 30-60 minutes of lecture/discussions
      • Activities focused on specific topics
    • October/November: Project
      • Autonomy to define which tasks will be done
      • Semi-free choice of projects
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#course-introduction-assessment","title":"Course Introduction (assessment)","text":"
    • All submissions are individual.
    • Each learning objective is measured by several skills.
      • Some skills are mandatory.
      • Repeating a skill can earn more or fewer points than the first time.
    • Grades are based on the amount of XP obtained.
      • Freedom to decide where to invest time/effort.
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#course-introduction-assessment_1","title":"Course Introduction (assessment)","text":"
    • Final grade is a combination of XP and acquired skills.
    • Bi-weekly reports sent by email.
    • Complete conditions on the rules and skills page.
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#discussion-development-workflow","title":"Discussion: Development Workflow","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#how-does-git-work","title":"How does Git work?","text":"

    Source: https://www.slideshare.net/abderrahmanebenbachir/continuous-integration-in-github

    Source: https://www.slideshare.net/abderrahmanebenbachir/continuous-integration-in-github

    "},{"location":"lessons/01-distributed-workflow/slides_fb/#activity-first-steps","title":"Activity: First Steps","text":"

    Objective: Submit your first Pull Request to the course's repository.

    "},{"location":"lessons/01-distributed-workflow/slides_fb/#open-source-development_1","title":"Open Source Development","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#_3","title":"Distributed coding workflow","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#course-overview-distributed-coding-workflow_1","title":"Course overview + Distributed coding workflow","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#versao-20242-fabricio-barth-fabriciojbinsperedubr_1","title":"Vers\u00e3o 2024/2: Fabricio Barth ( fabriciojb@insper.edu.br) )","text":""},{"location":"lessons/02-software-and-communities/","title":"02 - Software and Communities","text":"

    The activity for this class involves creating a presentation explaining how the communities around the following software projects are organized:

    1. Visual Studio Code
    2. NeoVIM
    3. Django
    4. Blender
    5. Kdenlive
    6. NewPipe
    7. Pandas
    8. Sklearn
    9. Keras
    10. Flask
    11. Elasticsearch
    12. OpenCV
    13. TensorFlow
    14. Kodi
    15. PostgreSQL

    Each group of 3 students should choose one of the above projects and research the following points.

    1. What is the purpose of the project?
    2. Where is the source code located? Which technologies are used?
    3. What is the license? Are there public guidelines or any kind of bureaucracy for contributions?
    4. Is there developer documentation?
      • Does it seem easy to compile/run?
      • Does it seem easy to modify?
    5. How is the project governed?
      • Who are the key figures (developers, evangelists, etc.) in the project? If the project is large, mention two different areas in this item.
      • Is there a public roadmap?
      • Are external contributions accepted? How can one contribute?
      • Who makes the decisions?
    6. Where can project members be found? Where can one seek help?
    7. Does the project raise funds?
      • Are there companies sponsoring developers?
      • How much has been raised? And spent? For what purposes?
      • Who decides how the funds are spent?

    Each group must create a 10 minutes presentation for the next meeting that addresses these questions.

    TODO: Create an issue on the subject repository with the title Presentation: <project name>. The issue description should contain the names of the group members.

    "},{"location":"lessons/02-software-and-communities/slides/","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides/#open-source-development","title":"Open Source Development","text":""},{"location":"lessons/02-software-and-communities/slides/#_1","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides/#software-and-communities","title":"Software and Communities","text":""},{"location":"lessons/02-software-and-communities/slides/#20232-igor-montagner-igorsm1insperedubr","title":"2023/2: Igor Montagner ( igorsm1@insper.edu.br) )","text":""},{"location":"lessons/02-software-and-communities/slides/#github-model-fork-pull-request","title":"Github Model: fork + pull request","text":"

    Source: https://www.slideshare.net/abderrahmanebenbachir/continuous-integration-in-github

    "},{"location":"lessons/02-software-and-communities/slides/#github-model-fork-pull-request_1","title":"Github Model: fork + pull request","text":"

    Source: https://www.slideshare.net/abderrahmanebenbachir/continuous-integration-in-github

    "},{"location":"lessons/02-software-and-communities/slides/#workflow-other-models","title":"Workflow: other models","text":"
    1. Send patch via email list (e.g., Linux)
    2. Code review tools (e.g., KDE - Phabricator)
    3. Patch is attached to the Bug Tracker (e.g., Haiku, KDE)
    4. Does not receive external contributions
    "},{"location":"lessons/02-software-and-communities/slides/#review-of-last-classs-prs","title":"Review of last class's PRs","text":""},{"location":"lessons/02-software-and-communities/slides/#common-errors","title":"Common Errors","text":""},{"location":"lessons/02-software-and-communities/slides/#error-0-login-achievements-file-has-errors","title":"Error 0: login-achievements file has errors","text":"

    How to fix: Create a new commit with the correct date.

    "},{"location":"lessons/02-software-and-communities/slides/#error-1-extra-files-in-the-pr","title":"Error 1: Extra files in the PR","text":"

    Error: Modifying files not related to your proposed changes.

    "},{"location":"lessons/02-software-and-communities/slides/#_2","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":"

    Ideal:

    1. A Pull Request should contain only the files related to the proposed modification.
    2. Each proposed modification is in a separate Pull Request.

    "},{"location":"lessons/02-software-and-communities/slides/#error-1-extra-files-in-the-pr_1","title":"Error 1: Extra files in the PR","text":"

    How to fix: git revert creates a commit that undoes previous changes.

    Extra options:

    • --no-commit: Only adds the modifications, but does not make the commit. Allows undoing part of a commit.

    Source: https://www.atlassian.com/git/tutorials/

    "},{"location":"lessons/02-software-and-communities/slides/#error-2-non-descriptive-commit-messages","title":"Error 2: Non-descriptive commit messages","text":"

    How to fix: git commit --amend allows modifying the last commit made.

    "},{"location":"lessons/02-software-and-communities/slides/#error-3-pull-request-with-a-poor-description","title":"Error 3: Pull Request with a poor description","text":"

    How to fix: Simply edit it in the Github interface.

    "},{"location":"lessons/02-software-and-communities/slides/#fix-at-home-and-request-review-via-github","title":"Fix at home and request review via Github","text":""},{"location":"lessons/02-software-and-communities/slides/#reminder-if-you-dont-push-nothing-is-broken","title":"Reminder: If you don't push, nothing is broken","text":""},{"location":"lessons/02-software-and-communities/slides/#reminder-ii-git-log-shows-your-current-history","title":"Reminder II: git log shows your current history","text":""},{"location":"lessons/02-software-and-communities/slides/#tip-if-you-modified-already-published-commits-use-git-push-f-to-overwrite","title":"Tip: If you modified already published commits, use git push -f to overwrite","text":""},{"location":"lessons/02-software-and-communities/slides/#not-all-students-enrolled-in-the-course-did-the-activity-from-the-last-class","title":"Not all students enrolled in the course did the activity from the last class!","text":"
    python dev-aberto.py list-users\n
    "},{"location":"lessons/02-software-and-communities/slides/#software-communities","title":"Software Communities","text":""},{"location":"lessons/02-software-and-communities/slides/#discussion","title":"Discussion","text":""},{"location":"lessons/02-software-and-communities/slides/#_3","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":"

    Question 1: What are the software you use the most in your daily life?

    "},{"location":"lessons/02-software-and-communities/slides/#_4","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides/#_5","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides/#_6","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":"

    Question 2: Who is the main developer of the project?

    "},{"location":"lessons/02-software-and-communities/slides/#example-linux-kernel","title":"Example: Linux Kernel","text":"

    Foundation supports the development of the Linux Kernel and the creation of an open-source software ecosystem around it.

    Support:

    • Financial
    • Intellectual property
    • Infrastructure
    • Services and training
    "},{"location":"lessons/02-software-and-communities/slides/#example-linux-kernel_1","title":"Example: Linux Kernel","text":"

    Companies that sponsor development:

    1. Individual (11.95%)
    2. Intel (10.01%)
    3. Red Hat (8.90%)
    4. Unknown (4.09%)
    5. IBM (3.79%)
    6. SUSE (3.49%)
    7. Linaro (2.96%)
    8. Consultants (2.96%)
    9. Google (2.79%)
    10. Samsung (2.28%)

    Source: \"2020 Linux Kernel Development Report\"

    "},{"location":"lessons/02-software-and-communities/slides/#example-ubuntu","title":"Example: Ubuntu","text":""},{"location":"lessons/02-software-and-communities/slides/#_7","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides/#_8","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides/#_9","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides/#_10","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":"

    Private company controls the development of Ubuntu. Obtains resources via:

    • Donations
    • Development and consulting services
    • Training
    "},{"location":"lessons/02-software-and-communities/slides/#example-gitlab","title":"Example: Gitlab","text":""},{"location":"lessons/02-software-and-communities/slides/#_11","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides/#_12","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides/#_13","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides/#_14","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":"

    Company funded so far by VC (Venture Capital) in search of profit.

    • Option of free plans with open-source software
    • Option of corporate plans with more features and support
    • On-premises installations
    "},{"location":"lessons/02-software-and-communities/slides/#example-elementary","title":"Example: Elementary","text":""},{"location":"lessons/02-software-and-communities/slides/#_15","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides/#_16","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":"

    Linux distribution led by a \"tiny\" company focused on the user experience. Resources are obtained through:

    • Individual and corporate sponsorships
    • Pay-what-you-want model (app store and operating system)
    • Hardware with the pre-installed system

    "},{"location":"lessons/02-software-and-communities/slides/#example-linux-mint","title":"Example: Linux Mint","text":""},{"location":"lessons/02-software-and-communities/slides/#_17","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":"

    Linux distribution aimed at everything working right after installation. Considered good for beginners.

    "},{"location":"lessons/02-software-and-communities/slides/#other-sources","title":"Other sources","text":"

    Various other ways of getting support and funding

    "},{"location":"lessons/02-software-and-communities/slides/#reasons-for-funding-company","title":"Reasons for funding (company)","text":""},{"location":"lessons/02-software-and-communities/slides/#_18","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":"
    • \"Acquire\" experts in a technology
    • Sell support or consulting services
    • Marketing
    • Software license \"obliges\"
    "},{"location":"lessons/02-software-and-communities/slides/#_19","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides/#_20","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":"

    Not everything funded ends up in a \"usable\" format for others (e.g., Android/Linux, TiVO)

    \"Tivoization is the practice of designing hardware that incorporates software under the terms of a copyleft software license like the GNU General Public License (GNU GPL), but uses hardware restrictions or digital rights management (DRM) to prevent users from running modified versions of the software on that hardware\" [Wikipedia]

    "},{"location":"lessons/02-software-and-communities/slides/#reasons-for-contributing-individual","title":"Reasons for contributing (individual)","text":"
    • Professional
      • Reputation / CV
      • Business needs
    • Personal
      • Altruism / Ideology
      • Sense of personal fulfillment
      • Exercise creativity
      • Solve a problem of personal interest
    "},{"location":"lessons/02-software-and-communities/slides/#activity-exploring-the-environment-of-a-project","title":"Activity: Exploring the environment of a project","text":"
    • Research how the communities of some projects are organized
    • Produce a presentation summarizing your findings
    "},{"location":"lessons/02-software-and-communities/slides/#open-source-development_1","title":"Open Source Development","text":""},{"location":"lessons/02-software-and-communities/slides/#_21","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides/#software-and-communities_1","title":"Software and Communities","text":""},{"location":"lessons/02-software-and-communities/slides_fb/","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#open-source-development","title":"Open Source Development","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#_1","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#software-and-communities","title":"Software and Communities","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#20242-fabricio-barth-fabriciojbinsperedubr","title":"2024/2: Fabricio Barth ( fabriciojb@insper.edu.br) )","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#github-model-fork-pull-request","title":"Github Model: fork + pull request","text":"

    Source: https://www.slideshare.net/abderrahmanebenbachir/continuous-integration-in-github

    "},{"location":"lessons/02-software-and-communities/slides_fb/#github-model-fork-pull-request_1","title":"Github Model: fork + pull request","text":"

    Source: https://www.slideshare.net/abderrahmanebenbachir/continuous-integration-in-github

    "},{"location":"lessons/02-software-and-communities/slides_fb/#workflow-other-models","title":"Workflow: other models","text":"
    1. Send patch via email list (e.g., Linux)
    1. Patch is attached to the Bug Tracker (e.g., Haiku, KDE)
    2. Does not receive external contributions
    "},{"location":"lessons/02-software-and-communities/slides_fb/#review-of-last-classs-prs","title":"Review of last class's PRs","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#common-errors","title":"Common Errors","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#error-0-login-achievements-file-has-errors","title":"Error 0: login-achievements file has errors","text":"

    Error: The date of the commit is incorrect, for example. Then, when we run the command python dev-aberto.py compute-grade <user> the result is not as expected.

    How to fix: Create a new commit with the correct content.

    "},{"location":"lessons/02-software-and-communities/slides_fb/#error-1-extra-files-in-the-pr","title":"Error 1: Extra files in the PR","text":"

    Error: Modifying files not related to your proposed changes.

    "},{"location":"lessons/02-software-and-communities/slides_fb/#_2","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":"

    Ideal:

    1. A Pull Request should contain only the files related to the proposed modification.
    2. Each proposed modification is in a separate Pull Request.

    "},{"location":"lessons/02-software-and-communities/slides_fb/#error-1-extra-files-in-the-pr_1","title":"Error 1: Extra files in the PR","text":"

    How to fix: git rm --cached <file> removes the file from the repository, but keeps it in the working directory.

    How to fix: git revert <commit_id> creates a commit that undoes the changes made by commit_id.

    Extra options:

    • --no-commit: Only adds the modifications, but does not make the commit. Allows undoing part of a commit.

    Source: https://www.atlassian.com/git/tutorials/

    "},{"location":"lessons/02-software-and-communities/slides_fb/#error-2-non-descriptive-commit-messages","title":"Error 2: Non-descriptive commit messages","text":"

    How to fix: git commit --amend allows modifying the last commit made.

    "},{"location":"lessons/02-software-and-communities/slides_fb/#error-3-pull-request-with-a-poor-description","title":"Error 3: Pull Request with a poor description","text":"

    How to fix: Simply edit it in the Github interface.

    "},{"location":"lessons/02-software-and-communities/slides_fb/#not-all-students-enrolled-in-the-course-did-the-activity-from-the-last-class","title":"Not all students enrolled in the course did the activity from the last class!","text":"
    python dev-aberto.py list-users\n

    Please, do it as soon as possible!

    "},{"location":"lessons/02-software-and-communities/slides_fb/#software-communities","title":"Software Communities","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#discussion","title":"Discussion","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#_3","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#_4","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":"

    Question 1: What are the software you use the most in your daily life?

    Question 2: Who is the main developer of the project?

    Question 3: How do you think the project is funded?

    "},{"location":"lessons/02-software-and-communities/slides_fb/#example-linux-kernel","title":"Example: Linux Kernel","text":"

    Foundation supports the development of the Linux Kernel and the creation of an open-source software ecosystem around it.

    Support:

    • Financial
    • Intellectual property
    • Infrastructure
    • Services and training
    "},{"location":"lessons/02-software-and-communities/slides_fb/#example-linux-kernel_1","title":"Example: Linux Kernel","text":"

    Companies that sponsor development:

    1. Individual (11.95%)
    2. Intel (10.01%)
    3. Red Hat (8.90%)
    4. Unknown (4.09%)
    5. IBM (3.79%)
    6. SUSE (3.49%)
    7. Linaro (2.96%)
    8. Consultants (2.96%)
    9. Google (2.79%)
    10. Samsung (2.28%)

    Source: \"2020 Linux Kernel Development Report\"

    "},{"location":"lessons/02-software-and-communities/slides_fb/#example-ubuntu","title":"Example: Ubuntu","text":"

    Private company controls the development of Ubuntu. Obtains resources via:

    • Donations
    • Development and consulting services
    • Training
    "},{"location":"lessons/02-software-and-communities/slides_fb/#example-gitlab","title":"Example: Gitlab","text":"

    Company funded so far by VC (Venture Capital) in search of profit.

    • Option of free plans with open-source software
    • Option of corporate plans with more features and support
    • On-premises installations
    "},{"location":"lessons/02-software-and-communities/slides_fb/#example-elementary","title":"Example: Elementary","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#_5","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#_6","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":"

    Linux distribution led by a \"tiny\" company focused on the user experience. Resources are obtained through:

    • Individual and corporate sponsorships
    • Pay-what-you-want model (app store and operating system)
    • Hardware with the pre-installed system

    "},{"location":"lessons/02-software-and-communities/slides_fb/#reasons-for-funding-company","title":"Reasons for funding (company)","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#_7","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":"
    • \"Acquire\" experts in a technology
    • Sell support or consulting services
    • Marketing
    "},{"location":"lessons/02-software-and-communities/slides_fb/#reasons-for-contributing-individual","title":"Reasons for contributing (individual)","text":"
    • Professional
      • Reputation / CV
      • Business needs
    • Personal
      • Altruism / Ideology
      • Sense of personal fulfillment
      • Exercise creativity
      • Solve a problem of personal interest
    "},{"location":"lessons/02-software-and-communities/slides_fb/#activity-exploring-the-environment-of-a-project","title":"Activity: Exploring the environment of a project","text":"
    • Research how the communities of some projects are organized
    • Produce a presentation summarizing your findings
    "},{"location":"lessons/02-software-and-communities/slides_fb/#open-source-development_1","title":"Open Source Development","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#_8","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#software-and-communities_1","title":"Software and Communities","text":""},{"location":"lessons/02-xpresentations-communities/","title":"02 - Software and Communities: presentations","text":""},{"location":"lessons/02-xpresentations-communities/#sechedule","title":"Sechedule","text":"

    Below is the order in which the presentations about software communities will be conducted:

    Wednesday (08/21):

    • VS code
    • NeoVim
    • Django
    • Flask
    • Sklearn

    Monday (08/26):

    • TensorFlow
    • OpenCV
    • Blender
    • PostgreSQL
    • Pandas

    Each group will have 10 minutes for the presentation and 5 minutes for questions.

    "},{"location":"lessons/02-xpresentations-communities/#pull-request","title":"Pull Request","text":"

    In order to publish your material, only one member of the group must create a PR where:

    • Add your presentation in the folder docs/delivery/
    • Edit the achievements file using the command python dev-aberto.py edit-achievements user.

    You must add a new skill to the file with this format:

    {\n    \"skill_id\": 2, \n    \"metadata\": {\n        \"date\": \"2024-08-20\", \n        \"filename\": \"your file name\", \n        \"group\":[\"user1\",\"user2\",\"users3\"]\n        }\n}\n

    where [\"user1\",\"user2\",\"users3\"] is the list of the users that are part of the group.

    "},{"location":"lessons/03-software-documentation/","title":"03 - Explorando um projeto desconhecido","text":"

    Este roteiro tem algumas perguntas com o objetivo de guiar a explora\u00e7\u00e3o do c\u00f3digo e documentar suas descobertas. Voc\u00ea tamb\u00e9m pode aplic\u00e1-lo para qualquer outro projeto mal documentado em que precisar trabalhar no futuro.

    Baixe o c\u00f3digo do projeto a ser analisado aqui e siga as perguntas. Elas s\u00e3o um guia de como explorar um projeto que voc\u00eas n\u00e3o conhecem.

    "},{"location":"lessons/03-software-documentation/#dependencias-e-servicos-usados","title":"Depend\u00eancias e servi\u00e7os usados","text":"

    Question

    Quais tecnologias s\u00e3o usadas no c\u00f3digo? Al\u00e9m da linguagem de programa\u00e7\u00e3o, liste tamb\u00e9m as bibliotecas/m\u00f3dulos externos usados.

    Question

    A aplica\u00e7\u00e3o utiliza um banco de dados. Qual gerenciador? Onde a aplica\u00e7\u00e3o busca a base de dados? Quais s\u00e3o as tabelas usadas? Como elas s\u00e3o criadas?

    "},{"location":"lessons/03-software-documentation/#deploy-inicial","title":"Deploy inicial","text":"

    Question

    A aplica\u00e7\u00e3o usa autentica\u00e7\u00e3o? Se sim, qual tipo? Como usu\u00e1rios s\u00e3o criados? Existe algum usu\u00e1rio administrador? Como \u00e9 feita a seguran\u00e7a das senhas? Qual a senha padr\u00e3o?

    Question

    Quais comandos voc\u00ea usou para rodar a aplica\u00e7\u00e3o? Escreva todos desde a cria\u00e7\u00e3o do banco de dados e dos usu\u00e1rios at\u00e9 o funcionamento completo do projeto.

    Question

    Agora que voc\u00ea consegue rodar a aplica\u00e7\u00e3o, explore-a um pouco e descreva em poucas frases para qu\u00ea ela serve.

    "},{"location":"lessons/03-software-documentation/#documentacao-do-projeto","title":"Documenta\u00e7\u00e3o do projeto","text":"

    Question

    Se voc\u00ea fosse criar um guia de usu\u00e1rio (aluno) para esta aplica\u00e7\u00e3o, quais tarefas descreveria?

    Question

    Se voc\u00ea fosse criar um guia de usu\u00e1rio (professor) para esta aplica\u00e7\u00e3o, quais tarefas descreveria?

    Question

    O qu\u00ea voc\u00ea descreveria em um guia de desenvolvedor para esta aplica\u00e7\u00e3o?

    "},{"location":"lessons/03-software-documentation/slides/","title":"Documenta\u00e7\u00e3o de Software","text":""},{"location":"lessons/03-software-documentation/slides/#desenvolvimento-aberto","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/03-software-documentation/slides/#_1","title":"Documenta\u00e7\u00e3o de Software","text":""},{"location":"lessons/03-software-documentation/slides/#fluxo-de-trabalho-distribuido-e-comunidades-de-software","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/03-software-documentation/slides/#versao-20232-igor-montagner-igorsm1insperedubr","title":"Vers\u00e3o 2023/2 - Igor Montagner (igorsm1@insper.edu.br)","text":""},{"location":"lessons/03-software-documentation/slides/#ordem-das-apresentacoes","title":"Ordem das apresenta\u00e7\u00f5es","text":"
    1. VSCode
    2. Blender
    3. KDENlive
    4. NeoVim
    "},{"location":"lessons/03-software-documentation/slides/#10-minutos-cada-uma","title":"10 minutos cada uma","text":""},{"location":"lessons/03-software-documentation/slides/#atividade-explorando-o-entorno-de-um-projeto","title":"Atividade: Explorando o entorno de um projeto","text":"
    \"metadata\": {\n    \"filename\": \"nome do arquivo\",\n    \"group\": [\"login1\", \"login2\"]\n}\n
    • No group incluir os outros membros do grupo somente

    • Um membro da equipe deve fazer um PR para o projeto incluindo o arquivo da apresenta\u00e7\u00e3o. O mesmo deve ser colocado na pasta apresentacoes/2023

    "},{"location":"lessons/03-software-documentation/slides/#desenvolvimento-aberto_1","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/03-software-documentation/slides/#documentacao-de-software","title":"Documenta\u00e7\u00e3o de software","text":""},{"location":"lessons/03-software-documentation/slides/#versao-20232-igor-montagner-igorsm1insperedubr_1","title":"Vers\u00e3o 2023/2 - Igor Montagner (igorsm1@insper.edu.br)","text":""},{"location":"lessons/03-software-documentation/slides/#desenvolvimento-aberto_2","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/03-software-documentation/slides/#a-ausencia-de-documentacao-de-software","title":"(A aus\u00eancia de d)ocumenta\u00e7\u00e3o de software","text":""},{"location":"lessons/03-software-documentation/slides/#versao-20232-igor-montagner-igorsm1insperedubr_2","title":"Vers\u00e3o 2023/2 - Igor Montagner (igorsm1@insper.edu.br)","text":""},{"location":"lessons/03-software-documentation/slides/#documentacao-de-software_1","title":"Documenta\u00e7\u00e3o de software","text":"

    Documenta\u00e7\u00e3o de usu\u00e1rio:

    "},{"location":"lessons/03-software-documentation/slides/#_2","title":"Documenta\u00e7\u00e3o de Software","text":""},{"location":"lessons/03-software-documentation/slides/#_3","title":"Documenta\u00e7\u00e3o de Software","text":""},{"location":"lessons/03-software-documentation/slides/#_4","title":"Documenta\u00e7\u00e3o de Software","text":"

    Documenta\u00e7\u00e3o de desenvolvimento:

    "},{"location":"lessons/03-software-documentation/slides/#_5","title":"Documenta\u00e7\u00e3o de Software","text":""},{"location":"lessons/03-software-documentation/slides/#_6","title":"Documenta\u00e7\u00e3o de Software","text":""},{"location":"lessons/03-software-documentation/slides/#_7","title":"Documenta\u00e7\u00e3o de Software","text":""},{"location":"lessons/03-software-documentation/slides/#documentacao-de-software_2","title":"Documenta\u00e7\u00e3o de software","text":"

    Documenta\u00e7\u00e3o de usu\u00e1rio:

    • Instala\u00e7\u00e3o
    • Funcionalidades
    • Onde obter ajuda
    "},{"location":"lessons/03-software-documentation/slides/#documentacao-de-software_3","title":"Documenta\u00e7\u00e3o de software","text":"

    Documenta\u00e7\u00e3o de desenvolvimento:

    • Como compilar (depend\u00eancias, ferramentas usadas, etc)
    • Como testar (depend\u00eancias, ferramentas usadas, etc)
    • Estilo de c\u00f3digo e outras orienta\u00e7\u00f5es relacionadas
    • Organiza\u00e7\u00e3o do c\u00f3digo e arquitetura da aplica\u00e7\u00e3o
    "},{"location":"lessons/03-software-documentation/slides/#documentacao-de-software_4","title":"Documenta\u00e7\u00e3o de software","text":"

    \u00c0s vezes as coisas se confundem! O que voc\u00eas colocariam na documenta\u00e7\u00e3o de usu\u00e1rio do Python?

    E na de desenvolvedor?

    "},{"location":"lessons/03-software-documentation/slides/#exemplo-spyder","title":"Exemplo: Spyder","text":"

    https://www.spyder-ide.org/

    "},{"location":"lessons/03-software-documentation/slides/#exemplo-spyder_1","title":"Exemplo: Spyder","text":"

    https://github.com/spyder-ide/spyder/wiki

    "},{"location":"lessons/03-software-documentation/slides/#sistemas-de-documentacao","title":"Sistemas de documenta\u00e7\u00e3o","text":"

    Sphinx

    "},{"location":"lessons/03-software-documentation/slides/#sistemas-de-documentacao_1","title":"Sistemas de documenta\u00e7\u00e3o","text":"

    Mkdocs

    "},{"location":"lessons/03-software-documentation/slides/#sistemas-de-documentacao-hospedagem","title":"Sistemas de documenta\u00e7\u00e3o (hospedagem)","text":"

    https://readthedocs.org/

    "},{"location":"lessons/03-software-documentation/slides/#atividade","title":"Atividade","text":"

    Voc\u00eas receber\u00e3o um zip com o c\u00f3digo de um software e zero instru\u00e7\u00f5es. Voc\u00eas dever\u00e3o:

    1. Aprender como rodar o software
    2. Documentar os passos que voc\u00eas seguiram para faz\u00ea-lo
    3. Fazer uma an\u00e1lise cr\u00edtica do projeto com rela\u00e7\u00e3o a
      • Arquitetura
      • Qualidade do c\u00f3digo
      • Seguran\u00e7a da solu\u00e7\u00e3o
    "},{"location":"lessons/03-software-documentation/slides/#objetivos-desta-atividade","title":"Objetivos desta atividade","text":"
    1. Entender na pr\u00e1tica a necessidade de documenta\u00e7\u00e3o;
    2. Identificar quais s\u00e3o as depend\u00eancias de um software. Isto inclui bibliotecas/frameworks usados e servi\u00e7os aos quais esse software se conecta.
    3. Rodar sua pr\u00f3pria vers\u00e3o de um software de terceiros
    "},{"location":"lessons/03-software-documentation/slides/#nao-sao-objetivos-desta-atividade","title":"N\u00e3o s\u00e3o objetivos desta atividade","text":"
    1. Mostrar nenhum tipo de boa pr\u00e1tica de programa\u00e7\u00e3o
    2. Modificar o software analisado
    3. Criticar o desenvolvedor que trabalhou antes no projeto
    "},{"location":"lessons/03-software-documentation/slides/#atividade-pratica-projeto-nao-documentado","title":"Atividade pr\u00e1tica: Projeto n\u00e3o documentado","text":"

    Objetivo: entender como rodar um c\u00f3digo sem instru\u00e7\u00f5es.

    Valida\u00e7\u00e3o: apresenta\u00e7\u00e3o do sistema funcionando.

    Grupos de at\u00e9 3 pessoas

    "},{"location":"lessons/03-software-documentation/slides/#tempo-restante-de-hoje-hora-inicial-da-proxima-aula-usem-handout-como-guia","title":"Tempo restante de hoje + hora inicial da pr\u00f3xima aula. Usem handout como guia","text":""},{"location":"lessons/03-software-documentation/slides/#desenvolvimento-aberto_3","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/03-software-documentation/slides/#documentacao-de-software_5","title":"Documenta\u00e7\u00e3o de software","text":""},{"location":"lessons/03-software-documentation/slides/#versao-20232-igor-montagner-igorsm1insperedubr_3","title":"Vers\u00e3o 2023/2 - Igor Montagner (igorsm1@insper.edu.br)","text":""},{"location":"lessons/03-software-documentation/slides_fb/","title":"Documenta\u00e7\u00e3o de Software","text":""},{"location":"lessons/03-software-documentation/slides_fb/#desenvolvimento-aberto","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/03-software-documentation/slides_fb/#documentacao-de-software","title":"Documenta\u00e7\u00e3o de software","text":""},{"location":"lessons/03-software-documentation/slides_fb/#versao-20242-fabricio-barth-fabriciojbinsperedubr","title":"Vers\u00e3o 2024/2 - Fabricio Barth (fabriciojb@insper.edu.br)","text":""},{"location":"lessons/03-software-documentation/slides_fb/#documentacao-de-software_1","title":"Documenta\u00e7\u00e3o de software","text":"

    Documenta\u00e7\u00e3o de usu\u00e1rio:

    "},{"location":"lessons/03-software-documentation/slides_fb/#_1","title":"Documenta\u00e7\u00e3o de Software","text":""},{"location":"lessons/03-software-documentation/slides_fb/#_2","title":"Documenta\u00e7\u00e3o de Software","text":""},{"location":"lessons/03-software-documentation/slides_fb/#_3","title":"Documenta\u00e7\u00e3o de Software","text":"

    Documenta\u00e7\u00e3o de desenvolvimento:

    "},{"location":"lessons/03-software-documentation/slides_fb/#_4","title":"Documenta\u00e7\u00e3o de Software","text":""},{"location":"lessons/03-software-documentation/slides_fb/#_5","title":"Documenta\u00e7\u00e3o de Software","text":""},{"location":"lessons/03-software-documentation/slides_fb/#_6","title":"Documenta\u00e7\u00e3o de Software","text":""},{"location":"lessons/03-software-documentation/slides_fb/#documentacao-de-software_2","title":"Documenta\u00e7\u00e3o de software","text":"

    Documenta\u00e7\u00e3o de usu\u00e1rio:

    • Instala\u00e7\u00e3o
    • Funcionalidades
    • Onde obter ajuda
    "},{"location":"lessons/03-software-documentation/slides_fb/#documentacao-de-software_3","title":"Documenta\u00e7\u00e3o de software","text":"

    Documenta\u00e7\u00e3o de desenvolvimento:

    • Como compilar (depend\u00eancias, ferramentas usadas, etc)
    • Como testar (depend\u00eancias, ferramentas usadas, etc)
    • Estilo de c\u00f3digo e outras orienta\u00e7\u00f5es relacionadas
    • Organiza\u00e7\u00e3o do c\u00f3digo e arquitetura da aplica\u00e7\u00e3o
    "},{"location":"lessons/03-software-documentation/slides_fb/#documentacao-de-software_4","title":"Documenta\u00e7\u00e3o de software","text":"

    \u00c0s vezes as coisas se confundem! O que voc\u00eas colocariam na documenta\u00e7\u00e3o de usu\u00e1rio do Python?

    E na de desenvolvedor?

    "},{"location":"lessons/03-software-documentation/slides_fb/#exemplo-spyder","title":"Exemplo: Spyder","text":"

    https://www.spyder-ide.org/

    "},{"location":"lessons/03-software-documentation/slides_fb/#exemplo-spyder_1","title":"Exemplo: Spyder","text":"

    https://github.com/spyder-ide/spyder/wiki

    "},{"location":"lessons/03-software-documentation/slides_fb/#sistemas-de-documentacao","title":"Sistemas de documenta\u00e7\u00e3o","text":"

    Sphinx

    "},{"location":"lessons/03-software-documentation/slides_fb/#sistemas-de-documentacao_1","title":"Sistemas de documenta\u00e7\u00e3o","text":"

    Mkdocs

    "},{"location":"lessons/03-software-documentation/slides_fb/#sistemas-de-documentacao-hospedagem","title":"Sistemas de documenta\u00e7\u00e3o (hospedagem)","text":"

    https://readthedocs.org/

    "},{"location":"lessons/03-software-documentation/slides_fb/#atividade","title":"Atividade","text":"

    Voc\u00eas receber\u00e3o um zip com o c\u00f3digo de um software e zero instru\u00e7\u00f5es. Voc\u00eas dever\u00e3o:

    1. Aprender como rodar o software
    2. Documentar os passos que voc\u00eas seguiram para faz\u00ea-lo
    3. Fazer uma an\u00e1lise cr\u00edtica do projeto com rela\u00e7\u00e3o a
      • Arquitetura
      • Qualidade do c\u00f3digo
      • Seguran\u00e7a da solu\u00e7\u00e3o
    "},{"location":"lessons/03-software-documentation/slides_fb/#objetivos-desta-atividade","title":"Objetivos desta atividade","text":"
    1. Entender na pr\u00e1tica a necessidade de documenta\u00e7\u00e3o;
    2. Identificar quais s\u00e3o as depend\u00eancias de um software. Isto inclui bibliotecas/frameworks usados e servi\u00e7os aos quais esse software se conecta.
    3. Rodar sua pr\u00f3pria vers\u00e3o de um software de terceiros
    "},{"location":"lessons/03-software-documentation/slides_fb/#nao-sao-objetivos-desta-atividade","title":"N\u00e3o s\u00e3o objetivos desta atividade","text":"
    1. Mostrar nenhum tipo de boa pr\u00e1tica de programa\u00e7\u00e3o
    2. Modificar o software analisado
    3. Criticar o desenvolvedor que trabalhou antes no projeto
    "},{"location":"lessons/03-software-documentation/slides_fb/#atividade-pratica-projeto-nao-documentado","title":"Atividade pr\u00e1tica: Projeto n\u00e3o documentado","text":"

    Objetivo: entender como rodar um c\u00f3digo sem instru\u00e7\u00f5es.

    Valida\u00e7\u00e3o: apresenta\u00e7\u00e3o do sistema funcionando.

    Grupos de at\u00e9 3 pessoas

    "},{"location":"lessons/03-software-documentation/slides_fb/#tempo-restante-de-hoje","title":"Tempo restante de hoje","text":""},{"location":"lessons/03-software-documentation/slides_fb/#desenvolvimento-aberto_1","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/03-software-documentation/slides_fb/#documentacao-de-software_5","title":"Documenta\u00e7\u00e3o de software","text":""},{"location":"lessons/03-software-documentation/slides_fb/#versao-20242-fabricio-barth-fabriciojbinsperedubr_1","title":"Vers\u00e3o 2024/2 - Fabr\u00edcio Barth (fabriciojb@insper.edu.br)","text":""},{"location":"lessons/04-professional-project/","title":"04 - Professional Project","text":"

    There is a moment in a project's history where it is already useful for the author and other people are starting to get interested in it. Software documentation, clear install instructions and being free of errors are important to these people but are not necessarily essential to the authors, who are used to fix problem when they appear and are familiar with every aspect of the code. We will transform a project like this into a project that is ready to be used by other people and that can receive contributions from other developers.

    {\"skill_id\": 4, \"metadata\": {\"date\": \"2022-09-01\", \"url\": \"http...\", \"group\": []}\n

    Done

    Form a pair and select a project that one of you worked on during your degree. We will transform it into a complete project that other people can use and contribute to.

    "},{"location":"lessons/04-professional-project/#deliverables","title":"Deliverables","text":"

    This is a project for more than one meeting and can be done in pairs.

    "},{"location":"lessons/04-professional-project/#software-documentation","title":"Software documentation","text":"
    • Create a website for the project, including screenshots and animations about its usage
    • Create a wiki with instructions for developers
      • build instructions
      • code organization
      • technologies used

    Tip

    Use mkdocs or other static site generator tools to create the website. Jekyll is also a popular choice.

    "},{"location":"lessons/04-professional-project/#project-quality","title":"Project quality","text":"
    • Create README with project description, screenshot and links to documentation
    • Organize repo with source code in a src folder and documentation in docs
    • Execute a linter in your project and export its output to one or more issues with names related to code quality improvements
    • Execute pydoc, or any other similar tool, in your project and add the output to the project documentation.
    "},{"location":"lessons/04-professional-project/slides/","title":"Documenta\u00e7\u00e3o de API e linters","text":""},{"location":"lessons/04-professional-project/slides/#desenvolvimento-aberto","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/04-professional-project/slides/#documentacao-de-api-e-linters","title":"Documenta\u00e7\u00e3o de API e linters","text":""},{"location":"lessons/04-professional-project/slides/#igor-dos-santos-montagner-igorsm1insperedubr","title":"Igor dos Santos Montagner ( igorsm1@insper.edu.br )","text":""},{"location":"lessons/04-professional-project/slides/#discussao-o-que-faz-o-projeto","title":"Discuss\u00e3o: o que faz o projeto?","text":""},{"location":"lessons/04-professional-project/slides/#servidor-de-desafios","title":"Servidor de desafios","text":"

    Voc\u00eas rodaram um MVP do servidor de desafios. Veja abaixo seu estado atual:

    https://github.com/Insper/servidor-de-desafios

    "},{"location":"lessons/04-professional-project/slides/#servidor-de-desafios_1","title":"Servidor de desafios","text":""},{"location":"lessons/04-professional-project/slides/#discussao-como-o-projeto-esta-organizado-tecnologias","title":"Discuss\u00e3o: como o projeto est\u00e1 organizado? (tecnologias)","text":""},{"location":"lessons/04-professional-project/slides/#discussao-como-o-projeto-esta-organizado-codigo","title":"Discuss\u00e3o: como o projeto est\u00e1 organizado? (c\u00f3digo)","text":""},{"location":"lessons/04-professional-project/slides/#discussao-avalie-a-arquitetura-do-projeto","title":"Discuss\u00e3o: avalie a arquitetura do projeto","text":""},{"location":"lessons/04-professional-project/slides/#0-a-10","title":"0 a 10","text":""},{"location":"lessons/04-professional-project/slides/#discussao-avalie-a-qualidade-de-codigo-do-projeto","title":"Discuss\u00e3o: avalie a qualidade de c\u00f3digo do projeto.","text":""},{"location":"lessons/04-professional-project/slides/#0-a-10_1","title":"0 a 10","text":""},{"location":"lessons/04-professional-project/slides/#discussao-avalie-a-seguranca-do-projeto","title":"Discuss\u00e3o: avalie a seguran\u00e7a do projeto.","text":""},{"location":"lessons/04-professional-project/slides/#0-a-10_2","title":"0 a 10","text":""},{"location":"lessons/04-professional-project/slides/#discussao-esse-projeto-e-um-projeto-profissional","title":"Discuss\u00e3o: esse projeto \u00e9 um projeto \"profissional\"?","text":""},{"location":"lessons/04-professional-project/slides/#0-a-10_3","title":"0 a 10","text":""},{"location":"lessons/04-professional-project/slides/#discussao-o-que-voce-incluiria-na-documentacao-do-projeto","title":"Discuss\u00e3o: o que voc\u00ea incluiria na documenta\u00e7\u00e3o do projeto?","text":""},{"location":"lessons/04-professional-project/slides/#software-tem-historia-e-depende-de-pessoas-para-evoluir","title":"Software tem hist\u00f3ria e depende de pessoas para evoluir","text":""},{"location":"lessons/04-professional-project/slides/#codigo-vs-software-profissional","title":"C\u00f3digo vs software profissional","text":"

    Os seguintes pontos transformam um c\u00f3digo que fiz para mim em algo \u00fatil para outras pessoas

    1. Tradu\u00e7\u00f5es e internacionaliza\u00e7\u00e3o (datas)
    2. Documenta\u00e7\u00e3o de usu\u00e1rio e de desenvolvimento
    3. Algum processo de qualidade de software
      • testes automatizados
      • formata\u00e7\u00e3o de c\u00f3digo e estrutura de repo
    4. pacotes de instala\u00e7\u00e3o
    "},{"location":"lessons/04-professional-project/slides/#hoje","title":"Hoje","text":"
    • Ferramentas de documenta\u00e7\u00e3o
    • Documenta\u00e7\u00e3o de API usando
    • Padr\u00f5es de formata\u00e7\u00e3o de c\u00f3digo
      • linters
      • PEP8
    "},{"location":"lessons/04-professional-project/slides/#documentacao-de-api","title":"Documenta\u00e7\u00e3o de API","text":"

    Objetivo: explicar o funcionamento das fun\u00e7\u00f5es, classes e m\u00f3dulos de um programa.

    • Focado em detalhes
    • Documenta os argumentos esperados e em quais situa\u00e7\u00f5es a fun\u00e7\u00e3o funciona
    • Tipicamente obtida direto do c\u00f3digo
    • N\u00e3o detalha como as fun\u00e7\u00f5es s\u00e3o usadas em conjunto
    "},{"location":"lessons/04-professional-project/slides/#documentacao-de-api_1","title":"Documenta\u00e7\u00e3o de API","text":""},{"location":"lessons/04-professional-project/slides/#documentacao-de-api_2","title":"Documenta\u00e7\u00e3o de API","text":"

    ref

    "},{"location":"lessons/04-professional-project/slides/#ferramentas","title":"Ferramentas","text":"
    • Python:
      • pydoc, numpydoc
    • C/C++
      • Doxygen
    • Java
      • Javadoc

    Em geral podem ser plugadas em alguma ferramenta de documenta\u00e7\u00e3o de projetos.

    "},{"location":"lessons/04-professional-project/slides/#padroes-de-codificacao","title":"Padr\u00f5es de codifica\u00e7\u00e3o","text":""},{"location":"lessons/04-professional-project/slides/#padroes-de-codificacao_1","title":"Padr\u00f5es de codifica\u00e7\u00e3o","text":""},{"location":"lessons/04-professional-project/slides/#padroes-de-codificacao_2","title":"Padr\u00f5es de codifica\u00e7\u00e3o","text":"
    • Cada projeto tem o seu
    • Algumas linguagens tem um estilo padr\u00e3o
      • Python - PEP8
    • Ferramentas ajudam a conferir (for\u00e7ar) um estilo espec\u00edfico
    "},{"location":"lessons/04-professional-project/slides/#ferramentas_1","title":"Ferramentas","text":"
    • Python: pylint, black
    • C/C++: splint, cppchecker, gcc (op\u00e7\u00f5es -Wall, -Wextra), clang-format/-tidy
    • Java: flag -Xlint
    • Javascript: ESlint, TSlint (typescript)
    "},{"location":"lessons/04-professional-project/slides/#_1","title":"Documenta\u00e7\u00e3o de API e linters","text":"

    Ajudam a manter c\u00f3digo limpo e leg\u00edvel. Podem ser plugadas no seu editor favorito.

    "},{"location":"lessons/04-professional-project/slides/#execucao-obrigatoria-para-muitos-projetos-grandes","title":"Execu\u00e7\u00e3o obrigat\u00f3ria para muitos projetos grandes","text":""},{"location":"lessons/04-professional-project/slides/#atividade-pratica-projeto-profissional","title":"Atividade pr\u00e1tica: Projeto profissional","text":"

    Objetivo: Transformar um c\u00f3digo perdido em um projeto

    \"metadata\": {\"url\": \"github pages criado\", \"group\": [\"ate tr\u00eas\", \"alunos\"]}

    "},{"location":"lessons/04-professional-project/slides/#desenvolvimento-aberto_1","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/04-professional-project/slides/#documentacao-de-api-testes","title":"Documenta\u00e7\u00e3o de API + testes","text":""},{"location":"lessons/04-professional-project/slides/#igor-dos-santos-montagner-igorsm1insperedubr_1","title":"Igor dos Santos Montagner ( igorsm1@insper.edu.br )","text":""},{"location":"lessons/05-python-packaging/","title":"05 - Distribui\u00e7\u00e3o de Software","text":"

    Nesta aula complementaremos as \u00faltimas discuss\u00f5es criando um pequeno pacote Python instal\u00e1vel via pip. Com isto chegamos mais perto de um projeto que esteja preparado para que outras pessoas o utilizem e colaborem em seu desenvolvimento.

    "},{"location":"lessons/05-python-packaging/#distribuindo-software-para-desenvolvedores-pacote-python-basico","title":"Distribuindo software para desenvolvedores: pacote Python b\u00e1sico","text":"

    Nosso m\u00f3dulo se chamar\u00e1 dev_aberto e disponibilizar\u00e1 um programa execut\u00e1vel hello.py. Crie a seguinte estrutura de pastas para nosso pacote.

    Important

    Baixe os arquivos que usaremos neste link

    pacote_exemplo/\n    dev_aberto/\n        __init__.py\n        dev_aberto.py\n    scripts/\n        hello.py\n    README.md\n    LICENSE\n

    Exercise

    com a estrutura acima, qual seria o import a ser feito para usar a fun\u00e7\u00e3o hello do arquivo dev_aberto.py?

    Exercise

    Pesquise para que serve o arquivo __init__.py e use-o para permitir importar hello usando somente import dev_aberto.

    Exercise

    Crie um projeto no github para esta atividade. Fa\u00e7a um primeiro commit nele com o conte\u00fado \"zerado\" do projeto.

    • Um arquivo README contendo uma frase de descri\u00e7\u00e3o do pacote e um link para o reposit\u00f3rio da disciplina.
    • Um arquivo LICENSE com a licen\u00e7a MIT.
    "},{"location":"lessons/05-python-packaging/#o-arquivo-setuppy","title":"O arquivo setup.py","text":"

    A descri\u00e7\u00e3o de um pacote Python \u00e9 feita usando um arquivo setup.py Veja abaixo uma vers\u00e3o inicial deste arquivo:

    from setuptools import setup\n\nsetup(name='dev_aberto_seunome',\n      version='0.1',\n      packages=['dev_aberto']\n      )\n

    Exercise

    Crie o arquivo acima no seu projeto, substituindo seunome por .... seu nome. Instale o seu pr\u00f3prio pacote usando

    pip install .

    Exercise

    Em outra pasta, abra um console Python e tente importar seu m\u00f3dulo.

    Exercise

    Pesquise quais argumentos s\u00e3o usados para especificar o autor do pacote, as vers\u00f5es de Python e sistemas operacionais suportados. Preencha estes valores com suas informa\u00e7\u00f5es. Note que o pip leva estas informa\u00e7\u00f5es em conta e s\u00f3 instalar\u00e1 um pacote se ele estiver em um ambiente suportado.

    "},{"location":"lessons/05-python-packaging/#dependencias","title":"Depend\u00eancias","text":"

    Para adicionar pacotes que s\u00e3o automaticamente instalados quando instalamos nosso pacote precisamos identific\u00e1-los no nosso arquivo setup.py. Para adicionar uma depend\u00eancia de instala\u00e7\u00e3o basta adicionar o seguinte argumento:

        ...\n    install_requires=[\n        'pacote>=1.0',\n        'pacote2'\n    ],\n    ...\n

    Exercise

    Verifique as depend\u00eancias do c\u00f3digo e adicione-as no setup.py.

    "},{"location":"lessons/05-python-packaging/#requirementstxt","title":"requirements.txt","text":"

    Muitos softwares usam tamb\u00e9m um arquivo requirements.txt para listar todas as depend\u00eancias do software de modo a obter uma instala\u00e7\u00e3o id\u00eantica \u00e0 do desenvolvedor. Isto \u00e9 importante para uniformizar os ambientes de desenvolvimento. Ou seja, este arquivo nunca ser\u00e1 usado por usu\u00e1rios finais.

    Exercise

    Crie um requirements.txt para seu projeto com as mesmas depend\u00eancias listadas no seu setup.py.

    "},{"location":"lessons/05-python-packaging/#scripts-executaveis","title":"Scripts execut\u00e1veis","text":"

    Al\u00e9m de instalar o nosso m\u00f3dulo para uso via import desejamos tamb\u00e9m disponibilizar o arquivo hello.py como um execut\u00e1vel para todo o sistema. Isto pode ser feito adicionando a seguinte linha no nosso setup.py indicando que scripts/hello.py dever\u00e1 ser instalado como um execut\u00e1vel.

        ...\n    scripts=['scripts/hello.py'],\n    ...\n

    N\u00e3o se esque\u00e7a de adicionar a seguinte linha no topo de seu arquivo para que ele possa ser executado diretamente do shell:

    #!/usr/bin/env python3\n

    No Windows \u00e9 criado um execut\u00e1vel que chama nosso script, de modo que as chamadas do execut\u00e1vel continuar\u00e3o funcionando normalmente. Note que isto n\u00e3o cria menus em nenhum tipo de interface gr\u00e1fica.

    "},{"location":"lessons/05-python-packaging/#criando-arquivos-de-distribuicao","title":"Criando arquivos de distribui\u00e7\u00e3o","text":"

    Dois tipos de arquivos de distribui\u00e7\u00e3o podem ser usados:

    • sdist: \u00e9 um arquivo contendo os fontes do projeto, incluindo arquivos adicionais especificados usando o argumento data_files. Usado se seu projeto for Python-puro.
    • wheel: \u00e9 um formato pr\u00e9-compilado e espec\u00edfico para cada plataforma. Mais usado quando o projeto cont\u00e9m extens\u00f5es em C.

    A cria\u00e7\u00e3o de um arquivo de distribui\u00e7\u00e3o de fontes \u00e9 bem simples:

    $ python setup.py sdist

    A instala\u00e7\u00e3o deste pacote pode ser feita via pip.

    "},{"location":"lessons/05-python-packaging/#envio-para-o-pypi","title":"Envio para o PyPI","text":"

    Vamos agora enviar nosso pacote para o Python Package Index para que ele possa ser instalado diretamente via pip. Para n\u00e3o poluir o reposit\u00f3rio com pacotes tempor\u00e1rios e de teste, podemos usar o TestPyPI. Toda sua infraestrutura \u00e9 igual ao oficial, mas ele \u00e9 limpo de maneira regular.

    Visite https://test.pypi.org/account/register/ e registre-se no TestPyPI.

    Ap\u00f3s o registro, usaremos o pacote twine (instal\u00e1vel via pip) para fazer o upload:

    $ twine upload --repository-url https://test.pypi.org/legacy/ dist/*

    Voc\u00ea poder\u00e1, ent\u00e3o, instalar seu pacote a partir do test PyPI usando o seguinte comando:

    $ pip install --index-url https://test.pypi.org/simple/ my_hello_nome

    "},{"location":"lessons/05-python-packaging/#entrega","title":"Entrega","text":"

    Fa\u00e7a a entrega de sua atividade adicionando a skill Pacote Python e inclua nela a url do seu reposit\u00f3rio no github.

    Objetivo: Primeira experi\u00eancia distribuindo software Python.

    \"skill_id\": 6, \"metadata\": {\"url\": \"repo-seu-pacote\"}

    "},{"location":"lessons/05-python-packaging/#distribuindo-software-para-usuarios-finais","title":"Distribuindo software para usu\u00e1rios finais","text":"

    Vamos agora trabalhar (em duplas) no Servidor de Desafios novamente. Seu trabalho ser\u00e1 criar um Dockerfile que roda o software de maneira \"completa\". Ou seja, o script de cria\u00e7\u00e3o do container dever\u00e1

    • instalar todas as depend\u00eancias do sistema
    • criar a base de dados, se necess\u00e1rio
    • adicionar os usu\u00e1rios presentes no arquivo users.csv, se necess\u00e1rio
    • executar o servidor e serv\u00ed-lo na porta 8080 do host
    • manter os dados adicionados ao reiniciar o container
    "},{"location":"lessons/05-python-packaging/#entrega_1","title":"Entrega","text":"

    Fa\u00e7a a entrega de sua atividade adicionando a skill Dockerfile segundo o modelo abaixo.

    Objetivo: Criou deploy automatizado para sistema web Python

    \"skill_id\": 7, \"metadata\": {\"url\": \"repo-servidor-de-desafios\", \"group\": [\"login1\", \"login2\"]}

    "},{"location":"lessons/05-python-packaging/#referencias","title":"Refer\u00eancias","text":"

    Algumas refer\u00eancias que podem ser \u00fateis:

    • https://docker-curriculum.com/
    • https://docs.docker.com/get-started/
    "},{"location":"lessons/06-localization-translation/","title":"06 - Localiza\u00e7\u00e3o e Tradu\u00e7\u00e3o","text":"

    Na parte expositiva da aula tivemos uma introdu\u00e7\u00e3o aos problemas de Internacionaliza\u00e7\u00e3o (i18n) e Localiza\u00e7\u00e3o (L10N). Neste roteiro iremos praticar o uso destas t\u00e9cnicas em uma aplica\u00e7\u00e3o linha de comando de exemplo simples.

    Em ambos exemplos vamos trabalhar com o m\u00f3dulo Babel, que \u00e9 feito para facilitar a tradu\u00e7\u00e3o e localiza\u00e7\u00e3o de aplica\u00e7\u00f5es feitas em Python. Outras linguagens de programa\u00e7\u00e3o possuem bibliotecas similares que seguem a mesma sequ\u00eancia de comandos e usam os mesmos tipos de arquivos.

    $ pip install Babel

    Sistemas POSIX suportam a determina\u00e7\u00e3o do locale utilizado por meio da vari\u00e1vel de ambiente LANGUAGE, que pode ser modificada para cada execu\u00e7\u00e3o de um programa. O formato padr\u00e3o usado \u00e9 <lingua>_<pais>.<codificacao>. Para portugu\u00eas do Brasil usando codifica\u00e7\u00e3o UTF8 usamos o locale pt_BR.utf8. Rodando o seguinte comando as mensagens de ajuda do ls devem aparecer em ingl\u00eas.

    $ LANGUAGE=en_US.utf8 ls --help

    J\u00e1 executando o comando abaixo elas devem aparecer em portugu\u00eas.

    $ LANGUAGE=pt_BR.utf8 ls --help

    De maneira mais geral, existe uma s\u00e9rie de vari\u00e1veis LC_* que controlam qual locale \u00e9 usado para determinado tipo de dados. Veremos a seguir como usar LC_TIME e LC_NUMERIC para controlar como datas e n\u00fameros s\u00e3o exibidos e LANGUAGE para definir a lingua de exibi\u00e7\u00e3o de um programa.

    "},{"location":"lessons/06-localization-translation/#localizando-um-programa-em-python","title":"Localizando um programa em Python","text":"

    Vamos trabalhar com uma aplica\u00e7\u00e3o de linha de comando que nada mais faz que imprimir alguns dados simples como data em extenso, um n\u00famero fracion\u00e1rio grande e uma mensagem pr\u00e9-definida. O c\u00f3digo completo (arquivo cli.py) est\u00e1 abaixo.

    from datetime import date\n\nif __name__ == '__main__':\n    today = date.today()\n    print(today)\n\n    number = 240000000000.32212\n    print(number)\n\n    name = input('Input your name: ')\n    print('Hello {}'.format(name))\n
    Uma sa\u00edda poss\u00edvel seria

    2018-08-28\n240000000000.3221\nInput your name: Igor\nHello Igor\n

    Como j\u00e1 visto em aula, este programa re\u00fane tr\u00eas das principais sa\u00eddas que precisam ser formatadas: datas, n\u00fameros fracion\u00e1rios e mensagens para o usu\u00e1rio.

    "},{"location":"lessons/06-localization-translation/#formatando-datas","title":"Formatando datas","text":"

    A formata\u00e7\u00e3o de datas \u00e9 governada para vari\u00e1vel LC_TIME. O m\u00f3dulo babel.dates j\u00e1 possui diversas fun\u00e7\u00f5es que automaticamente a utilizam para fazer a localiza\u00e7\u00e3o de vari\u00e1veis do tipo Date (usando a fun\u00e7\u00e3o format_date) ou DateTime (usando format_datetime).

    Exercise

    Pesquise como usar estas fun\u00e7\u00f5es e utilize-as no seu programa para localizar a data por extenso (ou seja, 31 de agosto de 2021).

    Exercise

    O qu\u00ea acontece quando definimos a vari\u00e1vel de ambiente LC_TIME=en_US.utf8 e rodamos o programa? E se usamos LC_TIME=pt_BR.utf8?

    "},{"location":"lessons/06-localization-translation/#formatando-numeros","title":"Formatando n\u00fameros","text":"

    A formata\u00e7\u00e3o de datas \u00e9 governada para vari\u00e1vel LC_NUMERIC. O m\u00f3dulo babel.numbers possui a fun\u00e7\u00e3o format_number que formata um n\u00famero de acordo com esta configura\u00e7\u00e3o.

    Exercise

    Pesquise como usar estas fun\u00e7\u00f5es e utilize-as no seu programa para localizar o n\u00famero fracion\u00e1rio mostrado.

    Exercise

    Teste seu programa com LC_NUMERIC=en_US.utf8 e LC_NUMERIC=pt_BR.utf8. Os efeitos s\u00e3o os esperados?s

    "},{"location":"lessons/06-localization-translation/#traduzindo-mensagens","title":"Traduzindo mensagens","text":"

    A parte final consiste em criar tradu\u00e7\u00f5es das duas strings presentes no texto. A linguagem usada \u00e9 definida pela vari\u00e1vel LANGUAGE, que pode ser definida separadamente para cada processo. Um dos pontos mais importantes \u00e9 marcar quais strings dever\u00e3o ser traduzidas para que uma equipe de tradutores n\u00e3o precise mexer no c\u00f3digo. O m\u00f3dulo gettext do Python j\u00e1 prov\u00ea suporte a esta funcionalidade, o Babel apenas fornece um conjunto de ferramentas que facilita seu uso.

    A implanta\u00e7\u00e3o do framework de tradu\u00e7\u00e3o \u00e9 feita em quatro passos:

    1. Marca\u00e7\u00e3o das strings a serem traduzidas
    2. Extra\u00e7\u00e3o destas strings do c\u00f3digo em um arquivo modelo .pot
    3. Cria\u00e7\u00e3o de tradu\u00e7\u00f5es .po a partir do modelo criado no passo anterior
    4. Compila\u00e7\u00e3o das strings traduzidas em um arquivo bin\u00e1rio .mo

    No arquivo principal de nossa aplica\u00e7\u00e3o podemos \"instalar\" o framework de tradu\u00e7\u00e3o e marcar todas nossas strings a serem traduzidas com a fun\u00e7\u00e3o _(). A instala\u00e7\u00e3o \u00e9 feita pelo seguinte trecho de c\u00f3digo.

    import gettext\ngettext.bindtextdomain('cli', 'locale')\ngettext.textdomain('cli')\n_ = gettext.gettext\n\n# cli \u00e9 o nome do arquivo em que guardamos nossas tradu\u00e7\u00f5es\n# localedir \u00e9 o caminho onde est\u00e3o armazenadas as tradu\u00e7\u00f5es. Pode ser um caminho relativo. \n

    Devemos ent\u00e3o marcar todas as strings para serem traduzidas com _(). Podemos usar _() em qualquer arquivo do projeto, mesmo que a instala\u00e7\u00e3o tenha sido feita somente no arquivo principal.

    print(_(\"Hello!\"))\n

    Os passos seguintes s\u00e3o feitos com aux\u00edlio do Babel, que efetivamente analisa nosso c\u00f3digo Python e extrai as strings para tradu\u00e7\u00e3o. A cria\u00e7\u00e3o do arquivo modelo de tradu\u00e7\u00e3o a partir dos arquivos do diret\u00f3rio atual \u00e9 feita com o seguinte comando.

    $ pybabel extract . -o cli-model.pot

    Criamos ent\u00e3o uma nova tradu\u00e7\u00e3o usando o seguinte comando. A op\u00e7\u00e3o -D indica o nome do arquivo em que as tradu\u00e7\u00f5es ser\u00e3o guardadas (usado em gettext.install). A op\u00e7\u00e3o -l indica o locale da tradu\u00e7\u00e3o. A op\u00e7\u00e3o -d indica o localedir usado em gettext.install.

    $ pybabel init -i cli-model.pot -D cli -l pt_BR -d locale

    Devemos ent\u00e3o editar o arquivo criado em locale/pt_BR/LC_MESSAGES/cli.po. Ser\u00e3o apresentados (ap\u00f3s algumas linhas de coment\u00e1rios) pares de linhas como as seguintes. O primeiro valor msgid \u00e9 a string a ser traduzida e o segundo msgstr \u00e9 a tradu\u00e7\u00e3o no locale pt_BR (pois o arquivo est\u00e1 na pasta pt_BR do localedir).

    msgid \"Input your name: \"\nmsgstr \"\"\n

    Apesar de ser poss\u00edvel fazer tudo diretamente no arquivo de texto, \u00e9 mais conveniente usar softwares como o poedit ou este editor online(https://localise.biz/free/poeditor).

    Com as strings traduzidas vamos finalmente compilar nossos resultados. Isto \u00e9 feito para que n\u00e3o seja poss\u00edvel mexer nos arquivos de tradu\u00e7\u00e3o em uma vers\u00e3o Release do programa.

    $ pybabel compile -D cli -l pt_BR -d locale

    Isto gerar\u00e1 os arquivos .mo correspondentes a ao locale pt_BR. S\u00e3o estes os arquivos carregados durante a execu\u00e7\u00e3o do programa.

    "},{"location":"lessons/06-localization-translation/#teste-final","title":"Teste final","text":"

    Podemos definir a vari\u00e1vel LANGUAGE para modificar a lingua de um programa (como visto anteriormente com ls). Execute seu programa diretamente e depois setando LANGUAGE=pt_BR.utf8. Os resultados foram os esperados?

    "},{"location":"lessons/06-localization-translation/#entrega","title":"Entrega","text":"

    Modifique o exerc\u00edcio da aula passada (pacote python) para suportar datas e mensagens em Ingl\u00eas e Portugu\u00eas. Fa\u00e7a a entrega de sua atividade adicionando a skill Tradu\u00e7\u00e3o b\u00e1sica segundo o modelo abaixo.

    Objetivo: Aplicou ferramentas de localiza\u00e7\u00e3o para traduzir um programa simples em linha de comando.

    \"skill_id\": 8, \"metadata\": {\"url\": \"repo-pacote-python\"}

    "},{"location":"lessons/06-localization-translation/slides/","title":"Tradu\u00e7\u00e3o e localiza\u00e7\u00e3o de software","text":""},{"location":"lessons/06-localization-translation/slides/#desenvolvimento-aberto","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/06-localization-translation/slides/#localizacao-e-internacionalizacao-de-software","title":"Localiza\u00e7\u00e3o e internacionaliza\u00e7\u00e3o de software","text":""},{"location":"lessons/06-localization-translation/slides/#versao-20232-igor-montagner-igorsm1insperedubr","title":"Vers\u00e3o 2023/2: Igor Montagner (igorsm1@insper.edu.br)","text":""},{"location":"lessons/06-localization-translation/slides/#traducao-de-software","title":"Tradu\u00e7\u00e3o de software","text":""},{"location":"lessons/06-localization-translation/slides/#qual-a-diferenca-de-internacionalizacao-e-localizacao","title":"Qual a diferen\u00e7a de internacionaliza\u00e7\u00e3o e localiza\u00e7\u00e3o?","text":""},{"location":"lessons/06-localization-translation/slides/#internacionalizacao-i18n","title":"Internacionaliza\u00e7\u00e3o (I18N)","text":"
    • Consiste em traduzir a interface de usu\u00e1rio de um software para outros idiomas.

    • Sistema Operacional guarda configura\u00e7\u00f5es de idioma e as disponibiliza para aplica\u00e7\u00f5es

    • Tipicamente \"invis\u00edvel\"

    "},{"location":"lessons/06-localization-translation/slides/#localizacao-l10n","title":"Localiza\u00e7\u00e3o (L10N)","text":"

    Consiste em adaptar a maneira de mostrar

    • n\u00fameros fracion\u00e1rios
      • marcador de decimais
      • marcador de milhares
    • datas
      • nomes de meses
      • ordem de exibi\u00e7\u00e3o
    • nomes de pa\u00edses, fusos hor\u00e1rios, etc

    de acordo com as prefer\u00eancias de um usu\u00e1rio e relativos a sua cultura.

    "},{"location":"lessons/06-localization-translation/slides/#i18n-e-l10n","title":"I18N e L10N","text":"

    Precisam ser

    • independentes:
      • idioma ingl\u00eas e datas no formato brasileiro
    • configur\u00e1veis
      • posso precisar trocar entre l\u00ednguas e entre formatos
    "},{"location":"lessons/06-localization-translation/slides/#o-suporte-a-l10n-e-i18n-implica-modificar-codigo-fonte","title":"O suporte a L10N e I18N implica modificar c\u00f3digo fonte.","text":""},{"location":"lessons/06-localization-translation/slides/#locales","title":"Locales","text":"

    Um locale \u00e9 uma tripla

    "},{"location":"lessons/06-localization-translation/slides/#_1","title":"Tradu\u00e7\u00e3o e localiza\u00e7\u00e3o de software","text":"
    <lingua>_<pais>.<codificacao>\n
    "},{"location":"lessons/06-localization-translation/slides/#_2","title":"Tradu\u00e7\u00e3o e localiza\u00e7\u00e3o de software","text":"

    que representa configura\u00e7\u00f5es de I18N e/ou L10N para uma determinada cultura.

    "},{"location":"lessons/06-localization-translation/slides/#locales_1","title":"Locales","text":"

    Exemplos:

    • Tradu\u00e7\u00e3o de File:
      • pt = Ficheiro
      • pt_BR = Arquivo
    • Formato de datas:
      • en_US: MM/DD/YY
      • en_GB: DD/MM/YY
    "},{"location":"lessons/06-localization-translation/slides/#posso-usar-locales-diferentes-para-a-lingua-da-interface-de-usuario-e-para-mostrar-datas","title":"Posso usar locales diferentes para a l\u00edngua da interface de usu\u00e1rio e para mostrar datas.","text":""},{"location":"lessons/06-localization-translation/slides/#configuracoes-possiveis-linux","title":"Configura\u00e7\u00f5es poss\u00edveis (Linux)","text":"
    # sa\u00edda do comando locale\nLANG=en_US.UTF-8\nLC_CTYPE=\"en_US.UTF-8\"\nLC_NUMERIC=pt_BR.UTF-8\nLC_TIME=pt_BR.UTF-8\nLC_COLLATE=pt_BR.UTF-8\nLC_MONETARY=pt_BR.UTF-8\nLC_MESSAGES=\"en_US.UTF-8\"\nLC_PAPER=pt_BR.UTF-8\nLC_NAME=pt_BR.UTF-8\nLC_ADDRESS=pt_BR.UTF-8\nLC_TELEPHONE=pt_BR.UTF-8\nLC_MEASUREMENT=pt_BR.UTF-8\nLC_IDENTIFICATION=pt_BR.UTF-8\n
    "},{"location":"lessons/06-localization-translation/slides/#implementando-suporte-a-l10n","title":"Implementando suporte a L10N","text":"
    1. Baixar uma biblioteca de Localiza\u00e7\u00e3o
    2. Encontrar todas as exibi\u00e7\u00f5es de n\u00fameros, datas, etc
    3. Pr\u00e9-process\u00e1-las usando fun\u00e7\u00f5es da biblioteca
    "},{"location":"lessons/06-localization-translation/slides/#_3","title":"Tradu\u00e7\u00e3o e localiza\u00e7\u00e3o de software","text":"
    # Antes \nprint('Numero:', 10.5) \n# Depois\nprint('Numero', format_number(10.5))\n
    "},{"location":"lessons/06-localization-translation/slides/#_4","title":"Tradu\u00e7\u00e3o e localiza\u00e7\u00e3o de software","text":"

    N\u00e3o \u00e9 complicado, mas \u00e9 trabalhoso

    "},{"location":"lessons/06-localization-translation/slides/#suporte-a-i18n","title":"Suporte a I18N","text":"

    Envolve 4 etapas:

    1. Marcar todas strings que devem ser traduzidas
    2. Extra\u00ed-las do c\u00f3digo fonte
    3. Criar um arquivo de tradu\u00e7\u00f5es para cada locale suportado
    4. Empacotar as tradu\u00e7\u00f5es junto com o programa
    "},{"location":"lessons/06-localization-translation/slides/#_5","title":"Tradu\u00e7\u00e3o e localiza\u00e7\u00e3o de software","text":"

    \u00c9 um pouco mais complicado, mas pode ser integrado ao processo de compila\u00e7\u00e3o de um programa.

    "},{"location":"lessons/06-localization-translation/slides/#suporte-a-i18n-posix","title":"Suporte a I18N (POSIX)","text":"

    Sistemas POSIX suportam determina\u00e7\u00e3o de lingua e locale usando vari\u00e1veis de ambiente.

    • LANG para l\u00edngua
    • LC_TIME para data
    • LC_NUMERIC para n\u00fameros

    Um locale sempre \u00e9 expresso no formato

    <lingua>_<pais>.<codificacao>\n
    "},{"location":"lessons/06-localization-translation/slides/#suporte-a-i18n-posix_1","title":"Suporte a I18N (POSIX)","text":"

    O comando locale mostra todas as op\u00e7\u00f5es dispon\u00edveis:

    # sa\u00edda do comando locale\nLANG=en_US.UTF-8\nLC_CTYPE=\"en_US.UTF-8\"\nLC_NUMERIC=pt_BR.UTF-8\nLC_TIME=pt_BR.UTF-8\nLC_COLLATE=pt_BR.UTF-8\nLC_MONETARY=pt_BR.UTF-8\nLC_MESSAGES=\"en_US.UTF-8\"\nLC_PAPER=pt_BR.UTF-8\nLC_NAME=pt_BR.UTF-8\nLC_ADDRESS=pt_BR.UTF-8\nLC_TELEPHONE=pt_BR.UTF-8\nLC_MEASUREMENT=pt_BR.UTF-8\nLC_IDENTIFICATION=pt_BR.UTF-8\n
    "},{"location":"lessons/06-localization-translation/slides/#suporte-a-i18n-web","title":"Suporte a I18N (Web)","text":"

    Existem diversas maneiras de determinar um bom locale em sistemas Web:

    • Cabe\u00e7alho HTTP Accept-Language inclui as linguagens de exibi\u00e7\u00e3o suportadas pelo browser do visitante.
    • Geolocaliza\u00e7\u00e3o via IP
    • Prefer\u00eancia armazenada em banco de dados
    "},{"location":"lessons/06-localization-translation/slides/#_6","title":"Tradu\u00e7\u00e3o e localiza\u00e7\u00e3o de software","text":""},{"location":"lessons/06-localization-translation/slides/#web-e-desktop-usam-as-mesmas-tecnologias-l10n-e-i18n","title":"Web e desktop usam as mesmas tecnologias (l10n e i18n)","text":""},{"location":"lessons/06-localization-translation/slides/#suporte-a-i18n-em-python","title":"Suporte a I18N (em Python)","text":"
    • M\u00f3dulo gettext da biblioteca padr\u00e3o
    • M\u00f3dulo datetime aceita o uso de locales
    • M\u00f3dulo babel faz I18N e L10N
    "},{"location":"lessons/06-localization-translation/slides/#atividade-pratica-traducao-basica","title":"Atividade pr\u00e1tica: Tradu\u00e7\u00e3o b\u00e1sica","text":"

    Objetivo: usar o m\u00f3dulo Babel para traduzir uma aplica\u00e7\u00e3o do terminal.

    "},{"location":"lessons/06-localization-translation/slides/#desenvolvimento-aberto_1","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/06-localization-translation/slides/#localizacao-e-internacionalizacao-de-software_1","title":"Localiza\u00e7\u00e3o e internacionaliza\u00e7\u00e3o de software","text":""},{"location":"lessons/06-localization-translation/slides/#versao-20232-igor-montagner-igorsm1insperedubr_1","title":"Vers\u00e3o 2023/2: Igor Montagner (igorsm1@insper.edu.br)","text":""},{"location":"lessons/07-code-quality/","title":"07 - Code quality","text":"

    In Lesson 04 - Professional Project we created a repo and website for an old project developed during the course. Now we are going to improve its quality by fixing the issues each group found using a linter tool.

    Warning

    We won't work on our own projects this time! Select a project from the discussion page and comment on the issue you'd like to do. Every project must have at least one issue with external participation.

    "},{"location":"lessons/07-code-quality/#deliverable","title":"Deliverable","text":"
    • create a Pull/Merge request addressing a code quality issue found in another team's project.
    • work with other team to get a Pull/Merge request accepted in your repository

    Learning objective: modify a project you are not familiar with and improve its code quality

    \"skill_id\": 11, \"metadata\": {\"url\": \"pull request url\", \"group\": [\"student2\"]}

    Add to the pull request description a link to the accepted contribution.

    "},{"location":"lessons/08-automated-testing/","title":"08 - Automated testing","text":"

    We will now add (some) automated testing to one of the projects from the discussion page. Again, our objective in this activity is to get used to build and modify different projects.

    Warning

    You'll need to select a different project from the last Lesson 07 - Code Quality

    "},{"location":"lessons/08-automated-testing/#deliverable","title":"Deliverable","text":"
    • create two issues with suggestions for testing in the selected project
    • send a Pull/Merge request addressing one of the issues you created and get it accepted

    Learning objective: modify a project you are not familiar with and improve its code quality

    \"skill_id\": 5, \"metadata\": {\"url\": \"pull request url\", \"group\": [\"student2\"]}

    Add to the pull request description a link to the accepted contribution.

    "},{"location":"lessons/08-automated-testing/slides/","title":"Testes automatizados","text":""},{"location":"lessons/08-automated-testing/slides/#desenvolvimento-aberto","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/08-automated-testing/slides/#testes-automatizados","title":"Testes automatizados","text":""},{"location":"lessons/08-automated-testing/slides/#igor-dos-santos-montagner-igorsm1insperedubr","title":"Igor dos Santos Montagner ( igorsm1@insper.edu.br )","text":""},{"location":"lessons/08-automated-testing/slides/#projeto-profissional","title":"Projeto profissional","text":"
    • Qualidade de c\u00f3digo
      • Linting - formata\u00e7\u00e3o e erros comuns
    • Documenta\u00e7\u00e3o
      • Usu\u00e1rio
      • Desenvolvedor
    "},{"location":"lessons/08-automated-testing/slides/#projeto-profissional_1","title":"Projeto profissional","text":"
    • Qualidade de c\u00f3digo
      • Linting - formata\u00e7\u00e3o e erros comuns
      • O c\u00f3digo funciona?
    • Documenta\u00e7\u00e3o
      • Usu\u00e1rio
      • Desenvolvedor
    "},{"location":"lessons/08-automated-testing/slides/#meu-programa-funciona","title":"Meu programa funciona?","text":"
    • Sob quais condi\u00e7\u00f5es?
    • Em quais plataformas?
    • Quais opera\u00e7\u00f5es s\u00e3o suportadas?
    • Consigo conferir o resultado de uma execu\u00e7\u00e3o? Se sim, existe um valor de refer\u00eancia?
    "},{"location":"lessons/08-automated-testing/slides/#testes-automatizados_1","title":"Testes automatizados","text":"

    Ideia: escrever um programa que verifica se um outro programa responde como esperado

    • Definir situa\u00e7\u00f5es a serem testadas ...
    • e o resultado esperado em cada situa\u00e7\u00e3o
    "},{"location":"lessons/08-automated-testing/slides/#testes-automatizados_2","title":"Testes automatizados","text":"

    N\u00e3o ajudam:

    • a revelar novos bugs
    • a garantir que um software \u00e9 livre de bugs

    Ajudam

    • a evitar que bugs descobertos voltem
    • a evitar que mudan\u00e7as n\u00e3o intencionais quebrem c\u00f3digo que estava funcionando.
    • a documentar em quais situa\u00e7\u00f5es o software funciona.
    "},{"location":"lessons/08-automated-testing/slides/#testes-automatizados_3","title":"Testes automatizados","text":"
    1. Testes de unidade
    2. Testes de integra\u00e7\u00e3o
    3. Testes de interface de usu\u00e1rio
    "},{"location":"lessons/08-automated-testing/slides/#testes-unitarios","title":"Testes unit\u00e1rios","text":"

    Ideia: dada uma fun\u00e7\u00e3o, verificar se ela devolve o valor esperado para um certo conjunto de par\u00e2metros.

    • Testa as fun\u00e7\u00f5es de maneira isolada
    • Cobertura: porcentagem das linhas de c\u00f3digo que \u00e9 executada durante os testes de unidade.
    • Serve como documenta\u00e7\u00e3o da fun\u00e7\u00e3o
    "},{"location":"lessons/08-automated-testing/slides/#testes-unitarios-pytest","title":"Testes unit\u00e1rios - pytest","text":""},{"location":"lessons/08-automated-testing/slides/#testes-de-integracao","title":"Testes de integra\u00e7\u00e3o","text":"

    Ideia: dados um conjunto de classes com interdepend\u00eancias, verificar se elas funcionam bem em conjunto.

    • Testa intera\u00e7\u00e3o entre em objetos
    • Possibilidade de criar mocks, que s\u00e3o objetos falsos feitos para simular a intera\u00e7\u00e3o entre v\u00e1rios objetos.
    "},{"location":"lessons/08-automated-testing/slides/#testes-de-interface-de-usuario","title":"Testes de interface de usu\u00e1rio","text":"

    Ideia: simula a\u00e7\u00f5es do usu\u00e1rio (cliques, entrada de dados, etc) e confere se a sa\u00edda esperada \u00e9 mostrada na tela

    • Menos espec\u00edfico poss\u00edvel
    • Mais fiel ao uso real de um usu\u00e1rio
    "},{"location":"lessons/08-automated-testing/slides/#testes-de-interface-de-usuario_1","title":"Testes de interface de usu\u00e1rio","text":""},{"location":"lessons/08-automated-testing/slides/#selenium","title":"Selenium","text":"

    Permite fazer scripts que interagem com uma p\u00e1gina web, realizando entrada de dados, rolagem de tela e cliques. Cada assert pode ser feito com o conte\u00fado de um objeto da p\u00e1gina.

    "},{"location":"lessons/08-automated-testing/slides/#o-que-eu-preciso-testar","title":"O qu\u00ea eu preciso testar?","text":""},{"location":"lessons/08-automated-testing/slides/#_1","title":"Testes automatizados","text":""},{"location":"lessons/08-automated-testing/slides/#o-que-eu-preciso-testar_1","title":"O qu\u00ea eu preciso testar?","text":""},{"location":"lessons/08-automated-testing/slides/#ninguem-sabe","title":"Ningu\u00e9m sabe....","text":""},{"location":"lessons/08-automated-testing/slides/#atividade-pratica-testado-e-aprovado","title":"Atividade pr\u00e1tica: Testado e aprovado","text":"

    Objetivo: Primeira experi\u00eancia com testes automatizado de c\u00f3digo.

    \"metadata\": {\"url\": \"acceppted PR\", \"group\": [\"igual\", \"6\"]}

    "},{"location":"lessons/09-releases/","title":"09 - Releases","text":"

    Creating a release is the final step to distribute software to users. It involves \"freezing\" the repository in a specific commit and attaching binaries and other ready to use assets. Users should be able to grab one of the releases and use it direclty without having to setup a dev environment.

    The skill New Release involves the creation of a release for your own project used in the last lessons.

    \"skill_id\": 12, \"metadata\": {\"url\": \"release url\", \"group\": [\"student2\"]}

    "},{"location":"lessons/09-releases/#instructions","title":"Instructions","text":"

    The following guids might be useful.

    • Creating releases in Github
    • PyInstaller for creating installers/binaries using Python

    The following checks will be used to verify if this skill is completed:

    • there is a release in the repo's Releases tab containing the description of the release and the source code
    • the release includes either an installer or a direccly executable file in one of the following formats:
      • Linux: .deb, .rpm for installers,AppImage for executables
      • Windows: .msi installer or single .exe (plus asses, if necessary)
      • Other: if the project is an extension, plugin or any other type of stoftware, the release must include a redistributable package in the official format
    "},{"location":"lessons/10-first-contribution/","title":"10 - Minha primeira contribui\u00e7\u00e3o","text":""},{"location":"lessons/10-first-contribution/slides/","title":"Explorando seu projeto","text":""},{"location":"lessons/10-first-contribution/slides/#desenvolvimento-aberto","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/10-first-contribution/slides/#_1","title":"Explorando seu projeto","text":""},{"location":"lessons/10-first-contribution/slides/#contribuicao-de-codigo","title":"Contribui\u00e7\u00e3o de c\u00f3digo","text":""},{"location":"lessons/10-first-contribution/slides/#igor-dos-santos-montagner-igorsm1insperedubr","title":"Igor dos Santos Montagner ( igorsm1@insper.edu.br )","text":""},{"location":"lessons/10-first-contribution/slides/#ate-agora","title":"At\u00e9 agora","text":"
    • Ferramentas de colabora\u00e7\u00e3o
    • Qualidade de c\u00f3digo e ferramentas para qualidade de projeto
    • Tradu\u00e7\u00e3o de UI e documenta\u00e7\u00e3o
    • Aspectos n\u00e3o t\u00e9cnicos relacionados
      • licen\u00e7as
      • comunidades
    "},{"location":"lessons/10-first-contribution/slides/#primeira-contribuicao","title":"Primeira contribui\u00e7\u00e3o","text":"
    • Ajuda na sele\u00e7\u00e3o de *issues- e projetos
    • Ser\u00e1 feita em duplas/trios

    Entrega final: 02/10

    "},{"location":"lessons/10-first-contribution/slides/#etapa-individual-outubro","title":"Etapa individual (Outubro)","text":""},{"location":"lessons/10-first-contribution/slides/#aprofundar-habilidades-desenvolvidas-em-grupo","title":"Aprofundar habilidades desenvolvidas em grupo","text":"
    1. proporcionar uma experi\u00eancia de trabalho em um projeto real de escolha dos alunos
    2. valorizar diversos tipos de contribui\u00e7\u00f5es, n\u00e3o somente de c\u00f3digo
    3. exercitar autonomia*- e **independ\u00eancia
    "},{"location":"lessons/10-first-contribution/slides/#inicio-em-0410","title":"In\u00edcio em 04/10","text":""},{"location":"lessons/10-first-contribution/slides/#minha-primeira-contribuicao-de-codigo","title":"Minha primeira contribui\u00e7\u00e3o de c\u00f3digo","text":"

    Bons projetos usam tags para facilitar a recep\u00e7\u00e3o de novatos

    • good-first-issue
    • newcomers
    • low effort
    • difficulty novice
    • easy
    "},{"location":"lessons/10-first-contribution/slides/#sugestao-i-pandas","title":"Sugest\u00e3o I - Pandas","text":"

    Biblioteca de tratamento de dados usada em Ci\u00eancia dos Dados.

    • Projeto complexo, com muitos casos de uso especiais
    • Toneladas de funcionalidades de visualiza\u00e7\u00e3o textual e gr\u00e1fica de dados
    • Python \u00e9 familiar para a maioria

    Tickets de testes s\u00e3o, em geral, f\u00e1ceis para come\u00e7ar e \u00fateis para a comunidade.

    "},{"location":"lessons/10-first-contribution/slides/#sugestao-ii-matplotlib","title":"Sugest\u00e3o II - Matplotlib","text":"

    Plotar gr\u00e1ficos em Python

    Lista de Good first issues tem v\u00e1rios em aberto ou com PRs que est\u00e3o parados h\u00e1 meses e podem ser assumidos por outras pessoas.

    "},{"location":"lessons/10-first-contribution/slides/#sugestao-iii-pyscript","title":"Sugest\u00e3o III - Pyscript","text":"

    Python rodando no Browser via WebAssembly

    Lista de issues tem v\u00e1rias que parecem acess\u00edveis

    "},{"location":"lessons/10-first-contribution/slides/#sugestao-iii-escolha-seu-proprio-projeto","title":"Sugest\u00e3o III: Escolha seu pr\u00f3prio projeto :)","text":"
    • https://github.com/MunGell/awesome-for-beginners
    • https://www.codetriage.com/
    • https://up-for-grabs.net/
    • http://github-help-wanted.com/
    "},{"location":"lessons/10-first-contribution/slides/#hoje","title":"Hoje","text":"
    1. escolher issue e projeto
    2. montar ambiente
      • baixar c\u00f3digo
      • compilar
      • rodar sua vers\u00e3o
    3. reproduzir a issue
    "},{"location":"lessons/11-floss-people/","title":"11 - People and Companies from FLOSS","text":"

    Free and Open Source Software history is full of personalities that have contributed to shape the world we live in. In this activity pairs of students select a company or person with a strong history in FOSS and detail their contributions in a 30 minutes presentation followed by a 10 minutes guided discussion.

    All presentations will be open to the general public, recorded and must be presented in english. The discussions will not be recorded. After presenting students can create a PR with the skill FLOSS research and upload a PDF of their presentations to the apresentacoes/2023/ folder.

    Register your choice of personality/company and time slot for the presentation at the Github Discussions thread. You can accept one of the suggestions below or propose a different one.

    • RedHat
    • Canonical and Ubuntu
    • The Debian project
    • Richard Stallman and the FSF
    • Linus Torvalds and Linux
    • Eric Raymond (Cathedral and Bazaar)
    • Larry Wall and Perl
    • Mozilla

    The following presentation slots are available on a first-come first-served queue.

    • 01/NOV 08:45
    • 06/NOV 08:45
    • 08/NOV 08:45
    • 13/NOV 08:45
    • 22/NOV 08:45
    • 27/NOV 08:45
    "},{"location":"lessons/12-licenses/","title":"12 - Software Licenses","text":"

    This meeting does not have practical activities.

    "},{"location":"lessons/12-licenses/slides/","title":"Licen\u00e7as de software","text":""},{"location":"lessons/12-licenses/slides/#desenvolvimento-aberto","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/12-licenses/slides/#licencas-de-software","title":"Licen\u00e7as de Software","text":""},{"location":"lessons/12-licenses/slides/#20232-igor-montagner-igorsm1insperedubr","title":"2023/2: Igor Montagner ( igorsm1@insper.edu.br) )","text":""},{"location":"lessons/12-licenses/slides/#ate-agora","title":"At\u00e9 agora","text":"
    • Ferramentas de colabora\u00e7\u00e3o
    • Modifica\u00e7\u00f5es de c\u00f3digo
    • Tradu\u00e7\u00e3o de UI e documenta\u00e7\u00e3o
    • Distribui\u00e7ao de software
    • Teste de software

    ### Conte\u00fado t\u00e9cnico: ferramentas, fluxos de trabalho, etc

    "},{"location":"lessons/12-licenses/slides/#hoje","title":"Hoje","text":""},{"location":"lessons/12-licenses/slides/#licencas-de-software_1","title":"Licen\u00e7as de software","text":""},{"location":"lessons/12-licenses/slides/#licencas-de-software_2","title":"Licen\u00e7as de software","text":"
    • Governam a distribui\u00e7\u00e3o de um software
    • Cess\u00e3o de direitos do autor para outras pessoas
    • Listam quais permiss\u00f5es um usu\u00e1rio (n\u00e3o) tem
    "},{"location":"lessons/12-licenses/slides/#disclaimer","title":"Disclaimer","text":""},{"location":"lessons/12-licenses/slides/#eu-nao-sou-especialista-em-direito-autoral-brasileiro-toda-informacao-disponibilizada-foi-fruto-de-pesquisa-e-nao-constitui-aconselhamento-legal","title":"Eu n\u00e3o sou especialista em direito autoral brasileiro. Toda informa\u00e7\u00e3o disponibilizada foi fruto de pesquisa e n\u00e3o constitui aconselhamento legal.","text":""},{"location":"lessons/12-licenses/slides/#distribuicao-de-software","title":"Distribui\u00e7\u00e3o de software","text":"

    Escrever software \u00e9 considerado um trabalho intelectual, estando ent\u00e3o sujeito \u00e0s leis de direitos autorais.

    • Essas leis s\u00e3o espec\u00edficas de cada pa\u00eds
    • Autoria vs explora\u00e7\u00e3o econ\u00f4mica
    • Engloba tanto c\u00f3digo fonte como bin\u00e1rios
    "},{"location":"lessons/12-licenses/slides/#direito-autoral-brasileiro","title":"Direito autoral brasileiro","text":"

    N\u00e3o \u00e9 necess\u00e1rio registro. N\u00e3o vale para ideias.

    • Direito moral:
      • assegura a autoria da obra ao autor original
      • integridade da obra
      • instransfer\u00edvel e irrevog\u00e1vel
    • Direito patrimonial:
      • explora\u00e7\u00e3o econ\u00f4mica da obra.
      • licenciado ou cedido
      • copyright em ingl\u00eas
    "},{"location":"lessons/12-licenses/slides/#por-que-isto-e-importante","title":"Por que isto \u00e9 importante?","text":"

    O dono dos direitos autorais (patrimoniais) pode controlar:

    1. Distribui\u00e7\u00e3o, parcial ou total;
    2. Cria\u00e7\u00e3o de obras derivadas
    3. Reprodu\u00e7\u00e3o (execu\u00e7\u00e3o)
    "},{"location":"lessons/12-licenses/slides/#por-que-isto-e-importante_1","title":"Por que isto \u00e9 importante?","text":"

    De quem \u00e9 o c\u00f3digo nos seguintes cen\u00e1rios?

    "},{"location":"lessons/12-licenses/slides/#um-funcionario-trabalhando-para-uma-empresa-produz-sotfware-durante-o-expediente","title":"Um funcion\u00e1rio trabalhando para uma empresa produz sotfware durante o expediente.","text":""},{"location":"lessons/12-licenses/slides/#por-que-isto-e-importante_2","title":"Por que isto \u00e9 importante?","text":"

    De quem \u00e9 o c\u00f3digo nos seguintes cen\u00e1rios?

    "},{"location":"lessons/12-licenses/slides/#um-funcionario-trabalhando-para-uma-empresa-produz-sotfware-fora-do-expediente-e-decide-lancar-um-produto-nao-relacionado","title":"Um funcion\u00e1rio trabalhando para uma empresa produz sotfware fora do expediente e decide lan\u00e7ar um produto n\u00e3o relacionado.","text":""},{"location":"lessons/12-licenses/slides/#por-que-isto-e-importante_3","title":"Por que isto \u00e9 importante?","text":"

    De quem \u00e9 o c\u00f3digo nos seguintes cen\u00e1rios?

    "},{"location":"lessons/12-licenses/slides/#um-funcionario-trabalhando-para-uma-empresa-produz-sotfware-fora-do-expediente-e-decide-lancar-um-produto-concorrente","title":"Um funcion\u00e1rio trabalhando para uma empresa produz sotfware fora do expediente e decide lan\u00e7ar um produto concorrente.","text":""},{"location":"lessons/12-licenses/slides/#por-que-isto-e-importante_4","title":"Por que isto \u00e9 importante?","text":"

    De quem \u00e9 o c\u00f3digo nos seguintes cen\u00e1rios?

    "},{"location":"lessons/12-licenses/slides/#um-programador-faz-um-freelance-e-entrega-um-projeto-para-uma-empresa-ele-pode-reutilzar-parte-do-codigo-em-outros-projetos-para-outras-empresas","title":"Um programador faz um freelance e entrega um projeto para uma empresa. Ele pode reutilzar parte do c\u00f3digo em outros projetos (para outras empresas)?","text":""},{"location":"lessons/12-licenses/slides/#por-que-isto-e-importante_5","title":"Por que isto \u00e9 importante?","text":"

    De quem \u00e9 o c\u00f3digo nos seguintes cen\u00e1rios?

    "},{"location":"lessons/12-licenses/slides/#um-prestador-de-servicos-contratado-como-empresa-via-cnpj-participa-de-um-projeto-terceirizado-junto-com-outros-pjs","title":"Um prestador de servi\u00e7os (contratado como empresa via CNPJ) participa de um projeto terceirizado, junto com outros PJs.","text":""},{"location":"lessons/12-licenses/slides/#por-que-isto-e-importante_6","title":"Por que isto \u00e9 importante?","text":"

    Nenhum dos casos acima tem respostas fixas. Tudo depende de um monte de fatores jur\u00eddicos e do qu\u00ea cada um assinou. Alguns guias interessantes:

    • Association of Software Professionals
    • Start-se
    • Legal Nature - EULA
    "},{"location":"lessons/12-licenses/slides/#contexto-1-propriedade-intelectual-e-work-for-hire","title":"Contexto 1: Propriedade intelectual e work-for-hire","text":"
    • Contexto brasilero: \"Pela nossa lei de software, a n\u00e3o ser que expressamente dito o contr\u00e1rio, aquele que contrata o desenvolvimento \u00e9 titular original do software resultante\" [1]
    • Contexto americano: work-for-hire determina que software feito sob encomenda pertence a quem contratou o servi\u00e7o [2]

    Fontes 1 2

    "},{"location":"lessons/12-licenses/slides/#contexto-2-projetos-open-source","title":"Contexto 2: projetos open source","text":"

    Contributor License Agreement \u00e9 um documento de cess\u00e3o de copyright (direitos de explora\u00e7\u00e3o comercial).

    • D\u00e1 ao projeto uma licen\u00e7a n\u00e3o exclusiva (normalmente) e irrevog\u00e1vel para o projeto explorar sua contribui\u00e7\u00e3o
    • Mant\u00e9m autoria
    • Isenta o projeto de responsabilidades sobre suas contribui\u00e7\u00f5es
    "},{"location":"lessons/12-licenses/slides/#contexto-3-comercializacao-de-software","title":"Contexto 3: comercializa\u00e7\u00e3o de software","text":"

    End User License Agreement (EULA): Termo usado para aquelas condi\u00e7\u00f5es que (n\u00e3o lemos) aceitamos ao instalar software propriet\u00e1rio ou nos registramos em um site/servi\u00e7o.

    "},{"location":"lessons/12-licenses/slides/#_1","title":"Licen\u00e7as de software","text":"

    Ignorado por aproximadamente 90% dos usu\u00e1rios (fonte)

    "},{"location":"lessons/12-licenses/slides/#end-user-license-agreement","title":"End User License Agreement","text":"

    E por algumas empresas... Fonte

    "},{"location":"lessons/12-licenses/slides/#end-user-license-agreement_1","title":"End User License Agreement","text":"

    Restri\u00e7\u00f5es t\u00edpicas encontradas em EULAs:

    • Software \u00e9 licenciado, n\u00e3o vendido;
    • \u00c9 proibido engenharia reversa
    • N\u00e3o pode modificar ou explorar limita\u00e7\u00f5es / vulnerabilidades
    • Isenta responsabilidades pelo (mau) uso do software
    "},{"location":"lessons/12-licenses/slides/#eula-servicos","title":"EULA (servi\u00e7os)","text":"

    Informa\u00e7\u00f5es t\u00edpicas encontradas em EULAs de servi\u00e7os:

    • Restri\u00e7\u00f5es de idade;
    • Uso dos dados coletados:
    • T\u00e9rmino unilateral do servi\u00e7o
    • Garantias de disponibilidade e responsabilidade

    Legal Nature - EULA

    "},{"location":"lessons/12-licenses/slides/#eula-aws","title":"EULA (AWS)","text":"

    fonte: https://aws.amazon.com/service-terms/

    "},{"location":"lessons/12-licenses/slides/#um-pouco-de-historia","title":"Um pouco de hist\u00f3ria","text":""},{"location":"lessons/12-licenses/slides/#um-pouco-de-historia-1985","title":"Um pouco de hist\u00f3ria - 1985","text":"
    • GNU Manifesto: descrevia um esfor\u00e7o em criar um sistema completamente livre cujo destino estivesse nas m\u00e3os dos usu\u00e1rios
    • GNU/Hurd: todas as ferramentas de linha de comando das distribui\u00e7\u00f5es modernas vieram desse projeto
    • Desenvolvimento e distribui\u00e7\u00e3o centralizada
    "},{"location":"lessons/12-licenses/slides/#um-pouco-de-historia-1990","title":"Um pouco de hist\u00f3ria - 1990","text":"
    • Linus Torvalds tinha um kernel experimental \"pronto\"
    • Liberava uma vers\u00e3o nova toda semana
    • Recebia contribui\u00e7\u00f5es de outros interessados
    • Desenvolvimento e distribui\u00e7\u00e3o participativos
    "},{"location":"lessons/12-licenses/slides/#um-pouco-de-historia_1","title":"Um pouco de hist\u00f3ria","text":"

    Leitura complementar: Free Software, Free Society: Selected Essays of Richard M. Stallman.

    "},{"location":"lessons/12-licenses/slides/#um-pouco-de-historia_2","title":"Um pouco de hist\u00f3ria","text":"

    Leitura complementar: Just for Fun: The Story of an Accidental Revolutionary, Linus Torvalds and David Diamond

    "},{"location":"lessons/12-licenses/slides/#licencas-de-software-livre","title":"Licen\u00e7as de software (livre)","text":"

    Criadas pela Free Software Foundation visando garantir 4 liberdades para um usu\u00e1rio ao usar um software:

    1. Execu\u00e7\u00e3o sem restri\u00e7\u00f5es
    2. Estudo e modifica\u00e7\u00e3o do software;
    3. Redistribuir c\u00f3pias;
    4. Redistribuir c\u00f3pias das suas modifica\u00e7\u00f5es.

    Distribuir os fontes \u00e9 pr\u00e9-requisito dos itens 1 e 3!

    Chamadas tamb\u00e9m de rec\u00edprocas.

    "},{"location":"lessons/12-licenses/slides/#licencas-de-software-livre_1","title":"Licen\u00e7as de software (livre)","text":""},{"location":"lessons/12-licenses/slides/#licencas-de-software-livre-reciprocas","title":"Licen\u00e7as de software livre - rec\u00edprocas","text":"
    • Copyleft: S\u00edmbolo \u00e9 o contr\u00e1rio do copyright, cujo objetivo seria restringir os usu\u00e1rios
    • muitos apoiadores tamb\u00e9m tem uma postura anti-comercial
    • obriga a contribui\u00e7\u00e3o de volta para a comunidade
    • procura empoderar TODOS os envolvidos na comunidade
    • Principal figura: Richard Stallman
    "},{"location":"lessons/12-licenses/slides/#open-source-iniciative","title":"Open Source Iniciative","text":"
    • Fundada para difundir um discurso menos anti-comercial e ideol\u00f3gico
    • Tamb\u00e9m difunde benef\u00edcios \"pragm\u00e1ticos\" do uso de software \"de c\u00f3digo aberto\"
    • Free causa confus\u00e3o em ingl\u00eas
      • Gr\u00e1tis (free as in beer)
      • Livre (free as in freedom)
    • Fundada por Eric Raymond e Bruce Perens
    "},{"location":"lessons/12-licenses/slides/#licencas-de-software-de-codigo-aberto","title":"Licen\u00e7as de software de c\u00f3digo aberto","text":"

    Mais associadas a Open Source Iniciative, s\u00e3o consideradas menos \"ideol\u00f3gicas\".

    • Muitas vezes chamadas de permissivas;
    • Normalmente n\u00e3o garatem a liberdade 3;
    • Podem fazer outras pequenas exig\u00eancias ou restri\u00e7\u00f5es

    Exemplos: MIT, BSD

    • Permitem a distribui\u00e7\u00e3o de software com partes propriet\u00e1rias
    • Permitem a venda e completo rebranding do software sem nenhuma contribui\u00e7\u00e3o para o autor original.
    "},{"location":"lessons/12-licenses/slides/#licencas-qual-usar","title":"Licen\u00e7as: qual usar?","text":"

    https://choosealicense.com/licenses/

    "},{"location":"lessons/12-licenses/slides/#desenvolvimento-aberto_1","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/12-licenses/slides/#licencas-de-software_3","title":"Licen\u00e7as de Software","text":""},{"location":"lessons/12-licenses/slides/#20232-igor-montagner-igorsm1insperedubr_1","title":"2023/2: Igor Montagner ( igorsm1@insper.edu.br) )","text":""},{"location":"plugins/notification/","title":"Toast Notifications","text":"

    This page illustrates how to create toast (or snackbar) notifications. This is intended for plugin development and probably shouldn't be called directly from the markdown content.

    In your plugin, whenever you want to show a toast notification, just call notification.toast():

    notification.toast(\"Go crazy!\", { bgColor: \"#FFFF00\", color: \"#ff4498\" });\nnotification.toast('bgColor \"danger\"', { bgColor: \"danger\" });\nnotification.toast(\"Notification with click event (reload page)\", {\n  onClick: () => window.location.reload(),\n});\nnotification.toast(\"Toasts have an optional timeout argument\", {\n  timeout: 3000,\n});\n

    The following values are accepted for bgColor:

    • primary (your theme's primary color)
    • note
    • abstract
    • summary
    • tldr
    • info
    • todo
    • tip
    • hint
    • important
    • success
    • check
    • done
    • question
    • help
    • faq
    • warning
    • caution
    • attention
    • failure
    • fail
    • missing
    • danger
    • error
    • bug
    • example
    • quote
    • cite
    • a color in hex notation (e.g. \"#FF00FF\")
    "}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Open Development 2024/2","text":"

    Welcome to the Open Development page for 2024/2. On this site, you will find all the course lessons and syllabus. The learning objectives covered are:

    1. The student is capable of understanding a software project and fixing a bug or implementing an improvement.
    2. The student is capable of making modifications that meet the technical and non-technical requirements of a software project.
    3. The student is capable of interacting with a (remote) development team.

    This course is gamified and entirely done using a git repository. Each student creates a user following the instructions in Lesson 01 and submits a Pull Request to be included in the repository. Each completed activity is delivered via a PR in the course repository and serves as evidence for the learning objectives mentioned above.

    The course revolves around four types of activities:

    • Tutorial: (Guided) Preparatory activities in the classroom.
    • Code: Code contributions to external projects.
    • Community: Non-technical contributions that can benefit users and developers of a project, such as documentation and translations.
    • Impact: Significant results achieved through the student's participation in open projects.

    More information about all possible activities can be found on the Assessment page.

    Current and past instructors

    • Igor Montagner
    • Fabr\u00edcio Barth
    "},{"location":"agenda_apresentacoes/","title":"Apresenta\u00e7\u00f5es sobre cultura livre","text":"

    Este documento descreve a rubrica para avalia\u00e7\u00e3o do trabalho e a agenda das apresenta\u00e7\u00f5es.

    "},{"location":"agenda_apresentacoes/#rubrica","title":"Rubrica","text":"Conceito Descri\u00e7\u00e3o A Apresenta\u00e7\u00e3o realizada dentro do tempo estipulado. O tema foi organizado de forma excelente, com boa sequ\u00eancia l\u00f3gica das ideias. O trabalho foi apresentado de forma clara e concisa, usando so slides de forma coesa com a fala. Tem boa postura e seguran\u00e7a, estabelece contato visual com os participantes durante a apresenta\u00e7\u00e3o. Incorporou elementos visuais de qualidade no material: figuras, tabelas e gr\u00e1ficos s\u00e3o claros e cont\u00eam informa\u00e7\u00f5es suficientes. Fez uso de no m\u00ednimo uma t\u00e9cnica para intera\u00e7\u00e3o com a audi\u00eancia (por exemplo, debate, painel com vota\u00e7\u00f5es, entre outros). B O tempo de apresenta\u00e7\u00e3o foi de mais ou menos 5 min do estabelecido. O tema foi parcialmente bem organizado, com sequ\u00eancia de apresenta\u00e7\u00e3o razo\u00e1vel. Exp\u00f5e o trabalho corretamente, mas n\u00e3o usa os slides de forma coesa com a fala. Postura e seguran\u00e7a razo\u00e1veis. Os elementos visuais s\u00e3o de baixa qualidade: figuras, tabelas e gr\u00e1ficos n\u00e3o s\u00e3o totalmente claros e n\u00e3o cont\u00eam informa\u00e7\u00f5es suficientes para compreens\u00e3o. Fez uso de no m\u00ednimo uma t\u00e9cnica para intera\u00e7\u00e3o com a audi\u00eancia (por exemplo, debate, painel com vota\u00e7\u00f5es, entre outros). C Tempo de apresenta\u00e7\u00e3o foi de mais ou menos 10 min do estabelecido. A organiza\u00e7\u00e3o da apresenta\u00e7\u00e3o \u00e9 confusa, o que prejudica o acompanhamento e compreens\u00e3o das ideias. Comunica\u00e7\u00e3o deficiente, com dificuldade de expor ideias. N\u00e3o usa adequadamente os slides. N\u00e3o tem boa postura e seguran\u00e7a durante a apresenta\u00e7\u00e3o. Os recursos visuas prejudicam a apresenta\u00e7\u00e3o. Fez uso de no m\u00ednimo uma t\u00e9cnica para intera\u00e7\u00e3o com a audi\u00eancia (por exemplo, debate, painel com vota\u00e7\u00f5es, entre outros)."},{"location":"agenda_apresentacoes/#agenda","title":"Agenda","text":"Data e hor\u00e1rio Tema 17/11 (9:45-10:45) GitHub Copilot \u00e9 \u00e9tico? [Eiki Yamashiro e Marcelo Miguel] 17/11 (10:45-11:45) A rela\u00e7\u00e3o entre Software as a Service (SaaS) e projetos de C\u00f3digo Aberto [Caroline Chaim, Felipe Lemos, Jo\u00e3o Farias Araujo] 22/11 (9:45-10:45) Telemetria \u00e9 \"\u00e9tico\"? [Guilherme Lunetta, Rafael Monteiro e Jo\u00e3o Magalh\u00e3es] 22/11 (10:45-11:45) Regulamenta\u00e7\u00f5es futuras na Europa sobre responsabilidade legal dos criadores de IAs [Luiza Silvera, Guilherme Batista e Gabriel Zanetti] 24/11 N\u00e3o teremos aula. Joga do Brasil na Copa do Mundo 29/11 (9:45-10:45) Regulamenta\u00e7\u00f5es recentes na Europa sobre durabilidade de smartphones. [Keiya Nishio e Bruno Freitas] 29/11 (10:45-11:45) Por que Open Source \u00e9 cr\u00edtico para criptomoedas? [Paulo Kim, Raphael Lahiry e Rodrigo Coelho] 01/12 (9:45-10:45) The new open-source economics (Yochai Benkler, 2005). O que mudou de 2005 para 2022? [Jo\u00e3o Pedro Meirelles, Gustavo Molina e Rafael Almada] 01/12 (10:45-11:45) Mantainer burnout [Cesar Ades e Jonathan Sutton]"},{"location":"assessment/","title":"Assessment","text":"

    As you can see in Lesson 01, this course allows for a great deal of freedom, and it is organized through gamification. Each participant creates a profile in the repository and earns skills (and XP) by completing the available activities. All submissions are made via PR to the course repository.

    The final grade is a combination of the total amount of XP received for completing tasks, the amount of XP obtained from group members, and some barrier criteria. The table below summarizes these conditions:

    Grade Score Extra Criteria I ---- Did not complete any tutorial activities D ---- Completed all lesson activities but did not reach a C grade C 45XP
  • 1 x Code Contribution +
  • Accepted Translation! or Documentation Contribution
  • B 90XP
  • Accepted Code Contribution
  • A 150XP A+ 200XP

    Throughout the semester, the scores in the table above may be revised downward, but never upward.

    "},{"location":"assessment/#available-skills","title":"Available Skills","text":"

    Each skill translates into evidence for one of the learning objectives of the course. The collection of all the skills completed during the semester indicates the proficiency of the students in each of the objectives.

    "},{"location":"assessment/#tutorial","title":"Tutorial","text":"

    In this initial part, preparatory activities are carried out to support the development of skills in Code and Community skills.

    id Name Description XP Date 1 First Steps Added to the discipline's repository. 2 25/09 2 Exploring a Project's Environment Researched the history and community of people and services around a project. 3 25/09 3 Undocumented Project Received an undocumented system and got it up and running. 5 25/09 4 Professional Project Refactored poorly written code and created a web page for it. 5 25/09 5 Tested and Approved Created unit tests and interface tests for the challenge server. 5 25/09 6 Python Package Created a Python package installable via pip. 3 25/09 7 Dockerfile Created automated deployment for a Python web system. 3 25/09 8 Basic Translation Used translation tools to translate and localize a small command-line program. 2 25/09 10 FLOSS Research Delivered a long presentation on a recent and relevant topic related to free and open-source software. 5 04/12 11 Better code Addressed linting problems in a poorly written project 5 25/09 12 Release created Created a release and published a binary package for users 5 25/09"},{"location":"assessment/#code","title":"Code","text":"

    Any activity that results in a code contribution to open-source software projects is accepted in the course.

    id Name Description XP Date 21 Code Contribution Submitted a pull request fixing a bug. 7 04/12 22 Contribution Accepted! A non-trivial pull request was accepted by an external project. 13 04/12 23 Simple Contribution Accepted! A simple pull request (with trivial changes or small code refactorings) was accepted by an external project. 3 04/12 24 Bug Report Reported a bug in a repository, and another user was able to reproduce it. 5 04/12 25 Feature Request Made a request for a new feature in a software. 2 04/12 26 INSPER Project Made additional contributions to an INSPER educational project. 5 04/12"},{"location":"assessment/#community","title":"Community","text":"

    A software project is also defined by the interactions of all the people around it: users, developers, and translators. This category includes non-technical contributions that benefit these individuals.

    id Name Description XP Date 40 Indirect Issue Conversations in an issue or pull request led other users to open issues reporting new bugs/improvements. 3 04/12 41 Beta Tester When reproducing a bug, you discovered that it had already been fixed and caused the closure of an issue. 3 04/12 42 Translation Accepted! Made a translation that was accepted in an open-source software. 5 04/12 43 New Languages Added support for translations in a previously non-translatable software. 10 04/12 44 Reviewer Reviewed minor errors in the documentation of a project, and your modifications were accepted. 2 04/12 45 Documentation Contribution Closed an issue marked as docs. 7 04/12 46 Project Pitch Delivered a project pitch. 0 04/12 47 Pitch Accepted! Contributed to a project presented in class. 5 04/12 48 Accepted Suggestion! Another student contributed to the project you pitched. 3 04/12 49 PR Replay Presented (in 15 minutes) the process of resolving a bug in class. 5 04/12"},{"location":"assessment/#impact","title":"Impact","text":"

    This category encompasses skills that represent the impact generated by the activities performed within the context of the course, both on a software project and the community around it. This includes:

    1. Presentations given by students
    2. A large number of accepted contributions to a single project
    3. Mentions of work done by the student on the project's social media
    4. Releases containing commits made within the course's context
    id Name Description XP Date 60 Speaker Gave a talk about libraries or open-source software. 20 04/12 61 Helpdesk Had an accepted answer on sites like StackOverflow or email lists. 4 04/12 62 Published Contribution One of your contributions was included in a release. 10 04/12 63 VIP Guest After making a contribution, someone from the project asked you to perform a task. After delivering the task, add this skill. 5 04/12 64 3 Submitted PRs Submitted 3 pull requests to the same project. 10 04/12 65 3 Accepted PRs 3 pull requests you submitted to a project were accepted. 30 04/12 66 Shoutout Something you did was mentioned by the project on social media or through an official channel. 10 04/12 77 Hacktoberfest Participated in Hacktoberfest by submitting 3 pull requests to external projects. 20 04/12"},{"location":"impact-2019/","title":"Edi\u00e7\u00e3o 2019/2","text":"

    In the 2019/2 edition, students worked on 19 different projects, contributing with 46 code modifications, of which 14 were incorporated into the original projects. In addition to these projects, students also worked on the Servidor de Desafios, a software developed by Insper professors to be used in the Software Design course. A total of 12 accepted modifications have already been used during the semester.

    We also encourage students to participate in external technology events and experience the world outside Insper. In total, students participated in 10 events.

    "},{"location":"impact-2019/#alunos","title":"Alunos","text":"Alessandra Bl\u00fccher Alexandre Edington Antonio Jo\u00e3o Andraues Junior Elisa Mochetti Malzoni Gabriel Lopes Monteiro Gabriel Do Vale Rios Giulia Braga Passarelli Guilherme Leite Hugo Ebert Carl Igor Montagner Leonardo Pereira Medeiros Lucas Scarlato Astur Pedro Cunial Campos Samuel Vinicius Granato De Barros Vinicius Gomes De Lima Vitor Liu"},{"location":"impact-2019/#contribuicoes-de-codigo","title":"Contribui\u00e7\u00f5es de c\u00f3digo","text":"Servidor de desafios
    • https://github.com/Insper/servidor-de-desafios/pull/28 (Elisa Mochetti Malzoni)
    • https://github.com/Insper/servidor-de-desafios/pull/20 (Pedro Cunial Campos)
    • https://github.com/Insper/servidor-de-desafios/issues/13 (Leonardo Pereira Medeiros)
    • https://github.com/Insper/servidor-de-desafios/pull/26 (Samuel Vinicius Granato De Barros)
    • https://github.com/Insper/servidor-de-desafios/pull/30 (Guilherme Leite)
    • https://github.com/Insper/servidor-de-desafios/pull/27 (Alessandra Bl\u00fccher)
    • (Lucas Scarlato Astur)
    • https://github.com/Insper/LogCompTester/issues/2 (Lucas Scarlato Astur)
    • https://github.com/Insper/servidor-de-desafios/pull/29 (Vitor Liu)
    • https://github.com/Insper/servidor-de-desafios/pull/23 (Alexandre Edington)
    • https://github.com/Insper/servidor-de-desafios/pull/32 (Giulia Braga Passarelli)
    • https://github.com/Insper/servidor-de-desafios/pull/38 (Gabriel Do Vale Rios)
    Pandas Pull Requests
    • - https://github.com/pandas-dev/pandas/pull/28183
    • - https://github.com/pandas-dev/pandas/pull/29193
    • - https://github.com/pandas-dev/pandas/pull/29191
    • - https://github.com/pandas-dev/pandas/pull/29087
    • - https://github.com/pandas-dev/pandas/pull/27934
    • - https://github.com/pandas-dev/pandas/pull/28091
    • - https://github.com/pandas-dev/pandas/pull/28032
    • - https://github.com/pandas-dev/pandas/pull/29201
    • - https://github.com/pandas-dev/pandas/pull/28659
    • - https://github.com/pandas-dev/pandas/pull/28265
    • - https://github.com/pandas-dev/pandas/pull/28632
    • - https://github.com/panddev/pandas/pull/28296
    • - https://github.com/lucassa3/pandas/pull/1
    • - https://github.com/pandas-dev/pandas/pull/29701
    • - https://github.com/pandas-dev/pandas/pull/27933
    • - https://github.com/pandas-dev/pandas/pull/29266
    • - https://github.com/pandas-dev/pandas/pull/28696
    • - https://github.com/pandas-dev/pandas/pull/28172
    Issues
    • - https://github.com/pandas-dev/pandas/issues/28218
    Multi-Deployer Issues
    • - https://github.com/HenriquePereiraRosa/multi-deployer/issues/5
    • - https://github.com/HenriquePereiraRosa/multi-deployer/issues/9
    • - https://github.com/HenriquePereiraRosa/multi-deployer/issues/10
    • - https://github.com/HenriquePereiraRosa/multi-deployer/issues/21
    Pull Requests
    • - https://github.com/HenriquePereiraRosa/multi-deployer/pull/6
    • - https://github.com/HenriquePereiraRosa/multi-deployer/pull/12
    • - https://github.com/HenriquePereiraRosa/multi-deployer/pull/11
    • - https://github.com/HenriquePereiraRosa/multi-deployer/pull/7
    • - https://github.com/HenriquePereiraRosa/multi-deployer/pull/22
    • - https://github.com/HenriquePereiraRosa/multi-deployer/pull/23
    • - https://github.com/HenriquePereiraRosa/multi-deployer/pull/24
    • - https://github.com/HenriquePereiraRosa/multi-deployer/pull/26
    • - https://github.com/HenriquePereiraRosa/multi-deployer/pull/15
    • - https://github.com/HenriquePereiraRosa/multi-deployer/pull/28
    • - https://github.com/HenriquePereiraRosa/multi-deployer/pull/13
    Python-Ds Pull Requests
    • - https://github.com/prabhupant/python-ds/pull/250
    • - https://github.com/prabhupant/python-ds/pull/247
    Issues
    • - https://github.com/prabhupant/python-ds/issues/248
    Backtesting Pull Requests
    • - https://github.com/raulikeda/Backtesting/pull/23
    • - https://github.com/raulikeda/Backtesting/pull/22
    Loopdocs Pull Requests
    • - https://github.com/LoopKit/loopdocs/pull/111
    Osu Issues
    • - https://github.com/ppy/osu/issues/6571
    Pull Requests
    • - https://github.com/ppy/osu/issues/2510
    Lector Pull Requests
    • - https://github.com/BasioMeusPuga/Lector/pull/113
    Spacemacs Pull Requests
    • - https://github.com/syl20bnr/spacemacs/pull/12674
    Enzyme Pull Requests
    • - https://github.com/airbnb/enzyme/pull/2271
    Sherlock Pull Requests
    • - https://github.com/sherlock-project/sherlock/pull/372
    Twitter-Scraper Pull Requests
    • - https://github.com/bisguzar/twitter-scraper/pull/80
    Discord-Bot Pull Requests
    • - https://github.com/RPCS3/discord-bot/pull/435
    Scikit-Image Pull Requests
    • - https://github.com/scikit-image/scikit-image/pull/4126
    Issues
    • - https://github.com/scikit-image/scikit-image/issues/4125
    Python-Scripts Pull Requests
    • - https://github.com/ankitdobhal/Python-Scripts/pull/64
    Aos-Reminders Pull Requests
    • - https://github.com/daviseford/aos-reminders/pull/219
    Calcurse Pull Requests
    • - https://github.com/lfos/calcurse/pull/229
    Issues
    • - https://github.com/lfos/calcurse/issues/228
    Scikit-Learn Pull Requests
    • - https://github.com/scikit-learn/scikit-learn/pull/15327
    Nightguard Issues
    • - https://github.com/nightscout/nightguard/issues/61
    Dev-Aberto Issues
    • - https://github.com/Insper/dev-aberto/issues/67
    "},{"location":"impact-2019/#eventos","title":"Eventos","text":""},{"location":"impact-2020/","title":"2020/1","text":"

    In the 2020/1 edition, students worked on 15 different projects, contributing with 27 code modifications, of which 17 were incorporated into the original projects. In addition to these projects, students also worked on the Challenge Server, a software developed by Insper professors to be used in the Software Design course. A total of 7 accepted modifications have already been used during the semester.

    "},{"location":"impact-2020/#alunos","title":"Alunos","text":"Isabella Rocha De Oliveira Bruna Mayumi Kimura Bruno Arthur Cesconetto Eli Jose Abi Ghosn Eric Fernando Otofuji Abrantes Francisco Ciol Rodrigues Aveiro Gabriel Fonseca Moreira Gabriel Valente Francato Hugo Silva Pereira Mendes Igor Dos Santos Montagner Lucca Delchiaro Costabile Martim Ferreira Jose Pedro De La Pe\u00f1a Ferreira Bueno Fonseca Pedro Oliveira De Azambuja Raphael Costa Sabrina Sampaio Simao Victor Laperuta De Moura"},{"location":"impact-2020/#contribuicoes","title":"Contribui\u00e7\u00f5es Melhorias de c\u00f3digo enviadas","text":"Servidor de desafios
    • https://github.com/Insper/servidor-de-desafios/pull/75 (Pedro De La Pe\u00f1a Ferreira Bueno Fonseca)
    • https://github.com/Insper/servidor-de-desafios/pull/72 (Gabriel Valente Francato)
    • https://github.com/Insper/servidor-de-desafios/pull/73 (Gabriel Fonseca Moreira)
    • https://github.com/Insper/servidor-de-desafios/pull/83 (Francisco Ciol Rodrigues Aveiro)
    • https://github.com/Insper/servidor-de-desafios/pull/66 (Pedro Oliveira De Azambuja)
    • https://github.com/Insper/servidor-de-desafios/pull/82 (Martim Ferreira Jose)
    • https://github.com/Insper/servidor-de-desafios/pull/67 (Sabrina Sampaio Simao)
    Pygame/Pygame Pull Requests
    • - https://github.com/pygame/pygame/pull/1909
    • - https://github.com/pygame/pygame/pull/1960
    • - https://github.com/pygame/pygame/pull/1911
    • - https://github.com/pygame/pygame/pull/1923
    • - https://github.com/pygame/pygame/pull/1912
    Pandas-Dev/Pandas Pull Requests
    • - https://github.com/pandas-dev/pandas/pull/32451
    • - https://github.com/pandas-dev/pandas/pull/34267
    • - https://github.com/pandas-dev/pandas/pull/34377
    • - https://github.com/pandas-dev/pandas/pull/34450
    • - https://github.com/pandas-dev/pandas/pull/34812
    Elementary/Code Pull Requests
    • - https://github.com/elementary/code/issues/818
    • - https://github.com/elementary/code/pull/832
    • - https://github.com/elementary/code/pull/833
    Dgilland/Pydash Pull Requests
    • - https://github.com/dgilland/pydash/pull/137
    • - https://github.com/dgilland/pydash/pull/139
    • - https://github.com/dgilland/pydash/pull/138
    Insper/Projeto-Campo-Favela Pull Requests
    • - https://github.com/Insper/projeto-campo-favela/pull/27
    • - https://github.com/Insper/projeto-campo-favela/pull/24
    Hospitalrun/Hospitalrun-Frontend Pull Requests
    • - https://github.com/HospitalRun/hospitalrun-frontend/pull/1983
    • - https://github.com/HospitalRun/hospitalrun-frontend/pull/1977
    Issues
    • - https://github.com/HospitalRun/hospitalrun-frontend/issues/1940
    Bokeh/Bokeh Pull Requests
    • - https://github.com/bokeh/bokeh/pull/10173
    Elementary/Terminal Pull Requests
    • - https://github.com/elementary/terminal/pull/486
    Matplotlib/Matplotlib Pull Requests
    • - https://github.com/matplotlib/matplotlib/pull/16985
    Sorxrob/Covid3D Issues
    • - https://github.com/sorxrob/covid3d/issues/13
    Pull Requests
    • - https://github.com/sorxrob/covid3d/pull/8
    Trekhleb/Covid-19 Pull Requests
    • - https://github.com/trekhleb/covid-19/pull/38
    Elementary/Files Pull Requests
    • - https://github.com/elementary/files/pull/1242
    Antiboomz/Btroblox Pull Requests
    • - https://github.com/AntiBoomz/BTRoblox/pull/24
    Elementary/Appcenter Issues
    • - https://github.com/elementary/appcenter/issues/1321
    Darkreader/Darkreader Issues
    • - https://github.com/darkreader/darkreader/issues/2858
    "},{"location":"impact-2021/","title":"2021/2","text":"

    One of the main objectives of Open Development is to actively participate in existing software projects. In the 2021/2 edition, students worked on 30 different projects, contributing with 56 code modifications, of which 37 were incorporated into the original projects. In addition to these projects, students also worked on software developed by Insper professors to be used in various courses. A total of 0 modifications were accepted in these projects.

    We also encourage students to participate in external technology events and experience the world outside Insper. In total, students participated in 0 events.

    Melhorias de c\u00f3digo enviadas Uutils/Coreutils Pull Requests
    • - https://github.com/uutils/coreutils/pull/2693
    • - https://github.com/uutils/coreutils/pull/2703
    • - https://github.com/uutils/coreutils/pull/2704
    • - https://github.com/uutils/coreutils/pull/2726
    • - https://github.com/uutils/coreutils/pull/2727
    • - https://github.com/uutils/coreutils/pull/2728
    • - https://github.com/uutils/coreutils/pull/2731
    • - https://github.com/uutils/coreutils/pull/2735
    • - https://github.com/uutils/coreutils/pull/2742
    • - https://github.com/uutils/coreutils/pull/2743
    • - https://github.com/uutils/coreutils/pull/2745
    • - https://github.com/uutils/coreutils/pull/2749
    Pandas-Dev/Pandas Pull Requests
    • - https://github.com/pandas-dev/pandas/pull/44806
    • - https://github.com/pandas-dev/pandas/pull/44033
    • - https://github.com/pandas-dev/pandas/pull/44927
    • - https://github.com/pandas-dev/pandas/pull/43791
    • - https://github.com/pandas-dev/pandas/pull/44200
    Robertodoering/Harpy Pull Requests
    • - https://github.com/robertodoering/harpy/pull/471
    • - https://github.com/robertodoering/harpy/pull/473
    • - https://github.com/robertodoering/harpy/pull/474
    • - https://github.com/robertodoering/harpy/pull/483
    Elementary/Code Issues
    • - https://github.com/elementary/code/issues/1096
    Pull Requests
    • - https://github.com/elementary/code/pull/1097
    • - https://github.com/elementary/code/pull/1100
    • - https://github.com/elementary/code/pull/1101
    Outros Pull Requests
    • https://github.com/readthedocs/readthedocs.org/pull/8591
    • https://github.com/plotly/plotly.py/pull/3508
    Backstage/Backstage Pull Requests
    • - https://github.com/backstage/backstage/pull/7594
    • - https://github.com/backstage/backstage/pull/8156
    Nuta/Nsh Pull Requests
    • - https://github.com/nuta/nsh/pull/32
    • - https://github.com/nuta/nsh/pull/37
    Iamashutosh99/Basic-Cpp-Course Pull Requests
    • - https://github.com/iamashutosh99/basic-cpp-course/pull/23
    • - https://github.com/iamashutosh99/basic-cpp-course/pull/22
    Alteryx/Featuretools Pull Requests
    • - https://github.com/alteryx/featuretools/pull/1725
    • - https://github.com/alteryx/featuretools/pull/1733
    Centerofci/Mathesar Pull Requests
    • - https://github.com/centerofci/mathesar/pull/799
    • - https://github.com/centerofci/mathesar/pull/812
    Domokane/Financepy Pull Requests
    • - https://github.com/domokane/FinancePy/pull/121
    • - https://github.com/domokane/FinancePy/pull/119
    Issues
    • - https://github.com/domokane/FinancePy/issues/115
    Tsvillain/Wallbay Pull Requests
    • - https://github.com/tsvillain/Wallbay/pull/8
    • - https://github.com/tsvillain/Wallbay/pull/10
    Issues
    • - https://github.com/tsvillain/Wallbay/issues/7
    • - https://github.com/tsvillain/Wallbay/issues/9
    Numpy/Numpy Pull Requests
    • - https://github.com/numpy/numpy/pull/20389
    Edbmods/Edbpreparecarefully Pull Requests
    • - https://github.com/edbmods/EdBPrepareCarefully/pull/318
    Readthedocs/Common Pull Requests
    • - https://github.com/readthedocs/common/pull/98
    Simple-Icons/Simple-Icons Pull Requests
    • - https://github.com/simple-icons/simple-icons/pull/6825
    Epicmaxco/Vuestic-Admin Pull Requests
    • - https://github.com/epicmaxco/vuestic-admin/pull/845
    Epicmaxco/Vuestic-Ui Pull Requests
    • - https://github.com/epicmaxco/vuestic-ui/pull/1232
    Zulip/Zulip Pull Requests
    • - https://github.com/zulip/zulip/pull/19969
    Pyroscope-Io/Pyroscope Pull Requests
    • - https://github.com/pyroscope-io/pyroscope/pull/492
    Matrix-Org/Matrix-React-Sdk Pull Requests
    • - https://github.com/matrix-org/matrix-react-sdk/pull/6918
    Bootandy/Dust Pull Requests
    • - https://github.com/bootandy/dust/pull/198
    Streamlit/Streamlit Pull Requests
    • - https://github.com/streamlit/streamlit/pull/4051
    Godotengine/Godot Pull Requests
    • - https://github.com/godotengine/godot/pull/55801
    Vector-Im/Element-Desktop Pull Requests
    • - https://github.com/vector-im/element-desktop/pull/274
    Objectbox/Objectbox-Dart Pull Requests
    • - https://github.com/objectbox/objectbox-dart/pull/327
    Tiangolo/Fastapi Pull Requests
    • - https://github.com/tiangolo/fastapi/pull/4042
    Serverless/Serverless Pull Requests
    • - https://github.com/serverless/serverless/pull/10119
    Workalendar/Workalendar Issues
    • - https://github.com/workalendar/workalendar/issues/689
    Twopirllc/Pandas-Ta Issues
    • - https://github.com/twopirllc/pandas-ta/issues/423
    Eventos"},{"location":"impact-2022/","title":"2022/2","text":"

    One of the main objectives of Open Development is to actively participate in existing software projects. In the 2022/2 edition, students worked on 15 different projects, contributing with 20 code modifications, of which 4 were incorporated into the original projects. In addition to these projects, students also worked on software developed by Insper professors to be used in various courses. A total of 0 modifications were accepted in these projects.

    We also encourage students to participate in external technology events and experience the world outside Insper. In total, students participated in 0 events.

    Alunos participantes Bruno Freitas Do Nascimento Rodrigues Caroline Chaim De Lima Carneiro Cesar Ezra Ades Eiki Luis Yamashiro Fabricio Barth Felipe Lemos Gabriel Zanetti Guilherme Carneiro Lunetta Guilherme Teixeira Batista Gustavo Molina Freneda Benites Joao Pedro Farias De Araujo Joao Pedro Montefeltro Junqueira Meirelles Jo\u00e3o Vitor Menezes De Magalh\u00e3es Jonathan Sutton Keiya Nishio Luiza Rodrigues Silveira Marcelo Cesario Miguel Paulo Wook Kim Rafael Alves De Mello Almada Rafael Evangelista Monteiro Raphael Lahiry Rodrigo Guimar\u00e3es Coelho Melhorias de c\u00f3digo enviadas Geekquad/Algobook Pull Requests
    • - https://github.com/geekquad/AlgoBook/pull/563
    • - https://github.com/geekquad/AlgoBook/pull/561
    • - https://github.com/geekquad/AlgoBook/pull/562
    • - https://github.com/geekquad/AlgoBook/pull/564
    Data-8/Datascience Pull Requests
    • - https://github.com/data-8/datascience/pull/563
    • - https://github.com/data-8/datascience/pull/564
    • - https://github.com/data-8/datascience/pull/562
    Adafruit/Adafruit_Circuitpython_Requests Pull Requests
    • - https://github.com/adafruit/Adafruit_CircuitPython_Requests/pull/117
    Ros-Planning/Moveit2 Pull Requests
    • - https://github.com/ros-planning/moveit2/pull/1693
    Grafana/Oncall Pull Requests
    • - https://github.com/grafana/oncall/pull/790
    Neetcode-Gh/Leetcode Pull Requests
    • - https://github.com/neetcode-gh/leetcode/pull/1524
    Outros Pull Requests
    • https://github.com/jfilter/clean-text
    Vael1/-Awesome-Python-Scripts Pull Requests
    • - https://github.com/vael1/-Awesome-Python-Scripts/pull/27
    Civiwiki/Openciviwiki Pull Requests
    • - https://github.com/CiviWiki/OpenCiviWiki/pull/1469
    Aylton-Almeida/Rabbitmq-Pika-Flask Pull Requests
    • - https://github.com/aylton-almeida/rabbitmq-pika-flask/pull/47
    Nidhaloff/Deep-Translator Pull Requests
    • - https://github.com/nidhaloff/deep-translator/pull/166
    Kra53N/Getgit Pull Requests
    • - https://github.com/kra53n/getgit/pull/16
    Commons-App/Apps-Android-Commons Pull Requests
    • - https://github.com/commons-app/apps-android-commons/issues/5100
    Tbillington/Kondo Pull Requests
    • - https://github.com/tbillington/kondo/pull/66
    Matplotlib/Matplotlib Pull Requests
    • - https://github.com/matplotlib/matplotlib/pull/24576
    Eventos"},{"location":"impact/","title":"2023/2","text":"

    One of the main objectives of Open Development is to actively participate in existing software projects. In the 2023/2 edition, students worked on 1 different projects, contributing with 0 code modifications, of which 1 were incorporated into the original projects. In addition to these projects, students also worked on software developed by Insper professors to be used in various courses. A total of 0 modifications were accepted in these projects.

    We also encourage students to participate in external technology events and experience the world outside Insper. In total, students participated in 0 events.

    Code contributions Outros Issues
    • https://insper.github.io/mlops/contributions/
    Events"},{"location":"students/","title":"Students","text":"

    The following students are enrolled in this semester.

    Ananda J\u00falia Galv\u00e3o Campelo Andr\u00e9 Felipe Bulc\u00e3o Brito Andr\u00e9 Barboza Braga De Melo Andr\u00e9 Corr\u00eaa Santos Antonio Amaral Egydio Martins Arthur Martins De Souza Barreto Enricco Gemha Eric Andrei Lima Possato Fabr\u00edcio Barth Felipe Aron Nudelman Tabacinik Felipe Catapano Emrich Melo Fernando Alzueta Guilherme Dantas Rameh Guilherme Fontana Louro Igor Montagner Ilana Chaia Finger Jo\u00e3o Ant\u00f4nio Gomes Garcia Leonardo Merlin Paloschi Leonardo Scarlato Lidia Alves Chagas Domingos Lincoln Rodrigo Pereira Melo Lucas Hix Luis Antonio Santana Rodrigues Paulo Henrique Moreira Falc\u00e3o Pedro Bittar Bar\u00e3o Rafael Coca Leventhal Rafael Gordon Paves Rafael Estefam Melhado Araujo Lima Ricardo Ribeiro Rodrigues Rodrigo Anci\u00e3es Patelli Rodrigo Sennati Mattar Thiago Hampl De Pierri Rocha Yuri Tabacof"},{"location":"syllabus/","title":"Syllabus","text":""},{"location":"syllabus/#assessment","title":"Assessment","text":"

    This course has a gamified assessment system. At any time, you can check your grade by running:

    $ ./dev-aberto.py compute-grade your-blackboard-login

    Biweekly reports will be sent with a summary of what has been delivered and which criteria have been met, as well as the student's current grade. There is no possibility of losing points. Although the report is for informational purposes only, if the student is not failing due to absences, they should receive the grade indicated in the biweekly reports.

    Attention

    The complete list of rules is available on the Course Rules page and is the official reference for grade calculation. If there is a discrepancy between the report and the rules page, consider the report to be buggy.

    "},{"location":"syllabus/#schedule","title":"Schedule","text":"
    • MON 13:30 - 15:30
    • WED 13:30 - 15:30
    • Office Hours: on demand
    "},{"location":"syllabus/#student-support-hours","title":"Student support hours","text":"
    • WED 10:00 - 11:30
    "},{"location":"syllabus/#lesson-plan","title":"Lesson Plan","text":"

    The following activities are planned. The program is subject to changes and adaptations as the course progresses.

    Date Question/Problem/Challenge Content 14/08 Introduction to the course and its challenges Workflow with distributed version control: forks, patches, pull requests, and local repositories. Technical and non-technical aspects surrounding software: infrastructure, support, marketing, funding. Reference: FOGEL Ch. 3; Additional reading: TAPSCOTT & WILLIAMS. 19/08 First code contribution Workflow with distributed version control: ammend, rebase, revert. 21/08 Project documentation and what to do when it doesn't exist Types of documentation (user, developer). Source code documentation systems: doxygen, Javadoc, pydoc, sphinx; Reference: FOGEL Ch. 3 (Wikis, Website) 26/08 Studio class for \"Professional Project\" activity Studio class for \"Professional Project\" activity 28/08 Ensuring others can work on the project: API documentation code quality 02/09 Software distribution and versioning Software distribution tools. Types of distribution. Versioning schemes. Reference: FOGEL Ch. 7 04/09 How to make software work in multiple countries? Localization and internationalization. Gettext tool for translations and .po format. 09/09 Software testing Types of software testing: unit, integration, and interface. Testing tools: pytest, selenium. 11/09 Studio class for \"Software Testing\" activity Studio class for \"Software Testing\" activity 16/09 Software licenses Copyrights in Brazil, patents, and software licenses; Reference: LAURENT Ch. 1 and 5, STALLMAN Ch. 6 18/09 Introduction to contributions in open projects - Activity \"My First Contribution\" Studio class for group activity \"My First Contribution\" 23/09 Studio class for group activity \"My First Contribution\" Studio class for group activity \"My First Contribution\" 25/09 Studio class for group activity \"My First Contribution\" Studio class for group activity \"My First Contribution\" 30/09 EXAM WEEK EXAM WEEK 02/10 EXAM WEEK EXAM WEEK 07/10 Working in software communities Assessment metrics for the second part of the course; Communication and teamwork. Reference: RAYMOND Ch. 4 09/10 Course project Studio class for project development 14/10 Course project Studio class for project development 16/10 Course project Studio class for project development 21/10 Course project Studio class for project development 23/10 Course project Studio class for project development 28/10 Course project Studio class for project development 30/10 Course project Studio class for project development 04/11 Course project Studio class for project development 06/11 Course project Studio class for project development 11/11 Course project Studio class for project development 13/11 Course project Studio class for project development 18/11 Topics on free culture and software communities Topics on free culture and software communities 20/11 PUBLIC HOLIDAY PUBLIC HOLIDAY 25/11 Topics on free culture and software communities Topics on free culture and software communities 27/11 Topics on free culture and software communities Topics on free culture and software communities 02/12 EXAM WEEK EXAM WEEK 04/12 EXAM WEEK EXAM WEEK"},{"location":"_snippets/alunos/","title":"Alunos","text":"Ananda J\u00falia Galv\u00e3o Campelo Andr\u00e9 Felipe Bulc\u00e3o Brito Andr\u00e9 Barboza Braga De Melo Andr\u00e9 Corr\u00eaa Santos Antonio Amaral Egydio Martins Arthur Martins De Souza Barreto Enricco Gemha Eric Andrei Lima Possato Fabr\u00edcio Barth Felipe Aron Nudelman Tabacinik Felipe Catapano Emrich Melo Fernando Alzueta Guilherme Dantas Rameh Guilherme Fontana Louro Igor Montagner Ilana Chaia Finger Jo\u00e3o Ant\u00f4nio Gomes Garcia Leonardo Merlin Paloschi Leonardo Scarlato Lidia Alves Chagas Domingos Lincoln Rodrigo Pereira Melo Lucas Hix Luis Antonio Santana Rodrigues Paulo Henrique Moreira Falc\u00e3o Pedro Bittar Bar\u00e3o Rafael Coca Leventhal Rafael Gordon Paves Rafael Estefam Melhado Araujo Lima Ricardo Ribeiro Rodrigues Rodrigo Anci\u00e3es Patelli Rodrigo Sennati Mattar Thiago Hampl De Pierri Rocha Yuri Tabacof"},{"location":"_snippets/plano-de-aulas/","title":"Plano de aulas","text":"Date Question/Problem/Challenge Content 14/08 Introduction to the course and its challenges Workflow with distributed version control: forks, patches, pull requests, and local repositories. Technical and non-technical aspects surrounding software: infrastructure, support, marketing, funding. Reference: FOGEL Ch. 3; Additional reading: TAPSCOTT & WILLIAMS. 19/08 First code contribution Workflow with distributed version control: ammend, rebase, revert. 21/08 Project documentation and what to do when it doesn't exist Types of documentation (user, developer). Source code documentation systems: doxygen, Javadoc, pydoc, sphinx; Reference: FOGEL Ch. 3 (Wikis, Website) 26/08 Studio class for \"Professional Project\" activity Studio class for \"Professional Project\" activity 28/08 Ensuring others can work on the project: API documentation code quality 02/09 Software distribution and versioning Software distribution tools. Types of distribution. Versioning schemes. Reference: FOGEL Ch. 7 04/09 How to make software work in multiple countries? Localization and internationalization. Gettext tool for translations and .po format. 09/09 Software testing Types of software testing: unit, integration, and interface. Testing tools: pytest, selenium. 11/09 Studio class for \"Software Testing\" activity Studio class for \"Software Testing\" activity 16/09 Software licenses Copyrights in Brazil, patents, and software licenses; Reference: LAURENT Ch. 1 and 5, STALLMAN Ch. 6 18/09 Introduction to contributions in open projects - Activity \"My First Contribution\" Studio class for group activity \"My First Contribution\" 23/09 Studio class for group activity \"My First Contribution\" Studio class for group activity \"My First Contribution\" 25/09 Studio class for group activity \"My First Contribution\" Studio class for group activity \"My First Contribution\" 30/09 EXAM WEEK EXAM WEEK 02/10 EXAM WEEK EXAM WEEK 07/10 Working in software communities Assessment metrics for the second part of the course; Communication and teamwork. Reference: RAYMOND Ch. 4 09/10 Course project Studio class for project development 14/10 Course project Studio class for project development 16/10 Course project Studio class for project development 21/10 Course project Studio class for project development 23/10 Course project Studio class for project development 28/10 Course project Studio class for project development 30/10 Course project Studio class for project development 04/11 Course project Studio class for project development 06/11 Course project Studio class for project development 11/11 Course project Studio class for project development 13/11 Course project Studio class for project development 18/11 Topics on free culture and software communities Topics on free culture and software communities 20/11 PUBLIC HOLIDAY PUBLIC HOLIDAY 25/11 Topics on free culture and software communities Topics on free culture and software communities 27/11 Topics on free culture and software communities Topics on free culture and software communities 02/12 EXAM WEEK EXAM WEEK 04/12 EXAM WEEK EXAM WEEK"},{"location":"_snippets/skills-code/","title":"Skills code","text":"id Name Description XP Date 21 Code Contribution Submitted a pull request fixing a bug. 7 04/12 22 Contribution Accepted! A non-trivial pull request was accepted by an external project. 13 04/12 23 Simple Contribution Accepted! A simple pull request (with trivial changes or small code refactorings) was accepted by an external project. 3 04/12 24 Bug Report Reported a bug in a repository, and another user was able to reproduce it. 5 04/12 25 Feature Request Made a request for a new feature in a software. 2 04/12 26 INSPER Project Made additional contributions to an INSPER educational project. 5 04/12"},{"location":"_snippets/skills-community/","title":"Skills community","text":"id Name Description XP Date 40 Indirect Issue Conversations in an issue or pull request led other users to open issues reporting new bugs/improvements. 3 04/12 41 Beta Tester When reproducing a bug, you discovered that it had already been fixed and caused the closure of an issue. 3 04/12 42 Translation Accepted! Made a translation that was accepted in an open-source software. 5 04/12 43 New Languages Added support for translations in a previously non-translatable software. 10 04/12 44 Reviewer Reviewed minor errors in the documentation of a project, and your modifications were accepted. 2 04/12 45 Documentation Contribution Closed an issue marked as docs. 7 04/12 46 Project Pitch Delivered a project pitch. 0 04/12 47 Pitch Accepted! Contributed to a project presented in class. 5 04/12 48 Accepted Suggestion! Another student contributed to the project you pitched. 3 04/12 49 PR Replay Presented (in 15 minutes) the process of resolving a bug in class. 5 04/12"},{"location":"_snippets/skills-impact/","title":"Skills impact","text":"id Name Description XP Date 60 Speaker Gave a talk about libraries or open-source software. 20 04/12 61 Helpdesk Had an accepted answer on sites like StackOverflow or email lists. 4 04/12 62 Published Contribution One of your contributions was included in a release. 10 04/12 63 VIP Guest After making a contribution, someone from the project asked you to perform a task. After delivering the task, add this skill. 5 04/12 64 3 Submitted PRs Submitted 3 pull requests to the same project. 10 04/12 65 3 Accepted PRs 3 pull requests you submitted to a project were accepted. 30 04/12 66 Shoutout Something you did was mentioned by the project on social media or through an official channel. 10 04/12 77 Hacktoberfest Participated in Hacktoberfest by submitting 3 pull requests to external projects. 20 04/12"},{"location":"_snippets/skills-tutorial/","title":"Skills tutorial","text":"id Name Description XP Date 1 First Steps Added to the discipline's repository. 2 25/09 2 Exploring a Project's Environment Researched the history and community of people and services around a project. 3 25/09 3 Undocumented Project Received an undocumented system and got it up and running. 5 25/09 4 Professional Project Refactored poorly written code and created a web page for it. 5 25/09 5 Tested and Approved Created unit tests and interface tests for the challenge server. 5 25/09 6 Python Package Created a Python package installable via pip. 3 25/09 7 Dockerfile Created automated deployment for a Python web system. 3 25/09 8 Basic Translation Used translation tools to translate and localize a small command-line program. 2 25/09 10 FLOSS Research Delivered a long presentation on a recent and relevant topic related to free and open-source software. 5 04/12 11 Better code Addressed linting problems in a poorly written project 5 25/09 12 Release created Created a release and published a binary package for users 5 25/09"},{"location":"aulas/09-cultura-livre/","title":"09 - Trabalho sobre cultura livre","text":"

    Esta aula n\u00e3o tem atividade pr\u00e1tica. As discuss\u00f5es s\u00e3o feitas durante a aula expositiva.

    "},{"location":"aulas/09-cultura-livre/slides/","title":"Cultura de software livre","text":""},{"location":"aulas/09-cultura-livre/slides/#desenvolvimento-aberto","title":"Desenvolvimento Aberto","text":""},{"location":"aulas/09-cultura-livre/slides/#cultura-de-software-livre","title":"Cultura de software livre","text":""},{"location":"aulas/09-cultura-livre/slides/#versao-20222-fabricio-barth-fabriciojbinsperedubr","title":"Vers\u00e3o 2022/2: Fabr\u00edcio Barth ( fabriciojb@insper.edu.br )","text":""},{"location":"aulas/09-cultura-livre/slides/#atividade","title":"Atividade","text":"

    Cultura livre: fazer uma pesquisa profunda e apresentar semin\u00e1rio sobre licen\u00e7as de software e casos recentes em que licen\u00e7as tem papel de destaque

    "},{"location":"aulas/09-cultura-livre/slides/#sua-apresentacao-precisa-ter-alguma-forma-de-interacao-com-a-audiencia","title":"Sua apresenta\u00e7\u00e3o precisa ter alguma forma de intera\u00e7\u00e3o com a audi\u00eancia","text":"
    • debate
    • painel com vota\u00e7\u00f5es
    "},{"location":"aulas/09-cultura-livre/slides/#atividade-sugestoes-de-temas","title":"Atividade - sugest\u00f5es de temas","text":"
    • The new open-source economics (Yochai Benkler, 2005). O que mudou de 2005 para 2022?

    • There is no \"Linux\" platform.

    • Telemetria \u00e9 \"\u00e9tico\"? (exemplo VSCode e outros).

    • GitHub CoPilot \u00e9 \"\u00e9tico\"? Respeita licen\u00e7as de software?

    • Regulamenta\u00e7\u00f5es recentes na Europa sobre durabilidade de smartphones (bateria, right to repair, etc).

    • Maintainer burnout.

    "},{"location":"aulas/09-cultura-livre/slides/#atividade-datas-de-apresentacao","title":"Atividade - datas de apresenta\u00e7\u00e3o","text":"
    • 17/11 - 2 trabalho
    • 22/11 - 2 trabalhos
    • 24/11 - 2 trabalhos
    • 29/11 - 2 trabalhos
    "},{"location":"aulas/09-cultura-livre/slides/#45-minutos-de-apresentacaoatividade-10-minutos-para-perguntas","title":"45 minutos de apresenta\u00e7\u00e3o/atividade + 10 minutos para perguntas","text":""},{"location":"aulas/09-cultura-livre/slides/#hoje","title":"Hoje","text":"
    • Defini\u00e7\u00e3o de temas e datas de apresenta\u00e7\u00e3o
    • Pr\u00e9via de 5 minutos do seu tema na pr\u00f3xima aula
    "},{"location":"aulas/09-cultura-livre/slides/#registrar-seu-grupo-escolha-de-tema-e-dia-de-apresentacao-na-issue-665","title":"Registrar seu grupo, escolha de tema e dia de apresenta\u00e7\u00e3o na issue #665","text":""},{"location":"aulas/11-contribuicoes-externas/","title":"11 - Contribui\u00e7\u00f5es externas","text":"

    Esta aula n\u00e3o tem atividade pr\u00e1tica guidada, mas tem uma parte expositiva importante. N\u00e3o esque\u00e7a de olhar os slides de hoje para relembrar.

    "},{"location":"aulas/11-contribuicoes-externas/slides/","title":"Dicas de Debug","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#desenvolvimento-aberto","title":"Desenvolvimento Aberto","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#_1","title":"Dicas de Debug","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#dicas-de-debug","title":"Dicas de Debug","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#igor-dos-santos-montagner-igorsm1insperedubr","title":"Igor dos Santos Montagner ( igorsm1@insper.edu.br )","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#minha-primeira-contribuicao-de-codigo","title":"Minha primeira contribui\u00e7\u00e3o de c\u00f3digo","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#dicas-para-debugar-qualquer-coisa","title":"Dicas para debugar (qualquer coisa)","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#9-regras-de-debug","title":"9 regras de debug","text":"
    1. UNDERSTAND THE SYSTEM
    2. MAKE IT FAIL
    3. QUIT THINKING AND LOOK
    4. DIVIDE AND CONQUER
    5. CHANGE ONE THING AT A TIME
    6. KEEP AN AUDIT TRAIL
    7. CHECK THE PLUG
    8. GET A FRESH VIEW
    9. IF YOU DIDN'T FIX IT, IT AIN'T FIXED
    "},{"location":"aulas/11-contribuicoes-externas/slides/#1-understand-the-system","title":"1. Understand the system","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#nada-acontece-se-nao-conseguirmos","title":"Nada acontece se n\u00e3o conseguirmos","text":"
    1. Baixar a vers\u00e3o de desenvolvimento
    2. Instalar todas as depend\u00eancias
    3. Compilar nossa pr\u00f3pria vers\u00e3o
    4. Rodar testes na vers\u00e3o do master
    "},{"location":"aulas/11-contribuicoes-externas/slides/#1-understand-the-system_1","title":"1. Understand the system","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#ferramentas-importantes","title":"Ferramentas importantes:","text":"
    1. Virtual environments: venv, virtualenv, pipenv, conda
    2. setuptools - development mode
    3. Debugging
      • pdb
      • fun\u00e7\u00e3o breakpoint() (tutorial)
    "},{"location":"aulas/11-contribuicoes-externas/slides/#1-understand-the-system_2","title":"1. Understand the system","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#conheca-suas-ferramentas","title":"Conhe\u00e7a suas ferramentas","text":"
    • Debugging visual linha a linha
    • Stacktrace
    • Busca em projeto inteiro
    • Ir para defini\u00e7\u00e3o de fun\u00e7\u00e3o
    "},{"location":"aulas/11-contribuicoes-externas/slides/#debugar-usando-print-e-perda-de-tempo","title":"Debugar usando print \u00e9 perda de tempo","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#2-make-it-fail","title":"2. Make it fail","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#reproduza-seu-bug","title":"Reproduza seu bug","text":"
    • Crie um exemplo m\u00ednimo que reproduza o bug desejado ou que usaria a feature que quer implementar
      • entrada de exemplo e sa\u00edda esperada vs sa\u00edda obtida
    • Possivelmente isto j\u00e1 foi descrito na issue escolhida.
    • Anote elementos que te ajudem a encontrar onde isto ocorre no c\u00f3digo (fun\u00e7\u00f5es usadas, elementos de interface gr\u00e1fica, mensagens de erro.)
    "},{"location":"aulas/11-contribuicoes-externas/slides/#3-quit-thinking-and-look","title":"3. Quit thinking and look","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#encontre-onde-esta-o-problema-e-leia-o-codigo-com-atencao","title":"Encontre onde est\u00e1 o problema e leia o c\u00f3digo com aten\u00e7\u00e3o","text":"
    1. Encontre no c\u00f3digo onde o bug pode estar
    2. Comece geral (em qual arquivo est\u00e1 a funcionalidade?) e v\u00e1 restringindo (em qual fun\u00e7\u00e3o o bug \"explode\"?)
    3. Ferramentas de debug s\u00e3o essenciais. Veja o item 1.
      • N\u00e3o atenderei ningu\u00e9m que esteja debugando s\u00f3 com print
    "},{"location":"aulas/11-contribuicoes-externas/slides/#3-quit-thinking-and-look_1","title":"3. Quit thinking and look","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#buscando-por-nomes-de-arquivos","title":"Buscando por nomes de arquivos","text":"

    Comando find (man page)

    Exemplo: procurar por arquivos cujo nome \u00e9 aceito por uma certa express\u00e3o regular come\u00e7ando no diret\u00f3rio atual.

    $ find -iname \"regexp\" .

    "},{"location":"aulas/11-contribuicoes-externas/slides/#3-quit-thinking-and-look_2","title":"3. Quit thinking and look","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#buscando-no-conteudo-dos-arquivos","title":"Buscando no conte\u00fado dos arquivos","text":"

    Comando grep (man page)

    $ grep [OPTIONS] PATTERN FILES

    • PATTERN: express\u00e3o regular
    • FILES: lista de diret\u00f3rios ou arquivos
    "},{"location":"aulas/11-contribuicoes-externas/slides/#3-quit-thinking-and-look-grep","title":"3. Quit thinking and look - grep","text":"

    Exemplo 1: buscar todos arquivos nas pasta atual (.) e subpastas com o texto \"dialog\" ignorando mai\u00fasculas/min\u00fasculas.

    $ grep -r -i dialog .

    "},{"location":"aulas/11-contribuicoes-externas/slides/#_2","title":"Dicas de Debug","text":"

    Exemplo 2: Listas todos os arquivos .cpp que fazem algum include

    $ grep -r --include \"*cpp\" \"#include\" .

    "},{"location":"aulas/11-contribuicoes-externas/slides/#sua-ideeditor-devem-ter-algo-parecido-procure-e-use","title":"Sua IDE/editor devem ter algo parecido. Procure e use.","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#4-divide-and-conquer","title":"4. Divide and Conquer","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#crie-um-plano-de-acao","title":"Crie um plano de a\u00e7\u00e3o","text":"
    1. Por que o bug ocorre?
      • Est\u00e1 relacionado a qual fun\u00e7\u00e3o?
      • Qual vari\u00e1vel tem o valor errado?
    2. O que deve ser mudado para que pare de ocorrer?

    Pr\u00e9-requisito: debugar visualmente usando alguma IDE / editor

    "},{"location":"aulas/11-contribuicoes-externas/slides/#5-change-one-thing-at-a-time","title":"5. Change one thing at a time","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#um-bom-pr-muda-o-minimo-possivel","title":"Um bom PR muda o m\u00ednimo poss\u00edvel","text":"
    • use v\u00e1rias branches se quiser testar ideias diferentes
    • git commit \u00e9 gr\u00e1tis. Quando chegar na vers\u00e3o final \u00e9 s\u00f3 juntar tudo e mandar.
    • git rebase para atualizar seu branch com o master upstream caso necess\u00e1rio.
    "},{"location":"aulas/11-contribuicoes-externas/slides/#6-keep-an-audit-trail","title":"6. Keep an audit trail","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#registre-suas-descobertas","title":"Registre suas descobertas","text":"
    • Log de como voc\u00ea encontrou onde mexer
    • Log de todos arquivos de interesse e seus usos
    • Log de todas as pesquisas feitas
    • Log de todas as modifica\u00e7\u00f5es feitas
    • git commit \u00e9 \u00fatil para registrar testes tamb\u00e9m

    N\u00e3o se esque\u00e7a:git diff \u00e9 seu melhor amigo

    "},{"location":"aulas/11-contribuicoes-externas/slides/#7-check-the-plug","title":"7. Check the plug","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#nunca-se-esqueca-de-testar-a-solucoes-mais-simples-primeiro","title":"Nunca se esque\u00e7a de testar a solu\u00e7\u00f5es mais simples primeiro","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#8-get-a-fresh-view","title":"8. Get a fresh view","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#empacou","title":"Empacou?","text":"

    \u00c9 por isso que voc\u00eas trabalham em grupo no primeiro bug.

    "},{"location":"aulas/11-contribuicoes-externas/slides/#empacou-mesmo","title":"Empacou mesmo?","text":"

    Para isto serve seu grupo.

    "},{"location":"aulas/11-contribuicoes-externas/slides/#empacou-mesmo_1","title":"Empacou mesmo!?!?!?!?","text":"

    Me chame!

    "},{"location":"aulas/11-contribuicoes-externas/slides/#9-if-you-didnt-fix-it-it-aint-fixed","title":"9. If you didn't fix it, it ain't fixed","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#hora-de-programar","title":"Hora de programar","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#tentem-aplicar-estas-ideias-aos-seus-problemas","title":"Tentem aplicar estas ideias aos seus problemas","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#envie-4-prs-para-projetos-participantes-e-ganhe-uma-camiseta","title":"Envie 4 PRs para projetos participantes e ganhe uma camiseta","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#atividade-extra-hacktoberfest","title":"Atividade extra: hacktoberfest","text":"

    Objetivo: Enviar 3 PRs para projetos externos no m\u00eas de outubro.

    \"metadata\": {\"date\": \"2021-10-31\"}

    "},{"location":"aulas/11-contribuicoes-externas/slides/#desenvolvimento-aberto_1","title":"Desenvolvimento Aberto","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#_3","title":"Dicas de Debug","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#dicas-de-debug_1","title":"Dicas de debug","text":""},{"location":"aulas/11-contribuicoes-externas/slides/#igor-dos-santos-montagner-igorsm1insperedubr_1","title":"Igor dos Santos Montagner ( igorsm1@insper.edu.br )","text":""},{"location":"aulas/12-projeto/slides/","title":"Projeto da disciplina","text":""},{"location":"aulas/12-projeto/slides/#desenvolvimento-aberto","title":"Desenvolvimento Aberto","text":""},{"location":"aulas/12-projeto/slides/#projeto-da-disciplina","title":"Projeto da disciplina","text":""},{"location":"aulas/12-projeto/slides/#igor-dos-santos-montagner-igorsm1insperedubr","title":"Igor dos Santos Montagner ( igorsm1@insper.edu.br )","text":""},{"location":"aulas/12-projeto/slides/#ate-agora","title":"At\u00e9 agora","text":"
    • Ferramentas de colabora\u00e7\u00e3o
    • Modifica\u00e7\u00f5es de c\u00f3digo
    • Tradu\u00e7\u00e3o de UI e documenta\u00e7\u00e3o
    • Aspectos n\u00e3o t\u00e9cnicos relacionados
      • licen\u00e7as
      • comunidades
    • Colabora\u00e7\u00e3o em um projeto do Insper
    "},{"location":"aulas/12-projeto/slides/#ate-agora_1","title":"At\u00e9 agora","text":""},{"location":"aulas/12-projeto/slides/#formacao-basica","title":"Forma\u00e7\u00e3o b\u00e1sica","text":"
    • Analisar uma base de c\u00f3digos desconhecida de m\u00e9dio/grande porte e modific\u00e1-la de modo a fazer melhorias e corrigir falhas em um software;
    "},{"location":"aulas/12-projeto/slides/#_1","title":"Projeto da disciplina","text":"
    • Interagir com uma equipe remota de desenvolvedores para entregar c\u00f3digo que atenda aos padr\u00f5es de qualidade e estilo de c\u00f3digo de um projeto;
    "},{"location":"aulas/12-projeto/slides/#projeto-aberto","title":"Projeto Aberto","text":"

    Objetivos:

    1. proporcionar uma experi\u00eancia de trabalho em um projeto real de escolha dos alunos
    2. valorizar diversos tipos de contribui\u00e7\u00f5es, n\u00e3o somente de c\u00f3digo
    3. exercitar autonomia e independ\u00eancia
    "},{"location":"aulas/12-projeto/slides/#projeto-aberto_1","title":"Projeto Aberto","text":""},{"location":"aulas/12-projeto/slides/#organizado-em-dois-blocos-de-5-aulas","title":"Organizado em dois blocos de 5 aulas","text":"
    • 11/05 - 25/05
    • 27/05 - 10/06
    "},{"location":"aulas/12-projeto/slides/#projeto-aberto-pitches-de-projeto","title":"Projeto Aberto - Pitches de projeto","text":"

    Cada bloco se inicia com uma aula de Pitches de Projeto, que \u00e9 uma apresenta\u00e7\u00e3o de 5 minutos apresentando o projeto para o qual voc\u00ea contribuir\u00e1 na semana.

    • Trocar ideias sobre projetos interessantes
    • Ajudar alunos indecisos a escolherem um projeto
    • Se comprometer com uma escolha de projeto
    "},{"location":"aulas/12-projeto/slides/#projeto-aberto-pitch-de-projeto","title":"Projeto Aberto: Pitch de projeto","text":"

    Objetivo: Apresentou um Pitch de projeto. Se o aluno s\u00f3 apresentar o projeto e n\u00e3o fizer contribui\u00e7\u00e3o vale 0 XP.

    \"metadata\": {\"url\": \"url_do_projeto_proposto\", \"filename\": \"pdf da apresentacaoo\"}

    Colocar pdf da apresenta\u00e7\u00e3o na pasta docs/pitches.

    "},{"location":"aulas/12-projeto/slides/#projeto-aberto-pitch-aceito","title":"Projeto Aberto: Pitch aceito!","text":"

    Objetivo: Enviou contribui\u00e7\u00e3o para um projeto apresentado em sala.

    \"metadata\": {\"url\": \"url_do_projeto_proposto\"}

    A ser enviado al\u00e9m da skill da contribui\u00e7\u00e3o.

    "},{"location":"aulas/12-projeto/slides/#projeto-aberto-sugestao-aceita","title":"Projeto Aberto: Sugest\u00e3o aceita!","text":"

    Objetivo: Outro aluno enviou contribui\u00e7\u00e3o para o projeto que voc\u00ea fez Pitch.

    \"metadata\": {\"url\": \"url_da_contribuicao\"}

    A ser enviado pelo aluno que prop\u00f4s o Pitch, que tamb\u00e9m precisa ter contribu\u00eddo.

    "},{"location":"aulas/12-projeto/slides/#projeto-aberto-pitches-de-projeto_1","title":"Projeto Aberto - Pitches de projeto","text":"
    1. Apresentar um pitch \u00e9 uma skill que vale XP
    2. Ajudar colegas interessados no \"seu\" projeto vale XP
    3. Aceitar sugest\u00f5es/ajudas vale XP
    4. Tudo isso \u00e9 al\u00e9m da XP j\u00e1 obtida com as contribui\u00e7\u00f5es
    "},{"location":"aulas/12-projeto/slides/#evitar-alunos-trabalhando-sozinhos","title":"Evitar alunos trabalhando sozinhos.","text":""},{"location":"aulas/12-projeto/slides/#estrategias-para-escolha-um-projeto","title":"Estrat\u00e9gias para escolha um projeto","text":""},{"location":"aulas/12-projeto/slides/#aprendizado-de-tecnologias-novas","title":"Aprendizado de tecnologias novas","text":"
    • Linguagem de programa\u00e7\u00e3o
    • Biblioteca
    • Tipo de tecnologia: web, mobile, desktop
    "},{"location":"aulas/12-projeto/slides/#estrategias-para-escolha-um-projeto_1","title":"Estrat\u00e9gias para escolha um projeto","text":""},{"location":"aulas/12-projeto/slides/#aperfeicoamento-em-tecnologias-que-ja-domina","title":"Aperfei\u00e7oamento em tecnologias que j\u00e1 domina","text":"
    • Linguagem de programa\u00e7\u00e3o espec\u00edfica
    • Tipo de tecnologia: web, mobile, desktop
    "},{"location":"aulas/12-projeto/slides/#estrategias-para-escolha-um-projeto_2","title":"Estrat\u00e9gias para escolha um projeto","text":""},{"location":"aulas/12-projeto/slides/#projetos-de-interesse-pessoal","title":"Projetos de interesse pessoal","text":"
    • Algum software que voc\u00ea usa
    • Melhorar alternativa livre para software propriet\u00e1rio
    • Moonshot: projetos ambiciosos com chance m\u00ednima de sucesso
    • Site AlternativeTo
    "},{"location":"aulas/12-projeto/slides/#hoje","title":"Hoje","text":"
    • Finalizar Projeto DIY
    • Escolher projetos para o primeiro bloco
    • Iniciar trabalhos da segunda parte da disciplina
    "},{"location":"aulas/12-projeto/slides/#desenvolvimento-aberto_1","title":"Desenvolvimento Aberto","text":""},{"location":"aulas/12-projeto/slides/#projeto-da-disciplina_1","title":"Projeto da disciplina","text":""},{"location":"aulas/12-projeto/slides/#igor-dos-santos-montagner-igorsm1insperedubr_1","title":"Igor dos Santos Montagner ( igorsm1@insper.edu.br )","text":""},{"location":"delivery/","title":"Delivery folder","text":"

    In this folder you will find files produced by students.

    "},{"location":"delivery/README_paulohmf_leonardos15_rodrigosm11/","title":"Depend\u00eancias e servi\u00e7os usados","text":""},{"location":"delivery/README_paulohmf_leonardos15_rodrigosm11/#quais-tecnologias-sao-usadas-no-codigo-alem-da-linguagem-de-programacao-liste-tambem-as-bibliotecasmodulos-externos-usados","title":"Quais tecnologias s\u00e3o usadas no c\u00f3digo? Al\u00e9m da linguagem de programa\u00e7\u00e3o, liste tamb\u00e9m as bibliotecas/m\u00f3dulos externos usados.","text":"
    • Linguagens: Python, SQL, HTML, JS, CSS, SCSS
    • Tecnologias: sqlite, hashlib, flask, bootstrap
    "},{"location":"delivery/README_paulohmf_leonardos15_rodrigosm11/#a-aplicacao-utiliza-um-banco-de-dados-qual-gerenciador-onde-a-aplicacao-busca-a-base-de-dados-quais-sao-as-tabelas-usadas-como-elas-sao-criadas","title":"A aplica\u00e7\u00e3o utiliza um banco de dados. Qual gerenciador? Onde a aplica\u00e7\u00e3o busca a base de dados? Quais s\u00e3o as tabelas usadas? Como elas s\u00e3o criadas?","text":"

    Utiliza sim, o SQLite.

    • No arquivo softdes.py existem algumas consultas SQL para: Pegar todos os Quizes, Pegar um USERQUIZ, Inserir na tabela USERQUIZ, Pegar um Quiz, Setar o password do usu\u00e1rio,

    • No arquivo adduser.py existe uma consulta SQL para: Adicionar um novo usu\u00e1rio

    • As tabelas utilizadas s\u00e3o 3: USER, USERQUIZ, QUIZ. Elas s\u00e3o criadas no arquivo quiz.sql

    "},{"location":"delivery/README_paulohmf_leonardos15_rodrigosm11/#deploy-inicial","title":"Deploy inicial","text":""},{"location":"delivery/README_paulohmf_leonardos15_rodrigosm11/#a-aplicacao-usa-autenticacao-se-sim-qual-tipo-como-usuarios-sao-criados-existe-algum-usuario-administrador-como-e-feita-a-seguranca-das-senhas-qual-a-senha-padrao","title":"A aplica\u00e7\u00e3o usa autentica\u00e7\u00e3o? Se sim, qual tipo? Como usu\u00e1rios s\u00e3o criados? Existe algum usu\u00e1rio administrador? Como \u00e9 feita a seguran\u00e7a das senhas? Qual a senha padr\u00e3o?","text":"

    A aplica\u00e7\u00e3o utiliza autentica\u00e7\u00e3o, feita atrav\u00e9s do HTTPBasicAuth do flask. Os usu\u00e1rios s\u00e3o criados a partir do script adduser.py, que l\u00ea um arquivo csv e cria usu\u00e1rios no banco de dados. O nome do usu\u00e1rio \u00e9 encriptado para um hash utilizando a hashlib. Pelo c\u00f3digo que existe em softdes.py, sabemos que existe um usu\u00e1rio chamado admin e outro chamado fabioja. Dessa forma a senha dos dois ser\u00e1 o hash dessas palavras.

    "},{"location":"delivery/README_paulohmf_leonardos15_rodrigosm11/#quais-comandos-voce-usou-para-rodar-a-aplicacao-escreva-todos-desde-a-criacao-do-banco-de-dados-e-dos-usuarios-ate-o-funcionamento-completo-do-projeto","title":"Quais comandos voc\u00ea usou para rodar a aplica\u00e7\u00e3o? Escreva todos desde a cria\u00e7\u00e3o do banco de dados e dos usu\u00e1rios at\u00e9 o funcionamento completo do projeto.","text":"

    Para criar o banco de dados:

    • Criei um arquivo quiz.db
    • Utilizando a CLI do sqlite3 criei as tabelas do banco de dados
    sqlite3 quiz.db\n.read user.sql\n
    • Criei um arquivo users.csv com os usu\u00e1rios admin e fabioja
    • Rodei o arquivo adduser.py

    • Criei um python virtual environment

    • Fui tentando rodar o arquivo softdes.py e baixando as depend\u00eancias necess\u00e1rias: flask e flask_httpauth
    • Troquei a porta 80, dado que n\u00e3o havia permiss\u00e3o necess\u00e1ria para rodar a aplica\u00e7\u00e3o nessa porta com usu\u00e1rio padr\u00e3o do linux
    • Aplica\u00e7\u00e3o rodando
    "},{"location":"delivery/README_paulohmf_leonardos15_rodrigosm11/#agora-que-voce-consegue-rodar-a-aplicacao-explore-a-um-pouco-e-descreva-em-poucas-frases-para-que-ela-serve","title":"Agora que voc\u00ea consegue rodar a aplica\u00e7\u00e3o, explore-a um pouco e descreva em poucas frases para qu\u00ea ela serve.","text":"

    Parece um site da mat\u00e9ria de SoftDes, existe um bot\u00e3o para logout, outro para trocar senha e os desafios/quizes.

    "},{"location":"delivery/README_paulohmf_leonardos15_rodrigosm11/#documentacao-do-projeto","title":"Documenta\u00e7\u00e3o do projeto","text":""},{"location":"delivery/README_paulohmf_leonardos15_rodrigosm11/#se-voce-fosse-criar-um-guia-de-usuario-aluno-para-esta-aplicacao-quais-tarefas-descreveria","title":"Se voc\u00ea fosse criar um guia de usu\u00e1rio (aluno) para esta aplica\u00e7\u00e3o, quais tarefas descreveria?","text":""},{"location":"delivery/README_paulohmf_leonardos15_rodrigosm11/#se-voce-fosse-criar-um-guia-de-usuario-professor-para-esta-aplicacao-quais-tarefas-descreveria","title":"Se voc\u00ea fosse criar um guia de usu\u00e1rio (professor) para esta aplica\u00e7\u00e3o, quais tarefas descreveria?","text":""},{"location":"delivery/README_paulohmf_leonardos15_rodrigosm11/#o-que-voce-descreveria-em-um-guia-de-desenvolvedor-para-esta-aplicacao","title":"O qu\u00ea voc\u00ea descreveria em um guia de desenvolvedor para esta aplica\u00e7\u00e3o?","text":"
    • Como baixar as depend\u00eancias
    • Como criar o banco de dados
    • O que cada arquivo est\u00e1 fazendo
    • O que cada rota est\u00e1 fazendo
    • O que as fun\u00e7\u00f5es est\u00e3o fazendo
    • ...
    "},{"location":"delivery/README_skill3_ricardorr7_thiagohpr/","title":"Quiz Server - SoftDes INSPER","text":""},{"location":"delivery/README_skill3_ricardorr7_thiagohpr/#used-technologies","title":"Used technologies","text":"
    • Python
      • Flask
    • Bootstrap
    • HTML, CSS & JavaScript
    • SQLite DB
    "},{"location":"delivery/README_skill3_ricardorr7_thiagohpr/#database","title":"Database","text":"

    The appplication uses the SQLite db, the application uses this db to store quizes, and users for the quizes. The db is created using the quiz.sql file, the tables created are: - USER - QUIZ - USERQUIZ

    "},{"location":"delivery/README_skill3_ricardorr7_thiagohpr/#how-to-setup-the-application","title":"How to setup the application:","text":"
    1. Install the dependencies:

      pip install flask Flask-HTTPAuth\n

    2. Create the db using the following script:

      import sqlite3\n\nDB_PATH = \"quiz.db\"\n\ndef create_db():\n    conn = sqlite3.connect(DB_PATH)\n    cursor = conn.cursor()\n    with open('quiz.sql') as file:\n        cursor.executescript(file.read())\n    conn.commit()\n    conn.close()\n\n\nif __name__ == \"__main__\":\n    create_db()\n

    3. Create the users.csv file:

      your_user, user_type\n

    4. Create the users using the adduser.py script:

      python adduser.py\n

    5. Run the application, use the set username as password:

      python softdes.py\n

    "},{"location":"delivery/README_skill3_ricardorr7_thiagohpr/#about-the-aplication","title":"About the aplication","text":"

    Flask based Code Exercises server that interacts with SQLite, in each the main api call fetches all the quizzes and evaluates the user answers. The code itself is not safe, mainly because you can create an user with admin permissions by calling it \"fabioja\". This allows the user to see every quiz from the server, even those who aren't released yet. Also, if the user creates the the login credentials with the script adduser.py, the password will be the same as the user name.

    "},{"location":"delivery/class-03-guide/","title":"Class 03 guide","text":""},{"location":"delivery/class-03-guide/#group-antonio-martins-enrrico-gemha-e-felipe-catapano","title":"Group: Antonio Martins, Enrrico Gemha e Felipe Catapano","text":""},{"location":"delivery/class-03-guide/#guia-para-rodar-a-plataforma-de-quiz","title":"Guia para Rodar a Plataforma de Quiz","text":"

    Este guia fornece um passo a passo para configurar e executar a aplica\u00e7\u00e3o de quiz localmente. Siga as instru\u00e7\u00f5es abaixo para garantir que todos os componentes necess\u00e1rios estejam instalados e configurados corretamente.

    "},{"location":"delivery/class-03-guide/#1-pre-requisitos","title":"1. Pr\u00e9-requisitos","text":"
    • Python 3: Certifique-se de que o Python 3 est\u00e1 instalado em sua m\u00e1quina.
    • pip: O gerenciador de pacotes pip deve estar instalado.
    "},{"location":"delivery/class-03-guide/#2-instalacao-de-dependencias","title":"2. Instala\u00e7\u00e3o de Depend\u00eancias","text":"

    Navegue at\u00e9 a pasta /src do projeto e instale as depend\u00eancias necess\u00e1rias executando o seguinte comando no terminal:

    pip install flask flask_httpauth\n

    Este comando instala o Flask, um framework web leve para Python, e o flask_httpauth, uma extens\u00e3o para autentica\u00e7\u00e3o HTTP b\u00e1sica.

    "},{"location":"delivery/class-03-guide/#3-criacao-do-arquivo-de-usuarios","title":"3. Cria\u00e7\u00e3o do Arquivo de Usu\u00e1rios","text":"

    Crie um arquivo users.csv para definir os usu\u00e1rios iniciais:

    echo \"enriccog,aluno\" > users.csv\n

    Este comando cria um arquivo users.csv com um usu\u00e1rio chamado enriccog e define seu tipo como aluno.

    "},{"location":"delivery/class-03-guide/#4-configuracao-do-banco-de-dados","title":"4. Configura\u00e7\u00e3o do Banco de Dados","text":"

    Inicialize o banco de dados SQLite com o seguinte comando:

    sqlite3 quiz.db < quiz.sql\n

    Este comando cria o banco de dados quiz.db usando o script SQL quiz.sql, que deve conter as instru\u00e7\u00f5es para criar as tabelas necess\u00e1rias.

    "},{"location":"delivery/class-03-guide/#5-adicao-de-usuarios-ao-banco-de-dados","title":"5. Adi\u00e7\u00e3o de Usu\u00e1rios ao Banco de Dados","text":"

    Execute o script adduser.py para adicionar os usu\u00e1rios do arquivo users.csv ao banco de dados:

    python3 adduser.py\n

    Este script l\u00ea o arquivo users.csv e insere os usu\u00e1rios especificados no banco de dados quiz.db.

    "},{"location":"delivery/class-03-guide/#6-executando-a-aplicacao","title":"6. Executando a Aplica\u00e7\u00e3o","text":"

    Defina a vari\u00e1vel de ambiente FLASK_APP e inicie o servidor Flask com os comandos:

    export FLASK_APP=softdes.py && flask run\n

    Este comando configura o arquivo softdes.py como a aplica\u00e7\u00e3o Flask a ser executada e inicia o servidor. Por padr\u00e3o, o servidor Flask estar\u00e1 acess\u00edvel em http://localhost:5000.

    "},{"location":"delivery/class-03-guide/#7-acessando-a-plataforma","title":"7. Acessando a Plataforma","text":"

    Abra um navegador web e acesse http://localhost:5000 para visualizar a plataforma de quiz.

    Voc\u00ea agora deve estar pronto para usar a plataforma! Se houver quaisquer problemas ou erros durante o processo de configura\u00e7\u00e3o, verifique se todas as depend\u00eancias est\u00e3o instaladas corretamente e se os arquivos necess\u00e1rios est\u00e3o no diret\u00f3rio correto.

    "},{"location":"delivery/class_3_running_guide/","title":"Class 3 running guide","text":""},{"location":"delivery/class_3_running_guide/#group-andre-melo-andrebbm","title":"Group: Andr\u00e9 Melo (andrebbm)","text":""},{"location":"delivery/class_3_running_guide/#manual-para-subir-a-plataforma-de-quiz-softdes-20182","title":"Manual para Subir a Plataforma de Quiz SoftDes 2018.2","text":"

    Passo a passo para corrigir e executar a plataforma de quiz SoftDes 2018.2 a partir do c\u00f3digo fonte fornecido.

    "},{"location":"delivery/class_3_running_guide/#1-pre-requisitos","title":"1. Pr\u00e9-requisitos","text":"
    • Python 3
    • pip
    "},{"location":"delivery/class_3_running_guide/#2-bibliotecas-necessarias","title":"2. Bibliotecas Necess\u00e1rias","text":"

    Instale as seguintes bibliotecas Python necess\u00e1rias para executar a plataforma de quiz, como no modelo abaixo:

    pip install flask\n
    • Flask
    • flask_httpauth
    • datetime
    • sqlite3
    • hashlib
    "},{"location":"delivery/class_3_running_guide/#3-criacao-do-arquivo-de-usuarios","title":"3. Cria\u00e7\u00e3o do Arquivo de Usu\u00e1rios","text":"

    Crie um arquivo users.csv na raiz do projeto para definir os usu\u00e1rios iniciais e adicion\u00e1-los ao banco de dados. O conte\u00fado do arquivo users.csv deve ter o seguinte formato:

    admin,admin\n
    "},{"location":"delivery/class_3_running_guide/#4-configuracao-do-banco-de-dados","title":"4. Configura\u00e7\u00e3o do Banco de Dados","text":"

    No arquivo adduser.py, inclua na fun\u00e7\u00e3o addUser() o seguinte bloco de c\u00f3digo entre conn.cursor() e conn.execute():

    cursor.execute(\"DROP TABLE IF EXISTS USER;\")\ncursor.execute(\"\"\"\n    CREATE TABLE USER(\n    user TEXT NOT NULL PRIMARY KEY,\n    pass TEXT NOT NULL,\n    type TEXT NOT NULL);\"\"\")\n
    a seguir, adicione a seguinte fun\u00e7\u00e3o:

    def addQuiz(id, release, expire, problem, tests, results, diagnosis, numb):\n    conn = sqlite3.connect('quiz.db')\n    cursor = conn.cursor()\n    cursor.execute(\"DROP TABLE IF EXISTS QUIZ;\")\n    cursor.execute(\"\"\"\n        CREATE TABLE QUIZ(\n        id INTEGER NOT NULL PRIMARY KEY,\n        release TEXT NOT NULL,\n        expire TEXT NOT NULL,\n        problem TEXT NOT NULL,\n        tests TEXT NOT NULL,\n        results TEXT NOT NULL,\n        diagnosis TEXT NOT NULL,\n        numb INTEGER NOT NULL);\"\"\")\n    cursor.execute('Insert into QUIZ(id,release,expire,problem,tests,results,diagnosis,numb) values({0},\"{1}\",\"{2}\",\"{3}\",\"{4}\",\"{5}\",\"{6}\",{7});'.format(id, release, expire, problem, tests, results, diagnosis, numb))\n\n    cursor.execute(\"DROP TABLE IF EXISTS USERQUIZ;\")\n    cursor.execute(\"\"\"\n        CREATE TABLE USERQUIZ(\n        id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\n        userid TEXT NOT NULL,\n        quizid INTEGER NOT NULL,\n        sent TEXT NOT NULL,\n        answer TEXT NOT NULL,\n        result TEXT NOT NULL);\"\"\")\n    conn.commit()\n    conn.close()\n

    Por fim, adicione a seguinte chamada de fun\u00e7\u00e3o no final do script:

      addQuiz(1, '2018-01-01 00:00:00', '2018-01-01 00:00:00', 'problem', 'tests', 'results', 'diagnosis', 1)\n
    "},{"location":"delivery/class_3_running_guide/#5-adicao-de-usuarios-ao-banco-de-dados","title":"5. Adi\u00e7\u00e3o de Usu\u00e1rios ao Banco de Dados","text":"

    Execute o script adduser.py para criar a base e adicionar os usu\u00e1rios do arquivo users.csv ao banco de dados.

    "},{"location":"delivery/class_3_running_guide/#6-executando-a-aplicacao","title":"6. Executando a Aplica\u00e7\u00e3o","text":"

    Execute o script quiz.py para iniciar a aplica\u00e7\u00e3o Flask. A aplica\u00e7\u00e3o estar\u00e1 dispon\u00edvel em http://192.168.1.144/.

    python3 quiz.py\n
    "},{"location":"delivery/class_3_running_guide/#7-acessando-a-plataforma","title":"7. Acessando a Plataforma","text":"

    Abra um navegador web e acesse http://192.168.1.144/ para visualizar a plataforma de quiz.

    A plataforma vai pedir um login e senha, que s\u00e3o os mesmos do arquivo users.csv: admin, admin.

    "},{"location":"delivery/ericalp_readme/","title":"How to run","text":"
    1. Install all dependencies from requirements.txt
    pip install -r ericalp_requirements.txt\n
    1. Create users.csv with the desired user values

    2. Run the following code to execute quiz.sql and create quiz.db

      import sqlite3\n\n#run quiz.sql to create the database\nwith open('quiz.sql', 'r') as f:\n    sql = f.read()\n    conn = sqlite3.connect('quiz.db')\n    conn.executescript(sql)\n    conn.commit()\n    conn.close()\n    print(\"Database initialized\")\n

    3. Execute adduser.py to add the users in users.csv to the database

    4. Execute softdes.py to run the website

    5. Log in using your credentials, your password is the same as your username

    "},{"location":"delivery/skill3_lidiaacd_anandajgc_guilhermefl3/","title":"Skill3 lidiaacd anandajgc guilhermefl3","text":""},{"location":"delivery/skill3_lidiaacd_anandajgc_guilhermefl3/#about-the-application","title":"About the Application","text":"

    This application is a web-based platform designed to facilitate the student assignment submission and feedback process for a Software Design (SoftDes) course, specifically labeled as \"SoftDes 2018.2.\" It showcases an example page for \"Challenge 1,\" where the critical functionalities include viewing problem statements, submission deadlines, and feedback/results of submitted assignments. The application features a login functionality so that the users only login with the correct password

    The application is built using Flask, a lightweight WSGI web application framework in Python. Flask is known for being simple to set up and flexible, making it ideal for small to medium-sized applications. The platform uses SQL for managing its database operations. SQL databases are robust, allowing for complex queries and transactions necessary for managing course data, assignments, user accounts, submission records, feedback, and results.

    "},{"location":"delivery/skill3_lidiaacd_anandajgc_guilhermefl3/#language","title":"Language:","text":"
    • Python
    "},{"location":"delivery/skill3_lidiaacd_anandajgc_guilhermefl3/#libraries","title":"Libraries:","text":"
    1. flask:
    2. Flask
    3. request
    4. jsonify
    5. abort
    6. make_response
    7. session
    8. render_template
    9. flask_httpauth: Extens\u00e3o para autentica\u00e7\u00e3o HTTP b\u00e1sica.
    10. HTTPBasicAuth
    11. datetime: M\u00f3dulo para manipula\u00e7\u00e3o de datas e horas.
    12. datetime
    13. sqlite3: M\u00f3dulo para intera\u00e7\u00e3o com bancos de dados SQLite.
    14. sqlite3
    15. json: M\u00f3dulo para manipula\u00e7\u00e3o de dados JSON.
    16. json
    17. hashlib: M\u00f3dulo para algoritmos de hash seguros.
    18. hashlib
    "},{"location":"delivery/skill3_lidiaacd_anandajgc_guilhermefl3/#quickstart","title":"QuickStart","text":"
    1. Requirements:

    Certifique-se de que SQLite3 est\u00e1 instalado no seu sistema.

    • macOS:
      brew install sqlite3\n
    • Linux (Debian-based, ex.: Ubuntu):
    sudo apt-get install sqlite3\n
    • Linux (Fedora-based):

      sudo dnf install sqlite\n

    • Windows: Baixe o SQLite3 e adicione o bin\u00e1rio\u00a0ao\u00a0seu\u00a0PATH.

    • Install the dependencies

    pip install flask flask-httpauth\n
    1. Create the database
    sqlite3 quiz.db < quiz.sql\n
    1. Create the users.csv with your credentials. Example:

      admin,admin\n

    2. Add your user.

    python adduser.py\n
    1. Start the development server:
    python softdes.py\n

    Now you can see in the terminal something like this:

    If you open the url, you should see this screen:

    "},{"location":"lessons/01-distributed-workflow/","title":"01 - Distributed Development Workflow","text":"

    In this guide, we will work on the standard workflow for contributing to projects hosted on GitHub (which also applies to Git projects in general). Before starting, each student should locate the corresponding issue on the course's GitHub repository for creating their user.

    Our workflow will be based on three main parts. In the first part, we will create a copy of the repository \"insper/dev-aberto\" where we will make all the necessary changes. In the second part, we will send our modifications to the original repository using a Pull Request, which is a request to accept the changes from a forked repository into the original repository. Finally, we will update our fork with modifications sent by colleagues.

    Some key points to highlight in the above workflow:

    1. Even if a user does not have access to the original repository, they can work on their own copy and only submit their modifications to the original repository when everything is ready.
    2. It is necessary for a developer from the original project to \"take responsibility\" for the accepted external modifications.
    3. The Pull requests tab allows developers to discuss proposed modifications and improve them. Every commit made after the creation of the PR is included and can be tested by anyone.
    "},{"location":"lessons/01-distributed-workflow/#creating-your-own-copy","title":"Creating your own copy","text":"

    We will start our workflow by creating a fork of the repository \"insper/dev-aberto\". All our modifications will be made in our fork, on a separate branch (it is recommended to use a different branch for each issue). This way, our modifications are completely isolated from the original code, and we can test them alongside the original code.

    First, create the fork through the GitHub interface. Then, clone your fork and create a new branch called \"issue-X,\" where \"X\" is the number of your issue in the original project.

    $ git checkout -b issue-X

    To ensure that you are in the directory of your fork, execute the following command:

    $ git remote -vv

    The displayed addresses should be those of your fork, not the original project.

    With the fork created and being on the \"issue-X\" branch (you can check using git branch and switch using git checkout issue-X), we will begin making modifications.

    "},{"location":"lessons/01-distributed-workflow/#interacting-with-the-course-repository","title":"Interacting with the course repository","text":"

    The creation of users and addition of skills is done using the command dev-aberto.py.

    Tip

    To use it, you need to install the packages listed in the requirements.txt file.

    Running it in the terminal should list the available commands.

    $ python3 dev-aberto.py

    To check if everything is working correctly, list all registered users. There should be only one registered user (igorsm1).

    "},{"location":"lessons/01-distributed-workflow/#creating-a-user","title":"Creating a user","text":"

    User creation is done with the command:

    $ python3 dev-aberto.py new-user

    This will create three files in the students folder:

    • your-login: basic user information in JSON format.
    • your-login-achievements: encrypted file containing the deliveries of each student in JSON format.
    • your-login.key: cryptographic key for the above file.

    Verify that your user was created correctly by listing the existing users again. Your user should have an asterisk (*) next to the name, indicating that the login.key file is present in the system.

    Danger

    Do not include the *.key file in your PR. It should be sent by email to the professor. Do this now before you forget!

    Also, verify that you can use the command dev-aberto.py compute-grade your-login. If everything is okay, proceed to the next item.

    "},{"location":"lessons/01-distributed-workflow/#adding-a-skill","title":"Adding a skill","text":"

    With the user created, we can add the skill \"First Steps.\" You may have noticed that the professor's key is available (file students/igorsm1.key). This was done so that you have at least one example of how each skill should be added. See below for an example of how the skill should be included:

    $ python3 dev-aberto.py edit-achievements igorsm1

    This will open a file for editing in Vi. The format is a list of objects containing two fields: \"skill_id\" and \"metadata\". See the example below for the first skill

    [\n{\"skill_id\": 1, \"metadata\": {\"date\": \"YYYY-MM-DD\"} }\n]\n

    Tip

    If you want to use another text editor, you can set the environment variable EDITOR just before calling dev-aberto.py.

    Now add the skill to your user following the same pattern seen above. Verify that your skill was correctly added using the compute-grade command.

    Tip

    If your repository is OK, help your classmates.

    "},{"location":"lessons/01-distributed-workflow/#sending-modifications-to-the-original-project","title":"Sending modifications to the original project","text":"

    Now let's create a commit and send it as a Pull Request to the course's repository. Add the created files (excluding the *.key file!) and make a commit with the following message (replace the X with the number of your issue in the repository):

    Add user your-login.\n

    Execute git push and continue.

    With your modifications already in your fork, it's time to send them to the original repository. This is done on the GitHub interface. First, access your fork in the browser, locate your issue-X branch, and click the \"Pull request\" button.

    The title of your Pull Request should be Create user login. Your PR should contain only one commit and should have the branch issue-X created above as the source. In the description of your PR, add the text:

    Closes #X\n

    where X is the number of your user's issue. This automatically closes the issue when (and if) this PR is accepted.

    Warning

    PRs made from main or with more than one commit will not be accepted.

    Use the checklist below to help verify if your work is correct:

    • Created a new user with new-user.
    • Added the \"First Steps\" skill.
    • Checked that the new user has the new skill using compute-grade.
    • Created a PR with only one commit and the correct files.
    • Sent the .key file by email to the professor.
    • Did not include the .key file in the PR.

    Once your PR is accepted, you can remove the issue-X branch.

    "},{"location":"lessons/01-distributed-workflow/#updating-your-fork","title":"Updating your fork","text":"

    After having your PR accepted, you may have noticed that your commit appears in the original project's main branch but does not appear in your fork. This is because a fork is not automatically updated when its corresponding original repository receives new commits.

    To make this happen, you need to perform a manual synchronization. For now, we will use the GitHub interface to do this.

    Visit your fork again. Now, there should be an option to sync your fork with the original repository. Use it to make your main branch receive the new commits.

    Warning

    Sync your repository whenever you work on a new PR. This will prevent many conflicts when merging your modifications into the original repository.

    "},{"location":"lessons/01-distributed-workflow/slides/","title":"Distributed coding workflow","text":""},{"location":"lessons/01-distributed-workflow/slides/#open-source-development","title":"Open Source Development","text":""},{"location":"lessons/01-distributed-workflow/slides/#_1","title":"Distributed coding workflow","text":""},{"location":"lessons/01-distributed-workflow/slides/#course-overview-distributed-coding-workflow","title":"Course overview + Distributed coding workflow","text":""},{"location":"lessons/01-distributed-workflow/slides/#versao-20232-igor-montagner-igorsm1insperedubr","title":"Vers\u00e3o 2023/2: Igor Montagner ( igorsm1@insper.edu.br) )","text":""},{"location":"lessons/01-distributed-workflow/slides/#burocracy","title":"Burocracy","text":""},{"location":"lessons/01-distributed-workflow/slides/#meetings","title":"Meetings","text":"
    • MON 07:30 - 09:30
    • WED 07:30 - 09:30
    "},{"location":"lessons/01-distributed-workflow/slides/#office-hours","title":"Office Hours","text":"
    • On demand
    "},{"location":"lessons/01-distributed-workflow/slides/#assessment","title":"Assessment","text":"
    • Project based course with both individual and group work
    "},{"location":"lessons/01-distributed-workflow/slides/#learning-objectives","title":"Learning Objectives","text":"

    By the end of the course, the student will be able to:

    • Analyze an unfamiliar medium/large codebase and modify it to make improvements and fix software issues.
    • Interact with a remote team of developers to deliver code that meets the quality and code style standards of a project.
    • Understand the differences in open-source software licenses and how they impact the distribution and reuse of a codebase.
    "},{"location":"lessons/01-distributed-workflow/slides/#objectives-summary-version","title":"Objectives (summary version)","text":"

    By the end of the course, the student will be able to:

    • Download, understand, and modify the code of a project.
    • Successfully have their modifications accepted by the original project.
    • Understand aspects related to the distribution of software.
      • Licenses
      • Bug Tracker, Version Control, Governance, etc.
      • Documentation / Internationalization
      • User communities
    "},{"location":"lessons/01-distributed-workflow/slides/#course-syllabus","title":"Course Syllabus","text":"
    1. Software development and commercialization models.
    2. Software licenses and their impact on reuse and distribution.
    3. Tools for collaborative software development (open source or proprietary).
    4. Software and code documentation.
    5. Software translation and internationalization.
    6. Source code compilation and distribution systems.
    7. Human and community aspects in software development.
    8. Case studies of successful projects.
    "},{"location":"lessons/01-distributed-workflow/slides/#textbook","title":"Textbook","text":"

    Available online at https://producingoss.com

    "},{"location":"lessons/01-distributed-workflow/slides/#course-materials","title":"Course Materials","text":"

    GitHub: https://github.com/insper/open-dev

    Website: https://insper.github.io/open-dev/

    Blackboard will be used for announcements only. All content will be available on GitHub.

    "},{"location":"lessons/01-distributed-workflow/slides/#justification-for-the-course","title":"Justification for the Course","text":"

    In previous courses, we worked on:

    • Creating a new project.
    • Projects that typically end after the course.
    • Projects that are never used by anyone.
    "},{"location":"lessons/01-distributed-workflow/slides/#_2","title":"Distributed coding workflow","text":"

    In the industry, we usually work on existing projects:

    • Fixing issues.
    • Making improvements.
    • Projects used by multiple users.
    "},{"location":"lessons/01-distributed-workflow/slides/#why-did-i-create-the-course","title":"Why did I create the course?","text":""},{"location":"lessons/01-distributed-workflow/slides/#my-motivation-igor","title":"My motivation (Igor)","text":""},{"location":"lessons/01-distributed-workflow/slides/#my-motivation-igor_1","title":"My motivation (Igor)","text":""},{"location":"lessons/01-distributed-workflow/slides/#my-motivation-igor_2","title":"My motivation (Igor)","text":"
    • I've worked alone for 5 years
    • I've spent countless hours writting
      • a scientific paper about it
      • documentation for users and developers
    "},{"location":"lessons/01-distributed-workflow/slides/#_3","title":"Distributed coding workflow","text":""},{"location":"lessons/01-distributed-workflow/slides/#_4","title":"Distributed coding workflow","text":"
    • I learned a lot by doing this
    • I might have solved a problem no one has!
    "},{"location":"lessons/01-distributed-workflow/slides/#my-motivation-igor_3","title":"My motivation (Igor)","text":""},{"location":"lessons/01-distributed-workflow/slides/#its-not-enough-anymore-to-create-software-for-learning-purposes","title":"It's not enough (anymore) to create software for learning purposes","text":""},{"location":"lessons/01-distributed-workflow/slides/#i-would-like-to-have-some-impact","title":"I would like to have (some) impact","text":"
    • To create/contribute to software other people use
    • To write texts/tutorials that are read by someone
    • To be a part of a community that would miss me if I stop participating
    "},{"location":"lessons/01-distributed-workflow/slides/#why-are-you-here","title":"Why are you here?","text":"

    https://forms.gle/uDvnDoyxBsVoHy6S8

    "},{"location":"lessons/01-distributed-workflow/slides/#achievements-in-this-course-so-far","title":"Achievements in this Course So Far","text":""},{"location":"lessons/01-distributed-workflow/slides/#vitoria-20182","title":"Vit\u00f3ria - 2018/2","text":""},{"location":"lessons/01-distributed-workflow/slides/#spyder","title":"Spyder","text":"
    • Accepted: [1]
    "},{"location":"lessons/01-distributed-workflow/slides/#pandas","title":"Pandas","text":"
    • Accepted: [1]
    "},{"location":"lessons/01-distributed-workflow/slides/#paulo-20182","title":"Paulo - 2018/2","text":""},{"location":"lessons/01-distributed-workflow/slides/#cataclysm-dda","title":"Cataclysm: DDA","text":"
    • Accepted: [1]
    "},{"location":"lessons/01-distributed-workflow/slides/#class-20192","title":"Class - 2019/2","text":""},{"location":"lessons/01-distributed-workflow/slides/#15-students","title":"15 students","text":""},{"location":"lessons/01-distributed-workflow/slides/#19-different-projects-14-accepted-prs","title":"19 different projects, 14 accepted PRs","text":""},{"location":"lessons/01-distributed-workflow/slides/#pandas-6-accepted-contributions","title":"Pandas - 6 accepted contributions","text":""},{"location":"lessons/01-distributed-workflow/slides/#class-20201","title":"Class 2020/1","text":""},{"location":"lessons/01-distributed-workflow/slides/#16-students","title":"16 students","text":""},{"location":"lessons/01-distributed-workflow/slides/#15-different-projects-17-accepted-prs","title":"15 different projects, 17 accepted PRs","text":""},{"location":"lessons/01-distributed-workflow/slides/#pandas-matplotlib-bokeh-pygame","title":"Pandas, Matplotlib, Bokeh, Pygame","text":""},{"location":"lessons/01-distributed-workflow/slides/#course-introduction","title":"Course Introduction","text":""},{"location":"lessons/01-distributed-workflow/slides/#course-introduction_1","title":"Course Introduction","text":"

    Proposal: The course will be gamified.

    • Each student will create an avatar in the course.
    • Activities for submission earn XP.
    • Each activity is represented by a skill with a funny name.
    • All work submissions are done via Pull Request on the course's repository.
    • Significant freedom of choice
    "},{"location":"lessons/01-distributed-workflow/slides/#course-introduction-skills","title":"Course Introduction (Skills)","text":"
    • Tutorial: Guided preparatory activities in the classroom
    • Code: Code contributions to external projects
    • Community: Non-technical contributions that can benefit users and developers of a project, such as documentation and translations
    • Impact: Significant results achieved by the student's participation in open projects
    "},{"location":"lessons/01-distributed-workflow/slides/#full-list-of-skills","title":"Full list of skills","text":""},{"location":"lessons/01-distributed-workflow/slides/#course-introduction-syllabus","title":"Course Introduction (syllabus)","text":"
    • August/September: Tutorial
      • 30-60 minutes of lecture/discussions
      • Activities focused on specific topics
    • October/November: Project
      • Autonomy to define which tasks will be done
      • Semi-free choice of projects
    "},{"location":"lessons/01-distributed-workflow/slides/#course-introduction-assessment","title":"Course Introduction (assessment)","text":"
    • All submissions are individual.
    • Each learning objective is measured by several skills.
      • Some skills are mandatory.
      • Repeating a skill can earn more or fewer points than the first time.
    • Grades are based on the amount of XP obtained.
      • Freedom to decide where to invest time/effort.
    "},{"location":"lessons/01-distributed-workflow/slides/#course-introduction-assessment_1","title":"Course Introduction (assessment)","text":"
    • Final grade is a combination of XP and acquired skills.
    • Bi-weekly reports sent by email.
    • Complete conditions on the rules and skills page.
    "},{"location":"lessons/01-distributed-workflow/slides/#discussion-development-workflow","title":"Discussion: Development Workflow","text":""},{"location":"lessons/01-distributed-workflow/slides/#how-does-git-work","title":"How does Git work?","text":"

    Source: https://www.slideshare.net/abderrahmanebenbachir/continuous-integration-in-github

    Source: https://www.slideshare.net/abderrahmanebenbachir/continuous-integration-in-github

    "},{"location":"lessons/01-distributed-workflow/slides/#activity-first-steps","title":"Activity: First Steps","text":"

    Objective: Submit your first Pull Request to the course's repository.

    "},{"location":"lessons/01-distributed-workflow/slides/#open-source-development_1","title":"Open Source Development","text":""},{"location":"lessons/01-distributed-workflow/slides/#_5","title":"Distributed coding workflow","text":""},{"location":"lessons/01-distributed-workflow/slides/#course-overview-distributed-coding-workflow_1","title":"Course overview + Distributed coding workflow","text":""},{"location":"lessons/01-distributed-workflow/slides/#versao-20232-igor-montagner-igorsm1insperedubr_1","title":"Vers\u00e3o 2023/2: Igor Montagner ( igorsm1@insper.edu.br) )","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/","title":"Distributed coding workflow","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#open-source-development","title":"Open Source Development","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#_1","title":"Distributed coding workflow","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#course-overview-distributed-coding-workflow","title":"Course overview + Distributed coding workflow","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#versao-20242-fabricio-barth-fabriciojbinsperedubr","title":"Vers\u00e3o 2024/2: Fabricio Barth ( fabriciojb@insper.edu.br) )","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#burocracy","title":"Burocracy","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#meetings","title":"Meetings","text":"
    • MON 1:30 PM - 3:30 PM
    • WED 1:30 PM - 3:30 PM
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#office-hours","title":"Office Hours","text":"
    • On demand
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#assessment","title":"Assessment","text":"
    • Project based course with both individual and group work
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#learning-objectives","title":"Learning Objectives","text":"

    By the end of the course, the student will be able to:

    • Analyze an unfamiliar medium/large codebase and modify it to make improvements and fix software issues.
    • Interact with a remote team of developers to deliver code that meets the quality and code style standards of a project.
    • Understand the differences in open-source software licenses and how they impact the distribution and reuse of a codebase.
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#objectives-summary-version","title":"Objectives (summary version)","text":"

    By the end of the course, the student will be able to:

    • Download, understand, and modify the code of a project.
    • Successfully have their modifications accepted by the original project.
    • Understand aspects related to the distribution of software.
      • Licenses
      • Bug Tracker, Version Control, Governance, etc.
      • Documentation / Internationalization
      • User communities
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#course-syllabus","title":"Course Syllabus","text":"
    1. Software development and commercialization models.
    2. Software licenses and their impact on reuse and distribution.
    3. Tools for collaborative software development (open source or proprietary).
    4. Software and code documentation.
    5. Software translation and internationalization.
    6. Source code compilation and distribution systems.
    7. Human and community aspects in software development.
    8. Case studies of successful projects.
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#textbook","title":"Textbook","text":"

    Available online at https://producingoss.com

    "},{"location":"lessons/01-distributed-workflow/slides_fb/#course-materials","title":"Course Materials","text":"

    GitHub: https://github.com/insper/open-dev

    Website: https://insper.github.io/open-dev/

    Blackboard will be used for announcements only. All content will be available on GitHub.

    "},{"location":"lessons/01-distributed-workflow/slides_fb/#justification-for-the-course","title":"Justification for the Course","text":"

    In previous courses, we worked on:

    • Creating a new project.
    • Projects that typically end after the course.
    • Projects that are never used by anyone.
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#_2","title":"Distributed coding workflow","text":"

    In the industry, we usually work on existing projects:

    • Fixing issues.
    • Making improvements.
    • Projects used by multiple users.
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#why-are-you-here","title":"Why are you here?","text":"

    https://forms.gle/oMEiX5JMDEiuN5BS8

    "},{"location":"lessons/01-distributed-workflow/slides_fb/#achievements-in-this-course-so-far","title":"Achievements in this Course So Far","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#vitoria-20182","title":"Vit\u00f3ria - 2018/2","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#spyder","title":"Spyder","text":"
    • Accepted: [1]
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#pandas","title":"Pandas","text":"
    • Accepted: [1]
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#paulo-20182","title":"Paulo - 2018/2","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#cataclysm-dda","title":"Cataclysm: DDA","text":"
    • Accepted: [1]
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#class-20192","title":"Class - 2019/2","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#15-students","title":"15 students","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#19-different-projects-14-accepted-prs","title":"19 different projects, 14 accepted PRs","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#pandas-6-accepted-contributions","title":"Pandas - 6 accepted contributions","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#class-20201","title":"Class 2020/1","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#16-students","title":"16 students","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#15-different-projects-17-accepted-prs","title":"15 different projects, 17 accepted PRs","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#pandas-matplotlib-bokeh-pygame","title":"Pandas, Matplotlib, Bokeh, Pygame","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#course-introduction","title":"Course Introduction","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#course-introduction_1","title":"Course Introduction","text":"

    Proposal: The course will be gamified.

    • Each student will create an avatar in the course.
    • Activities for submission earn XP.
    • Each activity is represented by a skill with a funny name.
    • All work submissions are done via Pull Request on the course's repository.
    • Significant freedom of choice
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#course-introduction-skills","title":"Course Introduction (Skills)","text":"
    • Tutorial: Guided preparatory activities in the classroom
    • Code: Code contributions to external projects
    • Community: Non-technical contributions that can benefit users and developers of a project, such as documentation and translations
    • Impact: Significant results achieved by the student's participation in open projects
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#full-list-of-skills","title":"Full list of skills","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#course-introduction-syllabus","title":"Course Introduction (syllabus)","text":"
    • August/September: Tutorial
      • 30-60 minutes of lecture/discussions
      • Activities focused on specific topics
    • October/November: Project
      • Autonomy to define which tasks will be done
      • Semi-free choice of projects
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#course-introduction-assessment","title":"Course Introduction (assessment)","text":"
    • All submissions are individual.
    • Each learning objective is measured by several skills.
      • Some skills are mandatory.
      • Repeating a skill can earn more or fewer points than the first time.
    • Grades are based on the amount of XP obtained.
      • Freedom to decide where to invest time/effort.
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#course-introduction-assessment_1","title":"Course Introduction (assessment)","text":"
    • Final grade is a combination of XP and acquired skills.
    • Bi-weekly reports sent by email.
    • Complete conditions on the rules and skills page.
    "},{"location":"lessons/01-distributed-workflow/slides_fb/#discussion-development-workflow","title":"Discussion: Development Workflow","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#how-does-git-work","title":"How does Git work?","text":"

    Source: https://www.slideshare.net/abderrahmanebenbachir/continuous-integration-in-github

    Source: https://www.slideshare.net/abderrahmanebenbachir/continuous-integration-in-github

    "},{"location":"lessons/01-distributed-workflow/slides_fb/#activity-first-steps","title":"Activity: First Steps","text":"

    Objective: Submit your first Pull Request to the course's repository.

    "},{"location":"lessons/01-distributed-workflow/slides_fb/#open-source-development_1","title":"Open Source Development","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#_3","title":"Distributed coding workflow","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#course-overview-distributed-coding-workflow_1","title":"Course overview + Distributed coding workflow","text":""},{"location":"lessons/01-distributed-workflow/slides_fb/#versao-20242-fabricio-barth-fabriciojbinsperedubr_1","title":"Vers\u00e3o 2024/2: Fabricio Barth ( fabriciojb@insper.edu.br) )","text":""},{"location":"lessons/02-software-and-communities/","title":"02 - Software and Communities","text":"

    The activity for this class involves creating a presentation explaining how the communities around the following software projects are organized:

    1. Visual Studio Code
    2. NeoVIM
    3. Django
    4. Blender
    5. Kdenlive
    6. NewPipe
    7. Pandas
    8. Sklearn
    9. Keras
    10. Flask
    11. Elasticsearch
    12. OpenCV
    13. TensorFlow
    14. Kodi
    15. PostgreSQL

    Each group of 3 students should choose one of the above projects and research the following points.

    1. What is the purpose of the project?
    2. Where is the source code located? Which technologies are used?
    3. What is the license? Are there public guidelines or any kind of bureaucracy for contributions?
    4. Is there developer documentation?
      • Does it seem easy to compile/run?
      • Does it seem easy to modify?
    5. How is the project governed?
      • Who are the key figures (developers, evangelists, etc.) in the project? If the project is large, mention two different areas in this item.
      • Is there a public roadmap?
      • Are external contributions accepted? How can one contribute?
      • Who makes the decisions?
    6. Where can project members be found? Where can one seek help?
    7. Does the project raise funds?
      • Are there companies sponsoring developers?
      • How much has been raised? And spent? For what purposes?
      • Who decides how the funds are spent?

    Each group must create a 10 minutes presentation for the next meeting that addresses these questions.

    TODO: Create an issue on the subject repository with the title Presentation: <project name>. The issue description should contain the names of the group members.

    "},{"location":"lessons/02-software-and-communities/slides/","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides/#open-source-development","title":"Open Source Development","text":""},{"location":"lessons/02-software-and-communities/slides/#_1","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides/#software-and-communities","title":"Software and Communities","text":""},{"location":"lessons/02-software-and-communities/slides/#20232-igor-montagner-igorsm1insperedubr","title":"2023/2: Igor Montagner ( igorsm1@insper.edu.br) )","text":""},{"location":"lessons/02-software-and-communities/slides/#github-model-fork-pull-request","title":"Github Model: fork + pull request","text":"

    Source: https://www.slideshare.net/abderrahmanebenbachir/continuous-integration-in-github

    "},{"location":"lessons/02-software-and-communities/slides/#github-model-fork-pull-request_1","title":"Github Model: fork + pull request","text":"

    Source: https://www.slideshare.net/abderrahmanebenbachir/continuous-integration-in-github

    "},{"location":"lessons/02-software-and-communities/slides/#workflow-other-models","title":"Workflow: other models","text":"
    1. Send patch via email list (e.g., Linux)
    2. Code review tools (e.g., KDE - Phabricator)
    3. Patch is attached to the Bug Tracker (e.g., Haiku, KDE)
    4. Does not receive external contributions
    "},{"location":"lessons/02-software-and-communities/slides/#review-of-last-classs-prs","title":"Review of last class's PRs","text":""},{"location":"lessons/02-software-and-communities/slides/#common-errors","title":"Common Errors","text":""},{"location":"lessons/02-software-and-communities/slides/#error-0-login-achievements-file-has-errors","title":"Error 0: login-achievements file has errors","text":"

    How to fix: Create a new commit with the correct date.

    "},{"location":"lessons/02-software-and-communities/slides/#error-1-extra-files-in-the-pr","title":"Error 1: Extra files in the PR","text":"

    Error: Modifying files not related to your proposed changes.

    "},{"location":"lessons/02-software-and-communities/slides/#_2","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":"

    Ideal:

    1. A Pull Request should contain only the files related to the proposed modification.
    2. Each proposed modification is in a separate Pull Request.

    "},{"location":"lessons/02-software-and-communities/slides/#error-1-extra-files-in-the-pr_1","title":"Error 1: Extra files in the PR","text":"

    How to fix: git revert creates a commit that undoes previous changes.

    Extra options:

    • --no-commit: Only adds the modifications, but does not make the commit. Allows undoing part of a commit.

    Source: https://www.atlassian.com/git/tutorials/

    "},{"location":"lessons/02-software-and-communities/slides/#error-2-non-descriptive-commit-messages","title":"Error 2: Non-descriptive commit messages","text":"

    How to fix: git commit --amend allows modifying the last commit made.

    "},{"location":"lessons/02-software-and-communities/slides/#error-3-pull-request-with-a-poor-description","title":"Error 3: Pull Request with a poor description","text":"

    How to fix: Simply edit it in the Github interface.

    "},{"location":"lessons/02-software-and-communities/slides/#fix-at-home-and-request-review-via-github","title":"Fix at home and request review via Github","text":""},{"location":"lessons/02-software-and-communities/slides/#reminder-if-you-dont-push-nothing-is-broken","title":"Reminder: If you don't push, nothing is broken","text":""},{"location":"lessons/02-software-and-communities/slides/#reminder-ii-git-log-shows-your-current-history","title":"Reminder II: git log shows your current history","text":""},{"location":"lessons/02-software-and-communities/slides/#tip-if-you-modified-already-published-commits-use-git-push-f-to-overwrite","title":"Tip: If you modified already published commits, use git push -f to overwrite","text":""},{"location":"lessons/02-software-and-communities/slides/#not-all-students-enrolled-in-the-course-did-the-activity-from-the-last-class","title":"Not all students enrolled in the course did the activity from the last class!","text":"
    python dev-aberto.py list-users\n
    "},{"location":"lessons/02-software-and-communities/slides/#software-communities","title":"Software Communities","text":""},{"location":"lessons/02-software-and-communities/slides/#discussion","title":"Discussion","text":""},{"location":"lessons/02-software-and-communities/slides/#_3","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":"

    Question 1: What are the software you use the most in your daily life?

    "},{"location":"lessons/02-software-and-communities/slides/#_4","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides/#_5","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides/#_6","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":"

    Question 2: Who is the main developer of the project?

    "},{"location":"lessons/02-software-and-communities/slides/#example-linux-kernel","title":"Example: Linux Kernel","text":"

    Foundation supports the development of the Linux Kernel and the creation of an open-source software ecosystem around it.

    Support:

    • Financial
    • Intellectual property
    • Infrastructure
    • Services and training
    "},{"location":"lessons/02-software-and-communities/slides/#example-linux-kernel_1","title":"Example: Linux Kernel","text":"

    Companies that sponsor development:

    1. Individual (11.95%)
    2. Intel (10.01%)
    3. Red Hat (8.90%)
    4. Unknown (4.09%)
    5. IBM (3.79%)
    6. SUSE (3.49%)
    7. Linaro (2.96%)
    8. Consultants (2.96%)
    9. Google (2.79%)
    10. Samsung (2.28%)

    Source: \"2020 Linux Kernel Development Report\"

    "},{"location":"lessons/02-software-and-communities/slides/#example-ubuntu","title":"Example: Ubuntu","text":""},{"location":"lessons/02-software-and-communities/slides/#_7","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides/#_8","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides/#_9","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides/#_10","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":"

    Private company controls the development of Ubuntu. Obtains resources via:

    • Donations
    • Development and consulting services
    • Training
    "},{"location":"lessons/02-software-and-communities/slides/#example-gitlab","title":"Example: Gitlab","text":""},{"location":"lessons/02-software-and-communities/slides/#_11","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides/#_12","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides/#_13","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides/#_14","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":"

    Company funded so far by VC (Venture Capital) in search of profit.

    • Option of free plans with open-source software
    • Option of corporate plans with more features and support
    • On-premises installations
    "},{"location":"lessons/02-software-and-communities/slides/#example-elementary","title":"Example: Elementary","text":""},{"location":"lessons/02-software-and-communities/slides/#_15","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides/#_16","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":"

    Linux distribution led by a \"tiny\" company focused on the user experience. Resources are obtained through:

    • Individual and corporate sponsorships
    • Pay-what-you-want model (app store and operating system)
    • Hardware with the pre-installed system

    "},{"location":"lessons/02-software-and-communities/slides/#example-linux-mint","title":"Example: Linux Mint","text":""},{"location":"lessons/02-software-and-communities/slides/#_17","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":"

    Linux distribution aimed at everything working right after installation. Considered good for beginners.

    "},{"location":"lessons/02-software-and-communities/slides/#other-sources","title":"Other sources","text":"

    Various other ways of getting support and funding

    "},{"location":"lessons/02-software-and-communities/slides/#reasons-for-funding-company","title":"Reasons for funding (company)","text":""},{"location":"lessons/02-software-and-communities/slides/#_18","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":"
    • \"Acquire\" experts in a technology
    • Sell support or consulting services
    • Marketing
    • Software license \"obliges\"
    "},{"location":"lessons/02-software-and-communities/slides/#_19","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides/#_20","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":"

    Not everything funded ends up in a \"usable\" format for others (e.g., Android/Linux, TiVO)

    \"Tivoization is the practice of designing hardware that incorporates software under the terms of a copyleft software license like the GNU General Public License (GNU GPL), but uses hardware restrictions or digital rights management (DRM) to prevent users from running modified versions of the software on that hardware\" [Wikipedia]

    "},{"location":"lessons/02-software-and-communities/slides/#reasons-for-contributing-individual","title":"Reasons for contributing (individual)","text":"
    • Professional
      • Reputation / CV
      • Business needs
    • Personal
      • Altruism / Ideology
      • Sense of personal fulfillment
      • Exercise creativity
      • Solve a problem of personal interest
    "},{"location":"lessons/02-software-and-communities/slides/#activity-exploring-the-environment-of-a-project","title":"Activity: Exploring the environment of a project","text":"
    • Research how the communities of some projects are organized
    • Produce a presentation summarizing your findings
    "},{"location":"lessons/02-software-and-communities/slides/#open-source-development_1","title":"Open Source Development","text":""},{"location":"lessons/02-software-and-communities/slides/#_21","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides/#software-and-communities_1","title":"Software and Communities","text":""},{"location":"lessons/02-software-and-communities/slides_fb/","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#open-source-development","title":"Open Source Development","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#_1","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#software-and-communities","title":"Software and Communities","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#20242-fabricio-barth-fabriciojbinsperedubr","title":"2024/2: Fabricio Barth ( fabriciojb@insper.edu.br) )","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#github-model-fork-pull-request","title":"Github Model: fork + pull request","text":"

    Source: https://www.slideshare.net/abderrahmanebenbachir/continuous-integration-in-github

    "},{"location":"lessons/02-software-and-communities/slides_fb/#github-model-fork-pull-request_1","title":"Github Model: fork + pull request","text":"

    Source: https://www.slideshare.net/abderrahmanebenbachir/continuous-integration-in-github

    "},{"location":"lessons/02-software-and-communities/slides_fb/#workflow-other-models","title":"Workflow: other models","text":"
    1. Send patch via email list (e.g., Linux)
    1. Patch is attached to the Bug Tracker (e.g., Haiku, KDE)
    2. Does not receive external contributions
    "},{"location":"lessons/02-software-and-communities/slides_fb/#review-of-last-classs-prs","title":"Review of last class's PRs","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#common-errors","title":"Common Errors","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#error-0-login-achievements-file-has-errors","title":"Error 0: login-achievements file has errors","text":"

    Error: The date of the commit is incorrect, for example. Then, when we run the command python dev-aberto.py compute-grade <user> the result is not as expected.

    How to fix: Create a new commit with the correct content.

    "},{"location":"lessons/02-software-and-communities/slides_fb/#error-1-extra-files-in-the-pr","title":"Error 1: Extra files in the PR","text":"

    Error: Modifying files not related to your proposed changes.

    "},{"location":"lessons/02-software-and-communities/slides_fb/#_2","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":"

    Ideal:

    1. A Pull Request should contain only the files related to the proposed modification.
    2. Each proposed modification is in a separate Pull Request.

    "},{"location":"lessons/02-software-and-communities/slides_fb/#error-1-extra-files-in-the-pr_1","title":"Error 1: Extra files in the PR","text":"

    How to fix: git rm --cached <file> removes the file from the repository, but keeps it in the working directory.

    How to fix: git revert <commit_id> creates a commit that undoes the changes made by commit_id.

    Extra options:

    • --no-commit: Only adds the modifications, but does not make the commit. Allows undoing part of a commit.

    Source: https://www.atlassian.com/git/tutorials/

    "},{"location":"lessons/02-software-and-communities/slides_fb/#error-2-non-descriptive-commit-messages","title":"Error 2: Non-descriptive commit messages","text":"

    How to fix: git commit --amend allows modifying the last commit made.

    "},{"location":"lessons/02-software-and-communities/slides_fb/#error-3-pull-request-with-a-poor-description","title":"Error 3: Pull Request with a poor description","text":"

    How to fix: Simply edit it in the Github interface.

    "},{"location":"lessons/02-software-and-communities/slides_fb/#not-all-students-enrolled-in-the-course-did-the-activity-from-the-last-class","title":"Not all students enrolled in the course did the activity from the last class!","text":"
    python dev-aberto.py list-users\n

    Please, do it as soon as possible!

    "},{"location":"lessons/02-software-and-communities/slides_fb/#software-communities","title":"Software Communities","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#discussion","title":"Discussion","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#_3","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#_4","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":"

    Question 1: What are the software you use the most in your daily life?

    Question 2: Who is the main developer of the project?

    Question 3: How do you think the project is funded?

    "},{"location":"lessons/02-software-and-communities/slides_fb/#example-linux-kernel","title":"Example: Linux Kernel","text":"

    Foundation supports the development of the Linux Kernel and the creation of an open-source software ecosystem around it.

    Support:

    • Financial
    • Intellectual property
    • Infrastructure
    • Services and training
    "},{"location":"lessons/02-software-and-communities/slides_fb/#example-linux-kernel_1","title":"Example: Linux Kernel","text":"

    Companies that sponsor development:

    1. Individual (11.95%)
    2. Intel (10.01%)
    3. Red Hat (8.90%)
    4. Unknown (4.09%)
    5. IBM (3.79%)
    6. SUSE (3.49%)
    7. Linaro (2.96%)
    8. Consultants (2.96%)
    9. Google (2.79%)
    10. Samsung (2.28%)

    Source: \"2020 Linux Kernel Development Report\"

    "},{"location":"lessons/02-software-and-communities/slides_fb/#example-ubuntu","title":"Example: Ubuntu","text":"

    Private company controls the development of Ubuntu. Obtains resources via:

    • Donations
    • Development and consulting services
    • Training
    "},{"location":"lessons/02-software-and-communities/slides_fb/#example-gitlab","title":"Example: Gitlab","text":"

    Company funded so far by VC (Venture Capital) in search of profit.

    • Option of free plans with open-source software
    • Option of corporate plans with more features and support
    • On-premises installations
    "},{"location":"lessons/02-software-and-communities/slides_fb/#example-elementary","title":"Example: Elementary","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#_5","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#_6","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":"

    Linux distribution led by a \"tiny\" company focused on the user experience. Resources are obtained through:

    • Individual and corporate sponsorships
    • Pay-what-you-want model (app store and operating system)
    • Hardware with the pre-installed system

    "},{"location":"lessons/02-software-and-communities/slides_fb/#reasons-for-funding-company","title":"Reasons for funding (company)","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#_7","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":"
    • \"Acquire\" experts in a technology
    • Sell support or consulting services
    • Marketing
    "},{"location":"lessons/02-software-and-communities/slides_fb/#reasons-for-contributing-individual","title":"Reasons for contributing (individual)","text":"
    • Professional
      • Reputation / CV
      • Business needs
    • Personal
      • Altruism / Ideology
      • Sense of personal fulfillment
      • Exercise creativity
      • Solve a problem of personal interest
    "},{"location":"lessons/02-software-and-communities/slides_fb/#activity-exploring-the-environment-of-a-project","title":"Activity: Exploring the environment of a project","text":"
    • Research how the communities of some projects are organized
    • Produce a presentation summarizing your findings
    "},{"location":"lessons/02-software-and-communities/slides_fb/#open-source-development_1","title":"Open Source Development","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#_8","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/02-software-and-communities/slides_fb/#software-and-communities_1","title":"Software and Communities","text":""},{"location":"lessons/02-xpresentations-communities/","title":"02 - Software and Communities: presentations","text":""},{"location":"lessons/02-xpresentations-communities/#sechedule","title":"Sechedule","text":"

    Below is the order in which the presentations about software communities will be conducted:

    Wednesday (08/21):

    • VS code
    • NeoVim
    • Django
    • Flask
    • Sklearn

    Monday (08/26):

    • TensorFlow
    • OpenCV
    • Blender
    • PostgreSQL
    • Pandas

    Each group will have 10 minutes for the presentation and 5 minutes for questions.

    "},{"location":"lessons/02-xpresentations-communities/#pull-request","title":"Pull Request","text":"

    In order to publish your material, only one member of the group must create a PR where:

    • Add your presentation in the folder docs/delivery/
    • Edit the achievements file using the command python dev-aberto.py edit-achievements user.

    You must add a new skill to the file with this format:

    {\n    \"skill_id\": 2, \n    \"metadata\": {\n        \"date\": \"2024-08-20\", \n        \"filename\": \"your file name\", \n        \"group\":[\"user1\",\"user2\",\"users3\"]\n        }\n}\n

    where [\"user1\",\"user2\",\"users3\"] is the list of the users that are part of the group.

    "},{"location":"lessons/03-software-documentation/","title":"03 - Explorando um projeto desconhecido","text":"

    Este roteiro tem algumas perguntas com o objetivo de guiar a explora\u00e7\u00e3o do c\u00f3digo e documentar suas descobertas. Voc\u00ea tamb\u00e9m pode aplic\u00e1-lo para qualquer outro projeto mal documentado em que precisar trabalhar no futuro.

    Baixe o c\u00f3digo do projeto a ser analisado aqui e siga as perguntas. Elas s\u00e3o um guia de como explorar um projeto que voc\u00eas n\u00e3o conhecem.

    "},{"location":"lessons/03-software-documentation/#dependencias-e-servicos-usados","title":"Depend\u00eancias e servi\u00e7os usados","text":"

    Question

    Quais tecnologias s\u00e3o usadas no c\u00f3digo? Al\u00e9m da linguagem de programa\u00e7\u00e3o, liste tamb\u00e9m as bibliotecas/m\u00f3dulos externos usados.

    Question

    A aplica\u00e7\u00e3o utiliza um banco de dados. Qual gerenciador? Onde a aplica\u00e7\u00e3o busca a base de dados? Quais s\u00e3o as tabelas usadas? Como elas s\u00e3o criadas?

    "},{"location":"lessons/03-software-documentation/#deploy-inicial","title":"Deploy inicial","text":"

    Question

    A aplica\u00e7\u00e3o usa autentica\u00e7\u00e3o? Se sim, qual tipo? Como usu\u00e1rios s\u00e3o criados? Existe algum usu\u00e1rio administrador? Como \u00e9 feita a seguran\u00e7a das senhas? Qual a senha padr\u00e3o?

    Question

    Quais comandos voc\u00ea usou para rodar a aplica\u00e7\u00e3o? Escreva todos desde a cria\u00e7\u00e3o do banco de dados e dos usu\u00e1rios at\u00e9 o funcionamento completo do projeto.

    Question

    Agora que voc\u00ea consegue rodar a aplica\u00e7\u00e3o, explore-a um pouco e descreva em poucas frases para qu\u00ea ela serve.

    "},{"location":"lessons/03-software-documentation/#documentacao-do-projeto","title":"Documenta\u00e7\u00e3o do projeto","text":"

    Question

    Se voc\u00ea fosse criar um guia de usu\u00e1rio (aluno) para esta aplica\u00e7\u00e3o, quais tarefas descreveria?

    Question

    Se voc\u00ea fosse criar um guia de usu\u00e1rio (professor) para esta aplica\u00e7\u00e3o, quais tarefas descreveria?

    Question

    O qu\u00ea voc\u00ea descreveria em um guia de desenvolvedor para esta aplica\u00e7\u00e3o?

    "},{"location":"lessons/03-software-documentation/slides/","title":"Documenta\u00e7\u00e3o de Software","text":""},{"location":"lessons/03-software-documentation/slides/#desenvolvimento-aberto","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/03-software-documentation/slides/#_1","title":"Documenta\u00e7\u00e3o de Software","text":""},{"location":"lessons/03-software-documentation/slides/#fluxo-de-trabalho-distribuido-e-comunidades-de-software","title":"Fluxo de trabalho distribu\u00eddo e Comunidades de Software","text":""},{"location":"lessons/03-software-documentation/slides/#versao-20232-igor-montagner-igorsm1insperedubr","title":"Vers\u00e3o 2023/2 - Igor Montagner (igorsm1@insper.edu.br)","text":""},{"location":"lessons/03-software-documentation/slides/#ordem-das-apresentacoes","title":"Ordem das apresenta\u00e7\u00f5es","text":"
    1. VSCode
    2. Blender
    3. KDENlive
    4. NeoVim
    "},{"location":"lessons/03-software-documentation/slides/#10-minutos-cada-uma","title":"10 minutos cada uma","text":""},{"location":"lessons/03-software-documentation/slides/#atividade-explorando-o-entorno-de-um-projeto","title":"Atividade: Explorando o entorno de um projeto","text":"
    \"metadata\": {\n    \"filename\": \"nome do arquivo\",\n    \"group\": [\"login1\", \"login2\"]\n}\n
    • No group incluir os outros membros do grupo somente

    • Um membro da equipe deve fazer um PR para o projeto incluindo o arquivo da apresenta\u00e7\u00e3o. O mesmo deve ser colocado na pasta apresentacoes/2023

    "},{"location":"lessons/03-software-documentation/slides/#desenvolvimento-aberto_1","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/03-software-documentation/slides/#documentacao-de-software","title":"Documenta\u00e7\u00e3o de software","text":""},{"location":"lessons/03-software-documentation/slides/#versao-20232-igor-montagner-igorsm1insperedubr_1","title":"Vers\u00e3o 2023/2 - Igor Montagner (igorsm1@insper.edu.br)","text":""},{"location":"lessons/03-software-documentation/slides/#desenvolvimento-aberto_2","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/03-software-documentation/slides/#a-ausencia-de-documentacao-de-software","title":"(A aus\u00eancia de d)ocumenta\u00e7\u00e3o de software","text":""},{"location":"lessons/03-software-documentation/slides/#versao-20232-igor-montagner-igorsm1insperedubr_2","title":"Vers\u00e3o 2023/2 - Igor Montagner (igorsm1@insper.edu.br)","text":""},{"location":"lessons/03-software-documentation/slides/#documentacao-de-software_1","title":"Documenta\u00e7\u00e3o de software","text":"

    Documenta\u00e7\u00e3o de usu\u00e1rio:

    "},{"location":"lessons/03-software-documentation/slides/#_2","title":"Documenta\u00e7\u00e3o de Software","text":""},{"location":"lessons/03-software-documentation/slides/#_3","title":"Documenta\u00e7\u00e3o de Software","text":""},{"location":"lessons/03-software-documentation/slides/#_4","title":"Documenta\u00e7\u00e3o de Software","text":"

    Documenta\u00e7\u00e3o de desenvolvimento:

    "},{"location":"lessons/03-software-documentation/slides/#_5","title":"Documenta\u00e7\u00e3o de Software","text":""},{"location":"lessons/03-software-documentation/slides/#_6","title":"Documenta\u00e7\u00e3o de Software","text":""},{"location":"lessons/03-software-documentation/slides/#_7","title":"Documenta\u00e7\u00e3o de Software","text":""},{"location":"lessons/03-software-documentation/slides/#documentacao-de-software_2","title":"Documenta\u00e7\u00e3o de software","text":"

    Documenta\u00e7\u00e3o de usu\u00e1rio:

    • Instala\u00e7\u00e3o
    • Funcionalidades
    • Onde obter ajuda
    "},{"location":"lessons/03-software-documentation/slides/#documentacao-de-software_3","title":"Documenta\u00e7\u00e3o de software","text":"

    Documenta\u00e7\u00e3o de desenvolvimento:

    • Como compilar (depend\u00eancias, ferramentas usadas, etc)
    • Como testar (depend\u00eancias, ferramentas usadas, etc)
    • Estilo de c\u00f3digo e outras orienta\u00e7\u00f5es relacionadas
    • Organiza\u00e7\u00e3o do c\u00f3digo e arquitetura da aplica\u00e7\u00e3o
    "},{"location":"lessons/03-software-documentation/slides/#documentacao-de-software_4","title":"Documenta\u00e7\u00e3o de software","text":"

    \u00c0s vezes as coisas se confundem! O que voc\u00eas colocariam na documenta\u00e7\u00e3o de usu\u00e1rio do Python?

    E na de desenvolvedor?

    "},{"location":"lessons/03-software-documentation/slides/#exemplo-spyder","title":"Exemplo: Spyder","text":"

    https://www.spyder-ide.org/

    "},{"location":"lessons/03-software-documentation/slides/#exemplo-spyder_1","title":"Exemplo: Spyder","text":"

    https://github.com/spyder-ide/spyder/wiki

    "},{"location":"lessons/03-software-documentation/slides/#sistemas-de-documentacao","title":"Sistemas de documenta\u00e7\u00e3o","text":"

    Sphinx

    "},{"location":"lessons/03-software-documentation/slides/#sistemas-de-documentacao_1","title":"Sistemas de documenta\u00e7\u00e3o","text":"

    Mkdocs

    "},{"location":"lessons/03-software-documentation/slides/#sistemas-de-documentacao-hospedagem","title":"Sistemas de documenta\u00e7\u00e3o (hospedagem)","text":"

    https://readthedocs.org/

    "},{"location":"lessons/03-software-documentation/slides/#atividade","title":"Atividade","text":"

    Voc\u00eas receber\u00e3o um zip com o c\u00f3digo de um software e zero instru\u00e7\u00f5es. Voc\u00eas dever\u00e3o:

    1. Aprender como rodar o software
    2. Documentar os passos que voc\u00eas seguiram para faz\u00ea-lo
    3. Fazer uma an\u00e1lise cr\u00edtica do projeto com rela\u00e7\u00e3o a
      • Arquitetura
      • Qualidade do c\u00f3digo
      • Seguran\u00e7a da solu\u00e7\u00e3o
    "},{"location":"lessons/03-software-documentation/slides/#objetivos-desta-atividade","title":"Objetivos desta atividade","text":"
    1. Entender na pr\u00e1tica a necessidade de documenta\u00e7\u00e3o;
    2. Identificar quais s\u00e3o as depend\u00eancias de um software. Isto inclui bibliotecas/frameworks usados e servi\u00e7os aos quais esse software se conecta.
    3. Rodar sua pr\u00f3pria vers\u00e3o de um software de terceiros
    "},{"location":"lessons/03-software-documentation/slides/#nao-sao-objetivos-desta-atividade","title":"N\u00e3o s\u00e3o objetivos desta atividade","text":"
    1. Mostrar nenhum tipo de boa pr\u00e1tica de programa\u00e7\u00e3o
    2. Modificar o software analisado
    3. Criticar o desenvolvedor que trabalhou antes no projeto
    "},{"location":"lessons/03-software-documentation/slides/#atividade-pratica-projeto-nao-documentado","title":"Atividade pr\u00e1tica: Projeto n\u00e3o documentado","text":"

    Objetivo: entender como rodar um c\u00f3digo sem instru\u00e7\u00f5es.

    Valida\u00e7\u00e3o: apresenta\u00e7\u00e3o do sistema funcionando.

    Grupos de at\u00e9 3 pessoas

    "},{"location":"lessons/03-software-documentation/slides/#tempo-restante-de-hoje-hora-inicial-da-proxima-aula-usem-handout-como-guia","title":"Tempo restante de hoje + hora inicial da pr\u00f3xima aula. Usem handout como guia","text":""},{"location":"lessons/03-software-documentation/slides/#desenvolvimento-aberto_3","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/03-software-documentation/slides/#documentacao-de-software_5","title":"Documenta\u00e7\u00e3o de software","text":""},{"location":"lessons/03-software-documentation/slides/#versao-20232-igor-montagner-igorsm1insperedubr_3","title":"Vers\u00e3o 2023/2 - Igor Montagner (igorsm1@insper.edu.br)","text":""},{"location":"lessons/03-software-documentation/slides_fb/","title":"Documenta\u00e7\u00e3o de Software","text":""},{"location":"lessons/03-software-documentation/slides_fb/#desenvolvimento-aberto","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/03-software-documentation/slides_fb/#documentacao-de-software","title":"Documenta\u00e7\u00e3o de software","text":""},{"location":"lessons/03-software-documentation/slides_fb/#versao-20242-fabricio-barth-fabriciojbinsperedubr","title":"Vers\u00e3o 2024/2 - Fabricio Barth (fabriciojb@insper.edu.br)","text":""},{"location":"lessons/03-software-documentation/slides_fb/#documentacao-de-software_1","title":"Documenta\u00e7\u00e3o de software","text":"

    Documenta\u00e7\u00e3o de usu\u00e1rio:

    "},{"location":"lessons/03-software-documentation/slides_fb/#_1","title":"Documenta\u00e7\u00e3o de Software","text":""},{"location":"lessons/03-software-documentation/slides_fb/#_2","title":"Documenta\u00e7\u00e3o de Software","text":""},{"location":"lessons/03-software-documentation/slides_fb/#_3","title":"Documenta\u00e7\u00e3o de Software","text":"

    Documenta\u00e7\u00e3o de desenvolvimento:

    "},{"location":"lessons/03-software-documentation/slides_fb/#_4","title":"Documenta\u00e7\u00e3o de Software","text":""},{"location":"lessons/03-software-documentation/slides_fb/#_5","title":"Documenta\u00e7\u00e3o de Software","text":""},{"location":"lessons/03-software-documentation/slides_fb/#_6","title":"Documenta\u00e7\u00e3o de Software","text":""},{"location":"lessons/03-software-documentation/slides_fb/#documentacao-de-software_2","title":"Documenta\u00e7\u00e3o de software","text":"

    Documenta\u00e7\u00e3o de usu\u00e1rio:

    • Instala\u00e7\u00e3o
    • Funcionalidades
    • Onde obter ajuda
    "},{"location":"lessons/03-software-documentation/slides_fb/#documentacao-de-software_3","title":"Documenta\u00e7\u00e3o de software","text":"

    Documenta\u00e7\u00e3o de desenvolvimento:

    • Como compilar (depend\u00eancias, ferramentas usadas, etc)
    • Como testar (depend\u00eancias, ferramentas usadas, etc)
    • Estilo de c\u00f3digo e outras orienta\u00e7\u00f5es relacionadas
    • Organiza\u00e7\u00e3o do c\u00f3digo e arquitetura da aplica\u00e7\u00e3o
    "},{"location":"lessons/03-software-documentation/slides_fb/#documentacao-de-software_4","title":"Documenta\u00e7\u00e3o de software","text":"

    \u00c0s vezes as coisas se confundem! O que voc\u00eas colocariam na documenta\u00e7\u00e3o de usu\u00e1rio do Python?

    E na de desenvolvedor?

    "},{"location":"lessons/03-software-documentation/slides_fb/#exemplo-spyder","title":"Exemplo: Spyder","text":"

    https://www.spyder-ide.org/

    "},{"location":"lessons/03-software-documentation/slides_fb/#exemplo-spyder_1","title":"Exemplo: Spyder","text":"

    https://github.com/spyder-ide/spyder/wiki

    "},{"location":"lessons/03-software-documentation/slides_fb/#sistemas-de-documentacao","title":"Sistemas de documenta\u00e7\u00e3o","text":"

    Sphinx

    "},{"location":"lessons/03-software-documentation/slides_fb/#sistemas-de-documentacao_1","title":"Sistemas de documenta\u00e7\u00e3o","text":"

    Mkdocs

    "},{"location":"lessons/03-software-documentation/slides_fb/#sistemas-de-documentacao-hospedagem","title":"Sistemas de documenta\u00e7\u00e3o (hospedagem)","text":"

    https://readthedocs.org/

    "},{"location":"lessons/03-software-documentation/slides_fb/#atividade","title":"Atividade","text":"

    Voc\u00eas receber\u00e3o um zip com o c\u00f3digo de um software e zero instru\u00e7\u00f5es. Voc\u00eas dever\u00e3o:

    1. Aprender como rodar o software
    2. Documentar os passos que voc\u00eas seguiram para faz\u00ea-lo
    3. Fazer uma an\u00e1lise cr\u00edtica do projeto com rela\u00e7\u00e3o a
      • Arquitetura
      • Qualidade do c\u00f3digo
      • Seguran\u00e7a da solu\u00e7\u00e3o
    "},{"location":"lessons/03-software-documentation/slides_fb/#objetivos-desta-atividade","title":"Objetivos desta atividade","text":"
    1. Entender na pr\u00e1tica a necessidade de documenta\u00e7\u00e3o;
    2. Identificar quais s\u00e3o as depend\u00eancias de um software. Isto inclui bibliotecas/frameworks usados e servi\u00e7os aos quais esse software se conecta.
    3. Rodar sua pr\u00f3pria vers\u00e3o de um software de terceiros
    "},{"location":"lessons/03-software-documentation/slides_fb/#nao-sao-objetivos-desta-atividade","title":"N\u00e3o s\u00e3o objetivos desta atividade","text":"
    1. Mostrar nenhum tipo de boa pr\u00e1tica de programa\u00e7\u00e3o
    2. Modificar o software analisado
    3. Criticar o desenvolvedor que trabalhou antes no projeto
    "},{"location":"lessons/03-software-documentation/slides_fb/#atividade-pratica-projeto-nao-documentado","title":"Atividade pr\u00e1tica: Projeto n\u00e3o documentado","text":"

    Objetivo: entender como rodar um c\u00f3digo sem instru\u00e7\u00f5es.

    Valida\u00e7\u00e3o: apresenta\u00e7\u00e3o do sistema funcionando.

    Grupos de at\u00e9 3 pessoas

    "},{"location":"lessons/03-software-documentation/slides_fb/#tempo-restante-de-hoje","title":"Tempo restante de hoje","text":""},{"location":"lessons/03-software-documentation/slides_fb/#desenvolvimento-aberto_1","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/03-software-documentation/slides_fb/#documentacao-de-software_5","title":"Documenta\u00e7\u00e3o de software","text":""},{"location":"lessons/03-software-documentation/slides_fb/#versao-20242-fabricio-barth-fabriciojbinsperedubr_1","title":"Vers\u00e3o 2024/2 - Fabr\u00edcio Barth (fabriciojb@insper.edu.br)","text":""},{"location":"lessons/04-professional-project/","title":"04 - Professional Project","text":"

    There is a moment in a project's history where it is already useful for the author and other people are starting to get interested in it. Software documentation, clear install instructions and being free of errors are important to these people but are not necessarily essential to the authors, who are used to fix problem when they appear and are familiar with every aspect of the code. We will transform a project like this into a project that is ready to be used by other people and that can receive contributions from other developers.

    {\"skill_id\": 4, \"metadata\": {\"date\": \"2022-09-01\", \"url\": \"http...\", \"group\": []}\n

    Done

    Form a pair and select a project that one of you worked on during your degree. We will transform it into a complete project that other people can use and contribute to.

    "},{"location":"lessons/04-professional-project/#deliverables","title":"Deliverables","text":"

    This is a project for more than one meeting and can be done in pairs.

    "},{"location":"lessons/04-professional-project/#software-documentation","title":"Software documentation","text":"
    • Create a website for the project, including screenshots and animations about its usage
    • Create a wiki with instructions for developers
      • build instructions
      • code organization
      • technologies used

    Tip

    Use mkdocs or other static site generator tools to create the website. Jekyll is also a popular choice.

    "},{"location":"lessons/04-professional-project/#project-quality","title":"Project quality","text":"
    • Create README with project description, screenshot and links to documentation
    • Organize repo with source code in a src folder and documentation in docs
    • Execute a linter in your project and export its output to one or more issues with names related to code quality improvements
    • Execute pydoc, or any other similar tool, in your project and add the output to the project documentation.
    "},{"location":"lessons/04-professional-project/slides/","title":"Documenta\u00e7\u00e3o de API e linters","text":""},{"location":"lessons/04-professional-project/slides/#desenvolvimento-aberto","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/04-professional-project/slides/#documentacao-de-api-e-linters","title":"Documenta\u00e7\u00e3o de API e linters","text":""},{"location":"lessons/04-professional-project/slides/#igor-dos-santos-montagner-igorsm1insperedubr","title":"Igor dos Santos Montagner ( igorsm1@insper.edu.br )","text":""},{"location":"lessons/04-professional-project/slides/#discussao-o-que-faz-o-projeto","title":"Discuss\u00e3o: o que faz o projeto?","text":""},{"location":"lessons/04-professional-project/slides/#servidor-de-desafios","title":"Servidor de desafios","text":"

    Voc\u00eas rodaram um MVP do servidor de desafios. Veja abaixo seu estado atual:

    https://github.com/Insper/servidor-de-desafios

    "},{"location":"lessons/04-professional-project/slides/#servidor-de-desafios_1","title":"Servidor de desafios","text":""},{"location":"lessons/04-professional-project/slides/#discussao-como-o-projeto-esta-organizado-tecnologias","title":"Discuss\u00e3o: como o projeto est\u00e1 organizado? (tecnologias)","text":""},{"location":"lessons/04-professional-project/slides/#discussao-como-o-projeto-esta-organizado-codigo","title":"Discuss\u00e3o: como o projeto est\u00e1 organizado? (c\u00f3digo)","text":""},{"location":"lessons/04-professional-project/slides/#discussao-avalie-a-arquitetura-do-projeto","title":"Discuss\u00e3o: avalie a arquitetura do projeto","text":""},{"location":"lessons/04-professional-project/slides/#0-a-10","title":"0 a 10","text":""},{"location":"lessons/04-professional-project/slides/#discussao-avalie-a-qualidade-de-codigo-do-projeto","title":"Discuss\u00e3o: avalie a qualidade de c\u00f3digo do projeto.","text":""},{"location":"lessons/04-professional-project/slides/#0-a-10_1","title":"0 a 10","text":""},{"location":"lessons/04-professional-project/slides/#discussao-avalie-a-seguranca-do-projeto","title":"Discuss\u00e3o: avalie a seguran\u00e7a do projeto.","text":""},{"location":"lessons/04-professional-project/slides/#0-a-10_2","title":"0 a 10","text":""},{"location":"lessons/04-professional-project/slides/#discussao-esse-projeto-e-um-projeto-profissional","title":"Discuss\u00e3o: esse projeto \u00e9 um projeto \"profissional\"?","text":""},{"location":"lessons/04-professional-project/slides/#0-a-10_3","title":"0 a 10","text":""},{"location":"lessons/04-professional-project/slides/#discussao-o-que-voce-incluiria-na-documentacao-do-projeto","title":"Discuss\u00e3o: o que voc\u00ea incluiria na documenta\u00e7\u00e3o do projeto?","text":""},{"location":"lessons/04-professional-project/slides/#software-tem-historia-e-depende-de-pessoas-para-evoluir","title":"Software tem hist\u00f3ria e depende de pessoas para evoluir","text":""},{"location":"lessons/04-professional-project/slides/#codigo-vs-software-profissional","title":"C\u00f3digo vs software profissional","text":"

    Os seguintes pontos transformam um c\u00f3digo que fiz para mim em algo \u00fatil para outras pessoas

    1. Tradu\u00e7\u00f5es e internacionaliza\u00e7\u00e3o (datas)
    2. Documenta\u00e7\u00e3o de usu\u00e1rio e de desenvolvimento
    3. Algum processo de qualidade de software
      • testes automatizados
      • formata\u00e7\u00e3o de c\u00f3digo e estrutura de repo
    4. pacotes de instala\u00e7\u00e3o
    "},{"location":"lessons/04-professional-project/slides/#hoje","title":"Hoje","text":"
    • Ferramentas de documenta\u00e7\u00e3o
    • Documenta\u00e7\u00e3o de API usando
    • Padr\u00f5es de formata\u00e7\u00e3o de c\u00f3digo
      • linters
      • PEP8
    "},{"location":"lessons/04-professional-project/slides/#documentacao-de-api","title":"Documenta\u00e7\u00e3o de API","text":"

    Objetivo: explicar o funcionamento das fun\u00e7\u00f5es, classes e m\u00f3dulos de um programa.

    • Focado em detalhes
    • Documenta os argumentos esperados e em quais situa\u00e7\u00f5es a fun\u00e7\u00e3o funciona
    • Tipicamente obtida direto do c\u00f3digo
    • N\u00e3o detalha como as fun\u00e7\u00f5es s\u00e3o usadas em conjunto
    "},{"location":"lessons/04-professional-project/slides/#documentacao-de-api_1","title":"Documenta\u00e7\u00e3o de API","text":""},{"location":"lessons/04-professional-project/slides/#documentacao-de-api_2","title":"Documenta\u00e7\u00e3o de API","text":"

    ref

    "},{"location":"lessons/04-professional-project/slides/#ferramentas","title":"Ferramentas","text":"
    • Python:
      • pydoc, numpydoc
    • C/C++
      • Doxygen
    • Java
      • Javadoc

    Em geral podem ser plugadas em alguma ferramenta de documenta\u00e7\u00e3o de projetos.

    "},{"location":"lessons/04-professional-project/slides/#padroes-de-codificacao","title":"Padr\u00f5es de codifica\u00e7\u00e3o","text":""},{"location":"lessons/04-professional-project/slides/#padroes-de-codificacao_1","title":"Padr\u00f5es de codifica\u00e7\u00e3o","text":""},{"location":"lessons/04-professional-project/slides/#padroes-de-codificacao_2","title":"Padr\u00f5es de codifica\u00e7\u00e3o","text":"
    • Cada projeto tem o seu
    • Algumas linguagens tem um estilo padr\u00e3o
      • Python - PEP8
    • Ferramentas ajudam a conferir (for\u00e7ar) um estilo espec\u00edfico
    "},{"location":"lessons/04-professional-project/slides/#ferramentas_1","title":"Ferramentas","text":"
    • Python: pylint, black
    • C/C++: splint, cppchecker, gcc (op\u00e7\u00f5es -Wall, -Wextra), clang-format/-tidy
    • Java: flag -Xlint
    • Javascript: ESlint, TSlint (typescript)
    "},{"location":"lessons/04-professional-project/slides/#_1","title":"Documenta\u00e7\u00e3o de API e linters","text":"

    Ajudam a manter c\u00f3digo limpo e leg\u00edvel. Podem ser plugadas no seu editor favorito.

    "},{"location":"lessons/04-professional-project/slides/#execucao-obrigatoria-para-muitos-projetos-grandes","title":"Execu\u00e7\u00e3o obrigat\u00f3ria para muitos projetos grandes","text":""},{"location":"lessons/04-professional-project/slides/#atividade-pratica-projeto-profissional","title":"Atividade pr\u00e1tica: Projeto profissional","text":"

    Objetivo: Transformar um c\u00f3digo perdido em um projeto

    \"metadata\": {\"url\": \"github pages criado\", \"group\": [\"ate tr\u00eas\", \"alunos\"]}

    "},{"location":"lessons/04-professional-project/slides/#desenvolvimento-aberto_1","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/04-professional-project/slides/#documentacao-de-api-testes","title":"Documenta\u00e7\u00e3o de API + testes","text":""},{"location":"lessons/04-professional-project/slides/#igor-dos-santos-montagner-igorsm1insperedubr_1","title":"Igor dos Santos Montagner ( igorsm1@insper.edu.br )","text":""},{"location":"lessons/05-python-packaging/","title":"05 - Distribui\u00e7\u00e3o de Software","text":"

    Nesta aula complementaremos as \u00faltimas discuss\u00f5es criando um pequeno pacote Python instal\u00e1vel via pip. Com isto chegamos mais perto de um projeto que esteja preparado para que outras pessoas o utilizem e colaborem em seu desenvolvimento.

    "},{"location":"lessons/05-python-packaging/#distribuindo-software-para-desenvolvedores-pacote-python-basico","title":"Distribuindo software para desenvolvedores: pacote Python b\u00e1sico","text":"

    Nosso m\u00f3dulo se chamar\u00e1 dev_aberto e disponibilizar\u00e1 um programa execut\u00e1vel hello.py. Crie a seguinte estrutura de pastas para nosso pacote.

    Important

    Baixe os arquivos que usaremos neste link

    pacote_exemplo/\n    dev_aberto/\n        __init__.py\n        dev_aberto.py\n    scripts/\n        hello.py\n    README.md\n    LICENSE\n

    Exercise

    com a estrutura acima, qual seria o import a ser feito para usar a fun\u00e7\u00e3o hello do arquivo dev_aberto.py?

    Exercise

    Pesquise para que serve o arquivo __init__.py e use-o para permitir importar hello usando somente import dev_aberto.

    Exercise

    Crie um projeto no github para esta atividade. Fa\u00e7a um primeiro commit nele com o conte\u00fado \"zerado\" do projeto.

    • Um arquivo README contendo uma frase de descri\u00e7\u00e3o do pacote e um link para o reposit\u00f3rio da disciplina.
    • Um arquivo LICENSE com a licen\u00e7a MIT.
    "},{"location":"lessons/05-python-packaging/#o-arquivo-setuppy","title":"O arquivo setup.py","text":"

    A descri\u00e7\u00e3o de um pacote Python \u00e9 feita usando um arquivo setup.py Veja abaixo uma vers\u00e3o inicial deste arquivo:

    from setuptools import setup\n\nsetup(name='dev_aberto_seunome',\n      version='0.1',\n      packages=['dev_aberto']\n      )\n

    Exercise

    Crie o arquivo acima no seu projeto, substituindo seunome por .... seu nome. Instale o seu pr\u00f3prio pacote usando

    pip install .

    Exercise

    Em outra pasta, abra um console Python e tente importar seu m\u00f3dulo.

    Exercise

    Pesquise quais argumentos s\u00e3o usados para especificar o autor do pacote, as vers\u00f5es de Python e sistemas operacionais suportados. Preencha estes valores com suas informa\u00e7\u00f5es. Note que o pip leva estas informa\u00e7\u00f5es em conta e s\u00f3 instalar\u00e1 um pacote se ele estiver em um ambiente suportado.

    "},{"location":"lessons/05-python-packaging/#dependencias","title":"Depend\u00eancias","text":"

    Para adicionar pacotes que s\u00e3o automaticamente instalados quando instalamos nosso pacote precisamos identific\u00e1-los no nosso arquivo setup.py. Para adicionar uma depend\u00eancia de instala\u00e7\u00e3o basta adicionar o seguinte argumento:

        ...\n    install_requires=[\n        'pacote>=1.0',\n        'pacote2'\n    ],\n    ...\n

    Exercise

    Verifique as depend\u00eancias do c\u00f3digo e adicione-as no setup.py.

    "},{"location":"lessons/05-python-packaging/#requirementstxt","title":"requirements.txt","text":"

    Muitos softwares usam tamb\u00e9m um arquivo requirements.txt para listar todas as depend\u00eancias do software de modo a obter uma instala\u00e7\u00e3o id\u00eantica \u00e0 do desenvolvedor. Isto \u00e9 importante para uniformizar os ambientes de desenvolvimento. Ou seja, este arquivo nunca ser\u00e1 usado por usu\u00e1rios finais.

    Exercise

    Crie um requirements.txt para seu projeto com as mesmas depend\u00eancias listadas no seu setup.py.

    "},{"location":"lessons/05-python-packaging/#scripts-executaveis","title":"Scripts execut\u00e1veis","text":"

    Al\u00e9m de instalar o nosso m\u00f3dulo para uso via import desejamos tamb\u00e9m disponibilizar o arquivo hello.py como um execut\u00e1vel para todo o sistema. Isto pode ser feito adicionando a seguinte linha no nosso setup.py indicando que scripts/hello.py dever\u00e1 ser instalado como um execut\u00e1vel.

        ...\n    scripts=['scripts/hello.py'],\n    ...\n

    N\u00e3o se esque\u00e7a de adicionar a seguinte linha no topo de seu arquivo para que ele possa ser executado diretamente do shell:

    #!/usr/bin/env python3\n

    No Windows \u00e9 criado um execut\u00e1vel que chama nosso script, de modo que as chamadas do execut\u00e1vel continuar\u00e3o funcionando normalmente. Note que isto n\u00e3o cria menus em nenhum tipo de interface gr\u00e1fica.

    "},{"location":"lessons/05-python-packaging/#criando-arquivos-de-distribuicao","title":"Criando arquivos de distribui\u00e7\u00e3o","text":"

    Dois tipos de arquivos de distribui\u00e7\u00e3o podem ser usados:

    • sdist: \u00e9 um arquivo contendo os fontes do projeto, incluindo arquivos adicionais especificados usando o argumento data_files. Usado se seu projeto for Python-puro.
    • wheel: \u00e9 um formato pr\u00e9-compilado e espec\u00edfico para cada plataforma. Mais usado quando o projeto cont\u00e9m extens\u00f5es em C.

    A cria\u00e7\u00e3o de um arquivo de distribui\u00e7\u00e3o de fontes \u00e9 bem simples:

    $ python setup.py sdist

    A instala\u00e7\u00e3o deste pacote pode ser feita via pip.

    "},{"location":"lessons/05-python-packaging/#envio-para-o-pypi","title":"Envio para o PyPI","text":"

    Vamos agora enviar nosso pacote para o Python Package Index para que ele possa ser instalado diretamente via pip. Para n\u00e3o poluir o reposit\u00f3rio com pacotes tempor\u00e1rios e de teste, podemos usar o TestPyPI. Toda sua infraestrutura \u00e9 igual ao oficial, mas ele \u00e9 limpo de maneira regular.

    Visite https://test.pypi.org/account/register/ e registre-se no TestPyPI.

    Ap\u00f3s o registro, usaremos o pacote twine (instal\u00e1vel via pip) para fazer o upload:

    $ twine upload --repository-url https://test.pypi.org/legacy/ dist/*

    Voc\u00ea poder\u00e1, ent\u00e3o, instalar seu pacote a partir do test PyPI usando o seguinte comando:

    $ pip install --index-url https://test.pypi.org/simple/ my_hello_nome

    "},{"location":"lessons/05-python-packaging/#entrega","title":"Entrega","text":"

    Fa\u00e7a a entrega de sua atividade adicionando a skill Pacote Python e inclua nela a url do seu reposit\u00f3rio no github.

    Objetivo: Primeira experi\u00eancia distribuindo software Python.

    \"skill_id\": 6, \"metadata\": {\"url\": \"repo-seu-pacote\"}

    "},{"location":"lessons/05-python-packaging/#distribuindo-software-para-usuarios-finais","title":"Distribuindo software para usu\u00e1rios finais","text":"

    Vamos agora trabalhar (em duplas) no Servidor de Desafios novamente. Seu trabalho ser\u00e1 criar um Dockerfile que roda o software de maneira \"completa\". Ou seja, o script de cria\u00e7\u00e3o do container dever\u00e1

    • instalar todas as depend\u00eancias do sistema
    • criar a base de dados, se necess\u00e1rio
    • adicionar os usu\u00e1rios presentes no arquivo users.csv, se necess\u00e1rio
    • executar o servidor e serv\u00ed-lo na porta 8080 do host
    • manter os dados adicionados ao reiniciar o container
    "},{"location":"lessons/05-python-packaging/#entrega_1","title":"Entrega","text":"

    Fa\u00e7a a entrega de sua atividade adicionando a skill Dockerfile segundo o modelo abaixo.

    Objetivo: Criou deploy automatizado para sistema web Python

    \"skill_id\": 7, \"metadata\": {\"url\": \"repo-servidor-de-desafios\", \"group\": [\"login1\", \"login2\"]}

    "},{"location":"lessons/05-python-packaging/#referencias","title":"Refer\u00eancias","text":"

    Algumas refer\u00eancias que podem ser \u00fateis:

    • https://docker-curriculum.com/
    • https://docs.docker.com/get-started/
    "},{"location":"lessons/06-localization-translation/","title":"06 - Localiza\u00e7\u00e3o e Tradu\u00e7\u00e3o","text":"

    Na parte expositiva da aula tivemos uma introdu\u00e7\u00e3o aos problemas de Internacionaliza\u00e7\u00e3o (i18n) e Localiza\u00e7\u00e3o (L10N). Neste roteiro iremos praticar o uso destas t\u00e9cnicas em uma aplica\u00e7\u00e3o linha de comando de exemplo simples.

    Em ambos exemplos vamos trabalhar com o m\u00f3dulo Babel, que \u00e9 feito para facilitar a tradu\u00e7\u00e3o e localiza\u00e7\u00e3o de aplica\u00e7\u00f5es feitas em Python. Outras linguagens de programa\u00e7\u00e3o possuem bibliotecas similares que seguem a mesma sequ\u00eancia de comandos e usam os mesmos tipos de arquivos.

    $ pip install Babel

    Sistemas POSIX suportam a determina\u00e7\u00e3o do locale utilizado por meio da vari\u00e1vel de ambiente LANGUAGE, que pode ser modificada para cada execu\u00e7\u00e3o de um programa. O formato padr\u00e3o usado \u00e9 <lingua>_<pais>.<codificacao>. Para portugu\u00eas do Brasil usando codifica\u00e7\u00e3o UTF8 usamos o locale pt_BR.utf8. Rodando o seguinte comando as mensagens de ajuda do ls devem aparecer em ingl\u00eas.

    $ LANGUAGE=en_US.utf8 ls --help

    J\u00e1 executando o comando abaixo elas devem aparecer em portugu\u00eas.

    $ LANGUAGE=pt_BR.utf8 ls --help

    De maneira mais geral, existe uma s\u00e9rie de vari\u00e1veis LC_* que controlam qual locale \u00e9 usado para determinado tipo de dados. Veremos a seguir como usar LC_TIME e LC_NUMERIC para controlar como datas e n\u00fameros s\u00e3o exibidos e LANGUAGE para definir a lingua de exibi\u00e7\u00e3o de um programa.

    "},{"location":"lessons/06-localization-translation/#localizando-um-programa-em-python","title":"Localizando um programa em Python","text":"

    Vamos trabalhar com uma aplica\u00e7\u00e3o de linha de comando que nada mais faz que imprimir alguns dados simples como data em extenso, um n\u00famero fracion\u00e1rio grande e uma mensagem pr\u00e9-definida. O c\u00f3digo completo (arquivo cli.py) est\u00e1 abaixo.

    from datetime import date\n\nif __name__ == '__main__':\n    today = date.today()\n    print(today)\n\n    number = 240000000000.32212\n    print(number)\n\n    name = input('Input your name: ')\n    print('Hello {}'.format(name))\n
    Uma sa\u00edda poss\u00edvel seria

    2018-08-28\n240000000000.3221\nInput your name: Igor\nHello Igor\n

    Como j\u00e1 visto em aula, este programa re\u00fane tr\u00eas das principais sa\u00eddas que precisam ser formatadas: datas, n\u00fameros fracion\u00e1rios e mensagens para o usu\u00e1rio.

    "},{"location":"lessons/06-localization-translation/#formatando-datas","title":"Formatando datas","text":"

    A formata\u00e7\u00e3o de datas \u00e9 governada para vari\u00e1vel LC_TIME. O m\u00f3dulo babel.dates j\u00e1 possui diversas fun\u00e7\u00f5es que automaticamente a utilizam para fazer a localiza\u00e7\u00e3o de vari\u00e1veis do tipo Date (usando a fun\u00e7\u00e3o format_date) ou DateTime (usando format_datetime).

    Exercise

    Pesquise como usar estas fun\u00e7\u00f5es e utilize-as no seu programa para localizar a data por extenso (ou seja, 31 de agosto de 2021).

    Exercise

    O qu\u00ea acontece quando definimos a vari\u00e1vel de ambiente LC_TIME=en_US.utf8 e rodamos o programa? E se usamos LC_TIME=pt_BR.utf8?

    "},{"location":"lessons/06-localization-translation/#formatando-numeros","title":"Formatando n\u00fameros","text":"

    A formata\u00e7\u00e3o de datas \u00e9 governada para vari\u00e1vel LC_NUMERIC. O m\u00f3dulo babel.numbers possui a fun\u00e7\u00e3o format_number que formata um n\u00famero de acordo com esta configura\u00e7\u00e3o.

    Exercise

    Pesquise como usar estas fun\u00e7\u00f5es e utilize-as no seu programa para localizar o n\u00famero fracion\u00e1rio mostrado.

    Exercise

    Teste seu programa com LC_NUMERIC=en_US.utf8 e LC_NUMERIC=pt_BR.utf8. Os efeitos s\u00e3o os esperados?s

    "},{"location":"lessons/06-localization-translation/#traduzindo-mensagens","title":"Traduzindo mensagens","text":"

    A parte final consiste em criar tradu\u00e7\u00f5es das duas strings presentes no texto. A linguagem usada \u00e9 definida pela vari\u00e1vel LANGUAGE, que pode ser definida separadamente para cada processo. Um dos pontos mais importantes \u00e9 marcar quais strings dever\u00e3o ser traduzidas para que uma equipe de tradutores n\u00e3o precise mexer no c\u00f3digo. O m\u00f3dulo gettext do Python j\u00e1 prov\u00ea suporte a esta funcionalidade, o Babel apenas fornece um conjunto de ferramentas que facilita seu uso.

    A implanta\u00e7\u00e3o do framework de tradu\u00e7\u00e3o \u00e9 feita em quatro passos:

    1. Marca\u00e7\u00e3o das strings a serem traduzidas
    2. Extra\u00e7\u00e3o destas strings do c\u00f3digo em um arquivo modelo .pot
    3. Cria\u00e7\u00e3o de tradu\u00e7\u00f5es .po a partir do modelo criado no passo anterior
    4. Compila\u00e7\u00e3o das strings traduzidas em um arquivo bin\u00e1rio .mo

    No arquivo principal de nossa aplica\u00e7\u00e3o podemos \"instalar\" o framework de tradu\u00e7\u00e3o e marcar todas nossas strings a serem traduzidas com a fun\u00e7\u00e3o _(). A instala\u00e7\u00e3o \u00e9 feita pelo seguinte trecho de c\u00f3digo.

    import gettext\ngettext.bindtextdomain('cli', 'locale')\ngettext.textdomain('cli')\n_ = gettext.gettext\n\n# cli \u00e9 o nome do arquivo em que guardamos nossas tradu\u00e7\u00f5es\n# localedir \u00e9 o caminho onde est\u00e3o armazenadas as tradu\u00e7\u00f5es. Pode ser um caminho relativo. \n

    Devemos ent\u00e3o marcar todas as strings para serem traduzidas com _(). Podemos usar _() em qualquer arquivo do projeto, mesmo que a instala\u00e7\u00e3o tenha sido feita somente no arquivo principal.

    print(_(\"Hello!\"))\n

    Os passos seguintes s\u00e3o feitos com aux\u00edlio do Babel, que efetivamente analisa nosso c\u00f3digo Python e extrai as strings para tradu\u00e7\u00e3o. A cria\u00e7\u00e3o do arquivo modelo de tradu\u00e7\u00e3o a partir dos arquivos do diret\u00f3rio atual \u00e9 feita com o seguinte comando.

    $ pybabel extract . -o cli-model.pot

    Criamos ent\u00e3o uma nova tradu\u00e7\u00e3o usando o seguinte comando. A op\u00e7\u00e3o -D indica o nome do arquivo em que as tradu\u00e7\u00f5es ser\u00e3o guardadas (usado em gettext.install). A op\u00e7\u00e3o -l indica o locale da tradu\u00e7\u00e3o. A op\u00e7\u00e3o -d indica o localedir usado em gettext.install.

    $ pybabel init -i cli-model.pot -D cli -l pt_BR -d locale

    Devemos ent\u00e3o editar o arquivo criado em locale/pt_BR/LC_MESSAGES/cli.po. Ser\u00e3o apresentados (ap\u00f3s algumas linhas de coment\u00e1rios) pares de linhas como as seguintes. O primeiro valor msgid \u00e9 a string a ser traduzida e o segundo msgstr \u00e9 a tradu\u00e7\u00e3o no locale pt_BR (pois o arquivo est\u00e1 na pasta pt_BR do localedir).

    msgid \"Input your name: \"\nmsgstr \"\"\n

    Apesar de ser poss\u00edvel fazer tudo diretamente no arquivo de texto, \u00e9 mais conveniente usar softwares como o poedit ou este editor online(https://localise.biz/free/poeditor).

    Com as strings traduzidas vamos finalmente compilar nossos resultados. Isto \u00e9 feito para que n\u00e3o seja poss\u00edvel mexer nos arquivos de tradu\u00e7\u00e3o em uma vers\u00e3o Release do programa.

    $ pybabel compile -D cli -l pt_BR -d locale

    Isto gerar\u00e1 os arquivos .mo correspondentes a ao locale pt_BR. S\u00e3o estes os arquivos carregados durante a execu\u00e7\u00e3o do programa.

    "},{"location":"lessons/06-localization-translation/#teste-final","title":"Teste final","text":"

    Podemos definir a vari\u00e1vel LANGUAGE para modificar a lingua de um programa (como visto anteriormente com ls). Execute seu programa diretamente e depois setando LANGUAGE=pt_BR.utf8. Os resultados foram os esperados?

    "},{"location":"lessons/06-localization-translation/#entrega","title":"Entrega","text":"

    Modifique o exerc\u00edcio da aula passada (pacote python) para suportar datas e mensagens em Ingl\u00eas e Portugu\u00eas. Fa\u00e7a a entrega de sua atividade adicionando a skill Tradu\u00e7\u00e3o b\u00e1sica segundo o modelo abaixo.

    Objetivo: Aplicou ferramentas de localiza\u00e7\u00e3o para traduzir um programa simples em linha de comando.

    \"skill_id\": 8, \"metadata\": {\"url\": \"repo-pacote-python\"}

    "},{"location":"lessons/06-localization-translation/slides/","title":"Tradu\u00e7\u00e3o e localiza\u00e7\u00e3o de software","text":""},{"location":"lessons/06-localization-translation/slides/#desenvolvimento-aberto","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/06-localization-translation/slides/#localizacao-e-internacionalizacao-de-software","title":"Localiza\u00e7\u00e3o e internacionaliza\u00e7\u00e3o de software","text":""},{"location":"lessons/06-localization-translation/slides/#versao-20232-igor-montagner-igorsm1insperedubr","title":"Vers\u00e3o 2023/2: Igor Montagner (igorsm1@insper.edu.br)","text":""},{"location":"lessons/06-localization-translation/slides/#traducao-de-software","title":"Tradu\u00e7\u00e3o de software","text":""},{"location":"lessons/06-localization-translation/slides/#qual-a-diferenca-de-internacionalizacao-e-localizacao","title":"Qual a diferen\u00e7a de internacionaliza\u00e7\u00e3o e localiza\u00e7\u00e3o?","text":""},{"location":"lessons/06-localization-translation/slides/#internacionalizacao-i18n","title":"Internacionaliza\u00e7\u00e3o (I18N)","text":"
    • Consiste em traduzir a interface de usu\u00e1rio de um software para outros idiomas.

    • Sistema Operacional guarda configura\u00e7\u00f5es de idioma e as disponibiliza para aplica\u00e7\u00f5es

    • Tipicamente \"invis\u00edvel\"

    "},{"location":"lessons/06-localization-translation/slides/#localizacao-l10n","title":"Localiza\u00e7\u00e3o (L10N)","text":"

    Consiste em adaptar a maneira de mostrar

    • n\u00fameros fracion\u00e1rios
      • marcador de decimais
      • marcador de milhares
    • datas
      • nomes de meses
      • ordem de exibi\u00e7\u00e3o
    • nomes de pa\u00edses, fusos hor\u00e1rios, etc

    de acordo com as prefer\u00eancias de um usu\u00e1rio e relativos a sua cultura.

    "},{"location":"lessons/06-localization-translation/slides/#i18n-e-l10n","title":"I18N e L10N","text":"

    Precisam ser

    • independentes:
      • idioma ingl\u00eas e datas no formato brasileiro
    • configur\u00e1veis
      • posso precisar trocar entre l\u00ednguas e entre formatos
    "},{"location":"lessons/06-localization-translation/slides/#o-suporte-a-l10n-e-i18n-implica-modificar-codigo-fonte","title":"O suporte a L10N e I18N implica modificar c\u00f3digo fonte.","text":""},{"location":"lessons/06-localization-translation/slides/#locales","title":"Locales","text":"

    Um locale \u00e9 uma tripla

    "},{"location":"lessons/06-localization-translation/slides/#_1","title":"Tradu\u00e7\u00e3o e localiza\u00e7\u00e3o de software","text":"
    <lingua>_<pais>.<codificacao>\n
    "},{"location":"lessons/06-localization-translation/slides/#_2","title":"Tradu\u00e7\u00e3o e localiza\u00e7\u00e3o de software","text":"

    que representa configura\u00e7\u00f5es de I18N e/ou L10N para uma determinada cultura.

    "},{"location":"lessons/06-localization-translation/slides/#locales_1","title":"Locales","text":"

    Exemplos:

    • Tradu\u00e7\u00e3o de File:
      • pt = Ficheiro
      • pt_BR = Arquivo
    • Formato de datas:
      • en_US: MM/DD/YY
      • en_GB: DD/MM/YY
    "},{"location":"lessons/06-localization-translation/slides/#posso-usar-locales-diferentes-para-a-lingua-da-interface-de-usuario-e-para-mostrar-datas","title":"Posso usar locales diferentes para a l\u00edngua da interface de usu\u00e1rio e para mostrar datas.","text":""},{"location":"lessons/06-localization-translation/slides/#configuracoes-possiveis-linux","title":"Configura\u00e7\u00f5es poss\u00edveis (Linux)","text":"
    # sa\u00edda do comando locale\nLANG=en_US.UTF-8\nLC_CTYPE=\"en_US.UTF-8\"\nLC_NUMERIC=pt_BR.UTF-8\nLC_TIME=pt_BR.UTF-8\nLC_COLLATE=pt_BR.UTF-8\nLC_MONETARY=pt_BR.UTF-8\nLC_MESSAGES=\"en_US.UTF-8\"\nLC_PAPER=pt_BR.UTF-8\nLC_NAME=pt_BR.UTF-8\nLC_ADDRESS=pt_BR.UTF-8\nLC_TELEPHONE=pt_BR.UTF-8\nLC_MEASUREMENT=pt_BR.UTF-8\nLC_IDENTIFICATION=pt_BR.UTF-8\n
    "},{"location":"lessons/06-localization-translation/slides/#implementando-suporte-a-l10n","title":"Implementando suporte a L10N","text":"
    1. Baixar uma biblioteca de Localiza\u00e7\u00e3o
    2. Encontrar todas as exibi\u00e7\u00f5es de n\u00fameros, datas, etc
    3. Pr\u00e9-process\u00e1-las usando fun\u00e7\u00f5es da biblioteca
    "},{"location":"lessons/06-localization-translation/slides/#_3","title":"Tradu\u00e7\u00e3o e localiza\u00e7\u00e3o de software","text":"
    # Antes \nprint('Numero:', 10.5) \n# Depois\nprint('Numero', format_number(10.5))\n
    "},{"location":"lessons/06-localization-translation/slides/#_4","title":"Tradu\u00e7\u00e3o e localiza\u00e7\u00e3o de software","text":"

    N\u00e3o \u00e9 complicado, mas \u00e9 trabalhoso

    "},{"location":"lessons/06-localization-translation/slides/#suporte-a-i18n","title":"Suporte a I18N","text":"

    Envolve 4 etapas:

    1. Marcar todas strings que devem ser traduzidas
    2. Extra\u00ed-las do c\u00f3digo fonte
    3. Criar um arquivo de tradu\u00e7\u00f5es para cada locale suportado
    4. Empacotar as tradu\u00e7\u00f5es junto com o programa
    "},{"location":"lessons/06-localization-translation/slides/#_5","title":"Tradu\u00e7\u00e3o e localiza\u00e7\u00e3o de software","text":"

    \u00c9 um pouco mais complicado, mas pode ser integrado ao processo de compila\u00e7\u00e3o de um programa.

    "},{"location":"lessons/06-localization-translation/slides/#suporte-a-i18n-posix","title":"Suporte a I18N (POSIX)","text":"

    Sistemas POSIX suportam determina\u00e7\u00e3o de lingua e locale usando vari\u00e1veis de ambiente.

    • LANG para l\u00edngua
    • LC_TIME para data
    • LC_NUMERIC para n\u00fameros

    Um locale sempre \u00e9 expresso no formato

    <lingua>_<pais>.<codificacao>\n
    "},{"location":"lessons/06-localization-translation/slides/#suporte-a-i18n-posix_1","title":"Suporte a I18N (POSIX)","text":"

    O comando locale mostra todas as op\u00e7\u00f5es dispon\u00edveis:

    # sa\u00edda do comando locale\nLANG=en_US.UTF-8\nLC_CTYPE=\"en_US.UTF-8\"\nLC_NUMERIC=pt_BR.UTF-8\nLC_TIME=pt_BR.UTF-8\nLC_COLLATE=pt_BR.UTF-8\nLC_MONETARY=pt_BR.UTF-8\nLC_MESSAGES=\"en_US.UTF-8\"\nLC_PAPER=pt_BR.UTF-8\nLC_NAME=pt_BR.UTF-8\nLC_ADDRESS=pt_BR.UTF-8\nLC_TELEPHONE=pt_BR.UTF-8\nLC_MEASUREMENT=pt_BR.UTF-8\nLC_IDENTIFICATION=pt_BR.UTF-8\n
    "},{"location":"lessons/06-localization-translation/slides/#suporte-a-i18n-web","title":"Suporte a I18N (Web)","text":"

    Existem diversas maneiras de determinar um bom locale em sistemas Web:

    • Cabe\u00e7alho HTTP Accept-Language inclui as linguagens de exibi\u00e7\u00e3o suportadas pelo browser do visitante.
    • Geolocaliza\u00e7\u00e3o via IP
    • Prefer\u00eancia armazenada em banco de dados
    "},{"location":"lessons/06-localization-translation/slides/#_6","title":"Tradu\u00e7\u00e3o e localiza\u00e7\u00e3o de software","text":""},{"location":"lessons/06-localization-translation/slides/#web-e-desktop-usam-as-mesmas-tecnologias-l10n-e-i18n","title":"Web e desktop usam as mesmas tecnologias (l10n e i18n)","text":""},{"location":"lessons/06-localization-translation/slides/#suporte-a-i18n-em-python","title":"Suporte a I18N (em Python)","text":"
    • M\u00f3dulo gettext da biblioteca padr\u00e3o
    • M\u00f3dulo datetime aceita o uso de locales
    • M\u00f3dulo babel faz I18N e L10N
    "},{"location":"lessons/06-localization-translation/slides/#atividade-pratica-traducao-basica","title":"Atividade pr\u00e1tica: Tradu\u00e7\u00e3o b\u00e1sica","text":"

    Objetivo: usar o m\u00f3dulo Babel para traduzir uma aplica\u00e7\u00e3o do terminal.

    "},{"location":"lessons/06-localization-translation/slides/#desenvolvimento-aberto_1","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/06-localization-translation/slides/#localizacao-e-internacionalizacao-de-software_1","title":"Localiza\u00e7\u00e3o e internacionaliza\u00e7\u00e3o de software","text":""},{"location":"lessons/06-localization-translation/slides/#versao-20232-igor-montagner-igorsm1insperedubr_1","title":"Vers\u00e3o 2023/2: Igor Montagner (igorsm1@insper.edu.br)","text":""},{"location":"lessons/07-code-quality/","title":"07 - Code quality","text":"

    In Lesson 04 - Professional Project we created a repo and website for an old project developed during the course. Now we are going to improve its quality by fixing the issues each group found using a linter tool.

    Warning

    We won't work on our own projects this time! Select a project from the discussion page and comment on the issue you'd like to do. Every project must have at least one issue with external participation.

    "},{"location":"lessons/07-code-quality/#deliverable","title":"Deliverable","text":"
    • create a Pull/Merge request addressing a code quality issue found in another team's project.
    • work with other team to get a Pull/Merge request accepted in your repository

    Learning objective: modify a project you are not familiar with and improve its code quality

    \"skill_id\": 11, \"metadata\": {\"url\": \"pull request url\", \"group\": [\"student2\"]}

    Add to the pull request description a link to the accepted contribution.

    "},{"location":"lessons/08-automated-testing/","title":"08 - Automated testing","text":"

    We will now add (some) automated testing to one of the projects from the discussion page. Again, our objective in this activity is to get used to build and modify different projects.

    Warning

    You'll need to select a different project from the last Lesson 07 - Code Quality

    "},{"location":"lessons/08-automated-testing/#deliverable","title":"Deliverable","text":"
    • create two issues with suggestions for testing in the selected project
    • send a Pull/Merge request addressing one of the issues you created and get it accepted

    Learning objective: modify a project you are not familiar with and improve its code quality

    \"skill_id\": 5, \"metadata\": {\"url\": \"pull request url\", \"group\": [\"student2\"]}

    Add to the pull request description a link to the accepted contribution.

    "},{"location":"lessons/08-automated-testing/slides/","title":"Testes automatizados","text":""},{"location":"lessons/08-automated-testing/slides/#desenvolvimento-aberto","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/08-automated-testing/slides/#testes-automatizados","title":"Testes automatizados","text":""},{"location":"lessons/08-automated-testing/slides/#igor-dos-santos-montagner-igorsm1insperedubr","title":"Igor dos Santos Montagner ( igorsm1@insper.edu.br )","text":""},{"location":"lessons/08-automated-testing/slides/#projeto-profissional","title":"Projeto profissional","text":"
    • Qualidade de c\u00f3digo
      • Linting - formata\u00e7\u00e3o e erros comuns
    • Documenta\u00e7\u00e3o
      • Usu\u00e1rio
      • Desenvolvedor
    "},{"location":"lessons/08-automated-testing/slides/#projeto-profissional_1","title":"Projeto profissional","text":"
    • Qualidade de c\u00f3digo
      • Linting - formata\u00e7\u00e3o e erros comuns
      • O c\u00f3digo funciona?
    • Documenta\u00e7\u00e3o
      • Usu\u00e1rio
      • Desenvolvedor
    "},{"location":"lessons/08-automated-testing/slides/#meu-programa-funciona","title":"Meu programa funciona?","text":"
    • Sob quais condi\u00e7\u00f5es?
    • Em quais plataformas?
    • Quais opera\u00e7\u00f5es s\u00e3o suportadas?
    • Consigo conferir o resultado de uma execu\u00e7\u00e3o? Se sim, existe um valor de refer\u00eancia?
    "},{"location":"lessons/08-automated-testing/slides/#testes-automatizados_1","title":"Testes automatizados","text":"

    Ideia: escrever um programa que verifica se um outro programa responde como esperado

    • Definir situa\u00e7\u00f5es a serem testadas ...
    • e o resultado esperado em cada situa\u00e7\u00e3o
    "},{"location":"lessons/08-automated-testing/slides/#testes-automatizados_2","title":"Testes automatizados","text":"

    N\u00e3o ajudam:

    • a revelar novos bugs
    • a garantir que um software \u00e9 livre de bugs

    Ajudam

    • a evitar que bugs descobertos voltem
    • a evitar que mudan\u00e7as n\u00e3o intencionais quebrem c\u00f3digo que estava funcionando.
    • a documentar em quais situa\u00e7\u00f5es o software funciona.
    "},{"location":"lessons/08-automated-testing/slides/#testes-automatizados_3","title":"Testes automatizados","text":"
    1. Testes de unidade
    2. Testes de integra\u00e7\u00e3o
    3. Testes de interface de usu\u00e1rio
    "},{"location":"lessons/08-automated-testing/slides/#testes-unitarios","title":"Testes unit\u00e1rios","text":"

    Ideia: dada uma fun\u00e7\u00e3o, verificar se ela devolve o valor esperado para um certo conjunto de par\u00e2metros.

    • Testa as fun\u00e7\u00f5es de maneira isolada
    • Cobertura: porcentagem das linhas de c\u00f3digo que \u00e9 executada durante os testes de unidade.
    • Serve como documenta\u00e7\u00e3o da fun\u00e7\u00e3o
    "},{"location":"lessons/08-automated-testing/slides/#testes-unitarios-pytest","title":"Testes unit\u00e1rios - pytest","text":""},{"location":"lessons/08-automated-testing/slides/#testes-de-integracao","title":"Testes de integra\u00e7\u00e3o","text":"

    Ideia: dados um conjunto de classes com interdepend\u00eancias, verificar se elas funcionam bem em conjunto.

    • Testa intera\u00e7\u00e3o entre em objetos
    • Possibilidade de criar mocks, que s\u00e3o objetos falsos feitos para simular a intera\u00e7\u00e3o entre v\u00e1rios objetos.
    "},{"location":"lessons/08-automated-testing/slides/#testes-de-interface-de-usuario","title":"Testes de interface de usu\u00e1rio","text":"

    Ideia: simula a\u00e7\u00f5es do usu\u00e1rio (cliques, entrada de dados, etc) e confere se a sa\u00edda esperada \u00e9 mostrada na tela

    • Menos espec\u00edfico poss\u00edvel
    • Mais fiel ao uso real de um usu\u00e1rio
    "},{"location":"lessons/08-automated-testing/slides/#testes-de-interface-de-usuario_1","title":"Testes de interface de usu\u00e1rio","text":""},{"location":"lessons/08-automated-testing/slides/#selenium","title":"Selenium","text":"

    Permite fazer scripts que interagem com uma p\u00e1gina web, realizando entrada de dados, rolagem de tela e cliques. Cada assert pode ser feito com o conte\u00fado de um objeto da p\u00e1gina.

    "},{"location":"lessons/08-automated-testing/slides/#o-que-eu-preciso-testar","title":"O qu\u00ea eu preciso testar?","text":""},{"location":"lessons/08-automated-testing/slides/#_1","title":"Testes automatizados","text":""},{"location":"lessons/08-automated-testing/slides/#o-que-eu-preciso-testar_1","title":"O qu\u00ea eu preciso testar?","text":""},{"location":"lessons/08-automated-testing/slides/#ninguem-sabe","title":"Ningu\u00e9m sabe....","text":""},{"location":"lessons/08-automated-testing/slides/#atividade-pratica-testado-e-aprovado","title":"Atividade pr\u00e1tica: Testado e aprovado","text":"

    Objetivo: Primeira experi\u00eancia com testes automatizado de c\u00f3digo.

    \"metadata\": {\"url\": \"acceppted PR\", \"group\": [\"igual\", \"6\"]}

    "},{"location":"lessons/09-releases/","title":"09 - Releases","text":"

    Creating a release is the final step to distribute software to users. It involves \"freezing\" the repository in a specific commit and attaching binaries and other ready to use assets. Users should be able to grab one of the releases and use it direclty without having to setup a dev environment.

    The skill New Release involves the creation of a release for your own project used in the last lessons.

    \"skill_id\": 12, \"metadata\": {\"url\": \"release url\", \"group\": [\"student2\"]}

    "},{"location":"lessons/09-releases/#instructions","title":"Instructions","text":"

    The following guids might be useful.

    • Creating releases in Github
    • PyInstaller for creating installers/binaries using Python

    The following checks will be used to verify if this skill is completed:

    • there is a release in the repo's Releases tab containing the description of the release and the source code
    • the release includes either an installer or a direccly executable file in one of the following formats:
      • Linux: .deb, .rpm for installers,AppImage for executables
      • Windows: .msi installer or single .exe (plus asses, if necessary)
      • Other: if the project is an extension, plugin or any other type of stoftware, the release must include a redistributable package in the official format
    "},{"location":"lessons/10-first-contribution/","title":"10 - Minha primeira contribui\u00e7\u00e3o","text":""},{"location":"lessons/10-first-contribution/slides/","title":"Explorando seu projeto","text":""},{"location":"lessons/10-first-contribution/slides/#desenvolvimento-aberto","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/10-first-contribution/slides/#_1","title":"Explorando seu projeto","text":""},{"location":"lessons/10-first-contribution/slides/#contribuicao-de-codigo","title":"Contribui\u00e7\u00e3o de c\u00f3digo","text":""},{"location":"lessons/10-first-contribution/slides/#igor-dos-santos-montagner-igorsm1insperedubr","title":"Igor dos Santos Montagner ( igorsm1@insper.edu.br )","text":""},{"location":"lessons/10-first-contribution/slides/#ate-agora","title":"At\u00e9 agora","text":"
    • Ferramentas de colabora\u00e7\u00e3o
    • Qualidade de c\u00f3digo e ferramentas para qualidade de projeto
    • Tradu\u00e7\u00e3o de UI e documenta\u00e7\u00e3o
    • Aspectos n\u00e3o t\u00e9cnicos relacionados
      • licen\u00e7as
      • comunidades
    "},{"location":"lessons/10-first-contribution/slides/#primeira-contribuicao","title":"Primeira contribui\u00e7\u00e3o","text":"
    • Ajuda na sele\u00e7\u00e3o de *issues- e projetos
    • Ser\u00e1 feita em duplas/trios

    Entrega final: 02/10

    "},{"location":"lessons/10-first-contribution/slides/#etapa-individual-outubro","title":"Etapa individual (Outubro)","text":""},{"location":"lessons/10-first-contribution/slides/#aprofundar-habilidades-desenvolvidas-em-grupo","title":"Aprofundar habilidades desenvolvidas em grupo","text":"
    1. proporcionar uma experi\u00eancia de trabalho em um projeto real de escolha dos alunos
    2. valorizar diversos tipos de contribui\u00e7\u00f5es, n\u00e3o somente de c\u00f3digo
    3. exercitar autonomia*- e **independ\u00eancia
    "},{"location":"lessons/10-first-contribution/slides/#inicio-em-0410","title":"In\u00edcio em 04/10","text":""},{"location":"lessons/10-first-contribution/slides/#minha-primeira-contribuicao-de-codigo","title":"Minha primeira contribui\u00e7\u00e3o de c\u00f3digo","text":"

    Bons projetos usam tags para facilitar a recep\u00e7\u00e3o de novatos

    • good-first-issue
    • newcomers
    • low effort
    • difficulty novice
    • easy
    "},{"location":"lessons/10-first-contribution/slides/#sugestao-i-pandas","title":"Sugest\u00e3o I - Pandas","text":"

    Biblioteca de tratamento de dados usada em Ci\u00eancia dos Dados.

    • Projeto complexo, com muitos casos de uso especiais
    • Toneladas de funcionalidades de visualiza\u00e7\u00e3o textual e gr\u00e1fica de dados
    • Python \u00e9 familiar para a maioria

    Tickets de testes s\u00e3o, em geral, f\u00e1ceis para come\u00e7ar e \u00fateis para a comunidade.

    "},{"location":"lessons/10-first-contribution/slides/#sugestao-ii-matplotlib","title":"Sugest\u00e3o II - Matplotlib","text":"

    Plotar gr\u00e1ficos em Python

    Lista de Good first issues tem v\u00e1rios em aberto ou com PRs que est\u00e3o parados h\u00e1 meses e podem ser assumidos por outras pessoas.

    "},{"location":"lessons/10-first-contribution/slides/#sugestao-iii-pyscript","title":"Sugest\u00e3o III - Pyscript","text":"

    Python rodando no Browser via WebAssembly

    Lista de issues tem v\u00e1rias que parecem acess\u00edveis

    "},{"location":"lessons/10-first-contribution/slides/#sugestao-iii-escolha-seu-proprio-projeto","title":"Sugest\u00e3o III: Escolha seu pr\u00f3prio projeto :)","text":"
    • https://github.com/MunGell/awesome-for-beginners
    • https://www.codetriage.com/
    • https://up-for-grabs.net/
    • http://github-help-wanted.com/
    "},{"location":"lessons/10-first-contribution/slides/#hoje","title":"Hoje","text":"
    1. escolher issue e projeto
    2. montar ambiente
      • baixar c\u00f3digo
      • compilar
      • rodar sua vers\u00e3o
    3. reproduzir a issue
    "},{"location":"lessons/11-floss-people/","title":"11 - People and Companies from FLOSS","text":"

    Free and Open Source Software history is full of personalities that have contributed to shape the world we live in. In this activity pairs of students select a company or person with a strong history in FOSS and detail their contributions in a 30 minutes presentation followed by a 10 minutes guided discussion.

    All presentations will be open to the general public, recorded and must be presented in english. The discussions will not be recorded. After presenting students can create a PR with the skill FLOSS research and upload a PDF of their presentations to the apresentacoes/2023/ folder.

    Register your choice of personality/company and time slot for the presentation at the Github Discussions thread. You can accept one of the suggestions below or propose a different one.

    • RedHat
    • Canonical and Ubuntu
    • The Debian project
    • Richard Stallman and the FSF
    • Linus Torvalds and Linux
    • Eric Raymond (Cathedral and Bazaar)
    • Larry Wall and Perl
    • Mozilla

    The following presentation slots are available on a first-come first-served queue.

    • 01/NOV 08:45
    • 06/NOV 08:45
    • 08/NOV 08:45
    • 13/NOV 08:45
    • 22/NOV 08:45
    • 27/NOV 08:45
    "},{"location":"lessons/12-licenses/","title":"12 - Software Licenses","text":"

    This meeting does not have practical activities.

    "},{"location":"lessons/12-licenses/slides/","title":"Licen\u00e7as de software","text":""},{"location":"lessons/12-licenses/slides/#desenvolvimento-aberto","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/12-licenses/slides/#licencas-de-software","title":"Licen\u00e7as de Software","text":""},{"location":"lessons/12-licenses/slides/#20232-igor-montagner-igorsm1insperedubr","title":"2023/2: Igor Montagner ( igorsm1@insper.edu.br) )","text":""},{"location":"lessons/12-licenses/slides/#ate-agora","title":"At\u00e9 agora","text":"
    • Ferramentas de colabora\u00e7\u00e3o
    • Modifica\u00e7\u00f5es de c\u00f3digo
    • Tradu\u00e7\u00e3o de UI e documenta\u00e7\u00e3o
    • Distribui\u00e7ao de software
    • Teste de software

    ### Conte\u00fado t\u00e9cnico: ferramentas, fluxos de trabalho, etc

    "},{"location":"lessons/12-licenses/slides/#hoje","title":"Hoje","text":""},{"location":"lessons/12-licenses/slides/#licencas-de-software_1","title":"Licen\u00e7as de software","text":""},{"location":"lessons/12-licenses/slides/#licencas-de-software_2","title":"Licen\u00e7as de software","text":"
    • Governam a distribui\u00e7\u00e3o de um software
    • Cess\u00e3o de direitos do autor para outras pessoas
    • Listam quais permiss\u00f5es um usu\u00e1rio (n\u00e3o) tem
    "},{"location":"lessons/12-licenses/slides/#disclaimer","title":"Disclaimer","text":""},{"location":"lessons/12-licenses/slides/#eu-nao-sou-especialista-em-direito-autoral-brasileiro-toda-informacao-disponibilizada-foi-fruto-de-pesquisa-e-nao-constitui-aconselhamento-legal","title":"Eu n\u00e3o sou especialista em direito autoral brasileiro. Toda informa\u00e7\u00e3o disponibilizada foi fruto de pesquisa e n\u00e3o constitui aconselhamento legal.","text":""},{"location":"lessons/12-licenses/slides/#distribuicao-de-software","title":"Distribui\u00e7\u00e3o de software","text":"

    Escrever software \u00e9 considerado um trabalho intelectual, estando ent\u00e3o sujeito \u00e0s leis de direitos autorais.

    • Essas leis s\u00e3o espec\u00edficas de cada pa\u00eds
    • Autoria vs explora\u00e7\u00e3o econ\u00f4mica
    • Engloba tanto c\u00f3digo fonte como bin\u00e1rios
    "},{"location":"lessons/12-licenses/slides/#direito-autoral-brasileiro","title":"Direito autoral brasileiro","text":"

    N\u00e3o \u00e9 necess\u00e1rio registro. N\u00e3o vale para ideias.

    • Direito moral:
      • assegura a autoria da obra ao autor original
      • integridade da obra
      • instransfer\u00edvel e irrevog\u00e1vel
    • Direito patrimonial:
      • explora\u00e7\u00e3o econ\u00f4mica da obra.
      • licenciado ou cedido
      • copyright em ingl\u00eas
    "},{"location":"lessons/12-licenses/slides/#por-que-isto-e-importante","title":"Por que isto \u00e9 importante?","text":"

    O dono dos direitos autorais (patrimoniais) pode controlar:

    1. Distribui\u00e7\u00e3o, parcial ou total;
    2. Cria\u00e7\u00e3o de obras derivadas
    3. Reprodu\u00e7\u00e3o (execu\u00e7\u00e3o)
    "},{"location":"lessons/12-licenses/slides/#por-que-isto-e-importante_1","title":"Por que isto \u00e9 importante?","text":"

    De quem \u00e9 o c\u00f3digo nos seguintes cen\u00e1rios?

    "},{"location":"lessons/12-licenses/slides/#um-funcionario-trabalhando-para-uma-empresa-produz-sotfware-durante-o-expediente","title":"Um funcion\u00e1rio trabalhando para uma empresa produz sotfware durante o expediente.","text":""},{"location":"lessons/12-licenses/slides/#por-que-isto-e-importante_2","title":"Por que isto \u00e9 importante?","text":"

    De quem \u00e9 o c\u00f3digo nos seguintes cen\u00e1rios?

    "},{"location":"lessons/12-licenses/slides/#um-funcionario-trabalhando-para-uma-empresa-produz-sotfware-fora-do-expediente-e-decide-lancar-um-produto-nao-relacionado","title":"Um funcion\u00e1rio trabalhando para uma empresa produz sotfware fora do expediente e decide lan\u00e7ar um produto n\u00e3o relacionado.","text":""},{"location":"lessons/12-licenses/slides/#por-que-isto-e-importante_3","title":"Por que isto \u00e9 importante?","text":"

    De quem \u00e9 o c\u00f3digo nos seguintes cen\u00e1rios?

    "},{"location":"lessons/12-licenses/slides/#um-funcionario-trabalhando-para-uma-empresa-produz-sotfware-fora-do-expediente-e-decide-lancar-um-produto-concorrente","title":"Um funcion\u00e1rio trabalhando para uma empresa produz sotfware fora do expediente e decide lan\u00e7ar um produto concorrente.","text":""},{"location":"lessons/12-licenses/slides/#por-que-isto-e-importante_4","title":"Por que isto \u00e9 importante?","text":"

    De quem \u00e9 o c\u00f3digo nos seguintes cen\u00e1rios?

    "},{"location":"lessons/12-licenses/slides/#um-programador-faz-um-freelance-e-entrega-um-projeto-para-uma-empresa-ele-pode-reutilzar-parte-do-codigo-em-outros-projetos-para-outras-empresas","title":"Um programador faz um freelance e entrega um projeto para uma empresa. Ele pode reutilzar parte do c\u00f3digo em outros projetos (para outras empresas)?","text":""},{"location":"lessons/12-licenses/slides/#por-que-isto-e-importante_5","title":"Por que isto \u00e9 importante?","text":"

    De quem \u00e9 o c\u00f3digo nos seguintes cen\u00e1rios?

    "},{"location":"lessons/12-licenses/slides/#um-prestador-de-servicos-contratado-como-empresa-via-cnpj-participa-de-um-projeto-terceirizado-junto-com-outros-pjs","title":"Um prestador de servi\u00e7os (contratado como empresa via CNPJ) participa de um projeto terceirizado, junto com outros PJs.","text":""},{"location":"lessons/12-licenses/slides/#por-que-isto-e-importante_6","title":"Por que isto \u00e9 importante?","text":"

    Nenhum dos casos acima tem respostas fixas. Tudo depende de um monte de fatores jur\u00eddicos e do qu\u00ea cada um assinou. Alguns guias interessantes:

    • Association of Software Professionals
    • Start-se
    • Legal Nature - EULA
    "},{"location":"lessons/12-licenses/slides/#contexto-1-propriedade-intelectual-e-work-for-hire","title":"Contexto 1: Propriedade intelectual e work-for-hire","text":"
    • Contexto brasilero: \"Pela nossa lei de software, a n\u00e3o ser que expressamente dito o contr\u00e1rio, aquele que contrata o desenvolvimento \u00e9 titular original do software resultante\" [1]
    • Contexto americano: work-for-hire determina que software feito sob encomenda pertence a quem contratou o servi\u00e7o [2]

    Fontes 1 2

    "},{"location":"lessons/12-licenses/slides/#contexto-2-projetos-open-source","title":"Contexto 2: projetos open source","text":"

    Contributor License Agreement \u00e9 um documento de cess\u00e3o de copyright (direitos de explora\u00e7\u00e3o comercial).

    • D\u00e1 ao projeto uma licen\u00e7a n\u00e3o exclusiva (normalmente) e irrevog\u00e1vel para o projeto explorar sua contribui\u00e7\u00e3o
    • Mant\u00e9m autoria
    • Isenta o projeto de responsabilidades sobre suas contribui\u00e7\u00f5es
    "},{"location":"lessons/12-licenses/slides/#contexto-3-comercializacao-de-software","title":"Contexto 3: comercializa\u00e7\u00e3o de software","text":"

    End User License Agreement (EULA): Termo usado para aquelas condi\u00e7\u00f5es que (n\u00e3o lemos) aceitamos ao instalar software propriet\u00e1rio ou nos registramos em um site/servi\u00e7o.

    "},{"location":"lessons/12-licenses/slides/#_1","title":"Licen\u00e7as de software","text":"

    Ignorado por aproximadamente 90% dos usu\u00e1rios (fonte)

    "},{"location":"lessons/12-licenses/slides/#end-user-license-agreement","title":"End User License Agreement","text":"

    E por algumas empresas... Fonte

    "},{"location":"lessons/12-licenses/slides/#end-user-license-agreement_1","title":"End User License Agreement","text":"

    Restri\u00e7\u00f5es t\u00edpicas encontradas em EULAs:

    • Software \u00e9 licenciado, n\u00e3o vendido;
    • \u00c9 proibido engenharia reversa
    • N\u00e3o pode modificar ou explorar limita\u00e7\u00f5es / vulnerabilidades
    • Isenta responsabilidades pelo (mau) uso do software
    "},{"location":"lessons/12-licenses/slides/#eula-servicos","title":"EULA (servi\u00e7os)","text":"

    Informa\u00e7\u00f5es t\u00edpicas encontradas em EULAs de servi\u00e7os:

    • Restri\u00e7\u00f5es de idade;
    • Uso dos dados coletados:
    • T\u00e9rmino unilateral do servi\u00e7o
    • Garantias de disponibilidade e responsabilidade

    Legal Nature - EULA

    "},{"location":"lessons/12-licenses/slides/#eula-aws","title":"EULA (AWS)","text":"

    fonte: https://aws.amazon.com/service-terms/

    "},{"location":"lessons/12-licenses/slides/#um-pouco-de-historia","title":"Um pouco de hist\u00f3ria","text":""},{"location":"lessons/12-licenses/slides/#um-pouco-de-historia-1985","title":"Um pouco de hist\u00f3ria - 1985","text":"
    • GNU Manifesto: descrevia um esfor\u00e7o em criar um sistema completamente livre cujo destino estivesse nas m\u00e3os dos usu\u00e1rios
    • GNU/Hurd: todas as ferramentas de linha de comando das distribui\u00e7\u00f5es modernas vieram desse projeto
    • Desenvolvimento e distribui\u00e7\u00e3o centralizada
    "},{"location":"lessons/12-licenses/slides/#um-pouco-de-historia-1990","title":"Um pouco de hist\u00f3ria - 1990","text":"
    • Linus Torvalds tinha um kernel experimental \"pronto\"
    • Liberava uma vers\u00e3o nova toda semana
    • Recebia contribui\u00e7\u00f5es de outros interessados
    • Desenvolvimento e distribui\u00e7\u00e3o participativos
    "},{"location":"lessons/12-licenses/slides/#um-pouco-de-historia_1","title":"Um pouco de hist\u00f3ria","text":"

    Leitura complementar: Free Software, Free Society: Selected Essays of Richard M. Stallman.

    "},{"location":"lessons/12-licenses/slides/#um-pouco-de-historia_2","title":"Um pouco de hist\u00f3ria","text":"

    Leitura complementar: Just for Fun: The Story of an Accidental Revolutionary, Linus Torvalds and David Diamond

    "},{"location":"lessons/12-licenses/slides/#licencas-de-software-livre","title":"Licen\u00e7as de software (livre)","text":"

    Criadas pela Free Software Foundation visando garantir 4 liberdades para um usu\u00e1rio ao usar um software:

    1. Execu\u00e7\u00e3o sem restri\u00e7\u00f5es
    2. Estudo e modifica\u00e7\u00e3o do software;
    3. Redistribuir c\u00f3pias;
    4. Redistribuir c\u00f3pias das suas modifica\u00e7\u00f5es.

    Distribuir os fontes \u00e9 pr\u00e9-requisito dos itens 1 e 3!

    Chamadas tamb\u00e9m de rec\u00edprocas.

    "},{"location":"lessons/12-licenses/slides/#licencas-de-software-livre_1","title":"Licen\u00e7as de software (livre)","text":""},{"location":"lessons/12-licenses/slides/#licencas-de-software-livre-reciprocas","title":"Licen\u00e7as de software livre - rec\u00edprocas","text":"
    • Copyleft: S\u00edmbolo \u00e9 o contr\u00e1rio do copyright, cujo objetivo seria restringir os usu\u00e1rios
    • muitos apoiadores tamb\u00e9m tem uma postura anti-comercial
    • obriga a contribui\u00e7\u00e3o de volta para a comunidade
    • procura empoderar TODOS os envolvidos na comunidade
    • Principal figura: Richard Stallman
    "},{"location":"lessons/12-licenses/slides/#open-source-iniciative","title":"Open Source Iniciative","text":"
    • Fundada para difundir um discurso menos anti-comercial e ideol\u00f3gico
    • Tamb\u00e9m difunde benef\u00edcios \"pragm\u00e1ticos\" do uso de software \"de c\u00f3digo aberto\"
    • Free causa confus\u00e3o em ingl\u00eas
      • Gr\u00e1tis (free as in beer)
      • Livre (free as in freedom)
    • Fundada por Eric Raymond e Bruce Perens
    "},{"location":"lessons/12-licenses/slides/#licencas-de-software-de-codigo-aberto","title":"Licen\u00e7as de software de c\u00f3digo aberto","text":"

    Mais associadas a Open Source Iniciative, s\u00e3o consideradas menos \"ideol\u00f3gicas\".

    • Muitas vezes chamadas de permissivas;
    • Normalmente n\u00e3o garatem a liberdade 3;
    • Podem fazer outras pequenas exig\u00eancias ou restri\u00e7\u00f5es

    Exemplos: MIT, BSD

    • Permitem a distribui\u00e7\u00e3o de software com partes propriet\u00e1rias
    • Permitem a venda e completo rebranding do software sem nenhuma contribui\u00e7\u00e3o para o autor original.
    "},{"location":"lessons/12-licenses/slides/#licencas-qual-usar","title":"Licen\u00e7as: qual usar?","text":"

    https://choosealicense.com/licenses/

    "},{"location":"lessons/12-licenses/slides/#desenvolvimento-aberto_1","title":"Desenvolvimento Aberto","text":""},{"location":"lessons/12-licenses/slides/#licencas-de-software_3","title":"Licen\u00e7as de Software","text":""},{"location":"lessons/12-licenses/slides/#20232-igor-montagner-igorsm1insperedubr_1","title":"2023/2: Igor Montagner ( igorsm1@insper.edu.br) )","text":""},{"location":"plugins/notification/","title":"Toast Notifications","text":"

    This page illustrates how to create toast (or snackbar) notifications. This is intended for plugin development and probably shouldn't be called directly from the markdown content.

    In your plugin, whenever you want to show a toast notification, just call notification.toast():

    notification.toast(\"Go crazy!\", { bgColor: \"#FFFF00\", color: \"#ff4498\" });\nnotification.toast('bgColor \"danger\"', { bgColor: \"danger\" });\nnotification.toast(\"Notification with click event (reload page)\", {\n  onClick: () => window.location.reload(),\n});\nnotification.toast(\"Toasts have an optional timeout argument\", {\n  timeout: 3000,\n});\n

    The following values are accepted for bgColor:

    • primary (your theme's primary color)
    • note
    • abstract
    • summary
    • tldr
    • info
    • todo
    • tip
    • hint
    • important
    • success
    • check
    • done
    • question
    • help
    • faq
    • warning
    • caution
    • attention
    • failure
    • fail
    • missing
    • danger
    • error
    • bug
    • example
    • quote
    • cite
    • a color in hex notation (e.g. \"#FF00FF\")
    "},{"location":"projects/2024/2/","title":"2024/2","text":"
    • Thiago Hampl de Pierri Rocha [] https://github.com/thiagohpr/ExposureStudy
    • Arthur Martins de Souza Barreto ['arthurmsb'] https://github.com/Arthur-Barreto/srp_illinois.git
    • Rafael Gordon Paves [] https://github.com/rafaelgpaves/projectjump-refatorado
    • Rafael Coca Leventhal ['rafaelcl', 'andrecs11'] https://github.com/AndreCorreaSantos/Vulkan_Playground
    • Jo\u00e3o Ant\u00f4nio Gomes Garcia ['joaoagg', 'anandajgc'] https://github.com/Joao-antonio-gg/CompVis.git
    • Rodrigo Sennati Mattar ['rodrigosm11', 'leonardos15'] https://github.com/digomattar21/IronPeersApi
    • Luis Antonio Santana Rodrigues ['fernandoa8', 'luisasr'] https://github.com/devluisrodrigues/motion-detection
    "}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index d5b6f277..034b11f8 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,237 +2,272 @@ https://insper.github.io/open-dev/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/agenda_apresentacoes/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/assessment/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/impact-2019/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/impact-2020/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/impact-2021/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/impact-2022/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/impact/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/students/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/syllabus/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/_snippets/alunos/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/_snippets/plano-de-aulas/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/_snippets/skills-code/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/_snippets/skills-community/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/_snippets/skills-impact/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/_snippets/skills-tutorial/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/aulas/09-cultura-livre/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/aulas/09-cultura-livre/slides/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/aulas/11-contribuicoes-externas/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/aulas/11-contribuicoes-externas/slides/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/aulas/12-projeto/slides/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/delivery/ - 2024-09-02 + 2024-09-03 + daily + + + https://insper.github.io/open-dev/delivery/README_paulohmf_leonardos15_rodrigosm11/ + 2024-09-03 + daily + + + https://insper.github.io/open-dev/delivery/README_skill3_ricardorr7_thiagohpr/ + 2024-09-03 + daily + + + https://insper.github.io/open-dev/delivery/class-03-guide/ + 2024-09-03 + daily + + + https://insper.github.io/open-dev/delivery/class_3_running_guide/ + 2024-09-03 + daily + + + https://insper.github.io/open-dev/delivery/ericalp_readme/ + 2024-09-03 + daily + + + https://insper.github.io/open-dev/delivery/skill3_lidiaacd_anandajgc_guilhermefl3/ + 2024-09-03 daily https://insper.github.io/open-dev/lessons/01-distributed-workflow/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/lessons/01-distributed-workflow/slides/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/lessons/01-distributed-workflow/slides_fb/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/lessons/02-software-and-communities/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/lessons/02-software-and-communities/slides/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/lessons/02-software-and-communities/slides_fb/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/lessons/02-xpresentations-communities/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/lessons/03-software-documentation/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/lessons/03-software-documentation/slides/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/lessons/03-software-documentation/slides_fb/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/lessons/04-professional-project/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/lessons/04-professional-project/slides/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/lessons/05-python-packaging/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/lessons/06-localization-translation/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/lessons/06-localization-translation/slides/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/lessons/07-code-quality/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/lessons/08-automated-testing/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/lessons/08-automated-testing/slides/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/lessons/09-releases/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/lessons/10-first-contribution/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/lessons/10-first-contribution/slides/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/lessons/11-floss-people/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/lessons/12-licenses/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/lessons/12-licenses/slides/ - 2024-09-02 + 2024-09-03 daily https://insper.github.io/open-dev/plugins/notification/ - 2024-09-02 + 2024-09-03 + daily + + + https://insper.github.io/open-dev/projects/2024/2/ + 2024-09-03 daily \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 4e3c00582b54ee2c57ee985541b9cd6c4001b8e4..d2f22415607562065cba7ea0b4ee8b0b3508a73d 100644 GIT binary patch literal 760 zcmVxlr>lLVv)~h zXlg5!X|LwrzkL?(=hvIFb@ZAr%+g>(SMx3e_aV!6yWN6Rz#beetZy@_yL3a@!IL)3@kx+s2NN57o7HQJFL`c*p)G1S{ z-a#EinHMV-m}Slbv*3YQP9Jm1gcPDo8+_7ni1u2;HcpzcBBPwcw2+{qu}oN<24j;= zKujn+nCVVwO(NwR$PBpeqfuecihBAH><{D+gY^pZq*JSLza@k^>JU8$tsXowBqpuo z#Ix8DyeQHJG{LKFR72h^@G+n_z#5&+;+MjCdyBy`K$e)4jegI9@$1dUPhV~-m)6;K zeN$<)2E4RXTvXmluUboeQE>8QjN;46t9o$6`^zeH3R>Ga&%%v5{XQiS(MC1x6yGB?EQSO$jv%>~|tP09ySR1uudJLz++Yc?F-5b}q-hwz!YUlWBK~kI3%@#9(_Eve1AO zxaj>QZbnL336C0qc;FVfXq2aL>|}C@D=&ld(MeH=R2C8mht_Fifm{l$YBXG=eS$lE qT{s<6MnajfK{cwL{P}*!|0o+!vj6aBkMV;rY<>cEFxf2UCIA2iQg!P9 literal 633 zcmV-<0*3t`iwFoXD%EBJ|8r?{Wo=<_E_iKh0M(dHZ`&{ohVT6qLGFq_)@{v@q__Qo z?HnjJ?QoGLRiyH<6PtssZ%juTce<_N?;V>g)7__IE3w=S&Hr-J194yM&e7d@u zq~kongT8-wkD6S$Gp5hhg-_Udqw$*Fx0}xo&jRVS>mk5Z4gqkxY4qi8` z>av=Pz^qFdn3W97I)BWZ35jEy3OwsRL?>hPCT7jJCX3!fdXd^h>x8g+qpeFZrDH;o z!Av_ehE(z!APjgIqD4N5qRzjA{ejGpT|jNJwpL@kC4?p#jzKGf`v3xo$zYqgiygtM zDixsRfSZVC->u-t5UduBF6QOe$_MuY*a<*xAt@U|)@|CPb(yoN94pl#jnZIf)xm{b zXWT(Ddj10WyA0OdMnn>|BG>Ujhhze6`|46q$TxTgUyzb+W+6vS$CuqL#uO2!rw_ls zMC+P3yksI9UQj9A$U#aW+@Bp!m+lg}HW&Mo_d4npx*!dGRQ|+UXH{Ce?sSi~7lHjr zr3bXZpQGRv2W`p7=|1n^3)0T#ac4_QocrRe=FZb3?!s{jTx z$-u2j)nOoh-Aj + + + + + 05 - Distribuição de Software + + + + + + + + + @@ -598,6 +619,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + + diff --git a/syllabus/index.html b/syllabus/index.html index 665be388..b07a8033 100644 --- a/syllabus/index.html +++ b/syllabus/index.html @@ -510,6 +510,27 @@ + + + + + + +
  • + + + + + 05 - Distribuição de Software + + + + +
  • + + + + @@ -664,6 +685,69 @@ + + + + + + + + + + +
  • + + + + + + + + + + +
  • + + +