{"id":1728,"date":"2021-07-31T07:34:34","date_gmt":"2021-07-31T11:34:34","guid":{"rendered":"https:\/\/www.yorku.ca\/professor\/drsmith\/?p=1728"},"modified":"2021-08-01T13:45:05","modified_gmt":"2021-08-01T17:45:05","slug":"vpl-basic-custom-evaluation-example","status":"publish","type":"post","link":"https:\/\/www.yorku.ca\/professor\/drsmith\/2021\/07\/31\/vpl-basic-custom-evaluation-example\/","title":{"rendered":"VPL: Basic Custom Evaluation Example"},"content":{"rendered":"\n<p>Sometimes you need to go beyond the default settings in VPL.  That means creating a <em>custom<\/em> \"run\" and \"evaluate\" setup.  Here, I'll simplify a <a href=\"http:\/\/www.science.smith.edu\/dftwiki\/index.php\/Tutorial:_Moodle_VPL_--_Testing_a_C_Program\">great example by Dominique Tiebaut<\/a>, Emeritus prof at Smith College, written for an assignment in C. (<a href=\"https:\/\/web.archive.org\/web\/20200812185644\/http:\/\/www.science.smith.edu\/dftwiki\/index.php\/Tutorial:_Moodle_VPL_--_Testing_a_C_Program\">archive<\/a>) We'll check a \"hello world\" example in C, but won't use the default evaluate.cases tool built into VPL.  Instead, we'll develop three main files:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>the student's submission template (\"requested files\")<\/li><li>the run script (vpl_run.sh)<\/li><li>the evaluate script (vpl_evaluate.sh)<\/li><\/ol>\n\n\n\n<p>Let's begin with helloWorld.c, the student submission template:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/* helloWorld.c\n * This is the student submission template.\n * Normally, the student would modify this template.  But not in this example.\n * Place this file in \"Gear\" -&gt; Requested Files *\/\n\n#include &lt;stdio.h&gt;\n\nint main(void){\n   printf(\"hello world.\\n\");\n}<\/code><\/pre>\n\n\n\n<p>You can test this file out manually, from a terminal on any computer with the gcc compiler tools like this:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignright size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/07\/image-23.png\" alt=\"hello world example from the terminal.\" class=\"wp-image-1734\" width=\"292\" height=\"108\" srcset=\"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/07\/image-23.png 389w, https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/07\/image-23-300x111.png 300w\" sizes=\"auto, (max-width: 292px) 100vw, 292px\" \/><figcaption>typical example of compiling and running a 'C' hello world example outside of VPL.<\/figcaption><\/figure><\/div>\n\n\n\n<p><code>gcc helloWorld.c -o helloWorld<\/code><\/p>\n\n\n\n<p>and then executing it like this:<\/p>\n\n\n\n<p><code>.\/helloWorld<\/code><\/p>\n\n\n\n<p>and it will print<\/p>\n\n\n\n<p><code>hello world.<\/code><\/p>\n\n\n\n<p>to your screen.  Nothing complicated. The original example included multiple tests that required injecting input data into the student submission.  We're simply going to look at the output without providing any variations.  There are a few things to note about the two files, vpl_run.sh and vpl_evaluate, that we'll add to our assignment:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>VPL will execute a bash script called <strong>vpl_execution<\/strong>.  This script is based on both your vpl_run.sh and vpl_evaluate.sh scripts.<\/li><li><strong>Two<\/strong> instances of \"<strong>#!\/bin\/bash<\/strong>\" in each of the vpl_run.sh and vpl_evaluate.sh files.  The first one allows the script to run directly.  The second will feed subsequent commands into the vpl_execution script.  VPL will then run vpl_execution to test the student's submission and submit the grade.<\/li><li><strong>Extra backslashes<\/strong>. The \"<em>run<\/em> a bash script to <em>create<\/em> a bash script\" process that we're following requires that some elements in your script be preceded by a '\\' (backslash).  <ul><li>For example:<ul><li>Normally: <code>gcc ${prog1}.c -o ${prog1}<\/code><\/li><li>Here: <code>gcc \\${prog1}.c -o \\${prog1} <\/code> <\/li><\/ul><\/li><\/ul><\/li><li>The <strong>vpl_run.sh file is nearly identical<\/strong> to vpl_evaluate.sh.  <ul><li>Start by writing vpl_evaluate.sh<\/li><li>Include the Grade and Comment print statements in vpl_evaluate.sh (e.g. <code>echo \"Grade :=&gt;&gt; \\$grade\"<\/code>)<\/li><li>Copy vpl_evaluate.sh into vpl_run.sh<\/li><li>Modify your print statements (e.g. remove the \"<code>:=&gt;&gt;<\/code>\" to become <code>echo \"Possible grade : \\$grade\"<\/code>)<\/li><\/ul><\/li><\/ol>\n\n\n\n<p>The shell scripts will look like this <em><strong>skeleton<\/strong><\/em>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#! \/bin\/bash\n# skeleton vpl_evaluate.sh script\n\n#variables\nmaxGrade=100\nprog1=helloWorld\n\n# everything that follows will be put into vpl_execution\ncat &gt; vpl_execution &lt;&lt;EEOOFF\n#! \/bin\/bash\n \n# --- program tested  ---\ngcc \\${prog1}.c -o \\${prog1} \n\n# --- create solution. Put in a file called solution.txt ---\ncat &gt; solution.txt &lt;&lt;EOF\nhello world.\nEOF\n\n# --- calculate a grade ----\ngrade=\\$( expr \\$maxGrade )\n\n# --- compare the student's solution to the real solution ----\n\n\n# --- Provide grade back to Moodle ---\necho \"Grade :=&gt;&gt; \\$grade\"\necho \"Comment :=&gt;&gt; and a comment...\"\n\nEEOOFF\n# create of vpl_execution is done.\n\n# allow vpl_execution to be executed. \nchmod +x vpl_execution<\/code><\/pre>\n\n\n\n<p>Our goal is to provide students with feedback and a grade, either if the <strong>student submission is incorrect<\/strong>:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"357\" src=\"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/07\/image-24-1024x357.png\" alt=\"\" class=\"wp-image-1738\" srcset=\"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/07\/image-24-1024x357.png 1024w, https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/07\/image-24-300x105.png 300w, https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/07\/image-24.png 1193w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>The output from \"run\" (left) and \"evaluate\" (right) when the student submission is wrong.<\/figcaption><\/figure>\n\n\n\n<p>and to provide different feedback and a better grade when the <strong>student submission is correct<\/strong>:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"345\" src=\"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/07\/image-25-1024x345.png\" alt=\"\" class=\"wp-image-1739\" srcset=\"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/07\/image-25-1024x345.png 1024w, https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/07\/image-25-300x101.png 300w, https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/07\/image-25.png 1308w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>The output from \"run\" (left) and \"evaluate\" (right) when the student submission is correct.<\/figcaption><\/figure>\n\n\n\n<p>So, here is the complete vpl_evaluate.sh.  It will compare the model solution you provide with the student's result.  Note the use of the =&gt;&gt; in the print statements.  These will direct output related to the actual grade and any comments to Moodle. Dominique Thiebaut added some filtering in the student solution to get rid of white space differences, which is a nice touch.  Here is <strong>vpl_evaluate.sh<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n#\n# <strong>vpl_evaluate.sh script <\/strong>\n# The output of the student program is tested against the expected output file.\n# \n# James Andrew Smith; drsmith@yorku.ca July 2021\n# Based on example by D. Thiebaut at Smith College\n# http:\/\/www.science.smith.edu\/dftwiki\/index.php\/Tutorial:_Moodle_VPL_--_Testing_a_C_Program\n# -----------------------------------------------------------------\n\n\ncat > vpl_execution &lt;&lt;EEOOFF\n#!\/bin\/bash\n\n# Variables (don't add whitespace)\nstudentProgram=helloWorld\nmaxGrade=100\nminGrade=0\nconsolationGrade=10\n \n# --- program tested (no extension) ---\ngcc -o \\${studentProgram} \\${studentProgram}.c\n\n\n\n# --- create test input files ---\ncat > solution.txt &lt;&lt;EOF\nhello world.\nEOF\n\n\ngrade= \\$minGrade\n\nfor i in 1 ; do\n   echo \"Comment :=>>-TEST \\$i\"\n\n   # ==============================================\n   # TEST i\n   # ==============================================\n   #--- run program, capture output, display to student ---\n\n   .\/\\${studentProgram}  &amp;> user.out\n   cp user.out user.out.org\n\n   #--- remove non numbers and non minus---\n   #cat user.out | sed 's\/&#91;^0-9\\ -]*\/\/g' > dummy.out\n   #mv dummy.out user.out\n \n   #--- remove multiple spaces --- \n   cat user.out | sed 's\/  *\/ \/g' > dummy.out\n   mv dummy.out user.out\n\n   #--- remove blank lines ---\n   cat user.out | sed '\/^\\s*$\/d' > dummy.out\n   mv dummy.out user.out\n\n   #--- compute difference --- \n   diff -y -w --ignore-all-space user.out solution.txt > diff.out\n   #echo \"----- diff.out ------\"\n   #cat diff.out\n   #echo \"---------------------\"\n   diff -y -w --ignore-all-space user.out solution.txt > diff.out\n\n   \n   #--- reject if different ---\n   if ((\\$? > 0)); then\n      echo \"Comment :=>>- Your output is incorrect.\"\n\n      #--- display test file ---\n      echo \"Comment :=>>- Your program tested with:\"\n      echo \"&lt;|--\" \n      cat solution.txt\n      echo \"--|>\"\n\n      echo \"Comment :=>> ---------------\"\n      echo \"Comment :=>>- Your output:\"\n      echo \"Comment :=>> ---------------\"\n      echo \"&lt;|--\"\n      cat user.out\n      echo \"--|>\"\n      echo \"\"\n      echo \"Comment :=>> ---------------\"\n      echo \"Comment :=>>- Expected output (only the numbers): \"\n      echo \"Comment :=>> ---------------\"\n      echo \"&lt;|--\"\n      cat solution.txt\n      echo \"--|>\"\n   \n      grade=\\$( expr \\$minGrade )\n   \n      #--- consolation grade (\"thanks for coming out\")---   \n      #grade=\\$( expr \\$consolationGrade )\n\n      # --------------------- REWARD IF CORRECT OUTPUT -----------------\n   else\n      #--- good output ---\n      echo \"Comment :=>>- Congrats, your output is correct.\"\n      echo \"Comment :=>> --------------------------------.\"\n      echo \"&lt;|--\"\n      cat user.out.org\n      echo \"--|>\"\n      grade=\\$( expr \\$maxGrade )\n   fi\ndone\n\necho \"Grade :=>> \\$grade\"\n\nEEOOFF\n\n \nchmod +x vpl_execution<\/code><\/pre>\n\n\n\n<p>and here is the run script, <strong>vpl_run.sh<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n#\n# <strong>vpl_run.sh script<\/strong> \n# The output of the student program is tested against the expected output file.\n# \n# James Andrew Smith; drsmith@yorku.ca July 2021\n# Based on example by D. Thiebaut at Smith College\n# http:\/\/www.science.smith.edu\/dftwiki\/index.php\/Tutorial:_Moodle_VPL_--_Testing_a_C_Program\n# -----------------------------------------------------------------\n\n\ncat > vpl_execution &lt;&lt;EEOOFF\n#!\/bin\/bash\n\n# Variables (don't add whitespace)\nstudentProgram=helloWorld\nmaxGrade=100\nminGrade=0\nconsolationGrade=10\n \n# --- program tested (no extension) ---\ngcc -o \\${studentProgram} \\${studentProgram}.c\n\n\n\n# --- create test input files ---\ncat > solution.txt &lt;&lt;EOF\nhello world.\nEOF\n\n\ngrade= \\$minGrade\n\nfor i in 1 ; do\n   echo \"Comment :-TEST \\$i\"\n\n   # ==============================================\n   # TEST i\n   # ==============================================\n   #--- run program, capture output, display to student ---\n\n   .\/\\${studentProgram}  &amp;> user.out\n   cp user.out user.out.org\n\n   #--- remove non numbers and non minus---\n   #cat user.out | sed 's\/&#91;^0-9\\ -]*\/\/g' > dummy.out\n   #mv dummy.out user.out\n \n   #--- remove multiple spaces --- \n   cat user.out | sed 's\/  *\/ \/g' > dummy.out\n   mv dummy.out user.out\n\n   #--- remove blank lines ---\n   cat user.out | sed '\/^\\s*$\/d' > dummy.out\n   mv dummy.out user.out\n\n   #--- compute difference --- \n   diff -y -w --ignore-all-space user.out solution.txt > diff.out\n   #echo \"----- diff.out ------\"\n   #cat diff.out\n   #echo \"---------------------\"\n   diff -y -w --ignore-all-space user.out solution.txt > diff.out\n\n   \n   #--- reject if different ---\n   if ((\\$? > 0)); then\n      echo \"Comment :- Your output is incorrect.\"\n\n      #--- display test file ---\n      echo \"Comment :- Your program tested with:\"\n      echo \"&lt;|--\" \n      cat solution.txt\n      echo \"--|>\"\n\n      echo \"Comment : ---------------\"\n      echo \"Comment :- Your output:\"\n      echo \"Comment : ---------------\"\n      echo \"&lt;|--\"\n      cat user.out\n      echo \"--|>\"\n      echo \"\"\n      echo \"Comment : ---------------\"\n      echo \"Comment :- Expected output (only the numbers): \"\n      echo \"Comment : ---------------\"\n      echo \"&lt;|--\"\n      cat solution.txt\n      echo \"--|>\"\n   \n      grade=\\$( expr \\$minGrade )\n   \n      #--- consolation grade (\"thanks for coming out\")---   \n      #grade=\\$( expr \\$consolationGrade )\n\n      # --------------------- REWARD IF CORRECT OUTPUT -----------------\n   else\n      #--- good output ---\n      echo \"Comment :- Congrats, your output is correct.\"\n      echo \"Comment : --------------------------------.\"\n      echo \"&lt;|--\"\n      cat user.out.org\n      echo \"--|>\"\n      grade=\\$( expr \\$maxGrade )\n   fi\ndone\n\necho \"Possible Grade : \\$grade (you need to evaluate for official grade)\"\n\nEEOOFF\n\n \nchmod +x vpl_execution<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>This is a summary of how to set up a custom evaluation scheme in VPL.  While it was designed for a simple C assignment it could be modified for other programming languages.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Don't forget!<\/h2>\n\n\n\n<p>When setting up the activity, don't forget to include the <strong>local VPL server location<\/strong><\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/07\/image-26.png\" alt=\"\" class=\"wp-image-1742\" width=\"385\" height=\"197\" srcset=\"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/07\/image-26.png 770w, https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/07\/image-26-300x154.png 300w\" sizes=\"auto, (max-width: 385px) 100vw, 385px\" \/><figcaption>don't forget to add in the location of your local VPL (\"jail\") server.<\/figcaption><\/figure><\/div>\n\n\n\n<p>and don't forget to turn on \"run\", \"evaluate\" and \"autograde\" <strong>execution options<\/strong>:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/07\/image-27.png\" alt=\"\" class=\"wp-image-1743\" width=\"504\" height=\"292\" srcset=\"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/07\/image-27.png 1008w, https:\/\/www.yorku.ca\/professor\/drsmith\/wp-content\/uploads\/sites\/444\/2021\/07\/image-27-300x174.png 300w\" sizes=\"auto, (max-width: 504px) 100vw, 504px\" \/><figcaption>Don't forget to set your execution options whens setting up your VPL assignment.<\/figcaption><\/figure>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p>James Andrew Smith is an associate professor in\u00a0<a href=\"http:\/\/eecs.lassonde.yorku.ca\/\">Electrical Engineering and Computer Science Department<\/a>\u00a0in York University's\u00a0<a href=\"https:\/\/lassonde.yorku.ca\/\">Lassonde School<\/a>. \u00a0He lived in Strasbourg, France and taught at the\u00a0<a href=\"https:\/\/www.insa-strasbourg.fr\/en\/\">INSA Strasbourg<\/a>\u00a0and\u00a0<a href=\"https:\/\/www.hs-karlsruhe.de\/\">Hochschule Karlsruhe<\/a>\u00a0while on\u00a0<a href=\"https:\/\/drsmith.blog.yorku.ca\/2019\/10\/sabbatical-report-summary\/\">sabbatical<\/a>\u00a0in 2018-19 with his wife and kids. Some of his other blog posts discuss the family's sabbatical year, from both\u00a0<a href=\"https:\/\/twitter.com\/search?q=(%23sabbaticallife)%20(from%3Aonnimikki)&amp;src=typed_query\">personal<\/a>\u00a0and\u00a0<a href=\"https:\/\/twitter.com\/search?q=insa%20(from%3Ajasmith_yorku)&amp;src=typed_query\">professional<\/a>\u00a0<a href=\"https:\/\/twitter.com\/search?q=karlsruhe%20(from%3Ajasmith_yorku)&amp;src=typed_query\">perspectives<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sometimes you need to go beyond the default settings in VPL. That means creating a custom \"run\" and \"evaluate\" setup. Here, I'll simplify a great example by Dominique Tiebaut, Emeritus prof at Smith College, written for an assignment in C. (archive) We'll check a \"hello world\" example in C, but won't use the default evaluate.cases [&hellip;]<\/p>\n","protected":false},"author":762,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kad_blocks_custom_css":"","_kad_blocks_head_custom_js":"","_kad_blocks_body_custom_js":"","_kad_blocks_footer_custom_js":"","footnotes":""},"categories":[1],"tags":[283,12,278,139,195,261,263,281,282,280],"class_list":["post-1728","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-bash-script","tag-c-programming","tag-eclass","tag-gcc","tag-moodle","tag-virtual-programming-lab","tag-vpl","tag-vpl_evaluate-sh","tag-vpl_execute","tag-vpl_run-sh"],"taxonomy_info":{"category":[{"value":1,"label":"Uncategorized"}],"post_tag":[{"value":283,"label":"bash script"},{"value":12,"label":"c programming"},{"value":278,"label":"eclass"},{"value":139,"label":"gcc"},{"value":195,"label":"Moodle"},{"value":261,"label":"virtual programming lab"},{"value":263,"label":"VPL"},{"value":281,"label":"vpl_evaluate.sh"},{"value":282,"label":"vpl_execute"},{"value":280,"label":"vpl_run.sh"}]},"featured_image_src_large":false,"author_info":{"display_name":"drsmith","author_link":"https:\/\/www.yorku.ca\/professor\/drsmith\/author\/drsmith\/"},"comment_info":"","category_info":[{"term_id":1,"name":"Uncategorized","slug":"uncategorized","term_group":0,"term_taxonomy_id":1,"taxonomy":"category","description":"","parent":0,"count":41,"filter":"raw","cat_ID":1,"category_count":41,"category_description":"","cat_name":"Uncategorized","category_nicename":"uncategorized","category_parent":0}],"tag_info":[{"term_id":283,"name":"bash script","slug":"bash-script","term_group":0,"term_taxonomy_id":283,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":12,"name":"c programming","slug":"c-programming","term_group":0,"term_taxonomy_id":12,"taxonomy":"post_tag","description":"","parent":0,"count":6,"filter":"raw"},{"term_id":278,"name":"eclass","slug":"eclass","term_group":0,"term_taxonomy_id":278,"taxonomy":"post_tag","description":"","parent":0,"count":7,"filter":"raw"},{"term_id":139,"name":"gcc","slug":"gcc","term_group":0,"term_taxonomy_id":139,"taxonomy":"post_tag","description":"","parent":0,"count":3,"filter":"raw"},{"term_id":195,"name":"Moodle","slug":"moodle","term_group":0,"term_taxonomy_id":195,"taxonomy":"post_tag","description":"","parent":0,"count":6,"filter":"raw"},{"term_id":261,"name":"virtual programming lab","slug":"virtual-programming-lab","term_group":0,"term_taxonomy_id":261,"taxonomy":"post_tag","description":"","parent":0,"count":14,"filter":"raw"},{"term_id":263,"name":"VPL","slug":"vpl","term_group":0,"term_taxonomy_id":263,"taxonomy":"post_tag","description":"","parent":0,"count":13,"filter":"raw"},{"term_id":281,"name":"vpl_evaluate.sh","slug":"vpl_evaluate-sh","term_group":0,"term_taxonomy_id":281,"taxonomy":"post_tag","description":"","parent":0,"count":2,"filter":"raw"},{"term_id":282,"name":"vpl_execute","slug":"vpl_execute","term_group":0,"term_taxonomy_id":282,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":280,"name":"vpl_run.sh","slug":"vpl_run-sh","term_group":0,"term_taxonomy_id":280,"taxonomy":"post_tag","description":"","parent":0,"count":3,"filter":"raw"}],"_links":{"self":[{"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/posts\/1728","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/users\/762"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/comments?post=1728"}],"version-history":[{"count":13,"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/posts\/1728\/revisions"}],"predecessor-version":[{"id":1761,"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/posts\/1728\/revisions\/1761"}],"wp:attachment":[{"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/media?parent=1728"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/categories?post=1728"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yorku.ca\/professor\/drsmith\/wp-json\/wp\/v2\/tags?post=1728"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}