- Make my own mortadella
- Harvest all the materials I need to tie my own flies. Hunt the birds, deer, rabbits, etc.
- Make my own bamboo fly rod
- Bake a small loaf of bread from scratch for dinner every night
- Build a chair.
Tag: project
-
Projects I want to do
-
Homemade Liqueurs
Ginger Liqueur
Tastes like Domaine de Canton. Delicious. Used in the tiki cocktail Yule Log Grog.
Ingredients:
- 2 ounces ginger root (I used dried, fresh will work too)
- 1 vanilla bean
- 1 cup sugar
- 1 1/2 cups water
- Zest of 1 orange
- 1 1/2 cups rum (I used Mount Gay Eclipse)
Boil the ginger, vanilla, sugar, and water for 10 minutes, then let cool and put into a jar to sit for 2-3 days. Double strain and bottle!
Original source: Serious Eats. I’ve modified the recipe.

Allspice Dram
Ingredients
- 1/2 cup allspice berries
- 2 1/2 cups navy-strength rum
- 1 cup brown sugar
- 1/2 vanilla bean
- 1 cinnamon stick
Toast and crush allspice berries, then soak in rum for two weeks. Mix with simple syrup (1:1) made with brown sugar, vanilla bean, and cinnamon.
Original source: Alton Brown. I’ve modified the recipe.
Falernum

Paul Clarke’s Falernum number 10: https://thelosttikilounge.com/ingredients/falernum-guide/
- 6 oz Overproof White Rum – Wray & Nephew recommended
- 9 Limes, zested – preferably organic
- 40 Cloves, toasted – buy a new pack – don’t use the ones from last Christmas!
- 2 tbsp Blanched Slivered Almonds, toasted
- 1/2 tsp Almond Extract
- 2 oz Fresh Ginger, peeled and sliced or julienned
- 14 oz Rich Simple Syrup – 2:1 ratio, cold preparation
Method
- Zest the limes with a microplane grater, zester or vegetable peeler, making sure to leave all the white pith behind. And watch those knuckles! Adding human flesh really won’t enhance the flavour.
- Toast the cloves in a dry pan over a medium heat, shaking frequently, just until they begin to become aromatic, then remove from the heat.
- Toast the almonds, shaking frequently, until they begin to turn light brown, then remove from the heat.
- Peel the ginger and either slice it into thin batons or julienne it.
- Add the lime zest, cloves, almonds, ginger and the rum in a pint-sized jar and allow to macerate for 24 hours. Every now and then, take a moment to review your creation. It looks green, strange, almost luminous. Give it a shake. Awesome.
- Strain the infusion into your final container through a muslin or a moistened cheesecloth. Make sure to give it a good squeeze at the end to get every last drop of potent liquid out. If it’s still a bit ‘gritty’, run it through a second time, or if really stubborn try something like a coffee filter to help refine it.
- To make the rich simple syrup, add 2 cups of sugar (preferably super-fine) and 1 cup of cold (or slightly tepid) water to a large jar. Seal the lid and shake until the sugar is completely dissolved. If you’re struggling to get it to liquefy, add it to a pan and put it on a very low heat, stirring every few minutes until the liquid is clear.
- Measure 14 ounces of your syrup and pour into your final container along with the rum infusion and the almond extract, give it a shake to combine, and you’re done!
Cinnamon Syrup
- Use Cassia, which holds up better in syrup than ceylon or sri lankan.
- 15g Cassia
- 250g water
- 250g cane sugar
Simmer 15 mins, let sit for a couple hours, strain and store in fridge.
-
Bash learnings
Bash things I always need to look up.
Snippets
If/then/else
if test ! $(which jq) then echo "Looks like you don't have jq installed. Installing jq..." brew install jq echo "...jq installed!" else echo "You've already installed jq. Cool!" fiCode language: PHP (php)For loop
for site in 1202859 1202862 1201051 1207663 1228567 1213504 1224728 1229567 1239206 do echo "iteration for $site" doneCode language: PHP (php)- When using a
$variable, you have to use “, not ‘ ! - Variable assignment from the results of another command:
name=$(command) - Array assignment from the results of another command: `array_name=($(command))
Tools
curl
- -o for saving to a file
jq
jq – command line JSON processor
- use
-rto remove quotes around the data. raw. - Use
| @shfor transforming arrays into space separated strings - Convert JSON to CSV
# Select all children of the data object and extract the value of the id keys | jq '.data[].id' # Select the first element of the data object and return the value of the filesystemBackupId key, raw/no quotes | jq -r '.data[0].filesystemBackupId' # Convert a JSON file to CSV (echo 'username,profile_url,employer'; jq -r '.[] | [.username, .profile_url, .employer] | @csv' employers_5_1.json) > employers_5_1.csvCode language: PHP (php)tr
Transformations! Replacements, changing case, https://linuxhint.com/bash_tr_command/
Use
| tr '\n' ' ')to replace new lines with spaces.awk
Awk is a command line text-processing tool.
Use awk to replace a text with an empty string:
curl -s $url | pup -p 'li#user-company text{}' | awk '{sub(/Employer:/,"")} 1'Code language: PHP (php)pup
pup is a command line tool for processing HTML, inspired by jq.
https://github.com/ericchiang/pup
Get the Employer section from a WordPress.org profile:
<code>curl -s <a rel="noreferrer noopener" href="https://profiles.wordpress.org/cagrimmett/" target="_blank">https://profiles.wordpress.org/cagrimmett/</a> | pup -p 'li#user-company text{}'</code>Code language: HTML, XML (xml)Clean that up to remove the “Employer:”, new lines, and tabs with
awkandtr:curl -s $url | pup -p 'li#user-company text{}' | awk '{sub(/Employer:/,"")} 1' | tr -d '\n' | tr -d '\t'Code language: PHP (php)Use in a script:
// Assumes an input file named 5-1.txt with a list of profile URLs // dependent on pup for url in $(head -n800 5-1.txt); do employer="$(curl -s $url | pup -p 'li#user-company text{}' | awk '{sub(/Employer:/,"")} 1' | tr -d '\n' | tr -d '\t')" contributions="$(curl -s $url | pup -p 'div.item-meta-contribution text{}' | tr -d '\n' | tr -d '\t')" echo "$url | $employer | $contributions" >> 5-1_contributors.txt doneCode language: JavaScript (javascript)nohup
nohup (No Hang Up) is a command in Linux systems that runs the process even after logging out from the shell/terminal.
nohup command [command-argument ...]Code language: CSS (css)wget
wget can download recursively!
wget -r-1 0 https://site.com/….Set the maximum number of subdirectories that Wget will recurse into to depth. In order to prevent one from accidentally downloading very large websites when using recursion this is limited to a depth of 5 by default, i.e., it will traverse at most 5 directories deep starting from the provided URL. Set ‘-l 0’ or ‘-l inf’ for infinite recursion depth.
https://www.gnu.org/software/wget/manual/wget.html#Recursive-Retrieval-Optionshistory with timestamp
using zsh:
history -fconcat commands with &&
cd ~/Projects/team51-metrics && java -jar metabase.jarWrite out a file to standard output
Helpful for short files.
cat ~/.ssh/id_rsa.pubCopy contents to your clipboard
pbcopy < ~/.ssh/id_rsa.pubSSH
Adding your SSH key to the ssh-agent
open ~/.ssh/config- If it doesn’t exist, create it:
touch ~/.ssh/config
- If it doesn’t exist, create it:
- Move the new keys to your ~/.ssh folder
- Edit the ~/.ssh/config file:
Host * AddKeysToAgent yes UseKeychain yes IdentityFile ~/.ssh/YOUR SSH PRIVATE KEY FILECode language: JavaScript (javascript)ssh-add -K ~/.ssh/YOUR KEY
The above snippet works for all hosts globally. If you need to specify, you can do something like:
Host ssh.atomicsites.net AddKeysToAgent yes UseKeychain yes IdentityFile ~/.ssh/id_rsaCode language: JavaScript (javascript)Removing keys from the ssh-agent
ssh-add -DProxying SSH
Two ways: In the command line or in a config file
Command line: use the -o option with ProxyCommand
ssh -o ProxyCommand="nc -x 127.0.0.1:8080 %h %p" -i ~/.ssh/id_rsa [username]@[serveraddress.net]Code language: JavaScript (javascript)Config file: Add ProxyCommand under the host:
Host ssh.atomicsites.net client-ssh.atomicsites.net ProxyCommand nc -x 127.0.0.1:8080 %h %p AddKeysToAgent yes UseKeychain yes IdentityFile ~/.ssh/id_rsaCode language: JavaScript (javascript) - When using a
-
Readlists
These are created using Jim Neilson’s reboot of the original Readlists tool from Readability: https://readlists.jim-nielsen.com/
Kindles do not support epub, so you must take the epub you get from Readlists and convert it to mobi with Calibre.
For a future project of extending the Readlists tool, this npm package could be helpful: https://github.com/moszeed/kindle-periodical
You can open the mobi URL in the experimental browser on your Kindle to download it. You can upload the json file that you can import into Readlists to make changes and additions.
-
Generative art project ideas
Reflect across a random line, not just a straight X or Y line.
Aragonite

Agate


Abstract line drawings of people, a la Jenny Walton
Asemic writing
- Letters
- 1
- bounding box
- pick points close to each other
- Connect, repeat 2-3 times with connectors
- 2
- Draw a line
- Pick a point on the line and draw another line from it
- Repeat & connect somewhere
- 1
- Poems or notes
- Try arranging the writing in concentric circles
- Do a proximity check and connect
- Letters
-
Personal Library project
I currently have a library/reading page on my main site at https://cagrimmett.com/reading
I am very interested in connecting this to a wider ecosystem, probably using a JSON feed and Micropub.
I’d also like to add a to-read list that links out to more info.
Resources to review:
- https://www.zylstra.org/blog/2022/02/indieweb-peronal-libraries-popup-session/
- https://events.indieweb.org/2022/02/personal-libraries-pop-up-session-Wax8N17zQuY0
- https://indieweb.org/personal_library
- https://www.manton.org/2022/02/20/personal-libraries-next.html
- https://maggieappleton.com/interoperable-libraries
-
Woodworking project ideas
Ideas from my index cards





Done, March 27, 2022 









Other ideas
Machacadora (Wooden Bean Masher) – Rancho GordoThe most wonderful thing that you had no idea that you wanted: the best tool for making refried beans (and a fine sauerkraut masher as well). We’ve been looking for a good machacadora for years. Who hasn’t? Normally when you find them they are made of cheap pine and split even with oiling and care. This beautiful versi
CORZETTI PASTA Stamp 1 Handle 1florentine | EtsyHello Italian cuisine lover !! Here my CORZETTI PASTA STAMP which is showing a beautiful traditional Florentine Motif. Whether you are just a fan of Italian cuisine or a professional Chef, my Corzetti Stamps truly handmade by me in my old lab in Florence can not miss in your collection !! Simply
3 in a boat | Products | Grimm´s Wooden Toys3 Männer im Boot, bunt
Land Yacht | Products | Grimm´s Wooden ToysThe four sailors are looking forward to the many adventures, on both water and land, that they will experience with your child, because there is a lo…
Regenbogenwald | Grimm´s Wooden ToysMit diesen Baumspitzen können Wälder in den Farben jeder Jahreszeit entstehen. Oder die Kegel werden zu Dächern und Turmspitzen in Kombination mit un…-
Garden Basket
Cedar Garden Harvest Basket Cedar Garden Tote Hod Vegetable | Etsy**PLEASE NOTE that our shipping is currently on a 3-5 day shipping schedule. As Spring and gardening season approaches, well be back to our quick 1-3 day shipping. Thanks for your business and HAPPY HOLIDAYS!** -Lovingly created out of necessity for the gardener- a harvest gathering basket- With -
Tart Tamper

-
Pie carrying box
-
Pepper Mill
-
Seed organization box
Seed LibraryAs an avid gardener, you probably have a ton of seed packets stored in your shed. Keep them well-organized with the Garrett Wade seed library box today! -
Carving mallet
-
Turned wooden necklace pendants
-
Turned ring holder
-
Baguette tray
Baguette Tray – Wild Cherry Spoon Co.Handcarved baguette tray measures 33″ long x 2″ tall x 4.5″ wide…the perfect size for a baguette or French loaf. Choose from Cherry/Maple or Walnut/Maple
Wooden ice bucket with lid.
Tiki Stirrers & Swizzles
- Oars
- Traditional swizzle sticks from branches
Tiki mugs
- Barrel mugs, either from a full block of wood, or a glueup to more resemble a barrel
- Turning a resin coconut?
-
-
P5.js resources and tips
- Online editors
- Books and tutorials
- By Daniel Shiffman
- http://www.generative-gestaltung.de/
- I have the old version, which uses regular Processing. The new version uses p5.js. Lots of beautiful examples and breaks down generative artworks into conceptual chunks to help you create them piece-by-piece
- https://thatcreativecode.page/
- Tyler Hobbs’s aesthetically pleasing triangle subdivision
- i++’s Making gifs with p5.js
- Finding examples to learn from
- Check out Open Processing or the P5js.org editor.
- Generative art platforms
- Code for Art Blocks projects is accessible on the Art Blocks Subgraph
{ projects(where: {projectId: "171"}) { id projectId scripts { id script } } }Code language: JavaScript (javascript)- endlessways.net and fxhash.xyz: View a live version of an artwork, then view the source. Since it is all rendered in browser via javascript, the code is there.
- Libraries
Embedding in posts with https://toolness.github.io/p5.js-widget/
<script src="//toolness.github.io/p5.js-widget/p5-widget.js"></script> <pre><script type="text/p5" data-autoplay="" data-height="500" data-preview-width="500" data-p5-version="1.4.1"> function setup() { createCanvas(400,400); } function draw() { background(255); quad(10, 10, 300, 30, 390, 375, 40, 290); } </script> </pre>Code language: HTML, XML (xml) -
P5.js snippets
Making a square canvas
createCanvas(min(window.innerWidth,window.innerHeight), min(window.innerWidth,window.innerHeight));Code language: JavaScript (javascript)Saving an image with a timestamp
function keyTyped() { const d = new Date(); let stamp = `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}_${d.getHours()}_${d.getMinutes()}_${d.getSeconds()}` if (key === 's') { save('project-name-' + stamp + '.png'); } }Code language: JavaScript (javascript)Grid of shapes
function grid() { let numShapes = int(random(2,10)); let size = (8*width/10)/numShapes; ellipseMode(CORNER); rectMode(CORNER); let randSpace = random(8,20); for (y=0; y<numShapes; y++) { for (x=0; x<numShapes; x++) { push(); translate(width/10 + x*size, height/10 + y*size); square(0,0,size - randSpace); pop(); } } }Code language: JavaScript (javascript)



