{
  "feed_url": "https://gbilder.com/tags/ai/feed.json",
  "home_page_url": "https://gbilder.com/tags/ai/",
  "items": [
    {
      "content_html": "\n  \u003cdiv class=\"e-content\"\u003e\u003cbr/\u003e\n\n            \u003clink rel=\"stylesheet\" href=\"https://gbilder.com/css/vendors/admonitions.min.364ef4282de967778e4920f8ae18cc1b92b0c0b58b34b66fc17619dabfd48b6e.css\" integrity=\"sha256-Nk70KC3pZ3eOSSD4rhjMG5KwwLWLNLZvwXYZ2r/Ui24=\" crossorigin=\"anonymous\"\u003e\n    \u003cdiv class=\"admonition note\"\u003e\n      \u003cdiv class=\"admonition-header\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 576 512\"\u003e\u003cpath d=\"M0 64C0 28.7 28.7 0 64 0L224 0l0 128c0 17.7 14.3 32 32 32l128 0 0 125.7-86.8 86.8c-10.3 10.3-17.5 23.1-21 37.2l-18.7 74.9c-2.3 9.2-1.8 18.8 1.3 27.5L64 512c-35.3 0-64-28.7-64-64L0 64zm384 64l-128 0L256 0 384 128zM549.8 235.7l14.4 14.4c15.6 15.6 15.6 40.9 0 56.6l-29.4 29.4-71-71 29.4-29.4c15.6-15.6 40.9-15.6 56.6 0zM311.9 417L441.1 287.8l71 71L382.9 487.9c-4.1 4.1-9.2 7-14.9 8.4l-60.1 15c-5.5 1.4-11.2-.2-15.2-4.2s-5.6-9.7-4.2-15.2l15-60.1c1.4-5.6 4.3-10.8 8.4-14.9z\"/\u003e\u003c/svg\u003e\n        \u003cspan\u003eNote\u003c/span\u003e\n      \u003c/div\u003e\n      \u003cdiv class=\"admonition-content\"\u003e\n        \u003cp\u003eContext: There seems to be excitement about the \u003ca href=\"https://openai.com/index/helping-websites-express-ai-training-preferences/\"\u003erecent announcement\u003c/a\u003e that several AI companies have agreed to adopt the \u003ca href=\"https://datatracker.ietf.org/doc/draft-kelley-aipref-training-preference-signal/\"\u003eMachine-Readable Training Preference Signal\u003c/a\u003e. And so, in the spirit of \u003ca href=\"https://theonion.com/\"\u003eThe Onion\u003c/a\u003e\u0026hellip;\u003c/p\u003e\n      \u003c/div\u003e\n    \u003c/div\u003e\u003cbr/\u003e\n\u003ch3 id=\"bandits-hail-own-historic-pledge-to-respect-keep-out-signs-on-barns-theyve-already-emptied\"\u003eBandits Hail Own Historic Pledge To Respect “Keep Out” Signs On Barns They’ve Already Emptied\u003c/h3\u003e\n\u003cp\u003eAfter breaking down multiple barn doors and stealing all the horses, the bandits trade association (BTA) has agreed to honor the giant signs on the barn doors reading \u0026ldquo;Private Property: Keep Out!\u0026rdquo;- but only if owners rephrase their signs to read \u0026ldquo;Private Property: We Prefer That You Keep Out,\u0026rdquo; and add small text at the bottom reading \u0026ldquo;This Means You.\u0026rdquo;\u003c/p\u003e\n\u003cp\u003e“Frankly, signs reading ‘Private property’ and ‘keep out’ are vague and open to interpretation,” said BTA spokesperson Henry Plummer. “Does ‘property’ refer to the barn or the horses? Who exactly is supposed to keep out?\u003c/p\u003e\n\u003cp\u003eThe agreement, which the BTA described as a breakthrough in cross-bandit cooperation, is expected to be widely adopted over the next several years. It does not address horses already taken, which Plummer noted had been \u0026ldquo;fully integrated into our herd\u0026rdquo; and could no longer be told apart from one another.\u003c/p\u003e\n\u003cp\u003e\u0026ldquo;We\u0026rsquo;re hopeful this lets everyone put the whole \u0026lsquo;horse theft\u0026rsquo; conversation behind us,\u0026rdquo; Plummer added. \u0026ldquo;At the end of the day, this whole problem was really caused by poor signage\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eCritics of the agreement note that several prominent BTA members have encouraged the agreement but have not yet signed it, saying they are waiting to evaluate it against a competing protocol by the World Wide Wranglers Consortium (W3C) that promises even more precise semantics and a formal ontology of barns, livestock, and theft. This fast-tracked standard is expected to be finalized in 2032.\u003c/p\u003e\n\u003cp\u003eDespite the skeptics, the livestock market rallied on news of the agreement, which analysts said further justifies valuing the bandit industry at ten times the sum total of everything in the economy it has already stolen.\u003c/p\u003e\n\n\n  \u003cdiv class=\"citation\"\u003e\n    \u003cdiv class=\"citation-header\"\u003e\n      \u003cstrong\u003eCite as:\u003c/strong\u003e\n      \u003cbutton class=\"copy-icon\" onclick=\"copyCitation()\" aria-label=\"Copy citation\"\u003e\n        \u003cimg src=\"https://gbilder.com/icons/copy.svg\" alt=\"Copy citation\" width=\"20\" height=\"20\"\u003e\n      \u003c/button\u003e\n    \u003c/div\u003e\n    \u003cp id=\"citation-text\"\u003e\n      \n        \u003ca href=\"https://orcid.org/0000-0003-1315-5960\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eGeoffrey Bilder\u003cimg src=\"https://gbilder.com/ORCID-iD_icon_vector.svg\" alt=\"ORCID iD icon\" width=\"16\" height=\"16\" style=\"margin-left:4px;vertical-align:text-bottom;\"\u003e\n\n          \u003c/a\u003e\n\n        \n      \n      \n        (2026, November 3).\n      \n      \u003ci\u003eBandits Hail Own Historic Pledge To Respect \u0026#39;Keep Out\u0026#39; Signs On Barns They’ve Already Emptied\u003c/i\u003e.\n      Retrieved from \u003ca href=\"https://doi.org/10.59347/1gy01-k3d32\"\u003e\n      https://doi.org/10.59347/1gy01-k3d32\n      \u003c/a\u003e\n    \u003c/p\u003e\n  \u003c/div\u003e\n  \u003cscript\u003e\n    function copyCitation() {\n      const citationText = document.getElementById('citation-text').innerText.replace(/\\s+/g, ' ').trim();\n      navigator.clipboard.writeText(citationText).then(() =\u003e {\n        alert('Citation copied to clipboard!');\n      }).catch(err =\u003e {\n        console.error('Failed to copy citation: ', err);\n      });\n    }\n  \u003c/script\u003e\n\n\n\u003c/div\u003e\n",
      "date_published": "2026-11-03T00:00:00Z",
      "id": "https://gbilder.com/posts/2026-11-02-bandits-hail-historic-pledge/",
      "tags": [
        "AI"
      ],
      "url": "https://gbilder.com/posts/2026-11-02-bandits-hail-historic-pledge/"
    },
    {
      "content_html": "\n  \u003cp class=\"bafflegab-bookmark\"\u003eBookmarked \u003ca class=\"u-bookmark-of\" href=\"https://www.mcsweeneys.net/articles/im-the-guy-who-destroys-antique-books-after-we-scan-them-into-our-companys-insatiable-ai-platform\"\u003ehttps://www.mcsweeneys.net/articles/im-the-guy-who-destroys-antique-books-after-we-scan-them-into-our-companys-insatiable-ai-platform\u003c/a\u003e\u003c/p\u003e\n",
      "date_published": "2026-08-31T16:07:27+02:00",
      "external_url": "https://www.mcsweeneys.net/articles/im-the-guy-who-destroys-antique-books-after-we-scan-them-into-our-companys-insatiable-ai-platform",
      "id": "https://gbilder.com/bookmarks/01M4EHSNB8S5EXF0HX975D1E2J/",
      "tags": [
        "AI",
        "books",
        "pinboard"
      ],
      "title": "I’m the Guy Who Destroys Antique Books After We Scan Them into Our Company’s Insatiable AI Platform - McSweeney’s Internet Tendency",
      "url": "https://gbilder.com/bookmarks/01M4EHSNB8S5EXF0HX975D1E2J/"
    },
    {
      "content_html": "\n  \u003cp class=\"bafflegab-bookmark\"\u003eBookmarked \u003ca class=\"u-bookmark-of\" href=\"https://www.arl.org/blog/stewarding-open-content-in-the-ai-age-a-facilitation-guide-from-arl-and-harvard-library/\"\u003ehttps://www.arl.org/blog/stewarding-open-content-in-the-ai-age-a-facilitation-guide-from-arl-and-harvard-library/\u003c/a\u003e\u003c/p\u003e\n",
      "date_published": "2026-06-26T11:21:36+02:00",
      "external_url": "https://www.arl.org/blog/stewarding-open-content-in-the-ai-age-a-facilitation-guide-from-arl-and-harvard-library/",
      "id": "https://gbilder.com/bookmarks/01M4EHSMBC0FMBJ4D1KFB331FV/",
      "tags": [
        "AI",
        "pinboard"
      ],
      "title": "Stewarding Open Content in the AI Age: A Facilitation Guide from ARL and Harvard Library — Association of Research Libraries",
      "url": "https://gbilder.com/bookmarks/01M4EHSMBC0FMBJ4D1KFB331FV/"
    },
    {
      "content_html": "\n  \u003cp class=\"bafflegab-bookmark\"\u003eBookmarked \u003ca class=\"u-bookmark-of\" href=\"https://arstechnica.com/security/2026/05/google-publishes-exploit-code-threatening-millions-of-chromium-users/\"\u003ehttps://arstechnica.com/security/2026/05/google-publishes-exploit-code-threatening-millions-of-chromium-users/\u003c/a\u003e\u003c/p\u003e\n",
      "date_published": "2026-05-21T07:49:40+02:00",
      "external_url": "https://arstechnica.com/security/2026/05/google-publishes-exploit-code-threatening-millions-of-chromium-users/",
      "id": "https://gbilder.com/bookmarks/01M4EHSKYKXDX3TKF18AME8S9Y/",
      "tags": [
        "AI",
        "security",
        "pinboard"
      ],
      "title": "Google publishes exploit code threatening millions of Chromium users - Ars Technica",
      "url": "https://gbilder.com/bookmarks/01M4EHSKYKXDX3TKF18AME8S9Y/"
    },
    {
      "content_html": "\n  \u003cp class=\"bafflegab-bookmark\"\u003eBookmarked \u003ca class=\"u-bookmark-of\" href=\"https://www.eff.org/deeplinks/2025/02/ai-and-copyright-expanding-copyright-hurts-everyone-heres-what-do-instead\"\u003ehttps://www.eff.org/deeplinks/2025/02/ai-and-copyright-expanding-copyright-hurts-everyone-heres-what-do-instead\u003c/a\u003e\u003c/p\u003e\n",
      "date_published": "2025-11-05T09:11:11+02:00",
      "external_url": "https://www.eff.org/deeplinks/2025/02/ai-and-copyright-expanding-copyright-hurts-everyone-heres-what-do-instead",
      "id": "https://gbilder.com/bookmarks/01M4EHSHDD4AW7YMDZ7AM5V75H/",
      "tags": [
        "copyright",
        "AI",
        "ml",
        "mitp",
        "pinboard"
      ],
      "title": "AI and Copyright: Expanding Copyright Hurts Everyone—Here’s What to Do Instead | Electronic Frontier Foundation",
      "url": "https://gbilder.com/bookmarks/01M4EHSHDD4AW7YMDZ7AM5V75H/"
    },
    {
      "content_html": "\n  \u003cp class=\"bafflegab-bookmark\"\u003eBookmarked \u003ca class=\"u-bookmark-of\" href=\"https://git.madhouse-project.org/iocaine/iocaine\"\u003ehttps://git.madhouse-project.org/iocaine/iocaine\u003c/a\u003e\u003c/p\u003e\n",
      "date_published": "2025-07-12T09:31:17+02:00",
      "external_url": "https://git.madhouse-project.org/iocaine/iocaine",
      "id": "https://gbilder.com/bookmarks/01M4EHSFARKPK11XRG2EFPXCBN/",
      "tags": [
        "mitp",
        "AI",
        "scraping",
        "bots",
        "pinboard"
      ],
      "title": "iocaine/iocaine: The deadliest poison known to AI. - MadHouse Git Repositories",
      "url": "https://gbilder.com/bookmarks/01M4EHSFARKPK11XRG2EFPXCBN/"
    },
    {
      "content_html": "\n  \u003cdiv class=\"e-content\"\u003e\n\n  \u003cdiv class=\"citation\"\u003e\n    \u003cdiv class=\"citation-header\"\u003e\n      \u003cstrong\u003eCite as:\u003c/strong\u003e\n      \u003cbutton class=\"copy-icon\" onclick=\"copyCitation()\" aria-label=\"Copy citation\"\u003e\n        \u003cimg src=\"https://gbilder.com/icons/copy.svg\" alt=\"Copy citation\" width=\"20\" height=\"20\"\u003e\n      \u003c/button\u003e\n    \u003c/div\u003e\n    \u003cp id=\"citation-text\"\u003e\n      \n        \u003ca href=\"https://orcid.org/0000-0003-1315-5960\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eGeoffrey Bilder\u003cimg src=\"https://gbilder.com/ORCID-iD_icon_vector.svg\" alt=\"ORCID iD icon\" width=\"16\" height=\"16\" style=\"margin-left:4px;vertical-align:text-bottom;\"\u003e\n\n          \u003c/a\u003e\n\n        \n      \n      \n        (2025, June 24).\n      \n      \u003ci\u003eAI Like It\u0026#39;s 1930\u003c/i\u003e.\n      Retrieved from \u003ca href=\"https://doi.org/10.59347/5ehqx-91420\"\u003e\n      https://doi.org/10.59347/5ehqx-91420\n      \u003c/a\u003e\n    \u003c/p\u003e\n  \u003c/div\u003e\n  \u003cscript\u003e\n    function copyCitation() {\n      const citationText = document.getElementById('citation-text').innerText.replace(/\\s+/g, ' ').trim();\n      navigator.clipboard.writeText(citationText).then(() =\u003e {\n        alert('Citation copied to clipboard!');\n      }).catch(err =\u003e {\n        console.error('Failed to copy citation: ', err);\n      });\n    }\n  \u003c/script\u003e\n\n\n\u003cp\u003eAfter reading another \u003ca href=\"https://www.darioamodei.com/essay/machines-of-loving-grace\"\u003emessianic sermon\u003c/a\u003e about how AI is going to accelerate science, I had an idea for an experiment:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eBuild a modern LLM-based AI using only content from before 1930 (or another cutoff that gives you enough data).\u003c/li\u003e\n\u003cli\u003eRestrict researchers interacting with the LLM to using prompts that do not include information, terminology, or ideas that have been introduced since the cutoff date.\u003c/li\u003e\n\u003cli\u003eSee if the LLM can help the researchers recreate, in essence, any of the major paradigm-shifting creative developments - scientific breakthroughs, inventions, art/music movements - that humans have come up with \u003cem\u003esince\u003c/em\u003e that cutoff date.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIn short, let\u0026rsquo;s test the idea that LLMs can be creative by building an anachronistically time-boxed LLM and seeing if researchers using the LLM can innovate outside of the box.\u003c/p\u003e\n\u003cp\u003eAnd let\u0026rsquo;s do the experiment \u003cstrong\u003ebefore\u003c/strong\u003e we make knowledge-production and creative work inviable career paths.\u003c/p\u003e\n\u003c/div\u003e\n",
      "date_published": "2025-06-24T00:00:00Z",
      "id": "https://gbilder.com/posts/2025-06-24-ai-like-its-1930/",
      "tags": [
        "AI"
      ],
      "url": "https://gbilder.com/posts/2025-06-24-ai-like-its-1930/"
    },
    {
      "content_html": "\n  \u003cdiv class=\"e-content\"\u003e\n\n  \u003cdiv class=\"citation\"\u003e\n    \u003cdiv class=\"citation-header\"\u003e\n      \u003cstrong\u003eCite as:\u003c/strong\u003e\n      \u003cbutton class=\"copy-icon\" onclick=\"copyCitation()\" aria-label=\"Copy citation\"\u003e\n        \u003cimg src=\"https://gbilder.com/icons/copy.svg\" alt=\"Copy citation\" width=\"20\" height=\"20\"\u003e\n      \u003c/button\u003e\n    \u003c/div\u003e\n    \u003cp id=\"citation-text\"\u003e\n      \n        \u003ca href=\"https://orcid.org/0000-0003-1315-5960\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eGeoffrey Bilder\u003cimg src=\"https://gbilder.com/ORCID-iD_icon_vector.svg\" alt=\"ORCID iD icon\" width=\"16\" height=\"16\" style=\"margin-left:4px;vertical-align:text-bottom;\"\u003e\n\n          \u003c/a\u003e\n\n        \n      \n      \n        (2025, June 9).\n      \n      \u003ci\u003eEpistemic Slot Machines\u003c/i\u003e.\n      Retrieved from \u003ca href=\"https://doi.org/10.59347/a2w9c-d1h86\"\u003e\n      https://doi.org/10.59347/a2w9c-d1h86\n      \u003c/a\u003e\n    \u003c/p\u003e\n  \u003c/div\u003e\n  \u003cscript\u003e\n    function copyCitation() {\n      const citationText = document.getElementById('citation-text').innerText.replace(/\\s+/g, ' ').trim();\n      navigator.clipboard.writeText(citationText).then(() =\u003e {\n        alert('Citation copied to clipboard!');\n      }).catch(err =\u003e {\n        console.error('Failed to copy citation: ', err);\n      });\n    }\n  \u003c/script\u003e\n\n\n\u003cp\u003eEvery completion or prompt is a pull of the lever.\u003c/p\u003e\n\u003cp\u003eEvery successful text completion saves you seconds at a time and gives you a little dopamine hit.\u003c/p\u003e\n\u003cp\u003eEvery successful prompt can save you hours at a time and gives you a giant dopamine rush.\u003c/p\u003e\n\u003cp\u003eAnd when you have a hot hand—it’s like swimming in an infinite dopamine pool.\u003c/p\u003e\n\u003cp\u003eYou remember these wins, but you forget the numerous little failures.\u003c/p\u003e\n\u003cp\u003eAnd you discount every time you discovered that it borked your code beyond recognition.\u003c/p\u003e\n\u003cp\u003eIt must have been your fault.\u003c/p\u003e\n\u003cp\u003eYou just need to review the code more carefully.\u003c/p\u003e\n\u003cp\u003eYou just need to refine the prompts.\u003c/p\u003e\n\u003cp\u003eYou just need to add new workspace rules.\u003c/p\u003e\n\u003cp\u003eYou just need to finesse your pull of the lever. \u003c/p\u003e\n\u003cp\u003eBesides- when you finally do discover that it somehow managed to trash your code without you catching it, what are you going to do? You are in the hole. You\u0026rsquo;re not familiar with the code anymore.\u003c/p\u003e\n\u003cp\u003eYour only way to get out is to pull the lever again and hope that the thing that broke your project can also fix it.\u003c/p\u003e\n\u003cp\u003eMaybe you can still break even?\u003c/p\u003e\n\u003cp\u003eAnd if you don\u0026rsquo;t break even, you certainly aren\u0026rsquo;t going to tell anybody.\u003c/p\u003e\n\u003cp\u003eThat would be too embarrassing.\u003c/p\u003e\n\u003cp\u003eNobody else is failing at this.\u003c/p\u003e\n\u003cp\u003eThey all seem to have it figured out.\u003c/p\u003e\n\u003cp\u003eThere are people out there writing complete applications in forty-five minutes.\u003c/p\u003e\n\u003cp\u003eThere is one machine whisperer who can even generate realistic SVG images of a pelican riding a bicycle.\u003c/p\u003e\n\u003cp\u003eAnd there are whales out there placing bets of billions of dollars.\u003c/p\u003e\n\u003cp\u003eThey must know something you don\u0026rsquo;t know.\u003c/p\u003e\n\u003cp\u003eThey must have an angle.\u003c/p\u003e\n\u003cp\u003eBut at the moment, you are in the red.\u003c/p\u003e\n\u003cp\u003eSo it’s double or nothing. \u003c/p\u003e\n\u003cp\u003eAnd you pull the lever.\u003c/p\u003e\n\u003cp\u003eAgain.\u003c/p\u003e\n\u003cp\u003eAnd you hear the ping on your phone notifying you that your account has been automatically topped up.\u003c/p\u003e\n\u003cp\u003eAgain.\u003c/p\u003e\n\u003chr\u003e\n\n            \u003clink rel=\"stylesheet\" href=\"https://gbilder.com/css/vendors/admonitions.min.364ef4282de967778e4920f8ae18cc1b92b0c0b58b34b66fc17619dabfd48b6e.css\" integrity=\"sha256-Nk70KC3pZ3eOSSD4rhjMG5KwwLWLNLZvwXYZ2r/Ui24=\" crossorigin=\"anonymous\"\u003e\n    \u003cdiv class=\"admonition note\"\u003e\n      \u003cdiv class=\"admonition-header\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 576 512\"\u003e\u003cpath d=\"M0 64C0 28.7 28.7 0 64 0L224 0l0 128c0 17.7 14.3 32 32 32l128 0 0 125.7-86.8 86.8c-10.3 10.3-17.5 23.1-21 37.2l-18.7 74.9c-2.3 9.2-1.8 18.8 1.3 27.5L64 512c-35.3 0-64-28.7-64-64L0 64zm384 64l-128 0L256 0 384 128zM549.8 235.7l14.4 14.4c15.6 15.6 15.6 40.9 0 56.6l-29.4 29.4-71-71 29.4-29.4c15.6-15.6 40.9-15.6 56.6 0zM311.9 417L441.1 287.8l71 71L382.9 487.9c-4.1 4.1-9.2 7-14.9 8.4l-60.1 15c-5.5 1.4-11.2-.2-15.2-4.2s-5.6-9.7-4.2-15.2l15-60.1c1.4-5.6 4.3-10.8 8.4-14.9z\"/\u003e\u003c/svg\u003e\n        \u003cspan\u003eNote\u003c/span\u003e\n      \u003c/div\u003e\n      \u003cdiv class=\"admonition-content\"\u003e\n        \u003cp\u003eI wrote this a few months ago and never posted it. Because\u0026hellip;\nWell, because I\u0026rsquo;m kind of sick of hot takes on AI.\u003c/p\u003e\n\u003cp\u003eAnd then \u003ca href=\"https://pivot-to-ai.com/2025/06/05/generative-ai-runs-on-gambling-addiction-just-one-more-prompt-bro/\"\u003ethis\u003c/a\u003e post by\nDavid Gerard came out. And it is much better. I encourage you to read it.\u003c/p\u003e\n\u003cp\u003eBut seeing it also convinced me that I should have posted my attempt to make the same point. And so I have.\u003c/p\u003e\n      \u003c/div\u003e\n    \u003c/div\u003e\u003c/div\u003e\n",
      "date_published": "2025-06-09T00:00:00Z",
      "id": "https://gbilder.com/posts/2025-06-09-epistemic-slot-machines/",
      "tags": [
        "AI"
      ],
      "url": "https://gbilder.com/posts/2025-06-09-epistemic-slot-machines/"
    },
    {
      "content_html": "\n  \u003cdiv class=\"e-content\"\u003e\n\n  \u003cdiv class=\"citation\"\u003e\n    \u003cdiv class=\"citation-header\"\u003e\n      \u003cstrong\u003eCite as:\u003c/strong\u003e\n      \u003cbutton class=\"copy-icon\" onclick=\"copyCitation()\" aria-label=\"Copy citation\"\u003e\n        \u003cimg src=\"https://gbilder.com/icons/copy.svg\" alt=\"Copy citation\" width=\"20\" height=\"20\"\u003e\n      \u003c/button\u003e\n    \u003c/div\u003e\n    \u003cp id=\"citation-text\"\u003e\n      \n        \u003ca href=\"https://orcid.org/0000-0003-1315-5960\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eGeoffrey Bilder\u003cimg src=\"https://gbilder.com/ORCID-iD_icon_vector.svg\" alt=\"ORCID iD icon\" width=\"16\" height=\"16\" style=\"margin-left:4px;vertical-align:text-bottom;\"\u003e\n\n          \u003c/a\u003e\n\n        \n      \n      \n        (2025, April 2).\n      \n      \u003ci\u003eBots Behaving Badly\u003c/i\u003e.\n      Retrieved from \u003ca href=\"https://doi.org/10.59347/w366z-egx85\"\u003e\n      https://doi.org/10.59347/w366z-egx85\n      \u003c/a\u003e\n    \u003c/p\u003e\n  \u003c/div\u003e\n  \u003cscript\u003e\n    function copyCitation() {\n      const citationText = document.getElementById('citation-text').innerText.replace(/\\s+/g, ' ').trim();\n      navigator.clipboard.writeText(citationText).then(() =\u003e {\n        alert('Citation copied to clipboard!');\n      }).catch(err =\u003e {\n        console.error('Failed to copy citation: ', err);\n      });\n    }\n  \u003c/script\u003e\n\n\n\u003cp\u003eI\u0026rsquo;ve seen an uptick in people I respect concluding that the massive increase in badly-behaved web-scraping \u003ca href=\"https://en.wikipedia.org/wiki/Internet_bot\"\u003ebots\u003c/a\u003e is intentional and just another example of sociopathic AI companies ripping-up long-respected web conventions for the sake of profit. Here are two recent examples:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://go-to-hellman.blogspot.com/2025/03/ai-bots-are-destroying-open-access.html\"\u003eAI bots are destroying Open Access\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.marginalia.nu/log/a_115_rude_crawler/\"\u003eImproved ways to operate a rude crawler\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eI am \u003ca href=\"https://gbilder.com/blog/2024/07/ai-update/\"\u003eno fan of AI companies\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eBut I don’t think this explains what\u0026rsquo;s really happening.\u003c/p\u003e\n\u003cp\u003eThe problem still has its roots in AI, but for different reasons—  reasons that are possibly more concerning than the idea that IA companies are doing this stuff on purpose.\u003c/p\u003e\n\u003cp\u003eInstead, I suspect the \u003cstrong\u003ereal\u003c/strong\u003e problem is people \u003cem\u003eusing AI coding tools\u003c/em\u003e that generate, buggy, and hyper-aggressive bots.\u003c/p\u003e\n\u003cp\u003eAnd I bet that the vast majority of the developers behind these bots have no idea that they are causing problems.\u003c/p\u003e\n\u003cp\u003eThis would consistent with what I used to see when trying to manage \u003ca href=\"https://api.crossref.org\"\u003ea popular API\u003c/a\u003e even \u003cem\u003ebefore\u003c/em\u003e AI tools became ubiquitous.\u003c/p\u003e\n\u003cp\u003eWe \u003cem\u003econstantly\u003c/em\u003e had problems with bots— but only twice could the problems be attributed to a bot that was deliberately designed to be aggressive and evade detection.\u003c/p\u003e\n\u003cp\u003eAll the other times it was some naive programmer (often a researcher)  who had built a buggy bot or who simply didn’t know about bot conventions like \u003ca href=\"https://en.wikipedia.org/wiki/Robots.txt\"\u003e\u003ccode\u003erobots.txt\u003c/code\u003e\u003c/a\u003e, error/retry backoffs, \u003ca href=\"https://en.wikipedia.org/wiki/Rate_limiting\"\u003erate-limiting\u003c/a\u003e, \u003ca href=\"https://en.wikipedia.org/wiki/Connection_pool\"\u003econnection pools\u003c/a\u003e, \u003ca href=\"https://en.wikipedia.org/wiki/User-Agent_header\"\u003euser-agent\u003c/a\u003e ettiquette, etc..\u003c/p\u003e\n\u003cp\u003eWe also had a constant problem with developers who didn’t know how \u003ca href=\"https://www.merge.dev/blog/cursor-pagination\"\u003ecursors\u003c/a\u003e worked in our API because they simply hadn’t read the docs. This meant that on any given day we would see dozens of bots just endlessly requesting the next page of empty results from a cursor that had long ago stopped delivering them data.\u003csup id=\"fnref:1\"\u003e\u003ca href=\"#fn:1\" class=\"footnote-ref\" role=\"doc-noteref\"\u003e1\u003c/a\u003e\u003c/sup\u003e\u003c/p\u003e\n\u003cp\u003eWhenever we managed to get in touch with the developers, they would be genuinely surprised, profusely apologetic, and they’d immediately shut off or fix their code.\u003c/p\u003e\n\u003cp\u003eSometimes we’d find that said developers had \u003cem\u003eentirely forgotten they’d left the bot running\u003c/em\u003e and they’d sheepishly admit that the project it was built for had ended months or years ago!\u003c/p\u003e\n\u003cp\u003eAnd a lot of this code was public.\u003c/p\u003e\n\u003cp\u003eAnd AIs were trained on it.\u003c/p\u003e\n\u003cp\u003eAnd so AI-generated code is replicating all of these problems.\u003c/p\u003e\n\u003cp\u003eI routinely test new AI coding tools with a set of problems that I know are easy to get wrong. Web scraping is one of these things.\u003c/p\u003e\n\u003cp\u003eAnd all the tools I’ve tried make at least a few of the  same mistakes humans make— they ignore \u003ca href=\"https://en.wikipedia.org/wiki/Robots.txt\"\u003e\u003ccode\u003erobots.txt\u003c/code\u003e\u003c/a\u003e, they don’t use \u003ca href=\"https://en.wikipedia.org/wiki/Connection_pool\"\u003econnection pooling\u003c/a\u003e, they don’t honor \u003ca href=\"https://en.wikipedia.org/wiki/Rate_limiting\"\u003erate limits\u003c/a\u003e, they don’t set correct \u003ca href=\"https://en.wikipedia.org/wiki/User-Agent_header\"\u003euser-agent\u003c/a\u003e headers.\u003c/p\u003e\n\u003cp\u003eI also test to see if the AI tools will generate code that properly handles cursors with the Crossref API.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eOnly once\u003c/em\u003e have I seen an LLM produce the correct code the first time.  And even then, it was a fluke and I haven’t been able to get that particular LLM to do it again since.\u003c/p\u003e\n\u003cp\u003eAnd, of course, increasingly AI\u0026rsquo;s are also trained on code that includes mechanisms to evade being blocked— and so, in addition to being buggy, they are also effectively trained to be more aggressive and stealthy.\u003c/p\u003e\n\u003cp\u003eAnd whereas most new programmers are justifiably reluctant to delve into the intricacies of creating concurrent apps, AI tools seem to have no such inhibitions and generate code that spawns dozens of requests at that same time.\u003c/p\u003e\n\u003cp\u003eBut most of the the people using these AI tools don’t know this. All they know is that the AI tools allow them to easily build a bot to scrape data from the web- something that seemed too daunting for them to do before.\u003c/p\u003e\n\u003cp\u003eThey are \u0026ldquo;\u003ca href=\"https://en.wikipedia.org/wiki/Vibe_coding\"\u003evibe coding\u003c/a\u003e.\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eAnd so now we have a gigantic influx of new \u0026ldquo;developers\u0026rdquo; building new tools to make use of data on the internet. And these tools are based on highly concurrent, hyper-aggressive, and extremely buggy AI-generated code.\u003c/p\u003e\n\u003cp\u003eThis may sound like I’m splitting hairs— I mean, the problem is still related to AI, right? And this behavior, — whether deliberate or not — is causing a lot of collateral damage.\u003c/p\u003e\n\u003cp\u003eYes, but I think this underscores what I suspect is the most realistic threat from AI — not that we will all soon be replaced by AGI, but that more and more of our systems are going to become infested with subtly buggy data and code that has unintentional, unpredictable, and damaging downstream effects.\u003c/p\u003e\n\u003cp\u003eOnce we all realize what is happening, we\u0026rsquo;re going to spend the next decade trying to excise this stuff. And we\u0026rsquo;re not going to be able to use AI tools to help us do it.\u003c/p\u003e\n\u003ch2 id=\"example-code-generated-by-claude-37-on-2025-03-24\"\u003eExample code generated by Claude 3.7 on 2025-03-24\u003c/h2\u003e\n\u003cp\u003ePrompt: \u003ccode\u003eGenerate a Python function that uses the Crossref API to get all the records that were indexed on 2024-01-01.\u003c/code\u003e\u003c/p\u003e\n\n            \u003clink rel=\"stylesheet\" href=\"https://gbilder.com/css/vendors/admonitions.min.364ef4282de967778e4920f8ae18cc1b92b0c0b58b34b66fc17619dabfd48b6e.css\" integrity=\"sha256-Nk70KC3pZ3eOSSD4rhjMG5KwwLWLNLZvwXYZ2r/Ui24=\" crossorigin=\"anonymous\"\u003e\n    \u003cdiv class=\"admonition danger\"\u003e\n      \u003cdiv class=\"admonition-header\"\u003e\u003csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"\u003e\u003cpath d=\"M256 32c14.2 0 27.3 7.5 34.5 19.8l216 368c7.3 12.4 7.3 27.7 .2 40.1S486.3 480 472 480L40 480c-14.3 0-27.6-7.7-34.7-20.1s-7-27.8 .2-40.1l216-368C228.7 39.5 241.8 32 256 32zm0 128c-13.3 0-24 10.7-24 24l0 112c0 13.3 10.7 24 24 24s24-10.7 24-24l0-112c0-13.3-10.7-24-24-24zm32 224a32 32 0 1 0 -64 0 32 32 0 1 0 64 0z\"/\u003e\u003c/svg\u003e\n        \u003cspan\u003eBroken code below\u003c/span\u003e\n      \u003c/div\u003e\n      \u003cdiv class=\"admonition-content\"\u003e\n        \u003cp\u003eThankfully the code below will only generate one request and fail emediately with a \u003ccode\u003e400\u003c/code\u003e error because it has used the wrong \u003ccode\u003efilter\u003c/code\u003e parameters. But \u003cem\u003ehad\u003c/em\u003e it created a correct request, the script would have never exited and would have kept requesting the same URL from the Crossref API forever because it has made an erroneous assumption about how \u003ccode\u003ecursors\u003c/code\u003e work in the API. Also note that, though it at least includes user-agent information, it has simplistic rate-limiting and no mechanisms for backing-off when it encounters errors.\u003c/p\u003e\n      \u003c/div\u003e\n    \u003c/div\u003e\u003cp\u003eResults:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003erequests\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"nn\"\u003etime\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003efrom\u003c/span\u003e \u003cspan class=\"nn\"\u003edatetime\u003c/span\u003e \u003cspan class=\"kn\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003edatetime\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003eget_crossref_records_by_indexed_date\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edate_str\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eemail\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003erows_per_page\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e1000\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003emax_records\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"kc\"\u003eNone\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    Retrieve records indexed by Crossref on a specific date using the Crossref API.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    Args:\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e        date_str (str): Date in YYYY-MM-DD format (e.g., \u0026#39;2024-01-01\u0026#39;)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e        email (str, optional): Email address for polite API use\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e        rows_per_page (int, optional): Number of records per page (default 1000, max 1000)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e        max_records (int, optional): Maximum number of records to retrieve (None for all)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    Returns:\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e        list: List of Crossref record dictionaries\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    \u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Base URL for Crossref API\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ebase_url\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://api.crossref.org/works\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Validate date format\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003edatetime\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estrptime\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edate_str\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;%Y-%m-\u003c/span\u003e\u003cspan class=\"si\"\u003e%d\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eexcept\u003c/span\u003e \u003cspan class=\"ne\"\u003eValueError\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eraise\u003c/span\u003e \u003cspan class=\"ne\"\u003eValueError\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Incorrect date format, should be YYYY-MM-DD\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Construct filter for indexed date\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003efilter_param\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;indexed:\u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003edate_str\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Set up headers with user agent (best practice for Crossref API)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eheaders\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;User-Agent\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;PythonCrossrefClient/1.0 (Python Script; \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eemail\u003c/span\u003e \u003cspan class=\"ow\"\u003eis\u003c/span\u003e \u003cspan class=\"kc\"\u003eNone\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"n\"\u003eemail\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s1\"\u003e)\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Parameters for the API request\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eparams\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;filter\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003efilter_param\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;rows\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003erows_per_page\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;cursor\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;*\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# Start cursor\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;sort\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;indexed\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# Sort by indexed date\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;order\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;asc\u0026#39;\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# Ascending order\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eall_records\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epage_count\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ewhile\u003c/span\u003e \u003cspan class=\"kc\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e# Make the API request\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eresponse\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erequests\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ebase_url\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eparams\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eparams\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eheaders\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eheaders\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e# Check for successful response\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eresponse\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estatus_code\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"mi\"\u003e200\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Error: API request failed with status code \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eresponse\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estatus_code\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Response text: \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eresponse\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etext\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e# Parse the JSON response\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003edata\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eresponse\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ejson\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e# Get the records from the current page\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eitems\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;message\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e][\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;items\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e# Add items to our collection\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eall_records\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eextend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eitems\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003epage_count\u003c/span\u003e \u003cspan class=\"o\"\u003e+=\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Retrieved page \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003epage_count\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e, \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eitems\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e records. Total: \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eall_records\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e# Check if we\u0026#39;ve reached the maximum records limit\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003emax_records\u003c/span\u003e \u003cspan class=\"ow\"\u003eis\u003c/span\u003e \u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"kc\"\u003eNone\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eall_records\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;=\u003c/span\u003e \u003cspan class=\"n\"\u003emax_records\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eall_records\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eall_records\u003c/span\u003e\u003cspan class=\"p\"\u003e[:\u003c/span\u003e\u003cspan class=\"n\"\u003emax_records\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e# Get the next cursor from the response\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003enext_cursor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;message\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;next-cursor\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e# If there\u0026#39;s no next cursor, we\u0026#39;ve reached the end\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"n\"\u003enext_cursor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e  \u003cspan class=\"c1\"\u003e# \u0026lt;---- Argh- NO! This is wrong!\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e# Update the cursor parameter for the next request\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eparams\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;cursor\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003enext_cursor\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e# Be nice to the API with a small delay between requests\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003etime\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esleep\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Total records retrieved: \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eall_records\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eall_records\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Example usage\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"vm\"\u003e__name__\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;__main__\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Get records indexed on January 1, 2024\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Add your email for polite API use\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003erecords\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eget_crossref_records_by_indexed_date\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;2024-01-01\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eemail\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;your.email@example.com\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Print some information about the first few records\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003erecord\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"nb\"\u003eenumerate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erecords\u003c/span\u003e\u003cspan class=\"p\"\u003e[:\u003c/span\u003e\u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e]):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eRecord \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e:\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;DOI: \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003erecord\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;DOI\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Title: \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003erecord\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;title\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;No title\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e])[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Type: \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003erecord\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;type\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nb\"\u003eprint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sa\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Indexed: \u003c/span\u003e\u003cspan class=\"si\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003erecord\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;indexed\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e{})\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;date-time\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"footnotes\" role=\"doc-endnotes\"\u003e\n\u003chr\u003e\n\u003col\u003e\n\u003cli id=\"fn:1\"\u003e\n\u003cp\u003eYes, we could could have fixed this in the API. Don\u0026rsquo;t get me started.\u0026#160;\u003ca href=\"#fnref:1\" class=\"footnote-backref\" role=\"doc-backlink\"\u003e\u0026#x21a9;\u0026#xfe0e;\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n",
      "date_published": "2025-04-02T00:00:00Z",
      "id": "https://gbilder.com/posts/2025-04-02-bots-behaving-badly/",
      "tags": [
        "web-scraping",
        "bots",
        "AI"
      ],
      "url": "https://gbilder.com/posts/2025-04-02-bots-behaving-badly/"
    },
    {
      "content_html": "\n  \u003cdiv class=\"e-content\"\u003e\n\n  \u003cdiv class=\"citation\"\u003e\n    \u003cdiv class=\"citation-header\"\u003e\n      \u003cstrong\u003eCite as:\u003c/strong\u003e\n      \u003cbutton class=\"copy-icon\" onclick=\"copyCitation()\" aria-label=\"Copy citation\"\u003e\n        \u003cimg src=\"https://gbilder.com/icons/copy.svg\" alt=\"Copy citation\" width=\"20\" height=\"20\"\u003e\n      \u003c/button\u003e\n    \u003c/div\u003e\n    \u003cp id=\"citation-text\"\u003e\n      \n        \u003ca href=\"https://orcid.org/0000-0003-1315-5960\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eGeoffrey Bilder\u003cimg src=\"https://gbilder.com/ORCID-iD_icon_vector.svg\" alt=\"ORCID iD icon\" width=\"16\" height=\"16\" style=\"margin-left:4px;vertical-align:text-bottom;\"\u003e\n\n          \u003c/a\u003e\n\n        \n      \n      \n        (2025, January 25).\n      \n      \u003ci\u003eThe Developer Experience in Early 2025\u003c/i\u003e.\n      Retrieved from \u003ca href=\"https://doi.org/10.59347/8nwg7-hbh15\"\u003e\n      https://doi.org/10.59347/8nwg7-hbh15\n      \u003c/a\u003e\n    \u003c/p\u003e\n  \u003c/div\u003e\n  \u003cscript\u003e\n    function copyCitation() {\n      const citationText = document.getElementById('citation-text').innerText.replace(/\\s+/g, ' ').trim();\n      navigator.clipboard.writeText(citationText).then(() =\u003e {\n        alert('Citation copied to clipboard!');\n      }).catch(err =\u003e {\n        console.error('Failed to copy citation: ', err);\n      });\n    }\n  \u003c/script\u003e\n\n\n\u003cp\u003eImagine \u003ca href=\"https://en.wikipedia.org/wiki/Pair_programming#:~:text=Pair%20programming%20is%20a%20software,two%20programmers%20switch%20roles%20frequently.\"\u003epair programming\u003c/a\u003e with an eccentric software developer…\u003c/p\u003e\n\u003cp\u003eOK, good point—  I mean more eccentric than usual.\u003c/p\u003e\n\u003cp\u003e…anyway— they have fantastic long-term memory, but terrible short-term memory.\u003c/p\u003e\n\u003cp\u003eThey are polite to the point of obsequiousness.\u003c/p\u003e\n\u003cp\u003eThey can type thousands of words per second and they like to make fifty unrelated code changes at once.\u003c/p\u003e\n\u003cp\u003eThey can write the most complex algorithms flawlessly, yet they routinely forget to import required libraries.\u003c/p\u003e\n\u003cp\u003eThey take a shot of vodka every twenty minutes and get progressively drunker until they are practically paralytic and can\u0026rsquo;t remember a thing. You have to force them to take a nap and recover for a few hours before continuing with your pair programming.\u003c/p\u003e\n\u003cp\u003eAfter a few days of this— you  ask the programmer to pin some notes to their monitor which say things like:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e“remember you are working on project X”\u003c/li\u003e\n\u003cli\u003e“only change one function at a time, then ask for advice”\u003c/li\u003e\n\u003cli\u003e“don’t forget to import needed libraries”\u003c/li\u003e\n\u003cli\u003e“don’t forget to remove imports for unneeded libraries”\u003c/li\u003e\n\u003cli\u003e“don’t drink vodka during work hours”\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThis seems to make things better, but as soon as you turn your back, they remove all the notes, crumple them up, swallow them, and deny the notes ever existed in the first place.\u003c/p\u003e\n\u003cp\u003eAfter a fortnight you discover that they somehow embedded an entire implementation of “\u003ca href=\"https://en.wikipedia.org/wiki/Tetris\"\u003eTetris\u003c/a\u003e” in the config management module of the program that you were writing.\u003c/p\u003e\n\u003cp\u003eOh, and all the time you are programming together you keep yourself warm by burning a pile of money.\u003c/p\u003e\n\u003c/div\u003e\n",
      "date_published": "2025-01-25T00:00:00Z",
      "id": "https://gbilder.com/posts/2025-01-25-the-developer-experience-in-early-2025/",
      "tags": [
        "ml",
        "AI",
        "development"
      ],
      "url": "https://gbilder.com/posts/2025-01-25-the-developer-experience-in-early-2025/"
    },
    {
      "content_html": "\n  \u003cp class=\"bafflegab-bookmark\"\u003eBookmarked \u003ca class=\"u-bookmark-of\" href=\"https://www.debunkbot.com/conspiracies\"\u003ehttps://www.debunkbot.com/conspiracies\u003c/a\u003e\u003c/p\u003e\n",
      "date_published": "2024-09-13T16:50:11+02:00",
      "external_url": "https://www.debunkbot.com/conspiracies",
      "id": "https://gbilder.com/bookmarks/01M4EHSA0CKV5WG4H6P5BBH6WQ/",
      "tags": [
        "conspiracies",
        "AI",
        "agnotology",
        "pinboard"
      ],
      "title": "Conspiracies - Conspiratorial Conversations",
      "url": "https://gbilder.com/bookmarks/01M4EHSA0CKV5WG4H6P5BBH6WQ/"
    },
    {
      "content_html": "\n  \u003cp class=\"bafflegab-bookmark\"\u003eBookmarked \u003ca class=\"u-bookmark-of\" href=\"https://xeiaso.net/blog/2024/strawberry/\"\u003ehttps://xeiaso.net/blog/2024/strawberry/\u003c/a\u003e\u003c/p\u003e\n",
      "date_published": "2024-09-13T16:11:03+02:00",
      "external_url": "https://xeiaso.net/blog/2024/strawberry/",
      "id": "https://gbilder.com/bookmarks/01M4EHSA08PTZ4T68ME8G2BF72/",
      "tags": [
        "AI",
        "pinboard"
      ],
      "title": "I fixed the strawberry problem because OpenAI couldn't - Xe Iaso",
      "url": "https://gbilder.com/bookmarks/01M4EHSA08PTZ4T68ME8G2BF72/"
    },
    {
      "content_html": "\n  \u003cp class=\"bafflegab-bookmark\"\u003eBookmarked \u003ca class=\"u-bookmark-of\" href=\"https://www.oreilly.com/radar/how-to-fix-ais-original-sin/\"\u003ehttps://www.oreilly.com/radar/how-to-fix-ais-original-sin/\u003c/a\u003e\u003c/p\u003e\n",
      "date_published": "2024-06-21T13:10:13+02:00",
      "external_url": "https://www.oreilly.com/radar/how-to-fix-ais-original-sin/",
      "id": "https://gbilder.com/bookmarks/01M4EHS8FY23WW0TB0M6RR1HYG/",
      "tags": [
        "AI",
        "copyright",
        "pinboard"
      ],
      "title": "How to Fix “AI’s Original Sin” – O’Reilly",
      "url": "https://gbilder.com/bookmarks/01M4EHS8FY23WW0TB0M6RR1HYG/"
    },
    {
      "content_html": "\n  \u003cp class=\"bafflegab-bookmark\"\u003eBookmarked \u003ca class=\"u-bookmark-of\" href=\"https://www.fortressofdoors.com/ai-markets-for-lemons-and-the-great-logging-off/\"\u003ehttps://www.fortressofdoors.com/ai-markets-for-lemons-and-the-great-logging-off/\u003c/a\u003e\u003c/p\u003e\n",
      "date_published": "2022-12-29T07:46:29+02:00",
      "external_url": "https://www.fortressofdoors.com/ai-markets-for-lemons-and-the-great-logging-off/",
      "id": "https://gbilder.com/bookmarks/01M4EHS0TX5MF1TJFQD9ZCPD9R/",
      "tags": [
        "internet-culture",
        "ml",
        "AI",
        "trust-metrics",
        "pinboard"
      ],
      "title": "AI: Markets for Lemons, and the Great Logging Off",
      "url": "https://gbilder.com/bookmarks/01M4EHS0TX5MF1TJFQD9ZCPD9R/"
    },
    {
      "content_html": "\n  \u003cp class=\"bafflegab-bookmark\"\u003eBookmarked \u003ca class=\"u-bookmark-of\" href=\"https://podcast.adobe.com/enhance\"\u003ehttps://podcast.adobe.com/enhance\u003c/a\u003e\u003c/p\u003e\n",
      "date_published": "2022-12-19T19:57:20+02:00",
      "external_url": "https://podcast.adobe.com/enhance",
      "id": "https://gbilder.com/bookmarks/01M4EHS0Q9S5JSPEBHEYYXVAS6/",
      "tags": [
        "AI",
        "audio",
        "tools",
        "podcasting",
        "vlogging",
        "pinboard"
      ],
      "title": "Enhance Speech from Adobe | Free AI filter for cleaning up spoken audio",
      "url": "https://gbilder.com/bookmarks/01M4EHS0Q9S5JSPEBHEYYXVAS6/"
    },
    {
      "content_html": "\n  \u003cp class=\"bafflegab-bookmark\"\u003eBookmarked \u003ca class=\"u-bookmark-of\" href=\"https://arstechnica.com/information-technology/2022/09/have-ai-image-generators-assimilated-your-art-new-tool-lets-you-check/\"\u003ehttps://arstechnica.com/information-technology/2022/09/have-ai-image-generators-assimilated-your-art-new-tool-lets-you-check/\u003c/a\u003e\u003c/p\u003e\n",
      "date_published": "2022-09-16T13:01:08+02:00",
      "external_url": "https://arstechnica.com/information-technology/2022/09/have-ai-image-generators-assimilated-your-art-new-tool-lets-you-check/",
      "id": "https://gbilder.com/bookmarks/01M4EHRZGN841722RCM0S31ZDR/",
      "tags": [
        "ml",
        "AI",
        "gan",
        "pinboard"
      ],
      "title": "Have AI image generators assimilated your art? New tool lets you check | Ars Technica",
      "url": "https://gbilder.com/bookmarks/01M4EHRZGN841722RCM0S31ZDR/"
    },
    {
      "content_html": "\n  \u003cp class=\"bafflegab-bookmark\"\u003eBookmarked \u003ca class=\"u-bookmark-of\" href=\"https://stability.ai/\"\u003ehttps://stability.ai/\u003c/a\u003e\u003c/p\u003e\n",
      "date_published": "2022-09-16T07:41:29+02:00",
      "external_url": "https://stability.ai/",
      "id": "https://gbilder.com/bookmarks/01M4EHRZG8NM84GWSZHYVK8CJC/",
      "tags": [
        "stable-diffusion",
        "AI",
        "pinboard"
      ],
      "title": "Stability.Ai",
      "url": "https://gbilder.com/bookmarks/01M4EHRZG8NM84GWSZHYVK8CJC/"
    },
    {
      "content_html": "\n  \u003cp class=\"bafflegab-bookmark\"\u003eBookmarked \u003ca class=\"u-bookmark-of\" href=\"https://twitter.com/DrZimmermann/status/1388526687814656004#.\"\u003ehttps://twitter.com/DrZimmermann/status/1388526687814656004#.\u003c/a\u003e\u003c/p\u003e\n",
      "date_published": "2022-09-02T20:25:47+02:00",
      "external_url": "https://twitter.com/DrZimmermann/status/1388526687814656004#.",
      "id": "https://gbilder.com/bookmarks/01M4EHRZAVWA1SKS7RBPNNZ0Q6/",
      "tags": [
        "AI",
        "ethics",
        "fun",
        "pinboard"
      ],
      "title": "(17) Annette Zimmermann on Twitter: \"Had to do it. Couldn't not do it. #AIEthics https://t.co/xOog2DReeR\" / Twitter",
      "url": "https://gbilder.com/bookmarks/01M4EHRZAVWA1SKS7RBPNNZ0Q6/"
    },
    {
      "content_html": "\n  \u003cp class=\"bafflegab-bookmark\"\u003eBookmarked \u003ca class=\"u-bookmark-of\" href=\"https://replicate.com/andreasjansson/stable-diffusion-animation\"\u003ehttps://replicate.com/andreasjansson/stable-diffusion-animation\u003c/a\u003e\u003c/p\u003e\n",
      "date_published": "2022-08-31T18:25:36+02:00",
      "external_url": "https://replicate.com/andreasjansson/stable-diffusion-animation",
      "id": "https://gbilder.com/bookmarks/01M4EHRZABRYXG0EMKDX5JJQNW/",
      "tags": [
        "AI",
        "images",
        "tools",
        "pinboard"
      ],
      "title": "andreasjansson/stable-diffusion-animation – Run with an API on Replicate",
      "url": "https://gbilder.com/bookmarks/01M4EHRZABRYXG0EMKDX5JJQNW/"
    },
    {
      "content_html": "\n  \u003cp class=\"bafflegab-bookmark\"\u003eBookmarked \u003ca class=\"u-bookmark-of\" href=\"https://nathanieltravis.com/2022/08/22/the-false-prophecy-of-agi-a-quick-tldr/\"\u003ehttps://nathanieltravis.com/2022/08/22/the-false-prophecy-of-agi-a-quick-tldr/\u003c/a\u003e\u003c/p\u003e\n",
      "date_published": "2022-08-23T07:03:10+02:00",
      "external_url": "https://nathanieltravis.com/2022/08/22/the-false-prophecy-of-agi-a-quick-tldr/",
      "id": "https://gbilder.com/bookmarks/01M4EHRZ6QSW53EKSBQYDFS542/",
      "tags": [
        "ml",
        "AI",
        "pinboard"
      ],
      "title": "The False Prophecy of “AGI”: A Quick TL;DR – Nathaniel Travis",
      "url": "https://gbilder.com/bookmarks/01M4EHRZ6QSW53EKSBQYDFS542/"
    }
  ],
  "language": "en",
  "title": "#AI · Louche Cannon",
  "version": "https://jsonfeed.org/version/1.1"
}