Tie Guan Yin #11-25

As mentioned earlier, Twitch got me to work on my site more. I will not link to individual episodes here now but will do in retrospect as I still plan to make this an educational season or YouTube.

After my last recording, my camera broke, and apparently getting a webcam during a pandemic is akin to getting a roll of toilet paper. All recordings are thus faceless (which may be an improvement). Unfortunately, because of that my mic was also not useful for a time without me noticing–Episodes 11 to 13 are thus of very limited use.

  • Episode 11 went into he proper flow of sending password resets with Mailgun. A lot of debugging around that.
  • Episode 12 continued on the email problems and went on to use the infrastructure provided by django.auth more. Writing tests for sent emails included, as well as finally setting up VS Code for Python debugging, with breakpoints and stuff.
  • E-mails done reasonably enough, so in episode 13, it was time to move to new sections of the site. Links are done!
  • Episode 14 added Alchemist’s tools which uncovered interesting problems with invalid HTML in articles. Search in Admin added. Sanity tests in Selenium for all the pages!
  • Spell time! Episode 15 added Wizard and Ranger spells. Embarrassingly, contains me doing CSS.
  • Episode 16 added generic Items as an easy part. The harder was figuring out Downloads, as a first section of the site using user-uploaded content, just on time to have to go.
  • That was to be solved in episode 17 using django-storage. Hairier than it sounds when on old infrastructure and avoiding all of this modern encryption stuff. Untangling the legacy download counter that is…creative. In the same fashion, add Quests.
  • Episode 18 started with the realization of a need to decouple Authors from Users. The model with all migrations and readjustments started, together with solving encoding problems and various “Author” types. The creeping realization about non-transparent misencoding lookups emerged.
  • Episode 19 continued with the quest, Anonymous Author introduced with all its consequences. Tests for renders and migrations introduced.
  • I tried to verify that in the 20th episode with additional tests. Lots of debuggings and breakpoints and figuring out mistakes about the model hierarchy. A wild page with Creations appears!
  • Episode 21 merged the Author’s profile and properly linked to it from all Creations. Figuring out problems with Author’s, limits of using Django, migrations ForeignKey and MyISAM. Kick-off of proper creation’s fixtures when bored.
  • Episode 22 was about figuring out encoding problems with production data and articulating a migration plan for that. Continuation on the migrateauthors script. I have been also figuring out problems with Creations object model and compromises needed given the legacy table infrastructure. On my way to link to the articles from the Author’s profile though.
  • In episode 23, I have been finishing links to the Author’s profiles and kicking off the Phorum migration.
  • Episode 24 was about finishing the cache for the Authors intermediate table and trying to force Django to do LEFT OUTER JOIN on a text column before moving to a better solution
  • In episode 25, I migrated phorum to use foreign keys, added rendering tags for displaying level stars, and extended the Selenium test suite

I will take a break now and will make new episodes more sparingly. Subscribe on Twitch if you want to follow up.


The Graveyard of Tie Guan Yin is a webcast series where I drink tea and refactor my old Czech website (that is due for its 20th anniversary next year) into an open-source project.

I plan to cut this into annotated shorter snippets at one point, but I want to get the work done first. The aim is to help new programmers bridge the gap between finishing basic learnings and tutorials and submerging into a real-world project. The particular areas I see people struggling with:

  • Debugging, debugging, and debugging. Discovery and reasoning behind old decisions
  • Orienting yourself in a larger codebase
  • Making product micro-decisions
  • Considerations tied to running the project in production
  • Practical learning and blending the learnings of fundamentals with technologies that operate on top of them

This is thus an unstructured series that doesn’t contain prepared segments. I do share how I learn, how I debug and how do I overcome obstacles thrown in my way in technologies I am not an expert in. I am also trying to demonstrate how technology decisions depend on the context and sharing how I would decide differently under different conditions (i.e. larger project, stringer security requirements, etc.). I am also producing a real code produced under time constraints and going through an optimal time/value path.

Published in Notes and tagged


All texts written by . I'd love to hear your feedback. If you've liked this, you may want to subscribe for my monthly newsletter, RSS , or Mastodon. You can always return to home page or read about the site and its privacy handling.