Posts
My students were incredible with the iodine clock lab. Given the complexity of the procedure and the accuracy with which they needed to measure, they rose to the occasion.
Everyone split into their groups and immediately read the materials lists and read the procedure before even getting chemicals. They measured stock, asked good questions ("Is tap water okay?") and delegated tasks.
The soft click of glassware and hush of partners cooperating was musical.
I wrestled hard with an iodine clock reaction this week. I haven't taught kinetics in many years, so I was re-learning a lot as I went. I'm still confused a little by the data I got vs what I expected, but I think it's a case of the real world being much messier than practice problems.
D'Arcy manages to say in two sentences the conflict I feel over using an LLM:
If the resource and environmental impact problems were solved, would it suddenly become ethical to use LLMs? If the ethical issues around intellectual property and training of LLMs were solved, would I still be this conflicted? I desperately want a simple answer to all of this, and know that it’s just not possible.
These are my main two holdups, but even if they weren't problems, would I feel the same? I'm not sure.
Simon Willison has a detailed overview of major changes in large-language models from 2024 that I took time to read today. I'm a skeptic, especially because of the copyright and environmental issues that come with creating and running these services at scale. Some items that jumped out:
The really impressive thing about DeepSeek v3 is the training cost. The model was trained on 2,788,000 H800 GPU hours at an estimated cost of $5,576,000. Llama 3.1 405B trained 30,840,000 GPU hours—11x that used by DeepSeek v3, for a model that benchmarks slightly worse.
I don't pretend to understand the complexities of the models and the relationships they're trained to form, but the fact that powerful models can be trained for a reasonable amount (compared to OpenAI raising 6.6 billion dollars to do some of the same work) is interesting. Costs are down, which means that electric use is also going down, which is good. Simon makes the same observation in his section on environmental impacts:
A welcome result of the increased efficiency of the models—both the hosted ones and the ones I can run locally—is that the energy usage and environmental impact of running a prompt has dropped enormously over the past couple of years.
An interesting point of comparison here could be the way railways rolled out around the world in the 1800s. Constructing these required enormous investments and had a massive environmental impact, and many of the lines that were built turned out to be unnecessary—sometimes multiple lines from different companies serving the exact same routes!
The resulting bubbles contributed to several financial crashes, see Wikipedia for Panic of 1873, Panic of 1893, Panic of 1901 and the UK’s Railway Mania. They left us with a lot of useful infrastructure and a great deal of bankruptcies and environmental damage.
I think the last paragraph is where I'm still sticking. Companies are plowing ahead to give us AI in things we don't want it in at the cost of A) an economic bubble and B) massive environmental damage. I'm seeing economic impacts near home with datacenters being built at massive tax discounts which benefits the corporations at the expense of residents. There will be bills to pay and right now it doesn't look like it'll be corporations.
I'm not going to start using an LLM daily, but reading Simon over the last year is helping me think critically. I dabbled with self-hosted models, which was interesting but ultimately not really worth the effort on my lower-end machine. Maybe that will change as systems become more and more optimized for more general use.
If you have time, I would encourage you to go read the entire post.
One of my kids said tonight that they want to have 84 children. Another one of the kids exclaimed, "It'll take, like, five million dollars to feed them." That got me wondering if my wife and I have spent one million dollars in our time together.
Our rough estimate using our general food budget, mortgage payment, and house expenses (electricity, gas, and taxes) would take us 40 years to spend one million dollars. We live modestly, but that number was higher than I expected, honestly.
It reminded me of the "one billion dollars" on MS notepad video (lots of NSFW language, so be careful). The fact that there are people with multiple hundreds of this kind of money is nauseating.
I've made some small tweaks to the blog to kick off the new year. For starters, I made the layout slightly narrower because the original theme took up a ton of horizontal space. I don't do any full-bleed layout elements because of the two-column layout, so this will help keep things nice a neat.
The biggest change is how I'm laying out posts on the main index. Instead of just titles, I'm now showing small excerpts. Jinja templating allows me to pull the text to a certain point and then add the "Read more" link when needed. I also did a little bit of preliminary work for posts that I want to throw in that don't necessarily fit the "traditional" blog post format with a title.
Sidebar: it is wild to me that a blog post has a "traditional" format now.
Lastly, in an attempt to have a more semantic layout, I've added a proper footer element into the article element for the post data. I've included a permalink, a server-rendered word count, and then the category as a link. This will let me remove a little bit of Javascript from the post templates I was using to calculate the word count.
We'll see if these changes stick.
Jack Baty had a blurb on his blog this week about filtering server logs to use with GoAccess. I have logs running on my various sites but I don't go through the logs too often, mainly because I don't know enough about tooling to make them more readable. I had tried AWStats a year or two ago but ended up dropping it because it made me wonder why people didn't come to my site. It was also a pain to set up.
It's 2025 now and I decided to throw stats back in, but not as a live service. GoAccess was also much easier to get up and running, so thanks Jack for linking to it in your post.
The TUI was nice and I could pop open a log file to look at the overall stats on one of my various domains. I decided to clear out old gzipped log files and rework my logging strategy a little bit. Nginx will rotate the log daily and put each subdomain into it's own directory that I can analyze whenever I want to. I'm keeping those log files for 30 days at a time because I don't get that much traffic and I don't think my disk space will be filled up.
I followed a wonderfully detailed tutorial by Arnaud Rebillout to have a static HTML file generated. It isn't hosted anywhere and I can rsync it down to my machine to look over every now and then. This method has a small persistent database file which prevents duplicate entries, which is nice.
Will I keep it around? Maybe. At least I don't have to do anything manually to generate the report. It'll be something to pop open when curiosity bites rather than a chore to keep up with.
2024 is nearly finished and one of my last things to do is think over my goals for this year. One year ago, I wrote down some things I was hoping to do. I checked in on those in July and now it's time to look everything over.
- Read 40 books - I didn't meet this one, but I read 29. Having some abritrary number of books to read helped me continue to read regularly, so I'll do that again. I don't know if I'll take the achievable approach or set some ridiculous number just to have a number to shoot for.
- Add blog comments - Still available at the end of every post.
- Cut phone use - This was probably my worst of all. I didn't really keep track of stats like I did with some of these others, and that's probably why it was harder. Sometimes, I just don't have the mental capacity to read or do much other than scroll. It's not a great habit and I need to find another outlet for those fatigue-induced scroll sessions. I'll probably keep this as a goal for next year, but I need some clear cut indicators I can work on individually.
- Ride my bike 150 miles - I crushed this goal. Turns out, I really like riding my bike. I logged nearly triple my goal - 430 miles on a blue 1986 Fuji Allegro - including a wonderful 15th anniversary ride through Chicago and a couple rides to Lake Michigan. We bought an indoor spin bike to keep our cycling muscles exercised during the winter and I'm looking forward to extending my cycling next year. My rides are logged in Strava if you'd like to connect there.
- Get two new courses approved - I am deep in the midst of teaching both Advanced Chemistry and Computer Science (web dev) as new courses this year along with my normal chemistry courses. Three preps is a ton of work - I'm really glad I'm teaching these new classes, but I will be cutting it back to one of those electives each year rather than both.
Every break, we decide to tackle some home improvement projects. This week, we decided to finish putting drywall in the basement. We've been half done for about a year, so this past fall, I finished the framing so we could wrap this project up.
As I was working, I put in new electrical outlets using a coil I had left hanging from the last drywall phase. I wired everything up and then went ahead and tested the connection.
No power.
sweaty face emoji
That's right, I'd not hooked up that wire so that I didn't electrocute myself. Past me was safety conscious.
So, I opened up the first outlet in the run and hooked up the loose wire. Happy to have remembered my foresight, I turned everything back on only to find...no power.
two sweaty face emojis
In all this, the south wall had no outlets, which was strange. I wouldn't have left an entire wall without power, so we went hunting. The electrical boxes behind the drywall would've left a slight bulge. I grabbed my level and, sure enough, there was a subtle bulge in the wall. But, how high was the box?
In such cases, I scratch my head and look at the floor.

Past me was even smarter than I gave him credit for. Knowing, for some reason, that I couldn't cut out the outlet boxes I had put in the wall that I would need to find them, I had marked the floor with the stud and the measurement to the center of the box. I punched and cut with my drywall saw to find a box with wires ready to go.
I spent 20 minutes getting those boxes wired up and, hey presto, the entire basement has power. No cutting or removing drywall hung last year because past Brian was a smart dude.
This phase went so smoothly that my father in law offered to come up and help us get the first coat of plaster on the seams.

Breaks aren't always this productive, but because of some good thinking done by yours truly in the past (that I honestly don't remember doing, so don't give me too much credit), we were able to knock out a relatively big job in just a few hours of work.
Well, it's the twelfth month of the year, which means this is my twelfth reading log blog post. I did not hit 40 books this year, but I did manage to finish 29, so nearly 75% completion. I didn't really keep track last year, so I don't know how much more I read, but I did read much, much more than 2023.
In December, I read:
Revelation Space - Alastair Reynolds
It took me two tries to read this one. I will not be continuing in the series. The first third of the book felt confusing, with different characters in different times dropped right into an entire universe that doesn't get a whole lot of explanation later in the book. Humanity has spread to new stars and has split into different factions with their own norms and histories. There are also interactions with alien species, but again, lacking any connection to the plot unfolding.
Several of the characters are there without much reason and several don't reveal any motivations for their actions. The second third was better than the first, but the ending felt flat. The conflict plays out and some questions are answered, but I'm not convinced the book needed over 500 pages to end where it did.
Accidental Astronomy - Chris Linott
This is brand new and happened to be on the "New Nonfiction" shelf at the library last time I went. I can't really focus on nonfiction during the school year so I try to cram some learning in during breaks.
A wonderfully written, easy read about some of the weird discoveries in astronomy made completely by accident. Linott's writing style is casual with enough technical detail balanced out with clear narrative and witty footnotes on almost every page. I enjoyed this book immensely.
As we roll into January, I will start my count again. Here's to the 2025 reading log!
All of my reading is on LibraryThing if you want to take a look at everything I read in one place.
My hobby project is a self-hosted grading/feedback platform for students to track progress on learning standards. I call it OutcomeMaps, mainly because standardmaps.com was already taken, and it is probably the second most-used site on my machine each day.
Everything we do in chemistry is linked to a speciifc learning outcome - usually a skill based on theory (describe the structure of the atom) or on computation (calculate the mass of product expected from these inputs). Every unit has two or three defined, each unit building on the previous, and students are graded on their proficiency on these standards. The problem is that I didn't have a great way to track progress on their learning.
So, I set out to build a little frontend for a database. It's simple in the sense that students are essentially read-only users and they can see a catalog of all feedback they've received through the year and a dashboard of their progress on any given standard. As the teacher, I can create/edit/score anything, but the main interaction layer is feedback on the skills.

The key is that it helps me make decisions and helps students see their opportunities for improvement. I don't think there's one way to quantify "proficient" but this system has helped me collect data which can then be used for plan for instruction and address emerging needs.
One thing I changed this year is to give binary scores to students. I started thinking about this switch back in March, mainly becuase my grading scheme at the time had areas of uncertainty in the scale that I wanted to eliminate. On paper, this turned into a 0-1-2 scale: no submission, improving, demonstrated. Students have been trained to glance at the number but, more importantly, pay attention to the written feedback. Based loosely on the single-point rubric, it does a better job of getting students to think about their thinking and not just about task completion.
On the web, I turn that into a "check or x" - the UI doesn't actually show their score, just a checkmark or an "x" to note proficiency on that thing. The feedback is displayed right alongside each assignment's result so they can identify their own strengths and areas of improvements for each standard. The goal is to reach a check by the time the unit test rolls around.
This year, I built out an admin panel with some simple charts that will help me - at a glance - look for patterns in each course.

At this point, I was calculating proficiency on the fly with each request because it was just one roster at a time (~25 students per class). This chart needed to generate three objets with data for each standard, so I was looping over each student multiple times. The chart took several seconds to load, which was less than ideal.
I did some work on the database to create a new association table that would record when a student was proficient - generally after taking a test - and I could store that record permanently. I also wrote in a method to override proficiency manually - the use case being that a student might come after school and do some one-on-one work that wasn't on a specific assignment. I can store that proficiency with a click instead of creating a new assignment for that one thing.
This let me query all of those records at once and cut down the load time by orders of magnitude. It also allowed me to set up per-standard comparison charts in the admin panel:

Now, as we're in the unit, I can look at the progress for each class on one screen. This used to be manual - I would look class by class and think over next steps. Now, I can reflect more on what I do differently from period to period and how that translates into success on the skills.
This year pushed me in terms of my coding ability. I've never been comfortable with database joins, but I'm using them all over the place now. I also have a better handle on how to set up models to get the data I want. I'm also coming up with ideas about how to help shepherd students through their own reflections on learning. One goal for this next year is to introduce tagging on standards ("theory" vs "computation", for example) which can help target even more interventions and study strategies for students.
Beyond that, I'm more strategic about my CSS and template structures. I've done a lot of maintenance work to clean up templates and I'm getting ready to tackle a full CSS cleanup (it's a hot steamy mess right now). It's by far my most long-lived project in terms of raw code written to do a thing (as opposed to raw words here) and I'm really proud of how far it has come from my really bad first couple of versions.
Year 15 in teaching, another post on grading. I'm still using standards based grading and I'm still thinking (overthinking?) how to represent student progress on each standard.
I've gone through several scoring style changes. Most recently, I've switched from my old four-point scale to a two-point representation, mostly based on an old post from Kelly O'Shea on her SBG system. Students are given a 0-1-2 score on any skill we work on in class. A 2 means they've demonstrated the skill successfully. A 1 means they've got some work to do and a 0 is reserved for "No evidence." It's simplified my scoring and I think students have a better overall understanding of what "showing proficiency" means in practice.
My deeper struggle is how to represent the final result to students. Each of the feedbacks they get through a unit points them to in-progress fixes. In other words, small errors in their processes get caught and they're able to fix those things on the next attempt. They can see the linear growth from 1's on assignments to 2's. But what about at the end of the unit? How is all of this wrapped up?
Like Kelly, I've decided that tests are the "hard limit" check. If it's not perfect on the test, then it does not show proficiency. All semester, I've been putting that standard score is more or less based on the test attempt. So, even if they've been proficient up until that point, mistakes on a test will cause me to hold off putting that last binary yes/no on the skill into the book as completed.
Kelly's rationale is that the test should be their best true demonstration of understanding, and I agree with that mindset. It's a controlled environment in which they're asked to do the thing correctly. This requirement also helps reinforce the fact that copying and/or otherewise doing unauthentic work leading up to tests is a waste of time for the student becuase the still have to be able to perform the skill at the end of the day.
To help collect evidence over time, I've got a little web app students can use to see their progress on standards. All feedback goes on their papers but it also goes into this app so they can watch their progress throughout the unit. A student may be showing proficiency on a skill throughout the practice work only to be hit with a "not proficient" based on that test. I'm trying to reconcile that story in my mind so that it makes the most sense for them.

The message I need students to really internalize is that learning is a process. Tests are a way for me, the teacher resposible for fostering and reporting their growth in the content, to check that growth reliably and with validity. Reporting their standard proficiency based on the test is the best true check. Their growth up until that point is their indicator for what to fix leading into that final check in the normal flow of the class.
I finished two books in November, which is on par with the rest of the year. Here's what I read:
Contact - Carl Sagan
I picked this up because I really love the movie adaptation, but had never read the novel. The science is much more thick in the book, so some parts were tough to decipher. The plot is also much more intricate (as books usually are), but in good ways. Ellie is hyper-driven to be successful and to stand out in every way. She struggled to really feel like part of the team. In theory, she changed as a result of the experience, but it doesn't come across much in the end. For me, I think this is a rare case of liking the movie over the book.
The Warden and the Wolf King - Andrew Peterson
The ending of the four-part series is one of the best I've read. This book, more than any other (or as far as I can remember, at least) makes me incredibly emotional and I wept (again) in the final chapters. The themes of hope and redemption are overwhelming as the family faces their biggest challenges and have to decide how to respond.
I'm plowing into Revelation Space right now, and I'm hoping to finish it for the December roundup. It's my second time starting it (gave up the first time) but now I think I'm following the story a little better, so I'll probably finish it.
More books and my meager reviews are on LibaryThing. I've had some friends ask to move back to Goodreads and I might make the jump back next year. I miss the social aspect that I had going over there and I might just swallow my distaste for the ads to get that communal reading thing going again.
Only one book read this month. School is pretty busy, so I'm working many evenings on grades and other teaching related tasks. I'm able to read a few nights a week before I go to sleep.
The Book of M - Peng Shepherd
I picked this up after I finished reading The Cartographers, which I read in September.
This book took a long time to develop and felt like the middle was really dragged out. The story is split between several groups of people all living in the same dystopian world. Their stories converge and lead to an ending that left me feeling really unsettled, but satisfied. The premise of the book was very difficult to suspend disbelief for and I think that was its biggest sticking point keeping me from really enjoying it.
This is my 25th book of the year, so I will definitely not be finishing 40, but I'm okay with that. Onward!
I had a small coding itch today after giving the PSAT, so I decided to finally add back in an easy way to share posts from the blog. ShareOpenly is a service which allows anyone to share to any of the federated platforms from any other place. There's no account and no login needed to use the link, but you do need an account on the fediverse (Mastodon, Threads, etc) in order for the link to work.
I used to worry about how much people shared what I wrote, especially when I was on Twitter a little too much. Those days are gone, but this was an easy way to touch a little bit of template code today and make things a little easier.
In addition to adding the button at the bottom of each post when it's generated, I cleaned up a little bit of CSS and added some headings to my sidebar containers. There's still fixing I want to do to the theme, but that'll come later with more time to test the changes. In particular, I want to take what I'm learning from Every Layout and apply it here so I have a more flexible, fully-responsive layout.
Onward.
The point of a blog is to catalog writing. I've switched platforms a couple of times and I decided it was time to get archives front and center again.
With this small update, there's now a link to posts by year on the right (you might need to do a refresh to get the addition). This is an easy way to jump from one spot to another and will help me wander back through old timey Brian.
I still need to get search working again, but this was a nice little task for this evening.
Warning: this post is about raising and processing (ie, butchering) chickens. There are no graphic details, but it does recognize that meat comes from animals which are living up until harvest day.
For the last six years, we have raised and processed our own chickens to feed our families. Every July, we receive chicks from the hatchery which will spend the summer on the pasture in the chicken schooner while they grow and leave their droppings on the grass. It's a small way to get nutrients back into the ground and to provide organic, grass-raised chicken for our family.
Our family raises Rudd Ranger chickens, which are hardy birds that do well fully outdoors. They grow to full size in 12 weeks, so we're butchering after the hottest part of the summer, but before it gets too cold. This particular breed grows slower than other meat breeds, but they're less prone to disease and they don't balloon up and run into joint issues and disease like the Cornish Cross, especially being raised outdoors.


The schooner is moved every day during the growing season so they're always on fresh grass, eating insects, and putting nitrogen back into the ground. This particular pasture needs the nutrients and we can tell the strategy is working because aerial photos of the pasture clearly show where we've had them over the last several summers. The long dark green swoop in the picture is last season's schooner path. The grass is thriving in these areas which is good for the other critters, including the cows when they're grazing out here.

Butcher day is bittersweet. We've taken care of these animals for three months. They're not pets and it's definitely work to make sure they're healthy. At the same time, we cannot dissociate ourselves from the fact that we are living today because something else died. We start early in the morning and work through until every animal has been processed and is either bagged whole in the freezer or is cooling overnight in the chiller.

The second day of work is spent quartering chickens to package as thighs, breasts, and wings. With three families buying in this year, we each ended with about 65 chickens split between whole and pieced up packages.
This is, by far, one of our most hands-on tasks on the farm. We all contribute energy through the growing season, splitting the brooding, feeding, and raising evenly. This is the day when we all put in sweat equity to provide a large portion of our annual meat diets. There is a lot of laughing while we work, but there are also serious moments. When the first animal is started, it's quiet. We're thankful that we have the opportunity to raise our own food. We also understand - and teach out kids - that taking a life is serious business. We don't take butchering lightly and we make sure our kids see the sanctity of the task.
The same is true for the last chicken. After several hours of doing some dirty work, we're glad when the last one is finished. We can sit down and look at the fruits of our labor. It's a very tangible process.
It also really feels like the end of summer. Chicken weekend is a marker for the end of the growing season - gardens are taken out already and this is one of the last jobs to do while we prep for winter. Every year, it's a time for me to reflect on the weeks of work to prepare for this day and I always walk away feeling more connected to this place.
Not much reading again this month. I gave up on The Aleppo Codex because I didn't have the brainpower to follow all of the names and dates. The premise is interesting, but I can't dedicate reading time to something so intense during the school year. Maybe I'll revisit it during winter break.
I did finish two books.
The Monster in the Hollows - Andrew Peterson
This is the third book in the Wingfeather series that I've been reading aloud to my middle two girls. In this installation, it seems the Wingfeathers have finally found haven in the Green Hollows, but the entire family needs to adjust to the new culture. This is made doubly difficult given the challenges they've overcome and the scars they bear as a result. It asks everyone - including the reader - to consider their own monsters.
The Cartographers - Peng Shepherd
This was on a recommended book list when I searched "mystery" in the Libby app through our library. The premise was interesting and I was happy with the mystery that evolved. Then, it turned into a flashback series for the main plot and had a lot of holes in the end...I was left with a lot of questions about why some things happened one way, but similar situations later had different rules applied. I ended up being disappointed.
These were my 23rd and 24th book of the year since January. I'm probably not going to make my goal of 40, and I've made peace with that. Until next time...
I'm not sure "autumnish" is a word, or if it is a word, if it is spelled correctly, but I do what I want here.
After an absurdly hot first three-quarters of September, we're finally enjoying the southwest Michigan start of autumn we moved here to enjoy. The days are warm and the nights are cool. Rain comes and goes each week and there is still a lot of life around us, but just with less gusto. Things are winding down both cultivated and grown as well as the life all around us.
We kicked off the weekend with a fantastic apple crisp made with seconds (ie, not good enough for the expensive bin) from the local apple stand. The couple who run the farm know their stuff and recommend apples based on what you want to do with them. Snacker that isn't too and brings some sour? Cortland. Jonathan apples for the kids becuase they pack that sugar punch the kids just go bonkers for. If you enjoy a crisp every now and then, throw in some cranberries (you can find whole cranberries in stores this time of year) and leave a comment later.
Saturday was split between harvesting our honey from the hives and getting the new batch of chickens acquainted with the old ladies. We modified our coop so the new chicks have some outdoor space where the OG hens can see them and get used to some new chickens in the flock. They'll stay separated for a few weeks until the new ones are ready to join the main group.
We landed on about 130 pounds of packaged honey this fall. This is our family's crop, so we don't really package it for selling like we do our spring crop. That said, we can't eat 120 pounds of honey ourselves. We'll keep about 70 which includes enough for us to use all year, some to trade with family for maple syrup in March, and some for gifts for neighbors, collegues, and the various other people we interact with on the regular.
The last thing on our list is to finish breaking down this year's garden. All of the stakes and plant supports are out - it's time to mow down all the growth and cover it with tarps so the carbon can get absorbed back into the ground for next year's garden. We're going all-in on a production cut flower system to go with the produce and honey on the farm, so we'll spend the winter planning out the expansion and all the infrastructure that will come along.
The season's change is encouraging. We've worked hard and taken advantage of our growing season and now, with the main part behind us, we can enjoy a few more chores knowing that we did good work and can take a rest.
Put the coffee back on and grab a sweater because it's time to finally slow down a little.
We had our first rainy day in several weeks today. As such, our kids were a little on the bored side and needed some help from me on what they could do.
Some of my ideas were:
- Get out the paint sets
- Read a book
- Read a book to your younger sister/brother
- Do a puzzle
- Play with legos
- Sit outside and listen to the rain.
- Sit outside and listen to the sounds of the insects.
- Watch the dog try to scratch her ear, but not be quite able to reach just the right spot and then deal with the frustration of not being able to scratch her ear.
- Scratch the dog's ear when she comes over to you looking for relief from the agony.
- Listen to the sound of your hair growing slowly out of your head, marvelling at the machinery of the human body which produces and folds proteins to make hair in the first place.
- Consider the rain falling off the roof, pulled inexorably by gravity from the clouds down, down, down in the ground; flowing always down into the deep, where it will eventually gather with the other billions of drops into deep, dark wells to be drawn out again someday.
- Consider the twitching of the leaves on the trees, hanging on by the end of the summer sunlight but becoming more frail as the light wanes and the darkness returns, their strength tapped by a season of growth standing up to the start of the autumn wet season before falling and joining the stuff of the earth yet again, carbon returned to the ground.
They ended up jumping on the trampoline in the rain.