---
# System prepended metadata

title: ProgramaZine

---

## Criação de zines com programação - Sesc Avenida Paulista

![ProgramaZine](https://hackmd.io/_uploads/ByRMWgnbA.jpg)

## `hackmd.io/@sesc-av-paulista/programazine`

**Quartas-feiras, 14h30 a 16h30, de 8 de maio a 26 de junho**

### O que são zines? Qual a proposta da atividade?

Zines sãp publicações independentes, experimentais, podendo usar misturas de técnicas artesanais, analógicas e elementos digitais. Historicamente criadas no contexto de "sub-culturas", tem formatos pequenos, frequentemente podem ser replicadas a baixo custo (mimeografo, fotocópia, impressão caseira ou digital baratinha), e costumam ser compartilhadas com entusiastas do assunto que tratam.

**Nesta atividade aberta voltada a criação de zines, vamos acrescentar às tecnicas tradicionalmente utilizadas na sua confecção elementos de programação e incentivar e exploração de temáticas do letramento tecnológico, software livre e programação criativa.**

## Encontro 26 de junho
primeira versão da grade
![image](https://hackmd.io/_uploads/BJZMU1cLA.png)

```python
import py5

margem_h = 20
cols = 5
rows = 5

def setup():
    global funcs, margem_v
    py5.size(int(297 * 1.8), int(420 * 1.8))
    py5.ellipse_mode(py5.CORNER)
    tam = (py5.width - 2 * margem_h) / cols
    margem_v = (py5.height - tam * rows) / 2
    funcs = [grade, py5.circle, py5.square, modulo_estrela]
    py5.no_loop()
    
def draw():
    py5.no_stroke()
    py5.background(255)
    py5.fill(200, 0, 200, 100)
    grade(margem_h, margem_v, py5.width - 2 * margem_h, cols, rows)
    py5.fill(0, 200, 200, 100)
    grade(margem_h, margem_v, py5.width - 2 * margem_h, cols, rows)

def grade(margem_h, margem_v, largura_grade, cols=3, rows=3):
    tam = largura_grade / cols
    for j in range(rows):
        y = margem_v + j * tam
        for i in range(cols):
            x = margem_h + i * tam
            if tam > 10:
                func = py5.random_choice(funcs)
            else:
                func = py5.random_choice(funcs[1:])
            func(x, y, tam)
                

def modulo_estrela(x, y, tamanho):
    radius1 = py5.random_int(int(tamanho/2), int(tamanho))
    radius2 = radius1 / 2
    npoints = py5.random_int(3, 50)
    angle = py5.TWO_PI / npoints
    halfAngle = angle / 2.0
    py5.begin_shape()
    a = 0

    while a < py5.TWO_PI:
       #print("while " + str(a))
       sx = x + tamanho / 2 + py5.cos(a) * radius2
       sy = y + tamanho / 2 + py5.sin(a) * radius2
       py5.vertex(sx, sy)
         
       sx = x + tamanho / 2 + py5.cos(a + halfAngle) * radius1
       sy = y + tamanho / 2 + py5.sin(a + halfAngle) * radius1
       py5.vertex(sx, sy)
       a += angle

    py5.end_shape(py5.CLOSE)

def key_pressed():
    py5.redraw()

py5.run_sketch()

```



---




```python
import numpy as np

n = 12
step = TWO_PI / n

for a in np.arange(0, TWO_PI, step):
    print(a)

n = 12
step = TWO_PI / n

angs = []
for ang in (step * i for i in range(n)):
    print(ang)
```

```python
import requests
import re

def getSVG(searchTerm):
    preamble = "https://www.svgrepo.com/vectors/"

    x = requests.get(preamble + searchTerm + '/')

    pattern = r'content="https:\/\/www\.svgrepo\.com\/svg\/\d+\/[^"]+"'

    # Find all matches in the HTML
    matches = re.findall(pattern, x.text)
    urls = [match.replace('content="','').replace('https','http').replace('/svg/','/download/')[:-1] + '.svg' for match in matches]
    i=0  
    for url in urls:
        r = requests.get(url, allow_redirects=True)
        open('svg/' + str(i).zfill(4) + '.svg', 'wb').write(r.content)
        i = i +1

```
![image](https://hackmd.io/_uploads/rkh7Yx98A.png)

```python
from pathlib import Path

import py5

margem_h = 20
cols = 5
rows = 5

def setup():
    global funcs, margem_v, shapes
    py5.size(int(297 * 1.8), int(420 * 1.8))
    py5.ellipse_mode(py5.CORNER)
    tam = (py5.width - 2 * margem_h) / cols
    margem_v = (py5.height - tam * rows) / 2
    funcs = [grade, py5.circle, py5.square, modulo_estrela, random_shape]
    py5.no_loop()
    shapes = [py5.load_shape(path) for path in Path('svg').iterdir()]
    
    
def random_shape(x, y, tam):
    shp = py5.random_choice(shapes)
    shp.disable_style()
    py5.shape_mode(py5.CENTER)
    py5.shape(shp, x + tam/2, y + tam/2, tam, tam)
    
    
    
def draw():
    py5.no_stroke()
    py5.background(255)
    py5.fill(200, 0, 200, 100)
    grade(margem_h, margem_v, py5.width - 2 * margem_h, cols, rows)
    py5.fill(0, 200, 200, 100)
    grade(margem_h, margem_v, py5.width - 2 * margem_h, cols, rows)

def grade(margem_h, margem_v, largura_grade, cols=3, rows=3):
    tam = largura_grade / cols
    for j in range(rows):
        y = margem_v + j * tam
        for i in range(cols):
            x = margem_h + i * tam
            if tam > 10:
                func = py5.random_choice(funcs)
            else:
                func = py5.random_choice(funcs[1:])
            func(x, y, tam)
                

def modulo_estrela(x, y, tamanho):
    radius1 = py5.random_int(int(tamanho/2), int(tamanho))
    radius2 = radius1 / 2
    npoints = py5.random_int(3, 50)
    angle = py5.TWO_PI / npoints
    halfAngle = angle / 2.0
    py5.begin_shape()
    a = 0

    while a < py5.TWO_PI:
       #print("while " + str(a))
       sx = x + tamanho / 2 + py5.cos(a) * radius2
       sy = y + tamanho / 2 + py5.sin(a) * radius2
       py5.vertex(sx, sy)
         
       sx = x + tamanho / 2 + py5.cos(a + halfAngle) * radius1
       sy = y + tamanho / 2 + py5.sin(a + halfAngle) * radius1
       py5.vertex(sx, sy)
       a += angle

    py5.end_shape(py5.CLOSE)

def key_pressed():
    if py5.key == ' ':
        py5.redraw()
    elif py5.key == 's':
        py5.save_frame('###out.png')
py5.run_sketch()

```


## Encontro dia 19 de junho

```python=

import py5

margem_h = 20
cols = 3
rows = 4


def setup():
    py5.size(int(297 * 1.8), int(420 * 1.8))
    tam = (py5.width - 2 * margem_h) / cols
    margem_v = (py5.height - tam * rows) / 2
    for j in range(rows):
        y = margem_v + j * tam
        for i in range(cols):
            x = margem_h + i * tam
            py5.square(x, y, tam)
    
    
    
py5.run_sketch()
```

Grade recursiva

```python=

import py5

margem_h = 20
cols = 5
rows = 5

def setup():
    py5.size(int(297 * 1.8), int(420 * 1.8))
    py5.rect_mode(py5.CENTER)
    tam = (py5.width - 2 * margem_h) / cols
    margem_v = (py5.height - tam * rows) / 2
    py5.no_stroke()
    py5.background(255)
    py5.fill(200, 0, 200, 100)
    grade(margem_h, margem_v, py5.width - 2 * margem_h, cols, rows)
    py5.fill(0, 200, 200, 100)
    grade(margem_h, margem_v, py5.width - 2 * margem_h, cols, rows)


def grade(margem_h, margem_v, largura_grade, cols, rows):
    tam = largura_grade / cols
    for j in range(rows):
        y = margem_v + j * tam
        for i in range(cols):
            x = margem_h + i * tam
            sorteio = py5.random_choice((0, 1, 2))
            if  sorteio == 0 and tam > 10:
                grade(x, y, tam, 3, 3)
            elif sorteio == 1:
                py5.circle(x + tam / 2, y + tam / 2, tam)
            else:
                py5.square(x + tam / 2, y + tam / 2, tam * 0.80)
                
    
    
    
py5.run_sketch()

```

## Encontro dia 12 de junho

- Simulação de incêndio...

- Jupyter Notebooks e kernels do py5
    - https://py5coding.org/tutorials/jupyter.html
    > ![image](https://hackmd.io/_uploads/rJ48WPDBR.png)
    > 
    > ![image](https://hackmd.io/_uploads/HJVObvDBR.png)
    > 
    > ![image](https://hackmd.io/_uploads/ryQhMPvHC.png)

- Explorando atividades anteriores no Sesc:
    - https://hackmd.io/@villares/sesc-quadrinhos-prog
    - https://hackmd.io/@villares/prog-ilustra

- Passar para o módulo da pessoa
    - duas cores
    - largura
    - desenho com animação OU recorte de imagem
    


- Orientação a objetos com partículas:
    ```python
    # Código usando py5 no estilo "imported mode"
    # consulte https://abav.lugaralgum.com/como-instalar-py5/

    particulas = []

    def setup():
        size(500, 500)
        for _ in range(50):
            p = Particula(100, 100)
            #particulas.append(p)
        background(0)
        no_stroke()
        color_mode(HSB)

    def draw():
        background(0)
        for p in particulas:
            p.update((mouse_x, mouse_y))
        print(len(particulas))

        for p in reversed(particulas):
            if p.diametro < 1:
                particulas.remove(p)


    class Particula():

        def __init__(self, x, y):    # "dunder init"
            self.x = x
            self.y = y
            self.vx = random(-2, 2)
            self.vy = random(-2, 2)
            self.diametro = random(10, 20)

        def update(self, pos):
            self.move()
    #         if dist(pos[0], pos[1], self.x, self.y) < self.diametro / 2:
    #             fill(255, 0, 0)
    #         else:
    #             fill(255)
            self.desenha()
            self.diametro *= 0.95


        def desenha(self):
            fill(self.diametro * 5, 255, 255)
            circle(self.x, self.y, self.diametro)

        def move(self):
            self.x += self.vx
            self.y += self.vy
            r = self.diametro / 2
            if self.x > width - r:
                self.x = -r
            if self.x < -r:
                self.x = width - r
            if self.y > height - r:
                self.y = -r
            if self.y < -r:
                self.y = height - r

    def mouse_dragged():
        particulas.append(Particula(mouse_x, mouse_y))


    ```

## Encontro 5 de junho

Dando andamento a esta [proposta de trabalho](#Proposta-Melisso-coletivamente-adotada), a página com o markdown do zine para nossa edição: https://hackmd.io/@villares/markdown-programazine

TODO:
- Precisam estar locais as imagens pro nosso script markdown-to-pdf funcionar... estudar como baixar fácil do hackmd...
    - ver também se tem fácil como baixar o "markdown raw" do HackMD sem ter que usar a API com access tokens e toda a burocracia.

- Precisamos pensar sobre o pôster...
- Ale vai escrever sobre Prog. Criativa e Python + eletrônica
- Melisso: reticulas 
    - https://github.com/villares/sketch-a-day/tree/main/2024/sketch_2024_03_06
    - https://github.com/villares/sketch-a-day/tree/main/2024/sketch_2024_03_07
    - https://hackmd.io/@villares/sesc-reticula


## Encontro dia 28 de maio



Perdemos o css do encontro passado :(

Lembro vagamente que as fontes eram um problema, essa lib deve usar por baixo dos panos PyMuPDF, por isso acho que devíamos olhar esse pacote de fontes aqui: https://pypi.org/project/pymupdf-fonts/

- Vamos testar estes CSSs:
    -[milligram.css](https://github.com/milligram/milligram/blob/main/dist/milligram.css)  * estamos usando este!
    -[simple.css](https://github.com/kevquirk/simple.css/blob/main/simple.css)

- Ideia de zine "geralzão"
    - Falar das outras atividades no Sesc com Python
        - biblioteca que o Ale usa: https://abav.lugaralgum.com/como-instalar-py5
    - https://hackmd.io/@villares/desenhando_sesc
    - https://hackmd.io/@villares/sesc-quadrinhos-prog-5
    - hackmd.io/@villares/prog-ilustra
    - https://github.com/villares/sketch-a-day/tree/main/2024/sketch_2024_03_06 Ada
- https://github.com/villares/sketch-a-day/tree/main/2024/sketch_2024_03_07 Ada

#### Proposta Melisso (coletivamente adotada):

    - Sobre: SESC ETA
    - Sobre: Programaçao Criativa
    - Sobre: Thonny + py5
    - Exemplo: Quadrinhos (balão de fala)
    - Exemplo: Reticulas
    - Exemplo: Edição de Imagens
    - Exemplo: Python com microcontrolador
    - Créditos: pessoas que participaram da zine
    - Pôster grande no verso

- Página com o markdown do zine para nossa edição: https://hackmd.io/@villares/markdown-programazine



## Encontro dia 22 de maio

- Transcrição das funções embutidas https://hackmd.io/@sesc-av-paulista/python-builtins
- Mars Lee quadrinhos sobre contribuir com NumPy:
    - Online https://heyzine.com/flip-book/3e66a13901.html#page/4
    - PDF https://nyc2023.pydata.org//media/cfp/submissions/MTUFNQ/resources/how-to-contribute-to-numpy-comics-pydata-nyc-mars-lee_rFJwlfz.pdf
    - Palestra dela https://www.youtube.com/watch?v=Gv_Ea94wquM&ab_channel=PyData
- Link para app de tirinhas do Nick Tolervey
    -  original em inglês: https://pycomic.github.io/
    -  app traduzido para pt: https://webtiras.github.io/pycomic/


- Link sobre utilitario python que converte markdown para pdf

    https://dev.to/vb64/converting-markdown-to-pdf-in-python-5efn

```python=
from pathlib import Path

# pip install markdown-pdf (depende de pyMuPDF)
from markdown_pdf import MarkdownPdf, Section

PAGE_BREAK = '---' 
# se você precisar de uma linha horizontal, e não quebra de página, use <hr>
entrada_md = Path('zine.md')
TITLE = 'Zineeeeeee!'
CSS_FILE = 'milligram.css'
OUT_FILE = 'zine.pdf'

try:
    css = Path(CSS_FILE).read_text()
except :
    print('Não carreguei o arquivo CSS')
    css = ''

pdf = MarkdownPdf(toc_level=2)

with open(entrada_md, 'r', encoding='UTF8') as entrada:
    paginas = []
    pagina_atual = ''
    for linha in entrada.readlines():
        if linha.strip() != PAGE_BREAK:  
            pagina_atual += linha
        else:
            paginas.append(pagina_atual)
            pagina_atual = ''
    paginas.append(pagina_atual)
    for p in paginas:
       pdf.add_section(Section(p, toc=False), user_css=css)

pdf.meta["title"] = TITLE
pdf.save(OUT_FILE)
```



## Encontro dia 15 de maio

- Ideias propostas a partir do encontro anterior:
    - Escrever um zine sobre desenho com Python em markdown
        - inspirado na referência rápida https://github.com/villares/processing.py-cheat-sheet/tree/pt-br
        - Podemos fazer novos desenhos, inclusive analógicos!
    - Preparar um procedimento ou uma ferramenta para converter automaticamente markdown em PDF
        - Testei com **pandoc** e funcionou (mas não sei arrumar os estilos/css)
            - Instalei no Windows https://pandoc.org/installing.html
            - Instalei no Windows https://miktex.org/download (LaTeX/PDF support)
            - Na linha de comando do Windows: `pandoc input.md -o output.pdf`
            - Não sei como controla as quebras de página
    - Usar o script que já temos que faz "imposição" (mover e girar as páginas) para o formato tradicional de zine

- Conversor on line de .md para Pdf:  https://products.groupdocs.app/pt/conversion/md-to-pdf

- Exemplo de arquivo Markdown: 
        - Criamos um arquivo de texto simples e salvamos com a extensão md ( markdown).

----------------------------------------

# Funcoes embutidas

O interpretador de Python possui varias funcoes embutidas
e tipos embutidos que sempre estao disponiveis.

A seguir listamos todas as funcoes em ordem alfabetica.

## Funcoes embutidas.

### A ###
 
abs()

aiter()

all()

anext()

any()

ascii()

-------------------------

- Geramos um pdf a partir do exemplo acima usando pandoc no terminal do linux código : `pandoc  entrada.md -f markdown -t pdf -s -o saida.pdf´
![cheat02_page-0001](https://hackmd.io/_uploads/BkUELFGmR.jpg)


## Encontro dia 8 de maio

### Algumas ideias para explorar

- Zines sobre tecnologia da Julia Evans https://wizardzines.com
    - ![image](https://hackmd.io/_uploads/rkcGN1FfA.png)

- Desenho()
    - ![image](https://hackmd.io/_uploads/rkxRFmFG0.png)
   - ![image](https://hackmd.io/_uploads/BJ90KXtM0.png)

- Tecniquim
    - https://tecniquim.itch.io/tecniquim-0x00

### Ideias para zines:
-  **ffmpg** 
    -  hackmd.io/@sesc-av-paulista/ffmpg

- Aprendendo/Ensinando Python
    - ![grupo_de_estudos](https://hackmd.io/_uploads/rJl-t7YMC.svg)

    - **Python built-ins** ![image](https://hackmd.io/_uploads/SkACvkYGA.png)

    - **Palavras reservadas do Python**
        ![image](https://hackmd.io/_uploads/SkGrtkFf0.png)

#### Desenhando com Python

- Colinha do py5 
    - ![image](https://hackmd.io/_uploads/S165YmFfC.png)
    - ![image](https://hackmd.io/_uploads/SySiFXKGC.png)

- https://github.com/villares/Paper-objects-with-Processing-and-Python
        - ![sketch_190509a](https://hackmd.io/_uploads/B1jvKXYfC.gif)


 


### Criação e manipulação de PDFs com Python


#### Script que faz a re-ordenação das páginas de um PDF

![image](https://hackmd.io/_uploads/SkcAL3fzR.png)

- [Script que converte arquivo de várias páginas num A3](https://gist.github.com/villares/0402a1c9033e6f4baf55554c16d25f4e)
    - Precisa instalar a biblioteca `PyMuPDF`
    - Funciona na linha de comando
    - No Thonny funciona com o campo *Program Arguments*
        - ![image](https://hackmd.io/_uploads/HJQqU2fGR.png)

#### Criando PDFs com Python

- [Gerando PDFs de várias páginas com a biblioteca py5](https://gist.github.com/villares/f99229fd8a3c7b8c51d8b480c93f19ad#file-multiple_page_pdf_py5_imported_mode-py)
    - Precisa [instalar a biblioteca py5](https://abav.lugaralgum.com/como-instalar-py5/)
  - Tem exemplo *imported mode* para rodar no Thonny com plug-in ligado, e exemplo *module mode* para rodar com o plug-in desligado.
  - Tem que apertar 's' para o sketch salvar o PDF!

#### Mais manipulação de PDFs

- [Overlay: usando um PDF sobreposto em várias páginas de outro](https://gist.github.com/villares/f99229fd8a3c7b8c51d8b480c93f19ad#file-multiple_page_pdf_py5_module_mode-py)
- [Mais ainda sobre manipulação de PDFs com Python!](https://hackmd.io/@sesc-av-paulista/estudos-em-python-14-maio)


### Produção dos participantes

- Cole aqui as suas imagens!