<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5423774879231339244</id><updated>2026-05-06T15:32:22.309-07:00</updated><category term="scrutiny"/><category term="press release"/><category term="tutorial"/><category term="integrity"/><category term="website analysis"/><category term="integrity plus"/><category term="webscraper"/><category term="website content audit"/><category term="SEO"/><category term="Philips Hue"/><category term="new releases"/><category term="screensleeves"/><category term="Integrity Pro"/><category term="hue-topia"/><category term="link checker"/><category term="website"/><category term="website archiving"/><category term="Music"/><category term="Organise"/><category term="Pi Pico"/><category term="smart bulbs"/><category term="LIFX"/><category term="screensaver"/><category term="OSX"/><category term="Objective C"/><category term="data"/><category term="smart home"/><category term="LIFXstyle"/><category term="album artwork"/><category term="clipassist"/><category term="extraction"/><category term="iTunes"/><category term="migration to secure site"/><category term="news"/><category term="siteviz"/><category term="tips"/><category term="web page"/><category term="Mac"/><category term="SID"/><category term="Server reponse codes"/><category term="Sitemap"/><category term="assembly"/><category term="cocoa"/><category term="discount"/><category term="html validation"/><category term="mac app store"/><category term="retro"/><category term="secure website"/><category term="webcrawlers"/><category term="website crawling"/><category term="website migration"/><category term="xml sitemap"/><category term="6502"/><category term="6510"/><category term="MacOS"/><category term="RC2014"/><category term="Spotify"/><category term="accessibility"/><category term="automated home"/><category term="beta"/><category term="chiptune"/><category term="game music"/><category term="homebrew"/><category term="https://"/><category term="machine code"/><category term="opinion"/><category term="rant"/><category term="review"/><category term="scraping"/><category term="security"/><category term="software"/><category term="website content management"/><category term="website monitor"/><category term="wordpress"/><category term="SSL"/><category term="SharpResize"/><category term="TL866"/><category term="audio"/><category term="blogger"/><category term="coding"/><category term="cover artwork"/><category term="crawl"/><category term="debugging"/><category term="extract"/><category term="features"/><category term="free app"/><category term="http request"/><category term="https"/><category term="iPhone"/><category term="insecure content"/><category term="linked files"/><category term="major releases"/><category term="markdown"/><category term="meta data"/><category term="objective-c"/><category term="productivity"/><category term="reactivity"/><category term="scrape"/><category term="scripting"/><category term="smartbulbs"/><category term="update"/><category term="views"/><category term="vinyl"/><category term="watchman"/><category term="website audit"/><category term="website editor"/><category term="10.4"/><category term="3D touch"/><category term="3rd party must-haves"/><category term="8-bit"/><category term="ADA"/><category term="ARM"/><category term="Apple"/><category term="Augmented Reality"/><category term="BASIC"/><category term="Bin-it"/><category term="Bing"/><category term="Black Friday"/><category term="C64"/><category term="Craig Federighi the sexy beast"/><category term="DSP"/><category term="Expression Engine"/><category term="FAQs"/><category term="French"/><category term="G4"/><category term="GUI"/><category term="I love it when"/><category term="IDE"/><category term="IHX"/><category term="International Domain Names"/><category term="IoT"/><category term="Linux"/><category term="M1"/><category term="MIDISID"/><category term="Mac Deals"/><category term="Meander"/><category term="Mojave"/><category term="Raspberry Pi Zero"/><category term="Sheet music"/><category term="Upgrade"/><category term="WGAC"/><category term="Z80"/><category term="a good read"/><category term="advertising"/><category term="affiliate"/><category term="ai"/><category term="announcements"/><category term="apple music"/><category term="apps"/><category term="artificial intelligence"/><category term="audiophile"/><category term="authentication"/><category term="battery"/><category term="blacklist"/><category term="blast from the past"/><category term="bookmarks"/><category term="browsers"/><category term="bundle"/><category term="bundles"/><category term="bytecode"/><category term="cartoon"/><category term="certificate"/><category term="character encoding"/><category term="client and server"/><category term="clipboard"/><category term="coco"/><category term="code"/><category term="colouring"/><category term="compliance"/><category term="conformity"/><category term="copy"/><category term="coupons"/><category term="csv"/><category term="cyber Monday"/><category term="dark mode"/><category term="dendrite"/><category term="development"/><category term="development board"/><category term="division by zero"/><category term="due diligence"/><category term="education"/><category term="email addresses"/><category term="embedded"/><category term="emoji"/><category term="emoticon"/><category term="everweb"/><category term="force touch"/><category term="games"/><category term="genetic algorithm"/><category term="getting started"/><category term="hand-coding"/><category term="hardware"/><category term="help"/><category term="htmltomd"/><category term="iMac"/><category term="iOS"/><category term="image manipulation"/><category term="internet of things"/><category term="language"/><category term="learning"/><category term="letter-writing"/><category term="lightstrips"/><category term="localization"/><category term="major brands"/><category term="mining"/><category term="mixed content"/><category term="musicXML"/><category term="musings"/><category term="notarization"/><category term="notation"/><category term="offer"/><category term="online tool"/><category term="padlock"/><category term="paste"/><category term="pasteboard"/><category term="philosophy"/><category term="plain text"/><category term="poor website"/><category term="post-apocalyptic skills"/><category term="ppc"/><category term="predictions and mispredictions"/><category term="pro"/><category term="redirect chain"/><category term="redirection"/><category term="redirects"/><category term="reseller"/><category term="rom"/><category term="sale"/><category term="scan"/><category term="schedules"/><category term="sci-fi"/><category term="server response analysis"/><category term="sharing"/><category term="smart buttons"/><category term="smarthome"/><category term="social media"/><category term="soft 404"/><category term="sound processing"/><category term="spam"/><category term="stickies"/><category term="sticky notes"/><category term="stream of consciousness"/><category term="structured data"/><category term="syntax"/><category term="table"/><category term="terminal"/><category term="testing"/><category term="text"/><category term="third party apps"/><category term="time machine"/><category term="toilet paper"/><category term="toilet roll"/><category term="trawl"/><category term="unintentional humour"/><category term="validation"/><category term="viny"/><category term="voucher codes"/><category term="website search"/><category term="whitelist"/><category term="wholesale"/><category term="wix"/><category term="workaround"/><category term="yellowpages.com"/><title type='text'>PeacockMedia</title><subtitle type='html'>News and Views</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='https://blog.peacockmedia.software/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default'/><link rel='alternate' type='text/html' href='https://blog.peacockmedia.software/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default?start-index=26&amp;max-results=25'/><author><name>peahen</name><uri>http://www.blogger.com/profile/02395503525006623752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimgDW08-cvcVvUH-9GZKfT7A2RlB6dPtSLg2xUaQG9ju0JGsxgRi97eTA3vHpq1KY_ObUwbav2PQtDrJFONgs7W0pdZczaogO6q6UZp3QCk6sYeaPbdsQsPAb1ytVhIg/s113/shiela.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>308</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5423774879231339244.post-6851688655220382689</id><published>2024-07-17T02:08:00.000-07:00</published><updated>2024-07-22T05:18:55.669-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="GUI"/><category scheme="http://www.blogger.com/atom/ns#" term="Mac"/><category scheme="http://www.blogger.com/atom/ns#" term="rom"/><category scheme="http://www.blogger.com/atom/ns#" term="TL866"/><title type='text'>Progress with the Mac GUI application for Minipro (GUMP) : Use a TL866 programmer to program ROM chips</title><content type='html'>&lt;p&gt;The passage of time is frightening. I see that it has been three years since &lt;a href=&quot;https://blog.peacockmedia.software/2021/03/mac-graphic-user-interface-gui.html&quot; target=&quot;_blank&quot;&gt;I first posted about GUMP&lt;/a&gt;. I had expected a greater response.&amp;nbsp;&lt;/p&gt;&lt;p&gt;In the mean time I&#39;ve continued to use my GUI wrapper for minipro when burning ROM chips with my TL866 clone because that has been far friendlier than using the command line. It takes away the need to remember the switches or type the path to the binary.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBIPajpjFiHWiq_01rhJRYDg-w8BvyImLiMLK8PhNHicMm6gStHmTkCCoFz1gX-ExY7uHmvF9X198BdAq2W3Vfpf5PJWmX8GZGhroCB8amGiHDz3ljILEI1-cKFBdSLjBq9FYcuvCL310/s1494/Screenshot+2024-07-17+at+09.38.46.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;720&quot; data-original-width=&quot;1494&quot; height=&quot;154&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBIPajpjFiHWiq_01rhJRYDg-w8BvyImLiMLK8PhNHicMm6gStHmTkCCoFz1gX-ExY7uHmvF9X198BdAq2W3Vfpf5PJWmX8GZGhroCB8amGiHDz3ljILEI1-cKFBdSLjBq9FYcuvCL310/w320-h154/Screenshot+2024-07-17+at+09.38.46.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;I&#39;ve used one or two other of my apps in conjunction with GUMP - &lt;a href=&quot;https://peacockmedia.software/mac/peep/&quot;&gt;Peep&lt;/a&gt; for &#39;hexeditor&#39;-style viewing of the data read from a chip or checking the binary to be written. And a makeshift script for taking one file (or a blank file padded with FF or 00) and incorporating a smaller file at a given start address.&amp;nbsp;&lt;/p&gt;&lt;p&gt;This has all been very clunky and disjointed. Plus there are some other features that I wanted. For example, a lookup for the supported device names and a list of &#39;favourites&#39; to save having to keep a note of which device name I last used for the chips that I burn regularly.&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;A new version&lt;/h3&gt;&lt;p&gt;So I&#39;ve been doing the work to roll all of this together and add the new features. The result is a new version of GUMP. I&#39;m still testing and developing, but it&#39;s now in a state where I can call it &#39;beta&#39; and unleash it on anyone who wants to try it. &amp;nbsp;&lt;b&gt;[update 22 Jul 24]&lt;/b&gt;&amp;nbsp;Now&amp;nbsp;&lt;a href=&quot;https://peacockmedia.software/mac/gump/index.html&quot;&gt;released as a free beta&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT2sFcy6fDD02o2RFn0rIG0aEMsXyzC2-P-sbAzURTpaQ_lZXK3U6XmOSle_pa4YODlDCIINksuZaLGQX75towm3aU4Tj3KFTYu5VSD0cpA3lPKVpreLB5ZSJQl2yp_DmH25-DpS4DU8c9LMFsxA3BjVbadMllApUvXcNDjMQyV0EWY2uzxjbCJUuXWnw/s1296/Screenshot%202024-07-17%20at%2009.26.10.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1109&quot; data-original-width=&quot;1296&quot; height=&quot;274&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT2sFcy6fDD02o2RFn0rIG0aEMsXyzC2-P-sbAzURTpaQ_lZXK3U6XmOSle_pa4YODlDCIINksuZaLGQX75towm3aU4Tj3KFTYu5VSD0cpA3lPKVpreLB5ZSJQl2yp_DmH25-DpS4DU8c9LMFsxA3BjVbadMllApUvXcNDjMQyV0EWY2uzxjbCJUuXWnw/s320/Screenshot%202024-07-17%20at%2009.26.10.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Above the tabbed area is the &#39;device&#39; field. You can type the name of your chip if you know it, or press the search button, type a partial string, see results and choose the one you want.&amp;nbsp;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieWshPU74gCMPq9c0zeckcqRKd9b5JaPAFciXgUvON0wwqtLhPZCI-fHEdlOUsnNkMNbFjMkthILr8Nrg2_NPPiFk3Bp4zIvnYgEXqfC5aDYWUQAb0-awRLJc8o5LlY1ma9eNlRsU-t_YURyQYittEAWt3Rupm7wQOd5Swu8sgUDKCpkPHnb83P5Pts-4/s650/Screenshot%202024-07-17%20at%2010.06.18.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;442&quot; data-original-width=&quot;650&quot; height=&quot;136&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieWshPU74gCMPq9c0zeckcqRKd9b5JaPAFciXgUvON0wwqtLhPZCI-fHEdlOUsnNkMNbFjMkthILr8Nrg2_NPPiFk3Bp4zIvnYgEXqfC5aDYWUQAb0-awRLJc8o5LlY1ma9eNlRsU-t_YURyQYittEAWt3Rupm7wQOd5Swu8sgUDKCpkPHnb83P5Pts-4/w200-h136/Screenshot%202024-07-17%20at%2010.06.18.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Once selected you can add it to your &#39;favourites&#39; which are available in a drop-down list at any time.&lt;/div&gt;&lt;div&gt;&lt;p style=&quot;text-align: left;&quot;&gt;Below that is the tabbed area. The &#39;Read&#39; tab obviously allows you to read the chip and see the data in a &#39;hexeditor&#39; style viewer. You can export this to a file if you want. The &#39;combine&#39; checkbox allows you to use the data read from the chip as the starting point to build the output data.&lt;/p&gt;&lt;p style=&quot;text-align: left;&quot;&gt;Below that is a console area which relays the minipro output. This has minimal value but at least tells you whether the operation succeeded or failed, and sometimes why.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuKRjZhZAAO31vdfnnKo4N0BYEnT_Pf__2fjmz4svZaNxvaUWG6D0eDj2qssdtDWdL9xtwOGNQV_ZLA6sw5aepkLRiYx-yk73ZMbijAH-CnpDpCjjxhChlRPX9SeAiA_HovDcNj_RIcBRB-JRRfwZcNVcCQMttSjFkmAVswVvuMcMkR9XvSoWPAYmwK1k/s1296/Screenshot%202024-07-17%20at%2009.25.46.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1109&quot; data-original-width=&quot;1296&quot; height=&quot;274&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuKRjZhZAAO31vdfnnKo4N0BYEnT_Pf__2fjmz4svZaNxvaUWG6D0eDj2qssdtDWdL9xtwOGNQV_ZLA6sw5aepkLRiYx-yk73ZMbijAH-CnpDpCjjxhChlRPX9SeAiA_HovDcNj_RIcBRB-JRRfwZcNVcCQMttSjFkmAVswVvuMcMkR9XvSoWPAYmwK1k/s320/Screenshot%202024-07-17%20at%2009.25.46.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p style=&quot;text-align: left;&quot;&gt;The &#39;Write/Verify&#39; tab displays the data that you&#39;ll be writing to the chip. You can open a binary file, specify a start address, optionally combine this with the data read in from the chip and padd it to a certain size (although a switch allows you to suppress the error from minipro if it&#39;s shorter than the capacity of your chip). You can edit this byte by byte.&amp;nbsp;&lt;/p&gt;&lt;p&gt;There are a few useful switches presented as checkboxes.&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3XC593vq1nkp7FqmhNBgwi9VppswVMr5cEvuR4E5v5O2RnOa9Lvka6ulgce32dhvI7GcJmds62-pltUYz-DK6kZMWjkAhGbtpZIrqkLcP0_FlJ_zqh4NBKjv8mu1p-gj7_ZLCq07JYxnSUOlSt72sTnX_97n7_X2PZAnzCjzEl96fsNtBXOaw7-G1_5M/s584/Screenshot%202024-07-17%20at%2009.52.42.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;294&quot; data-original-width=&quot;584&quot; height=&quot;161&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3XC593vq1nkp7FqmhNBgwi9VppswVMr5cEvuR4E5v5O2RnOa9Lvka6ulgce32dhvI7GcJmds62-pltUYz-DK6kZMWjkAhGbtpZIrqkLcP0_FlJ_zqh4NBKjv8mu1p-gj7_ZLCq07JYxnSUOlSt72sTnX_97n7_X2PZAnzCjzEl96fsNtBXOaw7-G1_5M/s320/Screenshot%202024-07-17%20at%2009.52.42.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;The Prefs window allows you to specify the location of minipro. This must be installed separately but if you use homebrew that&#39;s as simple as&amp;nbsp;&lt;b style=&quot;caret-color: rgb(34, 34, 34); color: #222222; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13.2px;&quot;&gt;brew install minipro&amp;nbsp;&lt;/b&gt;You can specify the full path here if minipro isn&#39;t in your search path.&lt;p&gt;&lt;b&gt;[update 22 Jul 24]&lt;/b&gt; Now &lt;a href=&quot;https://peacockmedia.software/mac/gump/index.html&quot;&gt;released as a free beta&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://blog.peacockmedia.software/feeds/6851688655220382689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://blog.peacockmedia.software/2024/07/progress-with-mac-gui-application-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/6851688655220382689'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/6851688655220382689'/><link rel='alternate' type='text/html' href='https://blog.peacockmedia.software/2024/07/progress-with-mac-gui-application-for.html' title='Progress with the Mac GUI application for Minipro (GUMP) : Use a TL866 programmer to program ROM chips'/><author><name>peahen</name><uri>http://www.blogger.com/profile/02395503525006623752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimgDW08-cvcVvUH-9GZKfT7A2RlB6dPtSLg2xUaQG9ju0JGsxgRi97eTA3vHpq1KY_ObUwbav2PQtDrJFONgs7W0pdZczaogO6q6UZp3QCk6sYeaPbdsQsPAb1ytVhIg/s113/shiela.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBIPajpjFiHWiq_01rhJRYDg-w8BvyImLiMLK8PhNHicMm6gStHmTkCCoFz1gX-ExY7uHmvF9X198BdAq2W3Vfpf5PJWmX8GZGhroCB8amGiHDz3ljILEI1-cKFBdSLjBq9FYcuvCL310/s72-w320-h154-c/Screenshot+2024-07-17+at+09.38.46.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5423774879231339244.post-4852149860664572853</id><published>2022-10-21T04:02:00.001-07:00</published><updated>2022-10-21T04:03:37.196-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="scrutiny"/><category scheme="http://www.blogger.com/atom/ns#" term="structured data"/><category scheme="http://www.blogger.com/atom/ns#" term="website analysis"/><category scheme="http://www.blogger.com/atom/ns#" term="website audit"/><title type='text'>Structured Data in Scrutiny Scans</title><content type='html'>&lt;p&gt;Back in April we &lt;a href=&quot;https://blog.peacockmedia.software/2022/04/milestone-for-scrutiny-v12-available-as.html&quot;&gt;launched version 12 of Scrutiny&lt;/a&gt; (skipping 11).&amp;nbsp;&lt;/p&gt;&lt;p&gt;Since then the topic of structured data has been raised by users.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Scrutiny has long collected Twitter and open graph meta data, and has displayed those fields in its SEO &amp;gt; Meta Data table. But not structured data provided via json-ld.&amp;nbsp;&lt;/p&gt;&lt;p&gt;It&#39;s easy to collect this but not so easy to display it en masse as it has a &#39;tree&#39; structure.&lt;/p&gt;&lt;p&gt;Here are some first steps. I&#39;m open to discussion on where to go from here. The following is all possible with the current version of &lt;a href=&quot;https://peacockmedia.software/mac/scrutiny/&quot;&gt;Scrutiny, 12.5.0&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The json-ld is collected from each page and parsed. Perhaps the most important pieces of information are the @types. Like headings there may be multiple, and at different levels, so like headings they can be displayed in the table, in a single column using a separator and in the order that they appear.&lt;/p&gt;&lt;p&gt;The column can be switched on using the Columns selector above the SEO &amp;gt; Meta Data table&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhbG95QmU0LcHxuF-9Z0K-R-eot5QGURSbfV0b74mEpXwSkCoSV18qvuwAr7cGL0KmFXRHdLr3Uazf9SQVvGn716s1JGNQWPvtXeMxj1vlrsNV-ZKwyq_vKwHslYeaTGFmCL-PtFSUdhbVONkCvPX53MSgtTcK5CiLvIrjr23t4-9gi97L5WREkxx5K&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;309&quot; data-original-width=&quot;909&quot; height=&quot;136&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhbG95QmU0LcHxuF-9Z0K-R-eot5QGURSbfV0b74mEpXwSkCoSV18qvuwAr7cGL0KmFXRHdLr3Uazf9SQVvGn716s1JGNQWPvtXeMxj1vlrsNV-ZKwyq_vKwHslYeaTGFmCL-PtFSUdhbVONkCvPX53MSgtTcK5CiLvIrjr23t4-9gi97L5WREkxx5K=w400-h136&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;That allows you to see at a glance what pages have the structured data and what type(s) are used.&lt;p&gt;&lt;/p&gt;&lt;p&gt;For more detail on a particular page, a double click in this table opens the Page Inspector:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgyAMDRHBmkjZrLRwXDvx373vrlMdPo5QTv2y8M3kCI9AZiqiIyruVjf1z_vCjDvX4yYbpXZrQcdbb1nY4kCveIn8Yb5oCdJ1iv3bnwnc2OURPxow1eAcJihwzQKHXWmdAyft44EAnLwXR_HjTaYALNqxG6RRjs8zlKq0HSWgOn8bu7NzT3vbv6Gkf4&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;414&quot; data-original-width=&quot;921&quot; height=&quot;180&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgyAMDRHBmkjZrLRwXDvx373vrlMdPo5QTv2y8M3kCI9AZiqiIyruVjf1z_vCjDvX4yYbpXZrQcdbb1nY4kCveIn8Yb5oCdJ1iv3bnwnc2OURPxow1eAcJihwzQKHXWmdAyft44EAnLwXR_HjTaYALNqxG6RRjs8zlKq0HSWgOn8bu7NzT3vbv6Gkf4=w400-h180&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This is the Meta data &amp;gt; json-ld tab of the Page Inspector. Note that we&#39;re not seeing the original json string from the page. It has been parsed and formatted. It&#39;s the way that a machine would read it, and if Scrutiny can&#39;t read the json, then there will be an error message here. (You can see that I&#39;ve used @graph here in order to display both the software application and the breadcrumb list &amp;nbsp;within the same chunk of json-ld. If there are multiple chunks of json-ld on the page then they&#39;ll be amalgamated here.)&lt;p&gt;&lt;/p&gt;&lt;p&gt;Also in the same inspector is a Twitter Card viewer. This will display information from the Twitter meta data if present, and fall back on Open Graph (og:) fields, as Twitter does. This doesn&#39;t look exactly the way that Twitter would display the information - Twitter also draws on info from the Twitter account referenced.&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiBwjTiLWg3TtkC-W2KG5loI5WfZ3EsdoIdgjuLrO7u17v4enf_F3YRO0UqcbVGnnfdOQoXES3MdBEMxAa9Hxmuort-BWnavj7rLQCmqAANHZu7KSGitwva4aOs8eWTZEEy_pSzW6oOEpjaM0r2_vNdm97NDfJcxMRQ0P5d_9A2djpubXZILX8DAeIh&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;228&quot; data-original-width=&quot;780&quot; height=&quot;118&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiBwjTiLWg3TtkC-W2KG5loI5WfZ3EsdoIdgjuLrO7u17v4enf_F3YRO0UqcbVGnnfdOQoXES3MdBEMxAa9Hxmuort-BWnavj7rLQCmqAANHZu7KSGitwva4aOs8eWTZEEy_pSzW6oOEpjaM0r2_vNdm97NDfJcxMRQ0P5d_9A2djpubXZILX8DAeIh=w400-h118&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='https://blog.peacockmedia.software/feeds/4852149860664572853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://blog.peacockmedia.software/2022/10/structured-data-in-scrutiny-scans.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/4852149860664572853'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/4852149860664572853'/><link rel='alternate' type='text/html' href='https://blog.peacockmedia.software/2022/10/structured-data-in-scrutiny-scans.html' title='Structured Data in Scrutiny Scans'/><author><name>peahen</name><uri>http://www.blogger.com/profile/02395503525006623752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimgDW08-cvcVvUH-9GZKfT7A2RlB6dPtSLg2xUaQG9ju0JGsxgRi97eTA3vHpq1KY_ObUwbav2PQtDrJFONgs7W0pdZczaogO6q6UZp3QCk6sYeaPbdsQsPAb1ytVhIg/s113/shiela.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEhbG95QmU0LcHxuF-9Z0K-R-eot5QGURSbfV0b74mEpXwSkCoSV18qvuwAr7cGL0KmFXRHdLr3Uazf9SQVvGn716s1JGNQWPvtXeMxj1vlrsNV-ZKwyq_vKwHslYeaTGFmCL-PtFSUdhbVONkCvPX53MSgtTcK5CiLvIrjr23t4-9gi97L5WREkxx5K=s72-w400-h136-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5423774879231339244.post-5712439306139707006</id><published>2022-07-28T16:44:00.001-07:00</published><updated>2022-07-28T16:44:06.007-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MIDISID"/><category scheme="http://www.blogger.com/atom/ns#" term="Pi Pico"/><title type='text'>Milestone for MIDISID</title><content type='html'>&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjGFLefKAb9kUdZiWG6G0VSYotgTatuLnaRRn6qH2573uFfBqv2PU2EUpAODNz2Q4XkqqGsEv3o3Ej4ej1F_6gNVMdNvs7KBw5C2JPtdsEL7iNgDi4lKb4oW63EzcN4ACkhHSTC4ztswJLkI9l7Ben9FIn2I-fTViofBniA5y7lkZFAFr2KnaSzH80L&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;534&quot; data-original-width=&quot;1000&quot; height=&quot;171&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjGFLefKAb9kUdZiWG6G0VSYotgTatuLnaRRn6qH2573uFfBqv2PU2EUpAODNz2Q4XkqqGsEv3o3Ej4ej1F_6gNVMdNvs7KBw5C2JPtdsEL7iNgDi4lKb4oW63EzcN4ACkhHSTC4ztswJLkI9l7Ben9FIn2I-fTViofBniA5y7lkZFAFr2KnaSzH80L&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;MIDISID has two SID chips (modern SID replacements, SwinSID Nanos) driven by a Pi Pico. It has MIDI in and audio out.&lt;p&gt;&lt;/p&gt;&lt;p&gt;I&#39;d hoped that this version of the boards (above) would be the final &#39;release&#39; version. There are some very minor tweaks to make but I&#39;ll be building 5 of these - one for myself and four for people interested in an &#39;earlybird&#39; deal. I&#39;ll try a black version too.&lt;/p&gt;&lt;p&gt;The firmware has taken many many hours, and it&#39;s clear that there will always be new features on the horizon. If it sells then I look forward to the ongoing development.&lt;/p&gt;&lt;p&gt;It&#39;s working very well, see the video below, in which it is in &#39;General MIDI&#39; mode, I&#39;m playing in the MIDI files for the DOOM levels.&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/0DUO1UN6YhQ&quot; width=&quot;320&quot; youtube-src-id=&quot;0DUO1UN6YhQ&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='https://blog.peacockmedia.software/feeds/5712439306139707006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://blog.peacockmedia.software/2022/07/milestone-for-midisid.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/5712439306139707006'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/5712439306139707006'/><link rel='alternate' type='text/html' href='https://blog.peacockmedia.software/2022/07/milestone-for-midisid.html' title='Milestone for MIDISID'/><author><name>peahen</name><uri>http://www.blogger.com/profile/02395503525006623752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimgDW08-cvcVvUH-9GZKfT7A2RlB6dPtSLg2xUaQG9ju0JGsxgRi97eTA3vHpq1KY_ObUwbav2PQtDrJFONgs7W0pdZczaogO6q6UZp3QCk6sYeaPbdsQsPAb1ytVhIg/s113/shiela.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEjGFLefKAb9kUdZiWG6G0VSYotgTatuLnaRRn6qH2573uFfBqv2PU2EUpAODNz2Q4XkqqGsEv3o3Ej4ej1F_6gNVMdNvs7KBw5C2JPtdsEL7iNgDi4lKb4oW63EzcN4ACkhHSTC4ztswJLkI9l7Ben9FIn2I-fTViofBniA5y7lkZFAFr2KnaSzH80L=s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5423774879231339244.post-2810911079483877425</id><published>2022-07-09T15:59:00.002-07:00</published><updated>2022-07-09T16:01:14.722-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Pi Pico"/><category scheme="http://www.blogger.com/atom/ns#" term="RC2014"/><title type='text'>Picoterm v1.1 released, choice of colours and Turbo Pascal 3</title><content type='html'>&lt;p&gt;A user reported that when using Turbo Pascal 3 on his RC2014, scrolling within the source code editor wasn&#39;t working.&lt;/p&gt;&lt;p&gt;My way of investigating issues with escape codes is to load up a modified version of PicoTerm which prints every character as a number. I also had the RC2014 connected to a terminal on my Mac, so I could still use TP3.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyoInwxLepViw_NnifhHjC0_HkTtAD1fY87nT29QhV_DBUGWdLSny0hyZYY373TRPsx5ulltwU4bZU_xIgu3jev1wv6-WIyYoMek_ZgfFnvLvjIqqbzxFBnxFlxSm5zc6jdS62NdTAUSqs59qAIoKkohFZJ3-SEzKlyQpAeI1oJpYEyHEjecRHlWXS/s4032/IMG_9165.HEIC&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;3024&quot; data-original-width=&quot;4032&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyoInwxLepViw_NnifhHjC0_HkTtAD1fY87nT29QhV_DBUGWdLSny0hyZYY373TRPsx5ulltwU4bZU_xIgu3jev1wv6-WIyYoMek_ZgfFnvLvjIqqbzxFBnxFlxSm5zc6jdS62NdTAUSqs59qAIoKkohFZJ3-SEzKlyQpAeI1oJpYEyHEjecRHlWXS/s320/IMG_9165.HEIC&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Investigating these numbers showed that the scroll up / scroll down (and also the scrolls that happen when you cursor to the top or bottom of the window) all rely on two escape codes that PicoTerm didn&#39;t support:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;esc&amp;gt;[1L&lt;br /&gt;&lt;p&gt;and&lt;/p&gt;&lt;p&gt;&amp;lt;esc&amp;gt;[1M&lt;/p&gt;&lt;p&gt;These are not listed on the &lt;a href=&quot;https://en.wikipedia.org/wiki/ANSI_escape_code&quot;&gt;Wikipedia ANSI escape code page&lt;/a&gt;, which has been my main reference.&amp;nbsp;&lt;a href=&quot;https://blog.peacockmedia.software/2021/12/picoterm-terminal-application-for.html&quot;&gt;PicoTerm didn&#39;t support them&lt;/a&gt; before today. (And neither did PiGFX as far as I can see.) But they do work within minicom and Teraterm, so it seems that they&#39;re reasonably &#39;standard&#39;.&lt;/p&gt;&lt;p&gt;It appears that these codes mean &#39;insert a line at the cursor position, scrolling everything down&#39; &amp;nbsp;and &#39;delete a line at the cursor position, scrolling everything up&#39;. &amp;nbsp;I have assumed that the number is the number of lines to scroll, although I can&#39;t be sure about this until I find some documentation.&lt;/p&gt;&lt;p&gt;Picoterm is built with scrolling in mind - each line of text is a structure, and the display buffer is an array of pointers to these structures, so scrolling is no more than switching 30 pointers around, and clearing a line.&lt;/p&gt;&lt;p&gt;So adding support for these escape codes was straightforward. Each is a variation on the scroll that is already used when the cursor reaches the bottom of the screen.&lt;/p&gt;&lt;p&gt;Here is a quick demo, first showing another new feature of the textmode (mono) version of PicoTerm - the ability to switch colour on startup, according to button A, B or C being held on power-up. White, Green or Amber.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Then a quick demo of the scrolling up and down within Turbo Pascal 3&#39;s editor.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/fNbKbAoymL8&quot; width=&quot;320&quot; youtube-src-id=&quot;fNbKbAoymL8&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;More information about&lt;a href=&quot;https://peacockmedia.software/RC2014/picoterm/&quot;&gt; PicoTerm generally, and downloads, are here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://blog.peacockmedia.software/feeds/2810911079483877425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://blog.peacockmedia.software/2022/07/picoterm-v11-released-choice-of-colours.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/2810911079483877425'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/2810911079483877425'/><link rel='alternate' type='text/html' href='https://blog.peacockmedia.software/2022/07/picoterm-v11-released-choice-of-colours.html' title='Picoterm v1.1 released, choice of colours and Turbo Pascal 3'/><author><name>peahen</name><uri>http://www.blogger.com/profile/02395503525006623752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimgDW08-cvcVvUH-9GZKfT7A2RlB6dPtSLg2xUaQG9ju0JGsxgRi97eTA3vHpq1KY_ObUwbav2PQtDrJFONgs7W0pdZczaogO6q6UZp3QCk6sYeaPbdsQsPAb1ytVhIg/s113/shiela.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyoInwxLepViw_NnifhHjC0_HkTtAD1fY87nT29QhV_DBUGWdLSny0hyZYY373TRPsx5ulltwU4bZU_xIgu3jev1wv6-WIyYoMek_ZgfFnvLvjIqqbzxFBnxFlxSm5zc6jdS62NdTAUSqs59qAIoKkohFZJ3-SEzKlyQpAeI1oJpYEyHEjecRHlWXS/s72-c/IMG_9165.HEIC" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5423774879231339244.post-4803026013145267900</id><published>2022-06-21T16:02:00.007-07:00</published><updated>2022-06-22T07:43:06.413-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Pi Pico"/><title type='text'>Clock, temperature and humidity display using Badger2040</title><content type='html'>&lt;p&gt;&amp;nbsp;The Badger2040 is a RP2040 with e-ink display. Or possibly an e-ink display with a RP2040 on the back:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicECDbsrULaMRPhZaJS8rX_3ziX_SJPwhU49ITHEGWjBbMxZGXJbNliYBiaEEHo1YaWvtgphcEatPOqkQpzDaXjxXd9WzFh9kkMjKafcnv5KGeG4kacNfQzpCaZ2FVjOd2N2cDaYQyrZboe8Ya_5SPO63rd4BZ_GMN7Ok3l6aKBPp2AukhlNfLMNUA/s3242/IMG_8878.heic&quot; style=&quot;margin-left: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2432&quot; data-original-width=&quot;3242&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicECDbsrULaMRPhZaJS8rX_3ziX_SJPwhU49ITHEGWjBbMxZGXJbNliYBiaEEHo1YaWvtgphcEatPOqkQpzDaXjxXd9WzFh9kkMjKafcnv5KGeG4kacNfQzpCaZ2FVjOd2N2cDaYQyrZboe8Ya_5SPO63rd4BZ_GMN7Ok3l6aKBPp2AukhlNfLMNUA/s320/IMG_8878.heic&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;It has other goodies like 2Mb of flash ram, some buttons and lots of connectors such as a battery connector, stemma/qwiic socket and breakout pads for various serial connections. And USB-C for programming and serial in/out.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdtaCMsSeJd_HapgBk9lI1YHlIVxfJim0PDYTiFYXtZ1jsJ0efc9nRNJoKIUzwcWrkwa_6qibjzZAu71398b7CVDnKz2Po6QA5CC8PGhqBaPzm7DpoEmig8PD_A5KfqWDSYeL4DpCwBHI3pUC3VKqvl9_ni1PjHRmup__RS-DWT8VwKxSUKDzpWVLs/s4032/IMG_8877.HEIC&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;3024&quot; data-original-width=&quot;4032&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdtaCMsSeJd_HapgBk9lI1YHlIVxfJim0PDYTiFYXtZ1jsJ0efc9nRNJoKIUzwcWrkwa_6qibjzZAu71398b7CVDnKz2Po6QA5CC8PGhqBaPzm7DpoEmig8PD_A5KfqWDSYeL4DpCwBHI3pUC3VKqvl9_ni1PjHRmup__RS-DWT8VwKxSUKDzpWVLs/s320/IMG_8877.HEIC&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;I&#39;ve added an Adafruit temperature / humitity sensor using the stemma connector. This particular sensor is&amp;nbsp;AHT20. The only negative thing about that for this project is that it has a fixed i2c address, and I would have liked to hook up two, one for indoor and one for outdoor temperature. I&#39;ll have to buy another which is a different type and has a different address.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For now my program is reading the data from the one sensor and displaying the temp and humidity. This took me some time because the libraries for this sensor (that I could find) were either circuit python or arduino. &amp;nbsp;If you want to use either of those things, you only need to write a couple of lines of code. For C (or in this case C++) &amp;nbsp;I had to write my own code starting with&amp;nbsp;i2c_write_blocking() and&amp;nbsp;i2c_read_blocking() and referring to the AHT20 data sheet and the Arduino library. An annoying bug (on my part) meant that I spent more hours than I should have on that.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With that done it was a breeze to print the stuff to the screen (using the Badger C++ example code). I wrote the clock from scratch using the time.h functions within the Pi Pico C SDK to access and process the hardware timer - get_absolute_time(), to_ms_since_boot() etc. &amp;nbsp;I&#39;ve got the up and down buttons adjusting the hours or minutes up or down, with buttons A and B switching between adjusting hours and minutes.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It looks great. The e-ink display is very easy to read in any light and uses no power, except when updating. &amp;nbsp;I&#39;ve got the screen updating every 30s or if you push a button to adjust the time. &amp;nbsp;Another curious thing about this type of display is that it keeps displaying its contents even with power disconnected. Meaning if you wear it as an actual badge, you don&#39;t need to power it once it&#39;s displaying what you want!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The battery pack that comes with the Badger is a bit chunky (two AAAs inside). I don&#39;t know how long that lasts, but I might use a small lithium battery instead, that can be stowed more easily on the back.&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;b&gt;UPDATE&lt;/b&gt;&lt;/p&gt;&lt;p&gt;I&#39;ve now got it running off my first found-free-in-the-street &amp;nbsp;battery. This is a relatively small one compared to the 500+ mAh ones &lt;a href=&quot;https://www.youtube.com/watch?v=PsJMj7FtroY&quot;&gt;Big Clive&lt;/a&gt; has been finding but it is nice and flat and it has been powering another pico project of mine and showed no signs of flagging. I&#39;ll be fascinated to see how long it runs the Badger!&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtNrdAho34Y27s_d128i_UwUll-odqo9xvikzazLJYwkEqqZK5vP0jRBbO8jaZXO1jb40TvaMA8Cj6rCrZJZrnePUyRCsqzLG3EuZ23_rrefTC4bWUtQYe4N983lDgMDDn99oZRnaDGza4adajX2m7cIHidEPDpDSrH2nRVDPqdZ2AdpIT_X2RxJ3_/s3294/IMG_8880.heic&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2470&quot; data-original-width=&quot;3294&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtNrdAho34Y27s_d128i_UwUll-odqo9xvikzazLJYwkEqqZK5vP0jRBbO8jaZXO1jb40TvaMA8Cj6rCrZJZrnePUyRCsqzLG3EuZ23_rrefTC4bWUtQYe4N983lDgMDDn99oZRnaDGza4adajX2m7cIHidEPDpDSrH2nRVDPqdZ2AdpIT_X2RxJ3_/s320/IMG_8880.heic&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Another improvement I&#39;ve made today is to make the clock periodically write some details to the flash memory, so that if power is removed, it&#39;ll start up displaying the same time as it did when disconnected. That saves a lot of button-pressing after a battery change.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I&#39;ve been struggling with writing to the flash memory on the Pico and on this device, but today I solved my issue. Basically don&#39;t have USB stdio enabled while trying to write to the flash.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzklSC45Pn-IgKSHJWBxOcrhAikmGV-si0tojTockda_xPVYTFLnQUPRdH8A8Hwpf65SrXUnI6uoZNi17ol7Iwr3r0DpOiRlLHZwXz8V9v9PbDCyUy6lDnW0f1gN8WmNN0hlRvJ4RNFm8aQ-dtLpoZrxKHIAJ2Q0Mywe49S74R1T2MxiWVwwWFiqEo/s3024/IMG_8882.HEIC&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;3024&quot; data-original-width=&quot;3024&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzklSC45Pn-IgKSHJWBxOcrhAikmGV-si0tojTockda_xPVYTFLnQUPRdH8A8Hwpf65SrXUnI6uoZNi17ol7Iwr3r0DpOiRlLHZwXz8V9v9PbDCyUy6lDnW0f1gN8WmNN0hlRvJ4RNFm8aQ-dtLpoZrxKHIAJ2Q0Mywe49S74R1T2MxiWVwwWFiqEo/s320/IMG_8882.HEIC&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://blog.peacockmedia.software/feeds/4803026013145267900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://blog.peacockmedia.software/2022/06/clock-temperature-and-humidity-display.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/4803026013145267900'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/4803026013145267900'/><link rel='alternate' type='text/html' href='https://blog.peacockmedia.software/2022/06/clock-temperature-and-humidity-display.html' title='Clock, temperature and humidity display using Badger2040'/><author><name>peahen</name><uri>http://www.blogger.com/profile/02395503525006623752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimgDW08-cvcVvUH-9GZKfT7A2RlB6dPtSLg2xUaQG9ju0JGsxgRi97eTA3vHpq1KY_ObUwbav2PQtDrJFONgs7W0pdZczaogO6q6UZp3QCk6sYeaPbdsQsPAb1ytVhIg/s113/shiela.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicECDbsrULaMRPhZaJS8rX_3ziX_SJPwhU49ITHEGWjBbMxZGXJbNliYBiaEEHo1YaWvtgphcEatPOqkQpzDaXjxXd9WzFh9kkMjKafcnv5KGeG4kacNfQzpCaZ2FVjOd2N2cDaYQyrZboe8Ya_5SPO63rd4BZ_GMN7Ok3l6aKBPp2AukhlNfLMNUA/s72-c/IMG_8878.heic" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5423774879231339244.post-4775284755647640944</id><published>2022-04-25T08:06:00.004-07:00</published><updated>2022-06-12T11:01:59.263-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="scrutiny"/><title type='text'>Milestone for Scrutiny - v12</title><content type='html'>&lt;p&gt;Last year we spent many months &lt;a href=&quot;https://blog.peacockmedia.software/2021/08/the-future-for-integrity-and-scrutiny.html&quot;&gt;rewriting our website crawling engine, the reasons are here.&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Since then, Integrity went through a beta period and eventually Integrity, Integrity Plus and Pro version 12 were released.&amp;nbsp;&lt;/p&gt;&lt;p&gt;There have &lt;a href=&quot;https://peacockmedia.software/mac/integrity/version_history.html&quot;&gt;been many updates&lt;/a&gt;, those apps are becoming mature, the problems found are now increasingly obscure.&amp;nbsp;&lt;/p&gt;&lt;p&gt;As well as fixing issues with the new Integrity, Scrutiny has been catching up.&amp;nbsp;&lt;/p&gt;&lt;p&gt;It&#39;s now based on Integrity. That approach comes with some compromises (see notes below) but the benefits for all of us are great.&amp;nbsp;&lt;/p&gt;&lt;p&gt;It also means a totally different interface. Or rather reverting, because up until version 4 Scrutiny had the open, tabbed Integrity-like interface. The move away from that wasn&#39;t popular and Scrutiny&#39;s UI has been its weak point.&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1IciavKwYmT5G0lShDYDgVwN9-e9mFynVqh4xSpXpzJDojnxyqQY3JkzWrHtuyDQ9JLSZaRRBvl13icDXUx8dxnpQ_lQDxNM1XLZ7A7tIoOurQ4ESXxc33BL6QOcz_NSQQIsardPj2jpuasiuPsbm209NcNxbnabmKaUoQj8wzW-YFPEKLqjD6gfl/s1505/Screenshot%202022-04-25%20at%2015.44.42.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;866&quot; data-original-width=&quot;1505&quot; height=&quot;184&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1IciavKwYmT5G0lShDYDgVwN9-e9mFynVqh4xSpXpzJDojnxyqQY3JkzWrHtuyDQ9JLSZaRRBvl13icDXUx8dxnpQ_lQDxNM1XLZ7A7tIoOurQ4ESXxc33BL6QOcz_NSQQIsardPj2jpuasiuPsbm209NcNxbnabmKaUoQj8wzW-YFPEKLqjD6gfl/s320/Screenshot%202022-04-25%20at%2015.44.42.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Notes: &lt;/b&gt;(also in the release notes within the .dmg)&lt;/p&gt;&lt;p&gt;There will be no autosaved data for a site until you&#39;ve run a scan. Your previous scans will only be visible in the previous version. V12 requires new scans before autosaved data is available. This is due to the format of some of the data changing a little,&amp;nbsp;&lt;/p&gt;&lt;p&gt;V12 isn&#39;t document-based. This is part of consolidating Scrutiny &amp;amp; Integrity. Being document-based requires a different architecture within the app, introduces the need for all sorts of complexity and workarounds. The compromise is that it&#39;s no longer possible to run multiple scans at the same time. Until there&#39;s a &#39;queueing&#39; system built into Scrutiny 12, you&#39;ll need to make sure that any scheduled scans don&#39;t overlap time-wise.&amp;nbsp;&lt;/p&gt;&lt;p&gt;V12 doesn&#39;t have monitoring or orphan check. &amp;nbsp;I don&#39;t think either of these features will be missed, and if there is a call for the monitoring functionality, it should be in a separate app.&amp;nbsp;&lt;/p&gt;&lt;p&gt;The layout is different. I should say &#39;reverted&#39; because until version 4, Scrutiny shared the Integrity-style interface, and the move away from that wasn&#39;t popular. Scrutiny&#39;s UI for managing websites hasn&#39;t been very user-friendly and had come in for some criticism. It also made it impossible for Voiceover to work (requires visible tabs).&lt;/p&gt;&lt;p&gt;Automatic ftp of sitemaps is no longer available. Scrutiny saves the xml sitemap, you must transfer it yourself. &amp;nbsp;ftp and ftp+SSL (ftps) has been fine but sftp (which in my experience is now more common) has been problematic&lt;/p&gt;&lt;p&gt;French localisation is unfortunately no longer available. I&#39;m grateful to French-speaking paying customers and people who have offered to help with the translation. The problem isn&#39;t paying for translation, but the fact that any new feature or change to the interface (which are happening all the time) requires an interaction with the translator and I prefer a much more agile process. The apps haven&#39;t been noticeably more popular in French-speaking countries than without the localisation.&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://blog.peacockmedia.software/feeds/4775284755647640944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://blog.peacockmedia.software/2022/04/milestone-for-scrutiny-v12-available-as.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/4775284755647640944'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/4775284755647640944'/><link rel='alternate' type='text/html' href='https://blog.peacockmedia.software/2022/04/milestone-for-scrutiny-v12-available-as.html' title='Milestone for Scrutiny - v12'/><author><name>peahen</name><uri>http://www.blogger.com/profile/02395503525006623752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimgDW08-cvcVvUH-9GZKfT7A2RlB6dPtSLg2xUaQG9ju0JGsxgRi97eTA3vHpq1KY_ObUwbav2PQtDrJFONgs7W0pdZczaogO6q6UZp3QCk6sYeaPbdsQsPAb1ytVhIg/s113/shiela.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1IciavKwYmT5G0lShDYDgVwN9-e9mFynVqh4xSpXpzJDojnxyqQY3JkzWrHtuyDQ9JLSZaRRBvl13icDXUx8dxnpQ_lQDxNM1XLZ7A7tIoOurQ4ESXxc33BL6QOcz_NSQQIsardPj2jpuasiuPsbm209NcNxbnabmKaUoQj8wzW-YFPEKLqjD6gfl/s72-c/Screenshot%202022-04-25%20at%2015.44.42.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5423774879231339244.post-6063884806427952038</id><published>2022-04-21T09:30:00.002-07:00</published><updated>2022-04-21T11:51:21.482-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="hardware"/><category scheme="http://www.blogger.com/atom/ns#" term="Music"/><category scheme="http://www.blogger.com/atom/ns#" term="Pi Pico"/><category scheme="http://www.blogger.com/atom/ns#" term="SID"/><title type='text'></title><content type='html'>Having got so far with the MIDI SID project, I had this real mess of wires and boards. Then I started to add to the carnage with knobs and a display. &amp;nbsp;&lt;div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJt66C_MkzI-iHRpn4rPE_tQPhF3wcJe_8modgjimkfvQwSa7JtcKwmgUD76uy0nIknDDG6eKMuy-BHl2DpkNbn-ODNZ14vnuPSsozSf6k2FhXMikpLhk7M3wnByRHG93DwGpVlP9OgripKamDLtIQbEEL1vxmOjvNg0iOnXrekmBXd5LqH8Hame5z/s4028/IMG_8388.heic&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;br /&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2337&quot; data-original-width=&quot;4028&quot; height=&quot;186&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJt66C_MkzI-iHRpn4rPE_tQPhF3wcJe_8modgjimkfvQwSa7JtcKwmgUD76uy0nIknDDG6eKMuy-BHl2DpkNbn-ODNZ14vnuPSsozSf6k2FhXMikpLhk7M3wnByRHG93DwGpVlP9OgripKamDLtIQbEEL1vxmOjvNg0iOnXrekmBXd5LqH8Hame5z/s320/IMG_8388.heic&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;The problem was that if something stopped working I couldn&#39;t be sure whether it was because I&#39;d got something wrong, or had just jogged a connection.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Happily, prototype boards are so cheap that you can order something without worrying about the cost. This isn&#39;t even really a prototype yet, not all of the components are on the board. I just wanted the Pico, two SIDs (in this case swinsids) and the MIDI in circuit soldered firmly in place so that I could experiment with knobs, buttons and displays, and develop the software without fear of breaking it by jogging the desk!&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;3024&quot; data-original-width=&quot;3024&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhryAZ56fN5AkvDgeXReZoZeAcJqcQf-b1ybf0VDnzK7VMY9brIAzTl-v2hW-_XTrTufOPFsCuec4y3Atbq9g7KZOwlHY5yjTD3fMyVS9-wetmOpmN2iwVW6jGHwvn7BKiDHm5ckEbf1VAICNvG3o9Dh1uC01IQ7FVCiSUjSDKI1hFtEn46gh9iphMr/s320/IMG_8392.HEIC&quot; style=&quot;caret-color: rgb(0, 0, 238); color: #0000ee; text-decoration: underline;&quot; width=&quot;320&quot; /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglDtodZsqlzmHEoOo-UuRVFbxyHRlSJu4HBvs4EkH-br-a8X9sPBhTpO5WFwQ51ocOZVOTZNo0SspirJL69GPo66ewephGeXiaxYtb3B5rX73XL6-1KSGZds-8Ym44r3yg2qFfgg7TkvQuAiZ8U9S5_m_8XHF5bU1BWEUWHYr7jHo-P0n3NUOKha3W/s2121/IMG_8394.heic&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2019&quot; data-original-width=&quot;2121&quot; height=&quot;305&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglDtodZsqlzmHEoOo-UuRVFbxyHRlSJu4HBvs4EkH-br-a8X9sPBhTpO5WFwQ51ocOZVOTZNo0SspirJL69GPo66ewephGeXiaxYtb3B5rX73XL6-1KSGZds-8Ym44r3yg2qFfgg7TkvQuAiZ8U9S5_m_8XHF5bU1BWEUWHYr7jHo-P0n3NUOKha3W/s320/IMG_8394.heic&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;To get you up-to-date if you haven&#39;t seen my ramblings about this, I&#39;d love a box with MIDI input, SID chips inside, audio out, and simple controls. I&#39;d like to be able to play a .mid file into it, or plug in a keyboard, with options for polyphonic or monophonic output. (I&#39;ve done some of this using a C64 and MIDI cartridge, but it&#39;ll be good to have a standalone box.) &amp;nbsp;I&#39;d like to try a larger version with enough SIDs to be able to map each midi channel to a voice. Maybe in time I could add the components needed to support real SIDs, but being able to use ARMSIDs would be good as they&#39;re a great replacement. (I&#39;m not sure that it&#39;s ethical to encourage anyone to use precious real SIDs in something like this.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Quick demo of the thing working (just one channel in, one voice playing). I&#39;ve got Logic Pro playing a simple tune, with a USB-MIDI converter allowing me to plug that into this board.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/JtS8dL5QWos&quot; width=&quot;320&quot; youtube-src-id=&quot;JtS8dL5QWos&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;If you&#39;re interested in the project, I&#39;m going to use the hashtag &lt;a href=&quot;https://twitter.com/search?q=%23MIDISID&quot;&gt;#MIDISID &lt;/a&gt;on Twitter.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://blog.peacockmedia.software/feeds/6063884806427952038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://blog.peacockmedia.software/2022/04/h-aving-got-so-far-with-midi-sid.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/6063884806427952038'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/6063884806427952038'/><link rel='alternate' type='text/html' href='https://blog.peacockmedia.software/2022/04/h-aving-got-so-far-with-midi-sid.html' title=''/><author><name>peahen</name><uri>http://www.blogger.com/profile/02395503525006623752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimgDW08-cvcVvUH-9GZKfT7A2RlB6dPtSLg2xUaQG9ju0JGsxgRi97eTA3vHpq1KY_ObUwbav2PQtDrJFONgs7W0pdZczaogO6q6UZp3QCk6sYeaPbdsQsPAb1ytVhIg/s113/shiela.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJt66C_MkzI-iHRpn4rPE_tQPhF3wcJe_8modgjimkfvQwSa7JtcKwmgUD76uy0nIknDDG6eKMuy-BHl2DpkNbn-ODNZ14vnuPSsozSf6k2FhXMikpLhk7M3wnByRHG93DwGpVlP9OgripKamDLtIQbEEL1vxmOjvNg0iOnXrekmBXd5LqH8Hame5z/s72-c/IMG_8388.heic" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5423774879231339244.post-1439380189660437376</id><published>2022-03-06T02:28:00.001-08:00</published><updated>2022-03-06T02:28:19.195-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Pi Pico"/><title type='text'></title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgYqmAzRObZ_7nSxaZFQflljluk5fk7Vyx9yHa_edaWSkMxIFqwCwRV1GvBa9u5sb1mCoe8JN4IEqQ045SmPLo3xGEfWnr-Grln3ZgdDhYSfzaixRs_r9pJEJ7v7Cbx7TG7-ZHTa7EFG-QJ0oAMJ1zRHlS9uH964XOgeQSQ4p_NO0XLPMqIDYcJ4HvI=s1600&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1046&quot; data-original-width=&quot;1600&quot; height=&quot;209&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgYqmAzRObZ_7nSxaZFQflljluk5fk7Vyx9yHa_edaWSkMxIFqwCwRV1GvBa9u5sb1mCoe8JN4IEqQ045SmPLo3xGEfWnr-Grln3ZgdDhYSfzaixRs_r9pJEJ7v7Cbx7TG7-ZHTa7EFG-QJ0oAMJ1zRHlS9uH964XOgeQSQ4p_NO0XLPMqIDYcJ4HvI=s320&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Minstrel the 4th is a modern recreation of the Jupiter Ace, a &lt;a href=&quot;https://en.wikipedia.org/wiki/Jupiter_Ace&quot;&gt;lesser-known home computer from 1982&lt;/a&gt;. It&#39;s notable for its use of Forth rather than BASIC which was common at the time.&lt;/p&gt;&lt;p&gt;The Ace had a ZX Spectrum-like rubber keyboard. The Minstrel&#39;s is an improvement but its small tactile switches don&#39;t really allow for fast typing.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiuj9nz8Fv9dofsJfR8sdqeQVxsQjDXQ3x6lHdGczCtQSAc7-QMxCRbFOfC3SPbMWyNsMmECICDfMZ2PbgARzcP8i1ZvIhA28MjgOto9MScWwSDI66dzcCf8UaxsMfPG0VWYlDk8ir2xKxAqRzw1ZFJCcwxAl6bSHJ28H6DVYh3r9lckP070M0NqvH-=s3943&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2922&quot; data-original-width=&quot;3943&quot; height=&quot;237&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiuj9nz8Fv9dofsJfR8sdqeQVxsQjDXQ3x6lHdGczCtQSAc7-QMxCRbFOfC3SPbMWyNsMmECICDfMZ2PbgARzcP8i1ZvIhA28MjgOto9MScWwSDI66dzcCf8UaxsMfPG0VWYlDk8ir2xKxAqRzw1ZFJCcwxAl6bSHJ28H6DVYh3r9lckP070M0NqvH-=s320&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;The Minstrel and similar computer scan the keyboard by reading a group of hardware ports which correspond with half-rows of the keyboard. They expose the bus as an expansion port, so it&#39;s possible to intercept those port reads. Here&#39;s my working prototype, it uses quite a bit of logic. The Pico&#39;s main job is to act as a USB host and allow a modern keyboard to be plugged into its own micro-USB port. and maps the keypresses it receives to the appropriate rows and columns of the Minstrel&#39;s keyboard matrix.&lt;p&gt;It&#39;s not only the size and arrangement of the keys that limit typing speed, but the fact that the keyboard matrix is scanned every 1/50th second and then not buffered. So even with modern key switches, this makes typing on computers like the Ace, ZX81 and Spectrum is a bit of a plod. It&#39;s easy for the Pico to buffer the keyboard input, and present it to the Minstrel one key at a time, at a speed that it can handle.&lt;/p&gt;&lt;p&gt;This also opens up the possibility of connecting a serial terminal to the device to allow listings to be pasted to the Minstrel. It also means that anything you type using a USB keyboard can be echoed to the terminal giving you a paper tape of &amp;nbsp;In the top picture you can see that the finished product has a USB-FTDI adaptor attached for this purpose.&lt;/p&gt;&lt;p&gt;My interface is now in production in small batches, please &lt;a href=&quot;https://peacockmedia.software/general-contact-form.html&quot;&gt;contact me for details&lt;/a&gt;.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='https://blog.peacockmedia.software/feeds/1439380189660437376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://blog.peacockmedia.software/2022/03/minstrel-4th-is-modern-recreation-of.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/1439380189660437376'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/1439380189660437376'/><link rel='alternate' type='text/html' href='https://blog.peacockmedia.software/2022/03/minstrel-4th-is-modern-recreation-of.html' title=''/><author><name>peahen</name><uri>http://www.blogger.com/profile/02395503525006623752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimgDW08-cvcVvUH-9GZKfT7A2RlB6dPtSLg2xUaQG9ju0JGsxgRi97eTA3vHpq1KY_ObUwbav2PQtDrJFONgs7W0pdZczaogO6q6UZp3QCk6sYeaPbdsQsPAb1ytVhIg/s113/shiela.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEgYqmAzRObZ_7nSxaZFQflljluk5fk7Vyx9yHa_edaWSkMxIFqwCwRV1GvBa9u5sb1mCoe8JN4IEqQ045SmPLo3xGEfWnr-Grln3ZgdDhYSfzaixRs_r9pJEJ7v7Cbx7TG7-ZHTa7EFG-QJ0oAMJ1zRHlS9uH964XOgeQSQ4p_NO0XLPMqIDYcJ4HvI=s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5423774879231339244.post-7886587112870043890</id><published>2022-02-28T08:03:00.001-08:00</published><updated>2022-02-28T08:03:17.223-08:00</updated><title type='text'> Integrity v12 launched</title><content type='html'>&lt;p&gt;You may already know that we spent a chunk of last year bringing Integrity&#39;s engine up-to-date. You can read the reasons for this in an earlier post:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://blog.peacockmedia.software/2021/08/the-future-for-integrity-and-scrutiny.html&quot;&gt;https://blog.peacockmedia.software/2021/08/the-future-for-integrity-and-scrutiny.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;In the new year, this was released in the form of Integrity Pro 12 beta which was free and unrestricted. Jan and Feb have seen gradual fixes and improvements to that and this week v12 has quietly become the general release (with v10 also available and supported for a while as a safety net).&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhoxKl54s2AuiIM-PO-6Xt8muOtpnBvklXqX5LbMZFsCyLJ8Kq3ReYoDx01V5HcHdH98Zmqa0W8RtdPijWNf4rPBiAnCk0yCUItgHk1vVrw5vh_Ue-yJAEIwHQLY5n1KUI1MJ-0ptN6GM7Fl-W9sHCAH6OsXLJirBzSdxrYMWpt9ZDgO17G-HvMQOwz=s1326&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;899&quot; data-original-width=&quot;1326&quot; height=&quot;217&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhoxKl54s2AuiIM-PO-6Xt8muOtpnBvklXqX5LbMZFsCyLJ8Kq3ReYoDx01V5HcHdH98Zmqa0W8RtdPijWNf4rPBiAnCk0yCUItgHk1vVrw5vh_Ue-yJAEIwHQLY5n1KUI1MJ-0ptN6GM7Fl-W9sHCAH6OsXLJirBzSdxrYMWpt9ZDgO17G-HvMQOwz=s320&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;In case you&#39;re not familiar with the range, &lt;a href=&quot;https://peacockmedia.software/mac/integrity/free.html&quot;&gt;Integrity&lt;/a&gt; is a link checker, it&#39;s free and no-frills.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://peacockmedia.software/mac/integrity-plus/&quot;&gt;Integrity Plus&lt;/a&gt; allows you to manage settings for multiple sites, adds xml sitemap functionality, csv exporting and search box / filter button.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://peacockmedia.software/mac/integrity-pro/&quot;&gt;Integrity Pro&lt;/a&gt; adds many of Scrutiny&#39;s features; a SEO table, HTML validation table and spell-checking.&lt;/p&gt;&lt;p&gt;If you already hold a licence for Plus or Pro then that key will work with version 12, it&#39;s free for you. If you&#39;d like to go from Plus to Pro then there&#39;s a &lt;a href=&quot;https://peacockmedia.software/mac/integrity/upgrade.html&quot;&gt;lose-nothing upgrade&lt;/a&gt;, and also from&lt;a href=&quot;https://peacockmedia.software/mac/scrutiny/upgrade.html&quot;&gt; Plus or Pro to Scrutiny&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhaRn7IdgEPfww7keFbJ0-wF0Z-KNhXdyklX5PbMZiH9wcmu4UxiNXvAgX3QjifHYpeY5J-qGaIMBUeRCxatbiX--7vCYT0y6jp0pVTkG82SnCNQ9ZY-zVlg2YxGXuw67QIs_AfumgQnlqjldhRB2P759nigTmUwxEOYHCHlntUFPx7ELhG01Sju1tK=s64&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;64&quot; data-original-width=&quot;64&quot; height=&quot;64&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhaRn7IdgEPfww7keFbJ0-wF0Z-KNhXdyklX5PbMZiH9wcmu4UxiNXvAgX3QjifHYpeY5J-qGaIMBUeRCxatbiX--7vCYT0y6jp0pVTkG82SnCNQ9ZY-zVlg2YxGXuw67QIs_AfumgQnlqjldhRB2P759nigTmUwxEOYHCHlntUFPx7ELhG01Sju1tK&quot; width=&quot;64&quot; /&gt;&lt;/a&gt;&lt;/div&gt;(Note that if you&#39;re moving from v10 Integrity Plus to v12, or from Plus to Pro, &lt;a href=&quot;https://blog.peacockmedia.software/2022/02/this-is-quick-help-document-showing-how.html&quot;&gt;this will be useful&lt;/a&gt;.)&lt;p&gt;&lt;/p&gt;&lt;p&gt;If you&#39;re a blogger or journalist, I&#39;ve updated &lt;a href=&quot;https://peacockmedia.software/press-packs.html&quot;&gt;the Press Materials&lt;/a&gt; to include the new icons.&lt;/p&gt;&lt;h4 style=&quot;text-align: left;&quot;&gt;Scrutiny 12&lt;/h4&gt;&lt;p&gt;Scrutiny 12 is very much in progress. As with Integrity, there will be a revision of the pricing, and again, there&#39;ll be no fee for existing licence holders (v7 onwards). (Hint: now is a good time to buy or upgrade).&lt;/p&gt;&lt;p&gt;One big question:&amp;nbsp;&lt;b&gt;Scrutiny&lt;/b&gt; moved to a very different layout at version 5, which wasn&#39;t a popular decision, people liked the more open-plan tabbed layout of Integrity and the classic Scrutiny. &amp;nbsp;Should we return Scrutiny to that look? &amp;nbsp;Your opinion on this would be gratefully received.&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://blog.peacockmedia.software/feeds/7886587112870043890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://blog.peacockmedia.software/2022/02/integrity-v12-launched.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/7886587112870043890'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/7886587112870043890'/><link rel='alternate' type='text/html' href='https://blog.peacockmedia.software/2022/02/integrity-v12-launched.html' title=' Integrity v12 launched'/><author><name>peahen</name><uri>http://www.blogger.com/profile/02395503525006623752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimgDW08-cvcVvUH-9GZKfT7A2RlB6dPtSLg2xUaQG9ju0JGsxgRi97eTA3vHpq1KY_ObUwbav2PQtDrJFONgs7W0pdZczaogO6q6UZp3QCk6sYeaPbdsQsPAb1ytVhIg/s113/shiela.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEhoxKl54s2AuiIM-PO-6Xt8muOtpnBvklXqX5LbMZFsCyLJ8Kq3ReYoDx01V5HcHdH98Zmqa0W8RtdPijWNf4rPBiAnCk0yCUItgHk1vVrw5vh_Ue-yJAEIwHQLY5n1KUI1MJ-0ptN6GM7Fl-W9sHCAH6OsXLJirBzSdxrYMWpt9ZDgO17G-HvMQOwz=s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5423774879231339244.post-4768070870938866338</id><published>2022-02-22T02:25:00.001-08:00</published><updated>2022-02-22T02:25:17.510-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="help"/><title type='text'></title><content type='html'>&lt;p&gt;This is a quick help document showing how to transfer website configurations between Integrity Plus, Integrity Pro or Scrutiny.&lt;/p&gt;&lt;p&gt;For legacy reasons*, you may also need to do this if you&#39;re moving from the web download of Integrity Plus (non-App Store version) to the new v12 Integrity Plus.&lt;/p&gt;&lt;p&gt;First of all, run the new version to see whether this applies to you. You may see the websites that you set up in your previous version. If you don&#39;t, then read on.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;This is simply an export / import.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Using version 10 of Integrity Plus, File &amp;gt; Export &amp;gt; Settings &amp;gt; All websites&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgzebi96h2QTn5C7ff5wcEb2Y1KrVvpD5e0DAjXSxBDnZMC45em-2zSjpKxotO5o-IXA9yZ0KiIEjHChLe1Fe0o7OXFeyVnGuzqGwrO2F7qKI38w2pnffLPWfklskOMKsl8yz-6FqgTwwi4LZ_99FCtUemW-rFrZe64iXTQm7kVxP-h8RjUjhEWZc-x=s640&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;292&quot; data-original-width=&quot;640&quot; height=&quot;146&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgzebi96h2QTn5C7ff5wcEb2Y1KrVvpD5e0DAjXSxBDnZMC45em-2zSjpKxotO5o-IXA9yZ0KiIEjHChLe1Fe0o7OXFeyVnGuzqGwrO2F7qKI38w2pnffLPWfklskOMKsl8yz-6FqgTwwi4LZ_99FCtUemW-rFrZe64iXTQm7kVxP-h8RjUjhEWZc-x=s320&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Integrity will save a .lcsbatch file. Choose a location and confirm.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiex2V0ndgFA18xlXiPHEFjgAOeDUxZ0c_nZz5XmYdk1EwCE1vlKgc7G-LN2zvvRMFSHfWGr2TucaOQKI7jGRr7uTEcptKFJA4EQSrdGIkr-tvas-10YQt_y7YMJNECXRiKrYTWB9ULX9G-Hp4NNI8NzWPoUyGEzl0M6ndmn_8Y8GjYV-j6qqjJ71Kr=s505&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;267&quot; data-original-width=&quot;505&quot; height=&quot;169&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiex2V0ndgFA18xlXiPHEFjgAOeDUxZ0c_nZz5XmYdk1EwCE1vlKgc7G-LN2zvvRMFSHfWGr2TucaOQKI7jGRr7uTEcptKFJA4EQSrdGIkr-tvas-10YQt_y7YMJNECXRiKrYTWB9ULX9G-Hp4NNI8NzWPoUyGEzl0M6ndmn_8Y8GjYV-j6qqjJ71Kr=s320&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Using the new version 12, File &amp;gt; Open... and choose the file that you just saved.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhC2HNgImrgoMczBLVX_nypafkgKswr0NUIJjchnmuBJxOt_CqJm9qWdwKvyKbT6H8ra0eZGhvnAozg_wWVzjpQLRzFO6r_Y2wfFV7ozAq0C3gQT6d-aQDGllKHXfpn9uUAATPaZV4Gs1g-41hpSAOkR-aJA8d1MahRNsSeeXE2a1_uaaue_8kZwukd=s640&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;292&quot; data-original-width=&quot;640&quot; height=&quot;146&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhC2HNgImrgoMczBLVX_nypafkgKswr0NUIJjchnmuBJxOt_CqJm9qWdwKvyKbT6H8ra0eZGhvnAozg_wWVzjpQLRzFO6r_Y2wfFV7ozAq0C3gQT6d-aQDGllKHXfpn9uUAATPaZV4Gs1g-41hpSAOkR-aJA8d1MahRNsSeeXE2a1_uaaue_8kZwukd=s320&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;*Previously, the web downloads of Integrity Plus and Pro were not sandboxed, while the app store versions were sandboxed. Also, the web download and App Store versions of Integrity Plus had different bundle id&#39;s (meaning MacOS will see them as different apps).&amp;nbsp;&lt;/p&gt;&lt;p&gt;Version 12 corrects these inconsistencies, but means that the new Integrity Plus can&#39;t &#39;see&#39; the location where the previous version stored its data, making an automatic import impossible.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='https://blog.peacockmedia.software/feeds/4768070870938866338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://blog.peacockmedia.software/2022/02/this-is-quick-help-document-showing-how.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/4768070870938866338'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/4768070870938866338'/><link rel='alternate' type='text/html' href='https://blog.peacockmedia.software/2022/02/this-is-quick-help-document-showing-how.html' title=''/><author><name>peahen</name><uri>http://www.blogger.com/profile/02395503525006623752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimgDW08-cvcVvUH-9GZKfT7A2RlB6dPtSLg2xUaQG9ju0JGsxgRi97eTA3vHpq1KY_ObUwbav2PQtDrJFONgs7W0pdZczaogO6q6UZp3QCk6sYeaPbdsQsPAb1ytVhIg/s113/shiela.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEgzebi96h2QTn5C7ff5wcEb2Y1KrVvpD5e0DAjXSxBDnZMC45em-2zSjpKxotO5o-IXA9yZ0KiIEjHChLe1Fe0o7OXFeyVnGuzqGwrO2F7qKI38w2pnffLPWfklskOMKsl8yz-6FqgTwwi4LZ_99FCtUemW-rFrZe64iXTQm7kVxP-h8RjUjhEWZc-x=s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5423774879231339244.post-3836175155616670430</id><published>2022-02-16T04:06:00.000-08:00</published><updated>2022-02-16T04:06:10.076-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="integrity"/><category scheme="http://www.blogger.com/atom/ns#" term="integrity plus"/><category scheme="http://www.blogger.com/atom/ns#" term="Integrity Pro"/><category scheme="http://www.blogger.com/atom/ns#" term="link checker"/><category scheme="http://www.blogger.com/atom/ns#" term="scrutiny"/><category scheme="http://www.blogger.com/atom/ns#" term="website crawling"/><title type='text'>In simple terms, the best settings for Integrity and Scrutiny</title><content type='html'>&lt;p&gt;The default settings for &lt;a href=&quot;https://peacockmedia.software/mac/integrity/free.html&quot;&gt;Integrity&lt;/a&gt;, &lt;a href=&quot;https://peacockmedia.software/mac/integrity-plus/&quot;&gt;Integrity Plus&lt;/a&gt;, &lt;a href=&quot;https://peacockmedia.software/mac/integrity-pro/&quot;&gt;Integrity Pro&lt;/a&gt; and &lt;a href=&quot;https://peacockmedia.software/mac/scrutiny/&quot;&gt;Scrutiny&lt;/a&gt; have been tweaked over 15 years. Generally speaking, they will be the best settings and the most likely* to perform a successful, full &amp;nbsp;and useful scan.&lt;/p&gt;&lt;p&gt;The very short version of this post is: go with the defaults, and only adjust them if you understand and want to use an additional feature, or if you have a problem that may be cured by making a change. Please contact support if you&#39;re unsure about anything.&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiNkRNRDWArc-6Ut7cMDw8oNtsI7neSJ_SEWDkw-RJoLWwsGBbloVIysC3U3zTqHSyA-E35AeHqO4g1EpkDQJE8tHyQGTQhbnADj7zAcQAU2Z1tXsjQuis_j32OnfiLmd2ZCcrvmj9cBPo8eWTcmmuTJWXppsC_k0_vwMQ1zzijYARK5ooOZ5a_etlB=s745&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;542&quot; data-original-width=&quot;745&quot; height=&quot;233&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEiNkRNRDWArc-6Ut7cMDw8oNtsI7neSJ_SEWDkw-RJoLWwsGBbloVIysC3U3zTqHSyA-E35AeHqO4g1EpkDQJE8tHyQGTQhbnADj7zAcQAU2Z1tXsjQuis_j32OnfiLmd2ZCcrvmj9cBPo8eWTcmmuTJWXppsC_k0_vwMQ1zzijYARK5ooOZ5a_etlB=s320&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;The rest of this post gives a very basic &#39;layman&#39; explanation of the site-specific options and settings.&amp;nbsp;&lt;/p&gt;&lt;p&gt;In version 12 (in beta as I write this) these settings have been rearranged and grouped into a more logical order. They&#39;re listed below as they are grouped in version 12.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Options&lt;/b&gt;&lt;/p&gt;&lt;p&gt;These are optional features. In general, only enable them (or change the default) if you understand what they mean and are prepared to troubleshoot if the option causes unexpected results.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;b&gt;This page only&lt;/b&gt;: &amp;nbsp;Simple - sometimes you may want to scan a single page. If you want to scan an entire site, leave this switched off.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Check linked js and css files&lt;/b&gt;: &amp;nbsp;This will drill more deeply into the site. If you&#39;re looking for a straightforward link check, leave this off.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Check for broken images&lt;/b&gt;: &amp;nbsp;Finding broken images is probably as important as finding broken links, leave this on&lt;/li&gt;&lt;li&gt;&lt;b&gt;Check lazyload images/load images&lt;/b&gt;: &amp;nbsp;It&#39;s possible that your site uses lazyloading of images. If you know that it does then you may want to enable this. NB there is no standard for lazyloading images. Integrity will try to find the image urls in a couple of likely places, but this option can lead to false positives or duplication. Be prepared for troubleshooting.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Check anchors&lt;/b&gt;: &amp;nbsp;An anchor link takes you, not just to a page, but to a specific point on a page. With this option on, Integrity will check that the anchor point exists on the target page. If you know that your site uses this type of link, and you want to test them, enable this option.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Flag missing link url&lt;/b&gt;: &amp;nbsp;Sometimes during development, you&#39;ll create links with empty targets, or use # as a placeholder. This is a way to find those &#39;unfinished&#39; links.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Advanced&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Here we have the controls that may sometimes need to be altered to &#39;tune&#39; Integrity to your site. In general, the default values should work, only change them if you have a reason.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;b&gt;User-agent string&lt;/b&gt;: &amp;nbsp;The default values should work almost all of the time. If the user-agent string is how Integrity identifies itself. If this is set to that of a real browser (which is now the default value) then that should be fine. (Occasionally a site will give different pages for a mobile browser / desktop browser. Or to Googlebot.)&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Accept language&lt;/b&gt;: &amp;nbsp;can be used to check specific language pages of a multilingual site.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Timeouts and delays:&lt;/b&gt;&amp;nbsp; Use the defaults. If you have problems with timeouts or certain errors then it may be necessary to adjust these settings.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Site characteristics&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Here are a few settings which may need to be adjusted for your particular site. Again, the defaults should be fine, but refer to this guide or ask for help if you have problems.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;b&gt;Ignore querystrings&lt;/b&gt;: This is the option that is most likely to need changing to suit your particular site. The default is off and that&#39;ll probably be fine. However sometimes a session id or other things can be included in the querystring (the part after the ? in a url.) and sometimes these can cause loops or duplications. In that case the setting should be on. &amp;nbsp;On the flip side, sometimes important information can be included in the querystring, such as a page id, and so for those sites you definitely need the setting to be off.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Page urls have no file extension&lt;/b&gt; (more recently renamed &#39;&lt;b&gt;Starting url has page name without file extension&lt;/b&gt;&#39;): The explanation of what this box actually does is lengthy and it&#39;s more than likely that you don&#39;t need it switched on. &amp;nbsp;In the case where it&#39;s required, Integrity should recognise this and ask you an explicit question, and set this box accordingly.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Ignore trailing slash&lt;/b&gt;: It&#39;s very unlikely that this needs to be switched off (default is on). It has become less important in version 12 because its inner workings are slightly different.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;If you&#39;re using version 10 or earlier, then you&#39;ll have the option to &lt;b&gt;Check links on error pages&lt;/b&gt;. &amp;nbsp;I strongly advise leaving this switched off, as it&#39;s pretty likely to cause problems or confusion. v12 doesn&#39;t have the option.&amp;nbsp;&lt;/p&gt;&lt;p&gt;If you have a custom error page (which is likely to be one page) and want to test the links on it, then test it separately by setting up a single-page configuration to a non-existent url (such as mysite.com/xyzabc)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Rules&lt;/b&gt;&lt;/p&gt;&lt;p&gt;If you have a specific problem, then you can sometimes cure that with a targeted &#39;ignore&#39; or &#39;don&#39;t check&#39; rule. &amp;nbsp;&lt;/p&gt;&lt;p&gt;The other very useful use for rules is to either ignore an entire section of a site, or to limit the crawl to a specific part of a site.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;*It may not seem that way if yours is one of the sites that needs a change from default settings, but that&#39;s probability for you. &amp;nbsp;In practice, only the querystring setting is an unpredictable &#39;it depends&#39; setting. Go with the default, contact support if you need help.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='https://blog.peacockmedia.software/feeds/3836175155616670430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://blog.peacockmedia.software/2022/02/in-simple-terms-best-settings-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/3836175155616670430'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/3836175155616670430'/><link rel='alternate' type='text/html' href='https://blog.peacockmedia.software/2022/02/in-simple-terms-best-settings-for.html' title='In simple terms, the best settings for Integrity and Scrutiny'/><author><name>peahen</name><uri>http://www.blogger.com/profile/02395503525006623752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimgDW08-cvcVvUH-9GZKfT7A2RlB6dPtSLg2xUaQG9ju0JGsxgRi97eTA3vHpq1KY_ObUwbav2PQtDrJFONgs7W0pdZczaogO6q6UZp3QCk6sYeaPbdsQsPAb1ytVhIg/s113/shiela.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEiNkRNRDWArc-6Ut7cMDw8oNtsI7neSJ_SEWDkw-RJoLWwsGBbloVIysC3U3zTqHSyA-E35AeHqO4g1EpkDQJE8tHyQGTQhbnADj7zAcQAU2Z1tXsjQuis_j32OnfiLmd2ZCcrvmj9cBPo8eWTcmmuTJWXppsC_k0_vwMQ1zzijYARK5ooOZ5a_etlB=s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5423774879231339244.post-2361511246248414405</id><published>2022-01-31T06:51:00.000-08:00</published><updated>2022-01-31T06:51:19.446-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="integrity"/><category scheme="http://www.blogger.com/atom/ns#" term="integrity plus"/><category scheme="http://www.blogger.com/atom/ns#" term="Integrity Pro"/><category scheme="http://www.blogger.com/atom/ns#" term="link checker"/><category scheme="http://www.blogger.com/atom/ns#" term="scrutiny"/><category scheme="http://www.blogger.com/atom/ns#" term="website analysis"/><title type='text'>Locate : an overlooked feature in Integrity and Scrutiny</title><content type='html'>&lt;p&gt;&amp;nbsp;The Locate feature is an overlooked feature in &lt;a href=&quot;https://peacockmedia.software/mac/integrity/free.html&quot;&gt;Integrity&lt;/a&gt; and &lt;a href=&quot;https://peacockmedia.software/mac/scrutiny/&quot;&gt;Scrutiny&lt;/a&gt;. It answers the common question, &quot;Integrity is reporting a broken link on a page but I don&#39;t know where to find that page&quot; or &quot;that page shouldn&#39;t exist any more&quot;.&lt;/p&gt;&lt;p&gt;It tells you, as a user, how to find the link in question and the page it&#39;s on. These hyperlinks are clickable.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEh09UY_HPVzCQLjGNC0614ab7D-fF_0pYr2Op-J8tJo0jqhmPIMS0kJXnYnI6H_93UbJ8cj2THKvSH8rtHVdMEwMwB63cAW095X2EvPGJzhmOqkv0GmZQuvHoFbTYYyvfzocl42IAwBxgwVCBnSMHvbSa2QJF2pf8W0jjPNsu_-ba_hVQvsEpmN7cId=s1377&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;434&quot; data-original-width=&quot;1377&quot; height=&quot;126&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEh09UY_HPVzCQLjGNC0614ab7D-fF_0pYr2Op-J8tJo0jqhmPIMS0kJXnYnI6H_93UbJ8cj2THKvSH8rtHVdMEwMwB63cAW095X2EvPGJzhmOqkv0GmZQuvHoFbTYYyvfzocl42IAwBxgwVCBnSMHvbSa2QJF2pf8W0jjPNsu_-ba_hVQvsEpmN7cId=w400-h126&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;There may be more than one route to click through from the home page (or your starting url) to the link in question, but this tool should show the shortest.&lt;/p&gt;&lt;p&gt;It&#39;s important to distinguish here between link urls, and a single instance of a link.&lt;/p&gt;&lt;p&gt;In this example, I&#39;ve selected a link url which has tested as good. There may be links with that target url on multiple pages (or multiple links on the same page). For example a link to the home page probably exists on every page of a site, maybe in more than one place on a page.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEh59qZjvcT2vPs6KpkmbQmPyroB3ZwyNmaoVjUlx0icmPBX_IiiZCiuZn2J8ivPeVH_TX_OF26ZJ8Grsn_DvtwsRhdXw5NrT_da9EmxzjSTcnNmyDWfCjyJgyaiY35gDvtoa1z48f35HmNcpgLR_PyG0LjESEFrzfsmp7qswlC8zO8W3nE4EKmdvP3Q=s1551&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;327&quot; data-original-width=&quot;1551&quot; height=&quot;85&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEh59qZjvcT2vPs6KpkmbQmPyroB3ZwyNmaoVjUlx0icmPBX_IiiZCiuZn2J8ivPeVH_TX_OF26ZJ8Grsn_DvtwsRhdXw5NrT_da9EmxzjSTcnNmyDWfCjyJgyaiY35gDvtoa1z48f35HmNcpgLR_PyG0LjESEFrzfsmp7qswlC8zO8W3nE4EKmdvP3Q=w400-h85&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;A context menu* triggered by a right-click or control-click on that url row will only show options that are relevant to that url, or the page at that url. In order to access the Locate feature, you need to right-click one of the link instances, which are revealed when you expand the row.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The By page and By status views both show link instances when the page / status is expanded, so Locate can be accessed in those views after expanding a page/status. All Links is a flat table showing link instances, so Locate will appear when you right-click any row. In all of these cases it&#39;s important to only select a single row, Locate can&#39;t work on multiple selected items.&lt;br /&gt;&lt;p&gt;Similarly, if you open the link inspector, it concerns a link url and the status of that url when tested, and it has a table listing the instances or occurrences of that url in links. Before using the Locate button (or context menu in that table) it&#39;s important to select one of the instances in the table.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEj5TMPODq_4aus_jJU5jHnNx3_V1QfR-JA4swq8bMhl_XP-qFHQ5AzYEn5Pd1259vxMCpnZZp9BNRS2UQQTWq_hPRaKEUbgN-NlZK37g80s_1YJTzfm4PixPwKQDF50ookfDZVmQo9MOEBWX1asGu9YOuYPZY9A3_cAdviJo285Z5s4lu1JyY671c6M=s912&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;689&quot; data-original-width=&quot;912&quot; height=&quot;242&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEj5TMPODq_4aus_jJU5jHnNx3_V1QfR-JA4swq8bMhl_XP-qFHQ5AzYEn5Pd1259vxMCpnZZp9BNRS2UQQTWq_hPRaKEUbgN-NlZK37g80s_1YJTzfm4PixPwKQDF50ookfDZVmQo9MOEBWX1asGu9YOuYPZY9A3_cAdviJo285Z5s4lu1JyY671c6M=s320&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;Recent versions of Integrity and Scrutiny may have Locate in these context menus but it may not appear to do anything. This is fixed in Integrity and Scrutiny v10.4.12+&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://blog.peacockmedia.software/feeds/2361511246248414405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://blog.peacockmedia.software/2022/01/locate-overlooked-feature-in-integrity.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/2361511246248414405'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/2361511246248414405'/><link rel='alternate' type='text/html' href='https://blog.peacockmedia.software/2022/01/locate-overlooked-feature-in-integrity.html' title='Locate : an overlooked feature in Integrity and Scrutiny'/><author><name>peahen</name><uri>http://www.blogger.com/profile/02395503525006623752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimgDW08-cvcVvUH-9GZKfT7A2RlB6dPtSLg2xUaQG9ju0JGsxgRi97eTA3vHpq1KY_ObUwbav2PQtDrJFONgs7W0pdZczaogO6q6UZp3QCk6sYeaPbdsQsPAb1ytVhIg/s113/shiela.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEh09UY_HPVzCQLjGNC0614ab7D-fF_0pYr2Op-J8tJo0jqhmPIMS0kJXnYnI6H_93UbJ8cj2THKvSH8rtHVdMEwMwB63cAW095X2EvPGJzhmOqkv0GmZQuvHoFbTYYyvfzocl42IAwBxgwVCBnSMHvbSa2QJF2pf8W0jjPNsu_-ba_hVQvsEpmN7cId=s72-w400-h126-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5423774879231339244.post-5386234106778618625</id><published>2022-01-16T04:48:00.000-08:00</published><updated>2022-01-16T04:48:09.602-08:00</updated><title type='text'>UPLOAD.COM for Z80 CP/M - usage</title><content type='html'>&lt;p&gt;&amp;nbsp;I feel very honoured to have written a utility which will be distributed as part of the system included with &lt;a href=&quot;https://rc2014.co.uk&quot;&gt;RC2014 kits&lt;/a&gt; with CP/M or ROMWBW.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8cg7ULr7FynUAjoMXzBqkVgx18a7wt2nqu61Tq2Gn6POTFhLlj-kiEsh2X2FYybcU8Fcp7dqCiiW7VsezMhqSwEVZd4J1FvV8IyPam_rjEi8zP5KnwUJGAOnkCrE0mXEJV7Mhs7Mm_3Y/s2048/IMG_5150.jpg&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;2048&quot; data-original-width=&quot;2001&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8cg7ULr7FynUAjoMXzBqkVgx18a7wt2nqu61Tq2Gn6POTFhLlj-kiEsh2X2FYybcU8Fcp7dqCiiW7VsezMhqSwEVZd4J1FvV8IyPam_rjEi8zP5KnwUJGAOnkCrE0mXEJV7Mhs7Mm_3Y/w196-h200/IMG_5150.jpg&quot; width=&quot;196&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Since upgrading my first RC2014 to CP/M, transferring files has been a bit tricky. My storage medium is a compact flash card, which I can&#39;t read with my modern computer system. I can &quot;dd&quot; it to make a backup, which is easy to transfer to a new card. But that doesn&#39;t allow me to put a file onto the card, or copy one off using my Mac.&lt;p&gt;&lt;/p&gt;&lt;p&gt;There are methods of reading the CF card on a new system, but I&#39;ve not made anything work for me.&amp;nbsp;&lt;/p&gt;&lt;p&gt;My favourite method of transferring my files onto the card is a combination of the DOWNLOAD.COM utility which comes with the CP/M system on the A: drive, and my own utility for creating a .PKG file. That&#39;s a hex format that works with the download utility. &lt;a href=&quot;https://blog.peacockmedia.software/2021/05/loading-files-onto-rc2014-from-mac.html&quot;&gt;I&#39;ve written about that here&lt;/a&gt;. &amp;nbsp;Spencer now provides a web utility which creates the same pkg file.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;The problem&lt;/b&gt;&lt;/p&gt;&lt;p&gt;That still leaves me unable to acquire a file that I&#39;ve created on the RC2014. I tend to develop in Forth and assembly on my modern computer, transferring the files to the RC to run them, so I rarely create files there on the card. But there have been times when I&#39;ve done so, and it would also be good to selectively back up files from the card rather than making an image of the whole thing.&lt;/p&gt;&lt;p&gt;Spencer asked me to have a go at writing UPLOAD.COM, the partner to DOWNLOAD.COM. I&#39;ve &lt;a href=&quot;https://blog.peacockmedia.software/2022/01/uploadcom-for-z80-cpm-writing-utility.html&quot;&gt;written about the process of creating the utility&lt;/a&gt; separately if you&#39;re interested in Z80 programming and the CP/M&#39;s BDOS.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Using UPLOAD.COM&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Sit UPLOAD.COM in A: alongside DOWNLOAD.COM&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_hIHdJ721PAjmSFcE2oK2fhFEIbc25Z-o5A7Q1sIKy9AXkfmyPDrL6AR_DW1PqQQ2Sl5CyWMaXi02FTWyDMzUrF9Ysdm02yCm5gyGO19gwZD9ZIwLnIEh_r5dxPjiu7JoWAVu2aYI9ox4/s1002/Screenshot+2021-09-13+at+15.21.59.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;739&quot; data-original-width=&quot;1002&quot; height=&quot;236&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_hIHdJ721PAjmSFcE2oK2fhFEIbc25Z-o5A7Q1sIKy9AXkfmyPDrL6AR_DW1PqQQ2Sl5CyWMaXi02FTWyDMzUrF9Ysdm02yCm5gyGO19gwZD9ZIwLnIEh_r5dxPjiu7JoWAVu2aYI9ox4/s320/Screenshot+2021-09-13+at+15.21.59.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;Then browse to any drive and use it like this:&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;A:UPLOAD MYFILE.COM&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;It is happy for you to give it wildcards in the standard way:&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;A:UPLOAD MAT?????.COM or&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;A:UPLOAD *.* for every file in the directory, as I&#39;ve done below.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmvxixsMRqoEIj1vj5uLqWZTZByc2en3kMb_OhC_PYYT-36CyFZ9di1WnngLqroY981hsLVNEMWT0hA50hvYFxXb_3uvNTZh0gDXOTUrpE89JYNxZOof01cByaqfU2kQVpPopBU7of-CQ/s1002/Screenshot+2021-09-13+at+15.25.11.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;764&quot; data-original-width=&quot;1002&quot; height=&quot;244&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmvxixsMRqoEIj1vj5uLqWZTZByc2en3kMb_OhC_PYYT-36CyFZ9di1WnngLqroY981hsLVNEMWT0hA50hvYFxXb_3uvNTZh0gDXOTUrpE89JYNxZOof01cByaqfU2kQVpPopBU7of-CQ/s320/Screenshot+2021-09-13+at+15.25.11.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Note that my terminal (minicom) doesn&#39;t do wrapping, and it doesn&#39;t allow me to select and copy the characters that are off the right-hand side. Those characters seem to be lost. The pkg format doesn&#39;t allow for breaks in the stream of hex characters.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The answer to this is to use the capture feature of your terminal program. In the case of minicom it&#39;s -C filename. &amp;nbsp;With that option, everything that comes to the console is also written to the file.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBnITEs-P0P3tp8ovQSl4kGTP6wb6Tu3nw1jn5sYmYJQzJ1pjUpREGxxrXc_MLqGgYjoxQWvcm5U3M4psHo0g1yxn3MXNGLH1xG1Tzo6ERO_EhULC0vwouP6ej7R4bi8mkmS85JfLCeM0/s680/Screenshot+2021-09-13+at+15.22.52.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;133&quot; data-original-width=&quot;680&quot; height=&quot;63&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBnITEs-P0P3tp8ovQSl4kGTP6wb6Tu3nw1jn5sYmYJQzJ1pjUpREGxxrXc_MLqGgYjoxQWvcm5U3M4psHo0g1yxn3MXNGLH1xG1Tzo6ERO_EhULC0vwouP6ej7R4bi8mkmS85JfLCeM0/s320/Screenshot+2021-09-13+at+15.22.52.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Here is my capture file, after UPLOADing all files in my B: drive. The process happens very quickly, and I was able to make a very convenient backup of every file in every drive on my CF card in a matter of minutes.&amp;nbsp;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisMq95-jaZMths2aOywmH_Y6FdR3Ico8MeWpWvn1_2-RD_LomxP7dclsyTL3UR2qFZWpJcShJMIDXl82LAjDvCDt7vvieeYIhuJ-uYOeT9me2VBfR9U6d5jV3-T2sCZY_gJEiTYNLFKeYM/s1180/Screenshot+2021-09-13+at+15.26.58.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1180&quot; data-original-width=&quot;1098&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisMq95-jaZMths2aOywmH_Y6FdR3Ico8MeWpWvn1_2-RD_LomxP7dclsyTL3UR2qFZWpJcShJMIDXl82LAjDvCDt7vvieeYIhuJ-uYOeT9me2VBfR9U6d5jV3-T2sCZY_gJEiTYNLFKeYM/s320/Screenshot+2021-09-13+at+15.26.58.png&quot; width=&quot;298&quot; /&gt;&lt;/a&gt;&lt;/div&gt;It&#39;s very easy to copy and paste any of those files back into CP/M. The first line of the PKG is the instruction to use DOWNLOAD to put the file into the current drive.</content><link rel='replies' type='application/atom+xml' href='https://blog.peacockmedia.software/feeds/5386234106778618625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://blog.peacockmedia.software/2022/01/uploadcom-for-z80-cpm-usage.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/5386234106778618625'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/5386234106778618625'/><link rel='alternate' type='text/html' href='https://blog.peacockmedia.software/2022/01/uploadcom-for-z80-cpm-usage.html' title='UPLOAD.COM for Z80 CP/M - usage'/><author><name>peahen</name><uri>http://www.blogger.com/profile/02395503525006623752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimgDW08-cvcVvUH-9GZKfT7A2RlB6dPtSLg2xUaQG9ju0JGsxgRi97eTA3vHpq1KY_ObUwbav2PQtDrJFONgs7W0pdZczaogO6q6UZp3QCk6sYeaPbdsQsPAb1ytVhIg/s113/shiela.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8cg7ULr7FynUAjoMXzBqkVgx18a7wt2nqu61Tq2Gn6POTFhLlj-kiEsh2X2FYybcU8Fcp7dqCiiW7VsezMhqSwEVZd4J1FvV8IyPam_rjEi8zP5KnwUJGAOnkCrE0mXEJV7Mhs7Mm_3Y/s72-w196-h200-c/IMG_5150.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5423774879231339244.post-6264600758871549713</id><published>2022-01-16T04:45:00.005-08:00</published><updated>2022-01-16T04:45:50.346-08:00</updated><title type='text'>UPLOAD.COM for Z80 CP/M - writing the utility</title><content type='html'>&lt;p&gt;Below is a pkg file. It&#39;s easy to see what&#39;s going on. Your source file is in hex and padded to the 128-byte boundary. There&#39;s a count and checksum at the end. The first line is the instruction to use &#39;download.com&#39; to put the file into the current directory as the name specified.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEic-N8DuMfUp7nmq8NWbYA2VirjbHI1vUghkIttY9Z2kYP1zyX7Ozv97rDW0Q0IZ3FldLH7Amsx4_ok5rKvwh8WNmKjZg7aoRv0i7MzR4orqk4l8UXn35qVNYSyYlGU6tMmWPwb-v1hBnWB/s846/Screenshot+2021-09-13+at+16.11.34.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;628&quot; data-original-width=&quot;846&quot; height=&quot;238&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEic-N8DuMfUp7nmq8NWbYA2VirjbHI1vUghkIttY9Z2kYP1zyX7Ozv97rDW0Q0IZ3FldLH7Amsx4_ok5rKvwh8WNmKjZg7aoRv0i7MzR4orqk4l8UXn35qVNYSyYlGU6tMmWPwb-v1hBnWB/s320/Screenshot+2021-09-13+at+16.11.34.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;I wrote this utility for my Mac some time ago, it allows me to convert any file, paste the result into the Terminal app I&#39;m using to communicate with my RC2014 and have the file copied onto one of the drives.&lt;/p&gt;&lt;p&gt;What has been missing is a way to do the opposite. To grab a file from the RC2014 as the original binary file. &lt;a href=&quot;https://blog.peacockmedia.software/2021/05/loading-files-onto-rc2014-from-mac.html&quot;&gt;I&#39;ve written about that problem here.&lt;/a&gt; The very neat solution would be to have a Z80 program which does this same conversion on the RC2014 and displays a file that you can copy and paste - and either convert back into a binary or store for re-downloading at some later point.&lt;/p&gt;&lt;p&gt;Conveniently, there&#39;s an example program in the &lt;a href=&quot;http://www.cpm.z80.de/manuals/cpm22-m.pdf&quot;&gt;CP/M Operating System Manual&lt;/a&gt; called A Sample File Dump Utility (5.4). This very nearly does what we want. It takes a filename as an argument and dumps that file as hex to the console (formatted neatly with numbering and spaces, which were easy to take out).&lt;/p&gt;&lt;p&gt;It was also easy to add the necessary count and checksum, output A:UPLOAD at the start along with the filename.&amp;nbsp;&lt;/p&gt;&lt;p&gt;I decided to look up the actual user number, rather than just printing &quot;U0&quot;. This is the start of my deep dive into BDOS - a series of operating system calls, documented and available for you to use in your programs. They tend to involve setting up parameters in Z80 registers, setting the C register to the number of the call that you want to make, and then CALLing the base of the BDOS.&lt;/p&gt;&lt;p&gt;I&#39;ve dabbled in this before, it provides convenient ways to receive keys and output characters to and from the console.&lt;/p&gt;&lt;p&gt;Getting the user number is simple.&amp;nbsp;&lt;/p&gt;&lt;p&gt;But then we came to parsing the passed argument for wildcards and finding matching files. The example program doesn&#39;t do this. It simply OPENs the file that&#39;s specified by the user, and if that happens to contain wildcards, the first matching file is opened.&amp;nbsp;&lt;/p&gt;&lt;p&gt;UPLOAD.COM would be a whole lot more useful if it does pattern matching and spews out all of the matching files. It now does and I&#39;ve demonstrated this in my guide.&lt;/p&gt;&lt;p&gt;The CP/M documentation isn&#39;t bad. It allowed me to discover that you can pass a filename to a &#39;first&#39; and &#39;next&#39; functions (17 and 18) which give you the first and subsequent matches for your filename which contains ? or *.&lt;/p&gt;&lt;p&gt;I learned that the system has a 128-character buffer at a known location, which is used for passing results for certain functions. For filenames It&#39;s divided into 4 32-byte buffers and you get a number 0-3 in A which you shift-multiply by 32 and add to the base address of the buffer for the result you need.&lt;/p&gt;&lt;p&gt;After calling the &#39;first match&#39; function, you have to call the &#39;next match&#39; immediately, and then again, as long as you receive a valid result. (You can use this same process without checking whether your filename contains wildcard characters. If it doesn&#39;t, then &#39;first match&#39; just returns your file, and &#39;next&#39; will return 255 meaning &#39;no more results&#39;).&lt;/p&gt;&lt;p&gt;It would seem sensible to use the &#39;first&#39; and &#39;next&#39; system at the start and make an array of matching filenames. Instead I chose to do something less efficient, but that I thought was simpler to write, which is a &#39;get_nth_match&#39; function, which passes the original filename to &#39;first&#39; and then calls &#39;next&#39; the appropriate number of times.&lt;/p&gt;&lt;p&gt;UPLOAD.COM is available here and included alongside download.com with the CF cards that you can buy for your RC2014.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='https://blog.peacockmedia.software/feeds/6264600758871549713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://blog.peacockmedia.software/2022/01/uploadcom-for-z80-cpm-writing-utility.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/6264600758871549713'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/6264600758871549713'/><link rel='alternate' type='text/html' href='https://blog.peacockmedia.software/2022/01/uploadcom-for-z80-cpm-writing-utility.html' title='UPLOAD.COM for Z80 CP/M - writing the utility'/><author><name>peahen</name><uri>http://www.blogger.com/profile/02395503525006623752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimgDW08-cvcVvUH-9GZKfT7A2RlB6dPtSLg2xUaQG9ju0JGsxgRi97eTA3vHpq1KY_ObUwbav2PQtDrJFONgs7W0pdZczaogO6q6UZp3QCk6sYeaPbdsQsPAb1ytVhIg/s113/shiela.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEic-N8DuMfUp7nmq8NWbYA2VirjbHI1vUghkIttY9Z2kYP1zyX7Ozv97rDW0Q0IZ3FldLH7Amsx4_ok5rKvwh8WNmKjZg7aoRv0i7MzR4orqk4l8UXn35qVNYSyYlGU6tMmWPwb-v1hBnWB/s72-c/Screenshot+2021-09-13+at+16.11.34.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5423774879231339244.post-6431055840018147270</id><published>2022-01-06T07:28:00.001-08:00</published><updated>2022-01-06T07:32:11.463-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="dendrite"/><category scheme="http://www.blogger.com/atom/ns#" term="website content management"/><title type='text'>Creating a custom template for custom cards in Dendrite</title><content type='html'>&lt;p&gt;As is sometimes the case, I&#39;m writing this post primarily for my own future reference.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://peacockmedia.software/mac/dendrite/&quot;&gt;Dendrite&lt;/a&gt;&amp;nbsp;is a development environment that allows you to work with tokens for commonly-used blocks of text when hand-coding a site. Further to that, it gives you simple dialogs for special blocks with structured text and images, known as &#39;cards&#39;.&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjhuJ6b3XqTJ8AfW3bkGlporLNLbw75vRysZbKNNABRt9WNNvJhPZeL_x1F2WLmB7knx7LblwKnc3yPPR8BhA20xIUQAp4RAyQdPIZ8DaYabRuf2BYuoNU5PUZJTwlT_0kgKuyY48HvGVpEw86CxU8AqSj6Sm9ht1yAD23py6m4PnW-MzciSThoaeYu=s1035&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1035&quot; data-original-width=&quot;695&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjhuJ6b3XqTJ8AfW3bkGlporLNLbw75vRysZbKNNABRt9WNNvJhPZeL_x1F2WLmB7knx7LblwKnc3yPPR8BhA20xIUQAp4RAyQdPIZ8DaYabRuf2BYuoNU5PUZJTwlT_0kgKuyY48HvGVpEw86CxU8AqSj6Sm9ht1yAD23py6m4PnW-MzciSThoaeYu=s320&quot; width=&quot;215&quot; /&gt;&lt;/a&gt;&lt;/div&gt;It allows me to paste an image and fill in a few fields when I add stories to a page like the one above, this is a newsletter I manage.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There&#39;s a block of code near the top of this page, which generates a feature image. This is the code:&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEikEDVw8ZeROur7YC3UzlaYihrs7sOyu23bSPyVbShWzPkFOUZCXaiOCJurFKoGREF7LFeZxiOQQMe9Mlv17iNYsGTBzpDNb6e4PC-5ZuVWYOncGChfaQfesKodQA5j-e-p79SpRLley7E5lW4mjD4L5MdaX1xHaVtGjfEofx6_UQsDLJTmiqWZp59j=s1219&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;274&quot; data-original-width=&quot;1219&quot; height=&quot;72&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEikEDVw8ZeROur7YC3UzlaYihrs7sOyu23bSPyVbShWzPkFOUZCXaiOCJurFKoGREF7LFeZxiOQQMe9Mlv17iNYsGTBzpDNb6e4PC-5ZuVWYOncGChfaQfesKodQA5j-e-p79SpRLley7E5lW4mjD4L5MdaX1xHaVtGjfEofx6_UQsDLJTmiqWZp59j=s320&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;It&#39;s an image (with 2x and 3x versions) with a caption, all within a div which is floating right.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Each month for some years I&#39;ve created the resized images and edited this code manually, because that&#39;s less effort than remembering how to set up a new template for a custom card in Dendrite.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So today I&#39;ve gone to the trouble, and have also gone to the trouble of documenting it here for you and for myself.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This text only appears once on the page, but the real benefit is being able to use the &#39;insert card&#39; dialog to paste the image and write the caption. &amp;nbsp;Turning multiple fiddly copy-and-paste operations into a few slick and mindless strokes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So here&#39;s the procedure. You&#39;re welcome, future-me.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Adding a new template to a Dendrite website&lt;/h3&gt;&lt;div&gt;First copy one of the existing default templates, found in &amp;lt;website folder&amp;gt;/Templates. (use &#39;News&#39; because that one uses all of the tokens, which will serve as a temporary reference). Change its name to something memorable (In this case, FeatureImage.txt)&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjiiiG9oNqVC7NFGXlpJp0VHBz00XXryiQ80DHyteXsworyffyz3j_yzFW1JWM28ANefPB7X5JNUulbK06leKh9Pt-V9ZDBdEiy3dwia7QXjeUynGItFu-lzBmtz5Lk0iESFGoqFg1ZL0jaxcdYv_53jFNWjNhX-MzfiyY30EhcrC8iB1g8mlRi8Zip=s1380&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;451&quot; data-original-width=&quot;1380&quot; height=&quot;105&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjiiiG9oNqVC7NFGXlpJp0VHBz00XXryiQ80DHyteXsworyffyz3j_yzFW1JWM28ANefPB7X5JNUulbK06leKh9Pt-V9ZDBdEiy3dwia7QXjeUynGItFu-lzBmtz5Lk0iESFGoqFg1ZL0jaxcdYv_53jFNWjNhX-MzfiyY30EhcrC8iB1g8mlRi8Zip=s320&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;A template file consists of the code for that card, with dendrite-style tokens inserted where information from the card dialog is to appear. The example above should be self-explanatory.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With that in place, &lt;b&gt;Insert Card&lt;/b&gt; in Dendrite offers this dialog, which you can use to fill in the information, and &lt;b&gt;Add Image&lt;/b&gt; allows you to paste the image (past it once, Dendrite can create the 2x and 3x versions. All you have to do is give it a base name, which also serves as the id for this particular object.)&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEg5mgyCAwcNwXbJjDMRTVb4sVYZIMTwgvT9Eqnneazw8gRsz4gr9VwEVR3IaJltAlKsA-zqmINurkgumhLGY8eHiACE54WvM07jv9bzwQy9iW3RhstzXmNN3uh6cb5GEqC6zdDoXi-MfIvKSAaaFFcwhMMZh6MUOKTuKTIH2me4LLf4VzMM7c_gKe8B=s944&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;512&quot; data-original-width=&quot;944&quot; height=&quot;174&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEg5mgyCAwcNwXbJjDMRTVb4sVYZIMTwgvT9Eqnneazw8gRsz4gr9VwEVR3IaJltAlKsA-zqmINurkgumhLGY8eHiACE54WvM07jv9bzwQy9iW3RhstzXmNN3uh6cb5GEqC6zdDoXi-MfIvKSAaaFFcwhMMZh6MUOKTuKTIH2me4LLf4VzMM7c_gKe8B=s320&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjqAH1bT5xAXoaC1_EYlvqjcwzNT0IBIdwe3xoX-ZCpYDtL5UNwwED5QfUcYxoA1qF7DMxAkiiAe_qLzpc3bRkJF9tbe1AGdXJJqqrQtpRu1eketp0-BVZ5fXZ8oVBdOYPicDwKUchzrTqlePU48BbU3LEwn_DCKeQSym6hifO8mgLf8fT3k0aiKRFt=s872&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;798&quot; data-original-width=&quot;872&quot; height=&quot;293&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjqAH1bT5xAXoaC1_EYlvqjcwzNT0IBIdwe3xoX-ZCpYDtL5UNwwED5QfUcYxoA1qF7DMxAkiiAe_qLzpc3bRkJF9tbe1AGdXJJqqrQtpRu1eketp0-BVZ5fXZ8oVBdOYPicDwKUchzrTqlePU48BbU3LEwn_DCKeQSym6hifO8mgLf8fT3k0aiKRFt=s320&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;I use a keystroke to grab a roughly-square image to the clipboard. A paste into the image well in the dialog above crops it to the selected proportions and resizes it with 2x and 3x versions. It&#39;s a remarkably efficient way to add &#39;cards&#39; containing images to a hand-coded web page. (Note that in this example, my new template doesn&#39;t use the body, the link text or the link target. So those can be ignored when filling in this card.)&lt;br /&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Important things to remember&lt;/h3&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Remember to select your new template before OKing this card dialog (the drop-down button at the very top of the Insert Card dialog.) I think it defaults to &#39;News&#39; rather than the last one you chose.&amp;nbsp;&lt;/li&gt;&lt;li&gt;If you use a different image format (as I do here, 200w and locked proportions rather than 150x150 for the regular news stories) remember to make sure those settings are right for this special card and future regular ones.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://blog.peacockmedia.software/feeds/6431055840018147270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://blog.peacockmedia.software/2022/01/creating-custom-template-for-custom.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/6431055840018147270'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/6431055840018147270'/><link rel='alternate' type='text/html' href='https://blog.peacockmedia.software/2022/01/creating-custom-template-for-custom.html' title='Creating a custom template for custom cards in Dendrite'/><author><name>peahen</name><uri>http://www.blogger.com/profile/02395503525006623752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimgDW08-cvcVvUH-9GZKfT7A2RlB6dPtSLg2xUaQG9ju0JGsxgRi97eTA3vHpq1KY_ObUwbav2PQtDrJFONgs7W0pdZczaogO6q6UZp3QCk6sYeaPbdsQsPAb1ytVhIg/s113/shiela.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEjhuJ6b3XqTJ8AfW3bkGlporLNLbw75vRysZbKNNABRt9WNNvJhPZeL_x1F2WLmB7knx7LblwKnc3yPPR8BhA20xIUQAp4RAyQdPIZ8DaYabRuf2BYuoNU5PUZJTwlT_0kgKuyY48HvGVpEw86CxU8AqSj6Sm9ht1yAD23py6m4PnW-MzciSThoaeYu=s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5423774879231339244.post-9058895164623203517</id><published>2021-12-18T03:13:00.006-08:00</published><updated>2021-12-18T03:13:54.223-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Pi Pico"/><title type='text'>Dimming an RGB lightstrip using a Tiny2040 (Pi Pico)</title><content type='html'>&lt;p&gt;&amp;nbsp;This is just a simple experimental project to try out Pimoroni&#39;s Tiny2040 for the first time.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;iframe allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/pgQfA7mDqX8&quot; title=&quot;YouTube video player&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;In order to dim LEDs we have to use PWM; change the duty cycle of a square wave. The 2040 chip handles this and so this program is really simple, it just sets up PWM on one pin and handles two inputs, one for brighter, one for dimmer.&amp;nbsp;&lt;/p&gt;&lt;p&gt;The harder part was controlling 12v LED strip using a 3.3v output. I&#39;ve used a small transistor to amplify to 5V and then a mosfet to step that up to 12v. A 7805 gives us a 5v supply to power the microcontroller and to use in the amplification circuit.&lt;/p&gt;&lt;p&gt;It would be possible to generate three square waves with independent duty cycles, and thus have smooth colour changing with the RGB LEDs.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='https://blog.peacockmedia.software/feeds/9058895164623203517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://blog.peacockmedia.software/2021/12/dimming-rgb-lightstrip-using-tiny2040.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/9058895164623203517'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/9058895164623203517'/><link rel='alternate' type='text/html' href='https://blog.peacockmedia.software/2021/12/dimming-rgb-lightstrip-using-tiny2040.html' title='Dimming an RGB lightstrip using a Tiny2040 (Pi Pico)'/><author><name>peahen</name><uri>http://www.blogger.com/profile/02395503525006623752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimgDW08-cvcVvUH-9GZKfT7A2RlB6dPtSLg2xUaQG9ju0JGsxgRi97eTA3vHpq1KY_ObUwbav2PQtDrJFONgs7W0pdZczaogO6q6UZp3QCk6sYeaPbdsQsPAb1ytVhIg/s113/shiela.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/pgQfA7mDqX8/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5423774879231339244.post-344293734735125891</id><published>2021-12-17T04:56:00.004-08:00</published><updated>2022-07-09T15:12:24.620-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Pi Pico"/><title type='text'>PicoTerm, terminal application for Raspberry Pi Pico, supported escape codes and user-definable characters</title><content type='html'>&lt;p&gt;PicoTerm is an application for the Pi Pico which provides a serial terminal with VGA output and USB keyboard input.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhDjRQ75PngEJMoJV86vve0VcQH8x4ulGvgiPShKw3Mdp56I82aQSbKkZZfPeqebikeCOaAlbUyTnDga29CPn2mRHnEJtRADYScHafJbhZOkaIpcKJ7RBBxWnxoARNZMT-CdbatRxsSzH9VJ7B4dWHZkEyt3EZBxIx9tuhxR8AKfBhCqF6SgjBz8F3W=s1000&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;534&quot; data-original-width=&quot;1000&quot; height=&quot;171&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhDjRQ75PngEJMoJV86vve0VcQH8x4ulGvgiPShKw3Mdp56I82aQSbKkZZfPeqebikeCOaAlbUyTnDga29CPn2mRHnEJtRADYScHafJbhZOkaIpcKJ7RBBxWnxoARNZMT-CdbatRxsSzH9VJ7B4dWHZkEyt3EZBxIx9tuhxR8AKfBhCqF6SgjBz8F3W=s320&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;It was &lt;a href=&quot;https://rc2014.co.uk&quot;&gt;developed for the RC2014&lt;/a&gt; and therefore is configured for that computer; eg 115,200 baud and the RC2014 logo at startup. However, if you&#39;d like a custom version, please &lt;a href=&quot;https://peacockmedia.software/general-contact-form.html&quot;&gt;get in touch&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The Pico has resources that allow for a 640*480 output with a character mode, or 320x240 with full &amp;nbsp;32,000 colour.&lt;/p&gt;&lt;p&gt;I&#39;ve recently added support for uploading user-defined character data. I&#39;ve made this page in order to document the escape codes currently supported, along with information about the new UD character functionality.&lt;/p&gt;&lt;p&gt;Here is the list of supported escape codes, followed by the information about defining characters.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;\ESC[?25l | Cursor invisible&lt;/li&gt;&lt;li&gt;\ESC[?25h | Cursor visible&lt;/li&gt;&lt;li&gt;\ESC[H | Move to 0-0&lt;/li&gt;&lt;li&gt;\ESC[s | Save the cursor position&lt;/li&gt;&lt;li&gt;\ESC[u | Move cursor to previously saved position&lt;/li&gt;&lt;li&gt;\ESC[-Row-;-Col-H | Move to -Row-,-Col-&lt;/li&gt;&lt;li&gt;\ESC[0K | Clear from cursor to the end of the line&lt;/li&gt;&lt;li&gt;\ESC[1K | Clear from the beginning of the current line to the cursor&lt;/li&gt;&lt;li&gt;\ESC[2K | Clear the whole line&lt;/li&gt;&lt;li&gt;\ESC[2J | Clear the screen and move the cursor to 0-0&lt;/li&gt;&lt;li&gt;\ESC[-n-A | Move the cursor up -n- lines&lt;/li&gt;&lt;li&gt;\ESC[-n-B | Move the cursor down -n- lines&lt;/li&gt;&lt;li&gt;\ESC[-n-C | Move the cursor forward -n- characters&lt;/li&gt;&lt;li&gt;\ESC[-n-D | Move the cursor backward -n- characters&lt;/li&gt;&lt;li&gt;\ESC[0m | normal text (should also set foreground &amp;amp; background colours to normal)&lt;/li&gt;&lt;li&gt;\ESC[7m | reverse text&lt;/li&gt;&lt;li&gt;\ESC[0J | clear screen from cursor&lt;/li&gt;&lt;li&gt;\ESC[1J | clear screen to cursor&lt;/li&gt;&lt;li&gt;\ESC[3J | same as \ESC[2J&lt;/li&gt;&lt;li&gt;\ESC[nS | scroll whole page up by n rows (default 1 if n missing)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;40 col colour only: (sequence is ignored, no effect in 80 col b/w)&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;\ESC[38;5-n-m | Set foreground colour to -n- (0-255)&lt;/li&gt;&lt;li&gt;\ESC[48;5;-n-m | Set background colour to -n- (0-255)&lt;/li&gt;&lt;li&gt;\ESC[38;2;r;g;bm | Set foreground colour to r/g/b (values 0-255, scaled by picoterm to 0-31 to give 32,000 colours)&lt;/li&gt;&lt;li&gt;\ESC[48;2;r;g;bm | Set background colour to r/g/b (values 0-255, scaled&amp;nbsp;by picoterm to 0-31 to give 32,000 colours)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;80-col textmode version only: (from version 1.1)&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;\ESC[1L | Insert line at cursor position, scrolling down from the cursor&#39;s row&lt;/li&gt;&lt;li&gt;\ESC[1M | Delete line at cursor position, scrolling up to the cursor&#39;s row&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;User-definable characters&lt;/h2&gt;&lt;p&gt;C/PM (which is widely used on the RC2014) uses 7-bit ascii characters, which means that there are 128 characters (128-255 inclusive) unused and available for defining by the user. In the case of the colourmode &amp;nbsp;version of Picoterm, the character data is simply stored as pixel data (foreground colour/background colour, 8 bytes per character) and drawn to the screen when needed, which means that the &#39;reverse graphics&#39; doesn&#39;t rely on those reverse characters being defined, and therefore works on the default fixed characters and any that you define.&lt;/p&gt;&lt;p&gt;Note that this functionality is present in &lt;a href=&quot;https://peacockmedia.software/RC2014/picoterm/&quot;&gt;picoterm colour v0.2.0 onwards, which is available here&lt;/a&gt;.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;\ESC[?-n-U | followed by 8 bytes, which will be inserted into the user-defined character space for character n (n can be 128-255 inclusive)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;When displaying custom characters, the current foreground and background colours apply, these being reversed if reversed graphics is on.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjcwUNld1IEsm1jWLLmWJTZA9BywRyXRqKHPZmIRSci-iX760Yj0AFd18AoFfsXTEVW65Kb8Kf6qnvsjtP79BryNpXypS2AoW8PbVdk0VAM1NzOJSG7nVr_URpgJHL4PtLKWuchZKico-8kLJatUa6y5Y4CpbTEHnacX5Zn26j62H0kTd4DzkBVyQsn=s1000&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;534&quot; data-original-width=&quot;1000&quot; height=&quot;171&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjcwUNld1IEsm1jWLLmWJTZA9BywRyXRqKHPZmIRSci-iX760Yj0AFd18AoFfsXTEVW65Kb8Kf6qnvsjtP79BryNpXypS2AoW8PbVdk0VAM1NzOJSG7nVr_URpgJHL4PtLKWuchZKico-8kLJatUa6y5Y4CpbTEHnacX5Zn26j62H0kTd4DzkBVyQsn=s320&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Here is the simple basic program used in the screenshot above to display pacman: (yes, it&#39;s possible to use a loop to define the four characters, but beware of MS Basic&#39;s tendency to add a space when using STR$. It&#39;s expanded here for readability.)&lt;blockquote&gt;&lt;p&gt;10 PRINT CHR$(27);&quot;[?128U&quot;;&lt;/p&gt;&lt;p&gt;20 FOR C=1TO8&lt;/p&gt;&lt;p&gt;30 READ A&lt;/p&gt;&lt;p&gt;40 PRINT CHR$(A);&lt;/p&gt;&lt;p&gt;50 NEXT C&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;60 PRINT CHR$(27);&quot;[?129U&quot;;&lt;/p&gt;&lt;p&gt;70 FOR C=1TO8&lt;/p&gt;&lt;p&gt;80 READ A&lt;/p&gt;&lt;p&gt;90 PRINT CHR$(A);&lt;/p&gt;&lt;p&gt;100 NEXT C&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;110 PRINT CHR$(27);&quot;[?130U&quot;;&lt;/p&gt;&lt;p&gt;120 FOR C=1TO8&lt;/p&gt;&lt;p&gt;130 READ A&lt;/p&gt;&lt;p&gt;140 PRINT CHR$(A);&lt;/p&gt;&lt;p&gt;150 NEXT C&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;160 PRINT CHR$(27);&quot;[?131U&quot;;&lt;/p&gt;&lt;p&gt;170 FOR C=1TO8&lt;/p&gt;&lt;p&gt;180 READ A&lt;/p&gt;&lt;p&gt;190 PRINT CHR$(A);&lt;/p&gt;&lt;p&gt;200 NEXT C&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;205 PRINT CHR$(27);&quot;[38;5;11m&quot;;&lt;/p&gt;&lt;p&gt;210 PRINT CHR$(128);CHR$(129)&lt;/p&gt;&lt;p&gt;220 PRINT CHR$(130);CHR$(131)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;230 END&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1000 DATA 15,63,127,127,255,252,224,252&lt;/p&gt;&lt;p&gt;1010 DATA 0,192, 224,224,128,0,0,0&lt;/p&gt;&lt;p&gt;1020 DATA 255,127,127,63,15,0,0,0&amp;nbsp;&lt;/p&gt;&lt;p&gt;1030 DATA 128,224,224,192,0,0,0,0&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='https://blog.peacockmedia.software/feeds/344293734735125891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://blog.peacockmedia.software/2021/12/picoterm-terminal-application-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/344293734735125891'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/344293734735125891'/><link rel='alternate' type='text/html' href='https://blog.peacockmedia.software/2021/12/picoterm-terminal-application-for.html' title='PicoTerm, terminal application for Raspberry Pi Pico, supported escape codes and user-definable characters'/><author><name>peahen</name><uri>http://www.blogger.com/profile/02395503525006623752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimgDW08-cvcVvUH-9GZKfT7A2RlB6dPtSLg2xUaQG9ju0JGsxgRi97eTA3vHpq1KY_ObUwbav2PQtDrJFONgs7W0pdZczaogO6q6UZp3QCk6sYeaPbdsQsPAb1ytVhIg/s113/shiela.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEhDjRQ75PngEJMoJV86vve0VcQH8x4ulGvgiPShKw3Mdp56I82aQSbKkZZfPeqebikeCOaAlbUyTnDga29CPn2mRHnEJtRADYScHafJbhZOkaIpcKJ7RBBxWnxoARNZMT-CdbatRxsSzH9VJ7B4dWHZkEyt3EZBxIx9tuhxR8AKfBhCqF6SgjBz8F3W=s72-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5423774879231339244.post-3367853305489411881</id><published>2021-12-09T09:53:00.002-08:00</published><updated>2021-12-09T09:53:35.325-08:00</updated><title type='text'>Inconsistent results with Integrity </title><content type='html'>&lt;p&gt;&amp;nbsp;Running the existing release alongside a potential new release is a great sanity check to make sure that any new changes haven&#39;t had any undesirable effects on the results.&lt;/p&gt;&lt;p&gt;Today this happened (the new Integrity Pro and existing release are showing different results):&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWj7ncz-NMTOTQS1HD0JlobBJdiMNbSxZZ1pdrfIgNUZzODI6lYb2P2bxrYZ1OttiZPXN1Yk-GXBr7sEuOC-Hz2vNv0QcFFHcdUZygVmHJY6A2bY-98oLhnvIE9Rn6YL4Erj0ScjRm3xU/s730/Screenshot+2021-11-29+at+17.36.50.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;379&quot; data-original-width=&quot;730&quot; height=&quot;208&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWj7ncz-NMTOTQS1HD0JlobBJdiMNbSxZZ1pdrfIgNUZzODI6lYb2P2bxrYZ1OttiZPXN1Yk-GXBr7sEuOC-Hz2vNv0QcFFHcdUZygVmHJY6A2bY-98oLhnvIE9Rn6YL4Erj0ScjRm3xU/w400-h208/Screenshot+2021-11-29+at+17.36.50.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;It was a head scratcher and I had to sort the sitemap tables and carefully compare them to find the differences.&lt;br /&gt;&lt;p&gt;The reason is that I&#39;d put some A/B testing in place, there are a bunch of pages with differences and A or B in the querystring. It&#39;s in an area of the site I&#39;d normally ignore for reasons, but didn&#39;t today.&lt;/p&gt;&lt;p&gt;Therefore, the list of pages may feature both the A version and the B version (because the url of the page is the unique key for Integrity). So those pages may be duplicated in the results, or maybe not, and that&#39;s a matter of chance.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Ignoring querystrings fixed the problem, and now gives consistent results every time. (Querystrings aren&#39;t used for any other reason on this site, so it&#39;s fine to ignore them).&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh802kYN5hJGHlvNtactsaWZ4EIp4lsTNl9uTt2LORgDZwNX1Ar1BAwG0WUS3QqbgRHTGD8hjn7PWBAK3URtJgkwk3NCV1NS7ThXV0hyphenhyphenCrcf8XS9beJwAbzTMArBSlt1u8NcF_TfTaMMc/s834/Screenshot+2021-11-29+at+17.32.53.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;401&quot; data-original-width=&quot;834&quot; height=&quot;193&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh802kYN5hJGHlvNtactsaWZ4EIp4lsTNl9uTt2LORgDZwNX1Ar1BAwG0WUS3QqbgRHTGD8hjn7PWBAK3URtJgkwk3NCV1NS7ThXV0hyphenhyphenCrcf8XS9beJwAbzTMArBSlt1u8NcF_TfTaMMc/w400-h193/Screenshot+2021-11-29+at+17.32.53.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='https://blog.peacockmedia.software/feeds/3367853305489411881/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://blog.peacockmedia.software/2021/12/inconsistent-results-with-integrity.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/3367853305489411881'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/3367853305489411881'/><link rel='alternate' type='text/html' href='https://blog.peacockmedia.software/2021/12/inconsistent-results-with-integrity.html' title='Inconsistent results with Integrity '/><author><name>peahen</name><uri>http://www.blogger.com/profile/02395503525006623752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimgDW08-cvcVvUH-9GZKfT7A2RlB6dPtSLg2xUaQG9ju0JGsxgRi97eTA3vHpq1KY_ObUwbav2PQtDrJFONgs7W0pdZczaogO6q6UZp3QCk6sYeaPbdsQsPAb1ytVhIg/s113/shiela.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWj7ncz-NMTOTQS1HD0JlobBJdiMNbSxZZ1pdrfIgNUZzODI6lYb2P2bxrYZ1OttiZPXN1Yk-GXBr7sEuOC-Hz2vNv0QcFFHcdUZygVmHJY6A2bY-98oLhnvIE9Rn6YL4Erj0ScjRm3xU/s72-w400-h208-c/Screenshot+2021-11-29+at+17.36.50.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5423774879231339244.post-643791085499153712</id><published>2021-12-09T08:21:00.000-08:00</published><updated>2021-12-09T08:21:10.463-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Pi Pico"/><title type='text'>Electronic Dice with the Pi Pico</title><content type='html'>&lt;p&gt;This was my first project with the Pi Pico. It&#39;s a &#39;Hello World&#39; for hardware/software.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;iframe allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/2NsTE6vYuIQ&quot; title=&quot;YouTube video player&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;The real reason for two buttons is that I already had the box drilled and fitted with the two buttons for a different project. It made sense to switch the power using an arcade button, because it&#39;s automatically switched off when you let go of it. The second button grounds the &#39;run&#39; of the Pico, which means that it performs the shuffle and display once more. In reality, just the one power button would do, because letting go of that and pressing it again does the same thing as the &#39;run again&#39; button.&lt;/p&gt;&lt;p&gt;I wrote the software in Micropython because this was my introduction to the Pico. More recent projects use C which suits me much better.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;* That should probably be electronic die, because one die is shuffled and displayed. The pico has enough pins to shuffle and display 3 dice, and probably many more with a bit of logic to decode the binary numbers 0-6 (3 GPIO pins) to 7 LEDs.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='https://blog.peacockmedia.software/feeds/643791085499153712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://blog.peacockmedia.software/2021/12/electronic-dice-with-pi-pico.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/643791085499153712'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/643791085499153712'/><link rel='alternate' type='text/html' href='https://blog.peacockmedia.software/2021/12/electronic-dice-with-pi-pico.html' title='Electronic Dice with the Pi Pico'/><author><name>peahen</name><uri>http://www.blogger.com/profile/02395503525006623752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimgDW08-cvcVvUH-9GZKfT7A2RlB6dPtSLg2xUaQG9ju0JGsxgRi97eTA3vHpq1KY_ObUwbav2PQtDrJFONgs7W0pdZczaogO6q6UZp3QCk6sYeaPbdsQsPAb1ytVhIg/s113/shiela.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/2NsTE6vYuIQ/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5423774879231339244.post-6252163610638715660</id><published>2021-11-29T04:29:00.001-08:00</published><updated>2021-11-29T04:29:21.050-08:00</updated><title type='text'>&#39;Not allowed to load local resource&#39; error with Safari </title><content type='html'>&lt;p&gt;&amp;nbsp;If, after archiving a site in &#39;browsable&#39; / &#39;processed&#39; form using &lt;a href=&quot;https://peacockmedia.software/mac/webarch/&quot;&gt;WebArch&lt;/a&gt; or &lt;a href=&quot;https://peacockmedia.software/mac/watchman/&quot;&gt;Website Watchman&lt;/a&gt;, parts of the page aren&#39;t visible, it may be because of Safari&#39;s security restrictions.&lt;/p&gt;&lt;p&gt;If a page uses a js file and that file has been properly saved locally, the browser may still not allow access to that file. &amp;nbsp;Open up your browser&#39;s console and check:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-gJAkBPKjtRxBo-TyWYmAujBglFurxQtMHmgup5tD8ywDKzy0CR7aQiRRyrXFws-GTvKgsa7AczvckQua4aH75TYqb6jt5j0-jfReJayKEYF6BXa4sePqVyhSqhsXLfWWjPDkkKJV8uA/s1313/Screenshot+2021-11-29+at+12.00.44.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;862&quot; data-original-width=&quot;1313&quot; height=&quot;210&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-gJAkBPKjtRxBo-TyWYmAujBglFurxQtMHmgup5tD8ywDKzy0CR7aQiRRyrXFws-GTvKgsa7AczvckQua4aH75TYqb6jt5j0-jfReJayKEYF6BXa4sePqVyhSqhsXLfWWjPDkkKJV8uA/s320/Screenshot+2021-11-29+at+12.00.44.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Here you can see my browser isn&#39;t allowing access to mmenudom.js, even though that file exists in the same folder as the index.html file.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The answer is simple, from the Developer menu, select &#39;Disable Local File Restrictions&#39;.&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizFT35P_ad7hpiHVQ84UtWjisdcO6GN4wKdZy_t18Uiij5ywzznSX2-RtNHF0gIsbMbT5YBo9sD80JQx5oGdcQlvMVjqLdVWQtz3HexomNcIjTcOywAycYMiOz07gX6g_hQM6hG6eqmBg/s756/Screenshot+2021-11-29+at+12.02.17.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;756&quot; data-original-width=&quot;568&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizFT35P_ad7hpiHVQ84UtWjisdcO6GN4wKdZy_t18Uiij5ywzznSX2-RtNHF0gIsbMbT5YBo9sD80JQx5oGdcQlvMVjqLdVWQtz3HexomNcIjTcOywAycYMiOz07gX6g_hQM6hG6eqmBg/s320/Screenshot+2021-11-29+at+12.02.17.png&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/div&gt;I should add that this restriction exists for a reason, and that you shouldn&#39;t leave it disabled permanently.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='https://blog.peacockmedia.software/feeds/6252163610638715660/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://blog.peacockmedia.software/2021/11/not-allowed-to-load-local-resource.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/6252163610638715660'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/6252163610638715660'/><link rel='alternate' type='text/html' href='https://blog.peacockmedia.software/2021/11/not-allowed-to-load-local-resource.html' title='&#39;Not allowed to load local resource&#39; error with Safari '/><author><name>peahen</name><uri>http://www.blogger.com/profile/02395503525006623752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimgDW08-cvcVvUH-9GZKfT7A2RlB6dPtSLg2xUaQG9ju0JGsxgRi97eTA3vHpq1KY_ObUwbav2PQtDrJFONgs7W0pdZczaogO6q6UZp3QCk6sYeaPbdsQsPAb1ytVhIg/s113/shiela.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-gJAkBPKjtRxBo-TyWYmAujBglFurxQtMHmgup5tD8ywDKzy0CR7aQiRRyrXFws-GTvKgsa7AczvckQua4aH75TYqb6jt5j0-jfReJayKEYF6BXa4sePqVyhSqhsXLfWWjPDkkKJV8uA/s72-c/Screenshot+2021-11-29+at+12.00.44.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5423774879231339244.post-599245866376453257</id><published>2021-11-07T15:05:00.009-08:00</published><updated>2021-11-28T04:28:24.316-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="embedded"/><category scheme="http://www.blogger.com/atom/ns#" term="Pi Pico"/><category scheme="http://www.blogger.com/atom/ns#" term="RC2014"/><category scheme="http://www.blogger.com/atom/ns#" term="terminal"/><title type='text'>Terminal software for the Raspberry Pi Pico</title><content type='html'>&lt;p&gt;&amp;nbsp;I am very proud to have been involved in &lt;a href=&quot;https://z80kits.com/shop/rc2014-pi-pico-vga-terminal/&quot;&gt;this hardware / software project&lt;/a&gt; with Spencer, creator of the &lt;a href=&quot;https://z80kits.com&quot;&gt;RC2014&lt;/a&gt;.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI6CVK7df7lfRbuEwVeO5YpG9PV4SytYbCFVLnIHFmTcjic6UM0d69lUDny21wlljOpqWpgXgKVc3_UWH_hCFtb-HX-3x2gN5HXmt-B2QLEPiHXvbPRwN2wlqPMldebqlVysHGpspB9OM/s442/Screenshot+2021-11-07+at+22.22.13.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;237&quot; data-original-width=&quot;442&quot; height=&quot;172&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI6CVK7df7lfRbuEwVeO5YpG9PV4SytYbCFVLnIHFmTcjic6UM0d69lUDny21wlljOpqWpgXgKVc3_UWH_hCFtb-HX-3x2gN5HXmt-B2QLEPiHXvbPRwN2wlqPMldebqlVysHGpspB9OM/s320/Screenshot+2021-11-07+at+22.22.13.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;The &lt;a href=&quot;https://shop.pimoroni.com/products/raspberry-pi-pico?variant=32402092294227&quot;&gt;Pi Pico&lt;/a&gt; is a powerful microcontroller, it runs at 133 Mhz by default but can be overclocked to 400Mhz. It has two cores and eight state machines. The state machines have their own assembly language and can independently manage i/o or dma tasks.&lt;/p&gt;&lt;p&gt;It is capable of buffering and generating a video signal, VGA or DVI. Using the TinyUSB library it&#39;s capable of receiving USB input.&lt;/p&gt;&lt;p&gt;With these features, it&#39;s the perfect candidate for this task. With a few supporting components and the software/firmware installed, it&#39;s acting as a serial terminal with USB keyboard input and VGA output.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPXSykJS_lXgKvm_1k_ybg4x6LyrkASFUlNyPx5rqEYVcO1_wscnfkubzCUhujMMaJvCr252x9VE8uSfQVGiFBy3HG-lYn4Ykis4gLD8lu5KgYfBpo_uziNE3hg0gfTIqGcRt40tuSlXA/s600/Pi-Pico-VGA-Terminal-8-600x450.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;450&quot; data-original-width=&quot;600&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPXSykJS_lXgKvm_1k_ybg4x6LyrkASFUlNyPx5rqEYVcO1_wscnfkubzCUhujMMaJvCr252x9VE8uSfQVGiFBy3HG-lYn4Ykis4gLD8lu5KgYfBpo_uziNE3hg0gfTIqGcRt40tuSlXA/s320/Pi-Pico-VGA-Terminal-8-600x450.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;The RC2014 is a retro-style computer running a Z80 at up to 7.372Mhz. It does require you to use some kind of terminal for input and output. Usually this is a terminal program running on a modern computer and that&#39;s where this new module comes in. It allows the computer to be used standalone, as seen here with CP/M running on the RC2014. It communicates with the computer using UART serial via two of the Pico&#39;s GPIO pins and the Rx and Tx lines on the RC2014 bus. It receives keyboard input via the micro USB socket on the Pico (with an OTG adaptor. NB TinyUSB on the pico seems to work with some keyboards and not others.)&lt;/div&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXdM9uJfAaY8YxIMTDH3fYytdznwfpGwxlua_jHY4uWrhyphenhyphenYxtm_llzwRafiRuBPjYHbIyBinyeG-SWQPf_TSxDH4WRDcWzA6vDLnJAKfwMGJ9xmDfOA-u9z9HLiKdkCRo0Jncp8DsbDOg7/s600/Pi-Pico-VGA-Terminal-5-600x450.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;450&quot; data-original-width=&quot;600&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXdM9uJfAaY8YxIMTDH3fYytdznwfpGwxlua_jHY4uWrhyphenhyphenYxtm_llzwRafiRuBPjYHbIyBinyeG-SWQPf_TSxDH4WRDcWzA6vDLnJAKfwMGJ9xmDfOA-u9z9HLiKdkCRo0Jncp8DsbDOg7/s320/Pi-Pico-VGA-Terminal-5-600x450.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;The project required custom software to be written for the Pico in C.&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;The video output is taken care of by libraries, although the example code certainly did take a while to understand. That part of Textmode PicoTerm largely draws on the text mode example code.&amp;nbsp;&lt;/p&gt;&lt;p&gt;The USB handling uses TinyUSB. The Pico must act as a host (with the keyboard connected via an OTG adaptor).&amp;nbsp;&lt;/p&gt;&lt;p&gt;That leaves the terminal functionality. You need to maintain a buffer to store the characters (because the video functionality makes callbacks, requesting the data for each scanline as it&#39;s generated). Scrolling is an important &amp;nbsp;feature of a terminal, so I created a structure to store the character codes for each row of characters, and an array of pointers to those rows. So scrolling is a matter of shuffling 30 pointers rather than 2400 characters.&amp;nbsp;&lt;/p&gt;&lt;p&gt;One of the Pico&#39;s cores can handle the scanline generation for the video while the other listens for characters sent from the computer and from the keyboard, buffers and handles those. [&lt;b&gt;update&lt;/b&gt; - with the textmode Picoterm, polling was fine and works without dropped characters. With the newer colourmode PicoTerm, because of the increased load of putting characters on the screen, it was necessary to implement interrupts on Rx to receive and buffer each incoming character].&lt;/p&gt;&lt;p&gt;As well as just feeding characters to the screen and scrolling when necessary, it&#39;s also important to parse and handle certain &lt;a href=&quot;https://en.wikipedia.org/wiki/ANSI_escape_code&quot;&gt;escape sequences&lt;/a&gt;. &amp;nbsp;These codes can position the cursor on the screen or change the attributes (eg reverse characters). The full list of sequences that we&#39;ve implemented so far are &lt;a href=&quot;https://rc2014.co.uk/modules/pi-pico-vga-terminal/&quot;&gt;here on the module&#39;s documentation page&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://z80kits.com/shop/rc2014-pi-pico-vga-terminal/&quot;&gt;RC2014 Pi Pico VGA Terminal&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='https://blog.peacockmedia.software/feeds/599245866376453257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://blog.peacockmedia.software/2021/11/terminal-software-for-raspberry-pi-pico.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/599245866376453257'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/599245866376453257'/><link rel='alternate' type='text/html' href='https://blog.peacockmedia.software/2021/11/terminal-software-for-raspberry-pi-pico.html' title='Terminal software for the Raspberry Pi Pico'/><author><name>peahen</name><uri>http://www.blogger.com/profile/02395503525006623752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimgDW08-cvcVvUH-9GZKfT7A2RlB6dPtSLg2xUaQG9ju0JGsxgRi97eTA3vHpq1KY_ObUwbav2PQtDrJFONgs7W0pdZczaogO6q6UZp3QCk6sYeaPbdsQsPAb1ytVhIg/s113/shiela.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI6CVK7df7lfRbuEwVeO5YpG9PV4SytYbCFVLnIHFmTcjic6UM0d69lUDny21wlljOpqWpgXgKVc3_UWH_hCFtb-HX-3x2gN5HXmt-B2QLEPiHXvbPRwN2wlqPMldebqlVysHGpspB9OM/s72-c/Screenshot+2021-11-07+at+22.22.13.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5423774879231339244.post-2802295188099600765</id><published>2021-10-26T08:01:00.000-07:00</published><updated>2025-01-31T04:23:47.215-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Bing"/><category scheme="http://www.blogger.com/atom/ns#" term="xml sitemap"/><title type='text'>Submitting page changes to Bing Webmaster Tools / IndexNow</title><content type='html'>&lt;p&gt;IndexNow was recently brought to my attention. It seems that Bing are trying to gain some ground on Google by promoting IndexNow for fast indexing as well as a &#39;one-stop-shop&#39; - submit once to Bing and &#39;participating search engines&#39; (which I assume won&#39;t ever include Google). &lt;a href=&quot;https://blogs.bing.com/webmaster/october-2021/IndexNow-Instantly-Index-your-web-content-in-Search-Engines&quot; target=&quot;_blank&quot;&gt;Read more&lt;/a&gt;&lt;/p&gt;&lt;p&gt;With a well-established and open &#39;XML sitemap&#39; schema, naturally Microsoft have decided to invent their own xml format and submission protocol. To be fair it&#39;s very simple, it is no more than a list of urls and doesn&#39;t include the last modified and priority fields, which may not have had any effect anyway.&amp;nbsp;&lt;/p&gt;&lt;p&gt;To submit your xml to Bing can&#39;t be done by web upload or ftp, but by http POST request. I guess the idea is that content management systems can submit page(s) as soon as they&#39;re edited or created, which is a terrific idea.&amp;nbsp;&lt;/p&gt;&lt;p&gt;It&#39;s very easy for Scrutiny / Integrity to generate this XML and make the POST request. It&#39;s a simpler variation on what these apps do already with sitemap XML files.&amp;nbsp;&lt;/p&gt;&lt;p&gt;This functionality will appear on &lt;a href=&quot;https://peacockmedia.software/mac/scrutiny/&quot;&gt;Scrutiny&lt;/a&gt; 10.4.6 (Scrutiny isn&#39;t always the first to get a new feature, it happens that the user who has been helping me with this with is a Scrutiny user). Here&#39;s the relevant part of the updated manual:&lt;/p&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Exporting and submitting XML for Bing Webmaster Tools / IndexNow&lt;/h3&gt;&lt;p&gt;IndexNow is designed to allow faster indexing of your page updates by multiple search engines.&amp;nbsp;&lt;/p&gt;&lt;p&gt;From version 10.4.6, Scrutiny can generate the xml in the correct format, split into batches of 500 if necessary, and submit them to Bing for IndexNow.&lt;/p&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia8DAAB4dCyyyMUJdN2iD_dovJ9vkKWppj-51oLy0h7ZYBYJsIdOA7_hreJbupKhyWHjD8Rz5fddGh-bQ1fu-9T-WxGJyONsFVF9Bcb8WQAPx88LCIX3FhxNwVkXK9jy_aeXS7SmGuQYo/s630/sitemap-options.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;135&quot; data-original-width=&quot;630&quot; height=&quot;69&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia8DAAB4dCyyyMUJdN2iD_dovJ9vkKWppj-51oLy0h7ZYBYJsIdOA7_hreJbupKhyWHjD8Rz5fddGh-bQ1fu-9T-WxGJyONsFVF9Bcb8WQAPx88LCIX3FhxNwVkXK9jy_aeXS7SmGuQYo/s320/sitemap-options.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;In Preferences &amp;gt; Sitemap, the options for saving locally and ftp&#39;ing have been altered slightly to read &#39;transfer&#39; rather than ftp, and these options apply to both traditional XML Sitemaps and the Bing Webmaster Tools XML format.&lt;/p&gt;&lt;p&gt;Bing Webmaster Tools require a http POST request, which contains an API key. To use this feature you&#39;ll need to enter your key in this box in Preferences. Here&#39;s where to find your key:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNEIseKhhMcF7r8YRXZ6G-Fny8whwSrP6HKIpI0zN9sjeMGu9YHJnFMPagSlrt9xPOTKeaZy9eIxZ81pXDZOY7hMLKW3nK39ExhVzHF4678nLJTRysCektIxbOPNOGA5e3TJj3SbJ0eV8/s422/bing-api-key.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;422&quot; data-original-width=&quot;359&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNEIseKhhMcF7r8YRXZ6G-Fny8whwSrP6HKIpI0zN9sjeMGu9YHJnFMPagSlrt9xPOTKeaZy9eIxZ81pXDZOY7hMLKW3nK39ExhVzHF4678nLJTRysCektIxbOPNOGA5e3TJj3SbJ0eV8/s320/bing-api-key.png&quot; width=&quot;272&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;As before, you&#39;ll need to scan your site and go to Sitemap results. Examine the list to make sure that it contains the pages that you expect. This time the last modified and priority are irrelevant (The Bing format only allows for a list of urls).&lt;/p&gt;&lt;p&gt;Find &quot;Bing Webmaster XML&quot; in the Export button above the Sitemap table, or use File &amp;gt; Export &amp;gt; Bing Webmaster XML.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2a_aIpkHegbIeX9ymrkxDnshyKMkBEoMQztYIffH9v7vNC5_xgRDdGuXyWslZ7tKkdlPDOWhBuLhOsFMDktc4RHN1z0XkQTYEEIWZJJmU-r-CuKaOw5MF6e22p3pYBa_sOpB-jigVGFk/s531/export-bwt.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;316&quot; data-original-width=&quot;531&quot; height=&quot;190&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2a_aIpkHegbIeX9ymrkxDnshyKMkBEoMQztYIffH9v7vNC5_xgRDdGuXyWslZ7tKkdlPDOWhBuLhOsFMDktc4RHN1z0XkQTYEEIWZJJmU-r-CuKaOw5MF6e22p3pYBa_sOpB-jigVGFk/s320/export-bwt.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&quot;Leveraging tools like Scrutiny and Bing&#39;s IndexNow can significantly improve a website&#39;s visibility by ensuring that search engines quickly recognize and index important updates. Staying ahead in SEO means not just optimizing content but also optimizing how it&#39;s discovered.&quot; - Maria Harutyunyan, CEO of &lt;a href=&quot;https://www.loopexdigital.com/&quot;&gt;professional SEO company&lt;/a&gt; Loopex Digital &amp;nbsp;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='https://blog.peacockmedia.software/feeds/2802295188099600765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://blog.peacockmedia.software/2021/10/submitting-page-changes-to-bing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/2802295188099600765'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/2802295188099600765'/><link rel='alternate' type='text/html' href='https://blog.peacockmedia.software/2021/10/submitting-page-changes-to-bing.html' title='Submitting page changes to Bing Webmaster Tools / IndexNow'/><author><name>peahen</name><uri>http://www.blogger.com/profile/02395503525006623752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimgDW08-cvcVvUH-9GZKfT7A2RlB6dPtSLg2xUaQG9ju0JGsxgRi97eTA3vHpq1KY_ObUwbav2PQtDrJFONgs7W0pdZczaogO6q6UZp3QCk6sYeaPbdsQsPAb1ytVhIg/s113/shiela.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia8DAAB4dCyyyMUJdN2iD_dovJ9vkKWppj-51oLy0h7ZYBYJsIdOA7_hreJbupKhyWHjD8Rz5fddGh-bQ1fu-9T-WxGJyONsFVF9Bcb8WQAPx88LCIX3FhxNwVkXK9jy_aeXS7SmGuQYo/s72-c/sitemap-options.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5423774879231339244.post-3031584339611215300</id><published>2021-09-21T13:54:00.006-07:00</published><updated>2021-09-26T07:10:14.798-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="link checker"/><title type='text'>First look at new app LinkDoc (for testing links within locally-stored pdf or docx documents)</title><content type='html'>&lt;p&gt;One of the most frequently-asked questions on the Integrity support desk is how to test the links within a local document (.pdf or .doc). It should be possible with Scrutiny, it can parse a pdf or doc but only when Scrutiny encounters it as part of a website crawl.&lt;/p&gt;&lt;p&gt;Rather than shoehorn the functionality into the existing apps, this sounds more like a job for a &#39;single button&#39; app built for this one purpose. Here it is.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;BLOG_video_class&quot; height=&quot;266&quot; src=&quot;https://www.youtube.com/embed/z9Z1mTdggN0&quot; width=&quot;320&quot; youtube-src-id=&quot;z9Z1mTdggN0&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;It happens that I&#39;m well into a ground-up &lt;a href=&quot;https://blog.peacockmedia.software/2021/08/the-future-for-integrity-and-scrutiny.html&quot;&gt;rewrite of the Integrity / Scrutiny crawling engine&lt;/a&gt;. It&#39;s at the point where it runs. There&#39;s plenty to do, but for parsing a single page (document in this case) and checking the links, it should be fine. Of course as the &#39;V12 engine&#39; develops, then any apps that use it, such as the new LinkDoc will receive those updates.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRWyS42bxEc3DnIflJ4i_vGR-R8KUUTKdSZnJY9xGTEa0XURRlb3irR3YhOMTs872FuxYkxBMmrrThc1i-a95V5PG2QG2OO3mfp8D9Yt0Nd9NUaWj2zTr1SB_oSHBpQKcSD6zn4L0XSvF9/s256/head-mirror-256.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;256&quot; data-original-width=&quot;256&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRWyS42bxEc3DnIflJ4i_vGR-R8KUUTKdSZnJY9xGTEa0XURRlb3irR3YhOMTs872FuxYkxBMmrrThc1i-a95V5PG2QG2OO3mfp8D9Yt0Nd9NUaWj2zTr1SB_oSHBpQKcSD6zn4L0XSvF9/w200-h200/head-mirror-256.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;If you&#39;d like to try it, it&#39;s &lt;a href=&quot;https://peacockmedia.software/mac/linkdoc/&quot;&gt;available for download now&lt;/a&gt;. It&#39;s free but in return, please &lt;a href=&quot;https://peacockmedia.software/general-contact-form.html&quot;&gt;contact us&lt;/a&gt; with any problems or suggestions.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='https://blog.peacockmedia.software/feeds/3031584339611215300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://blog.peacockmedia.software/2021/09/first-look-at-new-app-linkdoc-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/3031584339611215300'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/3031584339611215300'/><link rel='alternate' type='text/html' href='https://blog.peacockmedia.software/2021/09/first-look-at-new-app-linkdoc-for.html' title='First look at new app LinkDoc (for testing links within locally-stored pdf or docx documents)'/><author><name>peahen</name><uri>http://www.blogger.com/profile/02395503525006623752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimgDW08-cvcVvUH-9GZKfT7A2RlB6dPtSLg2xUaQG9ju0JGsxgRi97eTA3vHpq1KY_ObUwbav2PQtDrJFONgs7W0pdZczaogO6q6UZp3QCk6sYeaPbdsQsPAb1ytVhIg/s113/shiela.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/z9Z1mTdggN0/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5423774879231339244.post-6951350307886479388</id><published>2021-09-14T06:58:00.002-07:00</published><updated>2021-09-14T06:59:04.685-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="objective-c"/><title type='text'>Frustrating loop with NSURLSession when implementing URLSession: task: willPerformHTTPRedirection: newRequest: completionHandler:</title><content type='html'>&lt;p&gt;This isn&#39;t really a question, I think I&#39;ve solved the problem. But I think I&#39;ve seen this in the past and solved it then. So I&#39;m posting this here in case anyone else - most likely future me - has this same problem and wants to save some time.&lt;/p&gt;&lt;p&gt;Context: I&#39;m working on the next version of my crawling engine - it moves to NSURLSession rather than NSURLConnection**. Therefore (with the connection stuff at least) it&#39;s a ground-up rewrite.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Here&#39;s the problem I hit this morning. A Youtube link is redirecting from a shortened link to a longer one. But some unexpected things are happening.&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUs7VxRVihDeELke1HYjFUdklvtf8GPcn3kW2eEphDoQnEtr1wdk93RFCAI7cnI5RzgDI2RZxWHkzzGjnVHiMGPAPbQUUjr6uT5q5knZluRVU3lRqxvJVb0pdhFBm_pyKReaK8oljV4j4/s1351/Screenshot+2021-09-14+at+14.02.15.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;165&quot; data-original-width=&quot;1351&quot; height=&quot;49&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUs7VxRVihDeELke1HYjFUdklvtf8GPcn3kW2eEphDoQnEtr1wdk93RFCAI7cnI5RzgDI2RZxWHkzzGjnVHiMGPAPbQUUjr6uT5q5knZluRVU3lRqxvJVb0pdhFBm_pyKReaK8oljV4j4/w400-h49/Screenshot+2021-09-14+at+14.02.15.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;My&amp;nbsp;URLSession: task: willPerformHTTPRedirection: newRequest: completionHandler: &amp;nbsp; is being called and at first I simply put in the minimum code needed to simply continue with the redirection:&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;if(completionHandler){&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;completionHandler(request)&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;p&gt;According to example code found in various places, that should work. The documentation suggests that this is fine: &quot;completionHandler: A block that your handler should call with either the value of the request parameter, a modified URL request object, or NULL to refuse the redirect and return the body of the redirect response.&quot;&lt;/p&gt;&lt;p&gt;As you can see from the screenshot above, our url is being redirected over and over, each time with some garbage appended to the querystring.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Integrity and Scrutiny handle this fine. (Though at this point they are using the old NSURLConnection.) However, they have a lot more code in the redirect delegate method than my new one. Notably, they make a mutable copy of the new request and make some changes. Why do they need to do that?&lt;/p&gt;&lt;p&gt;I&#39;ve a funny feeling that I&#39;ve seen this problem before. Indeed, adding code to make a clone of the new request and modify it is what cures this problem.&lt;/p&gt;&lt;p&gt;It&#39;s not enough to simply clone and return the new request. &amp;nbsp;This is the line that makes the difference:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;[clonedRequest &amp;nbsp;setValue: [[request URL] host] forHTTPHeaderField: @&quot;Host&quot;];&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;(There&#39;s more to it than that, but there are reasons why my code isn&#39;t open source! Also, I use Objective C, apologies if you&#39;re a Swift person*).&lt;/p&gt;&lt;p&gt;In short, when we create the original request, we set the Host field. In the past I have found this to be necessary in certain cases. In fact, the documentation says that the Host field must be present with http 1.1 and a server may return a 4xx status if it&#39;s not present and correct.&lt;/p&gt;&lt;p&gt;If we capture the header fields of the proposed new request in our delegate method, the original Host field appears unchanged. Therefore, it no longer matches the actual host of the updated request url. Here, the url is being redirected to&amp;nbsp;https://www.youtube.com/watch?v=xyz, but the Host field remains &quot;youtu.be&quot;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaNWytAgwkolo1iwbnZNea0sEBet1sF4EgT_QwTz-tthyphenhyphenuo5y92NaC0BjBX4C55OU1BTAD-d4qNS5Kg1Ae-duHcAhk0aISOPKoxcXeMeP5uNJEZmNh5ta21LMCHtIoe6sUTu0GB60lKRI/s1103/Screenshot+2021-09-14+at+14.09.34.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;148&quot; data-original-width=&quot;1103&quot; height=&quot;54&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaNWytAgwkolo1iwbnZNea0sEBet1sF4EgT_QwTz-tthyphenhyphenuo5y92NaC0BjBX4C55OU1BTAD-d4qNS5Kg1Ae-duHcAhk0aISOPKoxcXeMeP5uNJEZmNh5ta21LMCHtIoe6sUTu0GB60lKRI/w400-h54/Screenshot+2021-09-14+at+14.09.34.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;As I mentioned, I&#39;ve written the fix into Integrity and Scrutiny in the dim and distant past, presumably because I have spent time on this problem before.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I&#39;m guessing that this isn&#39;t a problem if you don&#39;t explicitly set the Host field yourself in your original request, but if you don&#39;t then you may find other problems pop up occasionally.&amp;nbsp;&lt;br /&gt;&lt;p&gt;If future me is reading this after starting another ground-up project and running into the same problem: you&#39;re welcome.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;** The important delegate methods of NSURLSessionTask are very similar to the old connection ones. Because I&#39;m seeing similar behaviour with both, I do believe that beneath the skin, NSURLSession and NSURLConnection are just the same.&amp;nbsp;&lt;/p&gt;&lt;p&gt;* I&#39;m aware that many folks are using Swift today, and it&#39;s getting harder to find examples and problem fixes written in Objective C. I&#39;m expecting that (as with java-cocoa) Apple will eventually remove support. But I won&#39;t switch and I&#39;m grateful for Objective C support as long as it lasts.&lt;/p&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://blog.peacockmedia.software/feeds/6951350307886479388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://blog.peacockmedia.software/2021/09/frustrating-loop-with-nsurlsession-when.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/6951350307886479388'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/6951350307886479388'/><link rel='alternate' type='text/html' href='https://blog.peacockmedia.software/2021/09/frustrating-loop-with-nsurlsession-when.html' title='Frustrating loop with NSURLSession when implementing URLSession: task: willPerformHTTPRedirection: newRequest: completionHandler:'/><author><name>peahen</name><uri>http://www.blogger.com/profile/02395503525006623752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimgDW08-cvcVvUH-9GZKfT7A2RlB6dPtSLg2xUaQG9ju0JGsxgRi97eTA3vHpq1KY_ObUwbav2PQtDrJFONgs7W0pdZczaogO6q6UZp3QCk6sYeaPbdsQsPAb1ytVhIg/s113/shiela.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUs7VxRVihDeELke1HYjFUdklvtf8GPcn3kW2eEphDoQnEtr1wdk93RFCAI7cnI5RzgDI2RZxWHkzzGjnVHiMGPAPbQUUjr6uT5q5knZluRVU3lRqxvJVb0pdhFBm_pyKReaK8oljV4j4/s72-w400-h49-c/Screenshot+2021-09-14+at+14.02.15.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5423774879231339244.post-7104455273386038844</id><published>2021-09-09T01:31:00.005-07:00</published><updated>2021-09-09T01:47:31.545-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="link checker"/><category scheme="http://www.blogger.com/atom/ns#" term="website analysis"/><title type='text'>429 status codes when crawling sites</title><content type='html'>&lt;br /&gt;&lt;p&gt;I&#39;ve had a few conversations with friends about Maplin recently. I have very good memories of the Maplin catalogue way back when they sold electronic components. The catalogue grew bigger each year and featured great spaceship artwork on the cover. They opened high street shops, started selling toys and then closed their shops.&lt;/p&gt;&lt;p&gt;The challenge with this site is that it would finish early after receiving a bunch of 429 status codes.&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL_QRDPqH2aRyrYqueqyuGRg-xiLTfX3Wf0FPU7TeimrV2TT7j9ml1DX_Q4mWlR8bA8gtOprWHXXaHZvkRTXHmeJXDJJQB9ddkpy9U7jST-hYUIEX89XOgohkLGFo1u4C2MX61S3Jg93Q/s1329/Screenshot+2021-09-06+at+14.09.27.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;796&quot; data-original-width=&quot;1329&quot; height=&quot;192&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL_QRDPqH2aRyrYqueqyuGRg-xiLTfX3Wf0FPU7TeimrV2TT7j9ml1DX_Q4mWlR8bA8gtOprWHXXaHZvkRTXHmeJXDJJQB9ddkpy9U7jST-hYUIEX89XOgohkLGFo1u4C2MX61S3Jg93Q/s320/Screenshot+2021-09-06+at+14.09.27.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;This code means &quot;too many requests&quot;. So the server would respond normally for a while before deciding not to co-operate any more. When this happens, it&#39;s usually solved by throttling the crawler; limiting its number of threads, or imposing a limit on the number of requests per minute.&lt;/p&gt;&lt;p&gt;With Maplin I went back to a single thread and just 50 requests per minute (less than one per second) and even at this pedestrian speed, the behaviour was the same. So I guess that it&#39;s set to allow a certain number of requests from a given IP address within a certain time. It didn&#39;t block my IP and so after a break would respond again.&amp;nbsp;&lt;/p&gt;&lt;p&gt;I managed to get through the site using a technique which is a bit of a hack but works. It&#39;s the &quot;Pause and Continue&quot; technique. When you start to receive errors, pausing and waiting for a while allows us to continue and make a fresh start with the server. A useful feature of &lt;a href=&quot;https://peacockmedia.software/mac/integrity-pro/&quot;&gt;Integrity&lt;/a&gt; and &lt;a href=&quot;https://peacockmedia.software/mac/scrutiny/&quot;&gt;Scrutiny&lt;/a&gt;&#39;s engine is that on Continue, it doesn&#39;t just continue from where it left off. It will start at the top of its list, ignore the good statuses but re-check any bad links. This leads to the fun spectacle of the number of bad links counting backwards!&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&#39;allowfullscreen&#39; webkitallowfullscreen=&#39;webkitallowfullscreen&#39; mozallowfullscreen=&#39;mozallowfullscreen&#39; width=&#39;320&#39; height=&#39;266&#39; src=&#39;https://www.blogger.com/video.g?token=AD6v5dxUzgRZB0HEN8K3MwEx55JEvsWMkSlmRi0K8ID1ramdyWdNtExRSfYgSMF6C_5Wxa6cUb0c5_AZC0XG7W7o9A&#39; class=&#39;b-hbp-video b-uploaded&#39; frameborder=&#39;0&#39;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;On finish, there seems to be around 50 genuinely broken links. Easily fixed once found.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK-Eu1zCPuftKyzbkjaw0kXbqN7LvNzllezIWmvdR3YF8ZLdy2eb5zZNDoCBc6B5EUdIePr4YAsbgJm050Ok5dE8G0r89mEcqQXflRQfoD9p3_Y7Qx4Gb8nSZU4Yf7Eb-lnZmCjmLEwM0/s1214/Screenshot+2021-09-09+at+00.09.30.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;603&quot; data-original-width=&quot;1214&quot; height=&quot;159&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK-Eu1zCPuftKyzbkjaw0kXbqN7LvNzllezIWmvdR3YF8ZLdy2eb5zZNDoCBc6B5EUdIePr4YAsbgJm050Ok5dE8G0r89mEcqQXflRQfoD9p3_Y7Qx4Gb8nSZU4Yf7Eb-lnZmCjmLEwM0/s320/Screenshot+2021-09-09+at+00.09.30.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='https://blog.peacockmedia.software/feeds/7104455273386038844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://blog.peacockmedia.software/2021/09/429-status-codes-when-crawling-sites.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/7104455273386038844'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/5423774879231339244/posts/default/7104455273386038844'/><link rel='alternate' type='text/html' href='https://blog.peacockmedia.software/2021/09/429-status-codes-when-crawling-sites.html' title='429 status codes when crawling sites'/><author><name>peahen</name><uri>http://www.blogger.com/profile/02395503525006623752</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimgDW08-cvcVvUH-9GZKfT7A2RlB6dPtSLg2xUaQG9ju0JGsxgRi97eTA3vHpq1KY_ObUwbav2PQtDrJFONgs7W0pdZczaogO6q6UZp3QCk6sYeaPbdsQsPAb1ytVhIg/s113/shiela.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL_QRDPqH2aRyrYqueqyuGRg-xiLTfX3Wf0FPU7TeimrV2TT7j9ml1DX_Q4mWlR8bA8gtOprWHXXaHZvkRTXHmeJXDJJQB9ddkpy9U7jST-hYUIEX89XOgohkLGFo1u4C2MX61S3Jg93Q/s72-c/Screenshot+2021-09-06+at+14.09.27.png" height="72" width="72"/><thr:total>0</thr:total></entry></feed>