Numbas advanced training 2020-07-22

0:00:00

Welcome to this advanced training session for Numbas.

0:00:04

I don't really have a plan for this session. We've got two hours in which basically you can ask me how to do stuff.

0:00:13

The way things are going to run, uh, I just had my my zoom rules up there on the screen.

0:00:21

I'll share them again very quickly and talk through them.

0:00:24

It's an informal session as I've said, so don't worry about people intruding on your zoom call.

0:00:30

I've already seen a couple of kids joining in.

0:00:34

But please mute yourself when you're not speaking so that we don't get a lot of interference.

0:00:40

You can use the raise hand button before you ask a question, but since normally Chris joins in with these things and he can tell me when stuff's happening but he isn't here.

0:00:51

Now if you click on participants, now I get all the host controls here, but you'll get less...

0:00:55

Anyway, press one of these buttons and I might see it.

0:00:59

I think what we'll do today maybe is just unmute yourself and shout at me.

0:01:07

And please use the text chat.

0:01:10

I see a couple of people have already started doing that.

0:01:14

So good morning to everybody.

0:01:16

So that's what we're going to do.

0:01:19

I've got a few things that I could talk about, otherwise I'm happy to take suggestions.

0:01:26

In the chat, maybe say where you're from, what you're using Numbas for, while I get to...

0:01:40

where's my next tab? I've prepared some ideas here for things that we could talk about.

0:01:48

What I'd like you to do is use zoom's annotations, so you should get a button looking something like annotate.

0:01:54

It might be in a different position on your screen.

0:01:58

And then pick a stamp.

0:02:01

I'll go with a nifty little heart here and you can just click on the things that you would like me to talk about, and I think that's a way that we can vote for what I'll talk about first.

0:02:10

So I'll leave that up for awhile and clear my drawings.

0:02:16

Here we go.

0:02:19

What I'm going to do, in fact...

0:02:22

can I turn off my zoom interface so that the screen share works properly?

0:02:27

Just hold on a second, sorry.

0:02:32

Share screen shows in windows.

0:02:35

Now there we go.

0:02:42

Share screen again. Right there we are.

0:02:46

Go for it. And I'll keep the chat open.

0:02:50

So we have people from Swansea. I've had a lot of chat from people in Swansea lately.

0:02:54

Manchester Met, hello to you Jonathan.

0:02:59

University of Newcastle in Australia.

0:03:04

So we're spanning the globe with Newcastles.

0:03:07

Sydney using it for first year, cool.

0:03:13

Western Sydney. Glasgow, flipped learning, varied level maths class of geomatics students Geomatic.

0:03:23

I think I know what that is. But you might have to put in the chat exactly what this.

0:03:28

Kaplan pathways, is that the Nottingham people?

0:03:32

Ruth, are you from Nottingham?

0:03:39

And got a couple of Pretoria people in. We had a good project making up some material for engineers in Pretoria a few years ago.

0:03:50

And that was the longest and shortest flight -- shortest trip outside the UK I've ever had.

0:03:57

Quantitative economics.

0:04:03

Annotations aren't sticking? Well, it looks like there is some going down.

0:04:07

It looks like there's a strong need to look at explore mode.

0:04:15

Sam from Leeds using Numbas for stats modules.

0:04:18

Interested in generating randomized expressions, simplifying all that, diagnostic testing.

0:04:28

Maybe we can't see the annotations says Julio, so maybe you can only see your own?

0:04:33

I can see lots. So I will make it...

0:04:38

Oh really, you can't even see your own.

0:04:41

Right? To annotate this, maybe somebody who's not a host could unmute and explain where the button is.

0:04:49

For me it's at the top of the screen.

0:04:55

[Unknown person] Yes, it's at the top, when you click on view options and then it gives you an annotate option.

0:05:08

[Christian] Right. And then once you got on to annotate, you can click on a stamp, but I mean we've got a fair few votes and I think I'm going to start with explore mode.

0:05:19

And then there's a few more votes for custom marking.

0:05:22

I'll give you a couple more minutes - a while - to vote for things.

0:05:29

Somebody said that their queries might not be advanced enough.

0:05:37

I mean, advanced is just anything beyond you've never used Numbas before.

0:05:41

And there will be people asking for stuff that can be very complicated.

0:05:46

Let's see, Adele is asking something about JavaScript, so I'll try and remember all of these things, so I think maybe what we'll do is get straight into talking about explore mode first.

0:06:02

So that's the thing I'm most keen on at the moment.

0:06:05

This is very new in Numbas. So what will I do?

0:06:09

I can't keep these annotations, can I?

0:06:16

That's sad.

0:06:19

Clear everything.

0:06:22

Right, So what am I going to do? I'm gonna move, going to stop annotating.

0:06:28

By the way, this session is being recorded, it said on the sign up form that it would be recorded, so I hope that's OK with everybody.

0:06:38

If it's not, if anything happens during the session that you want cut out, email me afterwards, and I will do that.

0:06:46

OK, so what I've done is I've made a project on the Numbas editor called advanced training.

0:06:52

I may publish this once we've finished, but I was going to do stuff through screen share, because doing stuff on your own is hard to keep track of over zoom, so let's make an explore mode question.

0:07:10

I think what I'll do is I'll just describe how it works.

0:07:17

And the kind of things that I thought it might be used for.

0:07:24

Just keep moving zoom bits around.

0:07:29

There we go.

0:07:33

Zoom is awkward to use.

0:07:35

Right! Just catching up with chat, Claire says is this available via an iPad.

0:07:47

You mean zoom?

0:07:49

There is a zoom app. Maybe you could add some more information if it hasn't answered that question.

0:07:59

Right.

0:08:01

Oh, the annotate function.

0:08:05

I believe so. I don't know how. We've moved on. OK.

0:08:10

Right, so explore mode. The idea with this is to give the student more choice about how they move through a question or to make a question adapt to what a student does.

0:08:23

So classically, in a Numbas question you would have a statement and then a list of parts that are all generated when the question is.

0:08:31

And those would add up together to give you a total score for the question.

0:08:36

We had steps where you could make up some extra parts that the student can choose to reveal and give some marks for that and maybe add a penalty onto the marks for the original part.

0:08:50

But you couldn't offer a choice of steps, you couldn't reveal just one step at a time.

0:08:56

So the start of explore mode was can we do something better with steps?

0:09:03

But then also for a long time, for years and years, I've wanted to do something more like a choose your own adventure book.

0:09:13

If you've ever done any kind of interactive fiction on the computer, where you maybe get description of a place where you can do certain things and you can move around between places.

0:09:30

Or if you played a choose your own adventure, fighting fantasy book when you were younger.

0:09:38

You do a thing that says if you want to go North, turn to page 36.

0:09:41

That kind of thing.

0:09:43

I think that would be a really - it's a really good model for interactive exploration of a topic.

0:09:50

To sort of let students choose what they want to do within a set of scenes that you've made up.

0:10:03

That was sort of in my head for a while, and then in 2016 at the EAMS Conference, Matti Harjula, who I think is present, presented his Stateful mode for STACK, which does that sort of thing.

0:10:16

The way Matti came at it was, you want to add in some state information to a question that gets updated as a student enters answers.

0:10:31

So over the last year I've been implementing that and came up with a few use cases, and I'll talk about the basic model.

0:10:38

So the idea is you only get shown one part at a time.

0:10:44

And you can move between parts.

0:10:49

So the first thing you see is the first part.

0:10:55

Let's make an information part and say... Now, what was the intro text for Zork?

0:10:59

I'll just try it.

0:11:06

[inaudible] I didn't quite hear that.

0:11:14

I think whoever that is, maybe you should have your mic muted.

0:11:26

Right. So first part. And then create another part.

0:11:30

I'll just use information only for these.

0:11:33

Really make it like a choose your own adventure. Right.

0:11:37

And so I've got two parts here. I need to give them names for this to really make sense, so I'll go "another part" and call the first one "first part".

0:11:47

Now, when I run this question, I'll only get shown this first part because I need to make up the structure.

0:12:00

It's not the case that you just go from one to the other.

0:12:03

So what I can do is add a next part option. So I'm at first part and I might want to go to another part.

0:12:11

This option is always available.

0:12:17

So now when I run the question I get the first part and I get this option, what do I want to do?

0:12:21

I can go to another part.

0:12:26

So, that's the basic idea.

0:12:31

Let's make this a bit more complicated.

0:12:41

What's a good thing to do? A choice of hints? So let's make a number entry part and try and think up something to do.

0:12:55

Actually, let's not try and make up a question 'cause it always ends up being complicated.

0:12:59

Let's make something completely trivial just to show structure.

0:13:03

This part is going to be called "write number one".

0:13:07

The accepted answer is one.

0:13:10

The prompt is "write the number one".

0:13:14

OK so I'm gonna make that the first part. And these other two are going to be hints now.

0:13:18

So I'll have a vague hint and a better hint.

0:13:31

OK. I'll skip to the next part option there.

0:13:37

There we go.

0:13:40

So what I can do is I can have options for both of those.

0:13:47

Vague hint and better hint.

0:13:53

Right. Let's have a look now.

0:13:56

OK.

0:14:04

So here's my question. Is it possible for Christian to remove the zoom group chat?

0:14:09

Now I thought I'd hidden the window, is it still showing it for you?

0:14:13

The answer is no.

0:14:17

In that case, intermittent.

0:14:23

The wonders of Zoom. It never used to show up and now it does.

0:14:26

On last week's recording it did. So it came up every now and then.

0:14:30

I turned off the option. I don't know what I can do.

0:14:34

Need to keep an eye on it in case something comes up. Right so.

0:14:39

Back to my question, here I've got this number.

0:14:42

I've got a choice of hints.

0:14:47

So I could pick a vague hint and it says there's nothing more to do because I haven't ticked the option to send you back, or I could go back and pick another hint.

0:14:59

Now the question is, how does marking work here? This question says it's not marked, which is a surprise because I thought there was a mark available for this.

0:15:09

And the reason for that is marking in this mode is really complicated.

0:15:20

So because you might have several ways to go through the question, or you might be able to come back to the same part more than once, you can't just add up the scores from one of the parts that you visited.

0:15:33

It might, if you can go back to a part again, you might be able to get infinite points, or if there are several paths through, it won't be easy to see, just from the total, what the student's actually done.

0:15:48

So scores go into objectives, which is where parts give you marks and those add up.

0:15:58

Then penalties which get applied when you choose a particular option.

0:16:03

So I think objective here, we should have an objective "write number one".

0:16:07

Limit for that.

0:16:10

Let's make it 10 marks. I will have a couple of penalties.

0:16:14

Actually no, we'll have one penalty.

0:16:18

Hints. Maximum two marks.

0:16:23

Right.

0:16:28

So Dinh Tranh says if the student uses the back button in the browser, does it cause issues?

0:16:35

I think you'll get...

0:16:39

Now it's not available here because it's in a new tab. I think if you had come to a test and the back button was enabled, it would just go back to whatever that previous page was in an exam.

0:16:51

It will warn you that there's an exam in progress and it will say, do you really want to leave?

0:16:58

I don't think overriding the back button would be the right thing to do as it gets very complicated when you do that.

0:17:07

Right.

0:17:10

But that's a good point. A good user interface point.

0:17:15

OK, so these points.

0:17:17

I've got objectives, so I'm going to go back to my write the number one and set the marking settings.

0:17:21

This counts towards the objective write the number one and you get 10 marks for doing it.

0:17:27

And then these next part options.

0:17:33

For the vague hint, I'll take one point away.

0:17:37

And for the better hint, I will take two marks away.

0:17:39

Chris says, has anyone written an RPG in Numbas?

0:17:46

Not yet. It's only about a month old, this feature.

0:17:53

I would love it if someone did though.

0:17:55

I'm going to get on to do more complicated stuff.

0:18:00

Right. I probably want to spend about half an hour on explore mode, so we'll see how far we get.

0:18:05

Right, so. Here's my thing now, so I have a vague hint and I get that penalty.

0:18:16

I still haven't fixed this suggesting going back.

0:18:22

So that had minus one, but if I write number one here I've got my 10 marks, but I've had that penalty taken away so that covers the offering a choice of hints use case.

0:18:32

The next thing we want to offer a choice of paths through a question.

0:18:43

I think what I'll do. Let's go to my demo question.

0:18:47

Something already exists. I'll find that exam.

0:18:56

There we are. Right, so I've got a whole load of explore mode questions here.

0:19:09

Factorizing a number, is that?

0:19:16

I want a choice of paths. Um...

0:19:20

Maybe find the roots? Actually, I'm not sure if I ended up making a good example of that.

0:19:26

They all tend to be fairly linear.

0:19:32

What I realized writing these questions is it gets really complicated if you start allowing a lot of different paths.

0:19:37

I think what we'll end up using this for is things like stats questions where.

0:19:47

Sorry, someone is unmuted.

0:19:50

Oh yeah, Julia says she made one. Yeah, we will go and have a look at Julie's question if that's alright.

0:19:58

Put a link in the chat there, I'll click on that in a bit.

0:20:02

Yeah, stats questions where you might want to offer the student a choice of tests to perform.

0:20:09

The first one I tried to make up was a calculus question where you choose like do you apply the chain rule or product rule and it tries to assess you on that.

0:20:20

We realized that it wasn't really worth the effort.

0:20:26

Right, so I'll just work through this question.

0:20:33

So here I have to find the roots of this quadratic and at each stage I'm offered a hint.

0:20:40

Where I get to - first of all it's offering a hint, find the discriminant and then use whether it's zero or not to decide how many roots there are.

0:20:53

So then I can see a hint, and there's a formula for the discriminant.

0:20:58

So I could go back and calculate it and all that What do you think of those?

0:21:10

I think that has one distinct root.

0:21:13

There we go. Get some points there for doing that in my head.

0:21:17

So now that I've answered this question, this other option has become available.

0:21:24

If we have a look in the editor.

0:21:27

No I won't go back again.

0:21:31

So anyway there was an option - you can give a condition for when an option is available.

0:21:34

And this one said when it's answered or correct.

0:21:37

So then I get taken to this part where I have to write the root.

0:21:46

I forgot to write a prompt for it.

0:21:48

Anyway. The root was minus four and I get that point.

0:21:53

OK, so that sort of offered a couple of choices and I can see at this navigation thing up here, I can go back to the bits I've seen.

0:22:04

I'm not sure about this interface.

0:22:07

I don't know if that's the right thing to do.

0:22:10

If you have a really long question, it ends up getting very complicated.

0:22:15

But in this one you can navigate around by clicking the "Go back to the previous part" and just sort of avoid this thing.

0:22:27

Couple of questions from Dmitri.

0:22:30

Is it possible to provide a penalty for wrong answers on the main part?

0:22:37

No. And maybe it should be.

0:22:44

A couple of people have asked for negative marking for certain things, and we'll see.

0:22:51

If you can come up with a good use case for it, I'll have a look at whether that should go in.

0:23:03

And then number 2. Is it possible to penalize the usage of advice?

0:23:07

So sort of show the advice but get a penalty.

0:23:10

I think you would do that with an option to go to an information part that would apply a penalty.

0:23:14

The advice is shown once the questions over: either you've given up or you've finished the exam, you're reviewing.

0:23:24

Alright, I'll try and work through.

0:23:32

Matti asks does a student need to always choose to change the scene or can the act of answering trigger that change?

0:23:38

The student has to choose.

0:23:41

So you can make an option available but I think If you are answering and it immediately moved, you wouldn't see the feedback that you got for that part.

0:23:50

So I think it's a... Let the student choose when they want to move.

0:23:58

So I guess you're imagining sort of making something unavailable after the student's submitted an answer.

0:24:08

I might have an example of locking a part after leaving it.

0:24:13

So you might ask the student to enter an answer and then the next bit will contain a big giveaway for what the answer for that should have been.

0:24:26

Sometimes you might have to set a problem where you do a calculation and then the next stage says some more information that would have helped you get the right answer in the previous bit.

0:24:39

So what you can do is once I've locked this part -- once I've answered this part, I can go to here and then that answer's locked in so I can't go back and change it again.

0:24:50

So.

0:24:58

Tell me what you were thinking of. If you think that it should be possible to move the student automatically, Ione is asking could you have alternative answers with partial marks in the main part?

0:25:10

Yep, so alternative answers is another new thing, and it's sort of separate to explore mode so you can have alternative answers and you can even it an option available based on which alternative was used.

0:25:22

Uh, there we go. So here's an example of that.

0:25:25

I should have given myself a prompt for whatever to do here.

0:25:27

I'm going to guess it's follow the order of operations wrong, so do this left to right instead of grouping by the brackets.

0:25:37

So I'll try 11 times 5, 55, minus 5 gives me 50.

0:25:42

So because I've done that, it's showing me this, get a hint.

0:25:50

Did you evaluate the expression from left to right? And then do that.

0:25:56

Right.

0:25:58

Wow, you are doing really well with questions. Chris Jobling says navigation, maybe forward and back buttons.

0:26:06

It's the forward button that's the hard part. When you've got more than one choice, what does forward mean?

0:26:11

And there is a back button. Would it be fair to say the main benefit of an explore mode question is that it allows the student to choose whether or not to view a hint before returning to the question and applies a penalty?

0:26:21

That's one use of it.

0:26:25

Another really good use of it is exploration of a topic.

0:26:32

This question's to do with designing an experiment, I think.

0:26:36

It's not just about showing hints, it's to do with adapting to what the student has said and what you do in this experiment.

0:26:47

Yeah, so Julie says a huge benefit is putting student answers into variables to use later on, which is what this question does.

0:26:57

It tries to set up an experiment about deciding if a coin is fair.

0:27:02

So you'd probably all come up with the same methodology for this: flip it a load of times and see if it comes up more heads or more tails significantly.

0:27:13

So this sort of asks you for a few things to set up the experiment.

0:27:16

It says how many times will you flip your coin?

0:27:19

Enter a small number so that I can actually answer this thing.

0:27:22

The next stage is to define what biased means.

0:27:29

So that's not something that has an objective correct definition.

0:27:34

So I might say... It gives me a prompt, actually. How many heads would make you think the coin is biased?

0:27:38

If I'd done this experiment in real life and allowed students to make up their own definitions, I might have a few more prompts, a few more ideas for what biased means.

0:27:50

Maybe let them pick that and they can choose the methodology of the experiment is based on that.

0:27:56

But here I'd say maybe 4 heads would make me think this thing is suspicious, and if I hadn't answered that I can have a hint.

0:28:04

Sort of a prompt to come up with what this number should be, to think about an unbiased coin.

0:28:16

What would that do? So then maybe more than that would be biased.

0:28:20

I'll just carry on going through. So then I have to enter some data, and each of these steps, those answers are getting saved in question variables.

0:28:29

When you move on to a next part, you can replace the value of a question variable with something from the student's answer or with a static value, or increment a counter.

0:28:38

So that's giving you this state thing.

0:28:43

So then let's say I got 5 heads.

0:28:50

I'm going to whizz through this question now, so then - actually it doesn't really matter.

0:28:56

That's the point of that.

0:29:00

Daniel said, can we see the details of the part where you double the number?

0:29:07

Was that the lock a part after leaving it, you want to see that in the editor.

0:29:12

Right, so we have this thing.

0:29:20

The first part was - I'll just hide the chat for a second.

0:29:26

It says write a number and the next part options are all the parts here.

0:29:35

So it says it's available when an answer is submitted, there's no right answer to this thing.

0:29:39

It just says write any number.

0:29:42

So as soon as the student has entered a valid number, this part - this option - will show up and it says when you choose this part, set the value of x to -- Could you make sure you're muted please, Tatiana?

0:29:59

There we go.

0:30:09

Right.

0:30:11

So that's that part and then this other one, if you - No.

0:30:26

When unanswered or incorrect. So yeah, so if you haven't entered an answer it offers this option to get some inspiration.

0:30:35

I don't know what this part says. Oh yes, it just suggests a random number.

0:30:40

So then, once you're in the double the number part, it will show you what your number was and says what is 2 X.

0:30:47

I think the point for this question was that once you've picked a number, it gets locked, so you're fixed in.

0:30:58

So if it turned out that you've chosen the number that was particularly poor for whatever purpose, it wouldn't let you go back and change your mind.

0:31:07

I think for when a student is just accessing something at will, you should let them do whatever they like, but there might be reasons you want to do this.

0:31:24

Right, uh? Yeah, so I think I dealt with a few of these things.

0:31:29

Can branches only be made visible if we detect a certain sort of mistake?

0:31:33

Yeah, I showed that.

0:31:37

OK.

0:31:41

Can it b used adaptively for release of subsequent question parts of summative tests, so that students don't see too much?

0:31:47

Absolutely, yeah.

0:31:50

So a thing you can really do is, we came across this a lot writing this year's exams that a lecturer would write a question where part a asked them to do something and then part b really gives away the game in terms of what's -- I don't know, It was some number theory stuff where the number has to be prime, effectively, that the student was supposed to write in the first part.

0:32:18

So if they can't see that text until they've answered that question, then that's a benefit.

0:32:22

Right.

0:32:29

Yeah, so then I can mute people. Yeah, I think what I'll do is I'll turn off allowing people to unmute themselves.

0:32:37

Mute all and then don't allow people to unmute themselves, there we go.

0:32:46

So if you really want to say something, I will unmute you in a bit.

0:32:51

Could you show us how to write an answer to a variable?

0:32:52

Sure. I'll get back to my question I was writing earlier.

0:32:57

Here we go.

0:33:02

I think.

0:33:07

I'll do this and then, unless you have more questions to do with explore mode, we'll move onto another thing in a bit, yeah?

0:33:16

So I'm going to add a variable.

0:33:18

And you have to give a stock value, but it might never be used.

0:33:25

Maybe there should be an option in the editor too.

0:33:28

Say this variable's gonna get student input so it doesn't even ask you for a value.

0:33:34

Interface thing.

0:33:40

So here we go.

0:33:42

Let's just write a number.

0:33:45

And I'll accept anything, so I'll go from minus Infinity to Infinity.

0:33:58

OK.

0:34:06

And then maybe I'll add a part option to show that number.

0:34:13

There we go.

0:34:17

We'll have... Did I call it a?

0:34:20

I think I called it a. Right.

0:34:26

So we'll add a next part option. Tell me if I'm going too fast with these things.

0:34:32

It's easy to whizz around the interface when you know what you're doing.

0:34:35

So an option to go to this "Show the number" part and add a variable replacement.

0:34:40

Replace the variable a with the student's answer.

0:34:45

I could replace it with the credit awarded, so a number between zero and one, to do with how correct the answer was, or a JME expression, and there I get access to all of the marking notes for that part.

0:34:58

If you've had a look at custom marking algorithms, you'll see that when a park gets marked, it produces loads of these notes that have values to do with the student's answer, so you could pick out one of those, and that's how the one that detects -- so there's one called something like "alternative answer used" which you could use to do some logic about what the student's done.

0:35:27

I have an aim to create a question which replicates our old DIAGNOSYS system which gives a big bank of questions to establish what incoming engineering students can do, sort of GCSE and A level maths.

0:35:42

And it had a graph of skills.

0:35:46

So if you answer a particular hard question that relies on a load of other skills that you don't need to ask if the student can do those more simple skills, you could sort of infer that they already can.

0:36:03

So I want to do that in explore mode at some point.

0:36:08

Anyway, so I can just replace this variable a with the student's answer.

0:36:12

And that's it.

0:36:14

It works the same way as adaptive marking, if you've done that: if there was another variable that depended on a that would get re-calculated.

0:36:23

So let's write a number. And click on show the number and it shows me 53.

0:36:28

There we go.

0:36:31

We could have something called b that's two a, I don't know.

0:36:41

And then if I click on show the number, it should be -- it would recalculate that.

0:36:54

So it's really easy to implement this.

0:37:07

OK.

0:37:09

Right, let's check the chat again.

0:37:17

Nothing else. Right. So let's go back to my board, what else did we pick?

0:37:23

We wanted to do something on custom marking and I just mentioned that, so let's do that.

0:37:27

Oh, sorry question from Elizabeth.

0:37:31

What would be a good way of making a question change if you need several related numbers to show up for a particular variant?

0:37:41

Can I just would you mind if I unmuted you Elizabeth or you could say in the text.

0:37:45

I'll click unmute, whichever way you want to do it.

0:37:49

[Elizabeth] Can you hear?

0:37:51

Yep, OK so. The really simple example I'm thinking about, although it probably comes up in other things as well is if you're trying to get people to round to a set number of significant figures or decimal places, you can say alright then I have this particular number.

0:38:12

And to make sure they're actually rounding properly, I need to chop it off at this many significant figures.

0:38:20

But, I need the question to be able to appear various times, so I need to be able to have you know, five or six possibilities.

0:38:34

So they can repeat it and get a different different question, but I need to be able to control the number of significant figures related to the thing.

0:38:43

I don't always want it to be 3, for example, [Christian] Oh right.

0:38:49

[Elizabeth] So I kind of would like a way to be able to say well, for this iteration of the question then I need this number, this number and this number.

0:39:00

And for the next iteration of the question, I'm going to have this main number and then this many significant figures attached.

0:39:12

There's like more complicated examples, but that sort of Illustrates the sort of link sets of numbers between different variants of the question.

0:39:25

OK.

0:39:28

[Christian] I mean, that was such an abstract word that I found it difficult to follow.

0:39:36

I think what you want - you want to maybe set the number of significant figures to ask for as a variable.

0:39:43

So you might want to set the number of significant figures to a random number and then if I set up a -- [Elizabeth] I don't want it to be a random number necessarily, because - [Christian] Well, whatever, it might depend on something else.

0:40:06

Yeah.

0:40:09

[Elizabeth] It'll depend on what the main number is.

0:40:11

[Christian] OK, so... [Elizabeth] I want to make sure they've got the learning thing of of have they actually rounded it up?

0:40:15

It will come back to a bigger number.

0:40:21

It'll either stay the same or it will come out to a bigger number depending on - [Christian] Oh right, so you want to make sure it's a number where it will make a difference.

0:40:33

OK, and they're not just chopping it off.

0:40:37

You're talking about this example where the student gets to pick the number they enter.

0:40:41

[Elizabeth] Yeah, I want to control whether they - make sure they get questions where they both, if they're rounding the number will increase, because it should make sure they don't fully grasp the idea of rounding.

0:40:59

[Christian] There's a really simple way of doing that. So pick a random number is the first part, but you don't know what the last digit is going to be, so if it's less than five then you round down.

0:41:15

So a way of ensuring that it's going to round up is you multiply that by 10 and then add on a number between 5 and 9.

0:41:21

So this will always produce a number that has to round up in the last digit.

0:41:35

And you can - I don't know - If you wanted that to be somewhere else in the number, you could...

0:41:43

There you go, so I've shifted that along a couple of digits and now it's this hundreds digit that is always going to round up.

0:41:54

So does that - [Elizabeth] It kind of helps in this particular use case potentially.

0:42:03

I've copied the screen briefly and I'm going to have a think about it, but it doesn't actually answer the, I mean, equally I do things like spherical trigonometry.

0:42:18

And you can potentially sort of go "alright, I'm only going to do questions where it's all above the equator" or "I'm only going to do questions where it's all below the equator".

0:42:30

But if we want to sort of have a question which can change but control which question comes out, you need to be able to say "for this question, I need these three numbers, but for another version of the question I need these three numbers which I've checked will also be a sensible..

0:42:48

." [Christian] So it's a case where setting up the definition so that you get the right thing might be really tricky.

0:42:57

So instead let's just change the definition of this to be 1 to 1000.

0:43:06

There's a variable testing thing so you can write a condition that you want to be true, so you would for your spherical trig thing or whatever you would say all these three numbers need to have whatever property, so I'm going to say something like mod 10 of n is greater than or equal to 5.

0:43:24

So if we have a look over here.

0:43:28

It's now only - It keeps generating sets of variables until that condition is met.

0:43:36

So here it's chucked out any times that the last digit is less than five.

0:43:42

And this condition can be in terms of any combination of the question variables.

0:43:51

That's always going to be true, because I think a is fixed to one at the moment.

0:43:59

Actually, while I'm here, this test condition button generates as many sets of variables as it can for the time you give it, and will tell you how often that condition is true.

0:44:11

So if you write something that's unsatisfiable it will tell you, or something that takes 10,000 goes, you'll have to increase the number of runs it will try to do.

0:44:20

When a student runs a question, if it doesn't make a set of variables that satisfies the condition within the limit, it just fails and says "Numbas died." OK, so does that get you some of the way?

0:44:36

[Elizabeth] Yeah, that's really interesting thanks.

0:44:42

There's no way of sort of like saying well I've got a matrix of variables and I want row one or something?

0:44:45

[Christian] Yeah.

0:44:50

[Elizabeth] I don't know. [Christian] Yeah, you can write anything in terms of the variables here.

0:44:59

So, if you have like a matrix M, then the first row would be - you might want to be 123 or something, you can write whatever you like.

0:45:07

[Elizabeth] I'm gonna go off mute and I'm gonna let you go.

0:45:09

[Christian] OK!

0:45:14

Right, going back. Yeah I did say I have look at Julia's question because I thought it was really good.

0:45:22

Apart from anything else, it's really pleasing to see someone else use the tool without having to email me a million times about how it works or just find it doesn't work at all, so that's good.

0:45:34

So this question. It's about solving linear systems of equations.

0:45:40

And I get to make up my own one.

0:45:42

I really like this because something that I've often wanted to do with students is that writing a question means that you have to really understand the mechanics of the maths much better than just answering a question.

0:45:58

So for years I wanted to run a class where we get students to write Numbas questions because they have to understand what they're doing a lot better, so this kind of thing gets a lot of the way there.

0:46:17

So what I have to do is come up with a set of simultaneous equations.

0:46:23

I'm gonna try my best to not make one that's trivial.

0:46:28

This is going to be like this many X plus this many Y equals that.

0:46:35

I think that's right, from last time I tried this. And Julia's set a limit of 5 rows because I think more than 5 rows would take forever.

0:46:45

Let's reverse engineer this and say X is going to be one, and Y is going to be 2.

0:46:52

So that's going to be 8 and to make my life easy, I'll say one and one add up to three.

0:47:00

I've just noticed that I've set my interface language to Spanish.

0:47:07

Is that right?

0:47:10

Yeah. And that maybe Julia has.

0:47:13

I don't know.

0:47:15

I know what it is - the last person who clicked test run was running Spanish, that's it.

0:47:21

That's a bug.

0:47:23

Right. So then I've put this system of equations in.

0:47:29

It said that's fine. Then I've got some options about what I want to do.

0:47:34

I can multiply a row by something, I can add a multiple of one row to another, so that sort of skips a couple of steps and I can swap some rows around.

0:47:45

Or I can be at the end. I guess that's going to say, what are the roots?

0:47:51

So I think what I'm going to do is take away two of this from that.

0:47:57

So I can say multiply some rows. It's got a load of gaps?

0:48:01

Actually, that's why there's a limit of five rows, isn't it Julia?

0:48:04

Because you need to fix the number of gaps you could have.

0:48:07

I'm going to keep one lot of row one, two lots of row 2.

0:48:11

And then the next thing is calculate the multiplications and this is going to take me back to a bit where I can choose what step to do.

0:48:21

So this is my matrix now.

0:48:23

And I've chosen to take a multiple of this, so I'm gonna say take away one time row 2 from row 1.

0:48:35

On a user interface thing, these could be dropdowns, because I don't know whether these are zero indexed or one indexed or whatever.

0:48:46

And we can maybe annotate these with one and two first.

0:48:51

There we go.

0:48:55

So that's really nice.

0:48:59

I like that question a lot, and Julia's put the link in the chat.

0:49:02

Catching up, Jonathan's asked about \var.

0:49:05

Yeah, this is something I always cover in the intro session, but that's fine.

0:49:21

The reason I use \var is just to get it drawn in LaTeX. For a plain number on its own, curly braces is fine, but when you've got maths notation going on, you probably want consistency in the fonts.

0:49:32

If I just do curly braces here and the preview button...

0:49:39

Why don't those variables exist?

0:49:42

Because there's an error in the testing condition: unsatisfiable.

0:49:48

There we go.

0:49:50

Right, so you see, the plain text font and the LaTeX font look different.

0:49:55

So there's a consistency thing. But you also might want \var if you have it in the middle of some notation.

0:50:04

Something like that.

0:50:08

Don't use \var too much.

0:50:15

Normally the best thing is to use simplify so that you get - you don't get plus minus next to each other and all that.

0:50:20

There's a page in the documentation about this, rather than going through all this, I will - Substituting variables into display maths already talks about all this.

0:50:37

So I already have something written about this.

0:50:40

Dmitri says is it possible to accept an answer when certain condition holds?

0:50:49

Yes, I'm going to do custom marking algorithms next, so I'll I'll do that.

0:50:52

Apparently I made a "how to accept any symmetric matrix" question.

0:50:59

Yeah.

0:51:06

Search for that. Get a server error, that's not good.

0:51:09

What's going on?

0:51:17

I'm gonna guess it's in "How To" As usual, whenever I give a demo, the list of bugs accumulates.

0:51:35

Marking, I'm going to guess it's in...

0:51:37

"accept any symmetric matrix", there you go, it's the first one.

0:51:40

I see actually, you've all been really good catching up in the chat, telling where to go look in the documentation for that.

0:52:01

Julia, you said you wanted to say some things about your question.

0:52:13

Absolutely, so I'll just ask you to unmute yourself.

0:52:18

[Julia] Well, I just wanted to say that so I've also put in that, depending on the size of the matrix, that's how many prompts you'll see for multiplying the rows and so on.

0:52:32

So if you have two, like you had two rows, you'll only see two multiply rows, if you have three rows, you'll see three, and so on.

0:52:42

[Christian] OK, yeah, that wasn't clear.

0:52:45

[Julia] And then if you put the matrix of - like with three rows, say - and the augmentation with only two rows so it doesn't match, it will give you a warning and won't let you submit.

0:52:55

[Christian] Right, yeah, so it checks for consistency between those two things.

0:53:04

That's really good. Thank you.

0:53:05

Right.

0:53:07

Shift that out of the way again. So, custom marking, Go here...

0:53:17

So this is a matrix entry part and the prompt is "Write a symmetric matrix".

0:53:22

In marking settings I've had to give a correct answer.

0:53:27

Now there is no one correct answer to this so I could - the term in the interface is "expected answer", which still isn't quite right.

0:53:35

So the identity matrix is symmetric, so that's what I've chosen.

0:53:46

Now, the way you check that the matrix is symmetric is with a custom marking algorithm.

0:53:51

Actually, we'll go to the documentation about that.

0:53:54

So the idea with this is, it's a real design goal in Numbas that you should be able to easily set up the really common stuff, so like ask the student to enter a mathematical expression and it's correct if it's equivalent to one that you've written.

0:54:21

That's really common. That's a built in thing in Numbas.

0:54:24

So all that's available through the graphical interface, you get this nice form with a box to type that expression in.

0:54:30

That's all you need to do to set up that part type.

0:54:34

But there is always stuff that you want to do that's not in the built in feature set.

0:54:44

In other systems you have to write code.

0:54:47

10 years ago, 20 years ago, e-assessment systems were largely stuff like "you write a Perl script".

0:54:59

That's the way WeBWorK works.

0:55:03

If you've had a look at STACK, that works differently with those potential response tree things.

0:55:13

I don't think there really is that immediate, "I just want to do this really common task, I just fill in one box" thing.

0:55:20

So the question is how you make that nonstandard marking possible in as simple a way as possible.

0:55:35

And what Numbas has at the moment is these custom marking algorithms, where you write some JME code, sort of like the way you define variables.

0:55:54

So I'll explain what a marking algorithm does. The student writes an answer, and when they press submit, that's when the marking algorithm takes over.

0:56:00

There's a load of stuff to do with alternative answers and adaptive marking and all that, constructing the context in which the marking happens, then you get down to a point where you have access to the student's answer, the settings for the part, and all the question variables.

0:56:19

So what the marking algorithm has to do is, it has to decide if the student's answer is valid.

0:56:26

So if there's a mismatched bracket in an expression, you can't mark it and clearly the student didn't intend to submit that, so you just prevent submission and say it's invalid.

0:56:37

You can give some kind of feedback message about what's gone wrong, if you want to help them.

0:56:46

Once it is valid, you work out how much credit to give to the answer and any feedback messages.

0:56:55

So these things in Numbas used to be built in, there used to be a load of JavaScript that did this for each part type.

0:57:02

But in order to make them customizable so you can write your own, now they're written using JME.

0:57:11

So what's the best way to explain it?

0:57:16

Let's have a look at one.

0:57:22

Here we go. So I can see here, this is the built-in marking algorithm for the matrix part.

0:57:29

What it is, it's a load of - it's a series of notes.

0:57:33

So you get a name, then in brackets you can have a comment about what it means, just for reference for the question author really, and then an expression.

0:57:48

So that can produce a value like this, so the number of rows in the student's answer, or it can produce some feedback.

0:57:55

So we'll find one of those.

0:58:00

Oh here we go.

0:58:06

I said "or", that was inclusive or: it can produce both a value and some feedback.

0:58:14

So here I have a note: are all of the cells in the matrix given to the same precision?

0:58:18

So I've got this big long condition here.

0:58:22

I've worked out the precision for each cell up here.

0:58:25

So it evaluates to true if they are, and if they're not, it gives this feedback note: "Not all cells are given to the same precision." Because this is a built-in thing that's a translated string.

0:58:43

If you are writing a question, you probably just write an actual sentence there, and it also has the value false.

0:58:50

If I keep going along, there's a lot of stuff about invalid cells here, so it gives you a warning and also fail.

0:59:04

When you get to that, the marking just stops entirely.

0:59:08

Right, where are we?

0:59:12

Going to get to the marking script itself.

0:59:15

Every marking algorithm has two notes, one called mark which is used to give the final feedback to the student and one called interpreted answer which is what the part reports as the answer the student gave.

0:59:28

So for adaptive marking and for explore mode where you're replacing variables, it uses this value.

0:59:39

So not just - for this matrix part, it's not just the grid of strings the student wrote, but it's a matrix value.

0:59:48

In the mark note we apply a load of other notes, so first of all there's this "any empty", which I think says it's invalid if there's an empty cell anywhere.

1:00:02

Where are we? There we go.

1:00:05

Assert that there are no empty tiles, otherwise end.

1:00:07

Any invalid, and then apply the precision restriction, all same precision, that's right.

1:00:26

Is it the wrong size? That would I think give it 0 marks.

1:00:31

And then it does some stuff on, if all the cells are correct then it's just correct.

1:00:39

There's just this function that just produces the stock message, "Your answer is correct".

1:00:44

Otherwise if we're doing per cell marking, set the credit to whatever proportion it should be, otherwise mark it incorrect.

1:00:54

And finally apply the precision penalty.

1:00:56

I'll find that.

1:01:00

Wrong precision, where is it?

1:01:03

There we are. If there are any cells given to the wrong precision, then multiply the credit by whatever that partial credit factor is set to.

1:01:12

So the way this works, throughout each of these statements joined together with semi colons, they produce feedback notes.

1:01:25

Those all get made up into a list.

1:01:28

And then to work out the credit for the parts and the feedback messages, it goes down the list adding credit, subtracting credit, multiplying.

1:01:40

The correct function sets the credit to one and then it gets to the very end and that's the final feedback.

1:01:47

So and then this custom one, I'll get onto that in a bit, but let's try entering an answer here.

1:01:59

Here we go. So I've entered the one by one matrix with one in it.

1:02:03

Which is, I think it's symmetric, and I can see my mark note, I just get "your answer is correct".

1:02:10

If it's invalid it will tell me that it's invalid.

1:02:13

And none of the other marking happened.

1:02:16

It might have been better to show this with a stock part first.

1:02:26

So that's not symmetric and I haven't given any feedback here.

1:02:28

But I can see for each of these marking notes, I can have a look at what its value is.

1:02:42

Any empty, no, any invalid, no.

1:02:45

Where's my "is symmetric"? False.

1:02:48

So that's roughly how a custom marking algorithm works.

1:02:55

So to make this mark any symmetric matrix correct, I had to change the mark note, so I still want the any empty and any invalid notes because I don't want to try and work with an invalid answer, but once I know that it is valid the only condition is that it's symmetric, and that's defined to be if the matrix is equal to its transpose.

1:03:23

So there's this function "correct if" which says if this thing is true, then give full credit, otherwise give zero credit.

1:03:32

I could have - if I'd wanted to give some more feedback for when it's not symmetric, I could have done something like, If it's equal, that's correct.

1:03:49

"Your matrix should be equal to its transpose and it isn't." There we go.

1:04:03

There we are, and now I sort of have to change my answer a bit to get this to re run, and there we go.

1:04:15

So that's come out of the symmetric note and that's the feedback student gets.

1:04:21

So there we go.

1:04:25

All right, I haven't looked at the chat in a while.

1:04:29

OK.

1:04:33

What happens in Numbas if student gives a mathematically valued answer in a format Numbas doesn't recognize, for example, "write a number", the student answers pi plus one?" They'll get something saying it's invalid.

1:04:50

So let's show you what that would look like.

1:04:57

Let's go to my training project. I'm going to create a question.

1:05:03

Let's call it marking.

1:05:06

Inside that window.

1:05:17

Right, so what was it? Enter a number between one and 10.

1:05:22

A student might write π. If I write π here, it will get "Your answer is invalid.

1:05:32

You must enter an integer or decimal." You could write a custom marking algorithm to accept that.

1:05:45

You might want to choose a different part type, you might want a match text pattern or you might want a mathematical expression part type.

1:05:56

Actually, that's a good idea for a nice custom marking algorithm, let's check.

1:06:02

Oh no, pi.

1:06:05

So the choice of part type is really about what kind of input method you want.

1:06:14

I haven't talked about custom part types yet, I've got plenty of time, I will.

1:06:18

So I want to change the marking algorithm.

1:06:25

And the built in one has got something to parse the student's expression.

1:06:32

Let's see how much of the existing marking that I want.

1:06:35

Let's copy that.

1:06:41

So the student expression note tries to do some parsing and if it can't be parsed then it fails, so we'll keep that.

1:06:50

Then the rest is all to do with looking at the answer as a mathematical expression, but what we're going to do is check that it's a number.

1:07:04

Something like that.

1:07:09

Now what's it called?

1:07:18

There we go. I'm just going to try that.

1:07:26

Oh, there's a weird error message.

1:07:28

So because I've changed a lot of stuff in Numbas version five, there are now some more cases where errors come up and that should be a sensible error message telling me what I've done wrong.

1:07:39

I don't really know at the moment.

1:07:44

I'm going to guess...

1:07:46

is that right? No, that's bad.

1:07:51

OK, that works.

1:07:57

Oh, the reason that doesn't work is because that note doesn't exist.

1:08:07

Let's just... And that should definitely have given me a better error message than that.

1:08:12

OK, so.

1:08:18

Let's just check this student value note, there's a tonne of these here.

1:08:20

Right, and if I try X, what does it do?

1:08:27

The name x.

1:08:30

OK, so I can get an error.

1:08:32

So maybe I want to catch some errors there.

1:08:35

I'm going to skip that when I'm doing this.

1:08:40

Write a note to get the type of the student value.

1:08:43

There we go. 5.

1:08:51

Integer, yeah, and in fact Numbas has a load of different data types for numbers, to make sure you don't lose any accuracy in different contexts.

1:09:10

So it has integers, it has rationals, it has the built-in floating point numbers that it always used to use, high precision decimals and both the number and the decimal type can be complex, so they can have imaginary parts.

1:09:24

What I want is a function that says, is it equivalent to a number type?

1:09:28

So I'm going to go off to the help.

1:09:32

I think I have a function that can do that for me.

1:09:35

I'll be sad if I don't.

1:09:39

Uh, right.

1:09:44

Here we go. JME function reference.

1:09:49

Sub expressions. Because there's a built in function in JavaScript that does this but apparently not in the JME, no.

1:10:10

OK, I'll have to do it differently.

1:10:12

What I'll do is I'll try and force it to make it to a number type.

1:10:19

There we go.

1:10:26

So that works and that does not.

1:10:39

Can't automatically convert from name to number.

1:10:41

OK. So I think the way I'll get this to work is I'll say try to convert to a number, otherwise fail.

1:10:55

Something like that.

1:11:01

And I've got that problem again.

1:11:12

There we go. What does mark look like at the moment?

1:11:22

Let's just check that.

1:11:26

There we go.

1:11:36

Actually, let's make that incorrect if it's not the right thing and correct if it is.

1:11:43

And get rid of that line.

1:11:45

I realize at the moment I've just been talking to myself for a while.

1:11:51

I will check the chat in a second.

1:11:52

It still says incorrect. That's not good. Have I misunderstood how the try works?

1:12:06

Try.

1:12:11

Oh yeah, yeah, yeah. The second argument is an error message, which I don't really want, which is why I forgot about it.

1:12:17

There we go. That's not good still.

1:12:29

I should've maybe been less adventurous, I assumed this would work.

1:12:39

Yeah, so it...

1:12:47

Man..

1:12:50

right? There we go, try that.

1:13:00

Yeah, so because it's a number, it didn't trigger that thing and we'll just say it was correct if we get to that point.

1:13:12

So what I was doing was I was saying try to convert it to a number data type.

1:13:18

If that fails, then say that the student's answer is incorrect and end the marking there.

1:13:22

So anything that gets applied afterwards just gets thrown away.

1:13:26

If it did work, then will get into this next line where we mark it correct.

1:13:31

So there that's marked correct, one's right, x is not right.

1:13:42

There we go, it worked. So I can write something like pi.

1:13:47

So really that asking about can you enter pi, I can answer anything here, couldn't I?

1:13:53

So 1 + 2 something like that and that evaluates to number.

1:14:00

So that's the kind of thing you need a custom marking algorithm for, where you want to change what is accepted.

1:14:11

OK, uh, right, I'll try...

1:14:18

Hopefully that's helped you, who knows?

1:14:26

Is it possible to pass variables between the algorithms of parts?

1:14:31

Ruth, could you just explain what you mean by that?

1:14:35

I can unmute you. [Ruth] Yeah, I'm not sure I explained that very well.

1:14:41

So if there was, if you got something, an answer to part a that might be right or wrong, just even the variable for it, could you pass that through to the custom marking for Part B?

1:15:00

So they were interacting with each other?

1:15:05

[Christian] Yeah, that's what adaptive marking is about.

1:15:09

If you're not in explore mode, in explore mode then I showed how you do those variable replacements.

1:15:19

Not in explore mode...

1:15:20

Let's hide zoom again.

1:15:24

So, here's my number entry something or other.

1:15:32

Let's add another part, it doesn't really matter.

1:15:37

I'm just going to pick at random. So I go in adaptive marking, I need a variable for this to go in.

1:15:42

What will come out there?

1:15:50

Right, so I'm going to replace with the student's answer to part a, and I thought I could pick a note from the market algorithm, but that's fine because I can go over here and just change what the interpreted answer is.

1:16:14

So I can say something like Is it an integer?

1:16:22

So I think probably that works best in explore mode because you might want to pick out a few different things from the part.

1:16:34

Maybe this is a feature request that adaptive marking should - the bit that you use should be a drop down here for which bit you use.

1:16:44

So thanks for letting me know.

1:16:45

[Ruth] I think it's that my coding isn't very good, so when it's not a drop down I get a bit lost, but that does make sense.

1:16:52

[Christian] Yeah, that's a good point - I try to, whenever there's a point where you could put some code in, I try to think what are some good dropdown common options you could have.

1:17:06

So over in the explore mode, there were options for the student's answer, whether they submitted it or not, things like that.

1:17:10

[Ruth] Is it possible for - so this is within a question, so different parts are talking within a question - is it possible to have different questions talking within an exam?

1:17:22

[Christian] No, the model is that questions are completely standalone, so that we can use a question in more than one exam.

1:17:30

And the advice we give to people when they're writing questions is if you've got several parts in a question they should all be linked in some way.

1:17:43

If you can answer Part B without having ever seen part A, those are really different questions.

1:17:48

So the question is a set of stuff that all needs to be together.

1:17:56

[Ruth] Thank you. [Christian] Which might not much how you like to present things, but that's the only way of keeping things sane in Numbas, I think.

1:18:05

So. Yeah, hope I've answered that for you and I'll move on.

1:18:09

Mauricio asks, is it possible to pass GeoGebra values to Numbas to use it as a calculation engine?

1:18:21

So, GeoGebra does give you access to the values of variables in it, which - I've had demos in the past that have said stuff like move this point to a particular place and then the part will get marked based on whether you did that.

1:18:42

GeoGebra used to have a really good tool for checking the student had done a certain construction.

1:18:49

That seems to have disappeared from the web editor now.

1:18:52

So you can do that.

1:18:53

I won't do it now because it involves a fair bit of scripting and I can't remember how to do it.

1:18:57

Certainly the GeoGebra extension that exists for Numbas can do the other direction.

1:19:04

You can give it a list of question variables, and stick that into GeoGebra.

1:19:08

So it's...

1:19:12

Yeah, maybe I should add in the ability to get stuff out.

1:19:16

The problem is with when this happens.

1:19:20

If you wanted to use those to generate question variables, you'd have to wait until GeoGebra has loaded before you can get the values out, which Numbas doesn't support at the moment, it doesn't have the ability to wait for a certain thing to happen, it just sort of expects that it can generate all the variables in one go.

1:19:42

And I'm very, very wary of adding dependencies for other things, particularly for stuff like doing calculations or computer algebra stuff.

1:19:54

I'd rather have that implemented in Numbas.

1:19:58

Julia worked out what I was doing wrong.

1:20:02

Can we still use JavaScript, says Daniel.

1:20:07

Yeah you can. What you need JavaScript marking algorithms to return, what to do, has changed and it's not very well documented.

1:20:19

I really, really encourage you to use the custom marking algorithms in JME because there's so much stuff that you'll end up having just replicated.

1:20:34

You can write a custom JME function over in the extensions tab.

1:20:37

If there's something you want to do that you need to go off to JavaScript to do, write a function that does it and then call it from the marking algorithm.

1:20:47

I think that's the right thing to do.

1:20:49

Yeah, every time I write a custom marking algorithm I have to look up documentation.

1:20:59

Will this test be available for us to look at?

1:21:02

Yeah, I'll publish these things.

1:21:07

Can marking notes have comments in? Yep, let's go...

1:21:12

where was it? The way it works, it's whenever you got a blank line that splits off a note, but I can still write comments in, that sort of thing.

1:21:24

Yeah, so that's a good idea to explain how these things work and I really should go back and stick lots more comments in the built in marking algorithm so you can see what they do.

1:21:39

I'm not very happy with this interface, by the way.

1:21:44

I'd rather have something like the variable definition one, where you get to see - where there's a lot more opportunities to document and see how things work.

1:21:59

In the custom part type editor, it's a lot more like that.

1:22:04

Jonathan, you said, can you ask a question? I'll unmute you just in case that question is still something you want to ask?

1:22:13

I haven't already...

1:22:16

[Jonathan] Hi. Thanks a lot for doing this Christian, and apologies if this is a somewhat rudimentary question.

1:22:25

I was - I know a lot of you teach mathematics. I'm doing the sort of mathematical side of an economics program for undergraduates, so the maths involved is not that complicated to test, compared to some of the stuff you do, which gives me hope that you might be able to help me with this.

1:22:40

With our second years we're doing partial differentiation and optimization and that sort of thing and I found that every time I write a question I need to go into the sort of solution section and obviously every time it's going to generate new variables, new coefficients which might be called a,b,c and new variables also for the indices.

1:22:58

Is this sort of custom marking thing, is this somewhere where I might find almost a predefined function that essentially tells instead of me having to type it out and work every question out hand by hand, as in subbing the variable in front and then dropping the power by one, is there a sort of predefined function that essentially says whatever the hell that the expression that's generated is, differentiate it with respect to whichever variable.

1:23:30

Do you know what I mean, would that be this, or... ? [Christian] Yeah, down here where I was writing my answer, the line above is the expected answer.

1:23:39

So if that had had variables subbed into it, it would show those.

1:23:44

So I'll just hide all this stuff again.

1:23:49

Make a nice example.

1:23:52

[Jonathan] I hope I've explained the question clearly.

1:23:56

[Christian] Am I on the right track? Before I -- [Jonathan] Well, I I think so.

1:23:59

I just mean normally the only sort of answer I've been doing when it when it comes to inserting the parts, I've been doing the expression part rather than a number entry because here's a function, let's differentiate with respect to X [Christian] And you know how to do that, because you've randomised -- [Jonathan] Yeah, created variables in the variable section that generate different coefficients in front of the x and the y.

1:24:25

And then yeah, that's exactly what I do, so I do that when I'm typing in the solution.

1:24:32

Which is is fine, but if the structure of the original expression is somewhat different, there might not be a b coefficient or a c and it kind of then it depends, do you know what I mean?

1:24:44

If this is the answer, then I'll keep doing it this way, that's fine, but I just thought I'd ask.

1:24:53

[Christian] I'll show you this, so I'm going to make up a couple of variables.

1:24:54

[Jonathan] And I also notice that it's sometimes a bit funny with regards to requiring an asterisk symbol.

1:25:03

[Christian] Ooh, that's a good point.

1:25:05

So let's just make sure we've got these variables, a and b.

1:25:10

So a is going to be - I'll pick a random number from a range one to five.

1:25:15

Actually no, that's a power so I need that not to be 0.

1:25:18

And b is going to be zero or one, just to show you that I want the zero case to come up.

1:25:29

So here's my expression. I'll write out what it was.

1:25:35

It was something like x to the a plus b x squared.

1:25:41

I think that's what I had in mind. So differentiate that.

1:25:49

So the prompt the student will get looks like that.

1:25:52

And actually, you can see.

1:26:00

I'll put some text in to show what a and b are so we can see what's going on.

1:26:07

Right.

1:26:08

So a is 3, so we get x cubed, and b is one, so it's one x squared and the simplification has omitted that one because you wouldn't write that by convention.

1:26:27

Let's make - I need be to sometimes be two.

1:26:31

Let's go and change it. There we go.

1:26:37

Right, let's try again.

1:26:40

So we'll try when it's two, I'd love to come up soon, There we go.

1:26:45

So you get plus 2 X squared.

1:26:49

Now I've written the correct answer - yeah, the correct answer for this is a times X to the minus 1 plus 2 B times X.

1:27:00

OK. And by default it applies a load of simplification rules.

1:27:04

So if B is 0, this thing just gets omitted.

1:27:10

And in the marking algorithm tab, here we go, I've got - I can switch to see the variable values.

1:27:17

A is 3 and B is 2, so -- [Jonathan] It just pulls that from what you've written in the marking settings, isn't it?

1:27:25

[Christian] Yeah.

1:27:27

So does that answer your question?

1:27:31

[Jonathan] Well, I guess I've done that much.

1:27:35

I just wondered if I guess I wondered - that works for that structure of questions, but what if you have more than X's and Y's and you perhaps have Z's or Q's or L's or whatevers.

1:27:53

You then need to sort of write down the new general format solution in marking settings every time, I guess it's fine if that's the case, I just wasn't sure if there was almost pre-designed functions built in that involve programming that's beyond my capabilities, where I could just [Christian] So you're asking specifically about differentiating?

1:28:11

Right, I hadn't -- [Jonathan] Yes, I'm just - it's the only case I've come across to be honest, we know as humans it's the same procedure every single time, which makes me think there might be a function that already exists.

1:28:25

[Christian] Yeah, differentiation is easy, integration is harder.

1:28:30

Other systems have access to a proper computer algebra system.

1:28:33

These systems have millions of rules for spotting how to do integrals.

1:28:41

So Numbas never used to have... [inaudible] Numbas never used to have these features, but I did write a differentiation function recently.

1:29:05

So I think I can do, is it X, with respect to X?

1:29:13

I've already got a variable called x, let's get rid of that.

1:29:23

There we go. So differentiate that expression with respect to X and it will do it.

1:29:25

[Jonathan] That was exactly what I meant.

1:29:29

[Christian] OK, good, glad we got there.

1:29:32

[Jonathan] And can you then pull that through -- [Christian] Don't know how to differentiate - this hasn't really been tested, which is why I haven't really shown it, and there's a pretty glaring edge case.

1:29:42

Sorry. What were you saying? [Jonathan] I'm just wondering now, so when it goes to you putting into the parts section what the solution should be.

1:29:50

Can you literally right down 'expr'?

1:29:54

[Christian] Yeah.

1:29:56

[Jonathan] OK, but that needs to be defined in the variables section for every question?

1:30:00

[Christian] Yeah, well, I can type something like that.

1:30:07

There's a pretty gnomic error message.

1:30:09

Not happy about that. Yeah, I hope that works.

1:30:18

It should work. I think that works.

1:30:24

Right. OK, so does that answer your question?

1:30:28

[Jonathan] Yeah, sorry, it's good to know that that's there.

1:30:31

[Christian] It's there, but it looks like it needs some more work [Jonathan] I'll triple check it before I use it in a summative piece of work.

1:30:40

Thanks for your help, thank you. Right...

1:30:47

Dmitri says can I assign a student's answer to a variable in non explore mode?

1:30:51

Yeah, using adaptive marking.

1:30:55

So for Part B you would add an adaptive marking thing to replace a variable.

1:31:03

So just for that part the value of the variable would be replaced and you can - the idea with that is for error carried forward marking.

1:31:11

So you might want to not do the replacement, but you can pick always replace it.

1:31:19

The chemists at Newcastle do a lot of digital labs where students enter their data in the first part and then that's used in subsequent parts and they have to set up this adaptive marking thing for each one.

1:31:30

So explore mode will make that a lot easier for them. JSXGraph, we haven't really got onto JSXGraph.

1:31:39

I also want to show you custom part types shortly.

1:31:45

Yeah, the point about being able to try stuff out in the variables interface.

1:31:55

I think just typing something and seeing what happens is often tonnes quicker than going off to...

1:31:59

...

1:32:19

its value, absolutely. That's half the point of it. So I think we can show this diff function here.

1:32:25

I've got something saying my internet connection is unstable.

1:32:29

Has my sound just broken up.

1:32:31

Can somebody say yes or no? Uh, I'll keep talking.

1:32:37

I'm back now, OK, I don't know what you missed.

1:32:41

I was just talking about David saying is it possible to use a function?

1:32:45

Yeah, so I'm inside of one. I don't know what kind of function you mean.

1:32:49

If you define a custom function over in the extensions, you can use that.

1:32:54

David says can I show you an example?

1:32:57

Sure. Do you want to do screen share?

1:33:01

Let's let's turn mine off and I'll find David. Can I unmute him from here?

1:33:08

Ask to unmute.

1:33:14

David, I think you're unmuted now, are you trying to find the thing you want to show?

1:33:38

I can't hear you, if you...

1:33:51

Maybe we'll come back.

1:33:55

You say in the chat what it was you wanted to show.

1:33:57

David says, how do I share screen?

1:34:03

We can't hear you, David. He's given a link, alright.

1:34:08

So I'll do that, I'll share screen. Right now I need to turn on the chat again, there we go.

1:34:17

[inaudible] Right, uhm, is this going to be about JSXGraph?

1:34:25

So what's the question?

1:34:38

Alright, looking at variables.

1:34:45

Bye Danielle, yes, the Australian contingent are going to have to go.

1:34:59

Yeah, it would be much easier if we could hear you David, maybe we'll come back to you if there's time.

1:35:16

Or you could email afterwards if I don't get back to you.

1:35:20

Right.

1:35:26

What was I going to do? Custom part types. Oh, bye Jonathan, as well.

1:35:32

Right. So we've got custom marking algorithms and you very quickly start reusing them, which is good.

1:35:45

But if you then need to make a change to it, you have to go back through every part that uses it and make that change.

1:35:58

So custom part types are a way of making something reusable and providing a better interface for editing.

1:36:07

So the way you get to those is you go to your profile and then there's these options down here.

1:36:14

I haven't talked about extensions today, I don't think we've got time to.

1:36:17

You go on part types.

1:36:20

I'll create a new one.

1:36:24

I don't know what it's going to do yet.

1:36:31

So the idea is both to make something reusable and also document it.

1:36:39

So there's a lot of fields for, you can give a description, you can give some documentation, which I use - for part types that correspond to extensions like the quantities one, there's a link to the documentation for that.

1:36:53

It can require an extension.

1:36:56

Again, I've got a load of unreleased extensions available here, but I can for example - the quantities part type needs the quantities extension.

1:37:06

And the way it works, the setup is you have a lot of settings which appear in the editor like the normal part types, to configure how it works.

1:37:18

And then you choose which input method the student's going to use.

1:37:25

So this is all being abstracted out. Like I used the maths expression part type earlier to take a number, but it would be nice if I had a - as a question author, if the editing interface was adapted for this particular use.

1:37:42

So I can choose which input method I want to use, and those have their own options.

1:37:48

So if it's radio buttons, I can have a lot of choices.

1:37:53

And each of these you can untick static to say it's going to be in terms of some settings.

1:37:59

OK, and then once you've set up the input box, you write the marking algorithm, and this is like the variable generation thing: you have these two marks that are needed and you can add others.

1:38:13

And in each you can write a description to explain how they're generated.

1:38:24

So what I'll do is, I'll go back to an existing one.

1:38:31

This quantities part type. So this has a few settings, quite a few in fact.

1:38:36

So you give a correct answer.

1:38:41

There's an option for what kind of hint you want to give, so that's next to the input box.

1:38:49

You might have noticed for when you've got a precision restriction it automatically says give your answer to 2 decimal places.

1:38:55

So a part type can say what that text is going to be.

1:39:03

And then some ticky box options, like do you allow a unitless answer?

1:39:06

Some more drop downs. I'll keep going.

1:39:11

And for each option you can give a hint for question authors that appears in the editing interface to make it more obvious what to do.

1:39:20

Penalties is, this is a percentage value, so the question author gets given a slider.

1:39:28

And this is going to be an expression that evaluates to the margin of error.

1:39:33

So then configuring the input, you have to give a value for the expected answer, when expected answers are revealed.

1:39:47

And an expression which gives the hint I was just talking about.

1:39:49

Then we've got a load of notes.

1:39:53

So this is the mark note. And there's a load of stuff.

1:40:00

I'll go back to start. So the first one is valid number.

1:40:03

Where is that? Down here. Which depends on student number, which depends on other stuff, so you can sort of work backwards through these links to work out where the parsing starts.

1:40:19

So I think that's a bit better interface for writing these things.

1:40:27

OK, so Dmitri you want to unmute.

1:40:33

And David's sorted his sounds out so I might come back to you, David.

1:40:41

Right.

1:40:46

I think Dmitri, let me just remind myself what your question was a while ago.

1:40:49

It wasn't the seed one. Oh right, use the student's answer to a variable in non explore mode.

1:40:55

OK, yeah, sure I'll unmute you.

1:40:59

Where are you? [Dmitri] OK, thank you, so my question was the following.

1:41:03

Suppose the answer on the problem is a square root of b and I don't want to ask the student to write the LaTeX expression of something like this.

1:41:17

So far I did like I put a gap fill and they put two gaps, one for A, one for B.

1:41:23

But of course it may be like 2 square root of 8 or 4 square root of 2 also answered as correct.

1:41:28

Is it possible in the marking algorithm to assign variables to both gaps and check that the product of squares of two numbers is 32 or so?

1:41:44

[Christian] Oh right, yeah, this is really combining both bits of a gap fill, which we can do.

1:41:49

Yeah.

1:41:55

Let's have a go. I won't make a - I might make that example, let's give this a try.

1:42:01

So I'll make a gap fill and I think I won't go with mathematical expression even though I could.

1:42:11

No, fine, we will, so you can enter the square root.

1:42:15

So there are going to be two mathematical expression parts and what we want is something whose square is 12, maybe.

1:42:29

I think that the square root of 12 is 2 root 3, yeah?

1:42:44

Right.

1:42:45

I'll go to gaps. I'm not going to do anything with the prompts, maybe I'll say times those.

1:42:59

Right.

1:43:01

So the way a gap fill marking algorithm works is that it tries marking each of the gaps, just to get the student's answers to those gaps.

1:43:15

And then the standard algorithm will go through each gap, submit it, like run the submit method, so apply all the alternative marking, alternative answers stuff and then collect all the feedback and just sort of make a big list of that.

1:43:30

And that's the feedback for the parent part.

1:43:36

We're not going to do that because what we want to do is combine those two answers together.

1:43:42

So...

1:43:44

Actually, I'm going to make this note called student numbers.

1:43:57

And what it's going to do is evaluate both of the student's answers.

1:44:04

We'd have to add in a load of error checking to check that they've written something that does produce a number, which we did in the other example.

1:44:12

That's why I hesitated about making these a maths expression thing.

1:44:18

Let's assume we do that. I'm not going to type anything that's not a number.

1:44:21

And this answers -- it gives me a list of the student's answers to those gaps.

1:44:28

Why don't I have the option to answer these things here?

1:44:39

I'm going to reload this page. This may be another bug.

1:44:42

Yeah, there we go.

1:44:45

OK, I'm going to have to watch this video, just to make note of all the bugs that I spotted.

1:44:56

So once I've answered these things, this student numbers note should...

1:45:02

Oh hey, what are the answers?

1:45:05

Hmm.

1:45:08

Alright, let's try type of answers.

1:45:19

Just see what that is. And it's gone again.

1:45:26

Right, not a good time for these bugs to be appearing.

1:45:30

Clearly there's something going on with it remaking stuff.

1:45:41

OK.

1:45:44

For some reason those are coming out as integers.

1:45:50

So maybe -- oh fine, whatever.

1:45:54

Let's see if I can do that.

1:45:58

And that's again broken and... There.

1:46:05

Something like that. Who knows why that's come up here?

1:46:12

I think that should work.

1:46:39

I thought that should work. That's correct, but the interface is wrong.

1:46:44

I'm going to run this question.

1:46:48

Right.

1:46:50

And I've got all my other problems here, haven't I?

1:46:56

I'll just fix that so that it comes up with the right things.

1:47:00

I should have made a new question.

1:47:05

Right, here we go. So. So I should be able to type two times root 3.

1:47:15

And actually, I wasn't checking that the product was -- that the square was 12, I was checking that the product was twelve, wasn't I?

1:47:28

So I'll go back. I will get there.

1:47:32

Right.

1:47:36

So check the product squared is 12. Two times square root of 3.

1:47:46

That's correct.

1:47:50

And because these individual bits can't be correct on their own, I need to turn off the ticks and the feedback state for those gaps, which I will do.

1:48:00

Go.

1:48:06

Do not show score feedback icon.

1:48:09

Do not show score feedback icon. So now that means if I write something else.

1:48:15

Square root of 12 times 1, which would it would have shown up incorrect next to each of those boxes because they didn't match what I was expecting, I haven't done anything with the marking algorithms for the individual gaps.

1:48:36

But now, this part is correct.

1:48:38

So does that answer your question, Dmitri?

1:48:43

I'll unmute you again. [Dmitri] Yes, yes.

1:48:49

Thank you very much. And sorry I had also one question.

1:48:54

It was missed because you scrolled down then up. Do you have a seed function for randomness?

1:48:59

If I want to fix the randomness? [Christian] No, I think you would, I guess just fix your random values.

1:49:08

The interface, it does - when you're editing, you can lock a certain value, by clicking that lock button.

1:49:18

So if I click regenerate here, the Five is going to stay the same.

1:49:24

So when you're editing, you can do that and it shows you which variables are random.

1:49:30

If I lock this then it locks everything that it depends on as well.

1:49:37

So I can fix the value of things while editing, but I think...

1:49:39

I guess maybe if you've got a question, it's randomized and you want to make it static as it would be delivered to students, it might be easier to say, fix the random seed.

1:49:57

But that's not possible at the moment.

1:49:59

And I don't think I would consider it a priority.

1:50:04

Right.

1:50:12

We've got ten minutes left.

1:50:16

I don't want to overrun.

1:50:18

Claire asks, JME code, is it a derivative of some other language?

1:50:27

It's made up. It's specific to Numbas but the syntax is very similar to other things.

1:50:37

At Newcastle we used to use a commercial system called i-assess, but that was developed from the lineage of systems beginning with CALM, which was developed at Heriot- Watt in the 80s, which used this kind of syntax.

1:50:52

I think it was never formally specified.

1:50:56

So yeah, the JME system is completely specific to Numbas, and all of the functions and operators and the syntax is documented in the Numbas documentation.

1:51:11

So if it's not there, it doesn't exist.

1:51:16

I hope that helps.

1:51:18

Yeah.

1:51:21

OK, so we've got 10 minutes, and, uh, I guess David we'll try and deal with your question so I can unmute you.

1:51:34

[David] OK, how is that?

1:51:38

[Christian] Yes, I can hear you! [David] You might be able to see me now as well.

1:51:42

Yeah.

1:51:46

Go back to my question. It's probably easiest for me to run through it.

1:51:52

If you just do a test run and I'll show you what it does.

1:51:57

Basically, when you've got electronic components, you've got three components up at the top of that screen, and what I do is I generate random component values for a resistor, an inductor and capacitor, and there are -- there's a fixed set of values that these components have, and what I find I'm doing is, I'm generating values for them every single time.

1:52:19

What I'd like to be able to do - if you could go to the variables - is basically saying can I have a value for a component?

1:52:29

That component value one you're looking at the front there.

1:52:33

That is the actual base digits that are used to generate all electronic component values.

1:52:42

I then multiply it by 1, 10 or 100.

1:52:45

And then I give it a magnitude, which is like an SI prefix, so anything between Pico, Nano, Micro, Milli, Kilo, Mega, Giga.

1:53:00

And I'm generating this every single time for all of my components.

1:53:05

So if you go to, say, R value for example, I pick a random component value.

1:53:13

And then I pick a multiply for it underneath. And then I pick a magnitude.

1:53:19

[Christian] Oh yeah, I see you've got R and you've got C and -- [David] So what I'd like to be able to do is say give me a value and give me an SI prefix Uh, I think some other stuff in there because ideally I'd like to be able to say, give me a magnitude between Kilo and Mega.

1:53:38

Because it makes sense for a resistor to be either a base unit or a kilo or Mega, it doesn't make sense for a resistor to be nanos or micros.

1:53:48

I'd like to be able to give it a range, but even if I could just say it, give me a number and a prefix and then I could use a test to sort out whether I wanted it for that component.

1:53:59

It's that sort of thing, if that makes sense. [Christian] OK, I will...

1:54:03

I'll show you the rough idea. Where's my thing?

1:54:09

I'm going to define a function.

1:54:12

Actually no, let's define a variable first, which is a list of things.

1:54:18

Change that to 2, I've just typed the first few prime numbers.

1:54:25

I'm going to define a function which picks at random from that.

1:54:31

So you can add parameters, if I'd wanted to, which I'm not going to do.

1:54:42

Yeah, let's call that.

1:54:50

So it'll take a list, and it's going to return something.

1:54:56

I don't think it actually matters what you say that the output type is.

1:55:00

So then over in the variables, I can define a variable and use that function random option, and it took a parameter of the options.

1:55:21

So this, it could, -- It could use several things, so I could make something called scale, which you had like 100.

1:55:35

And if I go and change my function definition to use that scale, it works.

1:55:49

It's defined.

1:55:53

It's not coming in the right -- Man! I thought it had access to the question variables but maybe I need to pass it in, so I'll add a parameter, scale has to be a number.

1:56:08

There we go. Right, so that works.

1:56:11

So that could have been a list of possible scales to choose from.

1:56:20

I mean there's no reason why that couldn't be?

1:56:22

So does that solve that problem for you?

1:56:26

[David] Is it possible to have the options list actually in the function, not in the variables?

1:56:35

[Christian] Yeah, absolutely. So I'll get rid of that variable, that scale.

1:56:37

Like that.

1:56:49

And it still tries to take a couple of parameters, doesn't it?

1:56:58

So let's get rid of those. So this now doesn't take any parameters.

1:57:04

There we go. So you can do that.

1:57:09

What you can do, because you might want to use this value more than once, you can use 'let' to define a variable just within that sort of scope.

1:57:27

So the let function, you have a variable name and then a value, and the very last parameter is an expression that evaluates.

1:57:36

So this is going to say define an option, or let options be this list and then pick from it and multiply it by a scale.

1:57:55

So I could add another one. So these are sort of evaluated procedurally.

1:58:07

So these are my new variables. And then there's my expression, option times.

1:58:16

Those things. Hopefully, if I've gone over here, it works.

1:58:20

There we go. And you don't just have to return a number from a function, you could return a list or dictionary, if there's a few elements.

1:58:27

[David] I'd like to return a number and a letter.

1:58:31

[Christian] Let's make that return a list now, and instead of returning the product of those two things, it'll return a tuple.

1:58:42

So there we go.

1:58:45

[David] Yeah, that helps, that gets me started.

1:58:48

I end up with a load of messy handling, if you look on the variables on my question below, on generating a number and then multiplying it by the magnitude to get a scale and then working out what the prefix is going to be, checking if it's u for mu, and...

1:59:05

[Christian] You could look at using the quantities extension because it handles all of that.

1:59:13

So you could -- it does the parsing of units and you can do arithmetic on quantities with units attached.

1:59:24

Which I think would make this a lot simpler. [David] Alright, so I'll have to look at that now, because what I do is I pass some of this to JSXGraph as well.

1:59:31

I don't think you can pass the mu symbol, but you can pass a u and then get that to convert it and it gets messy, and I do the same thing every time because I teach electronics.

1:59:45

[Christian] You should be able to pass the mu.

1:59:50

Maybe look at that later. Right, OK, so that's answered that. I'll do one last check of the chat.

1:59:55

Where did we get to?

1:59:58

So Sam asked if there's been any development on SCORM in Blackboard.

2:00:05

No.

2:00:09

Blackboard, I think, have just stopped developing their SCORM player.

2:00:14

Question, should all the JME functions be documented there?

2:00:20

Yes. If there's one that isn't, tell me.

2:00:22

I have a script which checks that there's documentation for every defined function, but I might not have run it recently.

2:00:32

Dmitri asks, can I use TikZ? No.

2:00:38

Somebody has written a JavaScript port of TikZ. I think it involved some enormous trans compiled library, so it's not included in Numbas, but that would be a good extension idea.

2:00:53

I didn't get onto talking about diagrams and it's now twelve o'clock.

2:00:57

In the Numbas demo, which I recently updated and I went through in the beginners' tutorial.

2:01:06

It's under main demo...

2:01:09

There are a few options for doing diagrams.

2:01:16

I mean, TikZ is very good. It's very expressive.

2:01:21

But it doesn't have any idea of interactivity. So quite often you're going to want to make an interactive thing, or animated diagram.

2:01:29

TikZ is designed for LaTeX, producing PDFs.

2:01:33

So it's not necessarily the best option. So you can use JSXGraph which David referred to.

2:01:39

You can use GeoGebra, which is a whole separate thing and it gets loaded off from elsewhere, and there's Eukleides, which I think will be the closest experience to using TikZ.

2:01:51

I think it's very powerful.

2:01:55

I've used it a fair bit.

2:01:57

Um, right, so twelve o'clock. I need some lunch.

2:02:02

I think we'll stop there. Thank you all for coming along and being so engaged.

2:02:10

I'll just repeat that this is being recorded and unless I receive any requests for things to be clipped out in the next couple of days, this will just go online on the Numbas blog.

2:02:22

Yeah.

2:02:24

So I think we'll run one of these again.

2:02:27

I enjoyed it, I certainly picked up a few bugs that I need to fix.

2:02:32

So we'll put something on the Numbas blog and the users list about that.

2:02:36

In the mean time, you can always email the Numbas email address.

2:02:41

You can use the Numbas users group.

2:02:48

So yeah, I hope to hear from you all at some point in the future.

2:02:51

So thank you very much coming and we'll end it there.