hammertoe

A coffee-loving software developer.

My weeknotes seem to becoming fortnightly notes. I need to get back onto the regular pattern. I think at the moment my issue is I wait too long then have too much to say, which then gets overwhelming.

Funnily enough, I saw a post by another Matt, Matt Jukes, this week. He was the person that inspired me to write Weeknotes. His post in turn is looking at the “rules of blogging” by yet another Matt, Matt Webb, who was the person he credits for getting him into weeknotes. If there is anyone else out there called Matt who has been inspired to start doing weeknotes from reading my blog, then please let me know. Let's see how far we can get this chain of weeknoting Matts.

Anyway, I'll let you read the “rules” and the analysis of them. I think there is definitely something in there. Mostly it comes down to less-is-more and JFDI.

Back to School

My daughter is now back to school as of last week. She was extremely anxious about going back, but seems to have settled in again now she is back with her friends. A few things have changed, mainly around parents dropping off and picking up kids, and trying to isolate year groups a bit more. But otherwise seems not too different.

The main difference has been on me. As I've got the school runs to do again now. So whilst I'd gotten into quite a habit of working late in the evenings when everyone has gone to bed and getting up around 8:30 – 9am, I'm now having to get up around 7am. But I'm still working late. So means I'm getting less sleep, and has a less productive week this week. I am also remembering not to schedule any meetings at 3pm as I've got to go pick her up again then.

Yak Shaving

Yak shaving is a phrase often used in software development to describe having to do some tedious or useless task(s) in order to achieve a greater task. Often it is caused by having to get some tooling or platform in place to do what you wanted to do.

This week I've spent a lot of time yak shaving. I currently have a backlog of videos to publish and blog posts to write about the videos. At IBM, as with most companies, we try to track the effectiveness of what we do. My job as a developer advocate is to help developers learn about new technologies and tools in general and also about products IBM has that can help them. To that end we have a metrics system that allows us to trace back which events lead to someone signing up for a free IBM Cloud account, and possibly ultimately converting to being a paying customer. This system is based around actual physical events, e.g. conferences, webinars, workshops etc. But I wanted to track in more general terms links from blogs and live streaming sessions. So I decided to build a tool to help generate those tagged links.

It should be pretty quick right? I just need a form with a few fields to fill in, and then it is a case of substituting the fields into a particular URL format. So I was holding off publishing any new videos and blog posts until I had this in place. But what should be simple ended up taking several days, which takes more on to...

Modern Web App Development

Hooooollly shiiii...... when did web development get so insanely complicated?!

I originally started doing web development in about 1997 and then it was just HTML and CSS, then along came a bit of Javascript. Not long after I switched to writing server-side code. As that, at the time, was where all the logic was of web apps. Over time, much of the logic has now moved back to the web browser. And a number of frameworks have been created to facilitate this. E.g. React, Angular, Vue.

And they are so damn complex! Maybe using one for my simple app was overkill, but I wanted to use IBM's Carbon Design System. And the easiest was would be through a framework it supports. I went for Vue, as that seemed like the cleanest of the three frameworks supported. But this is a whole new world for me.

I got there in the end. And most importantly (why I love this job) I learned a lot along the way.

And even better... I reached out to Wietse Wind, the developer of the Xumm app, who has agreed to do a live Twitch stream with me soon. He is someone who can turn and idea into a working site in an incredibly short time due to mastering the power of some of these frameworks. So I'm looking forward to having him on the stream and he can help me better understand some of the terminology around modern web app development. Stay tuned!

Streaming

Speaking of streaming, I've ben continuing to do the Twitch streams. I got a new webcam (Logitech Streamcam) as my old webcam was doing some strange thing where it would every so often just so into some kind of oversaturated mode and the colours went all strange.

I've got some fantastic upcoming Twitch sessions in the next few weeks:

  1. This coming Tuesday (15th Sept) I'll be joined by my colleague Simon Metson to work on seeing if we can train a neural network to detect and classify modules in a modular analog synthesizer. He is a big synth nerd and came to me with this idea, so we are going to use it as a mini-project and develop it live over a number of live streaming sessions
  2. Streaming the “hallway track” of the upcoming IBM Hybrid Cloud Digital Developer Conference. This is a new idea, but I'm really looking forward to it. Myself and two of the other regular IBM Twitch streamers, Spencer Krum and JJ Asghar will be hosting a parallel live session on Twitch to the main conference online. Each of us will be taking a 2 hour slot and will be joined by some of the main conference speakers after their talks. So if anyone has any questions or wants to chat further about any of the talk topics then they can join us on the IBM Developer Twitch channel.
  3. Analysing crime data with fellow developer advocate, Margriet Groenendijk. Margriet will be joining me live on the stream and we'll be looking waves to visualise data using the GeoPandas library.

New Blog Design

I've been doing a bit more work on the re-design of my blog. It has been slow going, but getting there. This week I've been getting the design I did previously into the static site generator I use, Pelican. And updating the code I wrote a while back to pull posts for from Coil for republishing.

Choirless

Well we are through to the final 3!!!! We find out if we won this week. The grand winner reveal is on Tuesday. I will be being interviewed live by Willie Tejada, GM & Chief Developer Advocate for IBM. So fingers crossed!

This week I also finished the 3rd generation of our audio synchronisation algorithm that uses a feature called “spectral flux” to detect the onset of notes and align the pieces. This seems to be much more accurate than previous approaches we have tried.

We finished off the IBM Canada “Coast to Coast” production. Showing IBM Canada's diversity in action. Singers, non-singers, all ages, genders, ethnicities, languages, inclusiveness. Doing their Covid-based song, Coast to Coast, 35+ IBMers, families and pets across two oceans.

It was then showcased, with fantastic reception, in a “town hall” session for IBM Canada.

We have also had our first church choir/band start to produce something. This was one of the first use-cases we though Choirless could be used for, and about a third of the beta testers we've had apply are from churches across the globe who are desperate to sing together, but can't due to COVID-19.

Singing “Amazing Grace” and with guitar, bass, and two singers it is already a beautiful piece. And since I uploaded this in the past hour another vocalist has joined in. I think this is really going to be something quite spectacular once it is finished. What you see above is what has come out, there has been no editing or manual processing. Just three people picked up their instruments and voices and joined in.

Well.. if you read any of the “rules of blogging” linked at the start then you will know I have broken pretty much all of them... so I'm going to call this a wrap and get some sleep!

Header photo by Lieve Ransijn on Unsplash

This is a write-up to follow the video of the third episode in my series of writing an algorithmic trading bot. You can find out more about this project on the first post in the series:

https://coil.com/p/hammertoe/Writing-an-Algorithmic-Trading-Bot/juWpy7ofn

In this third post I start to look at the reinforcement learning algorithm, what they are, and how to write a custom environment for one for simulating trading.

The rest of this post and the video of the live coding session are below exclusively for Coil subscribers.

Read more...

We just found out yesterday that Choirless is now through to the final 3 projects for the Call for Code IBMer Challenge! It has been a fantastic journey so far and we've taken Choirless from a zygote of an idea through to scaling it up to a production system.

Call for Code Global Challenge, in its third year, focused on both Climate Change and Covid-19. Over 6,500 participants collaborated to create innovations based on open source technologies.

During the UK Labs Call for Code challenge in April, myself and colleagues, Sean Tracey, and Glynn Bird started to develop Choirless. This musical collaboration platform can help choirs sing together even when they are apart. Each singer's contributed videos are automatically synchronized and stitched together into a video wall with no special equipment or costly editing software. Beyond the pandemic, Choirless has the potential to allow for ongoing musical collaboration without borders.

The main public Call for Code challenge has a grand prize of $200,000. As IBM employees, myself and my teammates are part of the parallel, internal, IBMer challenge for call for code. Same rules, same goals... but alas we don't get a stab at the $200,000 prize. There is a prize, but it is much more modest. But we are still aiming for it!

So far, we have had close to 100 choirs and bands register interest in beta testing the software. From churches, to barbershop choirs, to a 250-piece marching band. There is even an internal IBM team in Canada using Choirless to produce a song for another competition locally.

We will find out the final winner at the winner reveal on the 15th September. It is an internal IBM screening, but don't worry, I'll be reporting out the results here afterwards!

You can read more about Choirless here:

https://medium.com/callforcode/choirless-syncs-alonetogether-musicians-4fe68f04352e

https://mashable.com/ad/feature/in-times-of-crisis-innovations-skyrocket-2020-call-for-code/

So seems I missed a weeknote again. Mea culpa. Not quite sure why. But I've been pretty busy working on Choirless this past week and working from home sometimes seems weeks run into each other. Today is a bank holiday Monday in the UK, and so we have a 4 day week this week. No doubt that is going to throw me even more for the rest of the week.

Workshops

Last week I ran my first online workshop. On Generative Adversarial Networks. The workshop went very well, even though I was up until about 1am the night before trying to get it all working. The problem was I'd picked a fairly hard task. These are interactive workshops in which people can follow along with me live. When done in person we'd have someone wandering around the room helping people. When doing them online we don't have that same interaction. But we do a fairly good approximation of it with having fellow Developer Advocates from our team on the chat to help people out.

The hard part was that machine learning by its very nature can take a long time to run. To train a neural network to learn how to colour a black and white image, you need to run thousands of images past it to learn from. This can take hours or days depending on the size of the images. I wanted to get this down to being able to run in under 10 minutes. So I had to make the images quite small, and make the neural network a bit less complex, so there was less processing time involved. I was working on it right up until the wire, but got it in. Which was a very rewarding feeling. The workshop went great and I had a lot of good discussion on the chat towards the end.

Streaming

I did my usual Twitch streaming session this week on writing an IBM Cloud Function to process audio. Yes, as you might have guessed, this was related to something I needed to do with Choirless. I've written a blog post before on how to pass raw data to an Openwhisk actions. So this was building on that in a more practical sense. It was also showing how to use a custom docker image with IBM Cloud Functions, again something I've covered before... but this was putting it all together. I'm a bit behind in some of the write-ups of the sessions and see I've got a number of videos and blog posts still in draft status. I'll need to get on top of that this week.

IBM Developer Europe Crowdcast

Based on the work I've been doing streaming on Twitch, I've been tasked with curating/organising/producing a Europe-wide IBM Developer Crowdcast channel. We have license for 40 hours a week of broadcast, and we've got 6 developer advocacy teams across Europe. Crowdcast has been used for a while in the US, but only recently have we been given the go-ahead to use it here in the EU (likely a GDPR thing?).

So it will be my job to try and curate/cajole the various developer advocacy teams IBM have across the EU to broadcast their workshops on this Crowdcast channel. The idea is likely that we will have regular days of the week for different topics, e.g. Mondays might be data science, and Tuesdays might be containerisation.

So I'm pretty excited about this... stay tuned!

Choirless

This week with Choirless I've been working on improving the synchronisation algorithm. When all the audio parts are uploaded, there is an algorithm that runs to try to calculate how far behind a contributed piece is from the reference audio. The delay is generally caused by their web browser and computer and even when we think we are recording in time, it can still be delayed. so this algorithm attempts to “look” at the audio and figure match two pieces up. As an example below are two audio waveforms overlaid on each other:

In one (the red piece) the person doesn't start singing until part way into the song. But we need to somehow get those parts in sync. To do this, I am looking at the top peaks and plotting them in such a way I can try and get an algorithm to shift them back and forth until we find the best fit.

From the data above I can calculate an 'error' value for how close they match, then moving back and forth can try and find the minimum error. On the chart below we can see that the minimum would be if the part were shifted about -50 milliseconds.

Anyway. It wasn't working. And people were appearing out of time. It took quite a lot of trial and error to find just the right amount of data to be looking at, and how to process the peaks to get an accurate value. But I got there in the end.

I wrote a bit of an emotional post the other day about how I suddenly felt with Choirless and watching, in particular, one of the performances (above) grow. And how underneath all the tech, this is enabling humans to tell stories. This was the whole point of Choirless in the first place. But I guess just hit me that it is actually happening.

New Personal Website

I love blogging here on Coil, and on DEV.to, but I also like to have content on a site I control. Partly for personal branding reasons, and partly just in case one of these sites go away. My personal site has been around quite a few years, but it looking pretty dated. I want something that looks a bit fresher, and also gives more of an overview of all my posts. So I started working on something using bootstrap and masonry to arrange a set of 'cards' of each post on the screen.

There are so many very complex CSS/JS frameworks out there, and I was after something pretty simple. I'd seen an interesting looking one called Tailwind. But the installation instructions made my head spin. Maybe I'm just too used to old-skool HTML and CSS, but the thought of having to install so much gubbins just put me right off. So anyway, I'm working on the new site, and have the general layout and design working.

I need to plumb it in to the static site generator I use, Pelican. I also need to resurrect my scripts for sucking blog posts from Coil to display on there, and also create some for sucking content down from DEV.to. Ideally I want single source of content to push out to each blog, but I doubt that will happen, as they just have too many idiosyncrasies.

Home Life

Things are ticking along in life generally. My wife's knee dislocated again this week (ongoing condition) so she has been even more immobile than usual. My 9 y/o daughter goes back to school this Thursday and is extremely anxious about it. She has been wandering around the house muttering about how useless Boris Johnson is. No idea where she got that from.

I've been doing some more cooking, and made a favourite dish of mine from Singapore called Hainanese Chicken Rice. It is quite a simple dish but the make or break is in the prep of the chicken. So I've was exfoliating the chicken with sea salt and then giving it an ice bath after cooking! But it came out amazingly.

I also made a regular dish I make, Korean Fried Chicken. Which I've now got the process pretty practised and can knock up a batch of it in about half an hour. I've always now got a pot of Gochujang, Korean chilli paste, in the fridge ready.

Tonight, I took a punt on making something that caught my eye: Guinness & Honey Glazed Pork Loin. I thought it came out pretty well, but neither of the kids in the house would eat it and my wife ended up throwing up afterwards. So maybe not to all tastes. To be fair my wife has a very delicate stomach and can't take things that sweet. This was coated in a very sweet sauce that I think upset her stomach. Oh well. You can't win them all!

This morning, I confess, I was brought to tears. I was overcome with emotion. You may know I've been working on a side project called Choirless with some colleagues at IBM. This has been a project as part of Call for Code, a competition for ideas for solutions to some of the big problems in the world. The past few years is has been related to climate change, but this year they included a COVID-19 track. So we started Choirless as a project to help deal with lockdown and isolation. To allow choirs and bands to sing and perform even when remote. More on the background of Choirless can be found in the video submission we did for the competition.

So what happened this morning?

Rewind a bit, we were contacted by an IBMer in Canada, Darryl, asking to test out Choirless. So we invited him onto the platform to have a play. He recorded a whole bunch of parts on various instruments and him singing. I will confess, it didn't come out well. It was a mess. The system couldn't synchronise his parts, the volumes were all over the place. There were too many instruments, and Darryl's first attempts were as you'd expect for someone's first attempts at using a (in development) tool. But he persisted and kept recording, re-recording, playing about with it.

We got some great feedback from him, and we have been working together since. He simplified and refined his pieces. And then sent out an email that, as far as I'm aware, went out to every IBM employee in Canada to join in! I will say, I was pretty anxious. We were (are!) still working on Choirless, and it still had a lot of rough edges. And whilst we had got it to work on a few tests, this was a whole new group of people... not having been a part of Call for Code, and arriving with fresh expectations.

The first few contributions we got. Again, were enthusiastic, but often missed the beat. They were certainly stressing our system's ability to automatically synchronize people in time. That was mainly my responsibility. That was my algorithm, and one of the main raison d'êtres of Choirless. If it was failing here, how would it cope with a flood of more people coming in?!

Bit by bit we tweaked the system. Darryl and his colleagues have been fantastic at finding new ways to break the system. This is a good thing! This is why you want diversity in development team and testers. As different people will naturally use things in a different way, and break them in a different way. As an example, Darryl had encouraged people to participate even if they didn't want to sing... they could hold up signs with words on. People held up lyrics translated into their mother tongues, or stories about how they came to be in Canada. We had always assumed people would be singing, or playing. How do we synchronise the audio if there is no audio? The rendering pipeline failed when it encountered an uploaded video that has no audio as it was assumed there always would be audio (it's a tool for singers and musicians, right?!).

Another example, Choirless attempts to normalise the audio of each part to a 'standard' level first before merging it. This is to account for everyone having different setups, and some people being close to their microphone, some further away. But what if you are silent apart from the sound of rustling of paper you have written signs on? Well our system decides that that rustling is pretty quiet and should be made REALLY LOUD. Yeah. Oops. So we are having to build in what is called a 'gate' to lower the volume of background noises.

So why the emotional bit this morning? I woke up and hit reload on the screen with the latest rendering on it. And there were suddenly a bunch more people. This thing is growing. There were families with kids dancing, there were different instruments, there were people from different places, there were people's living rooms, studies, gardens. There was a woman there holding a series of signs saying :

Hello, my name is Dorje. I am from Bhutan. And I've made a second home for myself in Canada. I travel 6,570 miles each year to see my family in Bhutan. Unfortunately not this year! I only see this as an OPPORTUNITY. How? 1) Opportunity to show your responsibility as a human 2) To prioritize health 3) Most important it has taught me to value people. And this is me! :)

That was it... I broke down in tears. I've been focussing recently so much on the tech behind this. But the whole point of Choirless is to allow people to come together at this time. To sing. To play music...

And to tell stories.

That was something I'd missed completely. Stories. Allowing people to express themselves however they want. Sing. Play. Hold signs.

What I was looking at this morning, was not code. It was not serverless functions, and algorithms. It was not all the hard work that my teammates Sean and Glynn have been putting in. It was creativity. It was people using a tool how they wanted. Regardless of what my original (limited) ideas of how it would be used. The most amazing feeling in the world and why I love building things.

And it was beautiful.

https://cinnamon.video/watch?v=396868115322898134

Thank you to everyone who has contributed. Thank you to Darryl for organising it, and giving us such fantastic feedback as we developed it.

And the best bit.

Tomorrow I will reload the page and there will be even more :)

Yesterday I gave a interactive workshop on Generative Adversarial Networks. These are a type of neural network that are used to generate new information that did not previously exist. They have been used from everything from creating photos of people that don't exist, to predicting stock prices.

One area that has been shown quite a lot recently is using GANs to automatically colour in black and white images. Such as using tools like DeOldify.

But how do they work? In this workshop I explain the basics of how GANs work, and the components that make up a GAN. I also walk through the code of a simple GAN built using PyTorch.

The full video of the workshop is below:

Or you can follow along in the interactive Python notebook available in the IBM Developer UK Github repository:

https://github.com/IBMDeveloperUK/Colourise-GAN-Workshop

If you want to have a go at running the GAN yourself the instructions are there in the readme file on how to get started with IBM Watson Studio and running the code.

You will need a free IBM Cloud account, which you can sign up for here.

If you want to stay in touch with our series of free events (wherever you are in the world right now), then join up to our meetup group:

https://www.meetup.com/IBM-Code-Bristol/

Bit late with last week's weeknote as I was off camping for a few days with my daughter. It was great to get away just the two of us and the dog. The first two days were baking hot, so we spent most of the time by the pool and sunbathing. Then some massive storms came past, just missed us during the day, but there was some very heavy rain overnight. I love the sound of the rain on the roof of the van.

We watched Hamilton one evening. I've been wanting to watch this for a while, but just not had time. Sarah has watched it about 15 times now and is pretty obsessed with it. We watched it in the van on an iPad with a bag of popcorn and the sun going down behind us... was fantastic :)

On the way back, the original plan was to take a detour home via Hursley (IBM's headquarters here in the UK) and meet up with some colleauges for a socially distant picnic. But the traffic was so bad onthe way back I had to abort and head straight home. Shame as would have been good to see them. Some of which I've still not met face to face as I started this role two weeks before lockdown!

Work-wise things have been busy, I've been working on Choirless for a lot of the time. The response we are getting is amazing. I had a meeting yesterday with my boss' boss, Johanna, who is the parent of a school marching band student. She has introduced me to the president of their marching band and we are hoping to use Choirless for a mass virtual marching band performance. I've tested the scalability up to 308 parts, but we might be going double that as they want to also collaborate with several other bands in the vicinity.

We also had a meeting today with some people in IBM Developer Marketing who interviewed us all about doing a piece. Actually whilst I was camping, I did a video interview from my van with some other people in a different marketing division who are producing a video about some of the Call for Code entries. And tomorrow we have a meeting with some people interesting in a potential collaboration with the Soweto Gospel Choir for a piece to show during the Call for Code awards next month. Oh, and someone else wants to do a Choirless session during an IBM conference next month. So not only will we be talking about the development of it and how we scaled it with IBM Cloud, but we will also be recording a live performance with the conference delegates (as they will be attending remotely still) in a break in the conference.

We've been working closely with an IBMer in Canada who has composed his own song about 2020 and lockdown and performed the vocals and guitar of that and now looking to get others involved in the performance too. He has been fantastic at finding little bugs and edge cases in the system.

So uh... yeah... so much Choirless!

Besides that I did a live stream Twitch session today on Tensorflow.js and loading a model trained in Python into the browser and getting it to detect handwritten digits from the webcam.

This was a pretty tense one, as up until 5 minutes before the stream it didn't appear to be working at all. Then during the stream I managed to refine it and get it to recognise the digits. I needed to draw them a bit thicker on the cards, and also increase the contrast before passing the image to the neural network.

On Thursday I am doing a workshop on Generative Adversarial Networks and going to teach people how to train a neural network to colour black and white images. Should be interesting, although the challenge is going to be to get it to work in the timeframe available. Sometimes these neural networks can take hours to train, and I'd like to do something small enough that everyone can have a go at.

I also spent some of this weekend updating an old server I have and getting backups working properly on it, but I'll post about that separately.

Anyway... enough rambling... stay safe all!

Header image: “Blackberry Caipirinha”, made with fresh picked blackberries from the woods by my house

The week has seemed a bit slow. Not sure why. I think maybe the heat (it has ben very warm here in the UK) or possibly because I've been spending quite a lot of late nights working on Choirless.

But looking back I have managed a number of things:

1) I took part in a panel discussion on students getting started in open source software. This I really enjoyed. I used to lecture at the University of Bristol periodically on this very topic, so was great to talk about it again after what seems like ages.

The impressive thing was the event was organised by students. The lead organiser is only 16 years old, and was meant to be doing her school exams this year if not for Covid.

A recording of the discussion is here:

https://us02web.zoom.us/rec/play/vJF7Ie_9_TM3ToGU5QSDU_V_W9S1J6ushHUY_PUPyRm3AnYKMFWkY7ZBZOaPie3JIVwXTAaBDRHSU2-t

2) I did a talk on a weekly show called Thursdays Matter about Generative Adversarial networks:

https://coil.com/p/hammertoe/Ceci-n-est-pas-un-canard-Machine-Learning-and-Generative-Adversarial-Networks/wiVIJQwzO

3) I did my regular weekly live stream on using Tensorflow.js to do machine learning predictions in the browser. The idea was to get the “smile detector” neural network I've trained previously running locally and taking images from my webcam. I didn't quite get that far, but did get the basic object recognition going. I've not published the video on this yet, so need to do that next week.

4) I've been working on the scalability of Choirless' rendering engine. This has been a lot of later night work, but been very rewarding. The biggest test so far is rendering 308 videos of bagpipes in a mere minutes:

I also delved into MQTT as a means to have the serverless functions publish timing stats, which I could then pull into a python notebook to chart:

A full write-up of this scalability work is on Dev:

https://dev.to/hammertoe/further-scaling-the-choirless-render-pipeline-514a

5) Alas I did not get enough time to finish up working on the idea I had with a colleague for an entry to the PayID hackathon. We were working on something to allow Github users to be paid in XRP whenever they made a commit, but didn't have time to wrap it up for the hackathon. Which is a shame, as I think it could have done quite well. A video of the original work we did and a writeup of it is on Dev:

https://dev.to/hammertoe/payid-hackathon-live-coding-monetizing-github-commits-585f

6) I did a submission to the “pancake challenge” on Cinnamon. Alas it was a 'fail' video, as I cooked bacon and eggs first and then didn't clean the pan properly before cooking the pancakes, so they stuck to the pan and got destroyed in coming out. Still tasted good though:

So, looking back at all that, maybe I've done more than I gave myself credit for this week.

I'm off camping with my 9 year old daughter for 3 nights this week. Will be heading of straight after my live stream. She is so excited to be going, which is great, as she's had a bit of a roller coaster emotionally the past few weeks. She has been heavily involved in a group online involved in musical theatre, but as with any group of kids that age, it has its dramas.

Recently I've been binge watching “Narcos”, a drama series about Pablo Escobar and the Colombian drug cartels. Then from there onto “Narcos Mexico” about the Mexican drugs trade. They have been interesting as they are based on real life events and people, but obviously with an amount of dramatisation. So the same characters pop up in each series. And from there I am now on to “El Chapo”. Which again has many of the same characters, but played by different actors. My brain is having a hard time getting around that the Miguel Ángel Félix Gallardo in El Chapo is the same as the Miguel Ángel Félix Gallardo in Narcos: Mexico... despite being played by a totally different actor with a very different look to them.

Next week, after the camping, I'm due to be meeting up with some of my colleagues for a (socially distanced) picnic at Hursley House (IBM's main office in the UK). We've not met in person now for three months, so will be great to see them... although we've been working great remotely. As for what we've all been up to, see the video below.

Read more...

This week I gave a talk on Generative Adversarial Networks (GANs) to the Thursdays Matter skillscast group. A link to the recording of the talk is below.

https://skillsmatter.com/skillscasts/14837-ceci-n-est-pas-un-canard-machine-learning-and-generative-adversarial-networks

The slides from my talk are available on Slideshare:

I've written about GANs a few times in the past on here, so if you've read some of my previous stuff you might be familiar with it.

GANs use two competing neural networks to try and “outfox” each other. One network (the generator) tries to learn to make “fake” versions of the data, and the other one (the discriminator) tries to learn to distinguish the real ones from the fake ones. Both networks iteratively learn from each other. The idea being, the less able the discriminator is to tell the difference between “real” and “fake” then the better the generator is at producing fake versions of the data.

Fawkes – GANs vs GANs

In this talk I also talk about a technique being developed at the University of Chicago for “cloaking” images, called Fawkes.

The idea of Fawkes is to combat facial recognitions systems being deployed more and more in our society. The idea is to “poison” images being put out by people on social media in such a way to prevent machine learning algorithms being able to get a “lock” on them. A bit like digital “Dazzle” camouflage used on ships in the war.

The way facial recognition systems work are to try and detect “features” of someone's face such that it can group them in such a way it can determine a decision boundary between them.

In the slide above (source) you can see in the original images on the left, that an algorithm has managed to group four subjects in such a way it can draw a clear boundary between them all. Fawkes attempts to subtely modify images such that they appear to the algorithm to be somewhere else in the decision space. In the example above on the right, the algorithm is unable to distinguish between Emily and Beyoncé.

The idea is that if you ran all the images of yourself posted online to social media and the likes through Fawkes that a facial recognition system would have a harder time learning your likeness.

Upscaling video

Another example I gave was using GANs to learn to interpolate data on images and video. Given a series of images that have been reduced from colour to monochrome, a GAN can learn how to produce convincing “fake” colour images. This has been used quite effectively to colour, upscale, and smooth old film footage. e.g.:

It is now Week 31. When I started writing weeknotes I made a promise to myself that I would write one once a week. The last was Weeknote 2020-19. So that means I've missed 12 weeks. Why? Well... Lockdown happened, and COVID-19 and I missed one week... then had so much to write, I couldn't fit it all in next week... then the week after I had even more to catch up on... and so on.

Today is my birthday! Yay! Happy Birthday me! And I'm feeling pretty happy right now. No, really, really quite happy. Although things have been a bit strange in the world, today has been a really really good day. And an old friend of mine just tweeted about me inspiring him to write weeknotes for his new job. I thought “OK, that is inspiration for me to start again!” at the same time, he said exact the same thing:

So what has happened in the past 12 weeks? Well we have been transitioning everything online as we (as much of the world) are working remotely now. In fact, I never really noticed it, but as Matthew Wilkes says in the thread above, maybe it was the lack of commute that stopped me writing? When I started this new role four months ago, I was going to be doing a weekly trip to London by train. I planned to use the train journey as time to reflect on the week and write my weeknote. No travel = no commute = no train = no weeknotes.

I have still been writing though, I've been blogging and recording videos about what I've been up to. My original plan was to try and produce one piece of content a day. That hasn't quite happened, but I've been fairly close. My idea was, say, Tuesday I'd to a live stream on Twitch, Wednesday I'd publish the video of the stream, Thursday I'd write up a blog post about it. I've not quite hit my target, but the goal is still there.

Call for Code

One of the main things that has been driving me these past 12 weeks has been a competition called Call for Code. I've written about Choirless a number of times, and been documenting how things have been going:

This project has been amazing fun. I've been working with two fantastic colleagues, Sean and Glynn and learned so much along the way.

We won the UK Labs preliminary competition, and now waiting to hear the result of the global competition. I think we hear in September.

The project seems to be capturing people's imagination both within IBM and beyond. We have launched a limited public beta, and getting multiple enquiries per day for people wanting to use it. I have recently been testing the scalability of it to see if it will scale to the level of dealing with a 120-member marching band!

Organisation / Productivity

I built a thing. It seems to be working well so far.

Hackathons

I have participate in a couple of hackathons in this time too. Mostly around one of my passions, online payments. May sound dull, but we can move information around the globe in milliseconds, but we can't do the same for payments and value.

For the DEV.to / Grant for the Web hackathon I created a tool called Joyful Tweets that analyse tweets in your timeline and just show you the “joyful” ones. This was a lot of fun, and gave me a chance to play around with various IBM services, such as Watson Tone Analyzer and Cloud Foundry.

I have also started work on another hackathon, around PayIDs. The deadline for this is in about 4 days time, so I need to get cracking on this. I'm working on this in conjunction with a colleague Si Metson. As the person responsible for me applying for a job at IBM, and being my manager for a while it is great to be working with Si again now.

I has worked well having Si on the stream, and there is a good banter between us and the people in the Twitch chat channel. It is like taking pair programming to a further level. It worked surprisingly well using Skype between us, VSCode's remote sessions, and OBS to broadcast it live.

I have also been named on a proposal submitted by Si above to Grant for the Web around a project to enable electronic music producers to more easily monetize their content. We will hopefully hear soon if the idea gets funding.

The weekly Twitch stream live coding sessions have been going really well. I am streaming every Tuesday at 2pm BST on the IBM Developer Twitch channel.

This has all been feeding in to a strategy I've been working on regarding Developer Advocacy in that I am using real events (e.g. hackathons) to draw topics and materials for the live stream Twitch sessions. Then publishing the videos in multiple places, and writing up the videos as well. I was asked recently for some stats on my Twitch streams for a managers meeting. These are two of the slides I came up with:

I was told today that the information went down very well on the meeting and was met with a round of applause!

Birthday

So as I said at the start today is my birthday. I've not done much for my birthdays the last few years. And of course this year many things are on hold. But it has been an fantastic day.

I had a really productive day working on some of the stuff for Choirless, which involved re-architecting our rendering pipeline on IBM Cloud Functions to be more parallel. Also taking advantage of some new filters in the latest ffmpeg 4.3.1. I spent quite a bit of time getting that version in a Docker image to use, but got there in the end. I also spent some time on the ffmpeg filter code. It is actually really nice code, and I can see myself writing a custom filter for ffmpeg at some point.

Then I got the news of the above Twitch stream information being very well received by the management team, which was a great feeling. Also, my colleagues on the UK & Ireland team did a birthday video for me. I was really touched. Especially by their kind words on how it's been working with me. The feeling is mutual. I've learned so much in the past four months. I can't believe it has only been four months. Feels like forever... in a good way!

I had an awesome birthday present from XRP The Standard Productions... a satire piece on myself an my trading bots!

Then I finished the day off with a cycle to the supermarket to grab some steaks and came back and had a BBQ. A few beers sat out in the evening sun with the dog, some nice Malbec with the steaks (I even made a Bearnaise sauce, first time... was delicious). And now a nice single malt.

Life is good :)

Header photo by Adi Goldstein on Unsplash