User:Jacopo/Prototyping

From XPUB & Lens-Based wiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

↪Prototyping



The Analytical Engine has no pretentions whatever to originate anything. It can do whatever we know how to order it to perform. – Ada Lovelace (1843)

First Trimester

Let's start

Morning Journey inside some individual experiments.
> Il Pleut Bot (from Federico)

import random

width = 10
height = 10
drops = [',','    ','    ','     ']
rain = ''

for x in range(width):
    for y in range(height):
        rain += random.choice(drops)
    print(rain)
    rain = ''

> Responsive Form (from Louisa)

print('Enter your name:')
name = input()
print('Hello, ' + name + ". Are you ready to choose your own adventure? If yes, Type one of these words to kickstart the engine: hot, yellow, bright")<br>

> Differences between LOOP and WHILE
> Differences between FLAT LOOP and NESTING LOOP

Punchedcard.png

PIL

The Python Imaging Library (PIL) adds image processing capabilities to your Python interpreter. This library provides extensive file format support, an efficient internal representation, and fairly powerful image processing capabilities. It should provide a solid foundation for a general image processing tool.

Blending two images: Blendprocess.png

Image.blend(use1.convert("RGBA"), use2.convert("RGBA"), 0.5)
#The two images must have the same mode and size

NOTEBOOK of the day: https://git.xpub.nl/XPUB/S13-Words-for-the-Future-notebooks
PAD of the day: https://pad.xpub.nl/p/2020-09-30-prototyping

NLTK

import nltk
import random

lines = open('./language.txt').readlines()
sentence = random.choice(lines)
print(sentence)
Neocapitalism has also discovered some advantages in large scale. Day and night it talks of nothing but city planning and national development. But its real concern is obviously the conditioning of commodity production, which it senses escaping it unless it resorts to this new scale. Academic urbanism has accordingly defined slums from the standpoint of postwar neocapitalism. Its techniques of urban renewal are based on sterile, antisituationist criteria.
tokens = nltk.word_tokenize(sentence)
print(tokens)
['Neocapitalism', 'has', 'also', 'discovered', 'some', 'advantages', 'in', 'large', 'scale', '.', 'Day', 'and', 'night', 'it', 'talks', 'of', 'nothing', 'but', 'city', 'planning', 'and', 'national', 'development', '.', 'But', 'its', 'real', 'concern', 'is', 'obviously', 'the', 'conditioning', 'of', 'commodity', 'production', ',', 'which', 'it', 'senses', 'escaping', 'it', 'unless', 'it', 'resorts', 'to', 'this', 'new', 'scale', '.', 'Academic', 'urbanism', 'has', 'accordingly', 'defined', '“', 'slums', '”', 'from', 'the', 'standpoint', 'of', 'postwar', 'neocapitalism', '.', 'Its', 'techniques', 'of', 'urban', 'renewal', 'are', 'based', 'on', 'sterile', ',', 'antisituationist', 'criteria', '.']

It's important to realize that POS tagging is not a fixed property of a word -- but depends on the context of each word. The NLTK book gives an example of homonyms -- words that are written the same, but are actually pronounced differently and have different meanings depending on their use.

text = nltk.word_tokenize("They refuse to permit us to obtain the refuse permit")
nltk.pos_tag(text)
[('They', 'PRP'),
 ('refuse', 'VBP'),
 ('to', 'TO'),
 ('permit', 'VB'),
 ('us', 'PRP'),
 ('to', 'TO'),
 ('obtain', 'VB'),
 ('the', 'DT'),
 ('refuse', 'NN'),
 ('permit', 'NN')]

ASCII Canvas

width = 10
height = 10

# Simple fill-up of a page, to set the reach of our canvas
lines = [] # All the lines will be stored here

for linenumber in range(height):
    line = '▄︻┻═━一' * width
    lines.append(line)

print('\n'.join(lines))
▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━
▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━
▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━
▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━
▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━
▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━
▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━
▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━
▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━
▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━▄︻┻═━


width = 20
height = 20
line = ''

for y in range(height):
    
    # here i collect all the characters for one line
    for x in range(width):
        
        # check if the line "number" is odd or even
        # to do this, you can use the "%", called the "modulo"
        if y % 2 == 0:
            line += '♫♫♫'
            line += '   '
        else:
            line += '   '
            line += '♪♪♪'
            
    # print & reset
    print(line)
    line = ''
♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   
   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪
♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   
   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪
♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   
   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪
♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   
   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪
♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   
   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪
♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   
   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪
♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   
   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪
♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   
   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪
♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   
   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪
♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   ♫♫♫   
   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪   ♪♪♪
# Another way to fill-up the page
import random 

lines = []

txt = open('./language.txt', 'r').read()
words = txt.split()

for linenumber in range(height):
    word = random.choice(words)
    length_of_word = len(word)
    nr_of_words_fit_in_line = width / length_of_word
    line = word * int(nr_of_words_fit_in_line)
    lines.append(line)
    
print('\n'.join(lines))
postwarpostwarpostwarpostwarpostwarpostwarpostwarpostwarpostwarpostwar
ititititititititititititititititititititititititititititititititititititit
scale.scale.scale.scale.scale.scale.scale.scale.scale.scale.scale.scale.
slums”“slums”“slums”“slums”“slums”“slums”“slums”“slums”“slums”“slums
ButButButButButButButButButButButButButButButButButButButButButButButButBut
sterile,sterile,sterile,sterile,sterile,sterile,sterile,sterile,sterile,
criteria.criteria.criteria.criteria.criteria.criteria.criteria.criteria.
unlessunlessunlessunlessunlessunlessunlessunlessunlessunlessunlessunless
isisisisisisisisisisisisisisisisisisisisisisisisisisisisisisisisisisisisis
ititititititititititititititititititititititititititititititititititititit
ButButButButButButButButButButButButButButButButButButButButButButButButBut
nationalnationalnationalnationalnationalnationalnationalnationalnational
postwarpostwarpostwarpostwarpostwarpostwarpostwarpostwarpostwarpostwar
DayDayDayDayDayDayDayDayDayDayDayDayDayDayDayDayDayDayDayDayDayDayDayDayDay
ititititititititititititititititititititititititititititititititititititit
ofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofof
ofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofof
ononononononononononononononononononononononononononononononononononononon
isisisisisisisisisisisisisisisisisisisisisisisisisisisisisisisisisisisisis
ititititititititititititititititititititititititititititititititititititit
whichwhichwhichwhichwhichwhichwhichwhichwhichwhichwhichwhichwhichwhichwhich
neocapitalism.neocapitalism.neocapitalism.neocapitalism.neocapitalism.
basedbasedbasedbasedbasedbasedbasedbasedbasedbasedbasedbasedbasedbasedbased
antisituationistantisituationistantisituationistantisituationist
commoditycommoditycommoditycommoditycommoditycommoditycommoditycommodity
ititititititititititititititititititititititititititititititititititititit
newnewnewnewnewnewnewnewnewnewnewnewnewnewnewnewnewnewnewnewnewnewnewnewnew
butbutbutbutbutbutbutbutbutbutbutbutbutbutbutbutbutbutbutbutbutbutbutbutbut
advantagesadvantagesadvantagesadvantagesadvantagesadvantagesadvantages
neocapitalism.neocapitalism.neocapitalism.neocapitalism.neocapitalism.
defineddefineddefineddefineddefineddefineddefineddefineddefineddefined
ititititititititititititititititititititititititititititititititititititit
tototototototototototototototototototototototototototototototototototototo
concernconcernconcernconcernconcernconcernconcernconcernconcernconcern
basedbasedbasedbasedbasedbasedbasedbasedbasedbasedbasedbasedbasedbasedbased
ititititititititititititititititititititititititititititititititititititit
standpointstandpointstandpointstandpointstandpointstandpointstandpoint
slums”“slums”“slums”“slums”“slums”“slums”“slums”“slums”“slums”“slums
ofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofof
criteria.criteria.criteria.criteria.criteria.criteria.criteria.criteria.
ititititititititititititititititititititititititititititititititititititit
resortsresortsresortsresortsresortsresortsresortsresortsresortsresorts
production,production,production,production,production,production,
conditioningconditioningconditioningconditioningconditioningconditioning
discovereddiscovereddiscovereddiscovereddiscovereddiscovereddiscovered
basedbasedbasedbasedbasedbasedbasedbasedbasedbasedbasedbasedbasedbasedbased
sterile,sterile,sterile,sterile,sterile,sterile,sterile,sterile,sterile,
basedbasedbasedbasedbasedbasedbasedbasedbasedbasedbasedbasedbasedbasedbased
ininininininininininininininininininininininininininininininininininininin
postwarpostwarpostwarpostwarpostwarpostwarpostwarpostwarpostwarpostwar
slums”“slums”“slums”“slums”“slums”“slums”“slums”“slums”“slums”“slums
butbutbutbutbutbutbutbutbutbutbutbutbutbutbutbutbutbutbutbutbutbutbutbutbut
ititititititititititititititititititititititititititititititititititititit
ofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofofof
thisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthis
nightnightnightnightnightnightnightnightnightnightnightnightnightnightnight
planningplanningplanningplanningplanningplanningplanningplanningplanning
sensessensessensessensessensessensessensessensessensessensessensessenses
nationalnationalnationalnationalnationalnationalnationalnationalnational
commoditycommoditycommoditycommoditycommoditycommoditycommoditycommodity
scale.scale.scale.scale.scale.scale.scale.scale.scale.scale.scale.scale.
thisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthisthis
planningplanningplanningplanningplanningplanningplanningplanningplanning
defineddefineddefineddefineddefineddefineddefineddefineddefineddefined
isisisisisisisisisisisisisisisisisisisisisisisisisisisisisisisisisisisisis

Exporting with ReportLab – https://www.reportlab.com/

from reportlab.pdfgen.canvas import Canvas
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import mm

pagewidth = 210*mm
pageheight = 297*mm

c = Canvas("ASCII-canvas-to-PDF.new.pdf", pagesize=(pagewidth, pageheight), bottomup=0)
c.setFont('Courier', 12)

start_y = 10*mm # start position of the lines

y = start_y
lineheight = 4*mm

if multipage == True:
    for page in pages:
        for line in page:
            c.drawCentredString(pagewidth/2, y, line)
            y += lineheight
        c.showPage()
        y = start_y
else:
    for line in lines:
        c.drawCentredString(pagewidth/2, y, line)
        y += lineheight
    
c.save()

Making an ASCII art PDF using aalib, PIL, and reportlab

from PIL import Image
from urllib.request import urlopen
import aalib

#f = urlopen("Pongie.Undisciplined.Map.jpg")
im = Image.open("Pongie.Undisciplined.Map.jpg")
screen = aalib.AsciiScreen(width=200, height=160)
resized = im.convert("L").resize(screen.virtual_size)
screen.put_image((0, 0), resized)
lines = screen.render().splitlines()

from reportlab.pdfgen.canvas import Canvas
from reportlab.lib.pagesizes import *
from reportlab.lib.units import mm
from reportlab.pdfbase.ttfonts import TTFont, pdfmetrics

c = Canvas("setyourname.pdf", pagesize=A2, bottomup=0) 
fontpath = "mplus-1m-regular.ttf"
font =  TTFont('1mregular', fontpath)
pdfmetrics.registerFont(font)
c.setFont('1mregular', 14.4)

start_y = 0*mm
y = start_y
lineheight = 4*mm

for line in lines:
    c.drawString(2*mm, y, line)
    y += lineheight

c.save()

Quilting

Today's Goal: Making a A0 Quilt using different patches from XPUB1 Student.
We refer to Patch both as digital and physical part of the Quilt. In the early computer era, the Patch was a set of changes for a computer programme. To update, fix or improve the programme, new paper tape or punched cards were replacing the wrong segment, after being literally cut off.

Physical patches used to correct punched holes by covering them. (1944)

PAD of the day: https://pad.xpub.nl/p/XPUB1_ONLINE_07_10_2020

Editing an image with: aalibb library
> http://aa-project.sourceforge.net/aalib/

#Patch 2
from PIL import Image
from urllib.request import urlopen

f = Image.open (urlopen("https://here's the link"))
g = f.convert("1") #for b&w
g.save ("bw.png") #to save a new copy 

import aalib
screen = aalib.AsciiScreen(width=82, height=74) #size of the canvas
h = f.resize(screen.virtual_size).convert('L',dither=Image.NONE)
screen.put_image((0, 0), h)
print (screen.render())
from PIL import Image
from urllib.request import urlopen

f = Image.open (urlopen("https://2xawx0gmudy471po527lbxcd-wpengine.netdna-ssl.com/wp-content/uploads/2016/02/shutterstock_376367317-604x400.jpg"))

import aalib
screen = aalib.AsciiScreen(width=82, height=40) #size of the canvas
h = f.resize(screen.virtual_size).convert('L',dither=Image.NONE)
screen.put_image((0, 0), h)
print (screen.render())


WWBWBk6.)?!\WWBWWBWWBWWBWWBWWmr"'<ZwmWWBWWBWWBWWd()zS3XBWWBWW#???L]WWWBWWBWdf+2a2q
WmBBBWmWaa.4mBmWmBmBBmBBBmWmmmWQwmBmBBmWmBBmBBm#m[+oJSqmm4Wm'a'+WaWmWmBBmW#o3a-"4J
WmWmW#???J\]WTmmSmd#DmWmWBBBWBBmmWmWF"??gZBWBWBQnV/""{jWWwYwdadQBmmWmBB#WmW12c.]WW
WmPBB\]])jQWf!.-?ZZ##UdDmWmWmWmWBBBLmmm/)mW#BmBm12(.]WWmmmBBWBWWmWP?[/\y6]BkoX )BB
WmmaamgmBWBP=Jmma"  !!##hZBBBBBBBBWBmX3m,j#ZWBWBZSn ]WmWWBWmBBBm[u'^\ajWmWmW12; 4W
WmWmmBBBBBB[#haA#[aac  !4#m#BWmWmg]mXqm#[J##mmBBmvS, $mWmBmWBWmWL"$W$WWWmWmWm2X, $
4W9XU#WmWmWmD####ummmWa, "Z#ZmWmWZ]mWZ!{/.]#hBWmBEno.-WmWmWmWmWm?,<.)w4WmWmBmz2a -
_`o2123BBWmWmmgmmBWBWmWBa.J<mZWm()$mWmWWW/ $#dWmWm22s "VmZVU4BBLi|i);j|)WmWBWm22o,
3 X}moSmWmWmWBBmWmWmBBBBP<as )dW_mJWmWmmB6.]#ZmWmWmp2s .=XnnX$Bk|)k|;]+|)$mBBBWuS2
d:4n2S^WmWmWmBWP#"?#$BWm3#FX#,<D;<mWmWmWBW +##mWmWmW2S2Y)2?FoXmm=|=|;- <|)$mWmWBm1
g5,:!<jWBBBBBW###mc:QmBB3U6{m[+A)WmWmWmWmB, ##BBBBWmBwoX.{2nS>WmWwwamQ, \|)BBWmBmQ
Wmmma:WWmWmWmB6#L%m,jS$mmX##Z<LaaBWmWmWmWB' m#WmWmBBWmmZ6:"!\jWmWmmBBmW/ +|)WmWmWm
?!,/a(mmWmWmWBW#Lm#'y#mmBW6ajWBmWmBBBBBPme u##BBBWBBBBBmQdQa"mWmWmWmWBBB:-%|$mBWmW
a!aa#$BWP?BWmBmmF!'/dmEmWmBWBBBWmWmWmW6m#mL:5ZWmWmBWmWm??e:J'WmWmWmWmWmWL.:|)Wm/W?
BmP1||.'<(DmWBWmBmg ]mkmWmWmBWmWmWmWmWU#CJm;jXBWmW4B]mF/(aw#WWBBBBBBWmWmW =||BWBwW
WB%|a+i.4a)]BmWmWBW )#2WmWmWEF=_]4WmWmD#md#.]WmBBB(mmadWmBmmWmBWmWmWmBm!_=)w|3mBBm
Wm>|)=i.%W7<)WmWmWm ]#CWmWmCP_|i|{WmWmBd!!`jmY[/wawWmWmWmWBWmWmBWmWmWmE|||(-k]WBWB
Wmc<|>~<$mmaZ4BBBBF ]#mWmWDjf=|yziBBBWmBmm,Z<_<aBm'r#4mWmWmWmWmWmWmWmWC|m>|-kmBBmW
WmW6 <)tdWmBm[WmWm[ m#XWmBL|k-|||jmWmWmWBW6LmW#6%']6'\Y4WmWmWmWmWmWmWmk|+|;<5mBWmW
WmW( /ismWmWmwPT?Y _mZBBBWC|]i%=wmmWmWmWmBBWmm###6 9QJ)/9mBBBBBBBBBBBBmw%samWmWmWm
Wm( _||mWmWmW\##m/\$#$mWmBL|| :WmmBBBBBBWmWmW]mmJ# j4BmWm7mWmWmWmWmW#WmWmBmBmWmWmW
B' ;|>dWmWmW#mm3#h-@ZmBBWmW+|, WmWBWmWmWmWmWmJmddP.JmBBmWLWmWmDU_7?'j]WmWmWmBYY$mB
 .=|>yWmWmWmmmmm#[_EmmWmWmWc|; 4WmWmWmWmWmWmWWw??_JWmWmWmWmWmWv23S()m)/$mWZ||=|=Y?
_i|vmWmWmWmWBJ!!!.JmmWmWmWm6|) "WBBBBBBWmWmWmmWm[ m#XWmWmWmBBho({or.mL)a$m<|)z|>__
||wWmWmBBBBBmBm/]qB??4Wm]WmWc|= ]WmWmWmBBBBBBWmW( ##mBBBWmWmWg2222'j4Wc-4BF<|i~:J|
wmBmWmWmWmWBWBW[Pa_(Z<dwdWmWm<|, )_i|]$mWmWmWmWm _mhBBWmWmWmWm6}^_wCmWmB6]W%/_wJ||
WmWBW4mmPWmWmBmQdmwmmmWmWmWmB6||3 isr|]WmWmWmWm( Jm$mWmWmWmWmBB'.o23WmWmPjBm6waadB
WmWmd#S#m"BBBWmmBWmW?4D?BBBBWBg|L.i=\+)WBBBBBWP )#DmBBBBBBBBBW[ =X2WBWmWmWmWWmWWBW
WmB[mZ\Xm-!{?BWBWmWm k'\tcP?BBm6j/=<|/\Wm$mZa? _WZWmWmWmWmWmW" _XemmWmWm4###m4WmBm
WmWm"W#m!.m{JWmWmD!~-YWmaaJB/WBWWm=% jWBAZ44Z am#qmBmUo2s4mP'.Jo2dWmWmBZ4#mq#LmBWB
WP?'`/..s3@_/QWmBJn2d,]W#mBW\WB?????c4WB#6udF.W#mmBBoorz2(, _dn2mBWmWmWC:4hd#'QmBB
   ajmW@mm[?9WmBfo(4o(.k$mWmJ??/[('madWm7??! y#m#mWm{XGor~LXXoSmmBBBBWmW5,.!`7-  -
mBm##$qmBW[]w#BWmXoJ2(<5dWmWmWWmBBWWmBBmm6a_VmdWmWmBL"!':yoSqdWmWBWmWmWmm$BHh##waw
$#mdWmWmWmBf#BBmBm}}"/!ooWmWmWm?wwwZmWmWWmmWmBWmWmWmBme3HvmdBWmWmWmB#YYYYYmmZVZ#ZY
BmWmWm?9mWY\WBWBWmmWW[ oS3WmWmfd#S##JBWmBWBBWm#m#4WmWmWmBBmWBmWmWTY=i|<w??\WmBWmWB
W9as/'j\P4mWBBmWmWmWm[ )o$mPa,.4mzd#LWmWmBBBPdmY#m4BBWmWmWBBBW#Y+||>~-7__=<-$mWmBB
6#2Sm;]6]%4WmWBBBBBBB[ )odWBa4w ?#Z?jmWmWmWBFmLJW#+mWPsWmWmWmY=||" . __|s=c)]WmWmW
]#<h#(]WL)\WmWmWmWmWmf.)ommL-]h6asa)  ??????\!##!'w#B[WmWmWZ(|>` _aBWWz||T(|jWmWmW
2###7.ZWWLa%$mWmWmWmW[ o2dWZo(mWwvm#6as.    _ac_aJwmWmJ4mWZ<w< _jWBBBmmawawdWBWmWm
Wa}.wJdBBWBW]BBBBBP?Y-.S2dWma_QmWm6BX#U##mmmBmq#3mWBWZ) WD7(  'WmWmWmWWmmBmWmWmWmW

Links

Check-in:
> https://www.effbot.org/imagingbook/pil-index.htm
> https://pillow.readthedocs.io/en/stable/

Library Sources to work with Images and ASCII:
> http://aa-project.sourceforge.net/aalib/
> http://jwilk.net/software/python-aalib