Whatever you use, remember that these notes are necessarily only an intermediate form. They don’t become understanding or thoughts until you integrate them. You need to be able to review them, and storing them safely is always useful, but, paradoxically, notes aren’t the be all or end all of the notetaking process.
Over the years, I've gone back and forth on how to efficiently and effectively take notes. I've tried plaintext, bullet journals (but one of those ugly, functional ones), Apple Notes, Obsidian, Bear, Joplin...if it's a notes thing, I've probably tried it. Currently, I'm using a digital notebook, Google Docs (while assigning tasks), and a todo.txt style to do list on my computer. I've always seen notes as a means to an end, putting my brain on paper so my actual brain has more space to do other stuff.
I read Baldur's post very slowly and carefully because it's a much deeper dive into notetaking than I've done on my own. Granted, he's building a new app to handle some of the missing nuance in digital notetaking options and I've not really had to wrestle with the idea at that level on my own. That said, the post got me thinking about why I take notes and whether or not that was sufficient for effective and impactful work.
My notetaking is generally utility. There are sometimes I use my notebook to make sense of thoughts or to sketch out a side project idea. But, nine times out of ten, I'm offloading. I'm getting thoughts on paper that will remind me to do something else later. I don't usually take the time to make meaning on paper, and I think that's an aspect of notetaking I miss.
My work is dynamic - there are some technical problems my team solves, but much of our work is focused on making new meaning out of tools and systems our teachers have access to. We're helping paint the picture of how systems work together to support teaching and learning and while a lot happens in collaboration with the coaching team, there are times where I'm sitting and chewing on ideas on my own. But, because my notebook is a place for "things" rather than ideas, I don't reach for it as a method of building meaning. The idea of notes being the intermediate form stands out because it's someting I know but couldn't have verbalized. I know my notebook holds information, but it's not the final form nor is it even helpful when I'm working on building new meaning.
I'm not sure this means I'm going to change my systems, but I think there's a gap in my work that could be filled by a rethink of how I use the paper next to me.
Once upon a time, I made videos for my students using a sketchnote-style layout. I would have the notes diagrammed and then talk over them while making simple annotations. I would typically draw in Paper by 53, easily one of the best darwing apps for the iPad. Then, I would record in Explain just to keep my workflow to one device. In that time, I learned a super handy layout method which I just recently used to do a project for graduate school.
The key is in using background colors and pen ink. In my "shadow mode," I would prep the design. The background color would be my dark pen color and my pen would be the final white background. Here's a little animation showing the trick:
This is super handy becuase I can get proportions correct and swap between views while I'm drawing to keep everything spaced out correctly. The layout - and sometimes notes - are all hidden, but in the space on the page I wanted to use for that bit.
It's a small trick and I am definitely not the first one to come up with it, but it's a technique I found helpful for a task I had this week, so I decided to throw it up for posterity more than anything else.
YouTube recommended what is probably the most midwest video I've ever come across. It's the 2008 Roofball World Championships and is just as homey and midwestern as it sounds.
Upon further research, Roofball was created in Oregon, which is even more hipster.
Tesla recalls 362,000+ vehicles for safety issues like "driving straight through an intersection while in a turn-only lane." 👀
My brother-in-law collectes maple sap each year to make maple syrup. This year's sugar flow was so early that it overlapped with a vacation they thought would be well ahead of the main flow. As a result, I spent most of a glorious weekend outside with the family managing sap collection and the initial boil. Some fun facts about maple syrup:
The fireplace has two evaporating pans. The lower is the full boil pan and the upper takes care of preheating. A float valve keeps the bottom pan full.
The main job - aside from collecting from the buckets attached to taps - is keeping that fire as hot as possible.
It takes ~40 gallons of sap to make one gallon of syrup.
Early run syrup is lighter in color and taste while late sap is darker and much more sweet as the tree ramps up sugar production to come out of dormancy.
Tea brewed in hot sap is delicious. So is bourbon added to a hot mug of sap.
We needed to do a survey at work that included some open ended questions. We don't have access to a survey platform like Qualtrics, so we have to use Google Forms (generally) and then roll our own stats dashboard. Getting charts is easy, but it's more difficult to summarize those open response items.
I came across a nice text analysis snippet for Google Apps Script which takes an input and ranks words based on parameters you set. In the end, you get list of terms by n-occurances and a relevance score calculated by the frequency of the text in relation to the entire sample. It's not Gospel but it's one of the better solutions I've found for quick text analysis in Google Forms surveys.
You'll need a Google Form and its results linked to a spreadsheet. Once you have that done, open your sheet and then click on Extensions > Apps Script.
Copy the script from the gist linked above and paste it into a file. I like to keep mine separate and since this is quick and dirty, we can use the global namespace to call the function.
Then, start your own script file and paste the following:
``javascript
// Set some globals to get your sheet data.
// I created a new sheet calledCharts` to hold the results
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('Form Responses 1');
const stats = ss.getSheetByName('Charts');
// This function gets the text from the column as responses in an array.
function programFreq() {
const col = sheet.getRange(1, 7, sheet.getLastRow(), 1).getValues()
// The ngram script is called directly because the function is in the global namespace.
// Param 1 is your input text. Params 2 - 4 set options for results:
// - minimum number of occurrences
// - word groupings length (from 1 - 3 words in this example)
// - remove stop words (see line 100 of the ngram script)
let table = KEYWORD_FREQUENCY_TABLE(col, 3, 3, true);
// clear the original table location
stats.getRange(1,1,stats.getLastRow(),3).clear();
// Set a header
stats.getRange(1, 1).setValue('Program Use Frequency')
// Write the new table to the sheet.
stats.getRange(2, 1, table.length, table[0].length).setValues(table)
}
```
After the script runs, you get a table similar to this:
My wife and I have had this same conversation about the benefits of owning physical copies of media recently. We're going to start looking at Goodwill and other thrift stores for copies of titles we want.
I learned about Rowland Hilder this week. He was an American-born painter whose watercolor technique is something I want to imitate.
This book is not for you
The weirdest book I've ever read is House of Leaves by Mark Z. Danielewski. It's a mystery/horror/memoir/research essay all rolled into one insane publication. Anywyas, I'm reading it again for funsies and I came across a great parody on Reddit from 2006. Someone found and scanned the original and the formatting of the pages give you an idea of what to expect if you pick up the book. If you've read the book, the parody is hilarious.
Doug Belshaw shared a post on team status meetings and why they're generally a waste of time. It got me thinking about two things I'm trying to improve with our (currently distributed) team at work:
Awareness. We all have different projects going and we want to be generally aware of what each other is doing.
Team identity. We're still new and forming our own identity within the school corporation. I want people to feel like we are a team, not just a collection of people with similar jobs.
The team identity piece comes in our dedicated time each week to meet together. I generally set the agenda and while I have updates to go over, I always try to build in time to go around the room. The problem is that we don't always need to hear the story behind the work. We're pretty good at talking with one another when we need help, so it's not a communication or coopoeration piece. It was just something team meetings always included, so we included it as well.
Given that we don't always need to know everything, I took Doug's suggestion from his post and put our own status board together. It's a shared space (similar to Trello, like Doug suggested) and each coach is able to keep their own to-do and priority workflows the way they want. Our commitment over the next three weeks is to have cards for our current big-ticket work as well as the next upcoming one. As projects are finished, cards are updated and we can celebrate the work we accomplish. Since we all have access, we can offer help where relevant. I can also see all the projects and make sure everything is within scope. There are two rules we'll keep:
We don't assign tasks to one another. This is a self-reporting mechanism to streamline communication, not project management.
You always have at least one card. It might not feel like a "project," but we always have tasks we're doing, even if they're short. Overcommunication is better than undercommunication.
We're going to try this for three weeks and then revisit as a team to see if it's helping fix the problems we identified and make adjustments to the expectations if necessary.
Last summer, I moved my phone to KISS Launcher. I use search across the board on my computer and I thought having the same toolset on my phone would be preferable. I used it as the main launcher for months before playing around with some others just to see if it was really the best fit. It seems like this year has seen a slew of new launchers focused a minimal, search-first approach.
After using KISS for nearly a year, I switched it back to Nova7 Prime tonight.
UX consistency is a good thing. Whenever my wife needed to use my phone for something, she always struggled. I had KISS pretty minimal and while it worked (okay) for me, it didn't work for us.
I really missed the swipe actions from Nova. I had those pretty dialed in to what I used the most. They make it super easy to thumb open a specific app - particularly while driving (shhh) - and I just never found a good way to do that with KISS. I know I can set favorites, but if I have all my apps on the home screen as favorites, it kind of defeats the search-first purpose.
Folders. Folders folders folders. Grouping apps made me more efficient because I could find things quickly because they're categorized.
I mistap with Nova less than with KISS. I don't know why, but I found myself opening the wrong thing a lot with KISS. Either because of a typo or a stray movement on the screen, it generally led to frustration.
I'm all for minimal - my phone background is flat gray and I use the Snow icon theme. And as nice as a search-based launcher sounds, it just doesn't work for my style of use most of the time.
Frankly, I'm still not thrilled with Nova's acquisition from 2022, but I'll cross that bridge when it comes. If you've got a launcher suggestion that hits those bullet points above, I'm all ears.
My time on Twitter has come to an end. It's been 12 years since I joined and this is - honestly - a sad decision for me.
When I created my account in 2011, I was still a new teacher and Twitter gave me connections to a vast network of other teachers I could learn from. These connections led me to at least one job and plenty of other opportunities to travel, meet people, and grow. Over time, and particularly in the last year, my use declined and I hesitated to recommend creating an account when people asked me how to connect with othes.
Over time, I felt frustrated with the shift away from genuine discussion toward posturing. It seemed like everyone had a position to defend and discussions weren't really possible. Tweets were on brand and written for the audience even when they were directed toward an individual. Reactions felt like the goal.
"EduTwitter" is a subculture of Global Twitter. I stayed around becuase it felt like much of the toxicity of the mainline themes stayed out of education. That's been changing. A few years ago, I stopped participating in formal EduTwitter. I would use the related hashtags if I needed some help, but what used to be a vibrant place had gone more and more quiet. I've stayed on because of the individual connections I'd made. Individuals always make the difference.
I was pretty indifferent to Elon Musk buying Twitter. I wasn't thrilled, but I didn't think it would get as bad - as fast - as it has.
Twitter is a private corporation run by an individual. There is no accountability and there is no indication that the single individual running the space cares for the people. When Twitter was a public entity, there were checks and balances in place to try and take care of the worst of the issues. Was it perfect? Of course not. But those checks existed.
The concern for the user - even if it was a facade of concern - has disappeared. The way in which the organization functions is chaotic and does more harm for people on the platform than good. Maybe it's always done harm, but the harms are more evident and consistent.
Since I have over a decade of my username spread across the Internet, I've decided to keep it active, but inert. That allows me to keep some kind of ownership over the name.
I added a pinned tweet with how to stay in touch then changed my password by mashing my keyboard. I could recover it if I ever needed to, but I'm not expecting to want to come back any time soon.
Dr. TJ Kendon - on what appears to be a new blog - has a wonderful essay on ChatGPT and its best use in schools. Particularly (my emphasis):
By design, ChatGPT and LLMs are knowledge free. They’re designed to take a corpus of text and determine for any particular chunk of text what other text probabilistically comes next. This produces text, and as I keep arguing, if the probable answers are correct, then the text is probably correct, but the correctness is not inherent in the model and in fact isn’t a part of the model. "My perspective on ChatGPT and Learning"
I'm trying to be a better project manager for my team. This video went over how to find the "critical path" for a project simply by using data. I'm going to give this a try.
We've been fighting sickness at home. Our three-year-old also decided he wanted to sleep in his sisters' room, so we have all four packed into one space. It's fun to watch them all growing and wanting to just be around each other, even in sleep.
I've also decided this is the year I stop biting my nails.
I don't think there's a question in my mind about the stages we go through as we learn new things. Much learning seems to be rooted in habits and routines, sometimes without us realizing it. Charles Duhigg (2012) quotes psychologist William James: "All our life, so far as it has a definite form, is but a mass of habits." Later in the same chapter, Duhugg notes a Duke University study that showed up to 40% of our actions every day are driven by habits, not decisions. Habits are learned behaviors - they're developed over time. A habit is simply an automatic response to a stimulus of some kind in order to reach a reward.
The good news is that these habits can be overridden. Bad habits can be replaces with good, but we need to be aware of what triggers those routines in the habit loop. When we're aware of our "normal" responses to situations, we're able to actively change our responses. So, where do our "normal" responses come from?
The idea of conditioning is that learning is based on the stimulus-response interaction (Resnick & Ford, 1981; Berkeley, n.d.). The more times the stimulus is associated with a behavior, the stronger the association becomes. The mechanism of conditioning depends on the situation. At times, we're responding to the stimulus (classical conditioning). Other times, we're more concerned with the result of the response (operant conditioning). The type helps us explain what is happening in the brain as part of the learning process but all forms of conditioning are deterministic. Simply put - the individual has no say in whether or not they are conditioned into learning a particular behavior (McLeod, 2012).
There are situations in which conditioning an individual to form an automatic response to a stimulus is appropriate - the military being a prime example of needing a workforce to act instantly and efficiently (see Duhigg, 2012, chap 3.1 for an example of classical conditioning in the NFL fo another example). With this in mind, habits are formed by conditioning. The habit loop, cue, routine, and reward (Duhigg, 2012), is a clear sequence of a stimulus causing some behavior to reach a goal. The routine - the habit itself - can be learned and conditioning can be the vehicle for learning.
I see Skinner and Thorndike's fingerprints in schools. Thorndike was convinced that learning was rooted in simply forming a strong enough stimulus-response bond in the subject's mind (Resnick & Ford, 1981). Strengthening those associations required practice. Lots of practice. So much so that he argued that schools simply needed to provide students the correct bonds, in the correct order, and in the correct quantity for them to learn the material. Skinner (1937) agreed that repeated interaction with a stimulus (or an idea) would form strong associations for learned behaviors, but he was more interested in the consequences of the behavior and its effect on learning (Cherry, 2020). Learning was a matter of finding the best reinforcement or punishment to form associations between a stimulus and desired response.
I work in technology and the great edtech promise of the last 15 years has been "technology will engage your students in learning." Audrey Watters (2021) notes Skinner's influence in educational technologies that persists today:
If behavior was controlled (and controllable) by the environment, then what better way to make adjustments to individuals — and, as Skinner imagined, to all of society — than by machine....And that is a legacy that is foundational for education technology. It’s not where the story of teaching machines begins, but it’s almost always how the story of teaching machines ends: deeply intertwined with Skinner and with his psycho-technologies. It is a foundation from which education technology has never entirely broken.
If life is a collection of habits acting out, where is there room for understanding? If our behaviors are driven by our own habits, we could infer that the end goal of schooling is to receive a passing grade. Students are given skills to practice and their performances on their tasks are rewarded. Students have learned that the grade is the desired end, not understanding.
But why? Particularly in the realm of learning, behaviorism and conditioning on their own are not enough to describe not only how we learn but why we're driven to learn. Moore (2011) asks why it is "that behavior should be explained without directly referring to mental processes." I want students to develop good habits, some of which are taught through content. At the same time, I want to have a learning environment where students are able to connect ideas to one another to truly form new knowledge.
Cherry, K. (2020, June 3). What is operant conditioning and how does it work?. Verywell Mind. https://www.verywellmind.com/operant-conditioning-a2-2794863.
Duhigg, C. (2012). The power of habit: Why we do what we do in life and business. Random House.
McLeod, S. (2018). Classical conditioning. Simple Psychology. https://www.simplypsychology.org/classical-conditioning.html
Moore, J. (2011). Behaviorism. The Psychological Record, 61(3), 449-463. http://dx.doi.org.proxy2.cl.msu.edu/10.1007/BF03395771.
Resnick, L. B., & Ford, W. W. (1981). The psychology of mathematics for instruction. Routledge.
This year, part of my job has taken on a functional team-leader role. I'm not a leader in the sense that I'm evaluating my team members, but my role has started to become more directive as I work to align professional devlopment across programs within the district. The Instructional Technology team has always been an active arm of PD within the district and the team looks to me to set direction, advocate at the district level, and assign tasks as needed.
However, I'm not a district administrator. I'm essentially a teacher-leader with a seat at the admin table to bring perspective and help plan staff training opportunites with other district leadership. I've approached this position tentatively, which has led to some frustration. Given my non-admin role, I don't always feel like I have the station to speak as a peer with the leadership team. At the same time, there are programs and systems-level challenges I feel I can speak to as a problem solver and leader within the district.
Over the last several months, I've thought about how I can change my thinking and my working habits to takcle some of these challenges. I started by reading Leadership on the Line, which provides insight and perspective on how to effect change in large organizations without burning out or being forced out (systems resist change). I felt like I needed to find ways to confront problems and bring uncertainty forward so we could work to find solutions.
On paper, that sounds great. Leaders effect change. But it also made me feel like I was always in conflict, which hurt my job satisfaction and made me question whether or not I was really capable of taking on more leadership responsibility.
Last week, I had the chance to bring the instructional coaches to a team dynamic workshop where we looked at each of our own work habits and considered how those affect one another and how it affects our team as a whole. I've done these things in the past and I have to say, this one felt different. The facilitators made sure we all understood that people are complex and that patterns are simply indicators and not 100% accurate all of the time. It felt like we were people, not numbers or "types" to dissect.
I realized that my problem was that I wanted to make systems differences before I really understood how to work with the coaches I see day to day. I started to see that my focus on leadership as a way to change systems at the top came at the expense of making sure my team was as effective as possible.
We're early in the semster. I've already spent time digging into some of the tools I have access to as a result of the workshop and I'm considering how I can better facilitate relationships with the coaches as a team and not just as a group of people who do similar work. I want to make sure each of the coaches I'm leading - even if it feels "unofficial" - is equipped to do the best work they can when they're with administrators or teachers out in the buildings.
My lens was focused on the wrong place. I still need to bring challenges to the district level, but that's only half of the work. Taking on the "change-maker" attitude isolated me in my work and made it hard to see how the team I'm leading can be a part of the solution and not just highlighting problems.
My team did a workshop this week and I realized that I've been looking at my leadership role with a skewed lens. I need to do some more processing of what it looks like to lead a group of people.
A litte longer
I'm taking a graduate course this semester on the psychology of learning. The class just started, so we're doing some basic psych on methods of learning and some research background. Last night, I was reading on some of the early research, much of it focused on classical conditioning. In my notes, I wrote:
Conditioning is often presented as a way to achieve behaviors automatically. If those behaviors are things like self-regulation and awareness, is that a bad thing?
If we condition students to calm themselves at a sound (like the meditation bowl thing) have they learned self-regulation? Or are they simply responding to a stimulus out of habit?
Am I interested in forming habits which take over in specific situations or forming students who are aware of themselves and then choose the habits they want to develop?
I have a lot of thoughts floating around that I need to consolidate. This is a difficult subject. Here's the note in context.
I'm writing this blog post using Helx. This is the first time I've really committed to using a terminal-based text editor, focusing on keyboard commands for working in the file.
This is definitely a stretch for my brain, but here are a couple things I like about Helix:
The command pallet has some auto-complete options. In Vim, you needed to memorize commands to get working. With Helix, I can type : to open the list of commands. It also has seaching built in, so I can poke around what I want to do.
The command pallet text has help that shows the short commands (hotkeys or chords) to do that thing without needing to type out the whole command.
Helpful commands pop up on the right. If I know the category of command, I can type the first letter and then look for the specific action. This feels similar to looking at hotkey hints in app menus.
It's fast. Dang, it's fast. Now, I don't do any really intense work, but this thing runs like lightning compared to VS Code or others.
It feels modern within the terminal. It's easy to open a file picker, open new files, and just work without ever moving my hands off they keyboard.
The hardest part, by far, is training my fingers to move around the editor with h, j, k, l instead of the arrow keys. I've started watching some YouTube channels on using terminal editors and it's incredible how fast experienced users move. I'm hoping to get there eventually.
Anyways, this is a really small chunk of what I've learned after a couple hours of use. I'll probably post an update after a week or two of more focused use with more learning.
Welp, I've done it again. I decided to go back to static instead of using WordPress. I want to explain why I made that choice and go over what I'm doing now.
Earlier this year, I decided to move from managed hosting to a Linode VPS. I've been doing more app programming in Python and my shared hosting plan - while great - didn't let me use runtimes other than PHP. There are a couple projects I wanted to make publicly available, so moving to a new host was pretty much the option I was left with.
Instead of paying for two hosts, I've also cut down on the number of things I'm running, focusing instead of the important things. The Linode plan I can afford is very low powered and after experimenting for a little bit, WordPress is a little too heavy for my modest storage, RAM, and bandwidth limits.
Last time didn't work well because I didn't have a good process for writing and deploying the site. This time around, I've gotten some great help from people I've found on Mastodon to get a workflow that works well for me. For example, last time required maintaining a full repository of writing on Github. Jekyll is also built in Ruby, which I don't know. It was difficult to know where things were in the publishing process and in the end, it was all hosted by Github, not me.
This time, I've decided to use Pelican, a static site generator written in Python. It was important to me to have a better idea of everything from the post creation to how to create my own template. It's quite simple - I write posts in Markdown and Pelican spits out a directory of HTML. No magic code repository required and no wondering where the HTML actually is.
Pushing to the server
In learning about how to manage a new workflow, I kept seeing reference to rsync. I didn't know what it was and hooo boy, now that I know, my life has changed. This is one of those truly magical pieces of software that you wish you'd known about years and years ago.
In short, I can do everything - all my writing, templating, and publishing - on my computer without having to push anything up to the server. I can see the generated site to make sure all is well before pushing. Once it's done, rsync can take the created files and push them to the server efficiently and quickly. Since it's all HTML, there isn't anything different here than on the server, so the result is a carbon-copy.
All this to say is that my site feels more resilient to change than it did with WordPress. When I migrated the WordPress version of my blog, I had to copy source files, copy directories, get a database dump, and then reset the nginx server to handle incoming requets to WordPress. With this, I can copy and paste the entire output directory here - or anywhere - and it'll Just Work.
Changes
Will this be my last blog switch? Who knows. I'm happy with this because it's easy to write and manage and requires next to no resources on the server, which means I have more space and resources to play with the fun stuff.
One side effect of static is that commenting isn't embedded anymore. I have copies of all the old comments from WordPress and I'm going to slowly move those back into the posts as text. If you have something you want to contribute or push back on, you can send an email any time to brian@ohheybrian.com and I'm happy to pick up a conversation.
Side note...
Many thanks to AlexMillerDB and Benjamin Hollon for helping to find some hidden wonk in the redesign. Some things are incremental fixes (link syntax, in particular) and a couple others were to improve usability, especially on mobile.
We got talking about ChatGPT yesterday at work and surprisingly, none of us have really been asked by teachers to block it from students. It could be because they haven't heard about it yet or because we're in final exam week and students aren't doing a whole lot of work aside from wrapping up for the semester.
Feelings among the coaches were mixed. We understand the anxiety that comes from the publicity that ChatGPT has drummed up and for some of the examples we've tried out. At the same time, if you actually try using it yourself (requires a login), you'll quickly discover that it isn't as scary as it sounds.
A tool is a tool
At the end of the day, ChatGPT is a computer program which takes in a question and gives back a human-ish response. You can ask about anything (for the most part - it couldn't tell me about myself even though I'm on The Internet) and the site will give you a response summarizing the thing. The summaries were okay and, I will admit, the code samples were cool to see created on the fly.
But here's the thing - it's a summary machine. It gives these responses based on information it has already been given. If you're a teacher or student looking for an interactive method for summarizing information, this is a great tool because it can take natural language prompts ("Tell me about the solar system") and provide information quickly.
Finding teachable moments
If you're not looking for summaries and are more concerned about students making less-than-genuine submissions to your assignments, don't lose any sleep. The responses from the machine are very dry and are easy to spot. If you're taking time to actually read what's coming in, you'll be fine.
For other, less subjective submissions, here are some ways you can use ChatGPT to push your assignments up toward Synthesis and away from Knowledge on the Bloom's spectrum:
ELA
Since it's a summary machine, consider generating a summary via ChatGPT on your own and then use the response as a close-read and editing activity with your students.
Is the summary factually correct?
Is there extra, unnecessary information that can be removed?
Is there context that should be added?
I also gave it a short prompt to write a story and it gave back a passable response. It was creative in the sense that it followed the prompt ("Write a story about a penguin named Sparky who moves to the rainforest.") and gave a story with a start, middle, and end. If your students do this, here are some questions to ask:
Who owns a story once it's written? The person with the idea or the writer?
Can this be edited to have a better story arc?
Is the resolution satisfying? What makes a satisfying resolution?
STEM
One of the big breakthroughs with this model is the ability to generate code samples on the fly. Learning to code can be frustrating because we might not always have the mental model to do what we need to do. Giving ChatGPT a prompt like, "Write a program which generates random odd numbers in python" will give you a working program. Use this as a starting point:
Is this the best way to accomplish that task?
Can you refactor it into something more concise?
How would this type of program be useful?
If you work for a company and you use code from ChatGPT, who owns it?
Math
Wolfram Alpha has had an equation solver for a while, but this goes a little further because you can ask ChatGPT to validate a proof or equation. I tried giving it a proof that "proves" 1 = 0 by including a subtle logical fallacy. The machine tells me it isn't valid, but it does a poor job of explaining why.
Provide students an explanation of what is happening (created by ChatGPT) and then improve it.
Give students a challenge and ask them to validate their responses using the AI.
How could using AI to evaluate mathematics change the way we think about math?
Social Studies
I asked ChatGPT, "How does the geography of the United States contribute to its political climate?" to see how well it could synthesize a response. It give me a five-paragraph essay which kind of danced around a coherent answer, but failed to really make a solid point.
Have students generate a response and then use that information to defend a position they hold in a debate.
Provide students with a summary and use it to research other contributing factors.
Create quick summaries of historical figures to reference in discussions.
World Language
I'm not going to lie, this one was cool. Google Translate already exists and we know students use it. ChatGPT differs in that I could prompt it for regional dialect and formal vs informal responses. It will event provide phonetic responses if requested.
Quickly generate prompts for students to translate or to analyze in class (less work on you)
Compare and contrast different methods for translating a piece of text
Summarize rules for translation for reference
What do we really want to teach?
ChatGPT is a summary machine. It can be used as a way to quickly get information to use as a starting point, and that's the key. It does not cite these sources, and that's where the teaching comes in. Evaluation and synthesis are the next steps to actually do something with what we know. This is an emerging tool and we don't know what wider impact it will have in the future. For now, I would recommend thinking deeply on what I want to teach and how a powerful source of summaries could be used.
Don't forget that it is still susceptible to errors. Even a calculator will always give an answer, but that doesn't mean it is the correct one. Teach students to develop critical habits and to check what they're given to make sure it's factually correct. Train them to look for errors by inviting them to challenge ideas and ask questions.
ChatGPT is impressive and AI is only going to become more impressive. Take some time to think about implications of the tools as it relates to teaching practice. What kinds of questions are worth asking?
This is a story about one of those life events that seems routine that turns upside down real quick.
The Red Ranger herself
It started as a routine clutch replacement. Mine started rattling a little while idling, so I decided to go ahead and change it before it gave out entirely. This is the third or fourth clutch I've done, so I wasn't worried about it and went into the weekend expecting to take at least a full day of work, maybe a couple hours into the next.
All was going well until we started to remove the transmission. My brother in law was under the car and I heard a low, "Oh dear." That's when the adventure started.
You should not be able to see those bolt threads.
The casing where the transmission mounts to the body of the car had broken at some point. This is a Bad Thing to Happen because if the one remaining bolt had broken, the entire engine and transmission of the car could have rotated backwards and essentially torn itself apart.
There are two options in this situation: replace the car or replace the transmission. The benefit of replacing the transmission is that it is much less expensive than replacing the car, so we went for that option. And that's where another snag popped up.
My car is sort of a chimera. The original transmission (5-speed manual) is well known for a bad bearing, which causes catastrophic failure. So, mine has a 6-speed, replaced by the previous owner. It's a more robust transmission and is highly sought after. I wanted to keep the six-speed, but we couldn't find an economical option (rebuilt transmissions can start at $1,800). And this is when we discovered - and ultimately went with - option three: find a five-speed transmission and take the portion with the engine mount and put it on the six-speed.
We headed off to the junkyard and - miraculously - found a wrecked car with an undamaged five-speed manual transmission still in the engine compartment. Jackpot.
Two days later, I was the proud owner of a junkyard transmission and a broken six speed. It was time to hybridize parts yet again.
As complex as these machines look, they're still simple enough to repair.
Problem three: get into the transmission. These are complicated machines that work so well, their overall design hasn't really changed since cars were invented. A series of levers slide collars over gears which send power to the wheels. The power of the Internet confirmed that we were on the right track and we even found a mechanic with a GoPro who showed exactly how to take the transmission apart. So, we set to work.
A couple hours and a broken tool later, we gave up for the night. I went home, questioning every decision I've made to this point. I woke up after a fitful night of sleep and decided it was time to just take the things somewhere. I called nearly every transmission shop and mechanic in the region, but no one wanted to take on such a daring project. Most transmission shops don't even touch manual shift vehicles anymore, which is a bummer. They're repairable! I'll save those comments on American replacement-ism for another day.
Late that morning, I caved and called the dealer service department. Their transmission engineer was willing to give it a shot. With a burst of hope, I loaded everything into the van and drove down to drop things off.
The next day, the shop called and the transmission tech decided it wasn't something he wanted to mess with, either. I asked that he simply remove those top gears so I could dive into the belly myself, which he agreed to. Back to square whatever-we-were-on-two-days-ago.
At this point, I had resolved myself to buckling down and doing the work. Several late evenings and a full Saturday with my brothers-in-law working with me, we had the transmission repaired and re-assembled. The most difficult part, frankly, is getting the thing (it weighs ~90 pounds [41kg] assembled, so it isn't small) back into the tight engine compartment. But we managed it and I could see the light at the end of the tunnel.
Another late night, alone in the garage, and the car is nearly done. After I hook up the battery, I decided to start the engine before I put the wheels back on. All had gone well and I was looking forward to being home before 11PM.
But.
The car wouldn't start.
The good news is that a non-starting car is not usually do to the transmission. So, something was wrong, but it probably wasn't the big something that we just fixed. I started poking and prodding with a multimeter to find the culprit.
The battery was good. The starter was good. I had ground between the battery and the body of the car. The dashboard would light up and I could even get the radio going. So, there was a short somewhere, but I couldn't find it on my own. Generally, you need to be checking power while someone tries to start the car.
I got one of the brothers-in-law back over to help out and we found one ground wire that had a slight loose connecting, but it was slight enough that the starter couldn't pull enough power from the battery. Those connections matter a lot, especially in that high-current surge to turn the engine over cold.
At 10PM on Monday night, the car started for the first time in over a week. The clutch is smooth and the gear shifting feels like butter. It's driving well and I feel like we can easily get another 100K out of this little sprite.
I could write a trite thing about time and patience, both of which were stretched in this little party, but I won't. This was just one of those life things that will help me remember that big projects are doable when you break them down, rely on the expertise and wisdom of others, and get your hands dirty to solve a problem when one comes up.
The great Twitter Migration is causing all sorts of hype around Mastodon, but, in my opinion, for the wrong reasons.
People disillusioned with Twitter since Musk took over are flocking to Mastodon to the tune of hundreds of thousands of registrations per day. That is astronomical growth for what has been, for the last several years, niche communities of people around shared interests.
If you've never used it, the look and feel is very close to that of Twitter. Your timeline takes up the majority of the interface, you use "@" usernames to mention people, and you can follow topics using hashtags. There are some nuances in the differences between a singly-owned space like Twitter and the interconnectedness of individual Mastodon services (instances), but for the most part, the look and feel is similar.
I'm definitely not the first to say Mastodon is more comparable to email than it is to Twitter in terms of system structure. With email, you pick a home - @yahoo.com, @gmail.com, etc. Mastodon is similar - your username is linked to your home. For me, I'm brianb@fosstodon.org.
Looks are deceiving
With federated spaces, your home is part of your identifier. Instances look the same, but the community guidelines, norms, and expectations can vary widely. To really understand the value of Mastodon, it lies in the expectations of people within the community. This is where the email analogy breaks down and where most articles about Mastodon fall short.
Email is federated - different services talk to one another using a shared set of rules for communicating. But I don't see what other people on gmail.com are saying (nor do I want to). Mastodon provides this structure but in a social media context.
Mastodon is federated for a specific reason - a single entity setting the rules for everyone is usually not the best way to go. Each instance is able to set their own expectations and the runners are provided tools to moderate the space. When you're joining an instance, it isn't just a place to post. It's a community you are joining intentionally.
Community and trust building
Joanna Stern has a simple overview of Mastodon on the Wall Street Journal and she touches on the difference of trust as capital in a new social media paradigm:
We’re in a big trust exercise,” said Jennifer Grygiel, a communications professor at Syracuse University. “Is the server in some rando’s closet maybe better right now than Elon Musk’s Twitter?” Prof. Grygiel suggested looking for different trust signals on Mastodon, including servers with larger populations and those pitching more supportive communities.</p>
There's trust in the people who are running the instances. Sometimes, it's single administrators running a public instance while others are teams of people. Either way, you're shifting your trust from a corporation to not be bad to an individual or small team of people - all of whom have names and faces within your community - to act in everyone's best interests. In return, as a member of the community, we act in accordance with the community norms.
Many instances have had some growing pains this week as new registrations flooded in. Some technical pains, but many more cases of culture clash. Hugh Rundle makes a good point in his post:
It's not entirely the Twitter people's fault. They've been taught to behave in certain ways. To chase likes and retweets/boosts. To promote themselves. To perform. All of that sort of thing is anathema to most of the people who were on Mastodon a week ago.
When you join a community, take time to make a good introduction and then spend some time looking at your local timeline. See who pops out and follow to begin curating your own Home feed. Once you feel comfortable, start searching with hashtags for your other interests to gather people from outside your home instance.
Most importantly, take time to listen and get the vibe. The time it takes to de-Twitter extends well past when you shut your account down. Resist the habits of interaction developed on Twitter because they don't fit well with the structure of your Mastodon instance.
“This is a little bit more complicated. But in the long run, for people who are interested in a more community-oriented space, I think it is very much worth it.”
Slow down and really take some time to rethink how - and why - we spend time in these spaces in the first place.
Side note, the header image for this post was generated by the Stable Diffusion image-generation AI with the prompt, "a person running away from a giant blue bird in an impressionist style."
I've been longing for an easier way to manage test data in Flask. Specifically, when running automated tests, I wanted an easier way to populate a database with some known values which would then be used in the tests themselves. This turned out to be tricker than I thought, but I learned a bunch along the way and I'll share that process in detail here.
Why I needed test data
I tend to focus on integration tests - I'm interested in how the application takes in requests and returns a response. Having test data in my database allows me to define test results easily. I know what types of responses I should be getting from each route and dynamically loaded data from a JSON file allows me to quickly define those results over and over.
Up until this point, I would create database objects like normal, using a model constructor:
importunittestfrommyapp.modelsimportEvent,UserclassMyTestClass(unittest.TestCase):defsetUp(self):user=User(name="My name",email="myname@example.com")user2=User(name="Another name",email="another@example.com")event=Event(title="Some event")db.session.add_all([user,user2,event])db.session.commit()# the rest of the testsclassAnotherTestClass(unittest.TestCase):defsetUp(self):# do the same thing...
The problem with this is that it is extremely repetitive. Each test (or each TestCase instance) has its own database declarations which have to be loaded when the test is run. That means I'm either typing each record for each test or I'm copy/pasting items in between tests. If my routes ever change I have to change each instance of the test as a result, which is no fun.
Using libraries
I came across two libraries, but neither really solved my problem but for different reasons.
Flask Fixtures is a library which allows you to run unit tests based on JSON representations of your data. It takes in a list of JSON files and then populates an in-memory sqlite database. I tried this method, but the library hasn't been updated in several years and didn't play well with Flask's application factory pattern.
I had Factory Boy recommended, and while tempting, I needed to have consistent data in memory to run tests against. That said, I'll probably come back to Factory Boy for generating large data sets where I have more freedom in how I test.
I like the pattern of using JSON to populate a test database on the fly. I ended up writing my own, much simplified, version of Flask Fixtures.
JSON structure
I followed the pattern in Flask Fixtures because it provides a clear, extensible way of loading data into the application.
Each file can be expanded as necessary, adding new items or new files to expand the test database scope on the fly. These files live inside /test/fixtures in my project tree.
Dynamically loading test data
Instead of defining database records at the start of each test, I now define records in JSON files which can be loaded on demand within a test or set of tests. The biggest change in my app structure was to handle application context appropriately.
A new Loader module is created with the current application instance, database, and a list of fixtures to load into sqlite. The module only runs within the current context, so I can control when loading happens within the individual tests, even loading data after the setUp function has run.
importjsonimportosimportunittestfromsqlalchemyimportTablefromapp.extensionsimportdbclassLoader(object):"""
Reusable class for loading fixture data into test databases.
Initialize with an in-context application and database engine.
"""def__init__(self,app,db,fixtures):self.app=appself.connection=db.engine.connect()self.fixtures=fixturesself.metadata=db.metadatadefload(self):forfilenameinself.fixtures:filepath=os.path.join(self.app.config["FIXTURES_DIR"],filename)withopen(filepath)asfile_in:self.data=json.load(file_in)self.load_from_file()defload_from_file(self):table=Table(self.data[0]["table"],self.metadata)self.connection.execute(table.insert(),self.data[0]["records"])returnclassMyTest(unittest.TestCase):defcreate(self):self.app=create_app(TestConfig)# Build the database structure in the application contextwithself.app.app_context():db.init_app(self.app)db.create_all()returnself.appdefsetUp(self):self.app=self.create()# Set up the application context manually to build the database# and test client for requests.ctx=self.app.app_context()ctx.push()self.client=self.app.test_client()# Include any data to be loaded into the databasefixtures=["events.json","users.json",]# Now that we're in context, we can load the database.loader=Loader(self.app,db,fixtures)loader.load()deftearDown(self):db.session.remove()db.drop_all()
Main takeaways
My biggest frustration was figuring out application context. This update to my test runner included moving to an application factory pattern, so I had to rethink how everything ran from the ground up. In the main application, context is handled by the create_app function and I didn't have to think about what context was active. In the tests, that has to be done manually with each instance. Moving the app context into startUp ensured only one context was used at a given time.
Being self taught, I do my best to apply best practice principles like "don't repeat yourself" (DRY). This was especially noticeable as the number of tests increased and I'm happy with this solution. There's still some boilerplate for each test case and one of my goals is to wrap that up in a unittest.TestCase subclass so I can simply inherit the boilerplate rather than type it out. I'm still working on the best way to do that for my use case.
This is probably one of the more complex problems I've had to solve on my own. The application itself is just a layer to interact with database records, so the logic itself isn't too complex. Writing my own module to handle the automated work was new and I'm happy with the result. I'm hoping to be able to expand on it and eventually (maybe?) package it up into something I can import and use in some other projects. But that's another task for another day.
In September, it was my family's turn to battle COVID-19. We're not sure who brought it home first, but it hit me first. Hard.
Not as hard as a lot of other people, but I was flat for a couple days battling high fevers and severe muscle and joint aches. Luckily, I didn't have any of the breathing issues that have hurt so many people. Following me, my wife and kids all came down with positive tests, so we settled in for - what we hoped - would be a relatively short infection period.
Unfortunately, our tests lingered positive. We stayed away from family and friends. We weighed how to safely get groceries (we're pretty rural, so delivery isn't really viable), and how to pass the time. The hardest part was when we were all feeling better, but still testing positive.
We ended up finding ways to be outside together away from people. We took trips to local creeks and parks. We spent time working in the garden on the farm, preparing for winter. One of the best trips was to Warren Dunes State Park about 30 minutes north of here.
The sand stretches in every direction.
The kids hadn't ever been to the dunes, so this was a treat for us. In the parking area, there is a monster dune immediately across the road and they started running to the top. By the end, they looked like Everest hikers, stopping every couple of steps to catch their breath due to the actual height and an incredibly steep grade.
Warren Dunes is nearly 2,000 acres and has public camping access, so there are trails all over the dunes to different campsites. They weave down, in, and around natural trails through the scrubby dune grass so you move from full sun to shady and change elevation quickly (if you want to). There are also several stretches that cross the ridges of adjoining dunes, so you can move across the area with amazing views out across the lake.
We chose to stay on top instead of going down and then back up.
We've lived in small-child land for a very long time. This was the first time our three year old was almost as independent as his older sisters. He wanted to walk, slide down hills, and climb with the older kids. My wife and I were actually able to walk and talk together while the others explored.
I think this is the start of the next phase of family life - one where we can begin to set and break boundaries at the same time. It also makes me realize how many of the childhood memories I have were created by my parents - and we need to do the same. We're looking forward to protecting our family time so we can get out and explore more frequently.
This is a great look at how our practice of teaching needs to change if we want students to think differently about school. The author writes from the perspective of doing this as a result of going gradeless, but the same habits of instruction can be used to make the same shift if gradeless isn't an option.
...I find that students approach me with a different question; “Can you show me how to do this?” Since my students are self-assessing their work regularly throughout the term, they always have a strong grasp of where they have shown understanding and where they are developing their understanding.
The same thing often happens in standards-based approaches to grading or even just focusing on feedback to drive your interaction with students. The critical component is to hone your own responses to questions to point students back to the main goal: learning.
I always appreciate your thoughtful articles, Brian! I’m still trying to formulate my opinion on Chat GPT and related AI tools.