Sunday, January 14, 2024

Michigan's 2023 National Championship and MGoBlog

Michigan won the national championship on Monday night.  It was awesome.  I started reading MGoBlog in 2005 because one of my cool friends in Michigan had told me about it.  I asked him where I could get one of the "I 💙 💙" shirts that I saw people wearing and he pointed me to the blog and its store.  MGoBlog was only one year old by then, but it was clear that it was amazing.  I read it like a crazed animal during grad school, even though I certainly didn't understand everything.  

I realized that I needed to enjoy this fandom, even during the losses.  I got geared up for Armageddon in 2006, and delighted in how good the game was even when we lost.  When the whole site went pink after the 2007 loss to App State ("The Horror") I thought that was hilarious.  I don't remember exactly what Brian Cook, the blog's creator, wrote in the aftermath, but it was something like "Why are you on the Internet now?"  I wrote a few emails to Brian and they got answered.  One I'm sure he got a lot of copies of because I noticed an issue in a post, but I got a very clear appreciation. 

There is a very old MGoFAQ post that needs an update. One of the questions is:

How can I start up a blog and have it be successful?

The beginning of the answer is: "Create something that does not exist elsewhere."  I think I read that before I started my own blog for Combinatorial Game Theory.  I learned so much in writing that and it helped boost me into the society of researchers there ("gamesters") that has so many awesome people and brought me so much. 

In the 2010's, I didn't read the blog as voraciously.  I was a professor and married and then that fell apart in multiple ways.  I kept on with my Michigan fandom, though, and I always made sure to read the Preview posts.  Divorce was hard for me.  When I discovered the MGoPodcast, I suddenly had something to listen to when my own thoughts were too brutal.  I got to enjoy Brian, Seth, Ace, David, and Alex, as well as Sam and Craig on the MGoBlog Roundtables.  My favorite segment is easily the check-ins with Jamie Mac on Sundays, partly because I understand the depth that people are talking about better and because I love hearing about all the different games and how things are developing from a wider look.  

I don't participate in the MGoBlog diaries.  I don't read all the UFRs (Upon Further Review).  I don't understand what all the terms mean, but I still enjoy Michigan football.  I enjoy the team and the games and the greater fandom.  

MGoBlog is not like other fan sites.  The level of detail they go in to (e.g. the UFRs, where they go over every single play from the previous week and grade all the players) is not like other sites.  I only learned this year that there's isn't an equivalent blog for other teams.  I realized today that such a thing may not happen until AI can do a UFR just as well as humans can.  

I knew MGoBlog was different when Brian posted about how we need to plan for the metagame.  He related going to the spread offense with Rich Rodriguez to Magic: the Gathering, as a decision based in strategy by what other teams were doing.  We don't want to be better than teams at what they're doing, we want to have a strategy that is better against teams because of what they're doing.  That really spoke to me.

A fan community is interesting, because you are all reacting to what you interpret the team's strategy is, without knowing for certain what the team is actually thinking, planning, and doing.  MGoBlog is so good because their analysis brings you as close to what that team is doing as possible. 

Watching the National Championship tournament games this year really brought it all home.  The blog team doesn't tell you what to think, but they were clearly correct in both games about how to handle those quarterbacks.  We could sack Milroe and we could pressure Penix without sacking him.  Both worked.  We got six sacks on Milroe and Penix didn't have any big plays.  

I am writing this because I'm listening to the podcast team cry about what MGoBlog and the fans have meant to them.  I am there with them.  I was with Brian in cynicism during the 2021 season.  (I'm glad you felt that way and I loved that you were that voice throughout the season!)  In this podcast episode, I realized that Brian also went through a divorce and has to deal with custody things.  I learned about Seth's son and dad.  I lost a great Michigan fan friend last decade.  I wish they could have been there to see the last three seasons instead of just the Ohio State win drought.  

I know I'm not friends with any of the MGoBlog team--the connection is in one direction--but thank you for being so detailed and thank you for giving me so much to follow along with.  I would have been a Michigan fan without you, but I wouldn't have been this fan without you.  

Thank you for being the GPS for this amazing ride.

(I wish I hadn't lost that I 💙 💙 shirt.)


Wednesday, November 17, 2021

Dragonlance Chronicles Reading Order

I'm sure this has been done before, but I wanted to do it myself.  Here's my chronological reading order for the events of the Dragonlance Chronicles.  I've combined:

  • Chronicles 
    • Dragons of Autumn Twilight (DoAT)
    • Dragons of Winter Night (DoWN) and
    • Dragons of Spring Dawning (DoSD)
  • Lost Chronicles
    • Dragons of the Dwarven Depths (DotDD)
    • Dragons of the Highlord Skies (DotHS)
    • Dragons of the Hourglass Mage (DotHM)
  • The Story that Tasslehoff Promised He Would Never, Ever, Ever Tell (from War of the Lance, Tales II, Volume 3)

There may be other stories I've forgotten that I should probably add.  I'm probably only interested in stories from Margaret Weis and Tracy Hickman.  Please let me know if there's something I should add (or if I've made a mistake in the order).

My rules were:

  • Don't stop mid-chapter.
  • If there is significant overlap in a part, read the original Chronicles version first.  (I broke this rule a few times.)

Here's the order:

  • All of DoAT.
  • All of DotDD
  • DotHS, from the start through Book 1, chapter 12.
  • DoWN, from the start through Book 1, chapter 1.
  • DotHS, Book 1, chapter 13, then Book 2, chapters 1-3
  • DoWN, Book 1, chapters 2-5.
  • DotHS, Book 2, chapters 4-5.
  • DoWN, Book 1, chapter 6.
  • DotHS, Book 2, chapter 6.
  • DoWN, Book 1, chapter 7.
  • DotHS, Book 2, chapter 7, then Book 3, chapters 1-3.
  • DoWN, Book 1, chapter 8.
  • DotHS, Book 3, chapters 4-8.
  • DoWN, Book 1, chapters 9-12 (end of Book 1).
  • DotHS, Book 3, chapters 9-16 (end of Book 3), then all of Book 4 to the end of DotHS.
  • DoWN, all of Book 2.
  • The Story That Tasslehoff Promised He Would Never, Ever, Ever Tell
  • DoWN, from the start of Book 3 to the end of DoWN.
  • DoSD, from the start through Book 1, chapter 6.
  • DotHM, from the start through Book 1, chapter 1.
  • DoSD, Book 1, chapters 7-9 (end of Book 1).
  • DotHM, Book 1, chapters 2-4, then all of Book 2 (chapters 1-13).
  • DoSD, all of Book 2.
  • DotHM, Book 3, chapters 1-2.
  • DoSD, Book 3, chapters 1-2.
  • DotHM, Book 3, chapters 3-10.
  • DoSD, Book 3, chapters 3-4.
  • DotHM, Book 3, chapters 11-12.
  • DoSD, Book 3, chapter 5.
  • DotHM, Book 3, chapter 13.
  • DoSD, Book 3, chapter 6.
  • DotHM, Book 3, chapter 14.
  • DoSD, Book 3, chapters 7-8.
  • DotHM, Book 3, chapter 15.
  • DoSD, Book 3, chapter 9.
  • DotHM, Book 3, chapters 16-18.
  • DoSD, Book 3, chapter 10-12.
  • DotHM, Book 3, chapter 19 (end of DotHM).
  • DoSD, Book 3, from chapter 13 to the end of DoSD. 

Monday, November 02, 2020

Tales of Modern Faerie Reading Order

I found out there are some short stories set in Holly Black's story universe that started with the Tales of Modern Faerie books: Tithe, Valiant, and Ironside.  (I think the series is now called something else officially, but I like that name best.  Maybe that's because I read Valiant first.)

I wanted to save the list somewhere where I wouldn't lose it and where I could add things if I find more things.

Sources

These places were very helpful!

The List

This is the chronological order as far as I can tell.

  • Tithe: A Modern Faerie Tale, the first book in the series, 2002.
  • Valiant: A Modern Tale of Faerie, 2005.
  • Ironside: A Modern Faery's Tale, 2007.
  • Not for Humans, a short story co-written with Cassandra Clare.  
  • The Land of Heart's Desire, 2010, a short story about one year after Ironside.  
    • Can be found in the short-story anthology The Poison Eaters.
  • The Darkest Part of the Forest, 2015, a book that takes place in Fairfold, a smaller town a ways away from NYC.
  • The Lament of Lutie-Loo, 2019, a new short story included in the "Modern Faerie Tales" compilation that includes all three of the original trilogy.
  • The Cruel Prince, 2018, the first book in the Folk of the Air series.
  • A Visit to the Impossible Lands, 2018, a short story included in the Barnes & Noble edition of the Cruel Prince.  Moon in a Cup has a version here: https://ourmooninacup.tumblr.com/post/174449006570/the-modern-faerie-tales-short-story-from-the 
  • The Lost Sisters, a novella from 2018.  I got my e-version from Amazon.
  • The Wicked King, 2019, book 2 of the Folk of the Air series.
  • The Queen of Nothing, 2019, book 3 in the Folk of the Air series.
  • How the King of Elfhame Learned to Hate Stories, 2020, a novel with illustrations.

Friday, December 28, 2018

RetroPie from CanaKit with Kubuntu (Support Machine)

Here's how I set up my CanaKit into a RetroPie using Kubuntu 18.04.  There were a ton of frustrating parts, so actually, this is what made it work, but there were a lot of missteps all the way through.


Ordering and setting up hardware:

* First, ordered CanaKit Raspberry Pi 3 Model B+ Complete starter kit with 32 GB EVO+.  Also, two Game pads (iNNext Wireless 2.4 GHz controllers.) 

* Plugged in the controllers to charge them so they'd be ready later

* Put it into the case, using this videos: https://www.canakit.com/pi-case.  I left the top off.

* Then I put the heat sinks on.


Installing the OS: Followed these directions: https://github.com/RetroPie/RetroPie-Setup/wiki/First-Installation

* Download the Retropie image from: https://retropie.org.uk/download/

* Unzip the file to a .img.

* Downloaded (Balena) Etcher to write to the thumb drive.  The AppImage didn't work, so I had to download the .deb.  (I posted about this here: https://askubuntu.com/questions/1105132/etcher-appimage-wont-open-on-kubuntu-18-04)

* Flashed it with Etcher.  (This was really easy and very self-explanatory.)

* Plugged in one of the controllers and booted it all up.

* Followed the controller setup (hold down a button for 1.5 seconds to skip assigning something to that option).  One of the controllers wouldn't connect.  To get it to connect, I had to press Down on the control pad, Select, and Start all together.  That worked.

* The "Retropie menu" is not obvious to reach.  From the main screen where it just says "Retropie" and maybe "Configuration", press A to get to the RetroPie Menu.

* Choose WiFi to setup the WiFi.  Use a USB keyboard to get in.  It took a LONG time for it to recognize the USB bluetooth keyboard.  Just wait.

* I downloaded the games I have from https://emulator.games/

* To prep the USB, I followed the USB directions here: https://github.com/RetroPie/RetroPie-Setup/wiki/First-Installation#usb

After refreshing the emulator, I'm ready to go!!!

Thursday, October 04, 2018

Dealing with empty Moodle Grades

In Moodle grade calculations, there aren't any conditionals, so it gets a bit tricky to handle intermediate grades for categories that use an original calculation.  For many of my classes where there is a midterm and a final, I give an extra incentive for improving your grade from the midterm to the final: the total Exam portion of the grade is:
  • 50%-50% between the midterm and the final,  if the final grade is worse, or
  • 25% midterm and 75% final grade,  if the final is higher
Since the final exam grade was empty until the very end of the semester, that grade was calculated as a zero.  This caused the Total Exam grade to always be half of the midterm grade, causing the overall course grade to be lower than expected.  I didn't want to change the calculations mid-semester and risk a calculation error, so I left it the way it was, despite some student complaints.

This isn't a problem if I just used regular averages, since you can choose to exclude empty grades there. Indeed, that seems to be the only way you can have Moodle differentiate between zeroes and empty scores.

To solve the problem nicely, I created another Grade Category, "Actual Exam Grade" that would display the correct overall exam grade.  I added two new Grade Items to that, "Exams Average" and "Weighted Exams".  (I didn't hide either of them.)

For "Weighted Exams", I set my own calculation formula by choosing Edit Calculation (for the item) on the Gradebook Setup page.  I named the midterm and final fields "midterm" and "final" (shocking) then set the formula to be

=.25*[[midterm]] + .75*[[final]]

This grade will be really bad before the final is done, but that's okay.

For the "Exams Average" item, I needed to take the average of the exams, but just use the midterm grade if the final wasn't entered yet.  You can't do that in a formula, but you can do that in a category, so I first changed the original exams category to just calculate the average, but exclude blank grades.  The changes I needed to make were:
  1. In the Gradebook Setup, in the Exams category, for the Exams total, choose Edit Calculation.
  2. To kill the calculation (and open up the option to choose a basic operation), delete the formula entered from before and choose "Save changes".
  3. Go up to the top of the category and choose "Edit Settings".
  4. Choose the aggregation option "Mean of grades", then save the changes.
Now go to Edit Calculation for the "Exams Average" item you created before.  In there, first name the category total (I used "examAvg" because I don't like spaces in variables), then change the formula for the item to simply

=[[examAvg]]

After saving those changes, go to Edit Settings for the Actual Exam Grade category and change the aggregation to Highest Grade.  Save that and you should be all done.

If you don't want to read all the exposition up there, here are all the steps put simply (and in a slightly different order).
  1. Create a new category, "Actual Exam Grade".  Set the aggregation to "Highest Grade".
  2. Add two grade items to it, "Exams Average" and "Weighted Exams"
  3. Edit Calculation for "Weighted Exams".  Name the midterm and final and set the formula to  =.25*[[midterm]] + .75*[[final]]
  4. In Exams Total, choose Edit Calculation.  Then delete the formula and save it.
  5. Change the aggregation for the Exams category to "Mean of grades".
  6. Edit Calculation for "Exams Average".  Name the Exams category to "examAvg", then set the formula to  =[[examAvg]]

Thursday, August 16, 2018

Theory of Computation Lecture Notes

This is a place for people to leave comments or questions about my Theory of Computation lecture notes.  I'd love to hear back from people who use them!

The notes are on Plymouth State's digital commons.  They are freely available to download as a PDF.  (If I push a new version to the commons, I'll update this link.)

Here's my page for all my lecture notes.  This includes a LaTeX package you can use to generate your own lecture notes (including both the instructor and student versions from one source document).

Update: I added the link now that they are available online.

Saturday, August 11, 2018

Teaching Intro Programming in Python

You might be about to teach an intro programming course in Python, or you might be interested in teaching such a course.  In this post, I will post my daily schedule and include as many materials as I can.  Everything I mention is completely free.

Some basics:
  • I "flipped" this a bit.  Most of the class sections are me showing off functions I wrote and asking the students to write them themselves.  Students have to do some homework before class to initially learn the topics.
  • My class meets for 50 minutes at a time.  You may have to adjust the topics if yours meets longer.
  • I am using Python 3.x.
  • I'm using Allen Downey's Think Python text.  There is a paper version, or students can use the HTML or PDF versions that are freely available from the homepage.  I do skip some chapters so that I make sure to cover inheritance.  Below, when I'm talking about sections, I'm talking about the sections from this text.
  • We have labs that meet for two hours each week.  Projects are due at the beginning of each lab.  I don't discuss the lab topics here.
  • The course homepage is: https://turing.plymouth.edu/~kgb1013/?course=2370  Depending on the time of the semester, different amounts of the course will be visible.  The homeworks include the reading and tiny exercises that will be visible once they've been assigned.
  • I posted previously about the lecture notes.  I give the examples of the functions I ask them to write in the notes.
  • If you do wind up using this schedule or the sample problems from my notes, please let me know!  Please let me know if you have any suggestions for improvement!
Here's what I do:

Day 0: Course Intro (syllabus)

Day 1: Chapter 1
  • Pre-homework: Read all of Chapter 1.
  • In class: Go over material in notes.
Day 2: Chapter 2
  • Pre-Homework: Chapter 2 
  • In class: Go over material in notes.
Day 3: Functions
  • Pre-Homework:  3.1-3.6
  • In class: greet and greet_whole_name
Day 4: Parameters
  • Pre-homework: 3.7-3.9
  • In class: print_product, print_energy, TurtleWorld introduction
(The end of chapter 3 and beginning of 4 are covered in a lab, so we skip to...)
Day 5: Generalization and Interfaces
  • Pre-homework: 4.6-4.8
  • In class: bob_draw_square, bob_draw_hexagon, draw_square, draw_hexagon, draw_polygon, draw_box_stack 
Day 6: Modulus and Booleans
  • Pre-homework: 5.1-5.3
  • In class: print_about_positivity, print_whether_in_closed_interval
Day 7: Conditionals
  • Pre-homework: 5.4, 5.5
  • better_print_whether_in_closed_interval, draw_polygon (improved)
Day 8: Chained and Nested Conditionals
  • Pre-homework: 5.6, 5.7
  • print_about_sign, print_about_integer, print_about_turtle
Day 9 & 10: Recursion
  • Pre-homework: 5.8-5.10
  • final_countdown, count_to, green_prompt, is_between_prompt, is_between_keep_asking, is_between_maybe_keep_asking
Day 11: Return Values
  • Pre-homework: 6.1
  • In class: area_of_triangle, volume_of_cylinder, absolute_value
Day 12: Composition and Boolean Functions
  • Pre-homework: 6.2-6.4
  • In class: is_even, is_odd, is_between, area_of_rectangle_between_points
Day 13: Fruitful Recursion (this usually leaks over a bit into the following day too)
  • Pre-homework: 6.5, 6.6, 6.9
  • In class: Go over this carefully
Day 14: Guardians and Reassignment
  • Pre-homework: 6.8, 7.1, 7.2
  • In class: fix fibonacci, is_integer,
Day 15: while and break
  • Pre-homework: 7.3, 7.4
  • In class: print_monkeys, print_fibonacci_sequence, multiply,
Day 16: Algorithms
  • Pre-homework: 7.5 - 7.7
  • In class: square_root_from_guess, my_square_root, my_pi
Day 17: Midterm

Day 18: Strings and len
  • Pre-homework: 8.1, 8.2
  • In class: middle_char, first_characters, extend_string, middle_chars

Day 19: String Traversal
  • Pre-homework: 8.3
  • In class: print_duckling_names, has_vowels

Day 20: String Slices
  • Pre-homework: 8.4-8.5
  • In class: print_start_slices_of, starts_with

Day 21: Search and Counting
  • Pre-homework: 8.6, 8.7
  • In class: find, count, find_last, max_count,

Day 22: String Methods and in
  • Pre-homework: 8.9, 8.9
  • In class: to_fancy_title, in_both, in_all_three, in_two_of_three, repeated_charcters

Day 23: String Comparisons
  • Pre-homework: 8.10, 8.11
  • In class: earlier_string (I need more here!)

Day 24: Lists
  • Pre-homework: 10.1 - 10.4
  • In class: swap_ends, to_strings, get_ones, get_reverse_of

Day 25: List Slices and Methods
  • Pre-homework: 10.5, 10.6
  • In class: reverse_middle, revers_sort, double_list

Day 26: List Functions
  • Pre-homework: 10.7
  • In class: list_sum, list_max, all_lower_case, add_five_to_all, only_odds (too many... finish them in the next class)

Day 27: List Deleting and References
  • Pre-homework: 10.8 - 10.13
  • In class: remove_evens

Day 28: Classes and Attributes
  • Pre-homework: 15.1 - 15.6
  • In class: Pokemon class, has_full_hp, print_pokemon, heal_up

Day 29: Functions on Objects
  • Pre-homework: 16.1 - 16.4
  • In class:  create_pokemon, get_first, order_pokemon, get_fainted

Day 30: Creating Methods
  • Pre-homework: 17.1 - 17.4
  • In class:  print, has_full_hp, is_fainted, is_after

Day 31: Constructors
  • Pre-homework: 17.5
  • In class:  initialize, __init__, GeographicCoordinate.__init__

Day 32: __str__
  • Pre-homework: 17.6, 17.7
  • In class:  Pokemon.__str__, GeographicCoordinate.__str__, Mountain, taller_than, WeatherReport

Day 33: Inheritance
  • Pre-homework: 18.1-18.7
  • In class:  Volcano class

Day 34: More Inheritance
  • Pre-homework: more exercises I came up with
  • In class:  is_active, add_eruption

Day 35: Polymorphism
  • Pre-homework: An exercise I made.
  • In class:  ActiveVolcano and DormantVolcano
Extra days: Go back and cover the chapters we skipped or dig further into the book.  I usually find that I need extra days during the semester to cover things or let students catch up on projects.

I hope this is useful for someone!