Thursday, December 4, 2014

Bored Taking Notes? Turn Word into a Colorful Disco Dance Party

I don't know why I made this. I have a feeling I will regret unleashing this creation on the world. A created a Word document in which all the letter, number, punctuation, space and enter keys are all bound to a macro that changes the background color, font color, and font size as you type. The result looks like this:

A Terrible Thing
You can download the word document with the embedded macros here (requires Word for Windows. If you have Word on Mac you can use this version. Changing background colors is not supported in Word for Mac).

I typed up instructions into the document for you. It looks like this:
1) You must download this file and enable macros for this document to work
2) If nothing happens when you start typing, press Alt+F8 and run the "Add Binding" macro
3)  To end the typing party, press alt+F8 and run the "RemoveAllBindings" macro
4) To view or modify the functionality of this macro press alt+F11

Thursday, November 6, 2014

ChargeLab 1.01 - Famous Last Words

"I think I'm finally done with ChargeLab."
I should have known better than to boast. In version 1.00 I re-thought how I calculate potential so that at large distances potential approached zero, and at near distances it approached + infinity. What I didn't notice is that this adjustment completely broke the way that field lines lie. I'm releasing version 1.01 with the following features and fixes
  1. Re-worked the way that field lines propagate so that they come out smoother and intersect less frequently.
  2. Reverted the method for calculating potential so that the field strength inside of charged surfaces remains zero.
  3. Remove the ability of the user to measure potential. This is really just a hack to hide the fact that the values of the potential don't work out as expected.
Reverted Potential Calculation correctly identifies the field strength in the center of a charged surface as zero. 

New Smoother Field Lines!


I think this will be the last version. Not because there is nothing left to do but because I am well and truly stuck. The problem is that the formulas we are used  to seeing for calculating potential and field strength in our three dimensional world don't seem to work in a two dimensional simulation. To adjust for the missing degree of freedom in which charges can move, I modified the formulas:

F = Force
V = Potential
k = Coulomb's constant
k' = An arbitrary constant
q = charge
r = Distance from charge's center
To transform the formulas into two dimensions I integrated with respect to distance, r. This seemed to do the trick for Force and Field Strength:


There are no negative distances in this simulation and both functions behave very similarly in the first quadrant. With these changes I got the slight change in behavior I needed. Charges spread out on the edges of surfaces and produced no field strength within surfaces.

The problem comes in when we look at the structure of Potential in 2 and 3 dimensions:


In 2 Dimensions, the natural log has much different behavior to the inverse function found in three dimensions. In 2 Dimensions there is a finite, non-zero distance from a charge where the potential is zero. Beyond this point, the potential changes sign and grows slowly to infinity. I'm struggling to understand the significance of these differences but I observe that they produce the desired potential gradients in two dimensions. 

I would be interested in hearing your thoughts on this puzzle.
  • Are the transformations above appropriate or do they only appear to work by coincidence?
  • Is there a better way to simulate forces and potentials in two dimensions?


You can download the latest version of ChargeLab here.

Source code available here.

Wednesday, October 22, 2014

ChargeLab 1.00 - Simulating Electric Fields

I think I'm finally done with ChargeLab. I made a few fixes and I'm pretty happy with the final result. The new features are:


  1. The number of field lines coming out of charges are now proportional (roughly) to their charge
  2. Fixed the bug where potential was zero at the center of charges. Now it's zero at infinity.
  3. Fixed a bug with termination of field lines. This should speed up field line calculation as well as help prevent field lines from terminating in empty space.


The Field Line Density is higher where the Field Strength is higher.
You can download the latest version here.

Source code available here.

Friday, September 19, 2014

New Videos: Falling through Tunnels in the Earth

This is a classic question that I remember seeing when I was a high school student: "How long would it take to fall through a tunnel through the Earth?" My Physics teacher solved the question for us and I'll have to confess only understanding the solution for about 30 minutes. Today I went back and re-worked the question myself. I've presented the solution in two parts.

First, what is it like to fall straight through the earth:


Second, what if the tunnel doesn't go through the Earth's center? What if you want to connect NY to LA for example?

Thursday, July 10, 2014

IB Physics Graphing Template for the 2016 Syllabus

Update: The New IB Physics Graphing Template for the 2016+ Syllabus is out! Follow this link to find out more!


This is a work in progress so stay tuned for updates, but I've been re-working the physics graph template for the new requirements in the 2016 Physics Syllabus. The major change is that max and min slope lines now need to consider all data, not just the first and last point.

You can download the updated version here but there are still a few issues (especially when you have data on the negative side of the x-axis). I'll be updating the file soon.

Largest Triangle Between Sine and Cosine

I saw an interesting question posted online. The author wanted to know what the largest triangle that would fit between a graph of y = sin(x) and y = cos(x) would be.

What's the largest triangle that will fit between the blue and green lines?
I haven't been able to come up with an exact solution using geometry or algebra; if you can do it, I'd like to hear how. Instead I made a tool in excel which animates the process of finding an approximation of the solution by exhaustion:


The program searches through all the different triangles to find the largest
If you'd like to have a peek at which triangle is the biggest you can download the excel file here.

Friday, July 4, 2014

Autophile: Automatically Sort Files into Folder by Name

I like to mark my student's reports electronically rather than mark paper copies. I type faster than I write and I can copy/paste verbose comments when students do similar things. The major drawback is getting the work back to the students; it's always a painstaking process to manipulate each file into an email or a folder. To reduce that grunt-work I wrote a program that will move files into folders with similar names. I call it Autophile.


The idea is to get your students to put their student ID in the file name so that the software can sort each student's work into their own folder on the network drive. Choose the files you want to sort, select the folders you want to sort them into, adjust settings, and click "Sort"


A confirmation window will pop up telling you where the program thinks each file should go. You can make adjustments or cancel the process. Clicking "Apply Sort" will move the files.

Confirmation Window
The program computes the best match between folder and file by computing something called the Damerau–Levenshtein distance. Basically, it's the number of letters you would have to substitute, remove, insert, or swap to make a portion of the file name look like the folder name.

I was having problems with very short folder names getting picked up as the best match so I modified the result a little bit to favor longer, less accurate matches over shorter accurate matches. I weighted the D-L distance at 100% and the match length at 90% when doing the comparison. For example, I wanted to favor a match that was 5 letters long with one letter wrong over a match that was 3 letters wrong with no errors.

You can download the program here or the source code here.

Sunday, June 29, 2014

ConQEST Presentations: Demystifying Electronics and Introduction to Soldering

On the 30th of June and 31st of July 2014 I'll be presenting at ConQEST. I'm running two different workshops:


  • Demystifying Electronics: where we will learn about the basics of electricity, common components, reading circuit diagrams, and common lab tools. We'll get hands-on experience constructing a oscillating circuit on protoboard and measuring its properties
  • Introduction to Soldering: where we will learn to solder and make a simple Infrared LED light for use with the wiimote whiteboard.
If you'd like to download the notes from either of these workshops they are available here:

Thursday, June 26, 2014

Tying your Shoes the Right Way

Apparently I've been tying my shoes wrong my whole life. Well, maybe not wrong, but certainty sub-optimally.

The problem was that I eschew double-knots because they're too difficult to undo while I found that the standard single-knot had a tendency to come undone in the middle of lessons. I felt trapped between a rock and a hard place trying to choose between interrupting the momentum of the class to tie my shoes or risking it until I have a moment to get the students working independently. I don't mean to overstate the issue but I really felt uneasy about leading a class with untied shoes.

The solution is the double-slip-knot; which is not a double-knot (and that is not a double-negative). It's the right middle ground between the security of the knot and the convenience of pulling to untie. My shoelaces used to come undone about once a day but they have yet to do so once since I've been tying the double-slip-knot.

All of the above links go to "Ian's Shoelace Site," a website dedicated to "Bringing you the fun, fashion & science of shoelaces." I couldn't agree more.

Saturday, June 14, 2014

Roaming Barbarians - Cities and Knights of Catan Variant

I love Settlers of Catan, and I especially love the Cities and Knights expansion. The statistics in the game appeal to me and I'm a sucker for anything that tessellates. However, I've gotten to the point where the game is starting to feel played-out; I feel like my friends and I have run through every permutation of outcome. To make the game a little crazier and more complex, we changed the rules for the barbarian invasion so that actual barbarian soldiers appear on the island, roam around, and sack cities.

I'll describe the rules then run you through an example. Finally, I'll discuss what the game feels like with these new rules.

Barbarian Tokens

  • The barbarians are no-longer a nebulous threat in a black ship, they are knights that roam the island just like your knights! Barbarian knights come in three levels, identical to your own knights. You will need lots tokens for level 1, 2, and 3 barbarian knights. You can use knights from a spare player kit, stacks of 1, 2, or 3 small coins, or any other token you can imagine.


Arrival of the Barbarians

  • Use the barbarian ship as normal to determine when the barbarians arrive
  • When the barbarians arrive, instead of resolving the invasion immediately by measuring the total strength of knights on the table versus the total number of cities, a certain number of barbarian knights arrive on the shore. 
    • The first time the barbarians arrive, two level 1 barbarian solders land on the shore. The second time, two level 2 barbarians land. The third time, two level 3 barbarians land. The fourth time, two level three barbarians and two level one barbarians land simultaneously. The pattern continues in this way.
    • Each barbarian lands in a bay on the opposite side of the island. Which bay is determined by the number on the red die. Starting from the bay in which the barbarian ship landed, count counter-clockwise as many times as the red die shows. One barbarian lands here, the other lands on the directly-opposite side. If more than two barbarians are arriving, place the strongest pair of barbarians first and then in descending order of strength place the pairs of barbarians in the next clockwise bays.
      • For example, the barbarians have arrived for the first time in the game below and the red die is '5'. Two level 1 barbarians show up in the bays marked '5'. If instead, four barbarians were arriving the strongest pair would go in the bays marked '5', and the weaker pair would arrive in the next clockwise bays which are marked '6' in this case.
    The red die shows '5' so both barbarians (red soldiers) land in the bays numbered '5'.
      • Place the barbarians facing inward - toward the center of the island. The direction they face is important for determining how they roam.
    This barbarian is facing inward toward the center of the island
      • If the barbarian ship arrives while barbarian knights are already on the board from a previous invasion, the existing barbarian knights are removed and the new invasion begins normally.
    Moving the Barbarians
    • On the turn that the barbarians land, they do not move further
    • At the start of the next player's turn, each barbarian moves one segment in, towards the center of the island
    On their first move, barbarians (red soldiers) always move one segment in, towards the center of the island
    • From now on, until they are killed (see combat), the red die determines where the barbarians go. The move is completed before the start of each turn before any resources are spent, trading is done, or robbers are moved. Rolling 1, 2, or 3 means that ALL barbarians turn left and move one segment. Rolling 4, 5, or 6 means that ALL barbarians turn right and move one segment.
      • Moving all barbarians the same way simultaneously ensures that barbarians never cross paths with each other. 
    The player rolled '5', so all barbarians (red soldiers) move one segment to their own right.

    Sacking and Defending Cities
    • If a barbarian arrives in an undefended city, it is sacked immediately reduced to a settlement!
      • If there are no settlement tokens available it is destroyed, wholly. Build your last settlement at your own risk!
    • If a barbarian arrives in an undefended settlement, nothing special happens. However, players cannot upgrade a settlement into city while it is occupied by barbarians. The new city would be immediately sacked and reduced to a city. 
    • Metropolises continue to be immune to barbarian invaders. If a barbarian arrives in a metropolis, nothing special happens.
    • Knights can now reside inside of cities, settlements, and metropolises.If a barbarian wanders into a defended city, combat occurs before the city can be sack. The city is only sacked if the barbarian wins combat (see next section on combat)
      • If a knight is in a city, settlement, or metropolis, they are considered to be occupied defending it and cannot be used to move the robber away from adjacent tiles.
    Combat - Destroying the Barbarians
    • Kill barbarian knights and remove them from the island with your own knights. Combat occurs when a barbarian and an active player knight cohabit the same intersection. The stronger of the two wins with ties going to the player's knight. Win or lose, player's knights are always deactivated after combat and are never killed. Barbarian knights are removed from the island if they lose. If a barbarian knight wins, he is reduced in strength by a number of levels equal to the level of player knight he defeated.
      • For example, a level two player knight can defeat a level one or level two barbarian knight, and can reduce a level three barbarian knight to level 1.
      • The player's knight must be active, otherwise no combat takes place. Both barbarian and knight continue to cohabit peacefully.
      • Normal game rules apply regarding using knights on the turn they are activated. Knights cannot move, fight, or defend on the turn they are activated, but can be re-activated after acting on the same turn.
        • Example 1: A barbarian and an inactive knight are cohabiting the same intersection. The player pays a wheat to activate his or her knight but no combat can take place this turn. Instead they continue to cohabit peacefully. On the next player's turn the barbarian moves on, but if another barbarian wandered into this now-active knight they would engage in combat.
        • Example 2: At the start of a player's turn, a barbarian wanders into a player's active knight and they engage in combat wherein the player's knight loses and becomes deactivated. That player may now activate his or her knight but combat does not continue; the knight cannot perform any further action and the knight and barbarian cohabit peacefully.
    • When a player's knight kills a barbarian, that player may immediately collect one progress card of their choice of any color. 
    • Once the last barbarian is killed (or removed from the island due to a new invasion), if one player has killed more than any other player he or she collects a Defender of Catan victory point.
    • Player's knights, when active, can perform one of four actions - all of which end in the knight becoming de-active according to the normal rules
      • Active knights can move any number of segments along friendly roads, but cannot jump gaps between non-connected roads and cannot move along unfriendly roads.
        • If the knight moves into a tile occupied by a barbarian, he also engages in combat. This move-and-attack is considered one action.
        • Two knights can never occupy the same intersection. You cannot team up on strong barbarians in this way.
      • Active knights that are not inside a city, settlement, or metropolis can be used to move the robber from an adjacent hex. Move the robber in the same way as if you had rolled a '7' and steal from one player who has a city, settlement, or metropolis on that hex in the normal way. No players have to discard cards.
      • Active knights automatically engage in combat with any barbarians that wander into them. 

    Example 1 - The barbarians arrive for the first time

    In this example, the barbarians are one step away from arriving on the island for the first time. The first time they arrive, two level 1 barbarians will land so each player has already prepared by buying and activating level 1 knights. White needs one knight for each city but yellow feels s/he can manage with a single knight because s/he has roads connecting both cities and can move his/her knight between them. Blue has built only one knight because the barbarians will not effect his/her settlements.
    The barbarians are almost here! Get ready!
    White rolled the barbarian ship so the barbarians reach the island. The red die shows '5', so both level 1 barbarians land in bay 5, counting counter-clockwise from the barbarian ship.
    Barbarians arrive at bay 5
    It's now Yellow's turn s/he rolled a 1 on the red die but it doesn't matter. All barbarians always move inward on their first move. The black barbarian ship also resets but doesn't move again because Yellow rolled the yellow castle.

    The barbarian on the right has invaded Yellow's city! S/He is well prepared, though. His/her level one knight engages the barbarian in combat before he has a chance to sack the city.
    All barbarians move inward in their first move, regardless of the result of the red die.
    Yellow's level 1 knight defeats the level 1 barbarian because ties go to player's knights. Yellow's knight becomes deactivated and the barbarian on the right is removed from the board. Yellow collects a progress card.

    The barbarian on the left was defeated and removed from the board
    With the threat on the right side dispatched, Yellow notices that there is a growing threat on the left! The remaining barbarian is still loose and there's a good chance he's going to wander into Yellow's undefended city! Yellow could build a second knight in his/her city but lacks the resources. Instead s/he will pay a wheat to re-active his/her knight and hope that s/he gets the chance to move him in time.

    Still Yellow's turn, s/he re-actives his/her knight
    It's now Blue's turn but s/he is not concerned with the remaining barbarian because barbarians have no effect on settlements. Blue rolls '5' on the red die and the barbarian moves to its right - into Blue's settlement. This would be an unwise time to upgrade that settlement into a city; it would be immediately sacked and reduced to a settlement.

    Blue's settlement is not effected 
    White rolls '2' on the red die so the barbarian moves to its left.
    The barbarian moves to its left
    It's Yellow's turn and s/he rolls '1' on the red die so the barbarian again turns left. Now Yellow's undefended city is in serious danger.
    Yellow's city is in danger!
    Still Yellow's turn. Yellow move-and-attacks the remaining barbarian and kills it. Yellow collects a progress card. The last barbarian has been killed and the invasion is over. Yellow killed more barbarians than any other player and thus collects a Defender of Catan victory point.
    Yellow's knight moves to kills the last barbarian

    Example 2 - Stronger Barbarians Invade

    The game has now progressed. The barbarians have arrived twice already and are about to arrive for the third time with two level 3 barbarian knights. In this example, none of the players have built any level three knights; perhaps they haven't reached the third level in the blue development tree?

    Each player has level 2 knights leftover from the last invasion but these knights will lose combat to the barbarians that are on the way. The exception is White's level 1 knight at the South end of the island. White doesn't need to defend this metropolis because barbarians have no effect on metropolises. White has decided not to upgrade this knight and is instead using it deter players from placing the robber in his/her territory.

    The quiet before the storm
    Yellow rolls and the barbarians arrive. The red die shows '5' so they arrive in bay 5 again. Yellow is in serious trouble. Next turn the barbarian on the right will move into his city, defeat his knight, and reduce his city to a settlement. Blue is also in a lot of danger from the barbarian on the right.

    Yellow is unable to build anything to help him/herself and passes on to the next player.
    Level 3 Barbarians arrive (coincidentally) on bay '5' again
    Next, Blue rolls. The value of the red die is irrelevant because barbarians always move inward on their first move. Yellow's level 2 knight is defeated by the level 3 barbarian. The knight is deactivated, the barbarian is reduced in strength from 3 to 1, and the city is sacked and reduced to a settlement.

    Meanwhile, Blue is facing the same fate on the left side.

    Yellow fails to defend his/her city. It is reduced to a settlement.
    It's still Blue's turn, however. Blue builds a road to the barbarian so that he can reach it with his knights. He move-and-attacks with his level 2 knight. The knight is defeated and deactivated but the barbarian is reduced in strength from 3 to 1. Blue then builds and activates a level 1 knight in his city. He can't attack with this knight but if the barbarian were to wander into his city it would be defeated. Blue's city is safe!

    White and Yellow have cities that are still in danger if the barbarian moves left though...

    Creative thinking has saved Blue's city!

    So, What's it Like?

    My friends and I have played this variant in a three-player game. The Good:
    • Not knowing where the barbarians are going to go adds a huge layer of suspense. 
    • The threat of the Deserter card is hair-raising. 
    • The level three barbarians can wreak havoc if you can't build level three knights. 
    • If you get to the point where four barbarians are landing at once it's total chaos and huge fun!
    • The importance of the blue progress track is raised. In our previous games it was universally the least favored so this is a good shift for us.
    The Bad:
    • This variant can be pretty brutal. Probably not for beginners or players overly concerned with fairness
    • In the original rules, players have to cooperate to defend the island but in this variant there is not so much they can do to work together against the barbarians if they want to. I feel like this is antithetical to the original game. I'm interested in any suggestions on this issue. 
      • Maybe opponent's knights can move along unfriendly roads and enter unfriendly cities by invitation? The host gains the protection of the guest knight while the guest gets the credit for any kills.
    The Ugly:
    • You have to build your own knights. Relying on others to defend the island is not a good idea.
    • Connecting all your cities together is hugely beneficial. You may want to choose your initial placements to favor connectivity over the best resources.
    Let me know what you think!

    Thursday, June 12, 2014

    O'Neill Cylinder Simulator - Projectile Motion in Spinning Space Stations

    Last week a student was talking with me about what life would be like on a spinning space station. In the absence of a gravitational field, we can simulate a gravitational force with the centripetal force from the rotation of the space station. Famous examples of this principle include O'Neill Cylinders and the ring-world in Halo

    Artists Rendering of the Inside of an O'Neill Cylinder Space Colony from NASA
    The Halo Ring-World
    In our discussion we came across the thought of what it might look like to throw a ball in the air in a zero-gravity rotating space station. I was stumped so I brought the question to my colleagues. They were stumped. Eventually I was able to make a pair of parametric equations for position in time to model the motion of the ball but it didn't tell me much unless I could visualize the graph of the equations. The next logical step was to simulate the equations in software. Enter the O'Neill Cylinder Simulator:

    Passing a Ball to Yourself in an O'Neill Cylinder
    When I saw the parametric equation animated (like above) it blew my mind a little. Here we see someone throwing a ball up and to the left, it circles above their head, and returns to them from the right. Throwing a ball in an O'Neill Cylinder apparently is nothing like on Earth. You can do some really sweet patterns:

    A ball thrown through the center of the ring with a low velocity compared to the tangential velocity of the ring will spiral!
    Basically projectile motion is nothing like that on Earth. When Master Chief throws a grenade on Halo he might be in danger of it looping over his head and landing at his feet!

    If you're curious, these are the parametric equations used to plot the position of the ball in both frames of reference




    If you want the source code, you can grab it here. Apologies in advance for the poor quality of code.

    Thursday, May 15, 2014

    Keeping Banana-plug and Alligator-clip Cables Untangled and Accessible

    Alligator-clip cables have this tendency to act like little grappling hooks and latch on to other cables forming impenetrable knots. I saw a simple solution to this problem back when I was in university studying Electrical Engineering. We had labs fitted with all kinds of gear and hanging on the wall was a rack of neatly organized cables. I made it my side-project this week to replicate that rack at school:



    I guess it doesn't look that orderly but believe me, it's an improvement. It took me half an hour to untangle the cables that I loaded onto the rack in this picture.

    The rack is detachable from the wall so you can carry the cables to other classrooms when necessary. Gravity keeps it seated in two brackets screwed into the wall.



    I'm not a carpenter but I swear I can do better woodwork than this; I was low on free-time and itching to get the job done. I don't think I measured a single cut!

    Thursday, March 20, 2014

    Setup OneSchool Reporting Helper

    To learn how to use OneSchool Reporting Helper, go to this previous post. This is a guide to first-time setup.

    In my previous post, I introduced OneSchool Reporting Helper; a tool to help streamline reporting in OneSchool. If you don't use OneSchool for Reporting it may be possible to make minor adjustments to the source code to suit your reporting infrastructure. However, even if you do use OneSchool, the Reporting helper still needs some configuration the first time it's run. This configuration only needs to be done once. It's not hard, but if you've never heard of HTML you'll probably want a hand from your school's IT pro. With the initial set-up complete you can then distribute the settings to the rest of the teachers in your school.

    In total, to set-up the program we need to do two things:

    1. Locate the HTML ID of all the controls in OneSchool we want to interact with
    2. Create a matrix of reporting options to fill in those controls.
    Here's the whole process step by step:

    1) When you first run the Reporting Helper, it will warn you that it doesn't have a settings file. This is normal; we haven't built one yet.

    2a) The Reporting Helper will open up OneSchool in its own browser but we first need to point it to that URL. Click Setup > OneSchool URL

    2b) Copy the URL for the OneSchool Login into the dialog box and click apply.
    Copy this URL...
    ...into this dialog box.
    3a) Next we need to start locating the HTML IDs of the controls we're going to interact with. At the moment we don't have any buttons to do our reporting with. We also need to set up the Save and Save and Next buttons because they also interact with HTML controls. That's what we'll do first

    No reporting buttons are set up yet.
    3b) Open up OneSchool in your favorite browser (Chrome, Firefox, IE, but NOT in the Reporting Helper) and navigate to your reporting page. This is where you would normally enter data for your students. Right-click somewhere empty on the form and click "view page source". 

    This image was captured in Chrome. If you have a different browser you might need to look up how to view a web page's source code with that browser
    3c) First, let's find the HTML ID for the "Save" button and copy it. It looks like this:

    Copy the HTML ID for the "Save" button
     3d) Then we need to right-click on the save button in the Reporting Helper, and paste the HTML ID into the dialog box and click apply

    Right Click on "Save" then...
    ...paste the HTML ID into the dialog box.


    3e) We'll do the same thing for the Save and Next button. Find the HTML ID, right-click on "Save and Next", then paste into the dialog box and click apply.

    Copy the HTML ID for the "Save and Next" Control

    Right Click on the "Save and Next" button and this dialog will appear. Paste in the HTML ID and click Apply
    4a) Now it's time to set up the HTML ID for the comment box. In the HTML Source, locate the HTML ID for the comment box, and copy it.


    4b) In the Reporting Helper, click Setup > Comment Box HTML ID and a dialog box will appear. Paste the Comment Box's HTML ID into the dialog box and click apply



    5a) Now it's time to start adding reporting buttons. In the Reporting Categories toolbox, click the text that says "Add". A window will appear. Select Row 1 from the window.

    Click "Add" next to "Reporting Categories"

    In the drop-down menu for row, select row 1.
    5b) This will cause a number of new options to appear in the window. Here is where we will set-up the reporting options. Since this is the first row of reporting options we'll map it to the first reporting criteria, "Achievement". You first reporting criteria may be different so you might type something else under "Assessment Type". My top result for Achievement is a "7", so this button's "Assessment Result" will be 7.

    Your Reporting is probably different to mine so you will enter whatever it is that you report on. I report on "Achievement", and it's a scale from 7 to 1.
    5c) We want this button to report 7 for Achievement but to do that we need the HTML ID of the Achievement drop-down menu. Going back to the source code, we'll copy the HTML ID for the Achievement drop-down menu and paste it into the "HTML ID for Assessment Type" box.

    Copy the HTML ID...

    ...and Paste.
    5d) The last field is the HTML Value for a 7. Looking at the same section in the source code, we get the HTML Value for a 7. Copy this and paste it into "HTML ID for Assessment Result":

    Copy the HTML Value...

    ...and paste
    5e) Click "Add" and the button we configured will be added to the Reporting Categories Toolbox:

    This new button will insert "7" into the "Achievement" report.
    6) Follow the same process in steps 5a-5e to create buttons for all the reporting results in this reporting type:

    In my case, Achievement is graded on a 7 to 1 scale, with and additional N for "No Record". Your Reporting may look different.
    7) Next we need to go through the same process in steps 5a-6 to add another row of buttons for our next Assessment type. In my case, that's "Effort". I found the HTML ID for effort, and filled in buttons for all the Effort Results:


    This Assessment Type is next on the list after Achievement so it's in Row 2.
    8) Continuing this pattern, we can fill in buttons for all the Assessment Types and Results:

    Every Option for Achievement, Effort, Behaviour, Homework, and Parent Interview have buttons associated with them now.
    9a) The final step is to create some Archetype Buttons. The user will configure the Archetype buttons to their needs but it's a good idea to get a few default ones set up. Click on the text "Add" next to "Archetypes:


    9b) This window will appear. We're going to create generic archetypes, so basically Excellent down to Unsatisfactory. This first Archetype button will be "Excellent" so type that into the Button Label, and select the highest reporting results from each reporting type's drop-down box.

    The blank window pops up...

    ...And choose options from each Reporting Type

    9b) Click "Add", an the Archetype button will be added to the Archetype Toolbox. Repeat step 9a to create a small variety of different Archetypes.

    I chose to make 5 generic Archetypes: Excellent, Very Good, Satisfactory, Needs Attention, and Unacceptable
    10) At this point you're done. Close the program and it will automatically save its settings in the same directory as the executable as "settings.txt". You can then distribute the executable with the settings file to other teachers at your school and they won't have to go through this setup process. You may want to direct them to this guide to using OneSchool Reporting Helper, though.

    Download the program here, or the source code here. Cheers!