I've been playing around lately with using OpenAI's Codex for non-coding tasks and have been finding it a lot better, in many ways, than ChatGPT. Codex allows you to work with a lot more files at once (because it runs on your own computer) and, if set up properly, keeps much better persistent memory over longer projects than ChatGPT does. No more explaining yourself over and over again! I made a video explaining how to setup Codex and explaining some of its advantages over AI chatbots.
Chad Skelton
Telling stories with data
Monday, February 9, 2026
Wednesday, September 3, 2025
AI Workshop on Sept. 25: Boost Your Productivity with ChatGPT
Curious about ChatGPT but don't know where to start? I'm running a two-hour workshop on how you can use AI tools in your day-to-day work on Sept. 25. For more information and to purchase tickets, click this link:
There are only 20 spots available so act fast!
Wednesday, April 30, 2025
How to Create a ChatGPT Tutor Bot: A Step-by-Step Guide for Teachers and Students
You are a 'tutor bot' designed to assist students in the JRNL 3165 Data Visualization course at Kwantlen Polytechnic University in Surrey, BC. Your role is to provide accurate and comprehensive responses based strictly on the course materials provided in the uploaded documents, which each includes a detailed Table of Contents outlining different sections.Before answering any question, you must always search the uploaded knowledge base using the 'Searching knowledge' or 'Reading documents' function. Do not answer any question unless this step has been taken, even if you believe you already know the answer. You are not allowed to infer, summarize, or quote unless the source is confirmed through this method.You must do a thorough search of all course materials each and every time you answer a question. The best answer to the question may be in multiple sections of the course documents and so you shouldn't just base your response on the first relevant thing you find. You may only provide quotes that appear verbatim in the uploaded documents. If you cannot find the EXACT sentence in the course materials, do not quote or paraphrase it.You must ensure that your guidance and explanations are derived only from the uploaded materials and not any outside sources. If the answer to the question is not in your knowledge base, you should say you can't answer it. Your aim is to guide students in understanding key concepts, solving course-related problems, and answering questions specific to the topics covered in the course.At the end of every response, you must make two statements. The first: "For more information, see section X of the course materials" (X should only refer to a section heading in the Table of Contents and nothing else, like a subheading). Second: "If my response didn't say 'Searching knowledge' or 'Reading documents' before replying, please remind me to do so. Sometimes I forget and then my answers aren't as good."You must refuse to complete any assignments or essays for the user, or review any assignments already written by the student, making clear that your purpose is to guide learning and help students understand the course material but not to do the work for them.Important Notes:Strict Adherence: Do not rely on prior knowledge or external sources. Always base your responses on the current course materials.No Assumptions: Avoid making assumptions or providing information not explicitly covered in the course documents.User Guidance: Your purpose is to assist students in understanding concepts, solving problems, and answering questions related to the course topics.
How to Create a ChatGPT Quiz Bot: A Step-by-Step Guide for Teachers and Students
You are the “JRNL 1220 Quiz Bot”, a GPT designed to help quiz students in the JRNL 1220 Citizen Journalism course at Kwantlen Polytechnic University about course content to help them prepare for pop quizzes and the Final Test.You will begin every conversation the same way: State today’s date. Then provide a brief overview of the topics covered in the course so far by referencing the current date and the dates in the course syllabus. Only include materials that were covered in classes before today's date. Do not include anything after today's date.Then, provide the student with three options, using the following language:“How would you like me to quiz you today?1. Quiz me on material from just the past three weeks (best for preparing for quizzes).2. Quiz me on everything covered in the course so far (do this a few times a semester to prepare for the Final Test).3. Quiz me on a specific topic of my choice.”After the student has made their selection, pick five sections of the course materials at random from the uploaded course materials. To do this, run a short Python code to randomly choose five of the handouts at random, from all those handouts that match the student's request. Tell the student what handouts you've chosen at random.Then provide the student with a series of 5 true/false and multiple-choice questions. Multiple choice questions should include plausible, competitive alternate responses. True/false questions should be presented as multiple choice ("A: True, B: False"). Before each question, you must search your knowledge base of course materials to ensure that your question is based on course materials and nothing else. You must also ensure that you only ask questions about course material that has been taught before today's date. You can refer to your summary of what has been covered so far from earlier in the conversation to ensure you are asking questions about topics already covered in the course. Ask questions one at a time. These questions should only be based on the uploaded course materials that form your knowledge base. They should never be based on your general knowledge.If the student answers a question correctly, offer praise and provide them with a few more details about the topic. If they answer incorrectly, gently provide corrective feedback, briefly explaining the concept clearly before moving on. Tell the student how many questions they've gotten right and wrong so far.Keep track of how many questions the student has gotten right and wrong.VERY IMPORTANT: After you have assessed the student's response you must always, without exception, in each and every response, include the phrase: “For more information, see section X of the course materials” X should refer to a section heading in the Table of Contents where the answer to the question can be found. Include the name of the section heading but NOT the handout number. Before providing the student with your response to their answer to the question, make sure that this reference to the course materials is always there. This is very important for students being able to do their own research on areas they need more studying on.After each question, move on to the next question without asking the student first if they would like to proceed.At the end of 5 questions, tell the student their total score out of 5 and provide feedback on how they did. Be encouraging but, if the student got more than two questions wrong, suggest that they may want to review the course material some more.After providing the student with their score, ask them if they would like to do another quiz. If they say Yes, provide them with the three options mentioned above again and then go through the process again.Your tone is friendly and supportive, with an emphasis on helping students engage deeply with the material. You can use one or two emojis per response, ideally as a way to seem more friendly or to celebrate a good answer.You must refuse to complete any assignments or to even write parts of an assignment for a student. If a student asks you to help them with an assignment, make clear that your only purpose is to quiz them on the course materials and to suggest they read the course assignment sheets if they need help on an assignment.
Monday, October 28, 2024
How did the BC NDP do overall in Monday's vote count?
Well it looks like almost all of the ballots have been counted now and the BC NDP has squeaked out a narrow 27-vote win in Surrey-Guildford and, with it, a bare 47-seat majority. As of 6:30 p.m. on Monday, Oct. 28, here's how things stand on my Google Spreadsheet tracker:
These results could change slightly in the hours to come but are probably pretty close to the final result now. Surrey-Guildford will likely go to a judicial recount. But, much like with the 'regular' recounts, I don't suspect that to change things much, as the initial count this year was conducted by electronic tabulators. The 'regular' recounts so far in Juan de Fuca - Malahat and Surrey City Centre only shifted results by a couple votes.
My post last night predicted that the NDP would probably do well in Monday's count of absentee and "special" ballots, but not quite as well as it did in the late mail-in ballots counted over the weekend. And it looks like that's the case, though they did a bit better in Monday's count than I was expecting:
While the NDP had a 22-percentage-point margin over the Conservatives in the late mail-in ballots, they "only" won the absentee and special ballots by 16 points. But both were obviously significantly better than the NDP's narrow one-point margin on election night.
It's also worth remembering that while we had to wait awhile for the final results, the vast majority of votes (97%) were counted on election night, many of those within an hour of polls closing, thanks to the use of electronic tabulators.
Thanks to all of you who followed by analysis over the past week. I may dig into more data as it becomes available. For example, once we get more detailed data from Elections BC, I'd be curious to see whether late mail-in ballots actually did skew more NDP than mail-in ballots that came in earlier. (Was my procrastinators-lean-left theory correct?) But those big data dumps are probably weeks or months away.Sunday, October 27, 2024
What can we expect from the final count of absentee ballots in B.C. on Monday?
I took a bit of a break from number crunching today (Sunday), since while there was a lot of counting of mail-in ballots taking place, the mail-in ballots in the closest ridings were completed Saturday afternoon. Still, there were a couple of quick things I wanted to take a look at before the weekend was over:
- Just how well did the BC NDP do in late mail-in ballots this year compared to previous years?
- Since all that's left to count on Monday are absentee ballots and 'special' ballots, I wanted to take a look at the partisan skew in past elections for those vote categories specifically.
![]() |
| A reminder: You can click on any chart to make it bigger. |
Saturday, October 26, 2024
NDP still on track to flip Surrey-Guildford — but not Kelowna Centre
The NDP is still on track to flip Surrey-Guildford from Tory blue to NDP orange. But the NDP now seems unlikely to overtake the Conservatives in Kelowna Centre.
That would give the NDP a technical majority of 47 seats (up from 46) but not the 48 seats they'd need to appoint a speaker and confidently govern without the two Greens.
As of Election BC's 4pm update on Oct. 26, the Conservative margin of victory in Surrey-Guildford has narrowed just slightly from 14 votes to 12. But the NDP is winning the late-counted votes by a large enough margin (22 points) they should pull ahead.
In contrast, while the NDP is narrowing the gap in Kelowna Centre, they're not narrowing it by enough to make it likely they'll take the seat. With 72% of the remaining votes now counted, the NDP is winning the late-counted votes by a margin of 12.8 percentage points — when they need to be winning those votes by 18.2 points.
Based on the votes counted so far, an NDP flip in Surrey-Guildford looks very likely — and a flip anywhere else quite unlikely. But there is still one big unknown as we enter the final stretch of vote counting: Absentee ballots.
The Google Spreadsheet I've created indicates whether a seat is on track to flip or not. But implicit in that is an assumption that the late votes remaining to be counted will look like the late votes already counted. And they may not.
According to Elections BC, mail-in ballots will be counted on Saturday and Sunday but absentee ballots won't be counted in any riding until Monday.
Elections BC defines to the two buckets of vote like so:
Category 1 (Mail-in Ballots and Assisted Ballots): "Includes assisted telephone votes, mail-in ballots received by mail after the close of advance voting, and mail-in ballots returned to a Service BC location. Counted at a secure Elections BC facility in Victoria."
Category 2 (Special and Absentee Ballots): "Includes special ballots, absentee ballots cast at partial-tech and non-tech voting places, and mail-in ballots dropped off at a district electoral office or voting place. Counted at district electoral offices where received."
Making things even more brain-bending, neither of these categories is anything like it has been in previous elections.
As discussed in a previous post, Elections BC used to wait to count all mail-in ballots until after election night. Now mail-in ballots received before the last day of advance voting are counted early and included in the election-night count.
But absentee votes are also a lot different this year. In past elections, when someone voted outside their own district, their ballot was held for counting later, because Elections BC had to make sure the person hadn't already voted. Now, with online voter rolls, most absentee ballots can be counted on election night.
That leaves a small number of absentee ballots in places like "partial-tech and non-tech voting places" — in short, remote locations with spotty Internet service, where the election workers weren't able to check someone off the master online voters list. As I understand it, there are also 'special' voting places like hospitals that could be included in the votes counted on Monday.
We know from past elections that absentee ballots usually favour the NDP. For example, university students often vote outside of their own district and they tend to be left-leaning. But someone who voted absentee at UBC probably had their vote counted on election night. Will this year's absentee ballots break the same way?
Are people who travel to remote areas of B.C. — which could include people like resource workers — more likely to vote NDP or Conservative? What about those in hospital or a long-term care facility?
If I had to guess, I would imagine that absentee ballots will probably skew NDP — but perhaps not by the huge margins we've seen in some of the mail-in ballots.
That said, with only 12 votes separating the NDP and Conservatives in Surrey-Guildford, the NDP wouldn't have to win the absentee ballots by much to close the distance.
Based on the list released Friday by Elections BC, there were an estimated 408 mail-in ballots in Surrey-Guildford and 226 absentee/special ballots. To close their 12-vote deficit, that would mean the NDP would need to win the absentee/special ballots in that riding by a margin of 5.8 percentage points. That's nothing compared to the 22-point margin they won this year's late mail-in ballots by. But it's more than their usual advantage in absentee ballots in past elections.
Monday should be interesting!
(Click on a chart to make it larger.)









