<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>metsonet</title>
    <description>Homepage/blog of Simon Metson. An assortment of things appear here over time.
</description>
    <link>https://metsonet.co.uk/</link>
    <atom:link href="https://metsonet.co.uk/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Sun, 07 Jul 2024 20:17:43 +0100</pubDate>
    <lastBuildDate>Sun, 07 Jul 2024 20:17:43 +0100</lastBuildDate>
    <generator>Jekyll v3.9.5</generator>
    
      <item>
        <title>Verifying signatures on the XRPL with Python</title>
        <description>&lt;p&gt;Writing this more because I spent a while bouncing around the internet trying to find an example. There’s a &lt;a href=&quot;https://github.com/XRPL-Labs/verify-xrpl-signature&quot;&gt;nice library for Javascript&lt;/a&gt; from the good people at &lt;a href=&quot;https://xrpl-labs.com/&quot;&gt;XRP Labs&lt;/a&gt; but I couldn’t find similar in Python, and needed to verify a signature for a &lt;a href=&quot;https://xumm.app/&quot;&gt;XUMM&lt;/a&gt; &lt;a href=&quot;https://xumm.readme.io/docs/user-sign-in&quot;&gt;login&lt;/a&gt;. There is a &lt;a href=&quot;https://xrpl-py.readthedocs.io/en/stable/&quot;&gt;comprehensive Python SDK&lt;/a&gt; so I figured rolling my own wouldn’t be a hardship. In fact it was super easy, the whole thing is just &lt;a href=&quot;https://xrpl-py.readthedocs.io/en/stable/source/xrpl.core.binarycodec.html?highlight=binarycodec#xrpl.core.binarycodec.decode&quot;&gt;two&lt;/a&gt; &lt;a href=&quot;https://xrpl-py.readthedocs.io/en/stable/source/xrpl.core.keypairs.html?highlight=is_valid_message#xrpl.core.keypairs.is_valid_message&quot;&gt;functions&lt;/a&gt;, it was just a bit hidden away in the docs.&lt;/p&gt;

&lt;p&gt;What’s nice is we can use the example from the javascript tool to confirm:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;from xrpl.core.binarycodec import decode
from xrpl.core.binarycodec import encode_for_signing
from xrpl.core.keypairs import is_valid_message


transaction_hex = '2280000000240000000268400000000000000C73210333C718C9CB716E0575454F4A343D46B284ED51151B9C7383524B82C10B262095744730450221009A4D99017F8FD6881D888047E2F9F90C068C09EC9308BC8526116B539D6DD44102207FAA7E8756F67FE7EE1A88884F120A00A8EC37E7D3E5ED3E02FEA7B1D97AA05581146C0994D3FCB140CAB36BAE9465137448883FA487'

decoded = decode(transaction_hex)

expected_account = 'rwiETSee2wMz3SBnAG8hkMsCgvGy9LWbZ1'
assert decoded['Account'] == expected_account

is_valid_message(
    bytes.fromhex(encode_for_signing(decoded)),
    bytes.fromhex(decoded['TxnSignature']),
    decoded['SigningPubKey'],
)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It seemed to make sense to wrap this up into a &lt;a href=&quot;https://github.com/audiotarky/xrplpers&quot;&gt;helper library&lt;/a&gt; and open source it. Let me know if you see any mistakes!&lt;/p&gt;
</description>
        <pubDate>Sat, 23 Oct 2021 00:00:00 +0100</pubDate>
        <link>https://metsonet.co.uk/web/2021/10/23/verify-xrpl-sig.html</link>
        <guid isPermaLink="true">https://metsonet.co.uk/web/2021/10/23/verify-xrpl-sig.html</guid>
        
        <category>coding</category>
        
        <category>python]</category>
        
        <category>xrpl</category>
        
        <category>xrp</category>
        
        
        <category>web</category>
        
      </item>
    
      <item>
        <title>Some nice music from Audiotarky</title>
        <description>&lt;p&gt;Just testing something for &lt;a href=&quot;https://www.audiotarky.com/$&quot;&gt;Audiotarky&lt;/a&gt;.&lt;/p&gt;

&lt;script src=&quot;https://www.audiotarky.com/$/embed.js&quot; size=&quot;small&quot; url=&quot;https://www.audiotarky.com/$/artists/orbury-common/suppertime-seance/&quot;&gt;&lt;/script&gt;

</description>
        <pubDate>Sat, 27 Feb 2021 00:00:00 +0000</pubDate>
        <link>https://metsonet.co.uk/music/2021/02/27/Some_nice_music.html</link>
        <guid isPermaLink="true">https://metsonet.co.uk/music/2021/02/27/Some_nice_music.html</guid>
        
        <category>geeky</category>
        
        <category>testing</category>
        
        <category>audiotarky</category>
        
        
        <category>music</category>
        
      </item>
    
      <item>
        <title>Some more nice music from Audiotarky</title>
        <description>&lt;p&gt;Just testing something else for &lt;a href=&quot;https://www.audiotarky.com/$&quot;&gt;Audiotarky&lt;/a&gt;.&lt;/p&gt;

&lt;script src=&quot;https://www.audiotarky.com/$/embed.js&quot; size=&quot;large&quot; url=&quot;https://www.audiotarky.com/$/artists/tiger-mendoza/tmsk8-the-mixtape/&quot;&gt;&lt;/script&gt;

</description>
        <pubDate>Sat, 27 Feb 2021 00:00:00 +0000</pubDate>
        <link>https://metsonet.co.uk/music/2021/02/27/Some_more_nice_music.html</link>
        <guid isPermaLink="true">https://metsonet.co.uk/music/2021/02/27/Some_more_nice_music.html</guid>
        
        <category>geeky</category>
        
        <category>testing</category>
        
        <category>audiotarky</category>
        
        
        <category>music</category>
        
      </item>
    
      <item>
        <title>These are my racks</title>
        <description>&lt;p&gt;Partly due to &lt;a href=&quot;https://anechoics.uk/recordings/2020/10/11/Album.html&quot;&gt;recording with Anechoics&lt;/a&gt; and partly due to lockdown boredoms I’ve been updating my &lt;a href=&quot;https://www.modulargrid.net/&quot;&gt;modular grid&lt;/a&gt; entries. I’m starting to admit that I possibly have a problem… It’s so bad that I’ve added a Jekyll include especially for modular grid images. Winning!&lt;/p&gt;

&lt;p&gt;In general I’ve tried to make the racks be independently useful/complete. They’ll have control modules (sequencers, switches, clocks…) and voice modules (VCO’s, VCA’s, envelope generators) so that they could be used on their own, or linked up to make something larger.&lt;/p&gt;

&lt;h2 id=&quot;little-guy&quot;&gt;Little guy&lt;/h2&gt;

&lt;p&gt;Built in my first case from Pittsburgh modular, this has housed my Metropolis for almost forever.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.modulargrid.net/e/racks/view/312311&quot;&gt;&lt;img src=&quot;https://cdn.modulargrid.net/img/racks/modulargrid_312311.jpg&quot; alt=&quot;See my rack&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;hack-rack-voices-1&quot;&gt;Hack rack voices 1&lt;/h2&gt;

&lt;p&gt;Built in a &lt;a href=&quot;https://anechoics.uk/gear/2020/05/17/Second-mini-gig-rig.html&quot;&gt;box from Ikea&lt;/a&gt; I’ve enjoyed building these “hack racks”, to the point of doing it for fun… Lots of different VCO’s in here, but they kind of make sense together, especially the two &lt;a href=&quot;https://www.modulargrid.net/e/doepfer-a-110-4-se&quot;&gt;Doepfer A-110-4 SE&lt;/a&gt;, which I use to FM one another. Filthy.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.modulargrid.net/e/racks/view/1384895&quot;&gt;&lt;img src=&quot;https://cdn.modulargrid.net/img/racks/modulargrid_1384895.jpg&quot; alt=&quot;See my rack&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;hack-rack-voices-2&quot;&gt;Hack rack voices 2&lt;/h2&gt;

&lt;p&gt;This one is still a WIP - I need to finish the uO_C -  and it’s a bit of a weird rack. Kind of for drones, loops, and other weirdness, but with a really nice VCO at it’s centre (the Tš-L v2).&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.modulargrid.net/e/racks/view/1419757&quot;&gt;&lt;img src=&quot;https://cdn.modulargrid.net/img/racks/modulargrid_1419757.jpg&quot; alt=&quot;See my rack&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;hack-rack-brains&quot;&gt;Hack rack brains&lt;/h2&gt;

&lt;p&gt;This was called “brains” when it had a few more logic and sequencer modules in, but the name has stuck. That said, it has two very nice, and slightly unusual sequencers in (the &lt;a href=&quot;https://www.modulargrid.net/e/antumbra-rot8&quot;&gt;Antumbra Rot8&lt;/a&gt; and the &lt;a href=&quot;https://www.modulargrid.net/e/division-6-dual-mini-sequencer&quot;&gt;Division 6&lt;/a&gt;). While its not got a lot of voices in, the &lt;a href=&quot;https://www.modulargrid.net/e/nonlinearcircuits-sloth-chaos-4hp&quot;&gt;Sloth&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://www.modulargrid.net/e/dove-audio-waveplane-oscillator&quot;&gt;WPO&lt;/a&gt; is probably one of my favourite voice combos. The blank panels are actually a &lt;a href=&quot;https://www.etsy.com/listing/890304003/beepboop-eurorack-switched-multiple&quot;&gt;switched mult&lt;/a&gt; and a &lt;a href=&quot;https://www.etsy.com/uk/listing/876369994/eurorack-tape-sampler-prebuilt-old-stock&quot;&gt;Tape Sampler&lt;/a&gt; from my friend Jack.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.modulargrid.net/e/racks/view/1384905&quot;&gt;&lt;img src=&quot;https://cdn.modulargrid.net/img/racks/modulargrid_1384905.jpg&quot; alt=&quot;See my rack&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;big-guy&quot;&gt;Big guy&lt;/h2&gt;

&lt;p&gt;This is my biggest synth, which is sort of a problem. It’s so big that I don’t use it enough - it probably needs a rethink. It’s built out of recycled parquet flooring that I got from the &lt;a href=&quot;https://www.bwrp.org.uk/&quot;&gt;Bristol Wood Recycling Project&lt;/a&gt; (a happy place…) which is a sort of great &amp;amp; sort of terrible material to build a synth from. It also lacks finesse as I lack a workshop.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.modulargrid.net/e/racks/view/1437069&quot;&gt;&lt;img src=&quot;https://cdn.modulargrid.net/img/racks/modulargrid_1437069.jpg&quot; alt=&quot;See my rack&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;my-unsafe-eurorack&quot;&gt;My Unsafe Eurorack&lt;/h2&gt;

&lt;p&gt;Built in a Thomann rack enclosure, this was the first case I wired up with a Meanwell PSU. It’s got some of my favourite modules (Rampage, Ryk M-185, Sampleslicer) in and probably more &lt;a href=&quot;https://www.modulargrid.net/e/other-unknown-double-buff&quot;&gt;buffered mults&lt;/a&gt; than it needs.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.modulargrid.net/e/racks/view/1437483&quot;&gt;&lt;img src=&quot;https://cdn.modulargrid.net/img/racks/modulargrid_1437483.jpg&quot; alt=&quot;See my rack&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(for some reason MG isn’t rendering this one right yet… best to click through to see it in all its glory…)&lt;/em&gt;&lt;/p&gt;
</description>
        <pubDate>Tue, 12 Jan 2021 00:00:00 +0000</pubDate>
        <link>https://metsonet.co.uk/gear/2021/01/12/racks.html</link>
        <guid isPermaLink="true">https://metsonet.co.uk/gear/2021/01/12/racks.html</guid>
        
        <category>synths</category>
        
        <category>diy</category>
        
        
        <category>gear</category>
        
      </item>
    
      <item>
        <title>Office music with Mopidy</title>
        <description>&lt;p&gt;Since lockdown began in March (it was March, wasn’t it?) I’ve been working from home. This took a while to get used to - my short drive to/from the office put my brain in gear - but is now “the new normal”.&lt;/p&gt;

&lt;p&gt;One of the little benefits of working from home is that I can listen to music more. I don’t much like wearing headphones, especially not all day, so when in the office I don’t usually listen to music. But at home I have a stereo and can put on tunes to my hearts content (currently listening to Bill Callahan’s “Gold Record”).&lt;/p&gt;

&lt;p&gt;I have tried a few variations on the theme of “Spotify going into the stereo”, using either an old Mac Mini or plugging in my phone. During lockdown (I forget when…) I switched things up a bit and got a raspberry pi 4 to work as my music source. This runs &lt;a href=&quot;https://mopidy.com/&quot;&gt;Mopidy&lt;/a&gt; and the &lt;a href=&quot;https://github.com/jaedb/Iris&quot;&gt;Iris UI&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Mopidy plays music from local disk, Spotify, SoundCloud, TuneIn, and more. You can edit the playlist from any phone, tablet, or computer using a variety of MPD and web clients&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The pi is a great piece of kit, and Mopidy is a nicely written bit of software that’s easily installed and configured. It means I can line up tracks, “discover” them etc. and just have a nice stream of music coming into my earholes. I have vague hopes of plumbing in &lt;a href=&quot;https://audiotarky.com&quot;&gt;Audiotarky&lt;/a&gt; one day.&lt;/p&gt;

&lt;p&gt;I’ve had to prod Alsa a few times, it seems a recent update (or possibly me plugging something in differently) has made the soundcard device move around a bit. Not to worry, this can be configured in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/asound.conf&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;First find the device you want to use with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sudo aplay -l&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;aplay &lt;span class=&quot;nt&quot;&gt;-l&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;****&lt;/span&gt; List of PLAYBACK Hardware Devices &lt;span class=&quot;k&quot;&gt;****&lt;/span&gt;
card 0: b1 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;bcm2835 HDMI 1], device 0: bcm2835 HDMI 1 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;bcm2835 HDMI 1]
  Subdevices: 4/4
  Subdevice &lt;span class=&quot;c&quot;&gt;#0: subdevice #0&lt;/span&gt;
  Subdevice &lt;span class=&quot;c&quot;&gt;#1: subdevice #1&lt;/span&gt;
  Subdevice &lt;span class=&quot;c&quot;&gt;#2: subdevice #2&lt;/span&gt;
  Subdevice &lt;span class=&quot;c&quot;&gt;#3: subdevice #3&lt;/span&gt;
card 1: b2 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;bcm2835 HDMI 2], device 0: bcm2835 HDMI 2 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;bcm2835 HDMI 2]
  Subdevices: 2/2
  Subdevice &lt;span class=&quot;c&quot;&gt;#0: subdevice #0&lt;/span&gt;
  Subdevice &lt;span class=&quot;c&quot;&gt;#1: subdevice #1&lt;/span&gt;
card 2: Headphones &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;bcm2835 Headphones], device 0: bcm2835 Headphones &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;bcm2835 Headphones]
  Subdevices: 1/2
  Subdevice &lt;span class=&quot;c&quot;&gt;#0: subdevice #0&lt;/span&gt;
  Subdevice &lt;span class=&quot;c&quot;&gt;#1: subdevice #1&lt;/span&gt;
card 3: sndrpihifiberry &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;snd_rpi_hifiberry_dac], device 0: HifiBerry DAC HiFi pcm5102a-hifi-0 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;HifiBerry DAC HiFi pcm5102a-hifi-0]
  Subdevices: 1/1
  Subdevice &lt;span class=&quot;c&quot;&gt;#0: subdevice #0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I want to use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Headphones&lt;/code&gt; device, so my &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/asound&lt;/code&gt; looks like:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pcm.!default &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
       &lt;span class=&quot;nb&quot;&gt;type &lt;/span&gt;hw
       card Headphones
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

ctl.!default &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;type &lt;/span&gt;hw
        card Headphones
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Once configured, you can verify with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;aplay /usr/share/sounds/alsa/Front_Center.wav&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Once you’ve got the config how you want, restart mopidy:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;systemctl restart mopidy
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;systemctl status mopidy
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
        <pubDate>Fri, 06 Nov 2020 00:00:00 +0000</pubDate>
        <link>https://metsonet.co.uk/music/2020/11/06/Office_music_with_Mopidy.html</link>
        <guid isPermaLink="true">https://metsonet.co.uk/music/2020/11/06/Office_music_with_Mopidy.html</guid>
        
        <category>geeky</category>
        
        <category>mopidy</category>
        
        <category>python</category>
        
        <category>lockdown</category>
        
        
        <category>music</category>
        
      </item>
    
      <item>
        <title>Audiotarky announced!</title>
        <description>&lt;p&gt;Hugely chuffed to be awarded a &lt;a href=&quot;https://www.grantfortheweb.org/blog/2020-mid-grantees&quot;&gt;grant for the web&lt;/a&gt; to build on some of the web monetisation/music streaming I’ve been doing over the summar. More info on the new &lt;a href=&quot;https://blog.audiotarky.com/2020/10/06/first-post/index.html&quot;&gt;Audiotarky blog&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Tue, 06 Oct 2020 00:00:00 +0100</pubDate>
        <link>https://metsonet.co.uk/web/2020/10/06/Audiotarky_announced.html</link>
        <guid isPermaLink="true">https://metsonet.co.uk/web/2020/10/06/Audiotarky_announced.html</guid>
        
        <category>micropayments</category>
        
        <category>grant for the web</category>
        
        <category>web monetisation</category>
        
        <category>streaming</category>
        
        <category>open source</category>
        
        
        <category>web</category>
        
      </item>
    
      <item>
        <title>Tekton aide-mémoire</title>
        <description>&lt;p&gt;I’ve been doing some work on &lt;a href=&quot;https://github.com/tektoncd&quot;&gt;Tekton&lt;/a&gt; this morning, dusting off somethings I did back in April. One thing that I wrote down at the time  but now can’t find (grumble) is how I got a local instance running on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;minikube&lt;/code&gt;, so I thought I’d put it here for posterity.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;minikube start

# Clean install
kubectl delete namespace tekton-pipelines
kubectl delete deployment -n tekton-pipelines tekton-dashboard

# Install tekton &amp;amp; its dashboard
kubectl apply -f https://storage.googleapis.com/tekton-releases/latest/release.yaml
kubectl apply --filename https://storage.googleapis.com/tekton-releases/dashboard/latest/tekton-dashboard-release.yaml

# Verify (ctrl-c to get out)                     
kubectl get pods --namespace tekton-pipelines --watch

# Access via port forwarding
kubectl --namespace tekton-pipelines port-forward svc/tekton-dashboard 9097:9097
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This gets to a working tekton dashboard accessible at localhost:9097.&lt;/p&gt;

&lt;p&gt;You can then push resources in via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;kubectl apply -f pipeline.yaml&lt;/code&gt; etc.&lt;/p&gt;

&lt;p&gt;Theres a tekton CLI now (at least, I don’t think it was there when I last used it) which can be installed via brew, I also had an old minikube, so updated via:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;brew install tektoncd-cli
brew install minikube
brew upgrade minikube
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Some helpful blogs:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.arthurkoziel.com/creating-ci-pipelines-with-tekton-part-1/&quot;&gt;Creating CI Pipelines with Tekton part 1&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.arthurkoziel.com/creating-ci-pipelines-with-tekton-part-2/&quot;&gt;Creating CI Pipelines with Tekton part 2&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://medium.com/01001101/tekton-pipeline-kubernetes-native-pipelines-296478f5c835&quot;&gt;Tekton Pipeline — Kubernetes-native pipelines&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
        <pubDate>Fri, 02 Oct 2020 00:00:00 +0100</pubDate>
        <link>https://metsonet.co.uk/work/2020/10/02/Tekton.html</link>
        <guid isPermaLink="true">https://metsonet.co.uk/work/2020/10/02/Tekton.html</guid>
        
        <category>kubernetes</category>
        
        <category>tekton</category>
        
        <category>cloud</category>
        
        
        <category>work</category>
        
      </item>
    
      <item>
        <title>Panel template helper</title>
        <description>&lt;p&gt;Inspired by the &lt;a href=&quot;https://www.thonk.co.uk/shop/mtm-book/&quot;&gt;Music Thing Modular workshop notebook&lt;/a&gt; and an &lt;a href=&quot;https://www.ikea.com/gb/en/p/fullfoelja-note-book-black-10428308/&quot;&gt;Ikea notebook&lt;/a&gt; I’ve started a simple SDIY template, that folds into three panes. At the moment it has:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;2, 3, 4, 8 &amp;amp; 16 HP panel sizes (might add 6 &amp;amp; 10HP)&lt;/li&gt;
  &lt;li&gt;Thonkiconn footprint in four orientations&lt;/li&gt;
  &lt;li&gt;IC pin out for 555 timers, TL072 &amp;amp; TL074 chips&lt;/li&gt;
  &lt;li&gt;A simple 56 HP tape measure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;/panel_layout_guide.svg&quot;&gt;&lt;img src=&quot;/panel_layout_guide.svg&quot; alt=&quot;Panel template helper&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I quite like the iea of it being a double sided guide, so I’m wondering what else to put on it. Things like resistor values seem obvious but less useful, especially for panel design. &lt;a href=&quot;https://www.thonk.co.uk/product-category/parts/knobs/&quot;&gt;Knob sizes&lt;/a&gt; might be useful, but I think laying out some knobs on the paper would be more useful (though perhaps less practical for coffee shop designing). More IC’s would be good, but which? Pots? Sliders? Switches? Suggestions &lt;a href=&quot;https://github.com/drsm79/drsm79.github.com/issues/new&quot;&gt;welcome&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Wed, 23 Sep 2020 00:00:00 +0100</pubDate>
        <link>https://metsonet.co.uk/sdiy/2020/09/23/Panel_template_helper.html</link>
        <guid isPermaLink="true">https://metsonet.co.uk/sdiy/2020/09/23/Panel_template_helper.html</guid>
        
        <category>synths</category>
        
        <category>diy</category>
        
        <category>sdiy</category>
        
        <category>electronics</category>
        
        
        <category>sdiy</category>
        
      </item>
    
      <item>
        <title>Feeling twitchy</title>
        <description>&lt;p&gt;This week I’ve made not one but two Twitch appearances with &lt;a href=&quot;https://twitter.com/hammertoe&quot;&gt;Matt&lt;/a&gt;. The first was starting to code up a ML/AI to &lt;a href=&quot;https://dev.to/hammertoe/using-machine-learning-to-catalog-modular-synthesizers-co2&quot;&gt;identify synth modules&lt;/a&gt;. The idea for this came to me when I thought about updating my &lt;a href=&quot;https://www.modulargrid.net/e/users/view/77246&quot;&gt;modulargrid&lt;/a&gt; page &amp;amp; realised I’ve got enough bits &amp;amp; pieces that it would be a chore. I’m lazy &amp;amp; we live in the future, so surely a robot could do it for me!&lt;/p&gt;

&lt;p&gt;Well, one can’t, yet, but Matt &amp;amp; I will be making one over the coming weeks. So far we’ve got the tooling to make a training dataset (you can see the code &lt;a href=&quot;https://github.com/drsm79/modulair/&quot;&gt;here&lt;/a&gt;). We’d planned to use a tool that was down at the time of recording, so hastily had to rethink our approach, which led to some mildly panicked coding behind the scenes. I think Matt covered it excellently, though, and did a good job of turning a problem in to a way to explain things to the audience.&lt;/p&gt;

&lt;p&gt;The second appearance happened this morning. Matt spotted a &lt;a href=&quot;https://dev.to/devteam/announcing-the-github-actions-hackathon-on-dev-3ljn&quot;&gt;GitHub hackathon&lt;/a&gt; which our &lt;a href=&quot;/web/2020/07/01/PayID-Functions-Twitch.html&quot;&gt;previous&lt;/a&gt; &lt;a href=&quot;/web/2020/07/03/PayID-Functions-Twitch-part-2.html&quot;&gt;twitchings&lt;/a&gt; seemed like a good starting point to build upon. I could only join for the first 30 mins (real life got in the way) but when I dropped we had the bare bones of the action set up and I left Matt to “draw the rest of the owl”. Which he duly did.&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;I did! :)&lt;br /&gt;&lt;br /&gt;Wooohooo!!!! &lt;a href=&quot;https://t.co/pikwh54qJc&quot;&gt;pic.twitter.com/pikwh54qJc&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matt Hamilton (@HammerToe) &lt;a href=&quot;https://twitter.com/HammerToe/status/1306562876644233220?ref_src=twsrc%5Etfw&quot;&gt;September 17, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;p&gt;I have to say, he seems very surprised that it works! ;)&lt;/p&gt;

&lt;p&gt;You can watch the full stream below.&lt;/p&gt;

&lt;center&gt;
    &lt;iframe src=&quot;https://cinnamon.video/watch?v=410918564657104239&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot; scrolling=&quot;no&quot; height=&quot;378&quot; width=&quot;620&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;
</description>
        <pubDate>Thu, 17 Sep 2020 00:00:00 +0100</pubDate>
        <link>https://metsonet.co.uk/web/2020/09/17/Feeling_twitchy.html</link>
        <guid isPermaLink="true">https://metsonet.co.uk/web/2020/09/17/Feeling_twitchy.html</guid>
        
        <category>coding</category>
        
        <category>python</category>
        
        <category>synths</category>
        
        <category>experiment</category>
        
        <category>ai</category>
        
        <category>ml</category>
        
        <category>twitch</category>
        
        
        <category>web</category>
        
      </item>
    
      <item>
        <title>Embeddable playlists &amp; the ILP jailbreak</title>
        <description>&lt;p&gt;I’ve been building a &lt;a href=&quot;/web/2020/07/21/WebMonetiztion-for-musicians.html&quot;&gt;web monetized music platform&lt;/a&gt;, in my copious spare time. You may have even &lt;a href=&quot;/music/2020/08/10/better.html&quot;&gt;heard&lt;/a&gt; &lt;a href=&quot;/music/2020/08/10/5pianos.html&quot;&gt;some&lt;/a&gt; &lt;a href=&quot;/music/2020/08/10/absolutely-shocking.html&quot;&gt;of it&lt;/a&gt;. One thing I added a while back to this site is a &lt;a href=&quot;/playlist&quot;&gt;playlist&lt;/a&gt;, built from all the posts that have direct link to a track, as opposed to one hosted on Bandcamp, Soundcloud or Spotify. That was nice, and it does a couple of cute things:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;auto-generated from music posts that use audio files hosted on this site, linking to those pages&lt;/li&gt;
  &lt;li&gt;changes artwork with the tracks&lt;/li&gt;
  &lt;li&gt;can “pop out” into its own window&lt;/li&gt;
  &lt;li&gt;prompts about &lt;a href=&quot;https://coil.com/&quot;&gt;Coil&lt;/a&gt; if not enabled&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The next thing I wanted to do with it was have it be embedable, such that someone could put the playlist on their own page. Doing that with a simple &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt; is easy enough, but there’s a sticking point. The whole point of this is to have the music be web monetized, and Coil’s plugin (quite reasonably) blocks an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt; from requesting payment - I suspect because if this wasn’t the case, one page could end up with hundreds of streams of payment, which would make everything complicated. This could make it easier for people to &lt;a href=&quot;https://github.com/WICG/webmonetization/issues/96&quot;&gt;hijack payments&lt;/a&gt;, too.&lt;/p&gt;

&lt;p&gt;So, this got me thinking. I wanted a simple (as in few character long) embed code that people could use (Bandcamp et. al use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt;), but also have the content set the ILP for the track playing, which means having a way to “jailbreak” the ILP pointer out of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt;. Instead of a simple &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt;, could this be done with a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;script&amp;gt;&lt;/code&gt; (spoiler; yes, yes it could).&lt;/p&gt;

&lt;p&gt;The solution is in two parts; the playlist &amp;amp; the embed script. The playlist page needs to be aware that it might be placed in an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt;, and if it is it needs to communicate the ILP for the track that’s playing to its parent. This can be done via the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;postMessage&lt;/code&gt; API&lt;/a&gt;, the relevant bit of code for this site is:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;function sendILPToParent(ilp){
    if ( window.location !== window.parent.location ) {
        var data = {&quot;playlist-ilp&quot;: ilp};
        parent.postMessage(data, &quot;*&quot;);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This checks to see if the page is in an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt;, and if it is sends the ILP via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;postMessage&lt;/code&gt; to the parent. Neat-o.&lt;/p&gt;

&lt;p&gt;Now we need something on the other side. The &lt;a href=&quot;/playlist_embed.js&quot;&gt;script&lt;/a&gt; is pretty short, and I think fairly self explainatory. The relevant bit for the “jailbreak” is:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;window.addEventListener(&quot;message&quot;, function (event) {
    const ilp = event.data[&quot;playlist-ilp&quot;] || false;
    if (ilp) {
        var not_done = true;
        const metas = document.getElementsByTagName('meta');
        for (let i = 0; i &amp;lt; metas.length; i++) {
            if (metas[i].getAttribute('name') === 'monetization') {
                metas[i].content = ilp;
                not_done = false;
                console.log(&quot;set ilp to &quot; + ilp + &quot; via event.&quot;);
            }
        }
        if (not_done) {
            const monetizationTag = document.createElement('meta');
            monetizationTag.name = 'monetization';
            monetizationTag.content = ilp;
            document.head.appendChild(monetizationTag);
            console.log(&quot;added meta &amp;amp; set ilp to &quot; + ilp + &quot; via event.&quot;);
        }
    }
});
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This listens for a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;message&lt;/code&gt; event, and on receiving one, proceeds to either update the monetization &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; tag, or create one. What’s nice is, because this is event based, when the track changes this can be invoked again, updating where the micropayments flow. You can see this in action &lt;a href=&quot;https://metsonet.co.uk/embedded_no_ilp&quot;&gt;here&lt;/a&gt; and over on the &lt;a href=&quot;https://anechoics.uk/playlist_test.html&quot;&gt;Anechoics site&lt;/a&gt; - notably that’s pulling in the script, playlist, music &amp;amp; images from another domain.&lt;/p&gt;

&lt;p&gt;The script is configurable, on the embedding side, and those configurations are pulled out by the script via code like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;document.currentScript.getAttribute('playlist');&lt;/code&gt;. This means people could embed different playlists, configure size or styling etc. as they embed the music.&lt;/p&gt;

&lt;p&gt;What’s nice with this two part solution is that the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt; doesn’t dictate what happens in the parent, it just sends up a message that the parent gets to choose what to do with. This prevents hijacking payments, to some extent. It also means that the embeded playlist is suitably decoupled from the parent - it just needs to send that message to route payments and otherwise focus on playing music.&lt;/p&gt;

</description>
        <pubDate>Mon, 07 Sep 2020 00:00:00 +0100</pubDate>
        <link>https://metsonet.co.uk/web/2020/09/07/ilp_jailbreak_embeddable_playlists.html</link>
        <guid isPermaLink="true">https://metsonet.co.uk/web/2020/09/07/ilp_jailbreak_embeddable_playlists.html</guid>
        
        <category>javascript</category>
        
        <category>micropayments</category>
        
        <category>xrp</category>
        
        <category>web monetisation</category>
        
        <category>streaming</category>
        
        <category>embedding</category>
        
        
        <category>web</category>
        
      </item>
    
  </channel>
</rss>
