{
    "componentChunkName": "component---src-templates-course-part-overview-template-js",
    "path": "/part-0/",
    "result": {"data":{"page":{"htmlAst":{"type":"root","children":[{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"table-of-contents","properties":{},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"is-learning-programming-useful-to-you","style":"position:relative;"},"children":[{"type":"text","value":"Is learning programming useful to you?"},{"type":"element","tagName":"a","properties":{"href":"#is-learning-programming-useful-to-you","ariaLabel":"is learning programming useful to you permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Before deciding whether to learn programming, first try creating a small program without writing its code yourself. This Part 0 task lets you experience what a coding agent can already build and modify from ordinary-language instructions."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"You may find that directing an agent and using the resulting application is enough for what you want to accomplish. In that case, a programming course may not be the best use of your time. The added value of this course is narrower: it teaches you to inspect the program itself when you want evidence beyond the agent's account, and to understand how small building blocks compose into the larger data flows an agent creates."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"On the other hand, setting up the agent environment and using it to build a small application is not trivial itself either. Thus, if you run into too many problems in this section, you can also just decide to trust your guts and continue to the manual exercises in Part 1, which are much more layered and structured to introduce their concepts gradually."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"set-up-the-coding-agent","style":"position:relative;"},"children":[{"type":"text","value":"Set up the coding agent"},{"type":"element","tagName":"a","properties":{"href":"#set-up-the-coding-agent","ariaLabel":"set up the coding agent permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"For this Part 0, you need Visual Studio Code, a working Python installation and access to GitHub Copilot."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"install-visual-studio-code","style":"position:relative;"},"children":[{"type":"text","value":"Install Visual Studio Code"},{"type":"element","tagName":"a","properties":{"href":"#install-visual-studio-code","ariaLabel":"install visual studio code permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"There are dozens of different editors that are suited to programming. On this course we will use the "},{"type":"element","tagName":"a","properties":{"href":"https://code.visualstudio.com/","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Visual Studio Code"}]},{"type":"text","value":" editor, which has been gaining traction in recent years. To install it, follow the instructions on the "},{"type":"element","tagName":"a","properties":{"href":"https://code.visualstudio.com/download","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Visual Studio Code download page"}]},{"type":"text","value":", or this "},{"type":"element","tagName":"a","properties":{"href":"https://www.mooc.fi/en/installation/vscode","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"installation guide"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"install-python","style":"position:relative;"},"children":[{"type":"text","value":"Install Python"},{"type":"element","tagName":"a","properties":{"href":"#install-python","ariaLabel":"install python permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Use the Python installation instructions in the same "},{"type":"element","tagName":"a","properties":{"href":"https://www.mooc.fi/en/installation/vscode","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"MOOC installation guide"}]},{"type":"text","value":". Complete the guide's check that Python runs on your computer. You do not need to install or configure the TMC extension yet; that can wait until Part 4 of this course."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"activate-github-copilot","style":"position:relative;"},"children":[{"type":"text","value":"Activate GitHub Copilot"},{"type":"element","tagName":"a","properties":{"href":"#activate-github-copilot","ariaLabel":"activate github copilot permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sign in to GitHub and make sure your account has access to GitHub Copilot. University students can apply through the "},{"type":"element","tagName":"a","properties":{"href":"https://education.github.com/pack","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"GitHub Student Developer Pack"}]},{"type":"text","value":"; approval may take a few days."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n      "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/programming-digital-humanities/static/4be96a5cd87b138c3cb58292953a3aba/081d5/verify.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 98.26086956521739%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAACC0lEQVQ4y6WUu47TQBiF86yU1BR0dDwBDR0VEogC8RAIiZJNSOLETuysPfeL5+LxzCSDJt4sFFmxqz1y8Rfz+WjO+e0ZIgIRzqSF1FBKMaGUckJYHhjHhCJMKWPOjePox9EPbuRSQcwRETNEBCaMiHEPzHZTrNbFZrNdF8VytS7Laj5f/F6uyrI8Ho/prNPppLQBiGUYU4mIcG70YYzHO01DCCHGGGL0PgzOGWtDjCklpe0dfLNY/5qvZa/2db0tq6ra1XVTllXTNO1ZddPU9aHrwOFw65xL2fkC33a4PgA3etn3AEKIEMm3ZVyIdE0hBKVtCyjAfNa0rDoQpU0HEWUcYgIQJpS1HRRSGjsMztkhyw6DtTbGqLRtOtJCNit2eL4BxtgOIIhwBxDCRGtjrNXG9EprbWSvlFLOOWNsCEFIXZRNtW9nLaQtIMZYxjllgjLOheRcKq25kEL2vVK90nYYpqhTSlKZ3QE2Hc5VAcyGwWljJitjbLbSeRZSeh8mbFJKSZtLYBlGzHufUooxHuN9X1mn0zFe5L2f2r4OhxCmd19V7v/c8//h03PgvGHno0+DJ/77j5/v3n/49OVb28EpsEfBUyofP3998fLV6zdvl+vNE+DJGWFys1iuiq0x9sl3fl7a/2zFo+D7L/4h58uSDH9hiDkXeSGF6BkTjMuHHimVUpowOf2G/gD6HHKuxDQRvgAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n  "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n          "},{"type":"element","tagName":"source","properties":{"srcSet":["/programming-digital-humanities/static/4be96a5cd87b138c3cb58292953a3aba/a0b58/verify.webp 230w","/programming-digital-humanities/static/4be96a5cd87b138c3cb58292953a3aba/bc10c/verify.webp 460w","/programming-digital-humanities/static/4be96a5cd87b138c3cb58292953a3aba/966d8/verify.webp 920w","/programming-digital-humanities/static/4be96a5cd87b138c3cb58292953a3aba/910f4/verify.webp 1264w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n          "},{"type":"element","tagName":"source","properties":{"srcSet":["/programming-digital-humanities/static/4be96a5cd87b138c3cb58292953a3aba/81c8e/verify.png 230w","/programming-digital-humanities/static/4be96a5cd87b138c3cb58292953a3aba/08a84/verify.png 460w","/programming-digital-humanities/static/4be96a5cd87b138c3cb58292953a3aba/c0255/verify.png 920w","/programming-digital-humanities/static/4be96a5cd87b138c3cb58292953a3aba/081d5/verify.png 1264w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n          "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/programming-digital-humanities/static/4be96a5cd87b138c3cb58292953a3aba/c0255/verify.png","alt":"GitHub Student Developer Pack verification","title":"GitHub Student Developer Pack verification","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n        "}]},{"type":"text","value":"\n  "}]},{"type":"text","value":"\n    "}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"After approval, activate Copilot for the same account from the "},{"type":"element","tagName":"a","properties":{"href":"https://github.com/github-copilot/free_signup","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"GitHub Copilot signup page"}]},{"type":"text","value":":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 824px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n      "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/programming-digital-humanities/static/ebdfcb4045797c7b9ca070ce3fe06adf/c1c45/free_signup.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 125.21739130434781%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAIAAAC+dZmEAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFEElEQVQ4y3WSa0xTZxjHz8fNxGzxBgilQCnQAkUoymAOb9NNPyxmX5e4mCW7x7k5szncUCYoVysTvMAEA8ocSBUQuVsWYYkunRi59rRQJ1BOey7vufX03N7lUDW6ZP/88ub/5M3z/JMnDxLx+rGoVcXRa0p1aytiI6r0kafjI88krD+j19s+/uTmgQK7wVIeF1keH1WqjyjRrSuKWVsYveaHyNWH1636CtGtLddH2OKjfjGsrzHGnEvWXTDpL+ojaw8d7O/t6e7uvVF8vkcXU22KrTXqbIkxFYb1p+KjTsRGFUZHHkESos4aY86l6OrM+obUuMvpCU0bjFdMcVeOHO7uvNXa1FRfeaHLlNyQkdiQllCXmlBrijuTpK9M1J+K0xUhKbF1Zn2jxdCcYWzJTLpmTWnNSm7NSGzLf8Nef9HZ0vZg93s3LQlXrcnNWclNmcmNFmNdmrHGlGgzGsqR5agWa0rrJnN7TuqN3LSOPfl97+8a3LtjaPfm/nff6tuT37t3Z9+e/K68Da2b0lqyU5szzZcspvOppmok2/R7rsW+2dK5JbN7e3bfVmv/5x/eP/yF87sDY4c+dX65/37BN39/f9D52b7RnbldWzba87Pb3rT+lmO9nJl1EbEa29Nj7VkJXRuNPTkpA3mpd3JNd7ZmDr+9cXjXpj925gy/k+vYbh3MM/fmpXXnpHZkm65vSLlmTmpMt/yKfLDXUfHzROmxqcpi9PRJj+3kbHXpXE2Zt7bicU35XG2F92yZx1bispVMV52YLD/xqLRorPi481TJ/f0f3Ubqa1wQKqLIiRIQBEJRWUVlJRkEQ6SiciEJKGoQvixZViGE7XYXUlftBnRgYhydmnKPjY2j6ByKeh8+nJie9ni9T1DXLOr2ShKUJFUUwyg8L0EI266jyKVaD4QwBFSZ05BYDYWHMqeKjKJwUGJUAYgCJQqUFKREkZZDQIEQdnTNIs31XgihHwWYm/ChAZ8bD8xShBf4UP+iy088ppfcuH+OwjwENksG5ihmUZBwCFV46/Zj5FrDEy2Zl2VRlUVVkVQl/GrAsJdFRZFUVYKyqIqCzDEhCGFv/zxib15UobCwiBEUhQVwfwAnKYogyQBBPAcLBHCC8AdwgqT4YBDQDITy4JAP6by6BKHCMHwwKPBBTYIQEgSB54N8uA4KLMfTDAtoJhgURFESRRlC6HBgyI0rFIQKTgCSAgRJLScDCmglAAxBUBSgw4MYhuWDQZbjWYaHEI44KKTK5oMQAsDSLEvTDMOwDMNQgGZZLtzAsJz8giRJFiVt2/ZOEikqmIEQCiFJFKWQKEqyLEpPvRaoRXEMx2mBGhxNMxwvQAgbGv9Bqkr9qgo8Hu/CwgJFUX7M7w8E/JifpAD8H4UvrKUFR+xXQ6JMoejswsIihmHzT+Z9Pt/8/AKOE//pUVU1bJTl5uHBIOLoYCTIYwGSoABOkSSgCUCRNMBJEsPxAEn6cXxxaYkEgAQUCQBgWVGSIFSdoxwy2kNpw0IQyk9RQ6pmpOVShVB5Zp5J0fYFH91jEecQ7WW93ZOOQXRkwKUxiI4MoaMv4f5zwHW3f0ZjYGake8IxRcxMOTlk6m7oyMBJ5OvolT+lrzhqfrXA9FphhqFsm6Fsq6FsW1L5DkPZNnPlrtXHs145alrxo3llYTrybey+9oPuByHkXj8BZHJ80TWNeZ4zueSeXHJPYe6wmVxyv/g7vujCQ/6Jv5h/AXcESZ+qBZrdAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n  "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n          "},{"type":"element","tagName":"source","properties":{"srcSet":["/programming-digital-humanities/static/ebdfcb4045797c7b9ca070ce3fe06adf/a0b58/free_signup.webp 230w","/programming-digital-humanities/static/ebdfcb4045797c7b9ca070ce3fe06adf/bc10c/free_signup.webp 460w","/programming-digital-humanities/static/ebdfcb4045797c7b9ca070ce3fe06adf/5758c/free_signup.webp 824w"],"sizes":"(max-width: 824px) 100vw, 824px","type":"image/webp"},"children":[]},{"type":"text","value":"\n          "},{"type":"element","tagName":"source","properties":{"srcSet":["/programming-digital-humanities/static/ebdfcb4045797c7b9ca070ce3fe06adf/81c8e/free_signup.png 230w","/programming-digital-humanities/static/ebdfcb4045797c7b9ca070ce3fe06adf/08a84/free_signup.png 460w","/programming-digital-humanities/static/ebdfcb4045797c7b9ca070ce3fe06adf/c1c45/free_signup.png 824w"],"sizes":"(max-width: 824px) 100vw, 824px","type":"image/png"},"children":[]},{"type":"text","value":"\n          "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/programming-digital-humanities/static/ebdfcb4045797c7b9ca070ce3fe06adf/c1c45/free_signup.png","alt":"Activating GitHub Copilot","title":"Activating GitHub Copilot","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n        "}]},{"type":"text","value":"\n  "}]},{"type":"text","value":"\n    "}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"install-the-copilot-extension","style":"position:relative;"},"children":[{"type":"text","value":"Install the Copilot extension"},{"type":"element","tagName":"a","properties":{"href":"#install-the-copilot-extension","ariaLabel":"install the copilot extension permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"In VS Code, install the "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"GitHub Copilot"}]},{"type":"text","value":" extension if it is not already installed, and sign in with the same GitHub account."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 536px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n      "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/programming-digital-humanities/static/fc972d99aaece73280d2db05cced9945/2d920/extension.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 122.60869565217392%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAYAAAAxFw7TAAAACXBIWXMAABYlAAAWJQFJUiTwAAAE9klEQVQ4yz1VyW4bRxCda2LLJkWKMxRnI2e4zAyX2bmKi0QtXCRZEkXJsuDAGwwbNmJfEgQ5GLAOueQjEvhHkksQ5BQE+Z8XVDHSodAz1d2vX72q6hZkWUa1WkWpVIIoipAVBWEYotPpYDQaodfr8dhoNNg3Ho+x1e8jCAJks1mUy2VYloWcLEOWFQi6riOKIp6QJIkX6ZoKTVNRyOeRz+swjQI0VYWuaewjUxUZWUnCZjYLOZdDOpWCmNmAQAwJlMEkCeKmDM3yYFR9mLUAhuNDq9SRt1zoVgN6ZWX0n7ddlOoRym4MK+hAtzwIxIjANjc3kZVEZHIaenuHuHpyjW+ev8L8+AReGCNsthHErTsL4zbcIML+ZI7D4xMczI/hb+2tAB3HQaVSYYbSZg5Svgy9XINWqkIxbShF585UHm0e1f/nZdOCUqxis1CGoCgKisUiMywWy/C8COOdPfh+jChsodXsIgiaCMMWoqi18kdt+F4E1w3ZH4ZN9ruNAAIBpdNpbGxswDCKWC6f4I8//8KnTze4unqK9+8/4M2bd3j27BWur5/h3btv8fbtexwczBFFHRwcHOLo6AzL5RV/c1JM02SGplnC/v4cv/z6BS9evMZ4fIDj4zPs7k55PD9/zONicYmLiyseT07OGWwwGCMM2xBUVUW73UY+n0epVEEc9+B5MRqNEJeX12yz2TFOT5c4OjrF1tY2H0QHj8cTjEZ72N7ex+7uBP3+zkrDQqHAYVuWg253iF5vhCjqcrgvX77GxcU1nj59zsDkbzZ7PN5+B0Ebi8VjPHp0vtKQ9FtpaMKyqtB1A8ViBfm8yd80FgpF9plmma1ScWDbddh2jffQXKlkrcqGWscwDKRSKc7455sb7OzsoNVqYTKZYDgcoNvtot1uYTAY8BztITLUYVR2rutypAIBUb/STzKZRLfbw9///IsPHz9y/9JmMlpDNp1Osb29zQB0OAHX63XEcczJ5SzncjkOmdhScRMbShL1sGkYzIAW0wF0kRCIbdvwfR+e57HRP2EIBEaJ4dbLZvnGeZhIIpW4j+rZdwjHZ2iFHjrdLgPRJlpDlslk2EgqqhS6ZAQKlRjQ4ltAifpbzCBrOFALJShyDpqm4TaB1Pu3oLfABcPkqARVUZg6gdIkbSIZaJNZ0PmaIq0oZOp32kQAFBmtozpW6MbKpSFJWQiSrGM9mUA6vdKQgJrNJjOazQ8xnc5wcnKCxWKB5XKJ3d1dBiNg0rPZ7sBzGziLU6hVHQhKxUfNseC6HoPdakRhu9UK6lUHDdflLJL4VCa1Wo2TQIC1soFKPoeCkoWYTkKoxgNcLhdcc7eZFkUJmfQ67MEpvPYIdqUM3w9YGioXAiQJVDkHdXSN0vJHlM5/QLbWg6A5IULfhabrK2Z82eb4tNLecwTDOby6gzCKOIt0ML0nqqZhPfEA0sVPCG5+R/D5N4i9xxCyssrvQUYU77K8RppSOTz4GvfvfYUHDx8ikUhw4a+trXHf35XMepL99xNp9guSJHKGdWaYYXaz7gCWaaDV6XKXTCYHzGw4HKLf73MUlDTSMYpj2FYZUy8Jx66sOoVCodLY2EhDlnV8+f5n9H0fNdfFbDbD/v7+XeFSL1MyqIRISz8IWNdWVeHXkjuFjNuOy0aEpuSRESW+MOi9pghoM/UsJYMyTm1IQFXHYU3Nss3M/wP9bgH5Jbt0iAAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n  "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n          "},{"type":"element","tagName":"source","properties":{"srcSet":["/programming-digital-humanities/static/fc972d99aaece73280d2db05cced9945/a0b58/extension.webp 230w","/programming-digital-humanities/static/fc972d99aaece73280d2db05cced9945/bc10c/extension.webp 460w","/programming-digital-humanities/static/fc972d99aaece73280d2db05cced9945/c5a1c/extension.webp 536w"],"sizes":"(max-width: 536px) 100vw, 536px","type":"image/webp"},"children":[]},{"type":"text","value":"\n          "},{"type":"element","tagName":"source","properties":{"srcSet":["/programming-digital-humanities/static/fc972d99aaece73280d2db05cced9945/81c8e/extension.png 230w","/programming-digital-humanities/static/fc972d99aaece73280d2db05cced9945/08a84/extension.png 460w","/programming-digital-humanities/static/fc972d99aaece73280d2db05cced9945/2d920/extension.png 536w"],"sizes":"(max-width: 536px) 100vw, 536px","type":"image/png"},"children":[]},{"type":"text","value":"\n          "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/programming-digital-humanities/static/fc972d99aaece73280d2db05cced9945/2d920/extension.png","alt":"The GitHub Copilot extension in VS Code","title":"The GitHub Copilot extension in VS Code","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n        "}]},{"type":"text","value":"\n  "}]},{"type":"text","value":"\n    "}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"ai-tools-in-vs-code","style":"position:relative;"},"children":[{"type":"text","value":"AI tools in VS Code"},{"type":"element","tagName":"a","properties":{"href":"#ai-tools-in-vs-code","ariaLabel":"ai tools in vs code permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"GitHub Copilot is a coding assistant integrated into VS Code. It can suggest code as you type, answer questions about files and, in Agent mode, edit files and run commands in the open project. See the official "},{"type":"element","tagName":"a","properties":{"href":"https://code.visualstudio.com/docs/copilot/overview","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"GitHub Copilot overview for VS Code"}]},{"type":"text","value":" for a fuller introduction."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"the-agent-view","style":"position:relative;"},"children":[{"type":"text","value":"The Agent view"},{"type":"element","tagName":"a","properties":{"href":"#the-agent-view","ariaLabel":"the agent view permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Open the Chat or Agents view from the chat icon in the VS Code title bar. Select "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Agent"}]},{"type":"text","value":" mode. An agent can inspect the files in the folder you have open, create and modify files, and use the terminal to set up or run the project. It may pause to ask for permission before running a command or installing something."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"You direct the work through messages in this view. You can ask for an implementation, continue the conversation with a changed requirement, or ask the agent to explain what it did. Keep the relevant project folder open so the agent has the right context."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n      "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/programming-digital-humanities/static/6db94b0b7b27c3d477496d9bc6422360/7e117/chat.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 63.91304347826087%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAACFklEQVQozz2SWY6kMBBE6x4NGG/pfcPspoAqptX3v9GImtY8xZflcIYy/PBea6UFSKX0r6QyH7TWShnGOIAQQgAA5wAgYkxaGynlA+PWe98PvY/BOeusdEZ6IxkhxthlWaZpzrkfx2kcp5QyY4wQSikFEA9KqVTSeEMFtBgh0tZN9fVV1XWdUtr3o5Qt5945F0J0H6x1xljvw4MQjAjjxscYhj4bKYBzzoEQ6n1Y1zKO4zwvpZRlWUrZtm3b9+PznH8ghDDGFrig1AjQUmkASkjbIGPsNN2xx3Fa1zIMo/chhBhCjDHdZkIIatuWtIRhygnCGCHUNE1dV9a6eV6U0kJIAME5MMb/i3N4YIwxoXlc9mNf5il613nHOVRVpbXZtueyrH0/WOu0NkoZa25JqRjjtxkhlLs49UMK2dyXFOe8rmsAOI7zPF+v13tdS9flLvcppi53KXVam0/spuGcd8FaZ0GAkJJx3jQNgHje7Odx7/y5baWU/oPW5q7qNiNEGc3JdzlIrQRwKQTGWAhZyrbMa5+7nELfhb6LQ59SDAD3n/mNTSlNIRitpZQKKMVtXddCqmle8zD62FkfXYgpRR+SdTHcJ+F3MiY8hiDl3TEwQtq2qqqYup+fn+t6f3//ua7rOI7X69z3vXzqHsbpQSlp25bdwxr0j6ZBLarr2oX0el/H+Xq9r+25/1N5Ps/3db6ved3+AsEMiBrvDGVvAAAAAElFTkSuQmCC'); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n  "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n          "},{"type":"element","tagName":"source","properties":{"srcSet":["/programming-digital-humanities/static/6db94b0b7b27c3d477496d9bc6422360/a0b58/chat.webp 230w","/programming-digital-humanities/static/6db94b0b7b27c3d477496d9bc6422360/bc10c/chat.webp 460w","/programming-digital-humanities/static/6db94b0b7b27c3d477496d9bc6422360/966d8/chat.webp 920w","/programming-digital-humanities/static/6db94b0b7b27c3d477496d9bc6422360/445df/chat.webp 1380w","/programming-digital-humanities/static/6db94b0b7b27c3d477496d9bc6422360/0a3b3/chat.webp 1715w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n          "},{"type":"element","tagName":"source","properties":{"srcSet":["/programming-digital-humanities/static/6db94b0b7b27c3d477496d9bc6422360/81c8e/chat.png 230w","/programming-digital-humanities/static/6db94b0b7b27c3d477496d9bc6422360/08a84/chat.png 460w","/programming-digital-humanities/static/6db94b0b7b27c3d477496d9bc6422360/c0255/chat.png 920w","/programming-digital-humanities/static/6db94b0b7b27c3d477496d9bc6422360/b1001/chat.png 1380w","/programming-digital-humanities/static/6db94b0b7b27c3d477496d9bc6422360/7e117/chat.png 1715w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n          "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/programming-digital-humanities/static/6db94b0b7b27c3d477496d9bc6422360/c0255/chat.png","alt":"The Copilot Chat and Agent view in VS Code","title":"The Copilot Chat and Agent view in VS Code","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n        "}]},{"type":"text","value":"\n  "}]},{"type":"text","value":"\n    "}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"code-completions","style":"position:relative;"},"children":[{"type":"text","value":"Code completions"},{"type":"element","tagName":"a","properties":{"href":"#code-completions","ariaLabel":"code completions permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Copilot may also suggest code as grey “ghost text” while you type. Press "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Tab"}]},{"type":"text","value":" to accept a suggestion or "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Esc"}]},{"type":"text","value":" to reject it. Accepted suggestions become ordinary code in your file; they still need to be read and understood."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n      "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/8f1fd/auto_suggestion.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 56.95652173913044%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAAByUlEQVQoz4WTXW7UMBSFZxNMoU1sx7GT+D8/7bTQBfDKCnhkTez2Q/GkUyFAPBxZurKPvnvu9UlKRSsEvR3xwRPLwhQdcZsJyTPaEWsH7GDpug4hBFLKf+rUtoLm4RNaCvwoKWVEhxUdZ0LZsHGhsxN6GOiXhHEB42bM4DHBY/baGDB+wU6eU681992AyK+oqaBUhx4TdpjIyTGnxGBGdHRY55FCopRE9x1dr1CdrLUbobw/8+HpG+fvP1Fff6CkwFjHHFaiC8S8MYQVGxJDWrEu45MnXTL5ZSYWT6cU4jA9GWMRzQPP28I6F9Z1JeeEMaZeaNsGKVpEK2ibpma4P37TTifkUdsNrbW1zRAi87LgnKOUmcvThVQyj48LZfuMLxtp21ifnjHOXfPUFiWvhreWtdYVOecrnXPTlTJFbFoZ48qYnxlcIF9eyZcv9Du9UuwbIo+p31retq22t22PlFKqdsr94j41lxdyDtg4o+1Up9xPgd4lOjMiRPu7YdM0db92qnVZ8P46yV73qBp2e+T2N71N9z3X0/l8rkUfIjGVarjHUKP4zyKLw+zNsBLe3X28/hRXqlTXVbLuOMUtI3Hs2/tjIf40/AVR8TsT4J74fgAAAABJRU5ErkJggg=='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n  "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n          "},{"type":"element","tagName":"source","properties":{"srcSet":["/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/a0b58/auto_suggestion.webp 230w","/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/bc10c/auto_suggestion.webp 460w","/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/966d8/auto_suggestion.webp 920w","/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/445df/auto_suggestion.webp 1380w","/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/78de1/auto_suggestion.webp 1840w","/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/c5daa/auto_suggestion.webp 2528w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/webp"},"children":[]},{"type":"text","value":"\n          "},{"type":"element","tagName":"source","properties":{"srcSet":["/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/81c8e/auto_suggestion.png 230w","/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/08a84/auto_suggestion.png 460w","/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/c0255/auto_suggestion.png 920w","/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/b1001/auto_suggestion.png 1380w","/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/161ec/auto_suggestion.png 1840w","/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/8f1fd/auto_suggestion.png 2528w"],"sizes":"(max-width: 920px) 100vw, 920px","type":"image/png"},"children":[]},{"type":"text","value":"\n          "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/c0255/auto_suggestion.png","alt":"A grey Copilot code-completion suggestion","title":"A grey Copilot code-completion suggestion","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n        "}]},{"type":"text","value":"\n  "}]},{"type":"text","value":"\n    "}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"turning-copilot-on-and-off","style":"position:relative;"},"children":[{"type":"text","value":"Turning Copilot on and off"},{"type":"element","tagName":"a","properties":{"href":"#turning-copilot-on-and-off","ariaLabel":"turning copilot on and off permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Use the Copilot menu in the VS Code status bar to enable or disable its features. You will use Copilot in Part 0, turn its code-generation features off during the manual exercises in Parts 1–4, and turn them back on when agent-assisted work begins in Part 5. See "},{"type":"element","tagName":"a","properties":{"href":"https://code.visualstudio.com/docs/copilot/getting-started","target":"_blank","rel":["noopener","noreferrer"]},"children":[{"type":"text","value":"Getting started with GitHub Copilot"}]},{"type":"text","value":" if the extension, sign-in or controls do not appear as expected."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{},"children":[{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-wrapper"],"style":"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 382px; margin-bottom: 1rem;"},"children":[{"type":"text","value":"\n      "},{"type":"element","tagName":"a","properties":{"className":["gatsby-resp-image-link"],"href":"/programming-digital-humanities/static/c53877af5a76aed128fb024e5bfc65c3/77edc/enable.png","style":"display: block","target":"_blank","rel":["noopener"]},"children":[{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["gatsby-resp-image-background-image"],"style":"padding-bottom: 51.30434782608696%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABdklEQVQoz42S167CQAxE9yuoIfTeqwRCvJBA6EW0//+RuTqWwuMVDyt7187YMxNXq9XU6/XU7XY1HA7VarXUbDZVKBR+Ovl83uJoNFK1WpUD6HQ6ab1e63K56Hg8KoqinwF931epVNJms1Gn05FjQrFYtJPJZGyi53nWyMnlcv8eQInZbNb6HZTZaD6fKwxDy9/vt1arlc7nsw6Hg263m16vl0Xu2+3W6o/Hwzaj/36/azKZyFUqFY3HY+MPeLvdNk3J0RJNB4OB0SGnTuQgF3R5o6der8uVy2UzgweAGo2GNdLU7/ftDjA5dfLYSIzgu9hIA6TI2oBCA0qfz0eLxUK73c5oQ/f5fOp6vdqdd0xEHozc7/dGeTabybEy6GyKGel0WqlUygTmjlHEZDKpRCJhNXp4J8cMTKEHQ21DNIQCk9kEcxA+zvmVqCE+DNiUyGbQZTh/CY6bhggOf+J0Ov1qiEaxScvlUkEQ2PBYO2TCTADj//IPYPI3AiAWo6UAAAAASUVORK5CYII='); background-size: cover; display: block;"},"children":[]},{"type":"text","value":"\n  "},{"type":"element","tagName":"picture","properties":{},"children":[{"type":"text","value":"\n          "},{"type":"element","tagName":"source","properties":{"srcSet":["/programming-digital-humanities/static/c53877af5a76aed128fb024e5bfc65c3/a0b58/enable.webp 230w","/programming-digital-humanities/static/c53877af5a76aed128fb024e5bfc65c3/c5024/enable.webp 382w"],"sizes":"(max-width: 382px) 100vw, 382px","type":"image/webp"},"children":[]},{"type":"text","value":"\n          "},{"type":"element","tagName":"source","properties":{"srcSet":["/programming-digital-humanities/static/c53877af5a76aed128fb024e5bfc65c3/81c8e/enable.png 230w","/programming-digital-humanities/static/c53877af5a76aed128fb024e5bfc65c3/77edc/enable.png 382w"],"sizes":"(max-width: 382px) 100vw, 382px","type":"image/png"},"children":[]},{"type":"text","value":"\n          "},{"type":"element","tagName":"img","properties":{"className":["gatsby-resp-image-image"],"src":"/programming-digital-humanities/static/c53877af5a76aed128fb024e5bfc65c3/77edc/enable.png","alt":"Copilot enable and disable controls in VS Code","title":"Copilot enable and disable controls in VS Code","loading":"lazy","decoding":"async","style":"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;"},"children":[]},{"type":"text","value":"\n        "}]},{"type":"text","value":"\n  "}]},{"type":"text","value":"\n    "}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"build-the-first-artifact","style":"position:relative;"},"children":[{"type":"text","value":"Build the first artifact"},{"type":"element","tagName":"a","properties":{"href":"#build-the-first-artifact","ariaLabel":"build the first artifact permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Imagine a small local heritage archive containing photographs, drawings, maps, sound recordings and everyday objects such as notebooks and tickets. The data for this experiment is a fictional catalogue of 100 such items. Each record describes one item: its title, the collection it belongs to, a subject category, a year and, where known, its creator and place. Tags describe themes such as family, transport or local history. Some details are missing, as they often are in real catalogues."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"The application you build will let you explore this catalogue. Choosing the Photographs collection, for example, should show only its items in the table and count how many there are. The chart will show how those photographs are divided among subjects such as portraits, nature and urban life. A collection describes the kind of material, while a category describes its subject: both a photograph and a drawing can depict a landscape. The app displays catalogue descriptions, not the photographs or recordings themselves, and any patterns you see belong to this invented dataset."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Create an empty folder for this experiment and open that folder in VS Code. Open the Agent view as described above and paste the following request:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"blockquote","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"First, help me understand what the data contains: inspect the CSV linked below and explain in plain language what its records describe, what information is available and what is missing. Then, build a small local Streamlit application in this folder. Use the Python installation already available on this computer: do not install or replace Python system-wide. Create an isolated environment inside this project and record its dependencies. Download the frozen CSV data from "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"https://rage.github.io/programming-digital-humanities/opening-artifact/records.csv"}]},{"type":"text","value":", save a local copy in the project and record the source URL. Show a collection selector with an "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"all"}]},{"type":"text","value":" option, the number of displayed records, a table of the displayed records and a bar chart of displayed records by category. Keep calculations separate from interface layout, add small checks for the returned metric, table rows and chart data, and give me the exact commands for running the checks and application. Check whether the required local tools are available, tell me about any manual step I must do, and then implement and run the application."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Follow the agent's setup instructions and use the application. Then request this mechanical change:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"blockquote","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Add an optional minimum-year control. It must affect the displayed count, table and chart. Blank year values mean the year is unknown: include those records when no minimum is set, and exclude them when a minimum is set. If no records match, show zero, an empty table and an empty chart without crashing. Update and run the relevant checks, then summarize the changed files."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Try an ordinary selection and one which produces no records. At this point, use the running application and the agent's account to judge the result. You are not expected to understand the generated code yet."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"a-convincing-account-is-not-the-changed-program","style":"position:relative;"},"children":[{"type":"text","value":"A convincing account is not the changed program"},{"type":"element","tagName":"a","properties":{"href":"#a-convincing-account-is-not-the-changed-program","ariaLabel":"a convincing account is not the changed program permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Suppose an agent reports:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"blockquote","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Added the minimum-year filter throughout the dashboard. The metric, table and chart now update together, and all tests pass."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"The application opens and the count and table look correct. The actual change however contains these code changes:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["gatsby-highlight"],"dataLanguage":"diff"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-diff"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-diff"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","unchanged"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","prefix","unchanged"]},"children":[{"type":"text","value":" "}]},{"type":"text","value":"active_records = filter_collection(records, selected_collection)\n"}]},{"type":"element","tagName":"span","properties":{"className":["token","inserted-sign","inserted"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","prefix","inserted"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"visible_records = filter_minimum_year(active_records, minimum_year)\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","deleted-sign","deleted"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","prefix","deleted"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"metrics = make_metrics(active_records)\n"},{"type":"element","tagName":"span","properties":{"className":["token","prefix","deleted"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":"table_rows = make_table(active_records)\n"}]},{"type":"element","tagName":"span","properties":{"className":["token","inserted-sign","inserted"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","prefix","inserted"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"metrics = make_metrics(visible_records)\n"},{"type":"element","tagName":"span","properties":{"className":["token","prefix","inserted"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":"table_rows = make_table(visible_records)\n"}]},{"type":"element","tagName":"span","properties":{"className":["token","unchanged"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","prefix","unchanged"]},"children":[{"type":"text","value":" "}]},{"type":"text","value":"chart_series = make_chart(active_records)"}]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Importantly, the agent has forgotten to update the chart to use "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"visible_records"}]},{"type":"text","value":", which results in the chart showing different data than the count and table. What this example shows is that an agent's explanation and verification work can be useful, but they remain "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"the agent's claim"}]},{"type":"text","value":" about the implementation. The difference in code versions is the primary evidence of what really changed and how things work."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"three-kinds-of-evidence","style":"position:relative;"},"children":[{"type":"text","value":"Three kinds of evidence"},{"type":"element","tagName":"a","properties":{"href":"#three-kinds-of-evidence","ariaLabel":"three kinds of evidence permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Conversational claim:"}]},{"type":"text","value":" what the agent says it changed or verified."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Implementation evidence:"}]},{"type":"text","value":" the changed code and the surrounding callers which determine how it is used."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Behavioural evidence:"}]},{"type":"text","value":" actual returned values, checks and observed application behaviour."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Agents can help inspect all three. Learning programming gives you another basis for judging whether the explanation matches the artifact it describes."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"If not having to trust the agent through being able to examine these kinds of evidence seems useful, then this course is for you. If you are satisfied with the agent's account and the running application, then you may not need to learn programming."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"what-the-rest-of-the-course-adds","style":"position:relative;"},"children":[{"type":"text","value":"What the rest of the course adds"},{"type":"element","tagName":"a","properties":{"href":"#what-the-rest-of-the-course-adds","ariaLabel":"what the rest of the course adds permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Parts 1–4 are completed manually because they teach the minimum building blocks needed to read implementation evidence: values and variables, conditions and loops, functions, and the basic structures used to organise data. Writing small programs yourself helps these concepts become connected knowledge which you can recognize even when a new program uses unfamiliar names or serves a different purpose."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Parts 5–8 then develop two abilities together. They show how those building blocks compose into larger units, while gradually introducing collaboration with a coding agent:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ol","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Part 5 — transformations in memory:"}]},{"type":"text","value":" lists and dictionaries become tables, named records and lookup structures. Several small functions begin to cooperate, so you can trace how a record changes between an input and a result."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Part 6 — pipelines around files:"}]},{"type":"text","value":" data crosses program boundaries. You separate "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ingest"}]},{"type":"text","value":", "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"validate"}]},{"type":"text","value":", "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"transform"}]},{"type":"text","value":", "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"summarize"}]},{"type":"text","value":" and "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"present"}]},{"type":"text","value":" stages so that parsed values, intermediate results and written output can each be inspected."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Part 7 — libraries within the pipeline:"}]},{"type":"text","value":" dataframe and analytical libraries take responsibility for substantial operations. You follow the objects passed between project code and library calls, and then onward to tables, metrics and charts."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Part 8 — a complete local application:"}]},{"type":"text","value":" you return to the artifact created here, ask an agent for a bounded modification, and use the code structure and its behaviour to decide whether the change does what was requested."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"decide-whether-to-continue","style":"position:relative;"},"children":[{"type":"text","value":"Decide whether to continue"},{"type":"element","tagName":"a","properties":{"href":"#decide-whether-to-continue","ariaLabel":"decide whether to continue permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"You have now seen both sides of agent-first programming:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"a useful application can be created and changed without first learning to code;"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"a plausible explanation and a partly working interface do not necessarily reveal everything the changed program does."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Continue to Part 1 if you want to learn how to inspect that implementation evidence yourself, describe code-level changes more precisely, or follow how values move through a larger program. The course is not premised on replacing the agent by writing everything manually forever. The manual foundation makes later collaboration less dependent on taking the agent's account on trust."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"before-continuing-to-part-1","style":"position:relative;"},"children":[{"type":"text","value":"Before continuing to Part 1"},{"type":"element","tagName":"a","properties":{"href":"#before-continuing-to-part-1","ariaLabel":"before continuing to part 1 permalink","className":["anchor","after"]},"children":[{"type":"element","tagName":"svg","properties":{"ariaHidden":"true","focusable":"false","height":"16","version":"1.1","viewBox":"0 0 16 16","width":"16"},"children":[{"type":"element","tagName":"path","properties":{"fillRule":"evenodd","d":"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"},"children":[]}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Keep the folder the agent created: you will return to this application later in the course."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Parts 1–4 are manual programming practice. Before beginning Part 1, use the Copilot menu described above to turn off code completions, and do not ask the coding agent to generate exercise solutions. You will turn these features back on when the agent-assisted exercise modes begin in Part 5. The "},{"type":"element","tagName":"a","properties":{"href":"/programming-digital-humanities/ai-tutor"},"children":[{"type":"text","value":"course AI tutor"}]},{"type":"text","value":" remains available for conceptual help."}]}],"data":{"quirksMode":false}},"html":"<div><table-of-contents></table-of-contents></div>\n<h2 id=\"is-learning-programming-useful-to-you\" style=\"position:relative;\">Is learning programming useful to you?<a href=\"#is-learning-programming-useful-to-you\" aria-label=\"is learning programming useful to you permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Before deciding whether to learn programming, first try creating a small program without writing its code yourself. This Part 0 task lets you experience what a coding agent can already build and modify from ordinary-language instructions.</p>\n<p>You may find that directing an agent and using the resulting application is enough for what you want to accomplish. In that case, a programming course may not be the best use of your time. The added value of this course is narrower: it teaches you to inspect the program itself when you want evidence beyond the agent's account, and to understand how small building blocks compose into the larger data flows an agent creates.</p>\n<p>On the other hand, setting up the agent environment and using it to build a small application is not trivial itself either. Thus, if you run into too many problems in this section, you can also just decide to trust your guts and continue to the manual exercises in Part 1, which are much more layered and structured to introduce their concepts gradually.</p>\n<h2 id=\"set-up-the-coding-agent\" style=\"position:relative;\">Set up the coding agent<a href=\"#set-up-the-coding-agent\" aria-label=\"set up the coding agent permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>For this Part 0, you need Visual Studio Code, a working Python installation and access to GitHub Copilot.</p>\n<h3 id=\"install-visual-studio-code\" style=\"position:relative;\">Install Visual Studio Code<a href=\"#install-visual-studio-code\" aria-label=\"install visual studio code permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h3>\n<p>There are dozens of different editors that are suited to programming. On this course we will use the <a href=\"https://code.visualstudio.com/\" target=\"_blank\" rel=\"noopener noreferrer\">Visual Studio Code</a> editor, which has been gaining traction in recent years. To install it, follow the instructions on the <a href=\"https://code.visualstudio.com/download\" target=\"_blank\" rel=\"noopener noreferrer\">Visual Studio Code download page</a>, or this <a href=\"https://www.mooc.fi/en/installation/vscode\" target=\"_blank\" rel=\"noopener noreferrer\">installation guide</a>.</p>\n<h3 id=\"install-python\" style=\"position:relative;\">Install Python<a href=\"#install-python\" aria-label=\"install python permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h3>\n<p>Use the Python installation instructions in the same <a href=\"https://www.mooc.fi/en/installation/vscode\" target=\"_blank\" rel=\"noopener noreferrer\">MOOC installation guide</a>. Complete the guide's check that Python runs on your computer. You do not need to install or configure the TMC extension yet; that can wait until Part 4 of this course.</p>\n<h3 id=\"activate-github-copilot\" style=\"position:relative;\">Activate GitHub Copilot<a href=\"#activate-github-copilot\" aria-label=\"activate github copilot permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h3>\n<p>Sign in to GitHub and make sure your account has access to GitHub Copilot. University students can apply through the <a href=\"https://education.github.com/pack\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub Student Developer Pack</a>; approval may take a few days.</p>\n<div><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;\"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/programming-digital-humanities/static/4be96a5cd87b138c3cb58292953a3aba/081d5/verify.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 98.26086956521739%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAACC0lEQVQ4y6WUu47TQBiF86yU1BR0dDwBDR0VEogC8RAIiZJNSOLETuysPfeL5+LxzCSDJt4sFFmxqz1y8Rfz+WjO+e0ZIgIRzqSF1FBKMaGUckJYHhjHhCJMKWPOjePox9EPbuRSQcwRETNEBCaMiHEPzHZTrNbFZrNdF8VytS7Laj5f/F6uyrI8Ho/prNPppLQBiGUYU4mIcG70YYzHO01DCCHGGGL0PgzOGWtDjCklpe0dfLNY/5qvZa/2db0tq6ra1XVTllXTNO1ZddPU9aHrwOFw65xL2fkC33a4PgA3etn3AEKIEMm3ZVyIdE0hBKVtCyjAfNa0rDoQpU0HEWUcYgIQJpS1HRRSGjsMztkhyw6DtTbGqLRtOtJCNit2eL4BxtgOIIhwBxDCRGtjrNXG9EprbWSvlFLOOWNsCEFIXZRNtW9nLaQtIMZYxjllgjLOheRcKq25kEL2vVK90nYYpqhTSlKZ3QE2Hc5VAcyGwWljJitjbLbSeRZSeh8mbFJKSZtLYBlGzHufUooxHuN9X1mn0zFe5L2f2r4OhxCmd19V7v/c8//h03PgvGHno0+DJ/77j5/v3n/49OVb28EpsEfBUyofP3998fLV6zdvl+vNE+DJGWFys1iuiq0x9sl3fl7a/2zFo+D7L/4h58uSDH9hiDkXeSGF6BkTjMuHHimVUpowOf2G/gD6HHKuxDQRvgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/programming-digital-humanities/static/4be96a5cd87b138c3cb58292953a3aba/a0b58/verify.webp 230w,\n/programming-digital-humanities/static/4be96a5cd87b138c3cb58292953a3aba/bc10c/verify.webp 460w,\n/programming-digital-humanities/static/4be96a5cd87b138c3cb58292953a3aba/966d8/verify.webp 920w,\n/programming-digital-humanities/static/4be96a5cd87b138c3cb58292953a3aba/910f4/verify.webp 1264w\"\n              sizes=\"(max-width: 920px) 100vw, 920px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/programming-digital-humanities/static/4be96a5cd87b138c3cb58292953a3aba/81c8e/verify.png 230w,\n/programming-digital-humanities/static/4be96a5cd87b138c3cb58292953a3aba/08a84/verify.png 460w,\n/programming-digital-humanities/static/4be96a5cd87b138c3cb58292953a3aba/c0255/verify.png 920w,\n/programming-digital-humanities/static/4be96a5cd87b138c3cb58292953a3aba/081d5/verify.png 1264w\"\n            sizes=\"(max-width: 920px) 100vw, 920px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/programming-digital-humanities/static/4be96a5cd87b138c3cb58292953a3aba/c0255/verify.png\"\n            alt=\"GitHub Student Developer Pack verification\"\n            title=\"GitHub Student Developer Pack verification\"\n            loading=\"lazy\"\n            decoding=\"async\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></div>\n<p>After approval, activate Copilot for the same account from the <a href=\"https://github.com/github-copilot/free_signup\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub Copilot signup page</a>:</p>\n<div><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 824px; margin-bottom: 1rem;\"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/programming-digital-humanities/static/ebdfcb4045797c7b9ca070ce3fe06adf/c1c45/free_signup.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 125.21739130434781%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAIAAAC+dZmEAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFEElEQVQ4y3WSa0xTZxjHz8fNxGzxBgilQCnQAkUoymAOb9NNPyxmX5e4mCW7x7k5szncUCYoVysTvMAEA8ocSBUQuVsWYYkunRi59rRQJ1BOey7vufX03N7lUDW6ZP/88ub/5M3z/JMnDxLx+rGoVcXRa0p1aytiI6r0kafjI88krD+j19s+/uTmgQK7wVIeF1keH1WqjyjRrSuKWVsYveaHyNWH1636CtGtLddH2OKjfjGsrzHGnEvWXTDpL+ojaw8d7O/t6e7uvVF8vkcXU22KrTXqbIkxFYb1p+KjTsRGFUZHHkESos4aY86l6OrM+obUuMvpCU0bjFdMcVeOHO7uvNXa1FRfeaHLlNyQkdiQllCXmlBrijuTpK9M1J+K0xUhKbF1Zn2jxdCcYWzJTLpmTWnNSm7NSGzLf8Nef9HZ0vZg93s3LQlXrcnNWclNmcmNFmNdmrHGlGgzGsqR5agWa0rrJnN7TuqN3LSOPfl97+8a3LtjaPfm/nff6tuT37t3Z9+e/K68Da2b0lqyU5szzZcspvOppmok2/R7rsW+2dK5JbN7e3bfVmv/5x/eP/yF87sDY4c+dX65/37BN39/f9D52b7RnbldWzba87Pb3rT+lmO9nJl1EbEa29Nj7VkJXRuNPTkpA3mpd3JNd7ZmDr+9cXjXpj925gy/k+vYbh3MM/fmpXXnpHZkm65vSLlmTmpMt/yKfLDXUfHzROmxqcpi9PRJj+3kbHXpXE2Zt7bicU35XG2F92yZx1bispVMV52YLD/xqLRorPi481TJ/f0f3Ubqa1wQKqLIiRIQBEJRWUVlJRkEQ6SiciEJKGoQvixZViGE7XYXUlftBnRgYhydmnKPjY2j6ByKeh8+nJie9ni9T1DXLOr2ShKUJFUUwyg8L0EI266jyKVaD4QwBFSZ05BYDYWHMqeKjKJwUGJUAYgCJQqUFKREkZZDQIEQdnTNIs31XgihHwWYm/ChAZ8bD8xShBf4UP+iy088ppfcuH+OwjwENksG5ihmUZBwCFV46/Zj5FrDEy2Zl2VRlUVVkVQl/GrAsJdFRZFUVYKyqIqCzDEhCGFv/zxib15UobCwiBEUhQVwfwAnKYogyQBBPAcLBHCC8AdwgqT4YBDQDITy4JAP6by6BKHCMHwwKPBBTYIQEgSB54N8uA4KLMfTDAtoJhgURFESRRlC6HBgyI0rFIQKTgCSAgRJLScDCmglAAxBUBSgw4MYhuWDQZbjWYaHEI44KKTK5oMQAsDSLEvTDMOwDMNQgGZZLtzAsJz8giRJFiVt2/ZOEikqmIEQCiFJFKWQKEqyLEpPvRaoRXEMx2mBGhxNMxwvQAgbGv9Bqkr9qgo8Hu/CwgJFUX7M7w8E/JifpAD8H4UvrKUFR+xXQ6JMoejswsIihmHzT+Z9Pt/8/AKOE//pUVU1bJTl5uHBIOLoYCTIYwGSoABOkSSgCUCRNMBJEsPxAEn6cXxxaYkEgAQUCQBgWVGSIFSdoxwy2kNpw0IQyk9RQ6pmpOVShVB5Zp5J0fYFH91jEecQ7WW93ZOOQXRkwKUxiI4MoaMv4f5zwHW3f0ZjYGake8IxRcxMOTlk6m7oyMBJ5OvolT+lrzhqfrXA9FphhqFsm6Fsq6FsW1L5DkPZNnPlrtXHs145alrxo3llYTrybey+9oPuByHkXj8BZHJ80TWNeZ4zueSeXHJPYe6wmVxyv/g7vujCQ/6Jv5h/AXcESZ+qBZrdAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/programming-digital-humanities/static/ebdfcb4045797c7b9ca070ce3fe06adf/a0b58/free_signup.webp 230w,\n/programming-digital-humanities/static/ebdfcb4045797c7b9ca070ce3fe06adf/bc10c/free_signup.webp 460w,\n/programming-digital-humanities/static/ebdfcb4045797c7b9ca070ce3fe06adf/5758c/free_signup.webp 824w\"\n              sizes=\"(max-width: 824px) 100vw, 824px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/programming-digital-humanities/static/ebdfcb4045797c7b9ca070ce3fe06adf/81c8e/free_signup.png 230w,\n/programming-digital-humanities/static/ebdfcb4045797c7b9ca070ce3fe06adf/08a84/free_signup.png 460w,\n/programming-digital-humanities/static/ebdfcb4045797c7b9ca070ce3fe06adf/c1c45/free_signup.png 824w\"\n            sizes=\"(max-width: 824px) 100vw, 824px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/programming-digital-humanities/static/ebdfcb4045797c7b9ca070ce3fe06adf/c1c45/free_signup.png\"\n            alt=\"Activating GitHub Copilot\"\n            title=\"Activating GitHub Copilot\"\n            loading=\"lazy\"\n            decoding=\"async\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></div>\n<h3 id=\"install-the-copilot-extension\" style=\"position:relative;\">Install the Copilot extension<a href=\"#install-the-copilot-extension\" aria-label=\"install the copilot extension permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h3>\n<p>In VS Code, install the <strong>GitHub Copilot</strong> extension if it is not already installed, and sign in with the same GitHub account.</p>\n<div><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 536px; margin-bottom: 1rem;\"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/programming-digital-humanities/static/fc972d99aaece73280d2db05cced9945/2d920/extension.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 122.60869565217392%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAYAAAAxFw7TAAAACXBIWXMAABYlAAAWJQFJUiTwAAAE9klEQVQ4yz1VyW4bRxCda2LLJkWKMxRnI2e4zAyX2bmKi0QtXCRZEkXJsuDAGwwbNmJfEgQ5GLAOueQjEvhHkksQ5BQE+Z8XVDHSodAz1d2vX72q6hZkWUa1WkWpVIIoipAVBWEYotPpYDQaodfr8dhoNNg3Ho+x1e8jCAJks1mUy2VYloWcLEOWFQi6riOKIp6QJIkX6ZoKTVNRyOeRz+swjQI0VYWuaewjUxUZWUnCZjYLOZdDOpWCmNmAQAwJlMEkCeKmDM3yYFR9mLUAhuNDq9SRt1zoVgN6ZWX0n7ddlOoRym4MK+hAtzwIxIjANjc3kZVEZHIaenuHuHpyjW+ev8L8+AReGCNsthHErTsL4zbcIML+ZI7D4xMczI/hb+2tAB3HQaVSYYbSZg5Svgy9XINWqkIxbShF585UHm0e1f/nZdOCUqxis1CGoCgKisUiMywWy/C8COOdPfh+jChsodXsIgiaCMMWoqi18kdt+F4E1w3ZH4ZN9ruNAAIBpdNpbGxswDCKWC6f4I8//8KnTze4unqK9+8/4M2bd3j27BWur5/h3btv8fbtexwczBFFHRwcHOLo6AzL5RV/c1JM02SGplnC/v4cv/z6BS9evMZ4fIDj4zPs7k55PD9/zONicYmLiyseT07OGWwwGCMM2xBUVUW73UY+n0epVEEc9+B5MRqNEJeX12yz2TFOT5c4OjrF1tY2H0QHj8cTjEZ72N7ex+7uBP3+zkrDQqHAYVuWg253iF5vhCjqcrgvX77GxcU1nj59zsDkbzZ7PN5+B0Ebi8VjPHp0vtKQ9FtpaMKyqtB1A8ViBfm8yd80FgpF9plmma1ScWDbddh2jffQXKlkrcqGWscwDKRSKc7455sb7OzsoNVqYTKZYDgcoNvtot1uYTAY8BztITLUYVR2rutypAIBUb/STzKZRLfbw9///IsPHz9y/9JmMlpDNp1Osb29zQB0OAHX63XEcczJ5SzncjkOmdhScRMbShL1sGkYzIAW0wF0kRCIbdvwfR+e57HRP2EIBEaJ4dbLZvnGeZhIIpW4j+rZdwjHZ2iFHjrdLgPRJlpDlslk2EgqqhS6ZAQKlRjQ4ltAifpbzCBrOFALJShyDpqm4TaB1Pu3oLfABcPkqARVUZg6gdIkbSIZaJNZ0PmaIq0oZOp32kQAFBmtozpW6MbKpSFJWQiSrGM9mUA6vdKQgJrNJjOazQ8xnc5wcnKCxWKB5XKJ3d1dBiNg0rPZ7sBzGziLU6hVHQhKxUfNseC6HoPdakRhu9UK6lUHDdflLJL4VCa1Wo2TQIC1soFKPoeCkoWYTkKoxgNcLhdcc7eZFkUJmfQ67MEpvPYIdqUM3w9YGioXAiQJVDkHdXSN0vJHlM5/QLbWg6A5IULfhabrK2Z82eb4tNLecwTDOby6gzCKOIt0ML0nqqZhPfEA0sVPCG5+R/D5N4i9xxCyssrvQUYU77K8RppSOTz4GvfvfYUHDx8ikUhw4a+trXHf35XMepL99xNp9guSJHKGdWaYYXaz7gCWaaDV6XKXTCYHzGw4HKLf73MUlDTSMYpj2FYZUy8Jx66sOoVCodLY2EhDlnV8+f5n9H0fNdfFbDbD/v7+XeFSL1MyqIRISz8IWNdWVeHXkjuFjNuOy0aEpuSRESW+MOi9pghoM/UsJYMyTm1IQFXHYU3Nss3M/wP9bgH5Jbt0iAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/programming-digital-humanities/static/fc972d99aaece73280d2db05cced9945/a0b58/extension.webp 230w,\n/programming-digital-humanities/static/fc972d99aaece73280d2db05cced9945/bc10c/extension.webp 460w,\n/programming-digital-humanities/static/fc972d99aaece73280d2db05cced9945/c5a1c/extension.webp 536w\"\n              sizes=\"(max-width: 536px) 100vw, 536px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/programming-digital-humanities/static/fc972d99aaece73280d2db05cced9945/81c8e/extension.png 230w,\n/programming-digital-humanities/static/fc972d99aaece73280d2db05cced9945/08a84/extension.png 460w,\n/programming-digital-humanities/static/fc972d99aaece73280d2db05cced9945/2d920/extension.png 536w\"\n            sizes=\"(max-width: 536px) 100vw, 536px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/programming-digital-humanities/static/fc972d99aaece73280d2db05cced9945/2d920/extension.png\"\n            alt=\"The GitHub Copilot extension in VS Code\"\n            title=\"The GitHub Copilot extension in VS Code\"\n            loading=\"lazy\"\n            decoding=\"async\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></div>\n<h2 id=\"ai-tools-in-vs-code\" style=\"position:relative;\">AI tools in VS Code<a href=\"#ai-tools-in-vs-code\" aria-label=\"ai tools in vs code permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>GitHub Copilot is a coding assistant integrated into VS Code. It can suggest code as you type, answer questions about files and, in Agent mode, edit files and run commands in the open project. See the official <a href=\"https://code.visualstudio.com/docs/copilot/overview\" target=\"_blank\" rel=\"noopener noreferrer\">GitHub Copilot overview for VS Code</a> for a fuller introduction.</p>\n<h3 id=\"the-agent-view\" style=\"position:relative;\">The Agent view<a href=\"#the-agent-view\" aria-label=\"the agent view permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h3>\n<p>Open the Chat or Agents view from the chat icon in the VS Code title bar. Select <strong>Agent</strong> mode. An agent can inspect the files in the folder you have open, create and modify files, and use the terminal to set up or run the project. It may pause to ask for permission before running a command or installing something.</p>\n<p>You direct the work through messages in this view. You can ask for an implementation, continue the conversation with a changed requirement, or ask the agent to explain what it did. Keep the relevant project folder open so the agent has the right context.</p>\n<div><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;\"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/programming-digital-humanities/static/6db94b0b7b27c3d477496d9bc6422360/7e117/chat.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 63.91304347826087%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAACFklEQVQozz2SWY6kMBBE6x4NGG/pfcPspoAqptX3v9GImtY8xZflcIYy/PBea6UFSKX0r6QyH7TWShnGOIAQQgAA5wAgYkxaGynlA+PWe98PvY/BOeusdEZ6IxkhxthlWaZpzrkfx2kcp5QyY4wQSikFEA9KqVTSeEMFtBgh0tZN9fVV1XWdUtr3o5Qt5945F0J0H6x1xljvw4MQjAjjxscYhj4bKYBzzoEQ6n1Y1zKO4zwvpZRlWUrZtm3b9+PznH8ghDDGFrig1AjQUmkASkjbIGPsNN2xx3Fa1zIMo/chhBhCjDHdZkIIatuWtIRhygnCGCHUNE1dV9a6eV6U0kJIAME5MMb/i3N4YIwxoXlc9mNf5il613nHOVRVpbXZtueyrH0/WOu0NkoZa25JqRjjtxkhlLs49UMK2dyXFOe8rmsAOI7zPF+v13tdS9flLvcppi53KXVam0/spuGcd8FaZ0GAkJJx3jQNgHje7Odx7/y5baWU/oPW5q7qNiNEGc3JdzlIrQRwKQTGWAhZyrbMa5+7nELfhb6LQ59SDAD3n/mNTSlNIRitpZQKKMVtXddCqmle8zD62FkfXYgpRR+SdTHcJ+F3MiY8hiDl3TEwQtq2qqqYup+fn+t6f3//ua7rOI7X69z3vXzqHsbpQSlp25bdwxr0j6ZBLarr2oX0el/H+Xq9r+25/1N5Ps/3db6ved3+AsEMiBrvDGVvAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/programming-digital-humanities/static/6db94b0b7b27c3d477496d9bc6422360/a0b58/chat.webp 230w,\n/programming-digital-humanities/static/6db94b0b7b27c3d477496d9bc6422360/bc10c/chat.webp 460w,\n/programming-digital-humanities/static/6db94b0b7b27c3d477496d9bc6422360/966d8/chat.webp 920w,\n/programming-digital-humanities/static/6db94b0b7b27c3d477496d9bc6422360/445df/chat.webp 1380w,\n/programming-digital-humanities/static/6db94b0b7b27c3d477496d9bc6422360/0a3b3/chat.webp 1715w\"\n              sizes=\"(max-width: 920px) 100vw, 920px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/programming-digital-humanities/static/6db94b0b7b27c3d477496d9bc6422360/81c8e/chat.png 230w,\n/programming-digital-humanities/static/6db94b0b7b27c3d477496d9bc6422360/08a84/chat.png 460w,\n/programming-digital-humanities/static/6db94b0b7b27c3d477496d9bc6422360/c0255/chat.png 920w,\n/programming-digital-humanities/static/6db94b0b7b27c3d477496d9bc6422360/b1001/chat.png 1380w,\n/programming-digital-humanities/static/6db94b0b7b27c3d477496d9bc6422360/7e117/chat.png 1715w\"\n            sizes=\"(max-width: 920px) 100vw, 920px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/programming-digital-humanities/static/6db94b0b7b27c3d477496d9bc6422360/c0255/chat.png\"\n            alt=\"The Copilot Chat and Agent view in VS Code\"\n            title=\"The Copilot Chat and Agent view in VS Code\"\n            loading=\"lazy\"\n            decoding=\"async\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></div>\n<h3 id=\"code-completions\" style=\"position:relative;\">Code completions<a href=\"#code-completions\" aria-label=\"code completions permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h3>\n<p>Copilot may also suggest code as grey “ghost text” while you type. Press <strong>Tab</strong> to accept a suggestion or <strong>Esc</strong> to reject it. Accepted suggestions become ordinary code in your file; they still need to be read and understood.</p>\n<div><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 920px; margin-bottom: 1rem;\"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/8f1fd/auto_suggestion.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 56.95652173913044%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAAByUlEQVQoz4WTXW7UMBSFZxNMoU1sx7GT+D8/7bTQBfDKCnhkTez2Q/GkUyFAPBxZurKPvnvu9UlKRSsEvR3xwRPLwhQdcZsJyTPaEWsH7GDpug4hBFLKf+rUtoLm4RNaCvwoKWVEhxUdZ0LZsHGhsxN6GOiXhHEB42bM4DHBY/baGDB+wU6eU681992AyK+oqaBUhx4TdpjIyTGnxGBGdHRY55FCopRE9x1dr1CdrLUbobw/8+HpG+fvP1Fff6CkwFjHHFaiC8S8MYQVGxJDWrEu45MnXTL5ZSYWT6cU4jA9GWMRzQPP28I6F9Z1JeeEMaZeaNsGKVpEK2ibpma4P37TTifkUdsNrbW1zRAi87LgnKOUmcvThVQyj48LZfuMLxtp21ifnjHOXfPUFiWvhreWtdYVOecrnXPTlTJFbFoZ48qYnxlcIF9eyZcv9Du9UuwbIo+p31retq22t22PlFKqdsr94j41lxdyDtg4o+1Up9xPgd4lOjMiRPu7YdM0db92qnVZ8P46yV73qBp2e+T2N71N9z3X0/l8rkUfIjGVarjHUKP4zyKLw+zNsBLe3X28/hRXqlTXVbLuOMUtI3Hs2/tjIf40/AVR8TsT4J74fgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/a0b58/auto_suggestion.webp 230w,\n/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/bc10c/auto_suggestion.webp 460w,\n/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/966d8/auto_suggestion.webp 920w,\n/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/445df/auto_suggestion.webp 1380w,\n/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/78de1/auto_suggestion.webp 1840w,\n/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/c5daa/auto_suggestion.webp 2528w\"\n              sizes=\"(max-width: 920px) 100vw, 920px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/81c8e/auto_suggestion.png 230w,\n/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/08a84/auto_suggestion.png 460w,\n/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/c0255/auto_suggestion.png 920w,\n/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/b1001/auto_suggestion.png 1380w,\n/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/161ec/auto_suggestion.png 1840w,\n/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/8f1fd/auto_suggestion.png 2528w\"\n            sizes=\"(max-width: 920px) 100vw, 920px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/programming-digital-humanities/static/167d265000e7a152bef8bdbb3dcec747/c0255/auto_suggestion.png\"\n            alt=\"A grey Copilot code-completion suggestion\"\n            title=\"A grey Copilot code-completion suggestion\"\n            loading=\"lazy\"\n            decoding=\"async\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></div>\n<h3 id=\"turning-copilot-on-and-off\" style=\"position:relative;\">Turning Copilot on and off<a href=\"#turning-copilot-on-and-off\" aria-label=\"turning copilot on and off permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h3>\n<p>Use the Copilot menu in the VS Code status bar to enable or disable its features. You will use Copilot in Part 0, turn its code-generation features off during the manual exercises in Parts 1–4, and turn them back on when agent-assisted work begins in Part 5. See <a href=\"https://code.visualstudio.com/docs/copilot/getting-started\" target=\"_blank\" rel=\"noopener noreferrer\">Getting started with GitHub Copilot</a> if the extension, sign-in or controls do not appear as expected.</p>\n<div><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 382px; margin-bottom: 1rem;\"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/programming-digital-humanities/static/c53877af5a76aed128fb024e5bfc65c3/77edc/enable.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 51.30434782608696%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAABdklEQVQoz42S167CQAxE9yuoIfTeqwRCvJBA6EW0//+RuTqWwuMVDyt7187YMxNXq9XU6/XU7XY1HA7VarXUbDZVKBR+Ovl83uJoNFK1WpUD6HQ6ab1e63K56Hg8KoqinwF931epVNJms1Gn05FjQrFYtJPJZGyi53nWyMnlcv8eQInZbNb6HZTZaD6fKwxDy9/vt1arlc7nsw6Hg263m16vl0Xu2+3W6o/Hwzaj/36/azKZyFUqFY3HY+MPeLvdNk3J0RJNB4OB0SGnTuQgF3R5o6der8uVy2UzgweAGo2GNdLU7/ftDjA5dfLYSIzgu9hIA6TI2oBCA0qfz0eLxUK73c5oQ/f5fOp6vdqdd0xEHozc7/dGeTabybEy6GyKGel0WqlUygTmjlHEZDKpRCJhNXp4J8cMTKEHQ21DNIQCk9kEcxA+zvmVqCE+DNiUyGbQZTh/CY6bhggOf+J0Ov1qiEaxScvlUkEQ2PBYO2TCTADj//IPYPI3AiAWo6UAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/programming-digital-humanities/static/c53877af5a76aed128fb024e5bfc65c3/a0b58/enable.webp 230w,\n/programming-digital-humanities/static/c53877af5a76aed128fb024e5bfc65c3/c5024/enable.webp 382w\"\n              sizes=\"(max-width: 382px) 100vw, 382px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/programming-digital-humanities/static/c53877af5a76aed128fb024e5bfc65c3/81c8e/enable.png 230w,\n/programming-digital-humanities/static/c53877af5a76aed128fb024e5bfc65c3/77edc/enable.png 382w\"\n            sizes=\"(max-width: 382px) 100vw, 382px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/programming-digital-humanities/static/c53877af5a76aed128fb024e5bfc65c3/77edc/enable.png\"\n            alt=\"Copilot enable and disable controls in VS Code\"\n            title=\"Copilot enable and disable controls in VS Code\"\n            loading=\"lazy\"\n            decoding=\"async\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></div>\n<h2 id=\"build-the-first-artifact\" style=\"position:relative;\">Build the first artifact<a href=\"#build-the-first-artifact\" aria-label=\"build the first artifact permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Imagine a small local heritage archive containing photographs, drawings, maps, sound recordings and everyday objects such as notebooks and tickets. The data for this experiment is a fictional catalogue of 100 such items. Each record describes one item: its title, the collection it belongs to, a subject category, a year and, where known, its creator and place. Tags describe themes such as family, transport or local history. Some details are missing, as they often are in real catalogues.</p>\n<p>The application you build will let you explore this catalogue. Choosing the Photographs collection, for example, should show only its items in the table and count how many there are. The chart will show how those photographs are divided among subjects such as portraits, nature and urban life. A collection describes the kind of material, while a category describes its subject: both a photograph and a drawing can depict a landscape. The app displays catalogue descriptions, not the photographs or recordings themselves, and any patterns you see belong to this invented dataset.</p>\n<p>Create an empty folder for this experiment and open that folder in VS Code. Open the Agent view as described above and paste the following request:</p>\n<blockquote>\n<p>First, help me understand what the data contains: inspect the CSV linked below and explain in plain language what its records describe, what information is available and what is missing. Then, build a small local Streamlit application in this folder. Use the Python installation already available on this computer: do not install or replace Python system-wide. Create an isolated environment inside this project and record its dependencies. Download the frozen CSV data from <code class=\"language-text\">https://rage.github.io/programming-digital-humanities/opening-artifact/records.csv</code>, save a local copy in the project and record the source URL. Show a collection selector with an <code class=\"language-text\">all</code> option, the number of displayed records, a table of the displayed records and a bar chart of displayed records by category. Keep calculations separate from interface layout, add small checks for the returned metric, table rows and chart data, and give me the exact commands for running the checks and application. Check whether the required local tools are available, tell me about any manual step I must do, and then implement and run the application.</p>\n</blockquote>\n<p>Follow the agent's setup instructions and use the application. Then request this mechanical change:</p>\n<blockquote>\n<p>Add an optional minimum-year control. It must affect the displayed count, table and chart. Blank year values mean the year is unknown: include those records when no minimum is set, and exclude them when a minimum is set. If no records match, show zero, an empty table and an empty chart without crashing. Update and run the relevant checks, then summarize the changed files.</p>\n</blockquote>\n<p>Try an ordinary selection and one which produces no records. At this point, use the running application and the agent's account to judge the result. You are not expected to understand the generated code yet.</p>\n<h2 id=\"a-convincing-account-is-not-the-changed-program\" style=\"position:relative;\">A convincing account is not the changed program<a href=\"#a-convincing-account-is-not-the-changed-program\" aria-label=\"a convincing account is not the changed program permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Suppose an agent reports:</p>\n<blockquote>\n<p>Added the minimum-year filter throughout the dashboard. The metric, table and chart now update together, and all tests pass.</p>\n</blockquote>\n<p>The application opens and the count and table look correct. The actual change however contains these code changes:</p>\n<div class=\"gatsby-highlight\" data-language=\"diff\"><pre class=\"language-diff\"><code class=\"language-diff\"><span class=\"token unchanged\"><span class=\"token prefix unchanged\"> </span>active_records = filter_collection(records, selected_collection)\n</span><span class=\"token inserted-sign inserted\"><span class=\"token prefix inserted\">+</span>visible_records = filter_minimum_year(active_records, minimum_year)\n</span>\n<span class=\"token deleted-sign deleted\"><span class=\"token prefix deleted\">-</span>metrics = make_metrics(active_records)\n<span class=\"token prefix deleted\">-</span>table_rows = make_table(active_records)\n</span><span class=\"token inserted-sign inserted\"><span class=\"token prefix inserted\">+</span>metrics = make_metrics(visible_records)\n<span class=\"token prefix inserted\">+</span>table_rows = make_table(visible_records)\n</span><span class=\"token unchanged\"><span class=\"token prefix unchanged\"> </span>chart_series = make_chart(active_records)</span></code></pre></div>\n<p>Importantly, the agent has forgotten to update the chart to use <code class=\"language-text\">visible_records</code>, which results in the chart showing different data than the count and table. What this example shows is that an agent's explanation and verification work can be useful, but they remain <em>the agent's claim</em> about the implementation. The difference in code versions is the primary evidence of what really changed and how things work.</p>\n<h2 id=\"three-kinds-of-evidence\" style=\"position:relative;\">Three kinds of evidence<a href=\"#three-kinds-of-evidence\" aria-label=\"three kinds of evidence permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<ul>\n<li><strong>Conversational claim:</strong> what the agent says it changed or verified.</li>\n<li><strong>Implementation evidence:</strong> the changed code and the surrounding callers which determine how it is used.</li>\n<li><strong>Behavioural evidence:</strong> actual returned values, checks and observed application behaviour.</li>\n</ul>\n<p>Agents can help inspect all three. Learning programming gives you another basis for judging whether the explanation matches the artifact it describes.</p>\n<p>If not having to trust the agent through being able to examine these kinds of evidence seems useful, then this course is for you. If you are satisfied with the agent's account and the running application, then you may not need to learn programming.</p>\n<h2 id=\"what-the-rest-of-the-course-adds\" style=\"position:relative;\">What the rest of the course adds<a href=\"#what-the-rest-of-the-course-adds\" aria-label=\"what the rest of the course adds permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Parts 1–4 are completed manually because they teach the minimum building blocks needed to read implementation evidence: values and variables, conditions and loops, functions, and the basic structures used to organise data. Writing small programs yourself helps these concepts become connected knowledge which you can recognize even when a new program uses unfamiliar names or serves a different purpose.</p>\n<p>Parts 5–8 then develop two abilities together. They show how those building blocks compose into larger units, while gradually introducing collaboration with a coding agent:</p>\n<ol>\n<li><strong>Part 5 — transformations in memory:</strong> lists and dictionaries become tables, named records and lookup structures. Several small functions begin to cooperate, so you can trace how a record changes between an input and a result.</li>\n<li><strong>Part 6 — pipelines around files:</strong> data crosses program boundaries. You separate <strong>ingest</strong>, <strong>validate</strong>, <strong>transform</strong>, <strong>summarize</strong> and <strong>present</strong> stages so that parsed values, intermediate results and written output can each be inspected.</li>\n<li><strong>Part 7 — libraries within the pipeline:</strong> dataframe and analytical libraries take responsibility for substantial operations. You follow the objects passed between project code and library calls, and then onward to tables, metrics and charts.</li>\n<li><strong>Part 8 — a complete local application:</strong> you return to the artifact created here, ask an agent for a bounded modification, and use the code structure and its behaviour to decide whether the change does what was requested.</li>\n</ol>\n<h2 id=\"decide-whether-to-continue\" style=\"position:relative;\">Decide whether to continue<a href=\"#decide-whether-to-continue\" aria-label=\"decide whether to continue permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>You have now seen both sides of agent-first programming:</p>\n<ul>\n<li>a useful application can be created and changed without first learning to code;</li>\n<li>a plausible explanation and a partly working interface do not necessarily reveal everything the changed program does.</li>\n</ul>\n<p>Continue to Part 1 if you want to learn how to inspect that implementation evidence yourself, describe code-level changes more precisely, or follow how values move through a larger program. The course is not premised on replacing the agent by writing everything manually forever. The manual foundation makes later collaboration less dependent on taking the agent's account on trust.</p>\n<h2 id=\"before-continuing-to-part-1\" style=\"position:relative;\">Before continuing to Part 1<a href=\"#before-continuing-to-part-1\" aria-label=\"before continuing to part 1 permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Keep the folder the agent created: you will return to this application later in the course.</p>\n<p>Parts 1–4 are manual programming practice. Before beginning Part 1, use the Copilot menu described above to turn off code completions, and do not ask the coding agent to generate exercise solutions. You will turn these features back on when the agent-assisted exercise modes begin in Part 5. The <a href=\"/programming-digital-humanities/ai-tutor\">course AI tutor</a> remains available for conceptual help.</p>","frontmatter":{"path":"/part-0/","title":"Part 0: See what an agent can build"},"fileAbsolutePath":"/home/runner/work/programming-digital-humanities/programming-digital-humanities/data/part-0/index.md"},"allPages":{"edges":[{"node":{"id":"5d899565-03f0-55ea-8073-4ee194950c4d","frontmatter":{"path":"/ai-tutor/","title":"Using the AI tutor on the course"},"moocfiExercises":[]}},{"node":{"id":"c6198176-c061-5cca-a182-cc80cdb14e38","frontmatter":{"path":"/all-exercises/","title":"All exercises"},"moocfiExercises":[]}},{"node":{"id":"6c2bb78f-1497-5d72-a964-8cb55e47559e","frontmatter":{"path":"/error_messages/","title":"Common error messages"},"moocfiExercises":[]}},{"node":{"id":"96430bcf-4526-5d85-9206-c7336a6be270","frontmatter":{"path":"/faq/","title":"Frequently asked questions"},"moocfiExercises":[]}},{"node":{"id":"0d6f8da4-7d4f-5228-a832-7ff574e63570","frontmatter":{"path":"/frontmatter-guide","title":"Frontmatter-guide"},"moocfiExercises":[]}},{"node":{"id":"249c8a64-20fb-510c-8b3e-f5b3b72fe028","frontmatter":{"path":"/grading/","title":"Grading"},"moocfiExercises":[]}},{"node":{"id":"5b5e6522-0d23-577b-9ba9-4ecd1c1c5d24","frontmatter":{"path":"/","title":"About this course"},"moocfiExercises":[]}},{"node":{"id":"bcdb2bdc-e92c-5c75-8dd1-13f57e1129da","frontmatter":{"path":"/glossary","title":"Glossary"},"moocfiExercises":[]}},{"node":{"id":"d54c2afb-004d-500e-9d19-aa3d154a39a5","frontmatter":{"path":"/part-0/","title":"Part 0: See what an agent can build"},"moocfiExercises":[]}},{"node":{"id":"fff8e65b-0281-55fe-a21a-9e7e872ddc33","frontmatter":{"path":"/part-1/1-getting-started/","title":"Getting started"},"moocfiExercises":[{"id":"Emoticon","type":"programming-exercise","parentPagePath":"/part-1/1-getting-started/"},{"id":"Fix the code: Seven Brothers","type":"programming-exercise","parentPagePath":"/part-1/1-getting-started/"},{"id":"Row, Row, Row Your Boat","type":"programming-exercise","parentPagePath":"/part-1/1-getting-started/"},{"id":"Minutes in a year","type":"programming-exercise","parentPagePath":"/part-1/1-getting-started/"},{"id":"Print some code","type":"programming-exercise","parentPagePath":"/part-1/1-getting-started/"}]}},{"node":{"id":"9fa0a7fc-c673-56ad-9dc8-bf6aeb6d3b05","frontmatter":{"path":"/part-1/2-information-from-the-user/","title":"Information from the user"},"moocfiExercises":[{"id":"Name twice","type":"programming-exercise","parentPagePath":"/part-1/2-information-from-the-user/"},{"id":"Name and exclamation marks","type":"programming-exercise","parentPagePath":"/part-1/2-information-from-the-user/"},{"id":"Name and address","type":"programming-exercise","parentPagePath":"/part-1/2-information-from-the-user/"},{"id":"Fix the code: Utterances","type":"programming-exercise","parentPagePath":"/part-1/2-information-from-the-user/"},{"id":"Story","type":"programming-exercise","parentPagePath":"/part-1/2-information-from-the-user/"}]}},{"node":{"id":"c2286d4a-4cf7-5fc4-ab0f-f7cd2acf49df","frontmatter":{"path":"/part-1/3-more-about-variables/","title":"More about variables"},"moocfiExercises":[{"id":"Extra space","type":"programming-exercise","parentPagePath":"/part-1/3-more-about-variables/"},{"id":"Arithmetics","type":"programming-exercise","parentPagePath":"/part-1/3-more-about-variables/"},{"id":"Fix the code: Print a single line","type":"programming-exercise","parentPagePath":"/part-1/3-more-about-variables/"}]}},{"node":{"id":"3ebadf79-0e16-5ed7-bcb2-bec3731cffc2","frontmatter":{"path":"/part-1/4-arithmetic-operations/","title":"Arithmetic operations"},"moocfiExercises":[{"id":"Times five","type":"programming-exercise","parentPagePath":"/part-1/4-arithmetic-operations/"},{"id":"Name and age","type":"programming-exercise","parentPagePath":"/part-1/4-arithmetic-operations/"},{"id":"Seconds in a day","type":"programming-exercise","parentPagePath":"/part-1/4-arithmetic-operations/"},{"id":"Fix the code: Product","type":"programming-exercise","parentPagePath":"/part-1/4-arithmetic-operations/"},{"id":"Sum and product","type":"programming-exercise","parentPagePath":"/part-1/4-arithmetic-operations/"},{"id":"Sum and mean","type":"programming-exercise","parentPagePath":"/part-1/4-arithmetic-operations/"},{"id":"Food expenditure","type":"programming-exercise","parentPagePath":"/part-1/4-arithmetic-operations/"}]}},{"node":{"id":"c77004ff-fe4d-5533-b77f-c861fa42430d","frontmatter":{"path":"/part-1/5-conditional-statements/","title":"Conditional statements"},"moocfiExercises":[{"id":"Orwell","type":"programming-exercise","parentPagePath":"/part-1/5-conditional-statements/"},{"id":"Absolute value","type":"programming-exercise","parentPagePath":"/part-1/5-conditional-statements/"},{"id":"Soup or no soup","type":"programming-exercise","parentPagePath":"/part-1/5-conditional-statements/"},{"id":"Order of magnitude","type":"programming-exercise","parentPagePath":"/part-1/5-conditional-statements/"},{"id":"Calculator","type":"programming-exercise","parentPagePath":"/part-1/5-conditional-statements/"},{"id":"Temperatures","type":"programming-exercise","parentPagePath":"/part-1/5-conditional-statements/"},{"id":"Daily wages","type":"programming-exercise","parentPagePath":"/part-1/5-conditional-statements/"},{"id":"Loyalty bonus","type":"programming-exercise","parentPagePath":"/part-1/5-conditional-statements/"},{"id":"What to wear tomorrow","type":"programming-exercise","parentPagePath":"/part-1/5-conditional-statements/"}]}},{"node":{"id":"50ee91dc-7fe8-508d-940f-577449a335f4","frontmatter":{"path":"/part-1/","title":"Part 1"},"moocfiExercises":[]}},{"node":{"id":"d963c6b4-b2d4-59ff-b310-265b28e2c8d2","frontmatter":{"path":"/part-2/1-programming-terminology/","title":"Programming terminology"},"moocfiExercises":[{"id":"Fix the syntax","type":"programming-exercise","parentPagePath":"/part-2/1-programming-terminology/"},{"id":"Number of characters","type":"programming-exercise","parentPagePath":"/part-2/1-programming-terminology/"},{"id":"Typecasting","type":"programming-exercise","parentPagePath":"/part-2/1-programming-terminology/"}]}},{"node":{"id":"075f597d-a49f-59c1-ad1a-d68ba19aa0f4","frontmatter":{"path":"/part-2/2-else-elif/","title":"More conditionals"},"moocfiExercises":[{"id":"Age of maturity","type":"programming-exercise","parentPagePath":"/part-2/2-else-elif/"},{"id":"Greater than or equal to","type":"programming-exercise","parentPagePath":"/part-2/2-else-elif/"},{"id":"The elder","type":"programming-exercise","parentPagePath":"/part-2/2-else-elif/"},{"id":"Alphabetically last","type":"programming-exercise","parentPagePath":"/part-2/2-else-elif/"}]}},{"node":{"id":"26776fa9-27c7-5554-990b-09d6661a07a8","frontmatter":{"path":"/part-2/3-combining-conditions/","title":"Combining conditions"},"moocfiExercises":[{"id":"Age check","type":"programming-exercise","parentPagePath":"/part-2/3-combining-conditions/"},{"id":"Nephews","type":"programming-exercise","parentPagePath":"/part-2/3-combining-conditions/"},{"id":"Grades and points","type":"programming-exercise","parentPagePath":"/part-2/3-combining-conditions/"},{"id":"FizzBuzz","type":"programming-exercise","parentPagePath":"/part-2/3-combining-conditions/"},{"id":"Leap year","type":"programming-exercise","parentPagePath":"/part-2/3-combining-conditions/"},{"id":"Alphabetically in the middle","type":"programming-exercise","parentPagePath":"/part-2/3-combining-conditions/"},{"id":"Gift tax calculator","type":"programming-exercise","parentPagePath":"/part-2/3-combining-conditions/"}]}},{"node":{"id":"1da4e234-e81f-5494-b2d4-96e30cbb4464","frontmatter":{"path":"/part-2/4-simple-loops/","title":"Simple loops"},"moocfiExercises":[{"id":"Shall we continue?","type":"programming-exercise","parentPagePath":"/part-2/4-simple-loops/"},{"id":"Input validation","type":"programming-exercise","parentPagePath":"/part-2/4-simple-loops/"},{"id":"Fix the code: Countdown","type":"programming-exercise","parentPagePath":"/part-2/4-simple-loops/"},{"id":"Repeat password","type":"programming-exercise","parentPagePath":"/part-2/4-simple-loops/"},{"id":"PIN and number of attempts","type":"programming-exercise","parentPagePath":"/part-2/4-simple-loops/"},{"id":"The next leap year","type":"programming-exercise","parentPagePath":"/part-2/4-simple-loops/"},{"id":"Story","type":"programming-exercise","parentPagePath":"/part-2/4-simple-loops/"},{"id":"Working with numbers","type":"programming-exercise","parentPagePath":"/part-2/4-simple-loops/"}]}},{"node":{"id":"db78d781-f405-5904-91bf-e96f7f04353f","frontmatter":{"path":"/part-2/","title":"Part 2"},"moocfiExercises":[]}},{"node":{"id":"10808e92-b68f-58c3-b767-cf5e9c0efeb7","frontmatter":{"path":"/part-3/1-loops-with-conditions/","title":"Loops with conditions"},"moocfiExercises":[{"id":"Print numbers","type":"programming-exercise","parentPagePath":"/part-3/1-loops-with-conditions/"},{"id":"Fix the code: Countdown","type":"programming-exercise","parentPagePath":"/part-3/1-loops-with-conditions/"},{"id":"Numbers","type":"programming-exercise","parentPagePath":"/part-3/1-loops-with-conditions/"},{"id":"Powers of two","type":"programming-exercise","parentPagePath":"/part-3/1-loops-with-conditions/"},{"id":"Population growth","type":"programming-exercise","parentPagePath":"/part-3/1-loops-with-conditions/"},{"id":"The sum of consecutive numbers, version 1","type":"programming-exercise","parentPagePath":"/part-3/1-loops-with-conditions/"},{"id":"The sum of consecutive numbers, version 2","type":"programming-exercise","parentPagePath":"/part-3/1-loops-with-conditions/"}]}},{"node":{"id":"bceed420-a129-52a7-81ed-dafd67ad38df","frontmatter":{"path":"/part-3/2-working-with-strings/","title":"Working with strings"},"moocfiExercises":[{"id":"String multiplied","type":"programming-exercise","parentPagePath":"/part-3/2-working-with-strings/"},{"id":"The longer string","type":"programming-exercise","parentPagePath":"/part-3/2-working-with-strings/"},{"id":"End to beginning","type":"programming-exercise","parentPagePath":"/part-3/2-working-with-strings/"},{"id":"Second and second to last characters","type":"programming-exercise","parentPagePath":"/part-3/2-working-with-strings/"},{"id":"A line of hashes","type":"programming-exercise","parentPagePath":"/part-3/2-working-with-strings/"},{"id":"A rectangle of hashes","type":"programming-exercise","parentPagePath":"/part-3/2-working-with-strings/"},{"id":"Underlining","type":"programming-exercise","parentPagePath":"/part-3/2-working-with-strings/"},{"id":"Right-aligned","type":"programming-exercise","parentPagePath":"/part-3/2-working-with-strings/"},{"id":"A labelled frame","type":"programming-exercise","parentPagePath":"/part-3/2-working-with-strings/"},{"id":"Substrings, part 1","type":"programming-exercise","parentPagePath":"/part-3/2-working-with-strings/"},{"id":"Substrings, part 2","type":"programming-exercise","parentPagePath":"/part-3/2-working-with-strings/"},{"id":"Does it contain vowels","type":"programming-exercise","parentPagePath":"/part-3/2-working-with-strings/"},{"id":"Find the first substring","type":"programming-exercise","parentPagePath":"/part-3/2-working-with-strings/"},{"id":"Find all the substrings","type":"programming-exercise","parentPagePath":"/part-3/2-working-with-strings/"},{"id":"Continue a search","type":"programming-exercise","parentPagePath":"/part-3/2-working-with-strings/"}]}},{"node":{"id":"e2dfd9d3-07fa-59a0-b748-370355606256","frontmatter":{"path":"/part-3/3-more-loops/","title":"More loops"},"moocfiExercises":[{"id":"Multiplication","type":"programming-exercise","parentPagePath":"/part-3/3-more-loops/"},{"id":"First letters of words","type":"programming-exercise","parentPagePath":"/part-3/3-more-loops/"},{"id":"Count characters in several texts","type":"programming-exercise","parentPagePath":"/part-3/3-more-loops/"},{"id":"Flip the pairs","type":"programming-exercise","parentPagePath":"/part-3/3-more-loops/"}]}},{"node":{"id":"5b546d28-ac00-564f-9d75-cc09c4382b64","frontmatter":{"path":"/part-3/4-defining-functions/","title":"Defining functions"},"moocfiExercises":[{"id":"Seven Brothers","type":"programming-exercise","parentPagePath":"/part-3/4-defining-functions/"},{"id":"The first character","type":"programming-exercise","parentPagePath":"/part-3/4-defining-functions/"},{"id":"Mean","type":"programming-exercise","parentPagePath":"/part-3/4-defining-functions/"},{"id":"Print many times","type":"programming-exercise","parentPagePath":"/part-3/4-defining-functions/"},{"id":"A square of hashes","type":"programming-exercise","parentPagePath":"/part-3/4-defining-functions/"},{"id":"Chessboard","type":"programming-exercise","parentPagePath":"/part-3/4-defining-functions/"}]}},{"node":{"id":"12122cff-c09e-53f1-8b76-8517f845e08c","frontmatter":{"path":"/part-3/","title":"Part 3"},"moocfiExercises":[]}},{"node":{"id":"8fbb5845-152f-5be7-ac92-fa280093b2a2","frontmatter":{"path":"/part-4/1-vscode/","title":"The Visual Studio Code editor, Python interpreter and built-in debugging tool"},"moocfiExercises":[{"id":"Hello Visual Studio Code","type":"programming-exercise","parentPagePath":"/part-4/1-vscode/"}]}},{"node":{"id":"b8d090a9-7e49-5ab7-a5a1-d126179dd9a0","frontmatter":{"path":"/part-4/2-more-functions/","title":"More functions"},"moocfiExercises":[{"id":"Line","type":"programming-exercise","parentPagePath":"/part-4/2-more-functions/"},{"id":"A box of hashes","type":"programming-exercise","parentPagePath":"/part-4/2-more-functions/"},{"id":"A square of hashes","type":"programming-exercise","parentPagePath":"/part-4/2-more-functions/"},{"id":"A square","type":"programming-exercise","parentPagePath":"/part-4/2-more-functions/"},{"id":"A triangle","type":"programming-exercise","parentPagePath":"/part-4/2-more-functions/"},{"id":"A shape","type":"programming-exercise","parentPagePath":"/part-4/2-more-functions/"},{"id":"Progress stages","type":"programming-exercise","parentPagePath":"/part-4/2-more-functions/"},{"id":"The greatest number","type":"programming-exercise","parentPagePath":"/part-4/2-more-functions/"},{"id":"Same characters","type":"programming-exercise","parentPagePath":"/part-4/2-more-functions/"},{"id":"First, second and last words","type":"programming-exercise","parentPagePath":"/part-4/2-more-functions/"}]}},{"node":{"id":"271308ca-b267-5c86-8051-8a1a3480cfcb","frontmatter":{"path":"/part-4/3-lists/","title":"Lists"},"moocfiExercises":[{"id":"Change the value of an item","type":"programming-exercise","parentPagePath":"/part-4/3-lists/"},{"id":"Add items to a list","type":"programming-exercise","parentPagePath":"/part-4/3-lists/"},{"id":"Addition and removal","type":"programming-exercise","parentPagePath":"/part-4/3-lists/"},{"id":"Same word twice","type":"programming-exercise","parentPagePath":"/part-4/3-lists/"},{"id":"List twice","type":"programming-exercise","parentPagePath":"/part-4/3-lists/"},{"id":"The length of a list","type":"programming-exercise","parentPagePath":"/part-4/3-lists/"},{"id":"Arithmetic mean","type":"programming-exercise","parentPagePath":"/part-4/3-lists/"},{"id":"The range of a list","type":"programming-exercise","parentPagePath":"/part-4/3-lists/"}]}},{"node":{"id":"e5a8fd16-890d-509e-9666-9c622648c18a","frontmatter":{"path":"/part-4/4-definite-iteration/","title":"Definite iteration"},"moocfiExercises":[{"id":"Star-studded","type":"programming-exercise","parentPagePath":"/part-4/4-definite-iteration/"},{"id":"From negative to positive","type":"programming-exercise","parentPagePath":"/part-4/4-definite-iteration/"},{"id":"List of stars","type":"programming-exercise","parentPagePath":"/part-4/4-definite-iteration/"},{"id":"Anagrams","type":"programming-exercise","parentPagePath":"/part-4/4-definite-iteration/"},{"id":"Palindromes","type":"programming-exercise","parentPagePath":"/part-4/4-definite-iteration/"},{"id":"The sum of positive numbers","type":"programming-exercise","parentPagePath":"/part-4/4-definite-iteration/"},{"id":"Even numbers","type":"programming-exercise","parentPagePath":"/part-4/4-definite-iteration/"},{"id":"The sum of lists","type":"programming-exercise","parentPagePath":"/part-4/4-definite-iteration/"},{"id":"Distinct numbers","type":"programming-exercise","parentPagePath":"/part-4/4-definite-iteration/"},{"id":"The length of the longest in the list","type":"programming-exercise","parentPagePath":"/part-4/4-definite-iteration/"},{"id":"The shortest in the list","type":"programming-exercise","parentPagePath":"/part-4/4-definite-iteration/"},{"id":"All the longest in the list","type":"programming-exercise","parentPagePath":"/part-4/4-definite-iteration/"}]}},{"node":{"id":"ca4caea3-eaad-5cc3-a1fa-83b9bb90a25e","frontmatter":{"path":"/part-4/5-strings-and-lists/","title":"More strings and lists"},"moocfiExercises":[{"id":"Everything reversed","type":"programming-exercise","parentPagePath":"/part-4/5-strings-and-lists/"},{"id":"Most common character","type":"programming-exercise","parentPagePath":"/part-4/5-strings-and-lists/"},{"id":"No vowels allowed","type":"programming-exercise","parentPagePath":"/part-4/5-strings-and-lists/"},{"id":"No shouting allowed","type":"programming-exercise","parentPagePath":"/part-4/5-strings-and-lists/"},{"id":"Longest run in ordered data","type":"programming-exercise","parentPagePath":"/part-4/5-strings-and-lists/"},{"id":"Grade statistics","type":"programming-exercise","parentPagePath":"/part-4/5-strings-and-lists/"}]}},{"node":{"id":"adeebce2-76be-5528-90a1-6feaa066fcd8","frontmatter":{"path":"/part-4/6-data-structures/","title":"Data structures and data shapes"},"moocfiExercises":[{"id":"Build a lookup","type":"programming-exercise","parentPagePath":"/part-4/6-data-structures/"},{"id":"Dashboard summary","type":"programming-exercise","parentPagePath":"/part-4/6-data-structures/"},{"id":"Changed data shape","type":"programming-exercise","parentPagePath":"/part-4/6-data-structures/"}]}},{"node":{"id":"07e761ca-39a1-50a1-97d8-9149e4737e89","frontmatter":{"path":"/part-4/","title":"Part 4"},"moocfiExercises":[]}},{"node":{"id":"80fe5d23-31eb-5ff6-b339-99e173e9279f","frontmatter":{"path":"/part-5/0-working-with-ai/","title":"Working with AI from Part 5 onward"},"moocfiExercises":[]}},{"node":{"id":"111a6af4-b8a7-5d71-8966-f750f6c161a6","frontmatter":{"path":"/part-5/1-tables-as-nested-lists/","title":"Tables as nested lists"},"moocfiExercises":[{"id":"Number of matching elements","type":"programming-exercise","parentPagePath":"/part-5/1-tables-as-nested-lists/"},{"id":"Count labels in a survey table","type":"programming-exercise","parentPagePath":"/part-5/1-tables-as-nested-lists/"},{"id":"Sudoku: check row","type":"programming-exercise","parentPagePath":"/part-5/1-tables-as-nested-lists/"},{"id":"Sudoku: check column","type":"programming-exercise","parentPagePath":"/part-5/1-tables-as-nested-lists/"},{"id":"Sudoku: check block","type":"programming-exercise","parentPagePath":"/part-5/1-tables-as-nested-lists/"},{"id":"Sudoku: check grid","type":"programming-exercise","parentPagePath":"/part-5/1-tables-as-nested-lists/"}]}},{"node":{"id":"7e2cf429-03ea-5e8c-86ce-62c71c689a75","frontmatter":{"path":"/part-5/2-references/","title":"References and transformed results"},"moocfiExercises":[{"id":"Reshape imported rows","type":"programming-exercise","parentPagePath":"/part-5/2-references/"}]}},{"node":{"id":"3901dc36-3116-5444-9120-6b38454e245f","frontmatter":{"path":"/part-5/3-grouping-and-structured-records/","title":"Grouping and structured records"},"moocfiExercises":[{"id":"Histogram","type":"programming-exercise","parentPagePath":"/part-5/3-grouping-and-structured-records/"},{"id":"Movie database","type":"programming-exercise","parentPagePath":"/part-5/3-grouping-and-structured-records/"},{"id":"Find movies by genre","type":"programming-exercise","parentPagePath":"/part-5/3-grouping-and-structured-records/"}]}},{"node":{"id":"076a1db2-8d62-5725-ad72-c43ea25897c6","frontmatter":{"path":"/part-5/4-small-database/","title":"Building a small database"},"moocfiExercises":[{"id":"Courses above a grade","type":"programming-exercise","parentPagePath":"/part-5/4-small-database/"},{"id":"Student database","type":"programming-exercise","parentPagePath":"/part-5/4-small-database/"}]}},{"node":{"id":"cf823ebf-3d67-53ca-8fcf-9b53fee10c1d","frontmatter":{"path":"/part-5/5-in-memory-analysis-pipeline/","title":"An in-memory analysis pipeline"},"moocfiExercises":[{"id":"Longest repetition in melody","type":"programming-exercise","parentPagePath":"/part-5/5-in-memory-analysis-pipeline/"},{"id":"Collection summary","type":"programming-exercise","parentPagePath":"/part-5/5-in-memory-analysis-pipeline/"}]}},{"node":{"id":"92cbc670-d401-53b8-949f-9725b81a5e4a","frontmatter":{"path":"/part-5/","title":"Part 5"},"moocfiExercises":[]}},{"node":{"id":"52ecf5a7-9266-58c8-bac5-407b1a29a9dd","frontmatter":{"path":"/part-6/2-writing-files/","title":"Writing and exporting files"},"moocfiExercises":[{"id":"Export cleaned records","type":"programming-exercise","parentPagePath":"/part-6/2-writing-files/"},{"id":"Course grading, part 4","type":"programming-exercise","parentPagePath":"/part-6/2-writing-files/"},{"id":"Repair a cleaned-record export","type":"programming-exercise","parentPagePath":"/part-6/2-writing-files/"},{"id":"Validate metadata rows","type":"programming-exercise","parentPagePath":"/part-6/2-writing-files/"}]}},{"node":{"id":"a296984d-7503-558e-86da-ddb801f8a59b","frontmatter":{"path":"/part-6/3-scope-of-variables/","title":"Make data flow explicit"},"moocfiExercises":[]}},{"node":{"id":"98bdbc42-0ebc-5f9c-b767-b987266a0040","frontmatter":{"path":"/part-6/4-modules/","title":"Use existing libraries"},"moocfiExercises":[{"id":"Count labels with Counter","type":"programming-exercise","parentPagePath":"/part-6/4-modules/"},{"id":"Hume on identity: word frequencies","type":"programming-exercise","parentPagePath":"/part-6/4-modules/"},{"id":"Special characters","type":"programming-exercise","parentPagePath":"/part-6/4-modules/"},{"id":"CSV rows as dictionaries","type":"programming-exercise","parentPagePath":"/part-6/4-modules/"},{"id":"Langdetect","type":"programming-exercise","parentPagePath":"/part-6/4-modules/"}]}},{"node":{"id":"0ca5c730-bd8e-5099-9768-8fcb8eb0b7b4","frontmatter":{"path":"/part-6/1-reading-files/","title":"Reading files"},"moocfiExercises":[{"id":"Largest number","type":"programming-exercise","parentPagePath":"/part-6/1-reading-files/"},{"id":"Fruit market","type":"programming-exercise","parentPagePath":"/part-6/1-reading-files/"},{"id":"Matrix","type":"programming-exercise","parentPagePath":"/part-6/1-reading-files/"},{"id":"Course grading, part 1","type":"programming-exercise","parentPagePath":"/part-6/1-reading-files/"},{"id":"Course grading, part 2","type":"programming-exercise","parentPagePath":"/part-6/1-reading-files/"},{"id":"Course grading, part 3","type":"programming-exercise","parentPagePath":"/part-6/1-reading-files/"},{"id":"Spell checker","type":"programming-exercise","parentPagePath":"/part-6/1-reading-files/"},{"id":"Recipe search","type":"programming-exercise","parentPagePath":"/part-6/1-reading-files/"},{"id":"City bikes","type":"programming-exercise","parentPagePath":"/part-6/1-reading-files/"},{"id":"Hume on identity: keywords in context","type":"programming-exercise","parentPagePath":"/part-6/1-reading-files/"}]}},{"node":{"id":"11759056-5a15-5820-a693-30f4df62f118","frontmatter":{"path":"/part-6/","title":"Part 6"},"moocfiExercises":[]}},{"node":{"id":"6e748518-2c76-5428-8779-0f0455b17a0d","frontmatter":{"path":"/part-7/0-dataframes-and-views/","title":"Working with pandas dataframes"},"moocfiExercises":[]}},{"node":{"id":"047a5114-7ebb-5a5c-8ed0-eadf81564546","frontmatter":{"path":"/part-7/1-times-and-dates/","title":"Times and dates"},"moocfiExercises":[{"id":"How old","type":"programming-exercise","parentPagePath":"/part-7/1-times-and-dates/"},{"id":"Screen time","type":"programming-exercise","parentPagePath":"/part-7/1-times-and-dates/"}]}},{"node":{"id":"7cc9d1d2-fb68-52da-b5ec-034bf9f4585f","frontmatter":{"path":"/part-7/3-more-features/","title":"More Python features"},"moocfiExercises":[]}},{"node":{"id":"5055044d-7938-5e5d-be5c-dfb0ff2c81b4","frontmatter":{"path":"/part-7/2-data-processing/","title":"Data processing"},"moocfiExercises":[{"id":"Handling JSON files","type":"programming-exercise","parentPagePath":"/part-7/2-data-processing/"},{"id":"Valid PIC?","type":"programming-exercise","parentPagePath":"/part-7/2-data-processing/"},{"id":"Course statistics","type":"programming-exercise","parentPagePath":"/part-7/2-data-processing/"},{"id":"Find similar documents","type":"programming-exercise","parentPagePath":"/part-7/2-data-processing/"},{"id":"Who cheated","type":"programming-exercise","parentPagePath":"/part-7/2-data-processing/"},{"id":"Who cheated, version 2","type":"programming-exercise","parentPagePath":"/part-7/2-data-processing/"},{"id":"Spell checker, version 2","type":"programming-exercise","parentPagePath":"/part-7/2-data-processing/"}]}},{"node":{"id":"cea3f325-56bb-5a93-885e-275e465c1ced","frontmatter":{"path":"/part-7/","title":"Part 7"},"moocfiExercises":[]}},{"node":{"id":"3abea309-839b-562f-bb00-3be40d963200","frontmatter":{"path":"/part-8/","title":"Part 8"},"moocfiExercises":[{"id":"Complete a tutorial","type":"programming-exercise","parentPagePath":"/part-8/"},{"id":"Revisit an AI-built artifact","type":"programming-exercise","parentPagePath":"/part-8/"},{"id":"Submit for grading","type":"programming-exercise","parentPagePath":"/part-8/"}]}}]}},"pageContext":{}},
    "staticQueryHashes": ["1357757885","994120085"]}