The Wheels Turn. A monome norns+arc four track inspired recorder.
The idea is to have four audio tracks that we play back and record against, one assigned to each wheel (knob control on the Arc).
I present here a very incomplete list of programming-related projects, and the tools and languages I might use to create them.
Also see the awwaiid github repo for more projects!
Practice on my norns-powered digital four track: Hotel Yorba cover (including mistakes, heh)
(download)
One pattern I like a lot is a bin/service wrapper. In each of your services (I like to call them Macro Service instead of Microservice).
The idea is to provide a few key things:
A project which puts LLM-powered gremlins right into your runtime!

As previously mentioned, I enjoy trying out new tech like claude-code, making esoteric and ill-advised libraries that are maybe-jokes, pushing on meta-models and run-time eval, and like many others I don't mind 5 minutes of fame. So by that measure, TOTAL SUCCESS!
Editor Note: This piece is by Loren Eiseley, 1969. Published in The Unexpected Universe. Transcribed here from a PDF scan I found.


Using the new ChatGPT GPT-4o Image Generation to incrementally generate a photo of Hoda! (A "Chipin" is a 50-50 Chuhuahua and Mini-Pincer. Hoda is 70-20, so is a ChuhuaPin!)
Previously if you asked ChatGPT to generate you an image it would switch over to DALL-E, a separate image generation model. Each time it generated a new image it would more or less start from the beginning, maybe, and it was a challenge to get small incremental changes to an image.

Agency (a more useful concept of Free Will), has two important ingredients -- the ability to predict outcomes and the ability to influence outcomes -- both of which come in a spectrum of possible degrees. We can lay these out into a visualization that breaks down naturally into a four-square grid.
Since I'm going some consulting work I have to do a bit of time tracking. And you know what that means! Playing with my taskwarrior and timewarrior config!!!

openai: Generate an image of a stopwatch in the style of an impressionist oil painting with thick bold brush strokes
My friend Brad asked about what I've been reading lately in the AI/LLM space to keep up. Here's my link roundup! Things that have been on my rotation lately.

cat some_file.txt | llm -s 'Turn this into a CSV of street, city, state, zip' > data.csv
Figured out how to make opening a CSV in firefox pop open a terminal running VisiData (vd)
I like VisiData! If you are working with tabular data, like a CSV file, it is a lovely slicer and dicer. It's a pretty terminal-keyboard-heavy program, like a vim family thing. Like many of these power tools, I find that you can get into it best by finding ONE use-case and then gradually introducing new tricks from there. So the simple use-case for VisiData is simply viewing CSV files.

What distracted me today? Flameshot and Rofi.
--
It's a weekend, and on the weekends I am retired. And it has long been my declaration that someday when I retire I will spend all day every day messing with dumb config files. SO!

A small data transform / cleanup task using LLM labor.
My mom is now running a small business, $129 Arizona Discount Traffic Survival School, and I'm tinkering away at a website for her. The other day she gives me a google doc with venue addresses, asking if I can put it up on the site.

Drawing Xes in Boxes is harder than you might think! Teaching Ghostwriter a bit about space by pre-segmenting the input image gets us closer.
You may recall from TLT - 2024.11.23 - A Ghostly Game that Ghostwriter is ... not good with spatial awareness. For example, we can ask it to draw an X in a box and see how close it gets...

Working on Ghostwriter, making some incremental progress on playing tic-tac-toe.
I've been trying to play tic-tac-toe with Ghostwriter, but it is quite bad. Reading the LLM transcript, it sees that we are playing, has a good idea of what it wants to do, but can't aim its output very well at all.
VSCode is quite cool and I'd like to be good with it, but my fingers and brain refuse to adapt without some explicit work. Here are some of the things I'm doing to make it a bit more comfortable for me, a long-time vim user.


Each token is one choice from many forking paths. Let's see some of the other possibilities. Also try the Live LLM Token Tree Visualization Tool!
Mostly we talk about LLMs (Large Language Models) as generating one token (roughly a syllable, it depends) at a time. But that's not really the whole picture. Given the context, all of the text that has led up to this point, the model will rank all of the possible tokens and assign each a weight (a probability).
Part of the Ruby For Good organization; inventory control for diaper and period-supply banks.

See the Human Essentials Github repo for the main project itself. I am but one contributor, though I've been working on this project very steadily since 2022 (with some smaller contributions in 2018-2019).

I love diagrams! I love code! Mashing them together is delightful :)
The idea here is to write some markup, like we do with HTML, and just like with HTML/CSS we let the computer do the heavy lifting to decide what pixels go where. I long ago fell in love with GraphViz. More recently I've expanded that love to PlantUML! Let's take a look.
This is the website and wiki of me, Brock Wilcox a.k.a. awwaiid. Please see the Home page if you would like a less philosophical introduction to this site. Otherwise, read on!
I love living in the future -- we have so many neat things. One of my favorites is the internet. For me the internet is a powerful communication tool, and this website is one of the ways I utilize the internet to communicate. By placing my thoughts, papers, and projects on this site for the world to view I hope to communicate a little about myself to whomever is interested in knowing me.
I use Feedly to subscribe to a bunch of websites and blogs and such. When I see something that is interesting I tag it and bag it. Here is the raw shares.rss.xml. I also share thoughts or commentary on the 'share' tag.
I use Unison File Synchronizer to keep my important files synchronized between machines. This is a description of how I have it arranged and automated. I have been using this setup since 2006!

In-Hub, LLM + Sonic Pi, dash of docker-compose
In-Hub, LLM Club, Mediapipe, Coffee Project, docker-compose
Assistants conceptWebsite updates to break insulation, bit of Human Essentials
#!/usr/bin/env ts-node and contains Typescriptblog command really lives, but vim $(which blog) works great :).data format directly into JSON so you could do the extract even after the upgrade .... but my data is migrated now and works fine so I lost momentumA week spent coughing, writing Java, and watching Andor. First World Problems hah. Not bad in the scheme of things! :)
Virtual errands, GPU token generation. Oh right, Alloy

Pairing, unicode tokens, graphviz bling

Applied LLM Demos; basic token output visualization with graphviz

Lunch table with Humans!
week indicator on this checkin is already upsettingLlamas, Pythons, Coffee, and Sway

Some notes and thoughts on Peter Kriens' video, as posted on the Alloy Discourse
Video: Peter Kriens - Thoughts on Alloy, Formal Models, and Software Engineering (youtube)
Fuzzy brained, but starting to figure this thing out.
In The Hub
chmod 666 /sys/bus/usb/devices/3-1/authorized which happens to be where I have it plugged inecho 0 > /sys/bus/usb/devices/3-1/authorizedPairing, Merging
layout.css.devPixelsPerPx to something bigger. I go in there... and it is set to 0.75!!! I changed it to the default and everything is already much better hahaFirst day of RC!
Packing up for my 6-week batch at the Recurse Center.
Blooming trees and forking path in Kalorama Park
I'm attending The Recurse Center for 6 weeks from March 25 - May 3.
Sharing some thoughts on my Recurse Center project, exploring how to bring Alloy or similar tools into the Day Job.
Robot opening a jar
I'm attending a 6-week retreat at Recurse Center! This will go from March 25 - May 3. So ... gotta get set up!
A robot making lists
I'm trying to solidify my understanding of the schema organization for Human Essentials. The goal is to build up some documentation to make contribution even easier for new folks. Also I like to play with PlantUML and GraphViz.
First I ran rails erd filetype=dot attributes=false and got a beast of a diagram. This includes all of the models and some indirect relationships.
Reflections on Github Copilot and AI coding assistants.
A robot intern delivering coffee. Image by DALL·E.
I found a weird self-published book in a street-side Little Library. Here is my review.
A robot version of the scarecrow from the wizard of oz, oil painting style. Image by Bing Image Creator.
Using OpenAI API GPT-3.5 to generate and judge stories.
Robot reading a script, oil painting style. Image by Bing Image creator.
Creating a simple snake game with the help of ChatGPT.
Pixelated snake, possibly in the desert, somewhat two-dimensional. Image by Bing Image Creator.

Notes from the Changelog interview with Cory Doctorow on Chokepoint Capitalism
Lemonade stand operated (or perhaps supervised?) by a robot. Image by Bing Image Creator.
While driving to and waiting for Millie (the car) to get maintenanced, I listened to Examining capitalism's chokepoints, an interview with Cory Doctorow discussing his book Chokepoint Capitalism. This touched on all sorts of things, but right up at the front was an off-topic question - How is Cory so prolific?
A delightful song about that one shoe you can't seem to find!
Lyrics by Brock, music by Brock, Jason, and Elizabeth.
(download)
Jam with Theo -- banging drums, strumming bass, and making up nonsense about Wanda Vision!
(download)
Theo and I went over to 7DrumCity and jammed for a while. He and Sacha were telling me about Wanda Vision, which I haven't seen at all, so I started to make up a song. A delightful time was had by all!
Song inspired by Hoda The Dog lounging about in the living room sun!
Voice note (download)
Revision 1 (download)
Revision 2 (download)
Revision 3 (download)
G
My little dog
C
laying in my living room
G
she's laying in
D
a patch of sun
G
My little dog
C
laying in my living room
G
And I think her day
D G
is gonna be a good one
G
My little dog
C
laying in my living room
G
she's laying in
D
a patch of sun
G
My little dog
C
laying in my living room
G
And I think her day
D G
is gonna be a good one
C
She's laying there
G
all through the day
C
Just seeing her
G
takes my cares away
C
What she's dreaming of
G
I couldn't say
D
But I bet it's something
G
real fun
G
My little dog
C
laying in my living room
G
she's laying in
D
a patch of sun
G
My little dog
C
laying in my living room
G
And I think her day
D G
is gonna be a good one
START HERE! This page is an overview; much of the music I've written or been involved with in one lovely place. Also check out my Music Gear and Setup!
These works are licensed under a Creative Commons Attribution-ShareAlike (CC BY-SA) License (or maybe CC BY-NC... feel free to ask).
Here are a bunch of songs! Some of these are more proof-of-concept than anything :) . These include both solo efforts and collaborations, follow the links to learn more and maybe get some lyrics, variations, and background.
Initial attempt at My Little Dog, part of the 2023 RPM Challenge
I did a voice recording of this in April 2022, noodling around on the mandolin and singing to Hoda while she (quite obviously from the lyrics) lay basking in the sun. Here is the voice recording:
(download)
I'm going to try to do the RPM Challenge again this year. Millionth try is a charm?
The challenge: 10 tracks or 35 minutes of original music recorded during the month of February.
An exploration of mitigating project risks with frequent deploys and prioritizing end-to-end execution.
Introducing change to a project always comes with some risk. Some examples:
I had ChatGPT write me a poem .... but first some somewhat irrelevant background information!
I've purchased and chained a few Neopixel-like LED fairy-light strands (these ones on Amazon) as a fun winter/Christmasy project. I have them hooked up to an Arduino-like, right now this M4 Feather Express, but I'm planning on switching to an ESP32-S2 TFT Feather. Each LED is individually controllable using Arduino/C++. The idea is to make some holiday light displays with different colors and twinkling and all that. While learning how to use it I made a few toy animations, such as this simple snake:
During the COVID-19 pandemic I worked with an awesome group to build a harm-reduction dataset. The https://covidcanidoit.org/ website teaches people what to do and not to do based on current community-risk levels.
A hexagon-grid sound and sequence memory game.

This is a game inspired by TLT - 2020.01.19 - Mobile WebAudio Synth. The game has its own domain at https://mizikgame.com/.
Monome Norns is a music-centric device built on top of the Raspberry Pi by https://monome.org/. There is a healthy community at https://llllllll.co/ ("Lines"), though they talk about a lot more than only Monome. Norns is scripted primarily with Lua and SuperCollider, though is a fully Linux system.
Pair a keyboard with the Norns and Grid. Then you record commands like a set of timed and sequenced macros visible and triggered on the grid. Like a guitar-looper mashed up with a REPL mashed up with a sequencer!

See https://github.com/awwaiid/repl-looper for the code, documentation, and a journal of development.
In today's sugary exploration, let's take a look at a shorthand for object key expansion in Javascript (ECMAScript 2015+, es6+). For an overview of the TON of delicious sugar that was added to Javascript at around es6, check out es6-features.org.
Most of the "scripting" languages (Python, Ruby) have "dictionaries" or "hashes", a datastructure of key-value pairs. In JS these are called "objects", and they do a lot of other things beyond this basic data-storage behavior. In JSON -- JavaScript Object Notation -- you can see the basic literal declaration syntax. Let's build an addressbook, keyed (indexed) by name.
let addressBook = {
"alice": {
"street": "123 Elsewhere Lane",
"zip": "32341"
},
"bob": {
"street": "221 Baker Street",
"zip": "00234"
},
"clarence": {
"street": "P.O. Box 17",
"zip": "88877"
}
};
console.log("Bob's info", addressBook["bob"]);
A brain-dump of various approaches to debugging (code) things that I like.
grep!
ack, ripgrep (rg), atom/vscode search, ...asdf or similar and don't install using sudogrep/rgdebugger+firefox/chrome
diff -ubundle open <lib> / gem open <lib>We're using Firebase as the hosting service for https://covidcanidoit.com and the experience has been kinda weird, coming from a more traditional server-database world.
First, I didn't even realize that Firebase was more than a cloud-JSON-blob! Our initial use of it was only for static asset hosting. This is a VueJS application that so far mostly lives in the browser, so static hosting is perfect. I generally use Github Pages for this purpose, but another team member had already set up Firebase for us.
Once I learned that it was even a thing, all was good. I wrapped the CLI that Firebase provides into yarn land, and now you can do yarn deploy and it'll build up the local assets and push them up. Works quite well! The auth is stored somewhere else on my computer. If a new dev wants to deploy, you add their google account to the Firebase project and presto!
Talking DC Vote Blues
(I'm still working on the music, but it will be a talking-blues pattern for most of it).
Today I saw an analysis of historical Presidential Elections and how close they
were. They did a mathematical analysis to determine the smallest number of
votes it would take to change the outcome of an election. This depends on the
popular vote within a state, and the electoral vote between states.
A brain-dump of some things I ran into while learning VueJS and related technology (Vuex).
v-bind:value="foo"v-bind and you end up with :value="foo"v-on:click="doStuff"v-on: with @ and end up with @click="doStuff"{ "Person": Person }, where Person is a scoped variable{ Person: Person }{ Person }
I got a Pocket Operator PO-33 a while back, and find it super fun -- it is minimalist and usable. It inspires me to play around with beats and tunes ... and it also inspires me to work on my own samplers, sequencers, and synths.
Let's see what we can do with Web Audio these days! Starting with a basic VueJS app, I googled lots of stuff. Somewhat randomly, I wanted a Wicki-Hayden hexagon style keyboard, so had to find some CSS that makes hex-buttons. I'll probably switch to this Hexi-Flexi-Grid at some point, to make dynamically sized hexagons easier, but these work.
Combine that with a simple synth, and now we have a playable thing. I had to make some tweaks to get it to work tolerably on my phone -- fix the layout size, use touch events. Unfortunately it isn't very usable at this point due to a sizeable delay between pushing a button and the sound. I'm going to write a pure-JS snippet to eliminate any overhead from VueJS, and if that is also slow then I'm not sure what I'll do. It's kinda cool that I can use Web Audio ... and I'd sure like to keep using it. We'll see!
I made this by sampling some random Jazz, looping it, and layering in some drums and effects -- all using my fun Pocket Operator PO-33!
Listen: (download)
Artist: Brock Wilcox
Copy and Share: under the terms of Creative Commons Attribution-NonCommercial license!
The Pocket Operator PO-33 Knock-Out is a super fun sampler and step-sequencer made by Teenage Engineering! I got one in August 2019, and am using it to play around with sample-based music.
See also Music Gear and Setup
In 2019 I got a Pocket Operator PO-33, part of the "Metal" series of devices from Teenage Engineering. This is a sampler and step-sequencer in a pocket-calculator-esq form factor. Very fun! These are some notes.
I'm working on making the jump from READING about recent machine learning techniques to APPLYING recent machine learning techniques. I have some nice datasets at work, so I am doing a bit of double-dipping by playing with those.
I previously struggled with getting started, getting bogged down in picking technologies and such. I'm specifically going after some Neural Network models, so also get overwhelmed with the Python ecosystem of tools and libraries. The best way to get started is to get started .. so I turned the corner with a little help.
Fluent Python (book): Great advanced-introduction to Python, letting me better understand/recognize meta-programming and DSLs. Things like the array-slice syntax turning into an object which can be passed to any class that implements the right methods.
The graph module uses GraphViz to draw graphs. Here are some examples I've put together, but much fancier things are possible. See http://www.research.att.com/sw/tools/graphviz/refs.html for GraphViz documentation, and see http://www.research.att.com/sw/tools/graphviz/examples/ for some examples.
<graph abc>
digraph {
a -> b - > c;
}
</graph>
<graph>
digraph {
rankdir=LR;
node [ shape=plaintext fontsize=10 ];
struct1 [
label=<<TABLE border="0" cellborder="1" cellspacing="0" cellpadding="0" width="75">
<TR><TD bgcolor="lightgrey">foo</TD></TR>
<TR><TD>columnx</TD></TR>
<TR><TD>id</TD></TR>
<TR><TD port="barid1">bar_id</TD></TR>
<TR><TD>baz</TD></TR>
</TABLE>
>
];
struct0 [
label=<<TABLE border="0" cellborder="1" cellspacing="0">
<TR><TD bgcolor="lightgrey">bar</TD></TR>
<TR><TD port="barid0">id</TD></TR>
<TR><TD>name</TD></TR>
<TR><TD>date</TD></TR>
</TABLE>
>
];
struct1:barid1 -> struct0:barid0;
}
</graph>
<graph>
digraph {
n1 -> n2;
n2 -> n3;
n3 -> n1;
}
</graph>
<graph>
digraph {
node [shape=box];
rankdir=LR;
n1 -> n2;
n2 -> n3;
n3 -> n1;
}
</graph>
<graph>
digraph G {
subgraph cluster_0 {
style=filled;
color=lightgrey;
node [style=filled,color=white];
a0 -> a1 -> a2 -> a3;
label = "process #1";
}
subgraph cluster_1 {
node [style=filled];
b0 -> b1 -> b2 -> b3;
label = "process #2";
color=blue
}
start -> a0;
start -> b0;
a1 -> b3;
b2 -> a3;
a3 -> a0;
a3 -> end;
b3 -> end;
start [shape=Mdiamond];
end [shape=Msquare];
}
</graph>
Generative artwork, floating and fading.

let gray = amt => color(amt, amt, amt);
function setup() {
randomSeed(7);
createCanvas(600, 600);
for (let i = 0; i < 200; i++) {
x1 = randomGaussian(300, 120);
y1 = randomGaussian(300, 50);
y2 = randomGaussian(300, 50);
fill(gray(x1 / 600 * 255));
line(x1, y1, x1, y2);
ellipse(x1, y1, 20, 20);
ellipse(x1, y2, 20, 20);
}
}
(Cats Dominate Our Lives Too Much)
(download)
Wake up
Feed me
Don't wait
I need
You've got your own world
But you brought me here
Suck it up you worthless whore
I feel like you
Don't care
Be kind
Shut up
Leave me
I know that you think
I am here to entertain
My attention is not free
Sometimes you can be
So vain
Tease me
Be touched
Give me
Wake up
Feed me
Don't wait
I need
You
I think it's important to learn through destruction. I like to probe the edges of things, and one of the best ways of knowing where IS the edge is to go over it. So ... let's go over the edge.
First we need a nice fresh ubuntu:
awwaiid@zokei:~$ docker run -it ubuntu bash
root@1cf14a7465fd:/#
I've been doing a spot of accounting at work over the last few months. This is clearly a failure of delegation and management on my part, but it has led to at least one deep observation that I mightn't have had otherwise.
Perhaps that is a slight exaggeration. They don't ACTUALLY travel through time. But if you hang out with them a bit and observe their twisted time and verb conjugation ... well it's obvious that they would be right at home hopping around a branching multiverse.
This is perfect timing for me !
I did something close with mine using apache a few months ago but I am not satisfied with it.
I run it onto my SAN Synology box.
Un-Mixed: (download)
Artist: Sacha (writing, music, lyrics), Brock (mixing)
Copy and Share: under the terms of Creative
Commons Attribution-NonCommercial license!
I know a dog
And he's my friend
His name is Oliver
Oliver Boliver
I Dockerized this website yesterday! I had already built a cpanfile that declares the Perl5 dependencies of OddMuse, which made it easy. I'm also going to run this with the data directory directly bind-mounted.
First the Dockerfile:
FROM perl:latest
# Set up the deploy user
ARG uid=1000
ARG gid=1000
RUN echo groupadd -g $gid deploy
RUN groupadd -g $gid deploy
RUN useradd --create-home -u $uid -g $gid -ms /bin/bash deploy
WORKDIR /app
COPY cpanfile .
RUN cpanm -qn --installdeps .
USER deploy
Let's have some fun with tracing code!
Here is a nice way to get Elasticsearch+Kibana up and running:
docker run -d -p 9200:9200 -p 5601:5601 nshou/elasticsearch-kibana
I'm collecting all the ways you can use : in Perl 6.
Larry's 1st Law of Language Redesign: Everyone wants the colon
Larry's 2nd Law of Language Redesign: Larry gets the colon
A lot of these are variations on a theme, especially the theme of "colon-pair" syntax. Where two uses of the colon look different or are in a different usage context, even if they are technically the same, I'd prefer to illustrate them both.
Some uses I know of which do not appear to be in your list:
say :: # Pseudopackage representing null namespace?
I gave a lightning talk at The Perl Conference about my collection of Perl6 Colons. Looks like Geoff gave me 34 extra seconds... not sure that I approve :)
Enjoy!
[
I've been exploring the world of Open Source Music Production! Here I detail my setup.
Asus Zenbook Prime UX32VD: My laptop, powerful enough for my needs
There are many tools in my programming toolbox, but one that I've felt is missing is constraint and logic programming. I've done a spot of Prolog and played with some inference systems of various types ... but even when I run into something where I think it's the right hammer... I don't have a go-to tool.
I got The Reasoned Schemer a while back, hoping to use it to learn clojure's core.logic or similar, but the writing still KILLS me. Hate it so much. It is like the worst extreme sort of Socratic Method that I can imagine, literally everything has two columns of question and answer. But the QUESTIONS are obtuse! Working through it that way is not the sort of enlightenment that I'm going for ... I don't want to apply a unification algorithm on my understanding of logic programming with the contents of the book! The programming system might be "backwards" that way, but my way of learning isn't.
Anyway. One dumb thing that I had a hard time getting over was things ending in -o, like conso and emptyo. But tonight I had a breakthrough! See those 'o' things, according to the internets, are supposed to be sort of like question-marks except describing a goal. So now if I read the 'o' as '-objective' (as in, "goal") then they sound much better. cons-objective, empty-objective. Declaring the goal of the statement.
"Pair Programming Musical Chairs"
Apparently a Randori is a form of martial arts training where the students take turns sparring with the instructor. In the context of programming, it's a form of pair programming where the pairs rotate every few minutes, and everyone is working on the same problem together. It's a great way to learn from others, and to teach others, and to get a feel for how different people approach problems.
Also it is SUPER FUN!!!
Listen: (download)
Artist: Brock Wilcox, Sacha
Copy and Share: under the terms of Creative Commons Attribution-NonCommercial license!
Chords:
I've been having lots of fun with https://github.com/vimwiki/vimwiki lately! I've mixed in a bit of encryptfs to have a private directory of notes. Sometime during boot, I set it up with:
sudo mount -t ecryptfs \
-o key=passphrase,ecryptfs_cipher=aes,ecryptfs_key_bytes=16,ecryptfs_passthrough=no,ecryptfs_enable_filename_crypto=yes,ecryptfs_fnek_sig=1a9380706fdf5bce \
~/docs/private/vimwiki ~/notes
I haven't done much customization yet. But one thing I'm playing with now is making it easy to post notes from VimWiki directly onto my website.
Listen: (download)
Artist: Brock Wilcox
Copy and Share: under the terms of Creative Commons Attribution-NonCommercial license!
Last night at the DC Perl Mongers meetup we collaboratively built a proof-of-concept for storing key/value pairs as messages in a slack channel, https://github.com/plicease/globalhash. This was made straightforward by great Slack API docs and cpan:WebService::Slack::WebApi. Example usage:
# writes "hello=world" into the #globalhash channel
$ globalhash set hello world
# reads the #globalhash channel for the most
# recent value of hello and prints it
$ globalhash get hello
world
There are of course a TON of things you could do from here. Some ideas:
Martin Prescher, CTO, AutoGravity - Scrapping the Monolith
https://pbell.wistia.com/medias/eoiit75e8p
Eliot Horowitz, CTO, MongoDB - Coding Time for Managers
https://pbell.wistia.com/medias/bqk2yj6mni
Liz Crawford, ex-CTO, Birchbox - How to Build a Product Team
https://pbell.wistia.com/medias/006f3skx41
I never want to be the same thing twice... so:
Robot
Turtle
Zorro
Andy (of Raggedy Ann).
Friar tuck?
A fun thing to do is to explore things using introspection/reflection. In Ruby and Perl6, for example, we can get a list of methods for a given object instance pretty easily:
# Ruby
"hello good people!".methods.each { |method| puts method.to_s }
# Perl6
for "hello good people!".^methods -> $method { say $method }
On the REPL (irb/pry or perl6) this is even shorter since it prints out lists of things by default, so you can do: