Text

Proposta #03: Interfaces — Grow Your Meme

Na última aula, dedicámo-nos a um olhar sobre a cultura online, com particular atenção para os memes que nascem e se espalham pela Internet, desde o All Your Base até ao Advice Dog. Estas manifestações criativas destacam-se normalmente pela simplicidade de meios e da mensagem, ganhando no entanto uma vida e complexidade próprias à medida que vão sendo apropriadas, re-interpretadas, re-misturadas e redistribuídas. Outro factor determinante é a relação entre texto e imagem, que pode ir desde a simples legenda até ao non-sense. Esta tensão entre significados traz à memória o trabalho de artistas como Barbara Kruger.

Vimos também que a disseminação destes memes deve muito à existência de ferramentas online, como o Meme Generator, que permitem a criação rápida de imagens por parte de quem não domine (ou não veja necessidade de utilizar) as ferramentas tradicionais de edição gráfica.

A última proposta do semestre consiste em criar um mini-MemeGenerator, com recurso ao comando var() para criar um pequeno interface que permita editar e experimentar várias possibilidades, tanto para a imagem como para o texto. A natureza da imagem a ser criada é livre, mas deve ser tornada clara num parágrafo ou dois acerca da vossa ideia. As únicas premissas técnicas exigidas nesta proposta são:

  • O uso de texto nas imagens criadas
  • Pelo menos 3 elementos controláveis no interface gerado pelo var(). Mas quanto mais, melhor. O conteúdo do texto pode — e deve — ser um desses elementos.

A ideia não é copiar a lógica “tradicional” de memes como o Advice Dog, mas sim adaptar o que vimos a uma abordagem de designer que saiba dar evidência a uma perspectiva crítica com significados novos, à volta da matriz que vimos de imagens simples com texto claro, e com vários géneros de mensagem, significado e relação texto-imagem.



Assim sendo, algumas perguntas a que importa dar resposta antes de pegar no computador:

  • A primeira pergunta terá de ser qual o tema e significado do trabalho. Como de costume, escrever um parágrafo ou dois sobre qual é a base conceptual do trabalho ajuda imenso a cristalizar as ideias.
  • Que pormenores gráficos e conceptuais valem a pena aproveitar dos memes que vimos na aula? E quais será preferível deixar de fora?
  • Como tratar a tipografia? Vimos que é frequente o uso de tipografia a branco com contorno preto, já que desta forma pode ser colocada sobre qualquer imagem sem problemas de contraste (apesar de não ser particularmente bonito, especialmente com a Impact). Como vai ser a vossa? Será que a natureza da vossa ideia vos dá pista sobre as estratégias tipográficas a que podem recorrer?
  • Usar imagens originais ou apropriadas?

Quanto à concretização técnica, é esperado que sejam colocados no vosso Tumblr exemplos de resultados do vosso gerador, bem como o seu código-fonte. Isto deverá ser feito até às 23:59 de 24 de Janeiro (turma de 4ª) ou 26 de Janeiro (turma de 6ª).

Referências:

Nota técnica para quem usa Windows: Para quem não esteve na última aula, vai ser necessário o download da nova versão do Spryte para poder utilizar o comando var(). Poderão encontrar alguns bugs, que agradeço que me enviem via e-mail para que possam ser devidamente esmagados.

Text

In the beginning…was the command line

Em Janeiro, vamos dar atenção à teoria dos media digitais.

Para isso, vamos ter um livro de leitura obrigatória. Em cada aula será indicada uma parte do livro para ler, e na aula seguinte discutiremos em conjunto os assuntos abordados.

Podem encontrar o livro gratuitamente aqui, em formato de texto. É recomendado imprimir para não depender do computador para ler.

Em alternativa, e uma melhor opção, é encomendar o livro. Podem encontrá-lo no Book Depository, que é um site de venda de livros com a enorme vantagem de ter os portes de envio grátis. Caso prefiram esta opção, é melhor fazer a encomenda quanto antes, já que costuma demorar umas 2-3 semanas a chegar.

Na última aula de Dezembro vamos falar melhor das linhas gerais do livro e sobre como vamos dividir os capítulos em cada aula.

(Para quem ainda está a terminar a segunda proposta, não se preocupem com isto para já e concentrem-se em cumprir o prazo de entrega. Na próxima aula vamos falar disto em pormenor.)

Text

Exemplo: Uma forma de fazer maquetes

Uma das fases da 2ª proposta é executar uma maquete que nos permita ver como resulta a combinação dos diferentes elementos que desenhámos, para que possamos fazer ajustes antes de exportar cada parte para importar no Nodebox ou no Spryte.

Recorrendo a um exemplo simplicíssimo esboçado em 30 segundos, começaríamos por desenhar as partes:

Esta imagem é o resultado de uma foto tirada com o telemóvel, importada para o GIMP, tendo sido aplicado um filtro ‘threshold’ para (neste caso) trabalharmos apenas a P&B.

De seguida, dividimos a imagem em layers, para depois sobrepormos todas as partes para assegurar que estão todas alinhadas como deve ser. Aqui, usei também a ferramenta “Color to Alpha” no GIMP para que cada layer se torne transparente, sendo apenas visível o traço preto. No vosso caso, talvez queiram considerar que partes de cada layer devem ser transparentes.

Depois, sobrepomos todas as layers e acertamos a posição de cada uma, para todas elas ficarem no sítio certo. A partir daqui, só temos de ir vendo as diferentes combinações activando ou desactivando a visibilidade das layers, tal como no exemplo a seguir:

E a partir disto, já podemos ver perfeitamente como funciona a combinação das diferentes partes, e podemos limar arestas antes de passar para o Nodebox.

(Nota: a imagem é exemplificativa — não é parte da proposta criar um GIF animado ;-)

Para avançarmos para a fase final, só precisaremos de exportar cada layer como PNG (o melhor formato para preservar transparências), e depois fazer o nosso programa simples no Nodebox que importa certas imagens, sobrepondo-as para compôr a imagem final.

Naturalmente, o exemplo aqui presente é extremamente primário e serve apenas para ilustrar o processo técnico.

São livres de usar outro processo para criar as vossas maquetes, e caso o vosso computador vos abandone e se recuse a funcionar (como aconteceu com uma pessoa), podem também fazer a maquete manualmente com recurso a papel vegetal ou acetatos, para que possamos ver na aula como fica.

Finalmente, caso estejam a usar o Illustrator para desenhar as partes, cuidado com a parte de exportar para PNG: o Illustrator apenas vai exportar uma imagem com o tamanho da parte que estão a exportar, e isso fará com que as imagens fiquem desalinhadas ao importar no Nodebox. Para evitar isto, basta desenhar um rectângulo quase invisível (ex. stroke branco a 1%) à volta das formas, e o problema desaparece.

Bom trabalho!

Text

Como resolver a segunda proposta

Complementando o post relativo à segunda proposta de trabalho, aqui ficam alguns esclarecimentos e sugestões relativos à forma de concretizar o vosso trabalho.

Já terão notado que a parte central da proposta — a concepção e execução da vossa personagem/identicon — não implica o uso do Nodebox/Shoebot, que apenas será utilizado para combinar os desenhos e ilustrações das partes que vão constituir a personagem final. Isto é um aspecto importantíssimo da proposta: a ênfase está no vosso trabalho criativo de conceptualização, adequação às premissas da proposta e execução gráfica. A criação da aplicação geradora das personagens é apenas uma fase do trabalho.


Fase 1: Definição escrita do problema e da solução

É dada total liberdade na escolha dos materiais, abordagens estéticas e inspirações conceptuais, mas sempre tendo em mente o propósito do trabalho — o seu uso como identificação de comentários em blogs. A melhor forma de balizar rapidamente as especificações da vossa ideia é escrever um ou dois parágrafos sobre qual a ideia e qual o seu propósito. Tendo em conta as premissas da proposta, é igualmente importante responder à pergunta — para que tipo de blog vai servir esta personagem? Serve para um blog generalista ou dedicado a um tema em específico? Se sim, que tema? Não é exigido que o blog para o qual vão desenvolver o identicon exista realmente, mas o género e público para o qual vão apontar a vossa ideia devem ser tornados claros.

Fase 2: Ideias, referências e esboços

A partir da definição do âmbito da vossa proposta, é altura de fazer o brainstorm para encontrar ideias e direcções conceptuais e plásticas. É importante desenhar muito e refinar as ideias que vão aparecendo. Importa pensar como é que a vossa solução irá para além de uma simples mascote que muda de olhos e de boca. Quais são as referências conceptuais que dão origem à vossa ideia? Que género de desenho, traço e tratamento gráfico vão utilizar? Quais são os elementos que podem variar, e quais vão ser fixos? São questões que têm de ter a resposta definitiva nesta fase, antes de pegar no computador. Tudo isto deve ser documentado em esboços e desenhos que vão ser colocados no Tumblr.

Fase 3: Maquete

Depois de a ideia estar totalmente cristalizada em desenhos e esboços, e depois de já termos determinado quais vão ser as partes variáveis, bem como já termos desenhos de cada elemento nas suas variações, é altura de passar o desenho para o computador. A abordagem sugerida é utilizar o vosso editor de imagem bitmap (Gimp, Photoshop, etc.) para executar a vossa maquete:

  1. digitalizar os desenhos de cada parte, ou re-desenhá-los no programa 
  2. aperfeiçoar esses desenhos para a sua forma final, usando as ferramentas e efeitos que julgarem mais apropriados para chegar a algo visualmente interessante e pertinente
  3. colocar cada parte na sua camada/”layer”, por exemplo “olhos1”, “olhos2”, etc.
  4. activar e desactivar a visibilidade de cada camada para assegurar que os elementos estão colocados nas posições correctas, e que as combinações resultam.

Importa ter em conta que, visto que as nossas várias formas se vão sobrepôr, é preciso considerar as partes opacas e transparentes da imagem.
Também podem usar o vosso editor vectorial para esta fase.
Para ver como, na prática, este processo é feito, podem ver um post sobre como as personagens do Wavatar são criadas. A linguagem de programação que lá é utilizada (PHP) não foi abordada na aula, mas o que interessa é o processo de construção da personagem através dos vários elementos gráficos.

Fase 4: Aplicação

Depois da maquete estar terminada e satisfatória, e virmos que a combinação das partes funciona, vamos tratar de fazer a nossa aplicação para combiná-las automaticamente. Para isto, vamos gravar cada camada/layer da fase anterior em formato PNG (de forma a preservar as transparências), e utilizar o comando image() para colocá-las numa composição final. Já aprendemos todas as ferramentas necessárias para fazer esta aplicação:
- listas, para armazenar o nome dos ficheiros correspondente a cada parte variável
- choice(), para seleccionar aleatoriamente uma das várias possibilidades para cada parte
- image(), para colocar as várias partes seleccionadas com o choice()

Novamente: a colocação atempada no Tumblr de todas estas fases do trabalho — texto introdutório, esboços, maquetes e aplicação final — é obrigatória. A melhor maneira de arrumar esta questão é ir colocando à medida que vão fazendo, de forma a também poder haver feedback a tempo. Deixar a publicação da documentação para o fim não é, de todo, uma boa ideia.

Para tudo isto, têm neste momento menos de duas semanas e meia. Quanto mais rápido fecharem cada fase, mais tempo haverá para resolver problemas que possam surgir. Estou à disposição via e-mail (ricardo ARROBA sollec PONTO org) para vos dar feedback sobre as ideias e direcções que tiverem, mas para isso é preciso que o vosso processo já esteja documentado no Tumblr (nada de attachments).

Text

Proposta #02: Personagens modulares

[Imagem: Mr. Potatohead, um exemplo popular de uma personagem modular com várias possibilidades de combinação de diferentes características.]

A segunda proposta vai debruçar-se sobre o campo do design de personagens. Em contraste com a proposta anterior, esta proposta implica um briefing com algumas premissas técnicas e conceptuais que terão de ser consideradas na concepção e execução do trabalho final.

A proposta consiste em idealizar, esboçar e concretizar um sistema de geração de personagens a partir de módulos distintos. O objectivo deste sistema é servir como um Identicon.

Identicons


[Imagem: Uma versão actualizada do MonsterID.]

Um Identicon é um sistema de identificação de utilizadores em vários contextos, estando mais presente nos sistemas de comentários de blogs, como é exemplo o The Ressabiator. O Identicon é a tradução gráfica do endereço IP do utilizador, o que faz com que cada comentador/a tenha associado a si um ícone único, que o/a identifica visualmente sem necessidade de consultar o endereço de cada pessoa. Assim, torna-se imediatamente perceptível se um comentário foi, de facto, colocado pela pessoa que pensamos ter sido, ou por um impostor.

Existem vários exemplos de Identicons: o Identicon original, que utiliza uma grelha simétrica de motivos geométricos, o MonsterID e o Wavatar, que utilizam personagens para atingir o mesmo objectivo. Existe também um projecto — Combinatoric Critters — que embora não tenha como propósito servir de sistema de identificação, é outro bom exemplo de criação de personagens modulares.

No entanto, os três sistemas que recorrem a personagens são extremamente limitados do ponto de vista gráfico. É este o desafio: como farias um Identicon melhor? Como é que uma personagem modular pode ser mais ambiciosa do que uma forma geométrica com perninhas que muda de cor, de olhos e de sorriso? E como poderíamos integrar nas personagens que fazemos uma dimensão crítica, ou referências a determinadas questões que queremos ver enfatizadas? Ou será preferível enveredarmos por uma solução ‘neutra’?

Questões práticas

Importa apontar que, tendo em conta o objectivo deste trabalho, existem determinadas premissas. Por exemplo, usar o género masculino/feminino como possibilidade de variação da personagem não é boa ideia, visto que num sistema de comentários de blogs, é impossível determinar o género de cada comentador a partir do seu endereço. É fundamental ter este objectivo em conta quando estivermos a esboçar as primeiras ideias.

Por outro lado, não é pedido um sistema genérico que seja adequado a todo e qualquer tipo de blog. É totalmente aceitável criar uma personagem direccionada a determinado género de blogs, mas tal direcção terá de ficar explícita no início da proposta (ver mais abaixo).

Ao longo da proposta, serão colocados no Tumblr da disciplina vários exemplos e ajudas sobre como utilizar o Nodebox/Spryte/Shoebot para concretizar a proposta, bem como as especificações para o formato final a entregar.

Fases da proposta

Esta é uma proposta de trabalho complexa. Como já foi abordado na proposta anterior, é fundamental definir as fases do trabalho.

  1. Um ou dois parágrafos acerca do âmbito da proposta (se vai debruçar-se sobre um género específico de blogs, se vai tomar uma abordagem crítica ou sarcástica relativamente a uma determinada questão, bem como outras premissas).
  2. Esboços e desenhos que evidenciem a direcção estética que o trabalho final vai tomar;
  3. Maquetes realizadas num editor bitmap ou vectorial, com recurso a layers para visualizar as várias partes da personagem;
  4. Uma aplicação executada no Nodebox, Shoebot ou Spryte que crie uma personagem aleatoriamente de cada vez que é executada.


Todas estas fases são obrigatórias, e têm de ser afixadas no Tumblr de cada discente. Novamente, quanto mais rápido conseguirmos terminar cada uma, mais tempo teremos para limar arestas antes de chegar ao prazo de entrega.

O mínimo aceitável para esta proposta é um sistema que tenha cinco variações em cinco características (ex: cinco pares de olhos, cinco chapéus, cinco armas diferentes, etc.). Fica ao critério de cada discente determinar quais serão as características variáveis do seu sistema de geração de personagens.

A situação ideal será conseguir idealizar um sistema que tenha dez variações em seis características. Não é obrigatório, mas será valorizado em termos de avaliação. Além disso, está em aberto a hipótese de criarmos o nosso próprio serviço online de criação de identicons. Ou seja, há a possibilidade de ver o trabalho aplicado numa situação real, e para isso está colocado o desafio de fazer sistemas mais complexos do que o mínimo de 5x5.

Serão aqui colocadas brevemente mais informações e sugestões que ajudem a uma concretização satisfatória da proposta. Para já, tal como na proposta anterior, o melhor começo é ir para um local confortável com um bloco de notas à mão para começar a filtrar ideias.

Prazos

O código da vossa aplicação final, bem como um conjunto de exemplos dos resultados possíveis, deve estar colocado no vosso Tumblr até às 23:59 de segunda-feira, 13 de Dezembro.

Nota técnica

Nesta proposta é totalmente permitido (e encorajado) o uso de imagens executadas noutros programas para compôr a personagem final. Vamos usar as aplicações para aquilo que foram feitas: os nossos editores bitmap ou vectorial para realizar os desenhos, e o Nodebox/Shoebot/Spryte para combiná-los num resultado final.

Text

Índices de listas

Uma questão que abordámos foi o uso de índices para ir buscar elementos às listas. Isto vai dar-nos jeito no caso em que temos duas ou mais listas, e queremos ir buscar valores correspondentes. Por exemplo, vamos criar duas listas:

nomes = ['mar', 'céu', 'vento']
estados = ['bravo', 'nublado', 'forte']

E o que queremos é criar dois objectos de texto, extraídos ao acaso, mas queremos que um corresponda ao outro, nomeadamente: se for escolhida a palavra ‘mar’, o estado tem de ser ‘bravo’, e nunca ‘nublado’, que seria um resultado possível caso usássemos o choice() para extrair um elemento de cada lista.

Para isso, vamos tirar partido dos índices das listas. O índice é o número que indica a posição de um elemento. Neste caso, recordando que o Python conta a partir do zero, ‘mar’ é o elemento 0, ‘céu’ o elemento 1 e ‘vento’ o elemento 2 da lista ‘nomes’. Se quisermos ir directamente buscar o elemento ‘céu’, basta-nos escrever nomes[1].

A estratégia que vamos seguir é primeiro tirar um número ao acaso, e depois usá-lo para ir buscar os elementos correspondentes nas listas. Assim:

nomes = ['mar', 'céu', 'vento']
estados = ['bravo', 'nublado', 'forte']

# o indice vai ser um número à sorte entre 0 e 2, visto que cada lista tem
# 3 elementos

indice = random(0,2)

# para ir buscar o elemento X de uma lista, escrevemos só lista[X].
# por exemplo, para o segundo elemento (posição 1) da lista "numeros",
# é só escrever numeros[1]
# e assim, aplicamos esta lógica para usar um número aleatório como índice
# para ir buscar elementos na mesma posição em cada lista:

text(nomes[indice], 10, 100)
text(estados[indice], 10, 150)

Convém reparar que não usámos de todo o choice() para resolver esta situação.

Text

Usar listas para alimentar comandos

Este problema apareceu mais do que uma vez: como é que fazemos correctamente as listas para usar em comandos?

Importa ter isto em mente: as listas e as variáveis apenas podem conter números ou strings (pedaços de texto)*, por isso o seguinte código não vai fazer o que esperaríamos:

formas = ["image('frigideira.png', 60, 250)", 
          "image('panela.png', 0, 250)"]
forma = choice(formas)

Se queremos desenhar uma imagem à sorte entre várias, a solução é fazer uma lista com os nomes dos ficheiros de cada imagem, escolher um deles, e dá-lo ao image(). Assim:

formas = ["frigideira.png",
          "panela.png"]
forma = choice(formas)
image(forma, 0, 250)

Mas, e se quiséssemos, de acordo com a imagem escolhida, ter valores diferentes para o x e y (ou qualquer outro valor que queremos que varie)? Neste caso, vamos recorrer ao if, que falámos na última aula. Com um exemplo simples, dá para perceber como funciona:

if forma == 'frigideira.png':
    image(forma, 0, 250)
elif forma == 'panela.png':
    image(forma, 60, 250)

Não esquecer: elif significa ‘else if’. Significa que “se determinado valor não for igual ao anterior mas for igual a este, então é para fazer isto”.

Finalmente, podemos tornar o código mais limpo com recurso a variáveis. Não vai afectar a forma como o programa vai correr, mas torna a lógica mais perceptível:

if forma == 'frigideira.png':
    x = 0
elif forma == 'panela.png':
    x = 60
image(forma, x, 250)

Happy hacking!

* Na verdade, as listas podem conter muito mais coisas; com algumas maroscas, até poderíamos colocar comandos numa lista, mas isso é uma péssima prática que só vai complicar as coisas. Let’s keep it simple.

Text

Proposta #01: Cartazes estocásticos

(Esta proposta e os respectivos prazos dizem apenas respeito à turma de quarta-feira.)

A primeira proposta de trabalho consiste em criar um programa que consiga gerar um cartaz diferente de cada vez que o corremos.

  1. O objectivo, tema, estilo gráfico, dimensões e base conceptual do cartaz são livres. No entanto, é esperado que cada aluno saiba justificar cada uma das suas escolhas.
  2. É obrigatório usar pelo menos 2 elementos gráficos e 1 elemento de texto que variem de cada vez que é gerado um novo cartaz. Para rever como gerar texto usando processos estocásticos, o último post tem o programa que serviu de demonstração na aula.
  3. É esperado que cada aluno aplique a sua linguagem e critério como designer na idealização do cartaz. A pertinência estética e conceptual da ideia serão avaliadas ao mesmo nível da aptidão técnica na construção do programa.
  4. As fases da proposta — ideias, esboços e programa terminado — devem ser documentadas no Tumblr individual de cada um à medida que vão sendo executadas.
  5. O programa terminado deve ser colocado no Tumblr até às 23:59 de segunda-feira, dia 15 de Novembro. Caso a entrega ultrapasse este prazo, a avaliação do trabalho vai sofrer uma penalização de 25%.

Esta proposta passa por várias fases:

  • Determinar o tema, conceito e objectivo do cartaz.
  • Encontrar, através de experiências e esboços, a linguagem gráfica mais adequada para o cartaz, bem como determinar quais vão ser os elementos variáveis no cartaz (e de que forma essa variação se vai manifestar).
  • Escrever o programa que vai gerar os cartazes.

Cada aluno terá liberdade para definir como vai estruturar as fases do seu trabalho. No entanto, é fortemente recomendado que o âmbito do cartaz seja definido o mais rápido possível, e que já existam vários esboços de possibilidades gráficas na próxima aula de dia 10, para poder aproveitar a única aula antes da entrega. Seguir estes passos não é obrigatório, mas será muito mais difícil cumprir os prazos da proposta se esta recomendação for ignorada.

Seguem-se também algumas sugestões finais para cumprir da melhor forma a proposta.

  • É-te dada livre escolha na concepção do cartaz. Ao contrário do exercício que fizemos na primeira aula (Reacção em Cadeia), onde te era dada muito pouca liberdade, agora tens liberdade a mais. Este é um dos objectivos da proposta: tens de limitar rapidamente as tuas escolhas e tomar decisões para poder avançar.
  • Tens muito pouco tempo para cumprir a proposta. Define previamente de quanto tempo vais precisar para cada fase do projecto. Não procures complicar demasiado, haverá oportunidade para isso nas próximas propostas.
  • A melhor abordagem é escreveres o teu próprio “briefing”. Vais querer fazer um anúncio de automóveis? Um cartaz activista a apelar à greve? Uma campanha contra o cancro? Encontra a resposta a esta questão o mais rápido possível, para que tenhas tempo de encontrar a melhor solução gráfica para o teu cartaz. E também vais precisar de tempo para fazer o teu programa, por isso mede bem as fases do projecto.
  • Não comeces a programar antes de teres a tua ideia muito bem definida. Até à próxima aula, esquece a programação e trabalha apenas com papel e lápis. O objectivo da proposta não é realizar um bom programa, mas sim um bom cartaz!
Text

Discurso estocástico

Este programa foi dado na última aula; é essencial compreender como funciona para conseguir executar a proposta de trabalho que foi apresentada na turma de quarta-feira. (Os alunos de sexta-feira podem ignorar este post para já, visto que ainda não chegámos a esta parte.)

# Texto estocástico
# Demonstração do uso de listas e da função choice() para gerar
# frases aleatoriamente

# Vamos fazer uma frase da seguinte forma:
# "Senhor XXX, o seu YYY é ZZZ!"

# antes de mais, as definições do costume
size(800, 300)
# fundo preto
background(0)

# primeiro, definimos as listas com as várias hipóteses para
# cada parte que queremos que varie
partes1 = ["Deputado", "Presidente", "Ministro"]
# podemos quebrar linhas ao indicar elementos de uma lista!
# (mas só depois de uma vírgula)
# isso ajuda o nosso código a ficar mais arrumado
partes2 = ["o seu bigode", 
          "a sua inclinação moral",
          "o seu argumento demagógico"]
partes3 = ["uma honra para o país", 
           "uma razão para alarme", 
           "um insulto à decência pública"]

# agora, criamos 3 variáveis, uma para cada parte que vamos preencher
# e em cada uma vamos colocar uma parte à sorte a partir das listas
# que já criámos
parte1 = choice(partes1)
parte2 = choice(partes2)
parte3 = choice(partes3)

# a magia passa-se aqui; fazemos um modelo ("template") que vai ser
# completado com as variáveis que já decidimos.
# a regra é: para cada parte onde queremos colocar algo, metemos '%s'
# a seguir à frase, colocamos o símbolo '%', e finalmente a sequência
# das variáveis que vão preencher cada parte, em ordem.
# (se parecer confuso, experimenta mexer com os valores para ver o que
# acontece.)
frase = "Senhor %s, %s é %s!" % (parte1, parte2, parte3)

# e agora, vamos desenhar o texto

# queremos o texto a branco
fill(1)
# fonte arial tamanho 24
font('Arial', 24)
# e cá vai disto
text(frase, 20, 20)
Link

Wired:

You made the first “random” typeface, called Beowulf, by replacing the commands “lineto” and “curveto” in the PostScript code with your own command “freakto.” The new command calls up a random generator that makes the character outlines irregular. When you created Beowulf, were you trying to prove something, or was it just a joke?

van Blokland:

It was quite a joke. We were both into programming - or would you call it hacking? What came of that interest was a very cool-looking thing. We wanted to make a typeface that looked very smooth and rounded off, but instead it became spiky, with little pointy bits sticking out from the edges of each character in a most unpredictable way. And what’s the most fun about Beowulf is that every time you print it, those spiky bits take on a slightly different appearance.