├── .gitignore ├── .idea ├── .gitignore ├── inspectionProfiles │ └── profiles_settings.xml ├── introcomp.iml ├── misc.xml ├── modules.xml └── vcs.xml ├── Aulas ├── Semana 1 │ ├── 7e745dc7462607ec80954497f2f14ddb6ff498 │ ├── Aula 1.md │ ├── Aula 2.md │ ├── Aula 3.md │ └── first_basic_prog.bas ├── Semana 2 │ ├── Aula 1.md │ ├── Aula 2.md │ └── Aula 3.md ├── Semana 3 │ ├── Aula 1.md │ ├── Aula 2.md │ └── Aula 3.md ├── Semana 4 │ ├── Aula 1.md │ ├── Aula 2.md │ └── Aula 3.md ├── Semana 5 │ ├── Aula 1.md │ ├── Aula 2.md │ └── Aula 3.md ├── Semana 6 │ ├── Aula 1.md │ └── Aula 2.md └── Semana 7 │ ├── Aula 1.md │ ├── Aula 2.md │ └── Aula 3.md ├── Introdução a redes e internet.docx ├── LICENSE ├── O_cortico.txt ├── README.md ├── conta_ocorrencias.sh ├── conteúdo ├── Hardware e Software │ ├── 1-hardware.md │ ├── 1-hardware.md.orig │ ├── 2-software.md │ ├── 2-software.md.orig │ ├── 3-Analógico vs Digital.md │ ├── 4-Computação_analogica.md │ ├── 4-Computação_analogica.md.orig │ ├── 5-Bases_Numericas.md │ └── 5-Bases_Numericas.md.orig ├── Introdução à programação │ ├── Bash_shell.md │ ├── LaTeX │ │ └── 1-Instalando_Latex.md │ ├── Lei de Moore.ipynb │ ├── Projeto1.md │ ├── Python │ │ ├── Collections e Itertools.ipynb │ │ ├── Game of Life.ipynb │ │ ├── Game of Life.ipynb.orig │ │ ├── Lista2.md │ │ ├── Lista3.md │ │ ├── Lista4.md │ │ ├── Lista5.md │ │ ├── Palindromes.ipynb │ │ ├── Projeto_1_rascunho.ipynb │ │ ├── elevador.py │ │ ├── elevador_report.ipynb │ │ ├── funcoes.py │ │ ├── gui.py │ │ ├── lecsv.py │ │ ├── lecsvgen.py │ │ ├── lista 4.ipynb │ │ ├── modulo.py │ │ ├── pyproject.toml │ │ ├── romanos.py │ │ ├── romanos_to_ar.py │ │ ├── test_romanos.py │ │ └── test_romanos_to_ar.py │ ├── basic.md │ ├── dados.csv │ ├── datas │ ├── gui.py │ └── lista1.md ├── Redes e Internet │ ├── 1-TCP-IP.md │ ├── 2-FTP.md │ ├── 3-SSH.md │ ├── 4-HTTP.md │ ├── 5-HTML.md │ ├── Lista 4.md │ ├── Lista 5.md │ ├── Respostas-Lista-4.md │ ├── Respostas-Lista-5.md │ ├── client_http.py │ ├── cliente_eco.py │ ├── server.py │ └── servidor_de_eco.py ├── Sistemas Operacionais │ ├── 1-unix.md │ ├── 1-unix.md.orig │ ├── 2-linux.md │ └── 2-linux.md.orig └── Usando o Terminal │ ├── 1-shell_Linux.md │ ├── 1.text │ ├── 2-terminal_windows.md │ ├── 2.text │ ├── 3-GREP.md │ ├── 3.text │ ├── Lista_2.md │ ├── Respostas_da_Lista2.md │ ├── Respostas_da_Lista_1.md │ ├── dados.csv │ ├── lista_1.md │ ├── ls.png │ ├── man.png │ ├── permissions.png │ ├── prompt.png │ └── pwd.png ├── ocorrencias.txt ├── palavras_antigas.txt ├── perguntas_python.md ├── perguntas_python2.md ├── tutorial.sh └── vocabulario.txt /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | 131 | .idea/ 132 | /Trabalhos/ 133 | /trabalho A1 2024/ 134 | Provas 135 | /tmp/ 136 | 137 | /Admin/ 138 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # GitHub Copilot persisted chat sessions 5 | /copilot/chatSessions 6 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /.idea/introcomp.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 13 | 14 | 16 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /Aulas/Semana 1/7e745dc7462607ec80954497f2f14ddb6ff498: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fccoelho/introcomp/cd8ce1dab8a529d07d4ab98a8c66302b1d345f85/Aulas/Semana 1/7e745dc7462607ec80954497f2f14ddb6ff498 -------------------------------------------------------------------------------- /Aulas/Semana 1/Aula 1.md: -------------------------------------------------------------------------------- 1 | # Plano da Aula 1 2 | 3 | 1. Significado original do termo computação: automatização de operações aritméticas. Discussão da parte 1 e 2 do documentário da BBC. 4 | 2. Apresentação das ferramentas a ser utilizadas no curso: Github, Eclass, Floss EMAp Discord server. 5 | 3. Conceitos de Hardware e Sofware. -------------------------------------------------------------------------------- /Aulas/Semana 1/Aula 2.md: -------------------------------------------------------------------------------- 1 | # Plano da Aula 2 2 | 3 | 1. Discussão do vídeo "Who invented Computers" e da relevância de patentes. 4 | 2. História dos [computadores pessoais](https://en.wikipedia.org/wiki/Personal_computer). 5 | 3. [Basic interpreter](https://en.wikipedia.org/wiki/Yabasic), fita-magnética, diskettes. 6 | 4. Introdução ao Git -------------------------------------------------------------------------------- /Aulas/Semana 1/Aula 3.md: -------------------------------------------------------------------------------- 1 | # Plano da Aula 3 2 | 3 | 1. Primeiros Sistemas operacionais de computadores pessoais. 4 | 2. DOS - [DOSBOX](https://www.dosbox.com) 5 | 3. desafio: conseguir rodar um [jogo](https://www.dosgamesarchive.com/license/shareware) da década de 1980 no DOSbox. -------------------------------------------------------------------------------- /Aulas/Semana 1/first_basic_prog.bas: -------------------------------------------------------------------------------- 1 | #!/usr/bin/yabasic 2 | 3 | REM Program Name: cbm-mtudemo.yab 4 | REM Author: mtu 5 | REM 6 | REM Purpose: demonstration for their CBM-PET graphics card 320x200 7 | 8 | open window 320, 200 9 | 10 | 20 P=160: Q=100 11 | 30 XP=144: XR=1.5*3.1415927 12 | 40 YP=56: YR=1: ZP=64 13 | 50 XF=XR/XP: YF=YP/YR: ZF=XR/ZP 14 | 60 FOR ZI=-Q TO Q-l 15 | 70 IF ZI<-ZP OR ZI>ZP GOTO 150 16 | 80 ZT=ZI*XP/ZP: ZZ=ZI 17 | 90 XL=INT(0.5+SQRT(XP*XP-ZT*ZT)) 18 | 100 FOR XI=-XL TO XL 19 | 110 XT=SQRT(XI*XI+ZT*ZT)*XF: XX=XI 20 | 120 YY=(SIN(XT)+0.4*SIN(3.0*XT))*YF 21 | 130 GOSUB 170 22 | 140 NEXT XI 23 | 150 NEXT ZI 24 | 160 PAUSE 10 25 | END 26 | 170 X1=XX+ZZ+P 27 | 180 Y1=YY-ZZ+Q:Y1=199-Y1 28 | 190 LINE X1,Y1,X1,Y1-1 29 | 200 IF Y1=0 GOTO 220 30 | 210 CLEAR LINE X1,Y1+1,X1,199 31 | 220 RETURN -------------------------------------------------------------------------------- /Aulas/Semana 2/Aula 1.md: -------------------------------------------------------------------------------- 1 | 1. Sistemas operacionais 2 | 2. Software. 3 | -------------------------------------------------------------------------------- /Aulas/Semana 2/Aula 2.md: -------------------------------------------------------------------------------- 1 | 1. Sistemas operacionais (continuação) 2 | 3 | -------------------------------------------------------------------------------- /Aulas/Semana 2/Aula 3.md: -------------------------------------------------------------------------------- 1 | 1. Experimentando SOs por meio de máquinas virtuais 2 | 2. Ubuntu Linux 3 | 2. Introdução ao terminal Linux -------------------------------------------------------------------------------- /Aulas/Semana 3/Aula 1.md: -------------------------------------------------------------------------------- 1 | 1. Introdução linguagens de programação - visão geral 2 | 2. Linguagens de scripting -------------------------------------------------------------------------------- /Aulas/Semana 3/Aula 2.md: -------------------------------------------------------------------------------- 1 | 1. Linguagem shell (bash) 2 | 3 | 4 | -------------------------------------------------------------------------------- /Aulas/Semana 3/Aula 3.md: -------------------------------------------------------------------------------- 1 | 1. GREP 2 | 2. Programação não estruturada. Exemplos com [Basic](https://pt.wikipedia.org/wiki/BASIC) ([yabasic](https://2484.de/yabasic/yabasic.htm)) 3 | -------------------------------------------------------------------------------- /Aulas/Semana 4/Aula 1.md: -------------------------------------------------------------------------------- 1 | 1. Introdução ao GIT 2 | 2. Introdução ao GitHub 3 | -------------------------------------------------------------------------------- /Aulas/Semana 4/Aula 2.md: -------------------------------------------------------------------------------- 1 | 1. Redes TCP/IP 2 | -------------------------------------------------------------------------------- /Aulas/Semana 4/Aula 3.md: -------------------------------------------------------------------------------- 1 | 1. Redes (continuação) 2 | 2. Http: [Hypertext Transfer Protocol](https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol) -------------------------------------------------------------------------------- /Aulas/Semana 5/Aula 1.md: -------------------------------------------------------------------------------- 1 | 1. HTML -------------------------------------------------------------------------------- /Aulas/Semana 5/Aula 2.md: -------------------------------------------------------------------------------- 1 | 1. FTP e SSH -------------------------------------------------------------------------------- /Aulas/Semana 5/Aula 3.md: -------------------------------------------------------------------------------- 1 | 1. Introdução ao TEX/LaTeX -------------------------------------------------------------------------------- /Aulas/Semana 6/Aula 1.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fccoelho/introcomp/cd8ce1dab8a529d07d4ab98a8c66302b1d345f85/Aulas/Semana 6/Aula 1.md -------------------------------------------------------------------------------- /Aulas/Semana 6/Aula 2.md: -------------------------------------------------------------------------------- 1 | # Convertendo de Analógico para Digital 2 | Sinais analógicos são sinais que variam continuamente no tempo. Sinais digitais são sinais que variam discretamente no tempo. A conversão de um sinal analógico para um sinal digital é chamada de conversão analógico-digital (A/D). A conversão de um sinal digital para um sinal analógico é chamada de conversão digital-analógico (D/A). 3 | 4 | ## Conversão A/D 5 | A conversão A/D é realizada em três etapas: amostragem, quantização e codificação. 6 | 7 | ### Amostragem 8 | A amostragem é o processo de capturar o valor do sinal analógico em intervalos regulares de tempo. O teorema de Nyquist estabelece que a taxa de amostragem deve ser pelo menos o dobro da maior frequência presente no sinal analógico. Caso contrário, ocorre o fenômeno de aliasing, que distorce o sinal digitalizado. 9 | 10 | #### Teorema de Nyquist 11 | O teorema de Nyquist estabelece que a taxa de amostragem deve ser pelo menos o dobro da maior frequência presente no sinal analógico. Caso contrário, ocorre o fenômeno de aliasing, que distorce o sinal digitalizado. 12 | 13 | 14 | #### Exemplo 15 | Considere um sinal analógico com frequência máxima de 4 kHz. A taxa de amostragem mínima para evitar o aliasing é de 8 kHz. 16 | 17 | ```python 18 | import numpy as np 19 | import matplotlib.pyplot as plt 20 | fs = 8000 21 | t = np.arange(0, 1, 1/fs) 22 | x = np.sin(2*np.pi*4000*t) 23 | plt.plot(t, x) 24 | plt.xlabel('Tempo (s)') 25 | plt.ylabel('Amplitude') 26 | plt.title('Sinal analógico') 27 | plt.show() 28 | ``` 29 | 30 | 31 | ### Quantização 32 | 33 | A quantização é o processo de mapear os valores amostrados para um conjunto finito de valores discretos. A resolução da quantização é o número de bits utilizados para representar cada amostra. Quanto maior a resolução, maior a fidelidade da representação digital em relação ao sinal analógico. 34 | 35 | #### Exemplo 36 | Considere um sinal analógico com amplitude máxima de 5 V. A resolução da quantização é de 4 bits. O intervalo de quantização é de 5 V / 2^4 = 0.3125 V. 37 | 38 | ```python 39 | import numpy as np 40 | import matplotlib.pyplot as plt 41 | fs = 8000 42 | amplitude = 5 43 | bits = 4 44 | resolucao = amplitude / (2**bits) 45 | t = np.arange(0, 1, 1/fs) 46 | x = amplitude*np.sin(2*np.pi*3800*t) 47 | xq = (np.floor(x/resolucao))*resolucao 48 | plt.plot(t, x, label='Sinal analógico') 49 | plt.stem(t, xq, linefmt='r-', markerfmt='ro', basefmt='r-', label='Sinal quantizado') 50 | plt.xlabel('Tempo (s)') 51 | plt.ylabel('Amplitude') 52 | plt.legend() 53 | plt.show() 54 | ``` 55 | 56 | ### Codificação 57 | A codificação é o processo de representar os valores quantizados em formato digital. A codificação mais comum é a codificação binária, que utiliza apenas dois níveis de tensão para representar os valores quantizados. 58 | 59 | #### Exemplo 60 | Considere um sinal quantizado com resolução de 8 bits. A codificação binária utiliza 8 bits para representar cada amostra. 61 | 62 | ```python 63 | import numpy as np 64 | import matplotlib.pyplot as plt 65 | fs = 8000 66 | t = np.arange(0, 1, 1/fs) 67 | x = 5*np.sin(2*np.pi*3500*t) 68 | xq = np.round(x/0.01953)*0.01953 69 | xb = np.unpackbits(xq.astype(np.uint8)) 70 | plt.stem(xb, linefmt='r-', markerfmt='r*', basefmt='r-') 71 | plt.xlabel('Tempo (s)') 72 | plt.ylabel('Amample') 73 | plt.title('Sinal codificado') 74 | plt.show() 75 | ``` 76 | ## Conversão D/A 77 | A conversão D/A é realizada em duas etapas: decodificação e reconstrução. 78 | ### Decodificação 79 | A decodificação é o processo de converter os valores codificados em valores quantizados. 80 | #### Exemplo 81 | Considere um sinal codificado com resolução de 8 bits. A decodificação é realizada convertendo os valores binários para valores quantizados. 82 | 83 | ```python 84 | import numpy as np 85 | import matplotlib.pyplot as plt 86 | fs = 8000 87 | t = np.arange(0, 1, 1/fs) 88 | x = 5*np.sin(2*np.pi*4000*t) 89 | xq = np.round(x/0.01953)*0.01953 90 | xb = np.unpackbits(xq.astype(np.uint8)) 91 | xq = xb*0.01953 92 | plt.stem(t, xq, linefmt='r-', markerfmt='ro', basefmt='r-') 93 | plt.xlabel('Tempo (s)') 94 | plt.ylabel('Amplitude') 95 | plt.title('Sinal quantizado') 96 | plt.show() 97 | ``` 98 | ### Reconstrução 99 | A reconstrução é o processo de converter os valores quantizados em um sinal analógico. 100 | #### Exemplo 101 | Considere um sinal quantizado com resolução de 8 bits. A reconstrução é realizada convertendo os valores quantizados para valores analógicos. 102 | 103 | ```python 104 | import numpy as np 105 | import matplotlib.pyplot as plt 106 | fs = 8000 107 | t = np.arange(0, 1, 1/fs) 108 | x = 5*np.sin(2*np.pi*4000*t) 109 | xq = np.round(x/0.01953)*0.01953 110 | plt.plot(t, xq) 111 | plt.xlabel('Tempo (s)') 112 | plt.ylabel('Amplitude') 113 | plt.title('Sinal reconstruído') 114 | plt.show() 115 | ``` 116 | 117 | -------------------------------------------------------------------------------- /Aulas/Semana 7/Aula 1.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fccoelho/introcomp/cd8ce1dab8a529d07d4ab98a8c66302b1d345f85/Aulas/Semana 7/Aula 1.md -------------------------------------------------------------------------------- /Aulas/Semana 7/Aula 2.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fccoelho/introcomp/cd8ce1dab8a529d07d4ab98a8c66302b1d345f85/Aulas/Semana 7/Aula 2.md -------------------------------------------------------------------------------- /Aulas/Semana 7/Aula 3.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fccoelho/introcomp/cd8ce1dab8a529d07d4ab98a8c66302b1d345f85/Aulas/Semana 7/Aula 3.md -------------------------------------------------------------------------------- /Introdução a redes e internet.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fccoelho/introcomp/cd8ce1dab8a529d07d4ab98a8c66302b1d345f85/Introdução a redes e internet.docx -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Flávio Codeço Coelho 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Introdução à Computação 2 | Curso de introdução à computação da EMAp-FGV 3 | 4 | 5 | ## Programa 6 | 7 | 1. Hardware e Software - 8 | 2. História dos computadores - introdução à evolução da arquitetura de de hardware dos computadores e do software. Discussão destes documentários. 9 | 1. [History of Computers (BBC)](https://www.youtube.com/watch?v=6dME3wgaQpM&list=PL1331A4548513EA81) 10 | 2. [Who Invented the Computer?](https://www.youtube.com/watch?v=d1pvc9Zh7Tg) 11 | 3. História do Software - Introdução à história do Software. Discussão deste documentário: 12 | 1. [História do Software](https://www.youtube.com/watch?v=OdI7Ukf-Bf4) 13 | 4. Sistemas Operacionais - Introdução ao conceito do que é um sistema operacional. Discussão do documentário: 14 | 1. [History of UNIX](https://www.youtube.com/watch?v=tc4ROCJYbm0&t=3s) (Opcional) 15 | 2. [Revolution OS](https://www.youtube.com/watch?v=k0RYQVkQmWU) 16 | 3. O terminal. Usando o terminal no [Linux](https://ubuntu.com/tutorials/command-line-for-beginners#1-overview) e no [Windows](https://learn.microsoft.com/en-us/windows/terminal/) 17 | 4. [Linguagem Shell](https://pt.wikipedia.org/wiki/Shell_script) - introdução à programação usando shell no Linux. 18 | 5. Redes e Internet 19 | 1. [TCP](https://en.wikipedia.org/wiki/Transmission_Control_Protocol) e [UDP](https://en.wikipedia.org/wiki/Transmission_Control_Protocol) e IP os protocolos da Internet. 20 | 2. [FTP](https://en.wikipedia.org/wiki/File_Transfer_Protocol) - Protocolo de transferência de arquivos. 21 | 3. [Bluetooth](https://en.wikipedia.org/wiki/Bluetooth) 22 | 4. [SSH](https://en.wikipedia.org/wiki/Secure_Shell) - Secure Shell Protocol. 23 | 5. Redes [P2P](https://en.wikipedia.org/wiki/Peer-to-peer) arquivos distribuídos. 24 | 6. Informação Analógica vs Digital - Conceitos básicos, princípios de [ADC](https://en.wikipedia.org/wiki/Analog-to-digital_converter) e [DAC](https://en.wikipedia.org/wiki/Digital-to-analog_converter) 25 | 7. [Bases numéricas](https://www.trccompsci.online/mediawiki/index.php/Number_Systems_/_Number_Bases) - Bases numericas e seu papel na [computação](https://en.wikipedia.org/wiki/Computer_number_format). 26 | 8. Linguagem de máquina e Assembly. Introdução conceitual ao que é linguagem de máquina e a linguagem assembly, com exemplos. 27 | 9. LaTeX - introdução à edição de textos com LaTeX 28 | 10. Fazendo Apresentações com LaTeX - o pacote [Beamer](https://ctan.org/pkg/beamer) 29 | 13. Introdução à programação com Python. 30 | 14. Introdução à Computação Científica. 31 | -------------------------------------------------------------------------------- /conta_ocorrencias.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | for i in $(sort palavras_antigas.txt| uniq -i); do 4 | echo "$i $(grep -ic $i O_cortico.txt)" >> ocorrencias.txt 5 | done 6 | -------------------------------------------------------------------------------- /conteúdo/Hardware e Software/1-hardware.md: -------------------------------------------------------------------------------- 1 | # Hardware 2 | No contexto da computação, a palavra `hardware` se refere aos componentes físicos de um computador, mais especificamente aos componentes que estão diretamente ligados às execução de tarefas computacionais, ou seja, não se refere a 🔩 parafusos e porcas. 3 | 4 | ![computador pessoal](https://upload.wikimedia.org/wikipedia/commons/thumb/4/4e/Personal_computer%2C_exploded_6.svg/1920px-Personal_computer%2C_exploded_6.svg.png) 5 | 6 | ## Principais Componentes 7 | Assumindo uma arquitetura típica de um computador pessoal atual (2023), podemos encontrar os principais componentes de um computador pessoal conectados por meio de uma placa mãe: 8 | ![placa-mae](https://upload.wikimedia.org/wikipedia/commons/b/b7/Computer-motherboard.jpg) 9 | 10 | Na placa-mãe podemos encontrar, o processador, ou CPU, o [chipset](https://en.wikipedia.org/wiki/Chipset), a [memória ou RAM](https://en.wikipedia.org/wiki/Random-access_memory), a [BIOS](https://en.wikipedia.org/wiki/BIOS) (ROM, CMOS), slots para placas de extensão, e diverss outros componentes menos fáceis de identificar para o usuário menos familiarizados como controladores de armazenamento, dispositivos de entrada e saída (I/O), etc. A [placa de vídeo](https://en.wikipedia.org/wiki/Video_card), ou placa gráfica, é frequentemente integrada à placa-mãe em computadores que não exigem muito desempenho gráfico, mas também podem ser "discreta", ou seja, adicionadas como uma placa de extensão contendo uma [GPU (graphics processing unit)](https://en.wikipedia.org/wiki/Graphics_processing_unit). 11 | 12 | ## Arquiterura de Von Neumann 13 | A [arquitetura de Von Neumann](https://en.wikipedia.org/wiki/Von_Neumann_architecture) é um modelo de computador que foi proposto por John von Neumann em 1945. Este modelo é baseado em três princípios fundamentais: 14 | 1. **Unidade de processamento**: A unidade de processamento é responsável por executar as instruções do programa, realizar operações aritméticas e lógicas, e controlar o fluxo de dados no computador. 15 | 2. **Memória**: A memória é utilizada para armazenar dados e instruções do programa. Ela é dividida em duas partes: a memória principal, que é utilizada para armazenar dados temporários e instruções do programa, e a memória secundária, que é utilizada para armazenar dados de forma permanente. 16 | 3. **Unidade de controle**: A unidade de controle é responsável por coordenar as operações do computador, controlar o fluxo de dados entre a unidade de processamento e a memória, e executar as instruções do programa. 17 | 18 | 19 | 20 | ## Exercícios 21 | 22 | 1. Descubra, usando ferramentas do Sistema operacional do seu computador, os seguintes parâmetros. 23 | 1. Qual o Modelo da CPU? 24 | 2. Qual Clock da CPU? 25 | 3. Quantos Cores possui a sua CPU? 26 | 4. Qual O tamanho da emória RAM em Bytes e em GBytes? 27 | 5. Que tipo de unidade de Armazenamento de dados ele possui e qual a sua capacidade em GB? 28 | 2. Liste todos os tipos de I/O de que o seu computador é capaz. 29 | 3. Que componentes do seu computador podem ser substituídos (melhorados)? 30 | 4. Quais componentes do seu computador você consegue identificar em seu telefone celular? Tente responder os ítens do exercício 1 para o celular. 31 | 32 | 33 | # Referências 34 | 35 | - Dissecando o computador: [How does Computer Hardware Work?](https://youtu.be/d86ws7mQYIg?si=EgLe4Ms8qiChGEE3) 36 | - funcionameto da Memória RAM: [How does Computer Memory Work?](https://youtu.be/7J7X7aZvMXQ?si=q070Dz2wGTPZpYYk) 37 | - funcionamento da CPU: [How does a CPU work?](https://youtu.be/42KTvGYQYn0?si=3z3z3z3z3z3z3z3z) -------------------------------------------------------------------------------- /conteúdo/Hardware e Software/1-hardware.md.orig: -------------------------------------------------------------------------------- 1 | # Hardware 2 | No contexto da computação, a palavra `hardware` se refere aos componentes físicos de um computador, mais especificamente aos componentes que estão diretamente ligados às execução de tarefas computacionais, ou seja, não se refere a 🔩 parafusos e porcas. 3 | 4 | ![computador pessoal](https://upload.wikimedia.org/wikipedia/commons/thumb/4/4e/Personal_computer%2C_exploded_6.svg/1920px-Personal_computer%2C_exploded_6.svg.png) 5 | 6 | ## Principais Componentes 7 | Assumindo uma arquitetura típica de um computador pessoal atual (2023), podemos encontrar os principais componentes de um computador pessoal conectados por meio de uma placa mãe: 8 | ![placa-mae](https://upload.wikimedia.org/wikipedia/commons/b/b7/Computer-motherboard.jpg) 9 | 10 | Na placa-mãe podemos encontrar, o processador, ou CPU, o [chipset](https://en.wikipedia.org/wiki/Chipset), a [memória ou RAM](https://en.wikipedia.org/wiki/Random-access_memory), a [BIOS](https://en.wikipedia.org/wiki/BIOS) (ROM, CMOS), slots para placas de extensão, e diverss outros componentes menos fáceis de identificar para o usuário menos familiarizados como controladores de armazenamento, dispositivos de entrada e saída (I/O), etc. A [placa de vídeo](https://en.wikipedia.org/wiki/Video_card), ou placa gráfica, é frequentemente integrada à placa-mãe em computadores que não exigem muito desempenho gráfico, mas também podem ser "discreta", ou seja, adicionadas como uma placa de extensão contendo uma [GPU (graphics processing unit)](https://en.wikipedia.org/wiki/Graphics_processing_unit). 11 | 12 | ## Arquiterura de Von Neumann 13 | A [arquitetura de Von Neumann](https://en.wikipedia.org/wiki/Von_Neumann_architecture) é um modelo de computador que foi proposto por John von Neumann em 1945. Este modelo é baseado em três princípios fundamentais: 14 | 1. **Unidade de processamento**: A unidade de processamento é responsável por executar as instruções do programa, realizar operações aritméticas e lógicas, e controlar o fluxo de dados no computador. 15 | 2. **Memória**: A memória é utilizada para armazenar dados e instruções do programa. Ela é dividida em duas partes: a memória principal, que é utilizada para armazenar dados temporários e instruções do programa, e a memória secundária, que é utilizada para armazenar dados de forma permanente. 16 | 3. **Unidade de controle**: A unidade de controle é responsável por coordenar as operações do computador, controlar o fluxo de dados entre a unidade de processamento e a memória, e executar as instruções do programa. 17 | 18 | 19 | 20 | ## Exercícios 21 | 22 | 1. Descubra, usando ferramentas do Sistema operacional do seu computador, os seguintes parâmetros. 23 | 1. Qual o Modelo da CPU? 24 | 2. Qual Clock da CPU? 25 | 3. Quantos Cores possui a sua CPU? 26 | 4. Qual O tamanho da emória RAM em Bytes e em GBytes? 27 | 5. Que tipo de unidade de Armazenamento de dados ele possui e qual a sua capacidade em GB? 28 | 2. Liste todos os tipos de I/O de que o seu computador é capaz. 29 | 3. Que componentes do seu computador podem ser substituídos (melhorados)? 30 | 4. Quais componentes do seu computador você consegue identificar em seu telefone celular? Tente responder os ítens do exercício 1 para o celular. 31 | 32 | 33 | # Referências 34 | 35 | - Dissecando o computador: [How does Computer Hardware Work?](https://youtu.be/d86ws7mQYIg?si=EgLe4Ms8qiChGEE3) 36 | - funcionameto da Memória RAM: [How does Computer Memory Work?](https://youtu.be/7J7X7aZvMXQ?si=q070Dz2wGTPZpYYk) 37 | - funcionamento da CPU: [How does a CPU work?](https://youtu.be/42KTvGYQYn0?si=3z3z3z3z3z3z3z3z) -------------------------------------------------------------------------------- /conteúdo/Hardware e Software/2-software.md: -------------------------------------------------------------------------------- 1 | # Software 2 | Software é definido como um conjunto que inclui [programas de computador](https://en.wikipedia.org/wiki/Computer_program), sua documentação e seus dados. 3 | 4 | ## Tipos 5 | Softwares podem ser categorizados em diferentes tipos: 6 | 7 | 1. Softwares de Sistema 8 | 1. Bios 9 | 2. Sistemas Operacionais 10 | 3. Drivers 11 | 4. Utilitários 12 | 2. Aplicativos 13 | 3. Programas de Usuários 14 | 15 | ![Software stack](https://upload.wikimedia.org/wikipedia/commons/thumb/8/87/Operating_system_placement_%28software%29.svg/800px-Operating_system_placement_%28software%29.svg.png) 16 | 17 | Podemos acrescentar à lista acima a categoria de [Malware](https://en.wikipedia.org/wiki/Malicious_software). Que são software projetados para fins maliciosos. Mas estes não serão objeto de estudo do nosso curso. 18 | 19 | ## Domínio de Execução 20 | 21 | O softwares podem ser qualificados em domínios de execução, ou seja qual ambiente é necessário para a sua execução: 22 | 23 | 1. O Browser: a [Linguagem javascript](https://www.destroyallsoftware.com/talks/the-birth-and-death-of-javascript) foi criada para criar softwares para ser executado dentro do browser. 24 | 2. [Aplicações Web](https://en.wikipedia.org/wiki/Web_application) 25 | 3. [Software embarcado](https://en.wikipedia.org/wiki/Embedded_software) 26 | 4. [Aplicações para Desktop](https://en.wikipedia.org/wiki/Desktop_application) 27 | 28 | -------------------------------------------------------------------------------- /conteúdo/Hardware e Software/2-software.md.orig: -------------------------------------------------------------------------------- 1 | # Software 2 | Software é definido como um conjunto que inclui [programas de computador](https://en.wikipedia.org/wiki/Computer_program), sua documentação e seus dados. 3 | 4 | ## Tipos 5 | Softwares podem ser categorizados em diferentes tipos: 6 | 7 | 1. Softwares de Sistema 8 | 1. Bios 9 | 2. Sistemas Operacionais 10 | 3. Drivers 11 | 4. Utilitários 12 | 2. Aplicativos 13 | 3. Programas de Usuários 14 | 15 | ![Software stack](https://upload.wikimedia.org/wikipedia/commons/thumb/8/87/Operating_system_placement_%28software%29.svg/800px-Operating_system_placement_%28software%29.svg.png) 16 | 17 | Podemos acrescentar à lista acima a categoria de [Malware](https://en.wikipedia.org/wiki/Malicious_software). Que são software projetados para fins maliciosos. Mas estes não serão objeto de estudo do nosso curso. 18 | 19 | ## Domínio de Execução 20 | 21 | O softwares podem ser qualificados em domínios de execução, ou seja qual ambiente é necessário para a sua execução: 22 | 23 | 1. O Browser: a [Linguagem javascript](https://www.destroyallsoftware.com/talks/the-birth-and-death-of-javascript) foi criada para criar softwares para ser executado dentro do browser. 24 | 2. [Aplicações Web](https://en.wikipedia.org/wiki/Web_application) 25 | 3. [Software embarcado](https://en.wikipedia.org/wiki/Embedded_software) 26 | 4. [Aplicações para Desktop](https://en.wikipedia.org/wiki/Desktop_application) 27 | 28 | -------------------------------------------------------------------------------- /conteúdo/Hardware e Software/3-Analógico vs Digital.md: -------------------------------------------------------------------------------- 1 | # Informação Analógica vs Digital 2 | Os computadores digitais, o tipo mais comum usado atualmente, são máquinas que operam com informações digitais, ou seja, com valores discretos, enquanto os computadores analógicos operam com informações analógicas, ou seja, com valores contínuos. A diferença entre informação analógica e digital é fundamental para entender como os computadores funcionam e como eles processam informações. 3 | ## Convertendo entre analógico e Digital 4 | A conversão de sinais analógicos para digitais e vice-versa é um processo fundamental em muitas aplicações de computação e eletrônica. A conversão de sinais analógicos para digitais é feita por um conversor analógico-digital (ADC), que mede a amplitude do sinal analógico em intervalos regulares e converte esses valores em números digitais. A conversão de sinais digitais para analógicos é feita por um conversor digital-analógico (DAC), que converte números digitais em sinais analógicos correspondentes. Esta conversão é conhecida como 5 | [ADC](https://en.wikipedia.org/wiki/Analog-to-digital_converter) 6 | 7 | A conversão inversa, chamada [DAC](https://en.wikipedia.org/wiki/Digital-to-analog_converter), é feita por um conversor digital-analógico (DAC), que converte números digitais em sinais analógicos correspondentes. Esta conversão requer a interpolação dos valores digitais para produzir um sinal analógico suave e contínuo. -------------------------------------------------------------------------------- /conteúdo/Hardware e Software/4-Computação_analogica.md: -------------------------------------------------------------------------------- 1 | # Computação analógica 2 | A computação analógica, ou computação contínua, é um tipo de computação que utiliza variáveis contínuas para representar dados e realizar operações. A computação digital, por outro lado, utiliza variáveis discretas, ou seja, valores que podem ser representados por um conjunto finito de valores. 3 | 4 | Historicamente, a computação analógica foi a primeira forma de computação utilizada. A computação digital só se tornou viável com o advento dos computadores eletrônicos, que são capazes de representar e manipular dados em forma de sinais elétricos digitais. 5 | 6 | Atualmente, a computação analógica é utilizada em algumas aplicações específicas, como processamento de sinais, controle de sistemas físicos e simulações de fenômenos naturais. No entanto, a computação digital é muito mais comum e amplamente utilizada em todos os tipos de dispositivos eletrônicos, desde computadores pessoais até smartphones e dispositivos embarcados. 7 | 8 | Vídeo sobre [Computação Analógica:](https://youtu.be/GVsUOuSjvcg?si=T--CkceYZQ6kdCWn) 9 | 10 | Vídeo sobre [programação de um computador analógico](https://youtu.be/6AgkTdQXFTY?si=r4xBwviWlinMEfI-). 11 | 12 | ## Photonic Analog Computing 13 | A computação analógica baseada em fotônica é uma área de pesquisa ativa que visa explorar as propriedades únicas da luz para realizar operações de computação. A fotônica é a ciência e a tecnologia que envolvem a geração, manipulação e detecção de fótons, as partículas elementares da luz. A computação fotônica tem o potencial de oferecer vantagens significativas em relação à computação eletrônica, incluindo maior velocidade, eficiência energética e capacidade de processamento paralelo. -------------------------------------------------------------------------------- /conteúdo/Hardware e Software/4-Computação_analogica.md.orig: -------------------------------------------------------------------------------- 1 | # Computação analógica 2 | A computação analógica, ou computação contínua, é um tipo de computação que utiliza variáveis contínuas para representar dados e realizar operações. A computação digital, por outro lado, utiliza variáveis discretas, ou seja, valores que podem ser representados por um conjunto finito de valores. 3 | 4 | Historicamente, a computação analógica foi a primeira forma de computação utilizada. A computação digital só se tornou viável com o advento dos computadores eletrônicos, que são capazes de representar e manipular dados em forma de sinais elétricos digitais. 5 | 6 | Atualmente, a computação analógica é utilizada em algumas aplicações específicas, como processamento de sinais, controle de sistemas físicos e simulações de fenômenos naturais. No entanto, a computação digital é muito mais comum e amplamente utilizada em todos os tipos de dispositivos eletrônicos, desde computadores pessoais até smartphones e dispositivos embarcados. 7 | 8 | Vídeo sobre [Computação Analógica:](https://youtu.be/GVsUOuSjvcg?si=T--CkceYZQ6kdCWn) 9 | 10 | Vídeo sobre [programação de um computador analógico](https://youtu.be/6AgkTdQXFTY?si=r4xBwviWlinMEfI-). 11 | 12 | ## Photonic Analog Computing 13 | A computação analógica baseada em fotônica é uma área de pesquisa ativa que visa explorar as propriedades únicas da luz para realizar operações de computação. A fotônica é a ciência e a tecnologia que envolvem a geração, manipulação e detecção de fótons, as partículas elementares da luz. A computação fotônica tem o potencial de oferecer vantagens significativas em relação à computação eletrônica, incluindo maior velocidade, eficiência energética e capacidade de processamento paralelo. -------------------------------------------------------------------------------- /conteúdo/Hardware e Software/5-Bases_Numericas.md: -------------------------------------------------------------------------------- 1 | # Bases Numéricas na computação 2 | As bases numéricas são sistemas de numeração que utilizam símbolos para representar quantidades. A base numérica mais comum no dia-a-dia das pessoas é a base 10, que utiliza os algarismos arábicos de 0 a 9. No entanto, na computação, as bases mais utilizadas são a base 2 (binária), a base 8 (octal) e a base 16 (hexadecimal). A base 2 é a base utilizada pelos computadores para representar informações, pois os computadores são máquinas digitais, ou seja, trabalham com dois estados: ligado e desligado, representados por 0 e 1, respectivamente. A base 8 e a base 16 são utilizadas para representar números binários de forma mais compacta e legível. 3 | 4 | ## Base 2 (binária) 5 | A base 2 é a base utilizada pelos computadores para representar informações, pois os computadores são máquinas digitais, ou seja, trabalham com dois estados: ligado e desligado, representados por 0 e 1, respectivamente. A base 2 é a base mais simples, pois possui apenas dois algarismos: 0 e 1. A representação de números na base 2 é feita da mesma forma que na base 10, mas utilizando potências de 2 ao invés de potências de 10. Por exemplo, o número 1011 na base 2 é equivalente ao número 11 na base 10, pois 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0 = 8 + 0 + 2 + 1 = 11. 6 | 7 | ## Base 8 (octal) 8 | A base 8 é utilizada para representar números binários de forma mais compacta e legível. Na base 8, cada algarismo representa 3 bits, o que facilita a conversão entre binário e octal. Por exemplo, o número 1011 na base 2 é equivalente ao número 13 na base 8, pois 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0 = 8 + 0 + 2 + 1 = 13. 9 | 10 | ## Base 16 (hexadecimal) 11 | A base 16 também é utilizada para representar números binários de forma mais compacta e legível. Na base 16, cada algarismo representa 4 bits, o que facilita a conversão entre binário e hexadecimal. Além disso, a base 16 utiliza os algarismos arábicos de 0 a 9 e as letras de A a F para representar os valores de 10 a 15. Por exemplo, o número 1011 na base 2 é equivalente ao número B na base 16, pois 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0 = 8 + 0 + 2 + 1 = 11, que é representado pela letra B na base 16. 12 | 13 | -------------------------------------------------------------------------------- /conteúdo/Hardware e Software/5-Bases_Numericas.md.orig: -------------------------------------------------------------------------------- 1 | # Bases Numéricas na computação 2 | As bases numéricas são sistemas de numeração que utilizam símbolos para representar quantidades. A base numérica mais comum no dia-a-dia das pessoas é a base 10, que utiliza os algarismos arábicos de 0 a 9. No entanto, na computação, as bases mais utilizadas são a base 2 (binária), a base 8 (octal) e a base 16 (hexadecimal). A base 2 é a base utilizada pelos computadores para representar informações, pois os computadores são máquinas digitais, ou seja, trabalham com dois estados: ligado e desligado, representados por 0 e 1, respectivamente. A base 8 e a base 16 são utilizadas para representar números binários de forma mais compacta e legível. 3 | 4 | ## Base 2 (binária) 5 | A base 2 é a base utilizada pelos computadores para representar informações, pois os computadores são máquinas digitais, ou seja, trabalham com dois estados: ligado e desligado, representados por 0 e 1, respectivamente. A base 2 é a base mais simples, pois possui apenas dois algarismos: 0 e 1. A representação de números na base 2 é feita da mesma forma que na base 10, mas utilizando potências de 2 ao invés de potências de 10. Por exemplo, o número 1011 na base 2 é equivalente ao número 11 na base 10, pois 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0 = 8 + 0 + 2 + 1 = 11. 6 | 7 | ## Base 8 (octal) 8 | A base 8 é utilizada para representar números binários de forma mais compacta e legível. Na base 8, cada algarismo representa 3 bits, o que facilita a conversão entre binário e octal. Por exemplo, o número 1011 na base 2 é equivalente ao número 13 na base 8, pois 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0 = 8 + 0 + 2 + 1 = 13. 9 | 10 | ## Base 16 (hexadecimal) 11 | A base 16 também é utilizada para representar números binários de forma mais compacta e legível. Na base 16, cada algarismo representa 4 bits, o que facilita a conversão entre binário e hexadecimal. Além disso, a base 16 utiliza os algarismos arábicos de 0 a 9 e as letras de A a F para representar os valores de 10 a 15. Por exemplo, o número 1011 na base 2 é equivalente ao número B na base 16, pois 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0 = 8 + 0 + 2 + 1 = 11, que é representado pela letra B na base 16. 12 | 13 | -------------------------------------------------------------------------------- /conteúdo/Introdução à programação/Bash_shell.md: -------------------------------------------------------------------------------- 1 | # Introdução ao BASH 2 | O [Bash](https://www.gnu.org/software/bash/manual/html_node/index.html) ou (Bourne again shell) é um ambiente de programação interativa utilizado para interação com o sistema operacional. É a linguagem de shell mais comumente utilizada no Linux. Seu nome é em homenagem à [Bourne Shell](https://pt.wikipedia.org/wiki/Bourne_shell) ou `sh`, primeira linguagem de script do ambiente UNIX criada por Stephen Bourne. 3 | 4 | ## Configurando o Bash 5 | Como o BASH é utilizado para interagir com o SO, é muito comum utilizarmos um arquivo de configuração, o `.bashrc` para declarar variáveis de ambiente ou modificar o comportamento da shell. O `.bashrc` é apenas um script na própria linguagem shell, que é executado toda vez que o Bash é iniciado. 6 | 7 | ## Escrevendo e Executando scripts em Bash 8 | Quando criamos um arquivo contendo um script BASH, é comum adicionarmos uma linha `SHEBANG`: 9 | ```bash 10 | #!/usr/bin/env bash 11 | ``` 12 | esta linha, que deve ser a primeira linha do arquivo, diz ao SO qual a aplicação que deve executar este script. 13 | 14 | ## Sintaxe Básica 15 | ### Comentários 16 | Usa-se o hashtag (#) para denotar que o restante da linha é um comentário: 17 | 18 | ```bash 19 | # comentário 20 | #### o número de hash tags não importa #### 21 | x=10 # comentário é tudo que vem após o hashtag 22 | ``` 23 | 24 | ### Variáveis 25 | Variáveis são definidas por meio do sinal de `=`. 26 | 27 | ``` 28 | ano=2023 29 | nome="flávio" 30 | mensagem=Olá! 31 | ``` 32 | 33 | #### Variáveis Globais 34 | Por padrão as variáveis são locais, ou seja só existem durante a execução do script. Para criar uma variável global, ou seja que persiste após a execução do script, usamos o comando `export` 35 | 36 | ```bash 37 | export x=10 38 | y=20 39 | export y 40 | ``` 41 | 42 | ### Estruturas de dados 43 | #### Arrays 44 | 45 | O Bash permite a criação de arrays que são basicamente listas de elementos. os elementos de uma array são representados por indices numéricos positivos. 46 | 47 | ```bash 48 | lista=(1 2 3 4 5 34 65) 49 | frutas[0]=banana 50 | frutas[1]=abacaxi 51 | echo $frutas # imprime primeiro elemento da array 52 | echo ${frutas[1]} # imprime elemento 1 53 | ``` 54 | 55 | #### Arrays associativas 56 | este é um tipo diferente de array também conhecido como dicionário. Nele os elementos da array são identificados por uma string ao invés de um simples número inteiro. 57 | 58 | ```bash 59 | declare -A dicionario 60 | dicionario["Brasil"]="Brasília" 61 | dicionario["Goiás"]="Goiânia" 62 | echo ${dicionario["Brasil"]} 63 | ``` 64 | Note que o `-A` deve ser maiúsculo, caso contrário estaremos declarando uma array normal. 65 | 66 | #### Usando o `$` 67 | A esta altura você já deve ter reparado que usamos o caracter `$` para recuperar o valor de uma variável. Mas não apenas para isso. Usá-lo em combinação com `()` e `{}`, irá retornar o resultado de uma operação: 68 | 69 | ```bash 70 | var=$(expr 2 + 2) # aqui estamos executando o programa expr para calcular a soma 71 | ``` 72 | Podemos usar o operador `:=` ou `:-` para fornecer um valor default para a variável caso ela não tenha sido definida. 73 | 74 | ```bash 75 | echo "${myname:=$(whoami)}" 76 | myname=repolho 77 | echo "${myname:=$(whoami)}" 78 | ``` 79 | No exemplo acima utilizamos o programa `whoami` que retorna o usuário. 80 | 81 | Para apagar variáveis podemos usar o comando `unset`. 82 | 83 | ```bash 84 | unset x 85 | ``` 86 | 87 | ## Operações Aritméticas 88 | Expressões aritméticas podem ser calculadas através do aplicativo `expr` 89 | 90 | ```bash 91 | expr 2 + 3 92 | ``` 93 | 94 | Note que os espaços são parte da sintaxe, neste caso. 95 | Uma forma mais direta de fazer o mesmo (com ou sem espaços) é utilizando o `$` de uma nova maneira: 96 | 97 | ```bash 98 | echo $((2**3)) 99 | ``` 100 | 101 | Abaixo estão os operadores válidos. 102 | 103 | operação | operador | 104 | ---------|----------- 105 | soma | +| 106 | Subtração | - | 107 | Multiplicação | * | 108 | Divisão | / | 109 | Exponenciação | ** | 110 | Resto da divisão | % | 111 | 112 | ## Laços 113 | A linguagem shell como qualquer linguagem que se preze possui construtos para realizar operações em laços de repetição. 114 | 115 | Os comandos abaixo executam os comandos dentro do laço até que a condição de execução retorne `0`, ou o comando `break` ocorra. Caso seja necessário saltar uma execução o comando `continue` pode ser utilizado também. 116 | 117 | ### until 118 | O comando `until` executa os comandos dentro do laço até que a condição de execução retorne `0` ou se torne verdadeira. 119 | 120 | Note que abaixo, o `-eq` significa "é igual a". 121 | ```bash 122 | x=0 123 | until [ $x -eq 10 ]; do 124 | echo $x 125 | x=$((x+1)) 126 | done 127 | ``` 128 | Agora é um bom momento para explorar os operadores de comparação do bash: 129 | 130 | operador|sgnificado|exemplo 131 | --------|----------|------- 132 | -eq | igual a | [ $x -eq 10 ] 133 | -ne | diferente de | [ $x -ne 10 ] 134 | -gt | maior que | [ $x -gt 10 ] 135 | -ge | maior ou igual a | [ $x -ge 10 ] 136 | -lt | menor que | [ $x -lt 10 ] 137 | -le | menor ou igual a | [ $x -le 10 ] 138 | < | menor que (com parenteses duplos) | (($x < 10)) 139 | \> | maior que (com parenteses duplos) | (($x > 10)) 140 | <= | menor ou igual a (com parenteses duplos) | (($x <= 10)) 141 | \>= | maior ou igual a (com parenteses duplos) | (($x >= 10)) 142 | != | diferente de (com parenteses duplos) | (($x != 10)) 143 | 144 | ### while 145 | O laço `while` executa os comandos dentro do laço enquanto a condição de execução retornar `0` ou seja verdadeira. 146 | 147 | ```bash 148 | $ while test-commands; do consequent-commands; done 149 | ``` 150 | 151 | ### for 152 | O laço `for` executa os comandos dentro do laço para cada elemento de uma lista. 153 | ```bash 154 | frutas=(banana abacaxi uva) 155 | for fruta in ${frutas[@]}; 156 | do 157 | echo $fruta 158 | done 159 | ``` 160 | 161 | ## Condicionais 162 | No bash podemos utilizar os comandos `if`, `elif` e `else` para executar comandos condicionalmente. 163 | ### if 164 | A clausula `if` executa os comandos dentro do laço se a condição de execução retornar `0` ou for verdadeira. 165 | ```bash 166 | x=1 167 | if [ $x -eq 1 ]; then 168 | echo "x é igual a 1" 169 | fi 170 | ``` 171 | 172 | ### if-else 173 | A clausula `if-else` executa os comandos dentro do laço se a condição de execução retornar `0` ou for verdadeira. Caso contrário, executa os comandos dentro do `else`. 174 | 175 | ```bash 176 | x=1 177 | if [ $x -eq 5 ]; then 178 | echo "x é igual a 5" 179 | else 180 | echo "x é diferente de 5" 181 | fi 182 | ``` 183 | 184 | ### elif 185 | A clausula `elif` executa os comandos dentro do laço se a condição de execução retornar `0` ou for verdadeira. Caso contrário, executa os comandos dentro do `elif` seguinte. 186 | 187 | ```bash 188 | x=1 189 | if [ $x -eq 5 ]; then 190 | echo "x é igual a 5" 191 | elif [ $x -eq 4 ]; then 192 | echo "x é igual a 4" 193 | elif [ $x -eq 3 ]; then 194 | echo "x é igual a 3" 195 | elif [ $x -eq 2 ]; then 196 | echo "x é igual a 2" 197 | else 198 | echo "x é diferente de 5, 4, 3 e 2" 199 | fi 200 | ``` 201 | -------------------------------------------------------------------------------- /conteúdo/Introdução à programação/LaTeX/1-Instalando_Latex.md: -------------------------------------------------------------------------------- 1 | # Instalando o LaTeX no Ubuntu 2 | O LaTeX é um sistema de preparação de documentos de alta qualidade, muito utilizado na produção de documentos científicos. Para instalá-lo no Ubuntu, execute os seguintes comandos: 3 | 4 | ```bash 5 | sudo apt update 6 | sudo apt upgrade 7 | sudo apt install texlive-base texlive-binaries texlive-lang-portuguese 8 | ``` 9 | 10 | Com isso você terá o LaTeX instalado em seu sistema. Para verificar se a instalação foi bem sucedida, execute o comando `pdflatex --version`. 11 | 12 | ## Instalando o Texstudio 13 | O Texstudio é um editor de LaTeX que facilita a edição de documentos. Para instalá-lo no Ubuntu, execute os seguintes comandos: 14 | 15 | ```bash 16 | sudo apt update 17 | sudo apt install texstudio 18 | ``` 19 | Com isso você terá o Texstudio instalado em seu sistema. 20 | 21 | ## Instalando a extensão para LaTeX no VSCode 22 | 23 | O Visual Studio Code é um editor de código-fonte muito popular e possui uma extensão para LaTeX que facilita a edição de documentos. Para instalá-la, siga os seguintes passos: 24 | 1. Abra o Visual Studio Code. 25 | 2. Clique no ícone de extensões na barra lateral esquerda (ou pressione `Ctrl+Shift+X`). 26 | 3. Pesquise por "LaTeX Workshop". 27 | 4. Clique em "Instalar" na extensão "LaTeX Workshop" de James Yu. 28 | 5. Após a instalação, reinicie o Visual Studio Code. 29 | -------------------------------------------------------------------------------- /conteúdo/Introdução à programação/Projeto1.md: -------------------------------------------------------------------------------- 1 | # Analizando dados de Saúde 2 | A bilioteca PySUS é uma ferramenta que permite a extração de dados do DataSUS, o departamento de informática do SUS. O DataSUS é responsável por armazenar e disponibilizar dados sobre a saúde pública no Brasil. A biblioteca PySUS permite a extração de dados de diversos bancos de dados do DataSUS. Um destes bancos chama-se SINAN, que é o Sistema de Informação de Agravos de Notificação. O SINAN é responsável por armazenar dados sobre doenças de notificação compulsória, ou seja, doenças que devem ser notificadas ao Ministério da Saúde. Neste projeto, vamos analisar os dados de dengue no Brasil. Para isso, vamos utilizar a biblioteca PySUS para extrair os dados do SINAN e, em seguida, vamos utilizar a biblioteca Pandas para analisar os dados extraídos. 3 | 4 | ## Instalação da biblioteca PySUS 5 | Para instalar a biblioteca PySUS, basta executar o comando abaixo no terminal: 6 | ```bash 7 | pip install PySUS 8 | ``` 9 | Vamos também instalar a biblioteca Pandas, que utilizaremos mais adiante: 10 | ```bash 11 | pip install pandas 12 | ``` 13 | 14 | ## Introdução ao uso da biblioteca PySUS 15 | A documentação da biblioteca PySUS pode ser encontrada neste [link](https://pysus.readthedocs.io/pt/latest/). 16 | 17 | Para começar a interagir com o banco do SINAN, podemos listar os agravos de notificação disponíveis no banco de dados. Para isso, basta executar o código abaixo: 18 | ```python 19 | from pysus.online_data import SINAN 20 | import pandas as pd 21 | SINAN.list_diseases() 22 | ``` 23 | Para maiores informações sobre o uso da biblioteca PySUS, consulte a documentação. 24 | 25 | ## Escolhendo um agravo de notificação 26 | A partir da lista obtida acima escolha um agravo de notificação para analisar. 27 | 28 | Em seguida, verifique quais são os anos disponíveis para o agravo de notificação escolhido. Para isso, execute o código abaixo: 29 | ```python 30 | anos = SINAN.get_available_years('nome_do_agravo') 31 | anos 32 | ``` 33 | ## Extraindo os dados do SINAN 34 | Agora que você já escolheu o agravo de notificação e o ano, vamos extrair os dados do SINAN. Para isso, execute o código abaixo: 35 | ```python 36 | path = SINAN.download('nome_do_agravo', int(anos[3])) 37 | df = pd.read_parquet(path) 38 | ``` 39 | 40 | ## Analisando os dados 41 | Agora que você já extraiu os dados do SINAN, vamos analisá-los. Para isso, vamos utilizar a biblioteca Pandas. Para começar, vamos importar a biblioteca Pandas e verificar o tamanho do DataFrame: 42 | ```python 43 | import pandas as pd # Importando a biblioteca Pandas 44 | df.shape # Verificando o tamanho do DataFrame 45 | ``` 46 | A biblioteca Pandas tem muitas funcionalidades, mas vamos utilizar apenas algumas delas. Para começar, vamos utilizá-la para salvar os dados baixados em um arquivo CSV. Para isso, execute o código abaixo: 47 | ```python 48 | df.to_csv('nome_do_agravo.csv', index=False) 49 | ``` 50 | Isto permite que você não precise baixar os dados novamente toda vez que for analisá-los. Agora, vamos utilizar a biblioteca Pandas para ler os dados do arquivo CSV que acabamos de salvar. Para isso, execute o código abaixo: 51 | ```python 52 | df = pd.read_csv('nome_do_agravo.csv') 53 | ``` 54 | 55 | ## Tarefas de análise 56 | 57 | ### Análise exploratória dos dados 58 | Agora que você já extraiu os dados do SINAN e os carregou em um DataFrame, vamos realizar uma análise exploratória dos dados. Para isso, utilize as funções da biblioteca Pandas para responder às seguintes perguntas, assumindo que o agravo escolhido foi a *dengue* (substitua pelo agravo escolhido): 59 | 1. Quantos casos de dengue foram notificados no Brasil em 2019? 60 | 2. Quantos casos de dengue foram notificados no Brasil em 2019, por município? 61 | 3. Quantos casos de dengue foram notificados no Brasil em 2019, por estado? 62 | 4. Quantos casos de dengue foram notificados no Brasil em 2019, por mês? 63 | 5. Quantos casos de dengue foram notificados no Brasil em 2019, por faixa etária? 64 | 6. Quantos casos de dengue foram notificados no Brasil em 2019, por sexo? 65 | 7. Quantos casos de dengue foram notificados no Brasil em 2019, por raça/cor? 66 | 67 | Com os resultados obtidos, construa um relatório em LaTeX. O relatório deve conter as seguintes seções: 68 | 1. **Introdução:** Onde você deve explicar o que é o SINAN e o que é o agravo de notificação escolhido. Procure descobrir o código *CID10* (classificação internacional de doenças) para o agravo escolhido. Por exemplo, o código *CID10* para a dengue é **A90**. 69 | 2. **Metodologia:** Nesta seção, você deve explicar como os dados foram extraídos do SINAN e como foram analisados. Para isso, você deve explicar como a biblioteca PySUS foi utilizada para extrair os dados do SINAN e como a biblioteca Pandas foi utilizada para analisar os dados. 70 | 3. **Resultados:** Nesta seção, você deve apresentar os resultados obtidos na análise exploratória dos dados. Para isso, você deve apresentar os resultados obtidos nas perguntas 1 a 7 acima. Para cada pergunta, você deve apresentar os resultados em forma de tabela e gráfico. Para isso, utilize as funções da biblioteca Pandas para gerar as tabelas e gráficos. -------------------------------------------------------------------------------- /conteúdo/Introdução à programação/Python/Collections e Itertools.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "from collections import *" 10 | ] 11 | }, 12 | { 13 | "attachments": {}, 14 | "cell_type": "markdown", 15 | "metadata": {}, 16 | "source": [ 17 | "## Named tuples" 18 | ] 19 | }, 20 | { 21 | "cell_type": "code", 22 | "execution_count": 6, 23 | "metadata": {}, 24 | "outputs": [], 25 | "source": [ 26 | "nt = namedtuple('Pessoa', 'nome idade')" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "execution_count": 8, 32 | "metadata": {}, 33 | "outputs": [ 34 | { 35 | "data": { 36 | "text/plain": [ 37 | "__main__.Pessoa" 38 | ] 39 | }, 40 | "execution_count": 8, 41 | "metadata": {}, 42 | "output_type": "execute_result" 43 | } 44 | ], 45 | "source": [ 46 | "nt." 47 | ] 48 | }, 49 | { 50 | "cell_type": "code", 51 | "execution_count": 9, 52 | "metadata": {}, 53 | "outputs": [], 54 | "source": [ 55 | "Point = namedtuple('Point', ['x', 'y'])" 56 | ] 57 | }, 58 | { 59 | "cell_type": "code", 60 | "execution_count": 21, 61 | "metadata": {}, 62 | "outputs": [], 63 | "source": [ 64 | "p = Point(x=11, y=22) \n", 65 | "q = Point(35,47) # instantiate with positional or keyword arguments" 66 | ] 67 | }, 68 | { 69 | "cell_type": "code", 70 | "execution_count": 20, 71 | "metadata": {}, 72 | "outputs": [ 73 | { 74 | "data": { 75 | "text/plain": [ 76 | "33" 77 | ] 78 | }, 79 | "execution_count": 20, 80 | "metadata": {}, 81 | "output_type": "execute_result" 82 | } 83 | ], 84 | "source": [ 85 | "p[0] + p[1] # indexable like the plain tuple (11, 22)" 86 | ] 87 | }, 88 | { 89 | "cell_type": "code", 90 | "execution_count": 24, 91 | "metadata": {}, 92 | "outputs": [ 93 | { 94 | "data": { 95 | "text/plain": [ 96 | "('x', 'y')" 97 | ] 98 | }, 99 | "execution_count": 24, 100 | "metadata": {}, 101 | "output_type": "execute_result" 102 | } 103 | ], 104 | "source": [ 105 | "p._fields" 106 | ] 107 | }, 108 | { 109 | "attachments": {}, 110 | "cell_type": "markdown", 111 | "metadata": {}, 112 | "source": [ 113 | "## deque" 114 | ] 115 | }, 116 | { 117 | "cell_type": "code", 118 | "execution_count": 26, 119 | "metadata": {}, 120 | "outputs": [ 121 | { 122 | "data": { 123 | "text/plain": [ 124 | "deque(['g', 'h', 'i'], maxlen=3)" 125 | ] 126 | }, 127 | "execution_count": 26, 128 | "metadata": {}, 129 | "output_type": "execute_result" 130 | } 131 | ], 132 | "source": [ 133 | "d = deque('ghi', maxlen=3) \n", 134 | "d" 135 | ] 136 | }, 137 | { 138 | "cell_type": "code", 139 | "execution_count": 27, 140 | "metadata": {}, 141 | "outputs": [ 142 | { 143 | "data": { 144 | "text/plain": [ 145 | "deque(['h', 'i', 'j'], maxlen=3)" 146 | ] 147 | }, 148 | "execution_count": 27, 149 | "metadata": {}, 150 | "output_type": "execute_result" 151 | } 152 | ], 153 | "source": [ 154 | "d.append('j')\n", 155 | "d" 156 | ] 157 | }, 158 | { 159 | "cell_type": "code", 160 | "execution_count": 28, 161 | "metadata": {}, 162 | "outputs": [ 163 | { 164 | "data": { 165 | "text/plain": [ 166 | "deque(['g', 'h', 'i'], maxlen=3)" 167 | ] 168 | }, 169 | "execution_count": 28, 170 | "metadata": {}, 171 | "output_type": "execute_result" 172 | } 173 | ], 174 | "source": [ 175 | "d.appendleft('g')\n", 176 | "d" 177 | ] 178 | }, 179 | { 180 | "cell_type": "code", 181 | "execution_count": 30, 182 | "metadata": {}, 183 | "outputs": [ 184 | { 185 | "data": { 186 | "text/plain": [ 187 | "['i', 'h', 'g']" 188 | ] 189 | }, 190 | "execution_count": 30, 191 | "metadata": {}, 192 | "output_type": "execute_result" 193 | } 194 | ], 195 | "source": [ 196 | "list(reversed(d))" 197 | ] 198 | }, 199 | { 200 | "cell_type": "code", 201 | "execution_count": 31, 202 | "metadata": {}, 203 | "outputs": [ 204 | { 205 | "data": { 206 | "text/plain": [ 207 | "deque(['i', 'g', 'h'], maxlen=3)" 208 | ] 209 | }, 210 | "execution_count": 31, 211 | "metadata": {}, 212 | "output_type": "execute_result" 213 | } 214 | ], 215 | "source": [ 216 | "d.rotate(1)\n", 217 | "d" 218 | ] 219 | }, 220 | { 221 | "cell_type": "code", 222 | "execution_count": 32, 223 | "metadata": {}, 224 | "outputs": [], 225 | "source": [ 226 | "def tail(filename, n=10):\n", 227 | " 'Return the last n lines of a file'\n", 228 | " with open(filename) as f:\n", 229 | " return deque(f, n)" 230 | ] 231 | }, 232 | { 233 | "cell_type": "code", 234 | "execution_count": 33, 235 | "metadata": {}, 236 | "outputs": [ 237 | { 238 | "data": { 239 | "text/plain": [ 240 | "deque(['\"Brazil\",\"BRA\",\"Intentional homicides (per 100,000 people)\",\"VC.IHR.PSRC.P5\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"23.4872159228471\",\"23.9276532892894\",\"23.0077977508423\",\"22.1668797003254\",\"23.3241029318799\",\"26.520831725888\",\"26.5425401365802\",\"\",\"\",\\n',\n", 241 | " '\"Brazil\",\"BRA\",\"Presence of peace keepers (number of troops, police, and military observers in mandate)\",\"VC.PKP.TOTL.UN\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\\n'],\n", 242 | " maxlen=2)" 243 | ] 244 | }, 245 | "execution_count": 33, 246 | "metadata": {}, 247 | "output_type": "execute_result" 248 | } 249 | ], 250 | "source": [ 251 | "tail('dados.csv', 2)" 252 | ] 253 | }, 254 | { 255 | "attachments": {}, 256 | "cell_type": "markdown", 257 | "metadata": {}, 258 | "source": [ 259 | "## Chainmap" 260 | ] 261 | }, 262 | { 263 | "cell_type": "code", 264 | "execution_count": 35, 265 | "metadata": {}, 266 | "outputs": [ 267 | { 268 | "data": { 269 | "text/plain": [ 270 | "[('music', 'bach'), ('art', 'van gogh'), ('opera', 'carmen')]" 271 | ] 272 | }, 273 | "execution_count": 35, 274 | "metadata": {}, 275 | "output_type": "execute_result" 276 | } 277 | ], 278 | "source": [ 279 | "baseline = {'music': 'bach', 'art': 'rembrandt'}\n", 280 | "adjustments = {'art': 'van gogh', 'opera': 'carmen'}\n", 281 | "list(ChainMap(adjustments, baseline).items())" 282 | ] 283 | }, 284 | { 285 | "cell_type": "code", 286 | "execution_count": 36, 287 | "metadata": {}, 288 | "outputs": [ 289 | { 290 | "data": { 291 | "text/plain": [ 292 | "collections.ChainMap" 293 | ] 294 | }, 295 | "execution_count": 36, 296 | "metadata": {}, 297 | "output_type": "execute_result" 298 | } 299 | ], 300 | "source": [ 301 | "type(ChainMap(adjustments, baseline))" 302 | ] 303 | }, 304 | { 305 | "cell_type": "code", 306 | "execution_count": null, 307 | "metadata": {}, 308 | "outputs": [], 309 | "source": [ 310 | "c = ChainMap(adjustments, baseline)\n" 311 | ] 312 | }, 313 | { 314 | "attachments": {}, 315 | "cell_type": "markdown", 316 | "metadata": {}, 317 | "source": [ 318 | "## OrderedDict" 319 | ] 320 | }, 321 | { 322 | "cell_type": "code", 323 | "execution_count": 37, 324 | "metadata": {}, 325 | "outputs": [ 326 | { 327 | "data": { 328 | "text/plain": [ 329 | "True" 330 | ] 331 | }, 332 | "execution_count": 37, 333 | "metadata": {}, 334 | "output_type": "execute_result" 335 | } 336 | ], 337 | "source": [ 338 | "dic1 = {'a': 1, 'b': 2}\n", 339 | "dic2 = {'b': 2, 'a': 1}\n", 340 | "dic1 == dic2" 341 | ] 342 | }, 343 | { 344 | "cell_type": "code", 345 | "execution_count": 38, 346 | "metadata": {}, 347 | "outputs": [ 348 | { 349 | "data": { 350 | "text/plain": [ 351 | "False" 352 | ] 353 | }, 354 | "execution_count": 38, 355 | "metadata": {}, 356 | "output_type": "execute_result" 357 | } 358 | ], 359 | "source": [ 360 | "dic3 = OrderedDict([('a', 1), ('b', 2)])\n", 361 | "dic4 = OrderedDict([('b', 2), ('a', 1)])\n", 362 | "dic3 == dic4" 363 | ] 364 | }, 365 | { 366 | "attachments": {}, 367 | "cell_type": "markdown", 368 | "metadata": {}, 369 | "source": [ 370 | "# Itertools\n", 371 | "## iteradores infinitos" 372 | ] 373 | }, 374 | { 375 | "cell_type": "code", 376 | "execution_count": 5, 377 | "metadata": {}, 378 | "outputs": [], 379 | "source": [ 380 | "from itertools import *\n", 381 | "import operator" 382 | ] 383 | }, 384 | { 385 | "cell_type": "code", 386 | "execution_count": 3, 387 | "metadata": {}, 388 | "outputs": [ 389 | { 390 | "name": "stdout", 391 | "output_type": "stream", 392 | "text": [ 393 | "10\n", 394 | "11\n", 395 | "12\n", 396 | "13\n", 397 | "14\n", 398 | "15\n" 399 | ] 400 | } 401 | ], 402 | "source": [ 403 | "for i in count(10):\n", 404 | " print(i)\n", 405 | " if i >= 15:\n", 406 | " break" 407 | ] 408 | }, 409 | { 410 | "cell_type": "code", 411 | "execution_count": 4, 412 | "metadata": {}, 413 | "outputs": [ 414 | { 415 | "name": "stdout", 416 | "output_type": "stream", 417 | "text": [ 418 | "A\n", 419 | "B\n", 420 | "C\n", 421 | "D\n", 422 | "A\n", 423 | "B\n", 424 | "C\n", 425 | "D\n", 426 | "A\n", 427 | "B\n", 428 | "C\n" 429 | ] 430 | } 431 | ], 432 | "source": [ 433 | "for n,i in enumerate(cycle('ABCD')):\n", 434 | " print(i)\n", 435 | " if n == 10:\n", 436 | " break" 437 | ] 438 | }, 439 | { 440 | "attachments": {}, 441 | "cell_type": "markdown", 442 | "metadata": {}, 443 | "source": [ 444 | "## accumulate" 445 | ] 446 | }, 447 | { 448 | "cell_type": "code", 449 | "execution_count": 7, 450 | "metadata": {}, 451 | "outputs": [ 452 | { 453 | "data": { 454 | "text/plain": [ 455 | "[1, 2, 6, 24, 120]" 456 | ] 457 | }, 458 | "execution_count": 7, 459 | "metadata": {}, 460 | "output_type": "execute_result" 461 | } 462 | ], 463 | "source": [ 464 | "list(accumulate([1,2,3,4,5], operator.mul))" 465 | ] 466 | }, 467 | { 468 | "attachments": {}, 469 | "cell_type": "markdown", 470 | "metadata": {}, 471 | "source": [ 472 | "## chain" 473 | ] 474 | }, 475 | { 476 | "cell_type": "code", 477 | "execution_count": 11, 478 | "metadata": {}, 479 | "outputs": [ 480 | { 481 | "data": { 482 | "text/plain": [ 483 | "['A', 'B', 'C', 'D', 'E', 'F']" 484 | ] 485 | }, 486 | "execution_count": 11, 487 | "metadata": {}, 488 | "output_type": "execute_result" 489 | } 490 | ], 491 | "source": [ 492 | "list(chain('ABC', 'DEF'))" 493 | ] 494 | }, 495 | { 496 | "cell_type": "code", 497 | "execution_count": 12, 498 | "metadata": {}, 499 | "outputs": [ 500 | { 501 | "data": { 502 | "text/plain": [ 503 | "['ABC', 'DEF']" 504 | ] 505 | }, 506 | "execution_count": 12, 507 | "metadata": {}, 508 | "output_type": "execute_result" 509 | } 510 | ], 511 | "source": [ 512 | "list(chain(['ABC', 'DEF']))" 513 | ] 514 | }, 515 | { 516 | "cell_type": "code", 517 | "execution_count": 14, 518 | "metadata": {}, 519 | "outputs": [ 520 | { 521 | "data": { 522 | "text/plain": [ 523 | "['A', 'B', 'C', 'D', 'E', 'F']" 524 | ] 525 | }, 526 | "execution_count": 14, 527 | "metadata": {}, 528 | "output_type": "execute_result" 529 | } 530 | ], 531 | "source": [ 532 | "list(chain.from_iterable(['ABC', 'DEF']))" 533 | ] 534 | }, 535 | { 536 | "cell_type": "code", 537 | "execution_count": 16, 538 | "metadata": {}, 539 | "outputs": [ 540 | { 541 | "data": { 542 | "text/plain": [ 543 | "['A', 'B', 'C', 'D', 'E', 'F']" 544 | ] 545 | }, 546 | "execution_count": 16, 547 | "metadata": {}, 548 | "output_type": "execute_result" 549 | } 550 | ], 551 | "source": [ 552 | "list(chain(*['ABC', 'DEF']))" 553 | ] 554 | }, 555 | { 556 | "cell_type": "code", 557 | "execution_count": 27, 558 | "metadata": {}, 559 | "outputs": [ 560 | { 561 | "name": "stdout", 562 | "output_type": "stream", 563 | "text": [ 564 | "10\n", 565 | "11\n", 566 | "12\n", 567 | "13\n", 568 | "14\n", 569 | "15\n", 570 | "16\n", 571 | "17\n", 572 | "18\n", 573 | "19\n", 574 | "20\n" 575 | ] 576 | } 577 | ], 578 | "source": [ 579 | "for i in range(100)[10:21]:\n", 580 | " print(i)" 581 | ] 582 | }, 583 | { 584 | "cell_type": "code", 585 | "execution_count": 24, 586 | "metadata": {}, 587 | "outputs": [ 588 | { 589 | "data": { 590 | "text/plain": [ 591 | "False" 592 | ] 593 | }, 594 | "execution_count": 24, 595 | "metadata": {}, 596 | "output_type": "execute_result" 597 | } 598 | ], 599 | "source": [ 600 | "range(100)[10:21] == islice(range(100), 10, 21)" 601 | ] 602 | }, 603 | { 604 | "cell_type": "code", 605 | "execution_count": 26, 606 | "metadata": {}, 607 | "outputs": [ 608 | { 609 | "name": "stdout", 610 | "output_type": "stream", 611 | "text": [ 612 | "10\n", 613 | "11\n", 614 | "12\n", 615 | "13\n", 616 | "14\n", 617 | "15\n", 618 | "16\n", 619 | "17\n", 620 | "18\n", 621 | "19\n", 622 | "20\n" 623 | ] 624 | } 625 | ], 626 | "source": [ 627 | "for i in islice(range(100), 10, 21):\n", 628 | " print(i)" 629 | ] 630 | }, 631 | { 632 | "cell_type": "code", 633 | "execution_count": null, 634 | "metadata": {}, 635 | "outputs": [], 636 | "source": [] 637 | } 638 | ], 639 | "metadata": { 640 | "kernelspec": { 641 | "display_name": "Python 3 (ipykernel)", 642 | "language": "python", 643 | "name": "python3" 644 | }, 645 | "language_info": { 646 | "codemirror_mode": { 647 | "name": "ipython", 648 | "version": 3 649 | }, 650 | "file_extension": ".py", 651 | "mimetype": "text/x-python", 652 | "name": "python", 653 | "nbconvert_exporter": "python", 654 | "pygments_lexer": "ipython3", 655 | "version": "3.11.5" 656 | }, 657 | "vscode": { 658 | "interpreter": { 659 | "hash": "5238573367df39f7286bb46f9ff5f08f63a01a80960060ce41e3c79b190280fa" 660 | } 661 | } 662 | }, 663 | "nbformat": 4, 664 | "nbformat_minor": 4 665 | } 666 | -------------------------------------------------------------------------------- /conteúdo/Introdução à programação/Python/Game of Life.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "id": "6395ad8f-de14-42a6-abc9-85e32f222ea8", 6 | "metadata": {}, 7 | "source": [ 8 | "# Jogo da Vida de Conway\n", 9 | "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", 10 | "\n", 11 | "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", 12 | "1. Uma célula morta com exatamente três vizinhos vivos se torna uma célula viva.\n", 13 | "2. Uma célula viva com dois ou três vizinhos vivos permanece viva.\n", 14 | "3. Em todos os outros casos, uma célula viva morre ou permanece morta.\n", 15 | "\n", 16 | " 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", 17 | " " 18 | ] 19 | }, 20 | { 21 | "cell_type": "code", 22 | "id": "initial_id", 23 | "metadata": { 24 | "ExecuteTime": { 25 | "end_time": "2025-05-27T11:06:45.228396Z", 26 | "start_time": "2025-05-27T11:06:45.177413Z" 27 | } 28 | }, 29 | "source": [ 30 | "import numpy as np\n", 31 | "import matplotlib.pyplot as plt\n", 32 | "from IPython.display import display\n", 33 | "import ipywidgets as widgets\n", 34 | "from ipywidgets import interact, IntSlider" 35 | ], 36 | "outputs": [], 37 | "execution_count": 4 38 | }, 39 | { 40 | "metadata": {}, 41 | "cell_type": "markdown", 42 | "source": "## Simulador básico do Jogo da Vida", 43 | "id": "d54dd2c3be3b4303" 44 | }, 45 | { 46 | "cell_type": "code", 47 | "id": "477aad00275d031c", 48 | "metadata": { 49 | "ExecuteTime": { 50 | "end_time": "2025-05-27T11:13:31.270232Z", 51 | "start_time": "2025-05-27T11:13:31.267522Z" 52 | } 53 | }, 54 | "source": [ 55 | "# fig, ax = plt.subplots()\n", 56 | "def game_of_life_step(grid, steps):\n", 57 | " history = [grid.copy()]\n", 58 | " rows, cols = grid.shape\n", 59 | " new_grid = np.zeros((rows, cols))\n", 60 | " for _ in range(steps):\n", 61 | " for i in range(rows):\n", 62 | " for j in range(cols):\n", 63 | " neighbors = grid[max(i - 1, 0):min(i + 2, rows), max(j - 1, 0):min(j + 2, cols)]\n", 64 | " live_neighbors = np.sum(neighbors) - grid[i, j]\n", 65 | " if grid[i,j] == 1 and (live_neighbors<2 or live_neighbors>3):\n", 66 | " new_grid[i,j] = 0\n", 67 | " if grid[i, j] == 0 and live_neighbors == 3:\n", 68 | " new_grid[i, j] = 1\n", 69 | "\n", 70 | " history.append(new_grid.copy())\n", 71 | "\n", 72 | " return history" 73 | ], 74 | "outputs": [], 75 | "execution_count": 12 76 | }, 77 | { 78 | "cell_type": "code", 79 | "id": "796dff6289c3505d", 80 | "metadata": { 81 | "ExecuteTime": { 82 | "end_time": "2025-05-27T11:13:31.925540Z", 83 | "start_time": "2025-05-27T11:13:31.923511Z" 84 | } 85 | }, 86 | "source": [ 87 | "grid_inicial = np.zeros((10,10))\n", 88 | "grid_inicial[2,3] = 1\n", 89 | "grid_inicial[2,5] = 1\n", 90 | "grid_inicial[3,4] = 1\n", 91 | "grid_inicial[5,3] = 1\n", 92 | "grid_inicial[5,5] = 1\n", 93 | "grid_inicial[6,4] = 1\n", 94 | "grid_inicial[8,:] = np.ones(10) # Linha inteira viva\n" 95 | ], 96 | "outputs": [], 97 | "execution_count": 13 98 | }, 99 | { 100 | "metadata": { 101 | "ExecuteTime": { 102 | "end_time": "2025-05-27T11:22:32.722950Z", 103 | "start_time": "2025-05-27T11:22:32.718672Z" 104 | } 105 | }, 106 | "cell_type": "code", 107 | "source": [ 108 | "%%time\n", 109 | "# Rodar o jogo e salvar histórico\n", 110 | "steps = 10\n", 111 | "history = game_of_life_step(grid_inicial, steps)\n", 112 | "\n", 113 | "# Função de visualização interativa\n", 114 | "def visualize_step(step):\n", 115 | " plt.figure(figsize=(6, 6))\n", 116 | " plt.imshow(history[step], cmap='binary', interpolation='nearest')\n", 117 | " plt.title(f'Passo: {step}')\n", 118 | " plt.axis('off') # Remover eixos para melhor visualização\n", 119 | " plt.show()" 120 | ], 121 | "id": "6d433104-b832-45d1-a487-1afcf563116c", 122 | "outputs": [ 123 | { 124 | "name": "stdout", 125 | "output_type": "stream", 126 | "text": [ 127 | "CPU times: user 2.1 ms, sys: 0 ns, total: 2.1 ms\n", 128 | "Wall time: 2.11 ms\n" 129 | ] 130 | } 131 | ], 132 | "execution_count": 27 133 | }, 134 | { 135 | "metadata": {}, 136 | "cell_type": "markdown", 137 | "source": [ 138 | "### Visualização do Jogo da Vida\n", 139 | "Vamos testar a função com um grid inicial aleatório de 10x10 e 10 passos de tempo." 140 | ], 141 | "id": "fd07da8cf97f20bf" 142 | }, 143 | { 144 | "metadata": { 145 | "ExecuteTime": { 146 | "end_time": "2025-05-27T11:22:15.874056Z", 147 | "start_time": "2025-05-27T11:22:15.847589Z" 148 | } 149 | }, 150 | "cell_type": "code", 151 | "source": [ 152 | "# Criar slider para navegar pelos passos\n", 153 | "interact(\n", 154 | " visualize_step,\n", 155 | " step=IntSlider(min=0, max=len(history)-1, description='Passo:')\n", 156 | ")" 157 | ], 158 | "id": "38a528aef8b3f5c3", 159 | "outputs": [ 160 | { 161 | "data": { 162 | "text/plain": [ 163 | "interactive(children=(IntSlider(value=0, description='Passo:'), Output()), _dom_classes=('widget-interact',))" 164 | ], 165 | "application/vnd.jupyter.widget-view+json": { 166 | "version_major": 2, 167 | "version_minor": 0, 168 | "model_id": "18c980436c2544c782e13389f35289ff" 169 | } 170 | }, 171 | "metadata": {}, 172 | "output_type": "display_data" 173 | }, 174 | { 175 | "name": "stdout", 176 | "output_type": "stream", 177 | "text": [ 178 | "CPU times: user 25.1 ms, sys: 0 ns, total: 25.1 ms\n", 179 | "Wall time: 24.3 ms\n" 180 | ] 181 | }, 182 | { 183 | "data": { 184 | "text/plain": [ 185 | "" 186 | ] 187 | }, 188 | "execution_count": 26, 189 | "metadata": {}, 190 | "output_type": "execute_result" 191 | } 192 | ], 193 | "execution_count": 26 194 | }, 195 | { 196 | "cell_type": "code", 197 | "id": "e9dc586f8d38de3", 198 | "metadata": { 199 | "ExecuteTime": { 200 | "end_time": "2025-05-27T11:20:05.283882Z", 201 | "start_time": "2025-05-27T11:20:05.281389Z" 202 | } 203 | }, 204 | "source": [ 205 | "# implementação alternativa\n", 206 | "def game_of_life2(grid, steps):\n", 207 | " history = [grid.copy()]\n", 208 | " for _ in range(steps):\n", 209 | " # Usa numpy.pad para adicionar uma borda de zeros ao redor do grid\n", 210 | " padded_grid = np.pad(grid, pad_width=1, mode='constant', constant_values=0)\n", 211 | " \n", 212 | " # Calcula o número de vizinhos vivos de cada célula\n", 213 | " neighbor_sum = sum(np.roll(np.roll(grid, i, axis=0), j, axis=1)\n", 214 | " for i in (-1, 0, 1) for j in (-1, 0, 1) if (i != 0 or j != 0))\n", 215 | " \n", 216 | " # Aplica as regras do jogo\n", 217 | " birth = (neighbor_sum==3) & (grid==0)\n", 218 | " survive = ((neighbor_sum==2) | (neighbor_sum==3)) & (grid==1)\n", 219 | " \n", 220 | " grid[:] = birth | survive\n", 221 | " history.append(grid.copy())\n", 222 | " return history" 223 | ], 224 | "outputs": [], 225 | "execution_count": 20 226 | }, 227 | { 228 | "cell_type": "code", 229 | "id": "2469b83a-7e41-4843-abe2-16b9aa2d0c81", 230 | "metadata": { 231 | "ExecuteTime": { 232 | "end_time": "2025-05-27T11:21:24.398366Z", 233 | "start_time": "2025-05-27T11:21:24.389390Z" 234 | } 235 | }, 236 | "source": [ 237 | "%%time\n", 238 | "history = game_of_life2(grid_inicial,100)" 239 | ], 240 | "outputs": [ 241 | { 242 | "name": "stdout", 243 | "output_type": "stream", 244 | "text": [ 245 | "CPU times: user 7.06 ms, sys: 6 μs, total: 7.07 ms\n", 246 | "Wall time: 7.04 ms\n" 247 | ] 248 | } 249 | ], 250 | "execution_count": 24 251 | }, 252 | { 253 | "cell_type": "markdown", 254 | "id": "c0a60c071436170b", 255 | "metadata": {}, 256 | "source": "" 257 | }, 258 | { 259 | "cell_type": "code", 260 | "id": "a139288fe432079a", 261 | "metadata": { 262 | "ExecuteTime": { 263 | "end_time": "2025-05-27T11:21:33.351322Z", 264 | "start_time": "2025-05-27T11:21:33.314272Z" 265 | } 266 | }, 267 | "source": [ 268 | "interact(\n", 269 | " visualize_step,\n", 270 | " step=IntSlider(min=0, max=len(history)-1, description='Passo:')\n", 271 | ")" 272 | ], 273 | "outputs": [ 274 | { 275 | "data": { 276 | "text/plain": [ 277 | "interactive(children=(IntSlider(value=0, description='Passo:'), Output()), _dom_classes=('widget-interact',))" 278 | ], 279 | "application/vnd.jupyter.widget-view+json": { 280 | "version_major": 2, 281 | "version_minor": 0, 282 | "model_id": "e80a6e5a0c034d3c8df4b5e9033335e0" 283 | } 284 | }, 285 | "metadata": {}, 286 | "output_type": "display_data" 287 | }, 288 | { 289 | "data": { 290 | "text/plain": [ 291 | "" 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 | ![NAT](https://upload.wikimedia.org/wikipedia/commons/thumb/c/c7/NAT_Concept-en.svg/1024px-NAT_Concept-en.svg.png) 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 | ![TCP](https://upload.wikimedia.org/wikipedia/commons/thumb/f/f6/Tcp_state_diagram_fixed_new.svg/1920px-Tcp_state_diagram_fixed_new.svg.png) 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. `<body>`: Define o corpo do documento HTML. 31 | 6. `<h1>`, `<h2>`, `<h3>`, `<h4>`, `<h5>`, `<h6>`: Define os títulos da página. 32 | 7. `<p>`: Define um parágrafo. 33 | 8. `<a>`: Define um link. 34 | 9. `<img>`: Define uma imagem. 35 | 10. `<ul>`, `<ol>`, `<li>`: Define listas não ordenadas e ordenadas. 36 | 11. `<table>`, `<tr>`, `<td>`, `<th>`: Define uma tabela. 37 | 12. `<form>`, `<input>`, `<button>`, `<select>`, `<option>`, `<textarea>`: Define um formulário. 38 | 13. `<div>`, `<span>`: Define divisões e spans. 39 | 14. `<br>`: Define uma quebra de linha. 40 | 15. `<hr>`: Define uma linha horizontal. 41 | 16. `<strong>`, `<em>`, `<b>`, `<i>`: Define texto em negrito e itálico. 42 | 43 | ## Exercícios 44 | 1. Crie um documento HTML com um título e um parágrafo. 45 | 2. Crie um documento HTML com uma lista não ordenada e uma lista ordenada. 46 | 3. Crie um documento HTML com uma tabela. 47 | 4. Crie um documento HTML com um formulário. 48 | 5. Crie um documento HTML com uma imagem e um link. 49 | 50 | ## Introdução ao CSS 51 | O [CSS (Cascading Style Sheets)](https://www.w3schools.com/css/) é uma linguagem de estilo utilizada para definir a aparência e o layout de uma página web. O CSS é utilizado para definir estilos como cores, fontes, tamanhos, margens, entre outros. O CSS é composto por uma série de regras, que são utilizadas para definir estilos para os elementos HTML. 52 | 53 | ### Estrutura de uma regra CSS 54 | Uma regra CSS é composta por um seletor e um bloco de declarações. O seletor é utilizado para selecionar os elementos HTML aos quais a regra se aplica, e o bloco de declarações é utilizado para definir os estilos para os elementos selecionados. Abaixo está um exemplo de uma regra CSS básica. 55 | 56 | ```css 57 | h1 { 58 | color: red; 59 | font-size: 24px; 60 | } 61 | ``` 62 | ### Seletores CSS Mais Comuns 63 | Abaixo estão listados alguns dos seletores CSS mais comuns, que são utilizados para selecionar os elementos HTML aos quais as regras se aplicam. 64 | 1. `elemento`: Seleciona todos os elementos do tipo `elemento`. 65 | 2. `.classe`: Seleciona todos os elementos com a classe `classe`. 66 | 3. `#id`: Seleciona o elemento com o id `id`. 67 | 4. `elemento.classe`: Seleciona todos os elementos do tipo `elemento` com a classe `classe`. 68 | 5. `elemento#id`: Seleciona o elemento do tipo `elemento` com o id `id`. 69 | 6. `elemento1 elemento2`: Seleciona todos os elementos `elemento2` que são descendentes de `elemento1`. 70 | 7. `elemento1 > elemento2`: Seleciona todos os elementos `elemento2` que são filhos diretos de `elemento1`. 71 | 8. `elemento1 + elemento2`: Seleciona o elemento `elemento2` que é adjacente ao `elemento1`. 72 | 9. `elemento1 ~ elemento2`: Seleciona todos os elementos `elemento2` que são irmãos de `elemento1`. 73 | 74 | ### Exemplos de uso de diferentes seletores CSS 75 | ```css 76 | /* Seleciona todos os elementos h1 */ 77 | h1 { 78 | color: red; 79 | font-size: 24px; 80 | } 81 | 82 | /* Seleciona todos os elementos com a classe .paragrafo */ 83 | .paragrafo { 84 | color: blue; 85 | font-size: 16px; 86 | } 87 | 88 | /* Seleciona o elemento com o id #titulo */ 89 | #titulo { 90 | color: green; 91 | font-size: 32px; 92 | } 93 | 94 | /* Seleciona todos os elementos p que são descendentes de h1 */ 95 | h1 p { 96 | color: orange; 97 | font-size: 12px; 98 | } 99 | ``` 100 | 101 | Para usar o CSS criado em uma página HTML, basta adicionar o código CSS entre as tags `<style>` no cabeçalho do documento HTML. Abaixo está um exemplo de como adicionar um estilo CSS a um documento HTML. 102 | 103 | ```html 104 | <!DOCTYPE html> 105 | <html> 106 | <head> 107 | <title>Título da Página 108 | 114 | 115 | 116 |

Título da Página

117 |

Este é um parágrafo.

118 | 119 | 120 | ``` 121 | 122 | O CSS pode ser adicionado a um documento HTML de três maneiras diferentes: 123 | 1. Inline: O CSS é adicionado diretamente ao elemento HTML, utilizando o atributo `style`. 124 | 2. Interno: O CSS é adicionado no cabeçalho do documento HTML, entre as tags `