# Thagomizer

> Where I blog about code, the tech industry, and managing in the tech industry.

- [llms-full.txt](/llms-full.txt): Complete contents of all pages

## Pages

- [Blog Archive](/blog.md)
- [Info For Conferences](/about/conferences.md)
- [About Me](/about.md)
- [Thagomizer](/index.md)
- [Resume](/about/resume.md)
- [Blog Series Catalog](/series.md)
- [Talks](/talks.md)

## Blog Posts

- [Namespaces, models, and rails associations](/blog/2010/07/04/namespaces.md)
- [The Graph Gem](/blog/2011/04/26/graph.md)
- [A Taste of Prolog at Cascadia 2012](/blog/2012/08/02/prolog.md)
- [Pomodoro Technique and Vitamin-R](/blog/2012/09/01/pomodoro.md)
- [Code Drives](/blog/2012/09/26/code-drives.md)
- [factorial(21) and Mac System Ruby](/blog/2012/11/02/mac-system-ruby-broken.md)
- [Write Code Everywhere](/blog/2012/11/05/code-everywhere.md)
- [Gosu Makes Writing Games Easy](/blog/2012/11/12/gosu-makes-writing-games-easy.md)
- [A Testing Anti-Pattern Safari](/blog/2013/04/04/a-testing-anti-pattern-safari.md)
- [Testing Other People's Code](/blog/2013/05/07/testing-other-peoples-code.md)
- [Effective Tests](/blog/2013/05/14/effective-tests.md)
- [Write Tests](/blog/2013/05/17/write-tests.md)
- [Run The Tests You Write](/blog/2013/05/28/run-the-tests-you-write.md)
- [2.5 hours a week](/blog/2013/06/01/2-5-hours-a-week.md)
- [You Don't Need `assert_nothing_raised`](/blog/2013/06/11/assert-nothing-raised.md)
- [Seeing the Big Picture (Windy City Rails 2013)](/blog/2013/09/13/windy-city-13-slides.md)
- [Seeing the Big Picture (GoGaRuCo 13)](/blog/2013/09/20/gogaruco-13-slides.md)
- [We're sorry, but something went wrong](/blog/2013/10/21/we-re-sorry-but-something-went-wrong.md)
- [A World Without Assignment](/blog/2014/03/21/without-assignment-mwrc14.md)
- [Seattle.rb May 2014 Coding Challenge](/blog/2014/05/06/may-coding-challenge.md)
- [Learn To Code Resources: Part One](/blog/2014/06/08/learn-to-code-part-one.md)
- [Learn To Code Resources: Part Two](/blog/2014/06/11/learn-to-code-part-two.md)
- [Learn To Code Resources: Part Three](/blog/2014/06/28/learn-to-code-part-3.md)
- [N Design Patterns You Might Actually Use (Where N < 10) ](/blog/2014/08/11/cascadia-ruby-2014.md)
- [What Do I Do With This Giant Pile of Data?](/blog/2014/09/19/gogaruco14.md)
- [Euler Coding Challenges](/blog/2014/10/21/euler-coding-challenges.md)
- [A World Without Assignment](/blog/2014/11/18/rubyconf.md)
- [Approaching Rosalind Problems](/blog/2014/11/19/approaching-rosalind-problems.md)
- [From the cool_shit file](/blog/2015/02/20/the-cool_shit-file.md)
- [TIL: Hash Edition](/blog/2015/03/13/til-hash-edition.md)
- [Playing With Data: Birth Plurality In the US](/blog/2015/04/10/playing-with-data-birth-plurality-in-the-us.md)
- [techbridge visit](/blog/2015/05/01/techbridge-visit.md)
- [Forensic Log Analysis with BigQuery - Collision Conf 2015](/blog/2015/05/05/forensic-log-analysis-with-bigquery-collision-conf-2015.md)
- [Basic Rails App with Docker](/blog/2015/05/12/basic-docker-rails-app.md)
- [Kubernetes and Deploying to Google Container Engine](/blog/2015/07/01/kubernetes-and-deploying-to-google-container-engine.md)
- [Using the Kubernetes Secrets API](/blog/2015/08/18/k8s_secrets.md)
- [Cloud Minute](/blog/2015/09/18/cloud-minute.md)
- [Boundaries](/blog/2015/10/18/boundaries.md)
- [Conference Proposals](/blog/2015/10/26/conference-proposals.md)
- [One Year In Developer Relations](/blog/2016/01/03/one-year-in-evangelism.md)
- [Sharpening the Axe](/blog/2016/03/21/mountain-west-2016.md)
- [Sharpening the Axe](/blog/2016/03/21/rb-on-ales-2016.md)
- [Sinatra on Google Container Engine](/blog/2016/03/24/sinatra-on-gke.md)
- [Uploading Cat Pictures w/ Sinatra and Google Cloud Storage](/blog/2016/04/12/file-uploads-with-sinatra.md)
- [Rails Conf 2016 - Postcards From GorbyPuff](/blog/2016/05/04/rails-conf-2016-postcards-from-gorbypuff.md)
- [Queues and Stacks](/blog/2016/06/13/algorithms-queues-and-stacks.md)
- [Gotham Ruby 2016](/blog/2016/06/25/gotham-ruby-2016.md)
- [Ruby Meets BigQuery: Part 1](/blog/2016/07/13/ruby-meets-bigquery-part-one.md)
- [Ruby Meets BigQuery: Part 2](/blog/2016/07/15/ruby-meets-bigquery-part-two.md)
- [Diversity is not a check box](/blog/2016/08/12/diversity-is-not-a-checkbox.md)
- [Insertion Sort](/blog/2016/08/28/insertion-sort.md)
- [Containers Four Ways](/blog/2016/09/06/containers-four-ways.md)
- [Mental Health and Supporting Each Other](/blog/2016/09/11/devs-and-depression.md)
- [Why your talk was rejected](/blog/2016/09/23/why-your-talk-was-rejected.md)
- [Ruby & GCP: Uploading Pictures To Cloud Storage](/blog/2016/09/29/ruby-gcp-uploading-pictures-to-cloud-storage.md)
- [Metadata Service](/blog/2016/10/20/metadata-service.md)
- [Improve Your Speaking](/blog/2016/10/25/improve-your-speaking.md)
- [Using Fog Google](/blog/2016/10/28/using-fog-google.md)
- [Two Years](/blog/2016/12/07/two-years.md)
- [Problem Solving with Advent of Code](/blog/2016/12/16/advent-of-code-walkthrough.md)
- [Talks I Love: Sandi Metz and Katrina Owen](/blog/2017/01/05/talks-i-love-sandi-metz-and-katrina-owen.md)
- [Authenticating Google Cloud Ruby Gems](/blog/2017/01/08/authenticating-google-cloud-ruby-gems.md)
- [What are you trying to do?](/blog/2017/01/18/what-are-you-trying-to-do.md)
- [DevOps at Google Cloud Next](/blog/2017/01/26/devops-at-gcp-next.md)
- [Talks I Love: Partner Talks](/blog/2017/02/02/talks-i-love-partner-talks.md)
- [Ruby at Google Cloud Next](/blog/2017/02/09/ruby-at-gcp-next.md)
- [True Allies Listen](/blog/2017/02/16/true-allies-listen.md)
- [Monitoring BigQuery with Stackdriver](/blog/2017/02/23/monitoring-bigquery-with-stackdriver.md)
- [Talks I Love: Speaking Rate](/blog/2017/03/02/talks-i-love-the-art-of-pacing.md)
- [Rails on App Engine: Tips and Tricks](/blog/2017/03/09/rails-on-app-engine.md)
- [Five Useful Org-Mode Features](/blog/2017/03/16/five-useful-org-mode-features.md)
- [Audit Logging on GCP](/blog/2017/03/23/audit-logging-on-gcp.md)
- [Depth First Search & Minesweeper](/blog/2017/03/30/depth-first-search-minesweeper.md)
- [Talks I Love: Historical Oratory](/blog/2017/04/06/talks-i-love-historical-oratory.md)
- [The Google NLP API Meets Ruby](/blog/2017/04/13/the-google-nlp-api-meets-ruby.md)
- [Your Friend Enumerable](/blog/2017/04/20/your-friend-enumerable.md)
- [Debugging Demos](/blog/2017/04/27/debugging-demos.md)
- [Talks I Love: The Art of the Keynote](/blog/2017/05/04/talks-i-love-the-art-of-the-keynote.md)
- [Stackdriver Monitoring And Ruby](/blog/2017/05/11/stackdriver-monitoring-and-ruby.md)
- [Going Analog](/blog/2017/05/18/going-analog.md)
- [The Delightful Stackdriver Debugger](/blog/2017/05/25/stackdriver-debugger.md)
- [Talks I Love: STEM For General Audiences](/blog/2017/06/01/talks-i-love-stem-ted-talks.md)
- [Making an Enumerable](/blog/2017/06/08/making-an-enumerable.md)
- [You Are Not Your Code](/blog/2017/06/15/you-are-not-your-code.md)
- [The Nagging Question](/blog/2017/07/11/the-nagging-question.md)
- [Battleship Part 1: Local Battles](/blog/2017/07/13/battleship-part-1.md)
- [Battleship Part 2: Terminal Forever](/blog/2017/07/31/battleship-part-2-playing-the-game-locally.md)
- [ML Basics: Linear Regression](/blog/2017/08/03/ml-basics-linear-regression.md)
- [Battleship: Building the Server](/blog/2017/08/16/battleship-building-the-server.md)
- [About That Memo](/blog/2017/08/18/manifestbro.md)
- [Stackdriver Advanced Filters](/blog/2017/08/22/stackdriver-advanced-filters.md)
- [Deploying Battleship to GAE](/blog/2017/08/31/deploying-battleship-to-gae.md)
- [ML Basics: K Nearest Neighbors](/blog/2017/09/13/ml-basics-k-nearest-neighbors.md)
- [Battleship: Lessons Learned](/blog/2017/09/21/battleship-lessons-learned.md)
- [What to Wear on Stage](/blog/2017/09/24/what-to-wear-on-stage.md)
- [We Don't Do That Here](/blog/2017/09/29/we-don-t-do-that-here.md)
- [What is the App Engine Gem](/blog/2017/10/17/what-is-the-app-engine-gem.md)
- [How I Publish My Blog](/blog/2017/10/22/how-i-publish-my-blog.md)
- [ML Basics: Markov Models Write Fairy Tales](/blog/2017/11/07/markov-models.md)
- [Thoughts on Personal Brand](/blog/2017/11/30/personal-brand.md)
- [Year Three: Risk Taking](/blog/2017/12/07/year-three.md)
- [Metaprogramming and Currying](/blog/2017/12/19/currying.md)
- [GCP Audit Logs](/blog/2017/12/27/gcp-audit-logs.md)
- [Case Statement Magic](/blog/2018/01/11/case-statement-magic.md)
- [Security Advice for GCS Buckets](/blog/2018/01/17/securing-gcs-buckets.md)
- [The Toaster Allegory](/blog/2018/01/18/the-toaster-problem.md)
- [Auntie Aja on Abstracts: You Can Do Better](/blog/2018/01/25/auntie-aja-on-abstracts.md)
- [The Dreaded Whiteboard](/blog/2018/02/26/the-dreaded-whiteboard.md)
- [Testing In Production](/blog/2018/03/11/testing-in-production.md)
- [A Rubyist Learns List Comprehensions](/blog/2018/03/21/a-rubyist-learns-list-comprehensions.md)
- [Cleaning Up Time Machine Local Snapshots](/blog/2018/03/27/cleaning-up-time-machine-local-snapshots.md)
- [UX Is In The Small Things](/blog/2018/04/12/small-differences-in-ui-matter.md)
- [Thank You To A Bad Manager](/blog/2018/05/02/thank-you-to-a-bad-manager.md)
- [Cloud Functions and Cat Facts](/blog/2018/05/22/cloud-functions-and-cat-facts.md)
- [Org Mode Tagging](/blog/2018/05/30/org-mode-tagging.md)
- [Ask These Questions before Going to Prod](/blog/2018/08/15/ask-these-questions-before-going-to-prod.md)
- [Friction Logs](/blog/2018/08/22/friction-logs.md)
- [Mentoring: You're Doing It Badly](/blog/2019/03/19/mentoring-badly.md)
- [Cloud Build Dependency Graph](/blog/2019/06/20/cloud-build-dependencies.md)
- [App Engine gotchas For Rubyists](/blog/2019/08/20/app-engine-updates-for-rubyists.md)
- [CatOps: Functions Framework, Cloud Tasks, and my cat](/blog/2020/04/22/catops-responding-to-external-events-with-cloud-functions-cloud-tasks.md)
- [Contact Tracing and Exposure Notification](/blog/2020/05/26/contact-tracing-and-exposure-notification.md)
- [The Questions Doc](/blog/2021/07/12/the-questions-doc.md)
- [Manager Hack: A Simple Weekly Email](/blog/2022/01/11/manager-hacks-weekly-email.md)
- [The Ideal Advocate](/blog/2022/01/26/the-ideal-advocate.md)
- [Five Things That Change When You Become A Manager](/blog/2023/03/07/five-things-that-change-when-you-become-a-manager.md)
- [Storytime - The Impossible Assignment](/blog/2023/10/11/the-impossible-assignment.md)
- [Jump Start Solutions: An optimization problem and design challenge](/blog/2023/10/16/jump-start-solutions-design-challenges.md)
- [Manager Toolkit: You Talk, I Type](/blog/2023/11/01/manager-toolkit-you-talk-i-type.md)
- [Manager Toolkit: Useful Manager Phrases for 1:1s](/blog/2023/11/09/useful-manager-phrases.md)
- [Manager Toolkit: Manage The Person In Front Of You](/blog/2023/11/16/manage-the-person-in-front-of-you.md)
- [Productivity Tools: Bullet Journal](/blog/2024/03/26/bullet-journaling.md)
- [Vertex AI Agent Builder Demo from I/O](/blog/2024/06/06/vertex-ai-agent-builder-demo-from-i-o.md)
- [Addressing Manager Feedback](/blog/2024/06/10/addressing-manager-feedback.md)
- [RAG is simpler and more powerful than you think](/blog/2024/06/17/rag-is-simple-and-powerful.md)
- [Advanced friction logs: Empathy Sessions](/blog/2024/09/11/advanced-friction-logs-empathy.md)
- [Becoming an AI-Assisted Coding Convert](/blog/2024/11/01/becoming-an-ai-assisted-coding-convert.md)
- [Introducing Ursa Weaver](/blog/2026/04/27/introducing-ursa-weaver.md)
- [Perspectives on the Future of DevRel](/blog/2026/05/04/perspectives-on-the-future-of-devrel.md)
- [How XP Made A Better AI Coder](/blog/2026/06/04/how-xp-made-a-better-ai-coder.md)
- [Multi-Agent Ping Pong Pairing with Antigravity](/blog/2026/06/24/ping-pong-pairing-with-antigravity.md): Learning mult-agent and subagent architectures in Google Antigravity by building a Ping-Pong Pairing agent skill.
- [Who is a Builder?](/blog/2026/08/03/who-is-a-builder.md)
- [My Personal Guidelines for Using AI Respectfully](/blog/2026/09/15/my-personal-guidelines-for-using-ai-respectfully.md)

## Talks

- [Powerful (but Easy) Data Visualization with the Graph Gem](/talks/cascadia_11.md)
- [Powerful (but Easy) Data Visualization with the Graph Gem (Extended Edition)](/talks/rubyconf_11.md)
- [A Taste of Prolog](/talks/cascadia_12.md)
- [A Testing Anti-Pattern Safari](/talks/mwrc_13.md)
- [Seeing the Big Picture: Quick and Dirty Data Visualization with Ruby](/talks/data_viz_windy_13.md)
- [Seeing the Big Picture: Quick and Dirty Data Visualization with Ruby](/talks/data_viz_gogaruco_13.md)
- [We're sorry, but something went wrong](/talks/cascadia_13.md)
- [A World Without Assignment](/talks/mwrc_14.md)
- [May Coding Challenge](/talks/project_euler_coding_challenge_seattle_rb.md)
- [N Design Patterns You Might Actually Use (Where N is < 10)](/talks/cascadia_14.md)
- [What Do I Do With This Giant Pile of Data?](/talks/gogaruco14.md)
- [A World Without Assignment](/talks/rubyconf_14.md)
- [Storytime with Auntie Aja](/talks/rb_on_ales_15.md)
- [Forensic Log Analysis with BigQuery](/talks/mwrc_15.md)
- [DevOps for the Lazy](/talks/rails_conf_15.md)
- [Forensic Log Analysis with Big Query](/talks/collision_bigquery_15.md)
- [Stupid Ideas For Many Computers](/talks/la_ruby_conf_15.md)
- [Stupid Ideas For Many Computers](/talks/kubecon_15.md)
- [Keynote: Stupid Ideas For Many Computers](/talks/rubyconf_15.md)
- [Sharpening the Axe: Self Teaching for Developers](/talks/mwrc_16.md)
- [Sharpening the Axe: Self Teaching for Developers](/talks/rb_on_ales_16.md)
- [Postcards From Gorby Puff](/talks/rails_conf_16.md)
- [Exploring Big Data with rubygems.org Download Data](/talks/goruco_16.md)
- [Big Data with Rubygems.org Download Data](/talks/ruby_kaigi_16.md)
- [Datacenter Fires and Other 'Minor' Disasters](/talks/rubyconf_16.md)
- [Datacenter Fires and Other 'Minor' Disasters](/talks/ruby_conf_au_2017.md)
- [Stackdriver: monitor, diagnose, fix](/talks/gcp_next_17.md)
- [Syntax Isn't Everything: NLP For Rubyists](/talks/rails_conf_17.md)
- [4 Programming Paradigms in 45 Minutes](/talks/rubyconf_17.md)
- [Syntax Isn't Everything: NLP For Rubyists](/talks/confoo_nlp.md)
- [What Is DevRel](/talks/what_is_devrel_ada.md)
- [Testing in Production](/talks/rails_conf_18.md)
- [4 Programming Paradigms in 45 Minutes](/talks/rubyhack_18.md)
- [How I Learned to Love Serverless](/talks/seattle_dev_ops_serverless.md)
- [Hiring Is Not Hazing](/talks/hiring_is_not_hazing.md)
