-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlancomarker.html
341 lines (311 loc) · 29.9 KB
/
lancomarker.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content=""Daniel J. Finnegan"" />
<meta name="copyright" content=""Daniel J. Finnegan"" />
<meta property="og:type" content="article" />
<meta name="twitter:card" content="summary">
<meta name="keywords" content="javascript, teaching, innovation, development, Technology, " />
<meta property="og:title" content="Lancomarker: Computer Assisted Marking Administration "/>
<meta property="og:url" content="https://ps2fino.github.io/lancomarker.html" />
<meta property="og:description" content="Marking. I dread it. Not regarding the content: I believe students--when giving the right conditions to express themselves and learn--can produce fantastic scholarship. I'm always interested in ways to improve my coursework to ensure it is making use of the current best practice in teaching and learning. However: the burden …" />
<meta property="og:site_name" content=""There's always money in the banana stand!"" />
<meta property="og:article:author" content=""Daniel J. Finnegan"" />
<meta property="og:article:published_time" content="2022-10-24T00:00:00+02:00" />
<meta property="" content="2024-07-24T00:00:00+02:00" />
<meta name="twitter:title" content="Lancomarker: Computer Assisted Marking Administration ">
<meta name="twitter:description" content="Marking. I dread it. Not regarding the content: I believe students--when giving the right conditions to express themselves and learn--can produce fantastic scholarship. I'm always interested in ways to improve my coursework to ensure it is making use of the current best practice in teaching and learning. However: the burden …">
<title>Lancomarker: Computer Assisted Marking Administration · "There's always money in the banana stand!"
</title>
<link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet">
<link href="https://netdna.bootstrapcdn.com/font-awesome/4.0.1/css/font-awesome.css" rel="stylesheet">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js"></script> <!-- Added for the footer in the side bar quote -->
<link rel="stylesheet" type="text/css" href="https://ps2fino.github.io/theme/css/pygments.css" media="screen">
<link rel="stylesheet" type="text/css" href="https://ps2fino.github.io/theme/tipuesearch/tipuesearch.css" media="screen">
<link rel="stylesheet" type="text/css" href="https://ps2fino.github.io/theme/css/elegant.css" media="screen">
<link rel="stylesheet" type="text/css" href="https://ps2fino.github.io/theme/css/custom.css" media="screen">
<link href="https://ps2fino.github.io/feeds/all.atom.xml" type="application/atom+xml" rel="alternate" title=""There's always money in the banana stand!" - Full Atom Feed" />
</head>
<body>
<div id="content-sans-footer">
<div class="navbar navbar-static-top">
<div class="navbar-inner">
<div class="container-fluid">
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</a>
<a class="brand" href="https://ps2fino.github.io/"><span class=site-name>"There's always money in the banana stand!"</span></a>
<div class="nav-collapse collapse">
<ul class="nav pull-right top-menu">
<li ><a href="https://ps2fino.github.io">Home</a></li>
<!-- <li ><a href="https://ps2fino.github.io/pages/publications.html">Publications</a></li> -->
<li ><a href="https://ps2fino.github.io/pages/resume.html">Curriculum Vitae</a></li>
<li ><a href="https://ps2fino.github.io/pages/doctoral-supervision.html">Postgraduate Opportunities</a></li>
<li ><a href="https://ps2fino.github.io/pages/grants.html">Funding</a></li>
<li ><a href="https://ps2fino.github.io/pages/publications.html">Publications</a></li>
<li ><a href="https://ps2fino.github.io/pages/resources.html">Resources</a></li>
<!-- <li ><a href="https://ps2fino.github.io/categories.html">Categories</a></li> -->
<li ><a href="https://ps2fino.github.io/tags.html">Tags</a></li>
<!-- <li ><a href="https://ps2fino.github.io/archives.html">Archives</a></li> -->
<li><form class="navbar-search" action="https://ps2fino.github.io/search.html" onsubmit="return validateForm(this.elements['q'].value);"> <input aria-label="make a search query for this site" type="text" class="search-query" placeholder="Search" name="q" id="tipue_search_input"></form></li>
</ul>
</div>
</div>
</div>
</div>
<div class="container-fluid">
<div class="row-fluid">
<div class="span1"></div>
<div class="span10">
<article>
<div class="row-fluid">
<header class="page-header span10 offset2">
<h1><a href="https://ps2fino.github.io/lancomarker.html"> Lancomarker: Computer Assisted Marking Administration </a></h1>
</header>
</div>
<div class="row-fluid">
<div class="span8 offset2 article-content">
<p>Marking.
I dread it.
Not regarding the content: I believe students--when giving the right conditions to express themselves and learn--can produce fantastic scholarship.
I'm always interested in ways to improve my coursework to ensure it is making use of the current best practice in teaching and learning.
However: the burden around the <em>procedure</em> of marking is something that is most unwelcome.
Every year I waste time having to manage hundreds of files, not counting appendices and miscellaneous image files students may include with their coursework submission.
So I built this.
You can jump straight to the video demo below by clicking <a href="#video-demo">here</a>.</p>
<h2>What is Lancomarker?</h2>
<p>Lancomarker is a suite of web applications for automating much of the student coursework marking process.
It consists of 3 main tools: Lancomarker, Lancomarker Processing, and <a href="https://ps2fino.github.io/pages/resources.html">Lancomarker Student Interface Application (SIA)</a>.
Together, these tools form a pipeline for information flow; students write their coursework, submit via the familar channels, and then the instructor can mark submissions and generate feedback with less administrative effort.</p>
<h2>Why did I build Lancomarker?</h2>
<p>In 2021, I spent 6 weeks marking student coursework.
This was intense, and meant I had no capacity for engaging in any other academic commitment during this time.
Reflecting on the workload, I realized there were severe bottlenecks throughout the marking process.
Namely, </p>
<p>1) Student submissions: My coursework consists of essay/prose, which although may appear unusual for a computing course, is essential to assessing students' engagement with the course material as it encourages critical thinking and communication. Both of these skills are necessary for software engineers to work in teams of people with broad skillsets.
To facilitate this, students submit their coursework in PDF formats, however PDF is a terrible format for several reasons.
First, it is immutable (for the most part): one may annotate a PDF file, but these annotations are not easily updated/modified. Secondly, it is not machine readable: it is non-trivial to parse PDF annotations and/or convert them to alternative formats.
This is useful for transcribing comments for visually impaired students and/or collating comments into a report for feeding back to the school.
To combat this, some may suggest a WYSIWYG editor for example Microsoft Word.
However, these all come with their own file format problems, for example incompatability across operating systems and/or how images and text are rendered.
In the past, I have tried giving students Word templates to use but this has never been a satisfactory solution to the problem.</p>
<p>All of these factors contributed to unnecessary administrative burden when marking as I would open and close several different applications simply to read a student's submission.
This is related to the next point.</p>
<p>2) Indexing student coursework: Even with relaxed criteria regarding naming and file type, finding student submissions can be a nightmare.
I have devised the following (very rough) model for marking a coursework submission:</p>
<div class="math">$$
T_M = T_f + T_o + T_v + T_m
$$</div>
<p>where <span class="math">\(T_f\)</span> is the time it takes to <em>find</em> a student's submission in the VLE/my local file system, <span class="math">\(T_o\)</span> is the time to <em>open</em> the file on my computer (which itself is a product of processor speed, number of concurrent processes, memory etc), <span class="math">\(T_v\)</span> is the time to <em>verify</em> a submission, which can involve starting the whole process again to find and open a different file, and/or confirming the submission is valid (e.g., follows the rules/assessment criteria).
<span class="math">\(T_m\)</span> is the time taken to <em>mark</em> a piece of coursework.
Let's assume this is kept constant as per WAM (spoiler: it's often not).</p>
<p>Below is a simulation I wrote of this model (source in appendix).
I've removed the constant <span class="math">\(T_m\)</span> term for visualization.
Bear in mind this is a <em>very optimistic</em> model, so times could be a lot worse!</p>
<p><img src="images/simulated_marking_sessions.jpg" max-width=100% height=auto></p>
<p>At best, this is 1.8 hours of my life I'm not getting back <em>every time I have a marking task to complete</em> because file management is time intensive.
Lancomarker aims to eliminate this time wasting completely.</p>
<p>3) Preparing student marks for submission to school boards: In parallel to marking, I had to manually update a spreadsheet with each students' marks. This is not just another time sink, but is also an opportunity for human error as I transcribe the mark manually by hand from the PDF comments/rubric.
Having done this several times and realized it was silly, I'd had enough.</p>
<p>So I built Lancomarker.</p>
<h2>How does it work?</h2>
<p>The pipeline is as follows:</p>
<p>1) Students complete their coursework via the SIA <em>or</em> simply writing the text file.
This is the first time gain: I teach computer science students, which means having a basic text editor is a prerequisite.
They can use any text editor they want (even create their own), and complete their coursework.
Factor over form: what matters is the content, not the presentation here.
The SIA gives several other benefits; I can dictate filenames (something that comes useful later on) as students more often than not will incorrectly name a file through accident or malice.
I can also enforce coursework constraints such as appendices (e.g., PNG/JPG only for images) and character limits for written work.</p>
<p>2) Students submit their work using standard channels.
This makes the system very flexible, as there is no need for them to learn a new platform if they don't want to, and there is no effort on IT and/or admin to accommodate Lancomarker format submissions.
From outside Lancomarker, the existing submission procedure is as it was.</p>
<p>3) Submissions are batch downloaded, zipped up, then pre-processed using Lancomarker Processing.
This step creates an intermediary representation of submissions.
At this point, the instructor may generate unmarked PDFs of all submissions to mark the old way should they choose to.
This might sound odd, but it is critical to team work: my modules are (fortunately) supported by some TAs who may assist with marking, and who may not wish to use Lancomarker, instead preferring to read PDFs.
The point is this: as all submissions have been processed, they are now <em>readily indexable</em> meaning they can be found based on a known ID (e.g., student number) rather than whatever file name was provided by the student.
Should the instructor wish to continue with Lancomarker, they can then process submissions further into the Lancomarker format.</p>
<p>4) Submissions are then uploaded to Lancomarker.
Using Lancomarker, I can now pull submissions directly from a database, giving me direct access to a submission with a single click.
Lancomarker presents the submission as rendered HTML, and provides a UI for associating a mark value to each section of the written report.
This also facilitates error checking: as Lancomarker knows the maximum marks for a section, the instructor can't accidentally assign a mark greater than the limit as may happen when simply marking a PDF.
The UI also facilitates freetext comments for sections.</p>
<p>5) Marked submissions are downloaded from Lancomarker, then processed further using Lancomarker Processing.
Here marked PDFs are generated, along with any CSV spreadsheets required.
As everything is machine readable, it is trivial to import marked submissions into whatever statistics software tickles your fancy for generating summary reports etc.</p>
<p>All in all, software should <em>help</em>, not <em>hinder</em> work.
Marking coursework is a widely mandated activity for academics, so I was surprised that few were looking to improve the processes around marking, at least within my immediate network.
Lancomarker is deployed in the 2022/23 academic year.
Let's see if my theoretical time gain holds up in practice.</p>
<h2><a id="video-demo"></a> Video Demo</h2>
<p align="center">
<iframe width="560" height="315" src="https://www.youtube.com/embed/K-xx8vfYA0A" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</p>
<h3>Appendix</h3>
<p>R code for those who care:</p>
<div class="highlight"><pre><span></span><code><span class="c1">## consider a normal distribution for opening a file</span>
<span class="c1">## consider a poisson distribution for finding a file</span>
<span class="c1">## consider a bernoulli distribution for verifying a file</span>
<span class="n">N</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="mi">232</span><span class="w"> </span><span class="c1">## Number of students enrolled on CM1301 in the 2022/23 Academic Year</span>
<span class="n">simulate_marking</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="n">function</span><span class="w"> </span><span class="p">(</span><span class="n">num_submissions</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">num_faulty_submissions</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="n">num_submissions</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">rbinom</span><span class="w"> </span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span>
<span class="w"> </span><span class="n">size</span><span class="o">=</span><span class="n">num_submissions</span><span class="p">,</span><span class="w"> </span>
<span class="w"> </span><span class="n">prob</span><span class="o">=</span><span class="mf">0.8</span><span class="p">)</span>
<span class="w"> </span><span class="n">dd</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="n">tibble</span><span class="w"> </span><span class="p">(</span><span class="n">find</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">rpois</span><span class="w"> </span><span class="p">(</span><span class="n">num_submissions</span><span class="p">,</span><span class="w"> </span><span class="n">lambda</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">10</span><span class="p">),</span>
<span class="w"> </span><span class="n">open</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">round</span><span class="w"> </span><span class="p">(</span><span class="n">rnormTrunc</span><span class="w"> </span><span class="p">(</span><span class="n">num_submissions</span><span class="p">,</span><span class="w"> </span>
<span class="w"> </span><span class="n">mean</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span>
<span class="w"> </span><span class="n">sd</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span>
<span class="w"> </span><span class="nb">min</span><span class="o">=</span><span class="mi">0</span><span class="p">),</span><span class="w"> </span>
<span class="w"> </span><span class="n">digits</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="p">))</span>
<span class="w"> </span><span class="n">time_to_find_open</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="n">dd</span><span class="w"> </span><span class="o">%>%</span>
<span class="w"> </span><span class="n">mutate</span><span class="w"> </span><span class="p">(</span><span class="n">time_taken</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">find</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">open</span><span class="p">)</span>
<span class="w"> </span><span class="n">time_to_verify_faulty</span><span class="w"> </span><span class="o">=</span>
<span class="w"> </span><span class="n">tibble</span><span class="w"> </span><span class="p">(</span><span class="n">find</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">rpois</span><span class="w"> </span><span class="p">(</span><span class="n">num_faulty_submissions</span><span class="p">,</span><span class="w"> </span><span class="n">lambda</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">10</span><span class="p">),</span>
<span class="w"> </span><span class="n">open</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">round</span><span class="p">(</span><span class="n">rnormTrunc</span><span class="p">(</span><span class="n">num_faulty_submissions</span><span class="p">,</span><span class="w"> </span>
<span class="w"> </span><span class="n">mean</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span>
<span class="w"> </span><span class="n">sd</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="nb">min</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">),</span><span class="w"> </span>
<span class="w"> </span><span class="n">digits</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="p">))</span><span class="w"> </span><span class="o">%>%</span>
<span class="w"> </span><span class="n">mutate</span><span class="w"> </span><span class="p">(</span><span class="n">time_taken</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">find</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">open</span><span class="p">)</span>
<span class="w"> </span><span class="n">time_to_verify_non_faulty</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="p">(</span><span class="n">num_submissions</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">num_faulty_submissions</span><span class="p">)</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">20</span>
<span class="w"> </span><span class="n">time_to_mark</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="c1">## constant so ignore for now</span>
<span class="w"> </span><span class="n">total_time</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="n">sum</span><span class="w"> </span><span class="p">(</span><span class="n">time_to_find_open</span><span class="o">$</span><span class="n">time_taken</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">sum</span><span class="w"> </span><span class="p">(</span><span class="n">time_to_verify_faulty</span><span class="o">$</span><span class="n">time_taken</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span>
<span class="w"> </span><span class="n">time_to_verify_non_faulty</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">time_to_mark</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="p">(</span><span class="n">total_time</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="p">(</span><span class="mi">60</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">60</span><span class="p">))</span><span class="w"> </span><span class="c1">## Gimme hours</span>
<span class="p">}</span>
<span class="c1">## Run the simulation</span>
<span class="n">simulation_data</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="n">sapply</span><span class="w"> </span><span class="p">(</span><span class="n">rep</span><span class="o">.</span><span class="n">int</span><span class="w"> </span><span class="p">(</span><span class="n">N</span><span class="p">,</span><span class="w"> </span><span class="n">times</span><span class="o">=</span><span class="mi">500</span><span class="p">),</span><span class="w"> </span><span class="n">simulate_marking</span><span class="p">)</span>
</code></pre></div>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script>
<hr/>
</div>
<section>
<div class="span2" style="float:right;font-size:0.9em;">
<h4>Published</h4>
<time pubdate="pubdate" datetime="2022-10-24T00:00:00+02:00">Oct 24, 2022</time>
<h4>Last Updated</h4>
<time datetime="2024-07-24T00:00:00+02:00">Jul 24, 2024</time>
<h4>Category</h4>
<a class="category-link" href="https://ps2fino.github.io/categories.html#technology-ref">Technology</a>
<h4>Tags</h4>
<ul class="list-of-tags tags-in-article">
<li><a href="https://ps2fino.github.io/tags.html#development-ref">development
<span>5</span>
</a></li>
<li><a href="https://ps2fino.github.io/tags.html#innovation-ref">innovation
<span>1</span>
</a></li>
<li><a href="https://ps2fino.github.io/tags.html#javascript-ref">javascript
<span>1</span>
</a></li>
<li><a href="https://ps2fino.github.io/tags.html#teaching-ref">teaching
<span>4</span>
</a></li>
</ul>
<div style="border-bottom: 1px solid #8f8686; margin-top: 10px;">
<h4>Look me up on orcid</h4>
<div itemscope itemtype="https://schema.org/Person"><a itemprop="sameAs" content="https://orcid.org/0000-0003-1169-2842" href="https://orcid.org/0000-0003-1169-2842" target="orcid.widget" rel="noopener noreferrer" style="vertical-align:top;"><img src="https://orcid.org/sites/default/files/images/orcid_16x16.png" style="width:1em;margin-right:.5em;" alt="ORCID iD icon">https://orcid.org/0000-0003-1169-2842</a></div>
</div>
<div style="border-bottom: 1px solid #8f8686; margin-top: 10px;">
<h4>Let's be social</h4>
<a href="https://www.linkedin.com/in/dr-daniel-j-finnegan-50727620/" title="My LinkedIn Profile" class="sidebar-social-links" target="_blank">
<i class="fa fa-linkedin sidebar-social-links"></i></a>
<a href="https://github.com/Ps2Fino" title="My Github Profile" class="sidebar-social-links" target="_blank">
<i class="fa fa-github sidebar-social-links"></i></a>
<!-- Manually add the cardiff icon and link -->
<a href="https://www.cardiff.ac.uk/people/view/1496260-finnegan-daniel" title="My Cardiff Homepage" class="sidebar-social-links" target="_blank">
<i class="fa fa-inst-link sidebar-social-links"><img src="https://ps2fino.github.io/images/cardiff-logo-icon.jpg" alt="Cardiff University Logo" title="Cardiff University Logo" /></i></a>
<!-- Manually add the soundcloud icon and link -->
<a href="https://soundcloud.com/ps2fino" title="My soundcloud homepage" class="sidebar-social-links" target="_blank">
<i class="fa fa-inst-link sidebar-social-links"><img src="https://ps2fino.github.io/images/soundcloud-logo.png" alt="Soundcloud logo" title="Soundcloud logo" /></i></a>
</div>
</div>
</section>
</div>
</article>
</div>
<div class="span1"></div>
</div>
</div>
<div id="push"></div>
</div>
<footer>
<div id="footer">
<ul class="footer-content">
<li class="elegant-license">Content by Daniel J. Finnegan. All articles licensed under the <a href=https://opensource.org/licenses/BSD-3-Clause>BSD-3-Clause</a></li>
<li class="elegant-power">Powered by <a href="https://getpelican.com/" title="Pelican Home Page">Pelican</a>. Theme: <a href="http://oncrashreboot.com/pelican-elegant" title="Theme Elegant Home Page">Elegant</a> by <a href="https://oncrashreboot.com" title="Talha Mansoor Home Page">Talha Mansoor</a></li>
</ul>
</div>
</footer> <script src="https://code.jquery.com/jquery.min.js"></script>
<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
<script>
function validateForm(query)
{
return (query.length > 0);
}
</script>
</body>
<!-- Theme: Elegant built for Pelican
License : https://oncrashreboot.com/pelican-elegant -->
</html>