- Upgrading the Firmware on a Tulip
- Learning Code Through the Advent of Code Challenge
- Common Loki Misconfigurations
- Iterating Through a List in Ink
- Debugging Misconfigured Container Networks
- Minimum Viable EC2 in Terraform
- Storylets in Ink
- Interactive Fiction Tooling Overview
- In-Place Resizing for Digitalocean Droplets
- Unity Demonstrates the Importance of FOSS
- Target Labels in Prometheus
- My View of AI is the Same
- Verify DNS Ownership with TXT Records
- Sane Droplet Defaults
- Editing Made Easy with Vim
- Gatsby Gotchas
- Concatinating Default AWS Tags in Terraform
- Easily Updating the Default Github Branch
- Lifetimes in Rust
- Checking for Bad Links
- Maybe TypeScript and React is Bad
- Static Asset Management in React
- Bundler Down Time
- Using React Context for Localization
- JS Implementation of a Sticky Footer
- Custom Aliases
- Trying Out the 7drl Challenge
- Trash Opinions
- Building Your First Program in Rust
- Fixing mongod reports errors related to opening a socket
- Improving Open Source Maintenance
- Technical Interviewing Tips
- Housekeeping Note
- Dynamic Programming Basics
- The Oddity of Naming Conventions in Programming Languages
- An Experiment Using Machine Learning, Part 3
- Debugging with grep
- An Experiment Using Machine Learning, Part 2
- An Experiment Using Machine Learning, Part 1
- The Value of while
- National Day of Civic Hacking
- OpenAI and the Future of Humanity
- Creating a Whiteboard App in Django
- Creating Meaningful, Organized Information
- Towards A Critique of Social Media Feeds
- Setting up Routes in Django
- Developing a Messaging Component for Code for SF
- Dream Stream 2.0
- Keyed Collections in Javascript: Maps and Sets
- Blog Soft Relaunch
- Scraping with Puppeteer
- Looking Ahead to Dream Stream 2.0
- Solving West of Loathing's Soupstock Lode Puzzle
- Installing Ubuntu
- Interview with David Jickling Evaluation
- Compare Text Evaluation
- Dream Stream Evaluation
Upgrading the Firmware on a Tulip
The Tulip computer is a cool, tiny device that provides a simple Pythyon IDE hooked up to music synth library that allows you to write scripts that generate music programmatically. I love small form factor devices like this that are incredibly expressive and user friendly. The device is also receiving regular updates, so it is getting better all the time.
However, doing your initial upgrade when you first receive the device can require clearing a few hurdles. Normally the device runs upgrades by connecting to wifi, so you run tulip.wifi('ssid', 'password')
, and then tulip.upgrade()
. However, due to a limitation of the initial implementation, the wifi library doesn’t like security certs like WPA2/3. More recent versions support this, but of course that doesn’t do you any good if you can’t connect your device to the internet to perform an upgrade in the first place. In that case you need to download the latest release from GitHub and flash it to the device.
Flashing to the device is straightforward enough with a tool like esptool.py… except that if you are on a recent MacOS version it requires a driver that Apple doesn’t like. In theory you should be able to update permissions so allow it, but I couldn’t personally get it to cooperate. (Update: There are now instructions on how to run the driver on Macs running Sequoia. You can find instructions here)
Luckily there is computing beyond the world of Apple’s walled gardens, running esptool on most Linux devices should just work™. After connecting the Tulip to a Rasberry Pi I had handy, I installed esptool, wget
the binary, and ran esptool.py write_flash 0x0 <tulip release>.bin
, and it got going. After it finished flashing the Tulip, I removed it, plugged a keyboard in (I don’t recommend plugging in the Tulip with a keyboard attached to it while doing the flash, the power draw is going to be too great for most pis), and was able to successfully connect to the wifi! At that point I didn’t really need to run tulip.upgrade()
, but did anyway just to see it in action.