"
292 | ]
293 | },
294 | "execution_count": 25,
295 | "metadata": {},
296 | "output_type": "execute_result"
297 | }
298 | ],
299 | "execution_count": 25
300 | },
301 | {
302 | "metadata": {},
303 | "cell_type": "code",
304 | "outputs": [],
305 | "execution_count": null,
306 | "source": "",
307 | "id": "8849db164f889e70"
308 | }
309 | ],
310 | "metadata": {
311 | "kernelspec": {
312 | "display_name": "Python 3 (ipykernel)",
313 | "language": "python",
314 | "name": "python3"
315 | },
316 | "language_info": {
317 | "codemirror_mode": {
318 | "name": "ipython",
319 | "version": 3
320 | },
321 | "file_extension": ".py",
322 | "mimetype": "text/x-python",
323 | "name": "python",
324 | "nbconvert_exporter": "python",
325 | "pygments_lexer": "ipython3",
326 | "version": "3.11.5"
327 | }
328 | },
329 | "nbformat": 4,
330 | "nbformat_minor": 5
331 | }
332 |
--------------------------------------------------------------------------------
/conteúdo/Introdução à programação/Python/Game of Life.ipynb.orig:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "metadata": {},
5 | "cell_type": "raw",
6 | "source": [
7 | "# Jogo da Vida de Conway\n",
8 | "O jogo da vida de Conway é um autômato celular, que foi concebido pelo matemático britânico John Horton Conway em 1970. O jogo é um exemplo de um sistema dinâmico que exibe padrões emergentes complexos. Apesar de suas regras simples, o jogo da vida é Turing completo e pode simular uma máquina universal de Turing.\n",
9 | "\n",
10 | "O Jogo da Vida pode ser descrito como um grid bidimensional infinito de células, cada uma das quais pode estar viva ou morta. Cada célula interage com seus oito vizinhos, que são as células que estão horizontal, vertical ou diagonalmente adjacentes. Em cada passo do tempo, as seguintes regras são aplicadas a cada célula:\n",
11 | "1. Uma célula morta com exatamente três vizinhos vivos se torna uma célula viva.\n",
12 | "2. Uma célula viva com dois ou três vizinhos vivos permanece viva.\n",
13 | "3. Em todos os outros casos, uma célula viva morre ou permanece morta.\n",
14 | "\n",
15 | " Vamos implementar o Jogo da vida usando um array bidimensional para representar o grid. Cada célula será representada por um 0 se estiver morta e 1 se estiver viva. Vamos implementar uma função que recebe um grid inicial e o número de passos de tempo e retorna o grid após o número especificado de passos de tempo.\n",
16 | " "
17 | ],
18 | "id": "a8266a341465e21e"
19 | },
20 | {
21 | "cell_type": "code",
22 | "execution_count": null,
23 | "id": "initial_id",
24 | "metadata": {
25 | "collapsed": true
26 | },
27 | "outputs": [],
28 | "source": [
29 | "import numpy as np\n",
30 | "import matplotlib.pyplot as plt\n"
31 | ]
32 | },
33 | {
34 | "metadata": {},
35 | "cell_type": "code",
36 | "outputs": [],
37 | "execution_count": null,
38 | "source": [
39 | "def game_of_life(grid, steps):\n",
40 | " rows, cols = grid.shape\n",
41 | " new_grid = np.zeros((rows, cols))\n",
42 | " for _ in range(steps):\n",
43 | " for i in range(rows):\n",
44 | " for j in range(cols):\n",
45 | " neighbors = grid[max(i - 1, 0):min(i + 2, rows), max(j - 1, 0):min(j + 2, cols)]\n",
46 | " live_neighbors = np.sum(neighbors) - grid[i, j]\n",
47 | " if grid[i, j] == 1 and live_neighbors in [2, 3]:\n",
48 | " new_grid[i, j] = 1\n",
49 | " elif grid[i, j] == 0 and live_neighbors == 3:\n",
50 | " new_grid[i, j] = 1\n",
51 | " grid = new_grid.copy()\n",
52 | " return new_grid"
53 | ],
54 | "id": "477aad00275d031c"
55 | },
56 | {
57 | "metadata": {},
58 | "cell_type": "code",
59 | "outputs": [],
60 | "execution_count": null,
61 | "source": [
62 | "# implementação alternativa\n",
63 | "def game_of_life2(grid, steps):\n",
64 | " for _ in range(steps):\n",
65 | " # Usa numpy.pad para adicionar uma borda de zeros ao redor do grid\n",
66 | " padded_grid = np.pad(grid, pad_width=1, mode='constant', constant_values=0)\n",
67 | " \n",
68 | " # Calcula o número de vizinhos vivos de cada célula\n",
69 | " neighbor_sum = sum(np.roll(np.roll(padded_grid, i, axis=0), j, axis=1)\n",
70 | " for i in (-1, 0, 1) for j in (-1, 0, 1) if (i != 0 or j != 0))\n",
71 | " \n",
72 | " # Apply the rules of the game\n",
73 | " birth = (neighbor_sum==3) & (grid==0)\n",
74 | " survive = ((neighbor_sum==2) | (neighbor_sum==3)) & (grid==1)\n",
75 | " \n",
76 | " grid[:] = birth | survive\n",
77 | " return grid"
78 | ],
79 | "id": "e9dc586f8d38de3"
80 | },
81 | {
82 | "metadata": {},
83 | "cell_type": "markdown",
84 | "source": [
85 | "# Visualização do Jogo da Vida\n",
86 | "Vamos testar a função com um grid inicial aleatório de 10x10 e 10 passos de tempo."
87 | ],
88 | "id": "c0a60c071436170b"
89 | },
90 | {
91 | "metadata": {},
92 | "cell_type": "code",
93 | "outputs": [],
94 | "execution_count": null,
95 | "source": "",
96 | "id": "a139288fe432079a"
97 | }
98 | ],
99 | "metadata": {
100 | "kernelspec": {
101 | "display_name": "Python 3",
102 | "language": "python",
103 | "name": "python3"
104 | },
105 | "language_info": {
106 | "codemirror_mode": {
107 | "name": "ipython",
108 | "version": 2
109 | },
110 | "file_extension": ".py",
111 | "mimetype": "text/x-python",
112 | "name": "python",
113 | "nbconvert_exporter": "python",
114 | "pygments_lexer": "ipython2",
115 | "version": "2.7.6"
116 | }
117 | },
118 | "nbformat": 4,
119 | "nbformat_minor": 5
120 | }
121 |
--------------------------------------------------------------------------------
/conteúdo/Introdução à programação/Python/Lista2.md:
--------------------------------------------------------------------------------
1 | # Lista de exercícios de Python
2 |
3 | ## Tipos básicos
4 | 1. dada uma lista de números aleatórios criada conforme o código abaixo:
5 |
6 | ```python
7 | import random
8 | lista = [random.randint(0, 15000) for i in range(500)]
9 | ```
10 | com apenas uma linha de código, encontre quantos números distintos existem na lista.
11 |
12 | 1. No módulo `collections` do python existe uma classe chamada `Counter` que é um dicionário especial que conta a frequência de cada elemento de uma lista. Utilize essa classe para contar a frequência de cada elemento da lista acima.
13 | 2. Resolva o mesmo problema da questão anterior, mas agora utilizando o tipo defaultdict do módulo `collections`.
14 | 3. Escreva um script que receba dois números como argumentos de linha de comando e imprima a soma deles.
15 |
16 | ## Funções
17 |
18 | 1. Escreva uma função que receba um número variável de argumentos e retorne a soma de todos eles.
19 | 2. Escreva um script que execute uma função `main` apenas quando é executado diretamente, mas não quando é importado como um módulo.
20 | 3. Escreva uma função que leia o arquivo [dados.csv](../dados.csv) e retorne uma lista de tuplas onde cada tupla é uma linha do arquivo. Cada elemento das tuplas é um dos elementos da linha separados por vírgulas. As 4 primeiras linhas do arquivo são comentarios e devem ser ignoradas. A quinta é o cabeçalho que deve ser tratada sem distinção das demais.
21 |
--------------------------------------------------------------------------------
/conteúdo/Introdução à programação/Python/Lista3.md:
--------------------------------------------------------------------------------
1 | # Interagindo com código externo, usando o `import`
2 |
3 | Para realizar os exercícios seguintes, instale faça um clone local do projeto [autoreport](https://github.com/fccoelho/autoreport) desenvolvido em sala de aula.
4 |
5 | Crie um ambiente virtual para o projeto e instale o autoreport nele:
6 |
7 | ```bash
8 | $ cd autoreport
9 | $ poetry install
10 | $ poetry shell
11 | ```
12 | Responda os problemas a seguir em um módulo chamado `meurelatorio.py` na raiz do projeto epireport. Cada problema exigirá implementar uma função neste módulo
13 |
14 | 1. Crie uma função denominada `gera_relatorio_vazio`, que deverá salvar um arquivo `relatorio.tex` somente com o conteúdo do template. Pode utilizar qualquer string para o título e o autor do relatório. Esta função também deve retornar uma string correspondente ao código LaTeX gerado.
15 | 2. Crie uma função denominada `gera_relatorio_secoes`, que receba como argumento uma lista de `n` (n > 1) títulos, de seções, e salve um relatório com as `n` seções, cada uma com o título correspondente. Esta função também deve retornar uma tupla com dois elementos: o primeiro deve ser a lista de títulos passada como argumento, e o segundo uma string correspondente ao código LaTeX gerado. O nome do relatório gerado deve ser `relatorio_secoes.tex`.
16 | 3. Crie uma função denominada `gera_relatorio_tabela`, que receba como argumento uma lista de listas, onde cada lista interna corresponde a uma linha de uma tabela. Esta função deve salvar um relatório com uma tabela (em latex) contendo as linhas passadas como conteúdo. Esta função também deve retornar uma tupla com dois elementos: o primeiro deve ser a lista de listas passada como argumento, e o segundo uma string correspondente ao código LaTeX gerado. O nome do relatório gerado deve ser `relatorio_tabela.tex`. Utilize o template de tabela abaixo:
17 |
18 | ```latex
19 | \begin{table}
20 | \begin{center}
21 | \caption{Tabela de resultados}
22 | \begin{tabular}{lll}
23 | 1 & 2 & 3\\
24 | 4 & 5 & 6\\
25 | × & × & ×
26 | \end{tabular}
27 | \end{center}
28 | \end{table}
29 | ```
30 | O número de colunas ou linhas pode variar.
31 | A tabela deve ser parte de uma seção denominada `Resultados`.
--------------------------------------------------------------------------------
/conteúdo/Introdução à programação/Python/Lista4.md:
--------------------------------------------------------------------------------
1 | # Lista de Exercícíos sobre Numpy e Pandas
2 | Nesta lista de exercícios vamos explorar estas duas bibliotecas que são muito utilizadas para manipulação de dados em Python.
3 |
4 | ## Numpy
5 |
6 | 1. Crie um array com 10 elementos usando a função arange
7 | 2. Transforme esse array de 1D (1x10) para 2D (2x5) usando a função reshape
8 | 3. Crie duas matrizes bidimensionais com valores aleatórios
9 | 4. calcule a transposta de cada matriz
10 | 5. multiplique as duas matrizes
11 | 6. Salve as matrizes de entrada e a de saída em arquivos. Qual o tamanho dos arquivos gerados?
12 | 7. Crie um vetor (array unidimensional) cujos valores sejam o resultado da função $f(x) = 3x^2 - 2x +7$ para cada valor de x em um vetor dado com 1000 elementos, construído com linspace.
13 | 8. Encontre uma maneira de calcular numericamente a primeira derivada da função acima, e construa um plot com as duas funções: A derivada calculada numericamente e a derivada analítica de $3x^2 - 2x +7$.
14 | 9. O índice de massa corporal $IMC=peso/altura^2$ é um critério da Organização Mundial de Saúde para dar uma indicação sobre a condição de peso de uma pessoa adulta. construa uma array com 100 os valores de altura entre 150cm a 195cm, e 100 valores de peso entre 50kg e 100kg. Calcule o IMC para todas as valores e construa uma matriz 2D com os valores de IMC.
15 |
16 | ## Pandas
17 | 1. Crie um dataframe com 4 colunas e 400 linhas, sem usar loops.
18 | 2. Renomeie as colunas deste dataframe.
19 | 3. Extraia a array correspondente aos dados no Dataframe
20 | 4. Adicione as 4 colunas criando uma nova coluna com a resposta
21 | 5. Usando Pandas, calcule a média por coluna do dataframe
22 | 6. Usando Pandas, calcule a média por linha do dataframe
23 |
--------------------------------------------------------------------------------
/conteúdo/Introdução à programação/Python/Lista5.md:
--------------------------------------------------------------------------------
1 | # Lista de exercícios de Python Nº 5
2 |
3 | 1. As regras para determinar se um ano é ou não um bissexto são as seguintes:
4 | - Qualquer ano divisível por 400 é um ano bissexto.
5 | - Dos anos restantes, qualquer ano divisível por 100 não é um ano bissexto.
6 | - Dos anos restantes, qualquer ano divisível por 4 é um ano bissexto.
7 | - Todos os outros anos não são anos bissextos.
8 |
9 | **Tarefa:**
10 | Criar uma função em Python chamada bissexto que receba como parâmetro de entrada um número de um ano
11 | e retorne como parâmetro de saída True se ele é bissexto e False caso contrário.
12 |
13 | 2. Uma boa senha é definida segundo os seguintes critérios:
14 | - possui pelo menos 8 caracteres
15 | - contém pelo menos uma letra maiúscula
16 | - contém pelo menos uma letra minúscula
17 | - contém pelo menos um número
18 |
19 | **Tarefa:**
20 | Criar uma função em Python chamada boaSenha que receba como parâmetro de entrada uma string retorne
21 | como parâmetro de saída True se é uma boa senha e False caso contrário.
22 | 3. Uma data mágica é uma data em que o dia multiplicado pelo mês é igual ao ano de dois dígitos. Por exemplo, 10
23 | de junho de 1960 é uma data mágica porque junho é o sexto mês e 6 vezes 10 é 60, que é igual ao ano de dois
24 | dígitos.
25 |
26 | **Tarefa:**
27 | Criar uma função em Python chamada dataMagica que receba como parâmetro de entrada uma data (pode ser
28 | uma string no formato ddmmaaaa, ou no formato dd/mm/aaaa) retorne como parâmetro de saída True se é uma
29 | data mágica e False caso contrário.
30 | 4. Um número perfeito é um número inteiro positivo que é igual à soma de seus divisores próprios positivos. Por exemplo, 6 é um número perfeito porque seus divisores próprios positivos são 1, 2 e 3, e 1 + 2 + 3 = 6.
31 |
32 | **Tarefa:** Criar uma função em Python chamada numeroPerfeito que receba como parâmetro de entrada um número inteiro positivo e retorne como parâmetro de saída True se é um número perfeito e False caso contrário.
33 | 5. Considere a seguinte série:
34 | $$S_k = \sum_{n=0}^k \frac{(-1)^n}{2n-1} = \frac{1}{1}- \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + \frac{1}{9} \ldots$$
35 | **Tarefa:** Criar uma função em Python chamada serie que receba como parâmetro de entrada um inteiro k e retorne como parâmetro de saída o valor da série S_k.
--------------------------------------------------------------------------------
/conteúdo/Introdução à programação/Python/elevador.py:
--------------------------------------------------------------------------------
1 | '''
2 | https://code-with-me.global.jetbrains.com/jHijHdtv71P8UUyG-748bQ#p=PC&fp=695EB8B2B16D8C3DBFCBDAF1FD27AFFDBC7554A5160BE613A9AA14E22EAF0916&newUi=true
3 | '''
4 | import random
5 | from collections import defaultdict
6 | import time
7 | from matplotlib import pyplot as plt
8 |
9 | LOTACAO = 8
10 | ANDARES = 14
11 | POPULAÇÃO = defaultdict(lambda :0)
12 | FILAS_DE_ANDAR = defaultdict(lambda : 0)
13 | DESEMBARCADOS = 0 # Numero de pessoas entregues em andares != térreo
14 | EMBARCADOS = 0 # numero total de pessoas que pegaram elevadores durante a simulação
15 | CICLOS = 0
16 | ANDARES_PERCORRIDOS = 0
17 |
18 |
19 |
20 |
21 | ## API do elevador
22 | def embarque(elv=0):
23 | """
24 | Realiza o embarque no andar
25 | :param elv: id do elevador
26 | """
27 | global EMBARCADOS
28 | npass = elv['npass']
29 | andar = elv['andar']
30 | while (npass < LOTACAO):
31 | if andar == 0:
32 | if sim['fila'] == 0:
33 | return
34 | destino = escolhe_destino()
35 | elv['passageiros'].append(destino)
36 | if destino not in elv['chamadas']:
37 | elv['chamadas'].append(destino)
38 | sim['fila'] -= 1
39 | EMBARCADOS += 1
40 | elv['npass'] = len(elv['passageiros'])
41 | if sim['fila'] == 0:
42 | break
43 | else:
44 | if FILAS_DE_ANDAR[andar] == 0:
45 | return
46 | elv['passageiros'].append(0)
47 | FILAS_DE_ANDAR[andar] -= 1
48 | elv['npass'] = len(elv['passageiros'])
49 | npass += 1
50 |
51 |
52 |
53 | def escolhe_destino():
54 | return random.randint(1, ANDARES)
55 | def operação():
56 | '''
57 | Define as ações do elevador em função dos estados da simulação e dos elevadores
58 | '''
59 | for elv in elevadores:
60 | desembarque(elv)
61 | embarque(elv)
62 | move(elv)
63 |
64 | def desembarque(elevador):
65 | """
66 | Realiza o desembarque de passageiros no andar
67 | :param andar: andar do desmbarque
68 | """
69 | global DESEMBARCADOS
70 | andar = elevador['andar']
71 | pass_saindo = elevador['passageiros'].count(andar)
72 | if pass_saindo > 0:
73 | for i in range(pass_saindo):
74 | elevador['passageiros'].remove(andar)
75 | if andar != 0:
76 | POPULAÇÃO[andar] += 1
77 | DESEMBARCADOS += 1 # não conto desembarques no térreo
78 |
79 | elevador['npass'] = len(elevador['passageiros'])
80 |
81 | def chamada(n):
82 | """
83 | atualiza estado em resposta a uma chamada no andar n
84 | :param n: andar em que foi chamado o elevador
85 | """
86 | pass
87 |
88 | def input_int(n):
89 | pass
90 | ## Eventos
91 | eventos ={
92 | 'embarque': embarque,
93 | 'chamada' : chamada,
94 | 'input_int': input_int,
95 | 'desembarque': desembarque
96 | }
97 |
98 | def init_sim():
99 | ## Elevadores
100 | estado_e1 = dict([('andar_ant',0),('andar', 0), ('npass', 0), ('passageiros',[]), ('direção', 0), ('chamadas', [])])
101 | estado_e2 = dict([('andar_ant',0),('andar', 0), ('npass', 0), ('passageiros',[]), ('direção', 0), ('chamadas', [])])
102 | # simulação
103 | estado_sim = dict([('fila', 0), ('energia', 0.0), ('viagens', 0)])
104 | for i in range(1,ANDARES+1):
105 | POPULAÇÃO[i]
106 | return (estado_e1,estado_e2),estado_sim
107 |
108 | def gera_fila():
109 | n = random.randint(1,3)
110 | sim['fila'] += n
111 |
112 | def gera_fila_bench(i):
113 | fila = [2, 2, 1, 1, 3, 1, 2, 2, 3, 2, 1, 1, 2, 3, 1, 1, 3, 2, 3, 3, 2, 2, 2, 2, 1, 1, 2, 1, 1, 1, 2, 3, 1,
114 | 1, 1, 1, 3, 2, 1, 2, 1, 3, 3, 1, 3, 3, 1, 2, 3, 2, 2, 3, 1, 2, 3, 1, 3, 2, 2, 1, 3, 2, 3, 2, 1, 1,
115 | 1, 2, 2, 3, 1, 1, 1, 3, 3, 2, 1, 1, 3, 3, 2, 3, 3, 1, 1, 3, 2, 3, 3, 1, 1, 1, 2, 2, 3, 1, 2, 3, 2, 1, 3]
116 | # print(i)
117 | sim['fila'] += fila[i]
118 | def atualiza_chamadas(andar=0):
119 | """
120 | Adiciona destinos aos elevadores
121 | :param andar:
122 | """
123 | for elv in elevadores:
124 | if elv['andar'] == andar:
125 | continue
126 | if andar not in elv['chamadas']:
127 | elv['chamadas'].append(andar)
128 |
129 |
130 | def move(elv):
131 | """
132 | Determina destino do elevador
133 | :param elv: Elevador
134 | """
135 | global ANDARES_PERCORRIDOS
136 | if not elv['chamadas']:
137 | return
138 | distancias = [abs(elv['andar']- c) for c in elv['chamadas']]
139 | destino = elv['chamadas'][distancias.index(min(distancias))]
140 | elv['direção'] = 1 if destino > elv['andar'] else -1
141 | elv['andar_ant'] = elv['andar']
142 | elv['andar'] = destino
143 | elv['chamadas'].remove(destino)
144 | ANDARES_PERCORRIDOS += abs(elv['andar'] - elv['andar_ant'])
145 |
146 |
147 | def saidas():
148 | """
149 | Gera filas de saída nos andares
150 | """
151 | andar = random.randint(1, ANDARES) # Sorteia um andar
152 | descendo = random.randint(0,POPULAÇÃO[andar]) # determina quantos passageiros
153 | FILAS_DE_ANDAR[andar] += descendo # Atualiza fila
154 | atualiza_chamadas(andar)
155 |
156 |
157 | def loop_de_evento(n):
158 | global CICLOS, elevadores, sim
159 | i=0
160 | entregas = []
161 | elevadores, sim = init_sim()
162 | while True:
163 | # gera_fila()
164 | gera_fila_bench(i)
165 | operação()
166 | saidas()
167 | if sim['fila'] > 0:
168 | atualiza_chamadas(0) # Chama os elevadores para o andar 0 caso tenha fila
169 | if i == n:
170 | break
171 | CICLOS += 1
172 | i += 1
173 | entregas.append(DESEMBARCADOS)
174 | if i < n:
175 | print(f"{i}:Tamanho da fila: {sim['fila']}; Embarcados: {EMBARCADOS}; Desembarcados: {DESEMBARCADOS}; Andares Percorridos: {ANDARES_PERCORRIDOS}\r",end="" )
176 | else:
177 | eficiência = DESEMBARCADOS / ANDARES_PERCORRIDOS
178 | print(f"{i}:Tamanho da fila: {sim['fila']}; Embarcados: {EMBARCADOS}; Desembarcados: {DESEMBARCADOS}; Andares Percorridos: {ANDARES_PERCORRIDOS}; Eficiência: {eficiência}")
179 |
180 | return entregas, eficiência
181 |
182 |
183 | if __name__ == "__main__":
184 | elevadores, sim = init_sim()
185 | entregas=[]
186 | eficiências=[]
187 | n = 100
188 | loop_de_evento(n)
189 | # for i in range(100):
190 | # en,ef = loop_de_evento(100)
191 | # entregas.append(en)
192 | # eficiências.append(ef)
193 | # DESEMBARCADOS = 0 # Numero de pessoas entregues em andares != térreo
194 | # EMBARCADOS = 0 # numero total de pessoas que pegaram elevadores durante a simulação
195 | # CICLOS = 0
196 | # ANDARES_PERCORRIDOS = 0
197 | #
198 | # print(elevadores)
199 | # plt.plot(entregas)
200 | # plt.title("Passageiros Entregues a cada ciclo")
201 | # plt.xlabel("ciclos")
202 | # plt.figure()
203 | # plt.hist(eficiências)
204 | # plt.xlabel("Eficiência")
205 | # plt.show()
206 |
--------------------------------------------------------------------------------
/conteúdo/Introdução à programação/Python/elevador_report.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "metadata": {},
5 | "cell_type": "markdown",
6 | "source": "# Analisando o desempenho da simulação",
7 | "id": "e1d910ea00287e94"
8 | },
9 | {
10 | "cell_type": "code",
11 | "id": "initial_id",
12 | "metadata": {
13 | "collapsed": true,
14 | "jupyter": {
15 | "is_executing": true
16 | }
17 | },
18 | "source": [
19 | "from elevador import *\n",
20 | "import elevador"
21 | ],
22 | "outputs": [],
23 | "execution_count": null
24 | },
25 | {
26 | "metadata": {},
27 | "cell_type": "code",
28 | "outputs": [],
29 | "execution_count": null,
30 | "source": [
31 | "entregas=[]\n",
32 | "eficiências=[]\n",
33 | "n = 100\n",
34 | "# loop_de_evento(n)\n",
35 | "for i in range(100):\n",
36 | " elevador.POPULAÇÃO = defaultdict(lambda:0)\n",
37 | " elevador.DESEMBARCADOS = 0 # Numero de pessoas entregues em andares != térreo\n",
38 | " elevador.EMBARCADOS = 0 # numero total de pessoas que pegaram elevadores durante a simulação\n",
39 | " elevador.CICLOS = 0\n",
40 | " elevador.ANDARES_PERCORRIDOS = 0\n",
41 | " en,ef = loop_de_evento(100)\n",
42 | " entregas.append(en)\n",
43 | " eficiências.append(ef)\n",
44 | "\n",
45 | "\n",
46 | "# print(elevadores)\n",
47 | "print(elevador.POPULAÇÃO)\n",
48 | "plt.plot(entregas)\n",
49 | "plt.title(\"Passageiros Entregues a cada ciclo\")\n",
50 | "plt.xlabel(\"ciclos\")\n",
51 | "plt.figure()\n",
52 | "plt.hist(eficiências)\n",
53 | "plt.xlabel(\"Eficiência\")\n",
54 | "plt.show()"
55 | ],
56 | "id": "4e02212845e35db0"
57 | }
58 | ],
59 | "metadata": {
60 | "kernelspec": {
61 | "display_name": "Python 3",
62 | "language": "python",
63 | "name": "python3"
64 | },
65 | "language_info": {
66 | "codemirror_mode": {
67 | "name": "ipython",
68 | "version": 2
69 | },
70 | "file_extension": ".py",
71 | "mimetype": "text/x-python",
72 | "name": "python",
73 | "nbconvert_exporter": "python",
74 | "pygments_lexer": "ipython2",
75 | "version": "2.7.6"
76 | }
77 | },
78 | "nbformat": 4,
79 | "nbformat_minor": 5
80 | }
81 |
--------------------------------------------------------------------------------
/conteúdo/Introdução à programação/Python/funcoes.py:
--------------------------------------------------------------------------------
1 | import sys
2 |
3 |
4 | def main():
5 | a = float(sys.argv[1])
6 | b = float(sys.argv[2])
7 |
8 | print(a+b)
9 |
10 | if __name__ == "__main__":
11 | main()
--------------------------------------------------------------------------------
/conteúdo/Introdução à programação/Python/gui.py:
--------------------------------------------------------------------------------
1 | import flet as ft
2 | import elevador as EE
3 | import time
4 |
5 | elevadores, sim = EE.init_sim()
6 | def loop_de_evento(n, page):
7 | CICLOS=0
8 | i=0
9 | EE.sim = sim
10 | EE.elevadores = elevadores
11 | entregas = []
12 | while True:
13 | # gera_fila()
14 | EE.gera_fila_bench(i)
15 | EE.operação()
16 | EE.saidas()
17 | if sim['fila'] > 0:
18 | EE.atualiza_chamadas(0) # Chama os elevadores para o andar 0 caso tenha fila
19 | if i == n:
20 | break
21 | CICLOS += 1
22 | i += 1
23 | print(i)
24 | time.sleep(1)
25 | atualiza_mostradores(page.most1, elevadores[0]['andar'])
26 | atualiza_mostradores(page.most2, elevadores[1]['andar'])
27 | page.update()
28 |
29 | def atualiza_mostradores(m, val):
30 | m.value = str(val)
31 | m.bgcolor = ft.colors.GREEN_200
32 |
33 |
34 |
35 | def main(page: ft.Page):
36 | page.title = "Painel de Controle do Elevador"
37 | page.vertical_alignment = ft.MainAxisAlignment.CENTER
38 | page.update()
39 |
40 | def mudacor(e):
41 | e.control.bgcolor = ft.colors.AMBER_300
42 | e.page.update()
43 |
44 | page.most1 = ft.TextField(value=0, label='Elevador 1', bgcolor=ft.colors.GREEN_200, on_change=mudacor)
45 | page.most2 = ft.TextField(value=0, label='Elevador 2', bgcolor=ft.colors.GREEN_200, on_change=mudacor)
46 |
47 |
48 |
49 | page.add(
50 | ft.Row(
51 | controls=[page.most1, page.most2],
52 | spacing=15
53 | )
54 | )
55 | loop_de_evento(100, page)
56 |
57 |
58 | ft.app(main)
59 |
--------------------------------------------------------------------------------
/conteúdo/Introdução à programação/Python/lecsv.py:
--------------------------------------------------------------------------------
1 | import argparse
2 |
3 |
4 | def le_arquivo(nome_arq):
5 | with open(nome_arq, 'r') as f:
6 | linhas = [tuple(l.strip().strip('"').split('","')) for l in f.readlines()[4:]]
7 | # print(linhas[:2])
8 | lcab = len(linhas[0])
9 | for n, l in enumerate(linhas):
10 | try:
11 | assert len(l) == lcab
12 | except AssertionError:
13 | print(n, len(l))
14 | # print (l)
15 | print(f"{n} linhas processadas do arquivo {nome_arq}")
16 |
17 |
18 | if __name__ == "__main__":
19 | parser = argparse.ArgumentParser(description='Lê um arquivo CSV')
20 | parser.add_argument("csv", type=open, help="Arquivo CSV")
21 | # print(dir(parser.parse_args()))
22 | le_arquivo(nome_arq=parser.parse_args().csv.name)
23 |
--------------------------------------------------------------------------------
/conteúdo/Introdução à programação/Python/lecsvgen.py:
--------------------------------------------------------------------------------
1 | def gen_linha(nome_arq):
2 | with open(nome_arq, 'r') as f:
3 | for i, l in enumerate(f.readlines()):
4 | if i >= 4:
5 | yield l.strip().strip('"').split('","')
6 |
7 |
8 | def converte_linha(nome_arq):
9 |
10 | for linha in gen_linha(nome_arq):
11 | linha_convertida = []
12 | for el in linha:
13 | try:
14 | f = float(el)
15 | if int(f) == f:
16 | linha_convertida.append(int(f))
17 | else:
18 | linha_convertida.append(f)
19 | except ValueError:
20 | linha_convertida.append(el)
21 | yield linha_convertida
22 |
23 |
24 |
25 | if __name__ == "__main__":
26 | nome_arq = "dados.csv"
27 | for l in converte_linha(nome_arq):
28 | print(l)
29 |
--------------------------------------------------------------------------------
/conteúdo/Introdução à programação/Python/modulo.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | """
3 | Created on Wed Mar 29 08:58:19 2023
4 |
5 | @author: flavio.codeco.coelho
6 | """
7 |
8 | import funcoes
9 |
10 | print(funcoes.__name__)
--------------------------------------------------------------------------------
/conteúdo/Introdução à programação/Python/pyproject.toml:
--------------------------------------------------------------------------------
1 | [project]
2 | name = "python"
3 | version = "0.1.0"
4 | description = "Add your description here"
5 | readme = "README.md"
6 | requires-python = ">=3.11"
7 | dependencies = [
8 | "matplotlib>=3.10.3",
9 | "pandas>=2.2.3",
10 | "pyarrow>=20.0.0",
11 | "scipy>=1.15.3",
12 | "sympy>=1.14.0",
13 | ]
14 |
--------------------------------------------------------------------------------
/conteúdo/Introdução à programação/Python/romanos.py:
--------------------------------------------------------------------------------
1 | def num_romanos(num):
2 | if 3 < num <= 5:
3 | res = (5 - num) * 'I' + 'V'
4 | elif num > 5:
5 | res = 'V' + (num-5) * 'I'
6 | elif 0 <= num <= 3:
7 | res = num * 'I'
8 | else:
9 | print(f"não sei converter {num}!")
10 | return res
11 |
--------------------------------------------------------------------------------
/conteúdo/Introdução à programação/Python/romanos_to_ar.py:
--------------------------------------------------------------------------------
1 | val = {"I": 1,
2 | "V": 5,
3 | "X": 10,
4 | "L": 50,
5 | "C": 100,
6 | "D": 500,
7 | "M": 1000}
8 |
9 |
10 | def soma_iguais(nrl):
11 | i = 0
12 | if len(set(nrl)) > 1:
13 | ls = []
14 | while True:
15 | if i > len(nrl) - 1:
16 | break
17 | if len(set(nrl[i:i + 3])) == 1:
18 | ls.append(sum(nrl[i:i + 3]))
19 | i += 3
20 | elif len(set(nrl[i:i + 2])) == 1:
21 | ls.append(sum(nrl[i:i + 2]))
22 | i += 2
23 | else:
24 | ls.append(nrl[i])
25 | i += 1
26 | else:
27 | ls = nrl
28 |
29 | return ls
30 |
31 |
32 | def soma_final(nrl):
33 | i = len(nrl) - 1
34 | nar = 0
35 | while i > 0:
36 | if nrl[i] > nrl[i - 1]:
37 | nar += (nrl[i] - nrl[i - 1])
38 | i -= 2
39 | else:
40 | nar += nrl[i]
41 | i -= 1
42 | return nar + nrl[0] if i == 0 else nar
43 |
44 |
45 | def converte_romanos(nr):
46 | nr = nr.upper()
47 | nrl = [val[i] for i in nr]
48 | if set(nrl) == {1}:
49 | return sum(nrl)
50 | else:
51 | nrls = soma_iguais(nrl)
52 | return soma_final(nrls)
53 |
--------------------------------------------------------------------------------
/conteúdo/Introdução à programação/Python/test_romanos.py:
--------------------------------------------------------------------------------
1 | import unittest
2 | from romanos import num_romanos
3 |
4 |
5 | class TesteRomanos(unittest.TestCase):
6 | def test_um(self):
7 | um = num_romanos(1)
8 | self.assertEqual('I', um) # add assertion here
9 |
10 | def test_zero(self):
11 | zero = num_romanos(0)
12 | self.assertEqual('', zero)
13 |
14 | def test_dois(self):
15 | dois = num_romanos(2)
16 | self.assertEqual('II', dois)
17 |
18 | def test_tres(self):
19 | tres = num_romanos(3)
20 | self.assertEqual('III', tres)
21 |
22 | def test_quatro(self):
23 | quatro = num_romanos(4)
24 | self.assertEqual('IV', quatro)
25 |
26 | def test_cinco(self):
27 | cinco = num_romanos(5)
28 | self.assertEqual('V', cinco)
29 |
30 | def test_seis(self):
31 | seis = num_romanos(6)
32 | self.assertEqual('VI', seis)
33 |
34 | def test_sete(self):
35 | sete = num_romanos(7)
36 | self.assertEqual('VII', sete)
37 |
38 | def test_oito(self):
39 | oito = num_romanos(8)
40 | self.assertEqual('VIII', oito)
41 |
42 | def test_nove_ou_mais(self):
43 | rom = num_romanos(9)
44 | self.assertEqual('IX', rom)
45 | # rom = num_romanos(10)
46 |
47 | if __name__ == '__main__':
48 | unittest.main()
49 |
--------------------------------------------------------------------------------
/conteúdo/Introdução à programação/Python/test_romanos_to_ar.py:
--------------------------------------------------------------------------------
1 | from romanos_to_ar import converte_romanos, soma_iguais, soma_final
2 |
3 |
4 | def test_soma_iguais():
5 | nrl = [10, 10, 10, 1, 10]
6 | res = soma_iguais(nrl)
7 | assert res == [30, 1, 10]
8 | nrl = [1, 5]
9 | res = soma_iguais(nrl)
10 | assert res == [1, 5]
11 |
12 |
13 | def test_soma_iguais_2():
14 | nrl = [10, 10, 10, 1, 1, 1]
15 | res = soma_iguais(nrl)
16 | assert res == [30, 3]
17 |
18 |
19 | def test_soma_final():
20 | nrl = [10, 10, 10, 1, 10]
21 | nrls = soma_iguais(nrl)
22 | res = soma_final(nrls)
23 | assert res == 39
24 |
25 |
26 | def test_convert_I():
27 | esperado = 1
28 | ar = 'I'
29 | resposta = converte_romanos(ar)
30 | assert resposta == esperado
31 |
32 |
33 | def test_convert_2():
34 | esperado = 2
35 | ar = 'II'
36 | resposta = converte_romanos(ar)
37 | assert resposta == esperado
38 |
39 |
40 | def test_convert_3():
41 | esperado = 3
42 | ar = 'III'
43 | resposta = converte_romanos(ar)
44 | assert resposta == esperado
45 |
46 |
47 | def test_convert_4():
48 | esperado = 4
49 | ar = 'IV'
50 | resposta = converte_romanos(ar)
51 | assert resposta == esperado
52 |
53 |
54 | def test_convert_5():
55 | esperado = 5
56 | ar = 'V'
57 | resposta = converte_romanos(ar)
58 | assert resposta == esperado
59 |
60 |
61 | def test_convert_6():
62 | esperado = 6
63 | ar = 'VI'
64 | resposta = converte_romanos(ar)
65 | assert resposta == esperado
66 |
67 |
68 | def test_convert_7():
69 | esperado = 7
70 | ar = 'VII'
71 | resposta = converte_romanos(ar)
72 | assert resposta == esperado
73 |
74 |
75 | def test_convert_8():
76 | esperado = 8
77 | ar = 'VIII'
78 | resposta = converte_romanos(ar)
79 | assert resposta == esperado
80 |
81 |
82 | def test_convert_9():
83 | esperado = 9
84 | ar = 'IX'
85 | resposta = converte_romanos(ar)
86 | assert resposta == esperado
87 |
88 |
89 | def test_convert_i():
90 | esperado = 1
91 | ar = 'i'
92 | resposta = converte_romanos(ar)
93 | assert resposta == esperado
94 |
95 |
96 | def test_convert_10():
97 | esperado = 10
98 | ar = 'X'
99 | resposta = converte_romanos(ar)
100 | assert resposta == esperado
101 |
102 |
103 | def test_convert_11():
104 | esperado = 11
105 | ar = 'XI'
106 | resposta = converte_romanos(ar)
107 | assert resposta == esperado
108 |
109 |
110 | def test_convert_15():
111 | esperado = 15
112 | ar = 'XV'
113 | resposta = converte_romanos(ar)
114 | assert resposta == esperado
115 |
116 |
117 | def test_convert_14():
118 | esperado = 14
119 | ar = 'XIV'
120 | resposta = converte_romanos(ar)
121 | assert resposta == esperado
122 |
--------------------------------------------------------------------------------
/conteúdo/Introdução à programação/basic.md:
--------------------------------------------------------------------------------
1 | # Introdução ao Basic com Yabasic
2 |
3 | O objetivo desta aula é ter uma noção básica de como era a interface básica com o usuário nos primeiros computadores pessoais: Um simples interpretador basic.
4 |
5 | O Basic foi a linguagem escolhida para estes computadores por sua simplicidade. Hoje em dia é cada vez menos utilizada, escontrando utilização ainda como linguagem ara scriptação de alguns aplicativos que tiveram origem na época em que o Basic ainda era uma linguagem popular.
6 |
7 | Vamos começar com um exercício de leitura de código. Tente entender qual resultado do código abaixo:
8 |
9 | ```basic
10 | clear screen
11 | print "Press 'q' to quit ..."
12 | label again
13 | print color("green") "Hello ";
14 | print color("blue") "World ! ";
15 | if (inkey$(1)="q") exit
16 | goto again
17 | ```
18 |
19 | Conseguiu? teste sua intepretação executando este código no interpretador [yabasic](https://2484.de/yabasic/).
20 |
21 | O Yabasic é uma implementação moderna de uma linguagem antiga cujo interesse, atualmente é meramente histórica, mas nos ensina a entender a evolução das linguagens.
22 | # Exercícios
23 | [Esta lista](/conteúdo/Introdução%20à%20programação%20em%20Python/lista1.md) conté vários exercícios simples de programação, que podem ser resolvidos em qualquer linguagem. vamos resolver o primeiro em basic!
24 |
25 | 1. Crie um programa simples para imprimir “Alô, Fulano!”
26 | ```basic
27 | input "qual o seu nome? " N$
28 | print "Olá ", N$, "!"
29 | ```
30 |
31 | Fácil, não? Agora desafie-se com os demais exercícios! Complete o programas abaixo:
32 | ## Desafio
33 | 1. Crie um programa que imprima a sequência de Fibonacci até o décimo termo.
34 |
35 |
36 | ```basic
37 | a=0
38 | b=1
39 | ```
40 | 2. Crie um programa que imprima a tabuada de 7.
41 | 3. Crie um programa que solicite dois números ao usuário e imprima a média deles.
42 | 4. considere o programa abaixo:
43 | ```basic
44 | print "Aperte uma tecla para continuar"
45 | print "(O program irá continuar após 10 segundos)"
46 | clear screen
47 | for a=1 to 10
48 | print a
49 | k$ = inkey$(1)
50 | if (k$<>"") then goto done
51 | endif
52 | next a
53 | label done
54 | print "Você pressionou a tecla ", k$
55 | ```
56 | Agora escreva um programa similar, que faça uma pergunta do tipo "sim(S) ou não(N)"e caso o usuário não responda em 10 segundos, ou responda "N", saia do programa. caso contrario, imprima a resposta do usuário. Utilize o comando `goto` ou `gosub` para implementar a lógica.
57 |
58 | 5. Considere o programa abaixo:
59 | ```basic
60 | open window 200,200
61 | line 50,50, 100,100
62 | ```
63 | Agora escreva um programa que desenhe um quadrado de lado 50, e um triângulo equilátero de lado 50. Utilize o comando `line` para desenhar os triângulos. Dica: a altura de um triângulo equilátero de lado `L` é `L*sqrt(3)/2`.
64 |
65 |
66 |
--------------------------------------------------------------------------------
/conteúdo/Introdução à programação/datas:
--------------------------------------------------------------------------------
1 | 1965-02-28
2 | 1966-09-08
3 | 1966-09-15
4 | 1966-09-22
5 | 1966-09-29
6 | 1966-10-06
7 | 1966-10-13
8 | 1966-10-20
9 | 1966-10-27
10 | 1966-11-03
11 | 1966-11-10
12 | 1966-11-17
13 | 1966-11-24
14 | 1966-12-08
15 | 1966-12-15
16 | 1966-12-29
17 | 1967-01-05
18 | 1967-01-12
19 | 1967-01-19
20 | 1967-01-26
21 | 1967-02-02
22 | 1967-02-09
23 | 1967-02-16
24 | 1967-02-23
25 | 1967-03-02
26 | 1967-03-09
27 | 1967-03-23
28 | 1967-03-30
29 | 1967-04-06
30 | 1967-04-13
31 |
--------------------------------------------------------------------------------
/conteúdo/Introdução à programação/gui.py:
--------------------------------------------------------------------------------
1 | import flet as ft
2 | import elevador as EE
3 | import time
4 |
5 | elevadores, sim = EE.init_sim()
6 | def loop_de_evento(n, page):
7 | CICLOS=0
8 | i=0
9 | EE.sim = sim
10 | EE.elevadores = elevadores
11 | entregas = []
12 | while True:
13 | # gera_fila()
14 | EE.gera_fila_bench(i)
15 | EE.operação()
16 | EE.saidas()
17 | if sim['fila'] > 0:
18 | EE.atualiza_chamadas(0) # Chama os elevadores para o andar 0 caso tenha fila
19 | if i == n:
20 | break
21 | CICLOS += 1
22 | i += 1
23 | print(i)
24 | time.sleep(1)
25 | atualiza_mostradores(page.most1, elevadores[0]['andar'])
26 | atualiza_mostradores(page.most2, elevadores[1]['andar'])
27 | page.update()
28 |
29 | def atualiza_mostradores(m, val):
30 | m.value = str(val)
31 | def main(page: ft.Page):
32 | page.title = "Painel de Controle do Elevador"
33 | page.vertical_alignment = ft.MainAxisAlignment.CENTER
34 | page.update()
35 |
36 | page.most1 = ft.TextField(value=0, label='Elevador 1', bgcolor=ft.colors.GREEN_200)
37 | page.most2 = ft.TextField(value=0, label='Elevador 2', bgcolor=ft.colors.GREEN_200)
38 |
39 | page.add(
40 | ft.Row(
41 | controls=[page.most1, page.most2],
42 | spacing=15
43 | )
44 | )
45 | loop_de_evento(100, page)
46 |
47 |
48 | ft.app(main)
49 |
--------------------------------------------------------------------------------
/conteúdo/Introdução à programação/lista1.md:
--------------------------------------------------------------------------------
1 | # Lista de exercícios de Programação
2 | Esta lista pode ser re-utilizada para as várias linguagens de programação que vamos visitar: Basic, Shell e Python
3 |
4 | 1. Crie um programa simples para imprimir “Hello, world!”
5 | 1. Crie um programa que implemente uma calculadora simples com as operações de adição, subtração, multiplicação, divisão e potência.
6 | 2. Crie um programa para calcular a área de um círculo
7 | 3. Crie um programa para encontrar a soma de uma série de números
8 | 4. Escreva um programa para ordenar uma lista de números
9 | 5. Escreva um programa para encontrar o máximo e o mínimo de uma lista de números
10 | 6. Escreva um programa para encontrar a raiz quadrada de um número
11 | 7. Escreva um programa para verificar se um número é primo ou não
12 | 8. Crie um programa para calcular o fatorial de um número
13 | 9. Escreva um programa para imprimir a sequência de Fibonacci
14 |
--------------------------------------------------------------------------------
/conteúdo/Redes e Internet/1-TCP-IP.md:
--------------------------------------------------------------------------------
1 | # Introdução a protocolos de rede -- TCP e IP
2 |
3 | TCP/IP (Transmission Control Protocol/Internet Protocol) é um conjunto de protocolos usados para comunicação pela Internet e outras redes de computadores. É um bloco de construção fundamental das rede computacionais modernas e é usado por praticamente todos os computadores e dispositivos conectados à Internet. Nesta aula, vamos explorar os fundamentos da rede TCP/IP e seu uso no terminal Linux.
4 |
5 | ## Introdução aos protocolos
6 |
7 | Os dois componentes de protocolo do TCP/IP lidam com diferentes aspectos da rede de computadores.
8 |
9 | - Protocolo de Internet – o **IP** de TCP/IP – é um protocolo sem conexão que lida apenas com o roteamento de pacotes de rede usando o *datagrama* IP como a unidade básica de informações de rede. O datagrama IP consiste em um cabeçalho seguido por uma mensagem.
10 |
11 | - O Protocolo de Controle de Transmissão – o **TCP** de TCP/IP – permite que hosts de rede estabeleçam conexões que podem ser usadas para trocar fluxos de dados. O TCP também garante que os dados enviados entre as conexões sejam entregues e que cheguem a um host de rede na mesma ordem em que foram enviados de outro host de rede.
12 |
13 | No Linux, a stack do TCP/IP é incorporada ao kernel do sistema operacional, o que significa que todas as funções de rede são controladas pelo kernel. Isso permite uma experiência de rede mais eficiente e confiável, bem como maior segurança para as funções de rede.
14 |
15 | Uma das ferramentas mais comuns usadas no terminal Linux para rede TCP/IP é o comando 'ping'. Este comando é usado para testar a conectividade entre dois dispositivos enviando pacotes ICMP (Internet Control Message Protocol) e recebendo respostas. Por exemplo, para testar a conectividade entre um computador Linux com endereço IP 192.168.1.10 e um roteador com endereço IP 192.168.1.1, podemos usar o seguinte comando:
16 |
17 | ```bash
18 | $ ping 192.168.1.1
19 | ```
20 |
21 | Esse comando envia pacotes ICMP para o roteador e aguardará uma resposta. Se o roteador responder, sabemos que há conectividade entre os dois dispositivos.
22 |
23 | Outra ferramenta útil para rede TCP/IP no terminal Linux é o comando 'netstat'. Este comando exibe informações sobre conexões de rede ativas, tabelas de roteamento e outras estatísticas de rede. Por exemplo, para visualizar todas as conexões TCP ativas em um computador Linux, podemos usar o seguinte comando:
24 |
25 | ```bash
26 | $ netstat -at
27 | ```
28 |
29 | Este comando vai exibir uma lista de todas as conexões TCP, junto com seus endereços locais e remotos e o status atual da conexão.
30 |
31 | ## Conceitos básicos
32 | ### O Endereço IP
33 |
34 | Todos os computadores em uma rede precisam ter um endereço. O esquema de endereçamento da Internet é baseado nos endereços IP. A versão original dos endereços IP, denominada de IPv4, consiste em um número de 32 bits separado em blocos de 8 bits. Estes endereços foram pensados para serem legíveis por humanos, mas com o crescimento da Internet, foi necessário a expansão da base de endereçamento para 128 bits, dando origem ao IPv6, que é bem menos legível.
35 |
36 | ### Classes de rede e máscaras
37 | Originalmente os endereços eram divididos em blocos denominados [classes](https://en.wikipedia.org/wiki/Classful_network). Mas esta divisão a priori mostrou-se pouco eficiente, pois o espaço de endereços a ser buscados durante o [roteamento](https://en.wikipedia.org/wiki/Routing) era muito grande. Criou-se então o conceito de máscaras que definiam intervalos de endereços correspondentes a [sub-redes](https://en.wikipedia.org/wiki/Subnetwork). Desta forma todos os computadores em uma sub-rede têm o mesmo prefixo, por exemplo: 10.23.23.123 e 10.23.23.127 pertence a uma mesma sub-rede que pode ser identificada pela máscara 255.255.255.0.
38 |
39 | #### Cauculando Mascaras de Subrede
40 | Para calcular a máscara de subrede, basta converter o endereço IP e a máscara de subrede para binário e aplicar a operação lógica AND bit a bit. Por exemplo, para calcular a máscara de subrede para o endereço IP[Máscaras de sub-rede](https://en.wikipedia.org/wiki/Subnet) são usadas para definir o intervalo de endereços que pertencem a uma sub-rede. Para calcular a máscara de subrede para o endereço IP 198.51.100.123, basta converter o endereço IP para binário e aplicar a operação lógica AND bit a bit com a máscara de subrede 255.255.255.0. O resultado será o endereço de subrede
41 |
42 | ```python
43 | #convertendo o IP 198.51.100.123 para binário
44 | endereço = [198, 51, 100, 123]
45 | endereço_binário = [bin(i)[2:].zfill(8) for i in endereço]
46 | # Calculando a máscara de subrede de sub-rede
47 | máscara = [255, 255, 255, 0]
48 | máscara_binária = [bin(i)[2:].zfill(8) for i in máscara]
49 | # Aplicando a operação lógica AND
50 | resultado = [a & m for a,m in zip(endereço, máscara)]
51 | # Note que o operador AND binário, &, quando aplicado a dois números em base 10, primeiro os converte para binário e depois aplica a operação AND bit a bit.
52 | ```
53 | **Exercício**: usando a conversão para binário gerada acima, calcule manualmente o endereço de sub-rede, fazendo a operação AND e reconvertendo de volta para decimal. Compare suas contas manuais com o valor da variável `resultado`.
54 |
55 |
56 |
57 |
58 |
59 |
60 | #### Notação CIDR
61 | [CIDR](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation) significa "Classless Inter-Domain Routing" é uma notação simplificada para representar máscaras de endereços.
62 | Ela consiste de um endereço IP seguido de uma "/" e um número decimal. Este número decimal representa o número de bits pré-alocados para o prefixo da rede. Logo, 198.51.100.0/24 correspone à seguinte máscara de subrede: 255.255.255.0 ou os endereços de 198.51.100.0 a 198.51.100.255 , pois 24 bits correspondem aos 3 primeiros octetos do endereço IP.
63 |
64 | Para calcular quantos endereços estão disponíveis sob uma certa máscara basta usar a seguinte fórmula 2^(comp.do endereço-comp do prefixo). Existem [calculadoras online](https://mxtoolbox.com/subnetcalculator.aspx), que dão mais informações.
65 |
66 | ## Redes Privadas e NAT
67 | Redes privadas não precisam ter endereços que sejam globalmente únicos. Então podem usar livremente todo o espaço de endereçamento do IPv4 ou 6. Porém para comunicar-se com endereços da internet, precisam fazê-lo através de um protocolo denominado ["network address translation"](https://en.wikipedia.org/wiki/Network_address_translation)(NAT).
68 |
69 | ### NAT
70 | 
71 | A tradução de endereços entre a LAN (rede local) e a WAN (tipicamente a internet) se dá a nível de um [roteador](https://en.wikipedia.org/wiki/Router_(computing)).
72 |
73 | Todos os pacotes IP possuem um endereço de origem e outro de destino. Quando estes pacotes passam por um NAT, vindo de uma rede privada, o seu endereço de origem é alterado, e quando chegam a uma rede privada o seu endereço de destino é alterado. Normalmente um host externo, em um cenário de NAT simétrico, não consegue enviar pacotes para um host na rede interna, a menos que seja uma resposta ao uma comunicação iniciada pelo host interno, pois cada transmissão iniciada internamente cria uma uma regra de tradução de endereçõs no NAT.
74 |
75 | Quando 2 hosts em redes locais distintas querem se comunicar diretamente, estratégias de [travessia de NAT](https://en.wikipedia.org/wiki/TCP_hole_punching), precisam ser utilizadas, por exemplo para aplicações [P2P](https://en.wikipedia.org/wiki/Peer-to-peer).
76 |
77 | ## Protocolo TCP
78 | O protocolo TCP diz respeito aos pacotes de dados a ser transmitidos entre dois computadores, Enquanto o pacote IP cuida do endereçamento, o TCP garante a integridade da comunicação anível dos bytes. O TCP prioriza a integridade dos dados sobre a velocidade de transmissão. Então aplicações que não requerem integridade absoluta, como o VOIP (telefonia IP) podem se utilizar de outros protocolos como o [UDP](https://en.wikipedia.org/wiki/User_Datagram_Protocol), por exemplo.
79 | 
80 |
81 | Tanto o protocolo TCP quanto o UDP se utilizam de portas para identificar e trocar informaçẽs com aplicativos específicos em um host. As portas são identificadas por um número de 16 bits (0-65535) reservada pelo aplicativo envolvido na conexão TCPou UDP.
82 |
83 | ## Exercícios
84 | Embora o Protocolo TCP tenha sido desenhado para comunicar-se através da internet, podemos utilizá-lo para comunicação entre programas rodando na mesma máquina.
85 |
86 | Vamos explorar este conceito usando a Linguagem Python. Não se procupe se você ainda não conhece a linguagem, vamos explicar o funcionamento do código.
87 |
88 | Vamos escrever dois programas um que vamos chamar de "servidor" e outro que será o "cliente".
89 |
90 | ```python
91 | #!/usr/bin/env/python
92 | # servidor_de_eco.py
93 |
94 | import socket
95 |
96 | HOST = "127.0.0.1" # endereço IP da máquina local
97 | PORT = 65432 # Porta em que vamos escutar (portas não privilegiadas > 1023).
98 |
99 | with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: # cria o Socket
100 | s.bind((HOST, PORT)) # Conecta o socket ao host e porta
101 | s.listen() # começa a escutar...
102 | conn, addr = s.accept() # Aceita a conexão
103 | with conn:
104 | print(f"Connectado por {addr}")
105 | while True:
106 | data = conn.recv(1024) # Tenta receber dados
107 | if not data:
108 | break
109 | conn.sendall(data) # Envia de volta os dados (eco)
110 | ```
111 |
112 | Agora o código do Cliente:
113 |
114 | ```python
115 | #!/usr/bin/env python
116 | # cliente_eco.py
117 |
118 | import socket
119 |
120 | HOST = "127.0.0.1" # The server's hostname or IP address
121 | PORT = 65432 # The port used by the server
122 |
123 | with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
124 | s.connect((HOST, PORT))
125 | s.sendall(b"Oi, Tudo Bem?")
126 | data = s.recv(1024)
127 |
128 | print(f"Received {data!r}")
129 | ```
130 | ### Executando o cliente e o servidor
131 | Começamos nosso teste rodando primeiro o programa servidor
132 | ```bash
133 | $ python servidor_de_eco.py
134 | ```
135 | Depois iniciamos o cliente
136 |
137 | ```bash
138 | $ python cliente_eco.py
139 | ```
--------------------------------------------------------------------------------
/conteúdo/Redes e Internet/2-FTP.md:
--------------------------------------------------------------------------------
1 | # Protocolo FTP
2 | O Protocolo FTP ou File transfer Protocol, é um protocolo desenvolvido para transferir arquivos entre um servidor e um cliente. Neste protocolo o cliente se autentica através de um usuário e uma senha, mas diverso servidores FTP també aceitam conexões anônimas.
3 |
4 | Por questões de segurança A maioria dos servidores modernos se utilizam de uma conexão SSH para encriptação dos dados sendo denominados SFTP.
5 |
6 | ## Uso básico do FTP
7 | Para começar a aprender como utilizar o FTP vamos começar utilizando o cliente de FTP que já vem instalado no Linux, o `ftp`. Para acessar um servidor FTP basta digitar o comando `ftp` seguido do endereço do servidor. Por exemplo, para acessar o servidor ftp.dca.fee.unicamp.br, basta digitar o comando `ftp geoftp.ibge.gov.br`. Após isso, o cliente irá pedir o nome de usuário e senha, e após a autenticação, o cliente irá mostrar o prompt `ftp>`, onde você pode digitar os comandos do cliente.
8 |
9 | ```bash
10 | ftp geoftp.ibge.gov.br
11 | ```
12 |
13 | No servidor do IBGE nos autenticaremos como usuário `anonymous` sem senha, e após a autenticação, podemos listar os arquivos do servidor com o comando `ls`, e para baixar um arquivo, basta digitar o comando `get` seguido do nome do arquivo. Por exemplo, para baixar os mapas do Brasil, precisamos navegar até o diretório `cartas_e_mapas/bases_cartograficas_continuas/bc250/versao2023/geopackage/`, e baixar o arquivo chamado `bc250_2023_11_23.zip`.
14 |
15 | ```bash
16 | ftp> ls
17 | ftp> cd cartas_e_mapas/bases_cartograficas_continuas/bc250/versao2023/geopackage/
18 | ftp> get bc250_2023_11_23.zip
19 | ```
20 |
21 | ## Comandos do cliente FTP
22 | O cliente FTP possui diversos comandos que podem ser utilizados para navegar e transferir arquivos entre o cliente e o servidor. Abaixo estão listados alguns dos comandos mais utilizados:
23 | 1. `ls`: Lista os arquivos do diretório atual.
24 | 2. `cd`: Navega para o diretório especificado.
25 | 3. `get`: Baixa um arquivo do servidor.
26 | 4. `put`: Envia um arquivo para o servidor.
27 | 5. `mget`: Baixa múltiplos arquivos do servidor.
28 | 6. `mput`: Envia múltiplos arquivos para o servidor.
29 | 7. `quit`: Encerra a conexão com o servidor.
30 | 8. `help`: Mostra a lista de comandos do cliente.
31 | 9. `pwd`: Mostra o diretório atual do servidor.
32 | 10. `mkdir`: Cria um diretório no servidor.
33 | 11. `rmdir`: Remove um diretório no servidor.
34 | 12. `delete`: Remove um arquivo no servidor.
35 | 13. `rename`: Renomeia um arquivo no servidor.
36 | 14. `binary`: Muda o modo de transferência para binário.
37 | 15. `ascii`: Muda o modo de transferência para ASCII.
38 | 16. `prompt`: Ativa ou desativa a confirmação de transferência de arquivos.
39 | 17. `hash`: Ativa ou desativa a exibição de um hash de progresso durante a transferência de arquivos.
40 | 18. `status`: Mostra o status da conexão com o servidor.
41 |
42 | ## Criando um servidor FTP
43 | Em sua máquina local, você pode criar um servidor FTP para compartilhar arquivos com outros dispositivos. Para isso, você pode instalar um servidor FTP como o `vsftpd` e configurá-lo para compartilhar arquivos. Para instalar o `vsftpd`, basta digitar o comando abaixo.
44 |
45 | ```bash
46 | sudo apt install vsftpd
47 | ```
48 |
49 | Após a instalação, você pode configurar o servidor editando o arquivo de configuração `/etc/vsftpd.conf`. Você pode configurar o servidor para permitir conexões anônimas, definir o diretório raiz do servidor, definir as permissões de leitura e escrita, entre outras configurações. Modifique as seguintes configurações:
50 | ```bash
51 | anonymous_enable=YES
52 | local_enable=YES
53 | write_enable=YES
54 | anon_root=/var/ftp
55 | ```
56 | Pode ser necessário criar o diretório raiz do servidor e definir as permissões corretas. Para isso, basta digitar os comandos abaixo.
57 |
58 | ```bash
59 | sudo mkdir /var/ftp
60 | sudo chown nobody:nogroup /var/ftp
61 | sudo chmod a-w /var/ftp
62 | ```
63 |
64 |
65 | Após configurar o servidor, você pode reiniciá-lo com o comando abaixo.
66 |
67 | ```bash
68 | sudo service vsftpd restart
69 | ```
70 |
71 | Para acessar o servidor, basta digitar o endereço do servidor no navegador ou em um cliente FTP, e autenticar-se com o usuário `anonymous` e senha "". Você pode transferir arquivos para o servidor utilizando um cliente FTP como o `ftp` ou o `FileZilla`.
72 |
73 | ## Exercicios
74 | 1. Utilize o cliente FTP para acessar o servidor ftp.datasus.gov.br e baixar o arquivo `dissemin/publicos/Dados_Abertos/SINAN/DIC_DADOS_CHIKUNGUNYA_fev2024.pdf` para o seu computador.
75 | 2. Usando apenas ferramentas do terminal do Linux, extraia o texto do PDF e descubra quais campos da tabela de Chikungunya estão associadas com a "Dengue".
76 |
77 | ## Referências
78 | - [FTP - Wikipedia](https://en.wikipedia.org/wiki/File_Transfer_Protocol)
79 |
80 |
81 |
--------------------------------------------------------------------------------
/conteúdo/Redes e Internet/3-SSH.md:
--------------------------------------------------------------------------------
1 | # SSH - Secure Shell
2 | O SSH ou Secure Shell é um protocolo de rede que permite a troca de dados de forma segura entre dois dispositivos. O SSH é muito utilizado para acessar servidores remotos, pois permite a execução de comandos de forma segura, e também para transferir arquivos de forma segura entre dois dispositivos.
3 |
4 | ## História
5 | O SSH foi desenvolvido por Tatu Ylönen em 1995, com o objetivo de substituir o protocolo Telnet, que era utilizado para acessar servidores remotos, mas que não era seguro, pois os dados eram transmitidos de forma não encriptada. O SSH foi desenvolvido para ser uma alternativa segura ao Telnet, e desde então, se tornou um dos protocolos mais utilizados para acessar servidores remotos.
6 |
7 | ## Conceitos Básicos
8 | ### Chave Pública e Chave Privada
9 | O SSH utiliza um par de chaves para autenticar o cliente e o servidor. O par de chaves é composto por uma chave pública e uma chave privada. A chave pública é compartilhada com o servidor, e a chave privada é mantida em segredo pelo cliente. Quando o cliente se conecta ao servidor, o servidor envia um desafio criptográfico para o cliente, que é assinado com a chave privada do cliente, e o servidor verifica a assinatura com a chave pública do cliente. Se a assinatura for válida, o servidor autentica o cliente.
10 |
11 | Para criar um par de chaves SSH, basta digitar o comando `ssh-keygen` seguido do nome do arquivo de chave. Por exemplo, para criar um par de chaves chamado `id_rsa` e `id_rsa.pub`, basta digitar o comando abaixo.
12 |
13 | ```bash
14 | ssh-keygen -t rsa -b 4096 -C "
15 | ```
16 |
17 |
18 | ### Conexão segura
19 | O SSH utiliza criptografia para garantir uma conexão segura entre o cliente e o servidor. Isso protege contra ataques de interceptação, como ataques de homem no meio, garantindo que os dados transmitidos não possam ser lidos por terceiros.
20 |
21 | ### Conexão SSH
22 | Para se conectar a um servidor remoto via SSH, basta digitar o comando `ssh` seguido do nome de usuário e do endereço do servidor.
23 |
24 | ```bash
25 | ssh localhost
26 | ```
27 |
28 | O comando acima irá se conectar ao servidor `localhost` com o usuário atual. Se o usuário for diferente, basta digitar o nome de usuário seguido do `@` e do endereço do servidor.
29 |
30 | ```bash
31 | ssh usuario@localhost
32 | ```
33 |
34 | ### Transferência de arquivos com SSH
35 | O SSH também pode ser utilizado para transferir arquivos de forma segura entre dois dispositivos. Para transferir um arquivo de um dispositivo para outro, basta digitar o comando `scp` seguido do nome do arquivo e do endereço do servidor. Por exemplo, para transferir o arquivo `arquivo.txt` para o servidor `ssh.example.com`, basta digitar o comando `scp` seguido do nome do arquivo e do endereço do servidor.
36 |
37 | ```bash
38 | scp arquivo.txt usuario@localhost:/diretorio/destino
39 | ```
40 | Para copiar um arquivo do servidor para o cliente, basta inverter a ordem dos argumentos.
41 |
42 | ```bash
43 | scp usuario@localhost:/diretorio/origem/arquivo.txt .
44 | ```
45 |
46 | ### Execução de comandos remotos
47 | O SSH também pode ser utilizado para executar comandos de forma remota em um servidor. Para executar um comando remoto, basta digitar o comando `ssh` seguido do nome de usuário e do endereço do servidor, seguido do comando que você deseja executar.
48 |
49 | ```bash
50 | ssh usuario@localhost ls
51 | ```
52 |
53 |
54 | ### Túneis SSH
55 | O SSH também pode ser utilizado para criar túneis seguros entre dois dispositivos. Isso permite que portas de um servidor sejam mapeadas para portas locais, permitindo o acesso a serviços remotos de forma segura. Para criar um túnel SSH, basta digitar o comando `ssh` seguido do argumento `-L` e das portas que você deseja mapear. Por exemplo, para mapear a porta 8000 do servidor para a porta 80 do cliente, basta digitar o comando abaixo.
56 |
57 | ```bash
58 | ssh -L 80:localhost:8000 -f -NC usuario@servidor.remoto
59 | ```
60 | a opção `-f` faz com que o ssh seja executado em segundo plano, e a opção `-N` faz com que nenhum comando seja executado no servidor remoto. A opção `-C` ativa a compressão dos dados, o que pode melhorar o desempenho em conexões lentas.
61 |
62 | O tunelamento também pode ser feito de forma reversa, mapeando portas locais para portas remotas. Para isso, basta utilizar o argumento `-R` no comando `ssh`. Por exemplo, para mapear a porta 80 do cliente para a porta 8000 do servidor, basta digitar o comando abaixo.
63 |
64 | ```bash
65 | ssh -R 8000:localhost:80 -f -NC usuario@servidor.remoto
66 | ```
67 |
68 | ## Multiplexação de terminais
69 | Quando estamos em uma conexão SSH, podemos abrir vários terminais em uma única conexão. Isso é feito através do uso de multiplexadores de terminais. Vamos usar o `byobu` como exemplo. Para instalar o `byobu`, basta digitar o comando abaixo.
70 |
71 | ```bash
72 | sudo apt install byobu
73 | ```
74 |
75 | Para iniciar o `byobu`, basta digitar o comando abaixo.
76 |
77 | ```bash
78 | byobu
79 | ```
80 |
81 | O `byobu` permite que você abra vários terminais em uma única conexão SSH, o que pode ser muito útil para gerenciar vários processos em um servidor remoto. Para criar uma nov shell no `byobu`, basta digitar `F2`. Para alternar entre as janelas, basta digitar `F3` e `F4`. Para sair do `byobu`, mantendo as sessões ativas, basta digitar`F6`. Ao reiniciar a conexão SSH, basta digitar o comando `byobu` para restaurar as sessões ativas.
82 |
83 |
--------------------------------------------------------------------------------
/conteúdo/Redes e Internet/4-HTTP.md:
--------------------------------------------------------------------------------
1 | # O Protocolo HTTP
2 | O Protocolo de Transferência de Hipertexto (HTTP) é um protocolo de comunicação utilizado para transferir informações na World Wide Web. O HTTP é a base da comunicação de dados na web, e é utilizado para transferir páginas web, imagens, vídeos, arquivos, entre outros. O HTTP é um protocolo de camada de aplicação, e é baseado no modelo cliente-servidor, onde um cliente faz uma requisição a um servidor, que responde com uma resposta.
3 |
4 | ## História do HTTP
5 | O HTTP foi desenvolvido por Tim Berners-Lee no CERN em 1989, e foi padronizado pela IETF (Internet Engineering Task Force) em 1996. O HTTP é um protocolo simples e extensível, e é baseado no modelo de requisição-resposta, onde um cliente faz uma requisição a um servidor, que responde com uma resposta. O HTTP é um protocolo sem estado, o que significa que cada requisição é independente das outras, e o servidor não mantém informações sobre requisições anteriores.
6 | ## Características do HTTP
7 | O HTTP é um protocolo de comunicação baseado em texto, e utiliza uma sintaxe simples para definir as mensagens de requisição e resposta. As mensagens HTTP são compostas por uma linha de status, um cabeçalho e um corpo. A linha de status define o status da requisição ou resposta, o cabeçalho define os metadados da mensagem, como o tipo de conteúdo, a codificação, a data, entre outros, e o corpo define o conteúdo da mensagem, como o HTML de uma página web, a imagem de um arquivo, o vídeo de um vídeo, entre outros.
8 |
9 | ## Métodos HTTP
10 | O HTTP define vários métodos para interagir com recursos na web. Os métodos mais comuns são:
11 | 1. `GET`: Obtém um recurso do servidor.
12 | 2. `POST`: Envia dados para o servidor.
13 | 3. `PUT`: Atualiza um recurso no servidor.
14 | 4. `DELETE`: Deleta um recurso no servidor.
15 | 5. `HEAD`: Obtém os cabeçalhos de um recurso.
16 | 6. `OPTIONS`: Obtém os métodos suportados por um recurso.
17 | 7. `PATCH`: Atualiza parcialmente um recurso no servidor.
18 | 8. `TRACE`: Realiza um teste de loopback no servidor.
19 | 9. `CONNECT`: Conecta-se a um servidor por meio de um proxy.
20 |
21 | ### Versões do HTTP
22 | O HTTP possui várias versões, sendo as mais comuns o HTTP/1.1 e o HTTP/2. O HTTP/1.1 é a versão mais utilizada atualmente, e é baseada em conexões TCP, onde cada requisição é feita em uma conexão separada. O HTTP/2 é uma versão mais recente do HTTP, e é baseada em conexões multiplexadas, onde várias requisições podem ser feitas em uma única conexão.
23 |
24 | O HTTP/3 é a versão mais recente do HTTP, publicada em 2022, e é baseada no protocolo QUIC, que é um protocolo de transporte baseado em UDP. O HTTP/3 é mais rápido e seguro que o HTTP/2, e é recomendado para aplicações web modernas.
25 |
26 |
27 | ## Sessão HTTP
28 | O HTTP é um protocolo sem estado, o que significa que cada requisição é independente das outras, e o servidor não mantém informações sobre requisições anteriores. Para manter o estado entre requisições, o HTTP utiliza cookies e sessões. Os cookies são pequenos arquivos de texto armazenados no navegador do cliente, e são utilizados para armazenar informações sobre o usuário, como preferências, autenticação, entre outros. As sessões são uma forma de manter o estado entre requisições, e são armazenadas no servidor. As sessões são identificadas por um ID de sessão, que é enviado para o cliente por meio de um cookie.
29 |
30 | ### Cookies
31 | Os cookies são pequenos arquivos de texto armazenados no navegador do cliente, e são utilizados para armazenar informações sobre o usuário, como preferências, autenticação, entre outros. Os cookies são enviados pelo servidor para o cliente por meio do cabeçalho `Set-Cookie`, e são enviados pelo cliente para o servidor por meio do cabeçalho `Cookie`. Os cookies são armazenados no navegador do cliente e são enviados para o servidor em cada requisição subsequente.
32 |
33 | ## Códigos de Status HTTP
34 | O HTTP define uma série de códigos de status para indicar o resultado de uma requisição. Os códigos de status são divididos em cinco classes:
35 | 1. `1xx`: Informacional - A requisição foi recebida e está sendo processada.
36 | 2. `2xx`: Sucesso - A requisição foi bem-sucedida.
37 | 3. `3xx`: Redirecionamento - A requisição foi redirecionada.
38 | 4. `4xx`: Erro do cliente - A requisição contém erros.
39 | 5. `5xx`: Erro do servidor - O servidor encontrou um erro ao processar a requisição.
40 |
41 | A tabela abaixo lista os códigos de status mais comuns:
42 |
43 | | Código | Descrição | Significado |
44 | |--------|----------------------|-----------------------------------------------------------------------------|
45 | | 200 | OK | A requisição foi bem-sucedida. |
46 | | 301 | Movido Permanentemente | O recurso foi movido permanentemente para outra URL. |
47 | | 400 | Requisição Inválida | A requisição contém erros de sintaxe. |
48 | | 401 | Não Autorizado | O cliente não está autorizado a acessar o recurso. |
49 | | 403 | Proibido | O cliente não tem permissão para acessar o recurso. |
50 | | 404 | Não Encontrado | O recurso não foi encontrado. |
51 | | 500 | Erro Interno do Servidor | O servidor encontrou um erro ao processar a requisição. |
52 | | 503 | Serviço Indisponível | O servidor não está disponível no momento. |
53 |
54 |
55 | ## Segurança no HTTP
56 | O HTTP é um protocolo de comunicação inseguro, pois as mensagens são transmitidas em texto puro, o que torna fácil para um atacante interceptar e modificar as mensagens. Para garantir a segurança das comunicações, o HTTP utiliza o protocolo HTTPS (HTTP Secure), que é uma versão segura do HTTP baseada em criptografia SSL/TLS. O HTTPS utiliza certificados digitais para autenticar os servidores e criptografar as mensagens, garantindo a confidencialidade, integridade e autenticidade das comunicações.
57 |
58 | ## Interação com o HTTP usando Python
59 | O Python possui várias bibliotecas para interagir com o HTTP, como o `requests`, que é uma biblioteca simples e fácil de usar para fazer requisições HTTP. Abaixo está um exemplo de como fazer uma requisição GET usando o `requests`:
60 |
61 | ```python
62 | import requests
63 | response = requests.get('https://www.example.com')
64 | print(response.text)
65 | ```
66 |
67 | Na biblioteca padrão do Python, temos o módulo `http.server`, que permite criar um servidor HTTP simples. Abaixo está um exemplo de como criar um servidor HTTP simples usando o `http.server`:
68 |
69 | ```python
70 | from http.server import BaseHTTPRequestHandler, HTTPServer
71 | class MyHandler(BaseHTTPRequestHandler):
72 | def do_GET(self):
73 | self.send_response(200)
74 | self.send_header('Content-type', 'text/html')
75 | self.end_headers()
76 | self.wfile.write(b'Hello, World!
')
77 | server = HTTPServer(('localhost', 8000), MyHandler)
78 | server.serve_forever()
79 | ```
80 | Nesse exemplo, criamos uma classe `MyHandler` que herda da classe `BaseHTTPRequestHandler`. A classe `MyHandler` define o método `do_GET`, que é chamado quando uma requisição GET é feita para o servidor. O método `do_GET` envia uma resposta HTTP 200 OK, define o cabeçalho `Content-type` como `text/html`, e escreve o conteúdo da página HTML no arquivo `wfile`.
81 |
82 | Para acessar o servidor, basta rodar o seguinte código cliente:
83 |
84 | ```python
85 | import requests
86 | response = requests.get('http://localhost:8000')
87 | print(response.text)
88 | ```
89 |
90 | Se você estiver executando este servidor web em um terminal remoto, você poder acessá-lo através de um navegador de terminal, como o lynx, por exemplo:
91 |
92 | ```bash
93 | lynx http://localhost:8080
94 | ```
95 |
--------------------------------------------------------------------------------
/conteúdo/Redes e Internet/5-HTML.md:
--------------------------------------------------------------------------------
1 | # Aprendendo a programar em HTML
2 |
3 | ## Introdução
4 | O HTML (HyperText Markup Language) é uma linguagem de marcação utilizada para criar páginas web. O HTML é a base de todas as páginas web, e é utilizado para definir a estrutura e o conteúdo de uma página web. O HTML é composto por uma série de elementos, que são utilizados para definir o conteúdo da página, como títulos, parágrafos, imagens, links, entre outros.
5 |
6 | ## Estrutura de um documento HTML
7 | Um documento HTML é composto por uma série de elementos, que são utilizados para definir a estrutura e o conteúdo da página. Um documento HTML é composto por uma série de elementos, que são utilizados para definir a estrutura e o conteúdo da página. Abaixo está um exemplo de um documento HTML básico.
8 |
9 | ```html
10 |
11 |
12 |
13 | Título da Página
14 |
15 |
16 | Título da Página
17 | Este é um parágrafo.
18 |
19 |
20 | ```
21 |
22 | Vá no [editor online](https://www.w3schools.com/html/html_editor.asp) e digite o código acima. Clique em "Run" para visualizar o resultado.
23 |
24 | ### Elementos HTML Mais Comuns
25 | Abaixo estão listados alguns dos elementos HTML mais comuns, que são utilizados para definir o conteúdo de uma página web.
26 | 1. ``: Define o tipo de documento HTML.
27 | 2. ``: Define o elemento raiz do documento HTML.
28 | 3. ``: Define o cabeçalho do documento HTML.
29 | 4. ``: Define o título da página.
30 | 5. ``: Define o corpo do documento HTML.
31 | 6. ``, ``, ``, ``, ``, ``: Define os títulos da página.
32 | 7. `
`: Define um parágrafo.
33 | 8. ``: Define um link.
34 | 9. `
`: Define uma imagem.
35 | 10. ``, ``, `- `: Define listas não ordenadas e ordenadas.
36 | 11. `
`, ``, ``, ` | `: Define uma tabela.
37 | 12. ` |