<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Sparks - Latest Comments</title><link>http://michaelsparksblog.disqus.com/</link><description></description><atom:link href="https://michaelsparksblog.disqus.com/comments.rss" rel="self"></atom:link><language>en</language><lastBuildDate>Fri, 18 Jul 2025 19:15:08 -0000</lastBuildDate><item><title>Re: Coroutines 5: Performance of C++03, C++20 and Python generators</title><link>http://www.sparkslabs.com/blog/posts/coroutines-5-benchmarking-cpp03-cpp20-python-generators.html#comment-6739656209</link><description>&lt;p&gt;Regarding the C++20 version,  as mentioned in all the posts, the code (+Makefile) for all the posts is here:&lt;/p&gt;&lt;p&gt;*  &lt;a href="https://github.com/sparkslabs/blog-extras" rel="nofollow noopener" target="_blank" title="https://github.com/sparkslabs/blog-extras"&gt;https://github.com/sparkslabs/blog-extras&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The specific branch for testing with -O3 is in this branch :&lt;br&gt;*  &lt;a href="https://github.com/sparkslabs/blog-extras/tree/o3_coroutine_tests" rel="nofollow noopener" target="_blank" title="https://github.com/sparkslabs/blog-extras/tree/o3_coroutine_tests"&gt;https://github.com/sparkslabs/blog-extras/tree/o3_coroutine_tests&lt;/a&gt;&lt;/p&gt;&lt;p&gt;And as mentioned in my comment, the delta between the two is here:&lt;/p&gt;&lt;p&gt;*  &lt;a href="https://github.com/sparkslabs/blog-extras/compare/main...o3_coroutine_tests" rel="nofollow noopener" target="_blank" title="https://github.com/sparkslabs/blog-extras/compare/main...o3_coroutine_tests"&gt;https://github.com/sparkslabs/blog-extras/compare/main...o3_coroutine_tests&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Bear in mind the delta is in 5-bench-cpp03coroutine.cpp&lt;/p&gt;&lt;p&gt;As for not doing the 22 iterations (or not) in the C++03 version, feel free to take a look.&lt;/p&gt;&lt;p&gt;However, I've done some cursory checks by creating a new branch and updating the benchmarking version  ...&lt;/p&gt;&lt;p&gt; &lt;a href="https://github.com/sparkslabs/blog-extras/blob/o3_coroutine_tests_rolling/by-date/2023/Coroutines/0/5-bench-cpp03coroutine.cpp" rel="nofollow noopener" target="_blank" title="https://github.com/sparkslabs/blog-extras/blob/o3_coroutine_tests_rolling/by-date/2023/Coroutines/0/5-bench-cpp03coroutine.cpp"&gt;https://github.com/sparkslabs/blog-extras/blob/o3_coroutine_tests_rolling/by-date/2023/Coroutines/0/5-bench-cpp03coroutine.cpp&lt;/a&gt;&lt;/p&gt;&lt;p&gt;... to check intemediate values, inject the number of iterations from outside, and keep the generated intermediate assembly  (&lt;b&gt;-fverbose-asm -save-temps -v&lt;/b&gt;), and keep count of the number of values created. It's butt-ugly, but it does seem to force the values to be generated. (However, I don't think it's preserved the original intended approach - which makes the benchmark moot)&lt;/p&gt;&lt;p&gt;You can see the specific changes here:&lt;/p&gt;&lt;p&gt;*  &lt;a href="https://github.com/sparkslabs/blog-extras/commit/e2ae338e231986add69e4bb489808d5737edaa45" rel="nofollow noopener" target="_blank" title="https://github.com/sparkslabs/blog-extras/commit/e2ae338e231986add69e4bb489808d5737edaa45"&gt;https://github.com/sparkslabs/blog-extras/commit/e2ae338e231986add69e4bb489808d5737edaa45&lt;/a&gt;&lt;/p&gt;&lt;p&gt;That's triggered by a new target: &lt;b&gt;make bench-cpp03coroutine.s&lt;/b&gt;&lt;/p&gt;&lt;p&gt;For convenience I pass that through nl (line numbering). I've added the result of that to the branch as well - which you can see here:&lt;/p&gt;&lt;p&gt; &lt;a href="https://github.com/sparkslabs/blog-extras/blob/o3_coroutine_tests_rolling/by-date/2023/Coroutines/0/nl-bench-cpp03coroutine-5-bench-cpp03coroutine.s" rel="nofollow noopener" target="_blank" title="https://github.com/sparkslabs/blog-extras/blob/o3_coroutine_tests_rolling/by-date/2023/Coroutines/0/nl-bench-cpp03coroutine-5-bench-cpp03coroutine.s"&gt;https://github.com/sparkslabs/blog-extras/blob/o3_coroutine_tests_rolling/by-date/2023/Coroutines/0/nl-bench-cpp03coroutine-5-bench-cpp03coroutine.s&lt;/a&gt;&lt;/p&gt;&lt;p&gt;As you can see from the cpp file, this throws in a switch statement to check intermediate values (which actually sped things up), and then incrementing a counter based on that (which appears to have prevented optimisation - which makes sense), and then eventually injecting the number of loop iterations.&lt;/p&gt;&lt;p&gt;The final result there is 35s on the wall clock, with 23,000,000,000 values generated - which is about 1.5ns per value, unless I'm losing it.&lt;/p&gt;&lt;p&gt;Also, but bear in mind the code now has extra overhead of checking a variable iterlimit rather than a fixed value of 22, has to do an extra work. (the switch statement will itself obvious be optimised so I'd assume this would still be a low overhead) then a comparison for the correct running value and finally increment a counter.&lt;/p&gt;&lt;p&gt;... and still I think after the optimisation flags are enabled it ceases being a useful benchmark of coroutine overheads - just a benchmark of how well the optimiser works, since the resulting code differs &lt;i&gt;significantly&lt;/i&gt; from the sort of code I'd use these sort of generators for in python. (eg --  &lt;a href="https://github.com/sparkslabs/guild/blob/master/examples/blog/miniguild/media.py" rel="nofollow noopener" target="_blank" title="https://github.com/sparkslabs/guild/blob/master/examples/blog/miniguild/media.py"&gt;https://github.com/sparkslabs/guild/blob/master/examples/blog/miniguild/media.py&lt;/a&gt;  )&lt;/p&gt;&lt;p&gt;ie I tend to use these sorts of things for managing concurrency, not for performance - since it tends to make the code clearer IMO.&lt;/p&gt;&lt;p&gt;Also, FWIW, this sort of thing is the reason why I &lt;b&gt;didn't&lt;/b&gt; use any optimisation flags in my benchmarking, because I didn't want to have to guess if my code wasn't be changed beneath me . (Which I knew any self respecting optimiser would :-) ) After all, the optimiser has no way of knowing what I'm trying to measure and just tries to keep the calculations correct, whereas I was more interested in benchmarking the &lt;i&gt;how.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;After all I wasn't after "how fast does this go" - I was after "how fast is 'this' relative to 'that' and to 'the other' and for that you want to ensure that you don't optimise out the thing you want to test.&lt;/p&gt;&lt;p&gt;After all, as I said, I wanted to get an idea of the naive difference between C++20 and python, and only looked at my ancient C++03 based code from over 20 years ago as an afterthought.  The fact it outperformed the C++20 code by such a wide margin with no optimisations enabled surprised me, which led to more investigation.&lt;/p&gt;&lt;p&gt;Anyhow, glad you've found this interesting - the only place I've used this particular C++03 iteration form is in my python to C++ compiler to replace one of the standard python iterators range() with direct equivalent in the generated C++ code. The reason &lt;i&gt;&lt;b&gt;that&lt;/b&gt;&lt;/i&gt; uses C++03 form rather than C++20 coroutines was because that code was written around 10 years ago - predating C++20 coroutines. (So again, the point there, was readability, not performance)&lt;/p&gt;&lt;p&gt;All that said, I think, if anything, this conversation has led me right back to the original conclusion:&lt;/p&gt;&lt;p&gt;* Python is &lt;i&gt;obviously and unsurprisingly&lt;/i&gt; slowest.&lt;br&gt;* C++20 is second slowest for this sort of thing, somewhat surprisingly.&lt;br&gt;* Sometimes hidiously naive C++03 code can work out surprising well :-) (&lt;b&gt;However,&lt;/b&gt; I'd only transform code to that form if I really needed the performance that would come with it, because that form wouldn't be obvious to most people and more awkward to debug. )&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Michael Sparks</dc:creator><pubDate>Fri, 18 Jul 2025 19:15:08 -0000</pubDate></item><item><title>Re: Coroutines 5: Performance of C++03, C++20 and Python generators</title><link>http://www.sparkslabs.com/blog/posts/coroutines-5-benchmarking-cpp03-cpp20-python-generators.html#comment-6738997433</link><description>&lt;p&gt;I see that you found the bug in the C++03. I suspected as much and had replaced the macros with actual code and had initialized &lt;code&gt;__generator_state&lt;/code&gt; to 0 and noticed it gave me the correct answer after that. I guess the optimizer saw it could be any value, so why not initialize it with a value that would make it skip some code! :D &lt;br&gt;Can you show me your C++20 version? I am getting way much faster result than you. I will have to push your new code to godbolt to see what the generated assembly does. I suspect it is not doing the 22 iterations of the loop because 0.9ns/iteration is too fast to do what has to be done. I suspect it may unroll the inner loop fully and simplify the operations, even pre-computing the result.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Michel</dc:creator><pubDate>Thu, 17 Jul 2025 13:43:26 -0000</pubDate></item><item><title>Re: Coroutines 5: Performance of C++03, C++20 and Python generators</title><link>http://www.sparkslabs.com/blog/posts/coroutines-5-benchmarking-cpp03-cpp20-python-generators.html#comment-6738804578</link><description>&lt;p&gt;Hi Michel,&lt;/p&gt;&lt;p&gt;Thanks for the feedback.&lt;/p&gt;&lt;p&gt;FWIW, when I wrote this set of notes a couple of years ago, I was mainly curious about how C++20 coroutines hang together in comparision to python ones. The comparison to C++03 was an afterthought initially and then something I thought worth capturing in the blog when the results presented turned out. Indeed, I'd been playing with C++20 coroutines on my break on and off for a couple of weeks before thinking about adding them. TBH, I didn't expect the C++03 coroutines to still work when I first tried them.&lt;/p&gt;&lt;p&gt;I deliberately &lt;i&gt;didn't&lt;/i&gt; switch on optimisations when doing this because I didn't want to see how well the compiler would throw everything away :-) (I realise it'll do some trivial things even with -o0 but that was deliberately picked to switch almost everything off)&lt;/p&gt;&lt;p&gt;I found it interesting that under o3 optimisation the C++03 operates differently. Since the  occurs with -O1, -O2,  -Os as well, but not -O0, I assumed it was to do with initialisation of the generator, based on it using the trick of using __LINE__. Forcing that to be initialised to zero fixes that issue - so there was a latent bug there.&lt;/p&gt;&lt;p&gt;A quick search shows that HALO optimisation only happens with -o3&lt;/p&gt;&lt;p&gt;Also, you're right though - g++ versions do matter. The version I was using back in 2023, was the version that shipped with ubuntu 22.04.02LTS. The support then wasn't great, and people were talking about C++23, but it wasn't fixed at that point.&lt;/p&gt;&lt;p&gt;These days I'm using ubuntu 24.04.02LTS, and the g++ version that uses is 13.3.0&lt;/p&gt;&lt;p&gt;Re-running both benchmarks with -O3 in that version results in C++03 version exitting almost immediately, so as expected that optimised out all the code AFAICT.  (Though interestingly performs correctly when actually used, so that probably just needs a minor tweak)&lt;/p&gt;&lt;p&gt;Rerunning the C++20 version with -03 results in that finishing in 136.6s on my laptop vs 1531.6s with -O0 - which is quite the hefty increase in performance, and nice to see. (-Os doesn't get that result) (Just a touch over 6ns/iteration) &lt;b&gt;However, &lt;/b&gt;see below...&lt;/p&gt;&lt;p&gt;I think the easiest way to fix the problem with the -O3 build of the C++03 version and to ensure that the C++20 version isn't cheating &lt;i&gt;as well &lt;/i&gt;might be to simply take the final value from the generator, and check that it's correct and increment a counter. (Thought that could still be gamed)&lt;/p&gt;&lt;p&gt;.. so I've just tried this - cf:  &lt;a href="https://github.com/sparkslabs/blog-extras/compare/main...o3_coroutine_tests" rel="nofollow noopener" target="_blank" title="https://github.com/sparkslabs/blog-extras/compare/main...o3_coroutine_tests"&gt;https://github.com/sparkslabs/blog-extras/compare/main...o3_coroutine_tests&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The C++03 version, with the minor initialisation correction, and the check on final returned value now takes 20s overall on wall clock on my machine -- about 0.9ns/iteration. (this is compared with 253s wallclock for -O0)&lt;/p&gt;&lt;p&gt;The C++20 version with -03 and the check on final returned value ? 338s. (vs 1531s wallclock for -O0 on current machine)&lt;/p&gt;&lt;p&gt;So, I think the key result is still true:&lt;/p&gt;&lt;p&gt;* Python is still slowest - which isn't unexpected at all.&lt;br&gt;* C++20 on -O3 is &lt;i&gt;almost&lt;/i&gt; as good as C++03 without optimisation, which is useful to know since that's "avoids a rewrite" territory.&lt;br&gt;* However for C++03 and C++20 with -O3 ? My old, naive, relatively weird C++03 code beats C++20 by over a factor 16 which surprises me even more than before. (Caveat, I'd hope C++23 stdlib generators to perform better)&lt;/p&gt;&lt;p&gt;I don't view these results as particularly scientific BTW, just interesting ballparks. (I'd want to really run these on a machine which isn't running any other loads/etc if I cared to do the benchmarks "properly" :) )&lt;/p&gt;&lt;p&gt;Again, thanks for the feedback, hope you found it interesting :-)&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Michael Sparks</dc:creator><pubDate>Thu, 17 Jul 2025 07:21:46 -0000</pubDate></item><item><title>Re: Coroutines 5: Performance of C++03, C++20 and Python generators</title><link>http://www.sparkslabs.com/blog/posts/coroutines-5-benchmarking-cpp03-cpp20-python-generators.html#comment-6738413233</link><description>&lt;p&gt;You should try your benchmarks again. With g++15 with full optimization, on my machine, the C++20 version takes 1 minute and 3s.&lt;br&gt;Be careful that because you do not use any of the computed numbers, the optimizer will reduce your code to an empty one. It can also understand what the inner loop computes and shunts it out. You have to change the loop limit so that the compiler cannot cheat.&lt;br&gt;There is however something very strange with the C++03 version when the optimization is turned on. The Fibonnaci generator yields 1, 2, 3, 5,... missing the first 1. It may be a compiler bug.&lt;/p&gt;&lt;p&gt;PS: I suspect that when you did your test, the compiler did not do HALO optimization for the coroutine frame. Now it does and 3ns/iteration is definitely fast.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Michel</dc:creator><pubDate>Wed, 16 Jul 2025 13:58:15 -0000</pubDate></item><item><title>Re: Restarting Blogging</title><link>http://www.sparkslabs.com/blog/posts/20210103.blogging2021.html#comment-5426929439</link><description>&lt;p&gt;Good to see you blogging again!&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">David Boddie</dc:creator><pubDate>Sun, 20 Jun 2021 15:57:54 -0000</pubDate></item><item><title>Re: Escaping The Panopticon of Things?</title><link>http://www.sparkslabs.com/michael/blog/2018/02/11/escaping-the-panopticon-of-things-#comment-3754184831</link><description>&lt;p&gt;Note: a whistle stop example of how to use IOTKit to build device oriented and user centric IOT devices is in the next post on this blog - which you can find here:&lt;/p&gt;&lt;p&gt;* &lt;a href="http://www.sparkslabs.com/michael/blog/2018/02/12/hello-iot-kit,-introduction-by-example" rel="nofollow noopener" target="_blank" title="http://www.sparkslabs.com/michael/blog/2018/02/12/hello-iot-kit,-introduction-by-example"&gt;http://www.sparkslabs.com/m...&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Michael Sparks</dc:creator><pubDate>Mon, 12 Feb 2018 04:30:29 -0000</pubDate></item><item><title>Re: Serving packages for multiple distribitions from a single PPA</title><link>http://www.sparkslabs.com/michael/blog/2015/08/03/serving-packages-for-multiple-distribitions-from-a-single-ppa#comment-2844183673</link><description>&lt;p&gt;please please please please please make Pixie HUGE for Arduinos!  Down with C++ !&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">the way of the future</dc:creator><pubDate>Thu, 18 Aug 2016 10:51:21 -0000</pubDate></item><item><title>Re: Hello Microbit</title><link>http://www.sparkslabs.com/michael/blog/2015/03/28/hello-microbit#comment-2509734257</link><description>&lt;p&gt;Thank you for you kind words :-)&lt;/p&gt;&lt;p&gt;A few months later I was able to post a blog about the prototyping process here:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.bbc.co.uk/rd/blog/2015-07-prototyping-the-bbc-microbit" rel="nofollow noopener" target="_blank" title="http://www.bbc.co.uk/rd/blog/2015-07-prototyping-the-bbc-microbit"&gt;http://www.bbc.co.uk/rd/blo...&lt;/a&gt;&lt;/p&gt;&lt;p&gt;And then last september gave a talk about the process in more detail:&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=dluVWXtWucA" rel="nofollow noopener" target="_blank" title="https://www.youtube.com/watch?v=dluVWXtWucA"&gt;https://www.youtube.com/wat...&lt;/a&gt;&lt;/p&gt;&lt;p&gt;That said, seeing all the happy faces on twitter, and seeing the overwhelmingly positive response has been humbling to see :-) Really looking forward to seeing the children receiving their devices, and looking forward to see what they do with it :-)&lt;/p&gt;&lt;p&gt;Once again though, thank you for your kind words :-)&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Michael Sparks</dc:creator><pubDate>Fri, 12 Feb 2016 07:20:38 -0000</pubDate></item><item><title>Re: Hello Microbit</title><link>http://www.sparkslabs.com/michael/blog/2015/03/28/hello-microbit#comment-2509517014</link><description>&lt;p&gt;Thank you, Michael! I love them, my students are chomping at the bit (!) for them and I think you are being modest about the impact these will have. Fantastic job, sir!&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Pete Bell</dc:creator><pubDate>Fri, 12 Feb 2016 02:48:10 -0000</pubDate></item><item><title>Re: Sparks</title><link>http://www.sparkslabs.com/michael/blog/2011/10/11/why-did-kids-code-in-the-80%27s-#comment-2291515426</link><description>&lt;p&gt;I had A BBC Micro in 1983-85 16KB that got upgraded to 32KB and used to code on that in BASIC. I was into it then but after the save to tape feature failed and never received it back from repair (shop just shut down with all contents gone!) I sort of lost interest because I could not afford a new one. Even then I was sad because I had all sorts of ideas of how a program could , turn on the lights, let me know when someone was at the front door, easy stuff really with some added hardware but I did think that it could by voice activation without going to the home PC. I am sure a lot of kids at the time had the same kind of idea especially with doctor who and other sci fi TV series. I am still sad though because I never forget the frustration of a program not running and the joy of finding out why. I had to make money at the end of the day since I left school and went to become an electrician then Joined the armed forces. These days I am stuck with cyber threat security removal but still not able to program a computer. I just wish I got my BBC Micro back because even the ideas I have today are still not thought of! Well I don't think they are I don't see the idea around anyway. I even see that people can make apps but I do not have the first idea of making one. I miss it all.&lt;br&gt;John&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">John Regan</dc:creator><pubDate>Mon, 05 Oct 2015 14:12:30 -0000</pubDate></item><item><title>Re: Sparks</title><link>http://www.sparkslabs.com/michael/blog/2011/10/09/waterfall-method-was-a-mistake---from-start-to-finish.#comment-2069634888</link><description>&lt;p&gt;Updated link for original paper -- &lt;a href="http://www.serena.com/docs/agile/papers/Managing-The-Development-of-Large-Software-Systems.pdf" rel="nofollow noopener" target="_blank" title="http://www.serena.com/docs/agile/papers/Managing-The-Development-of-Large-Software-Systems.pdf"&gt;http://www.serena.com/docs/...&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Michael Sparks</dc:creator><pubDate>Tue, 09 Jun 2015 06:33:05 -0000</pubDate></item><item><title>Re: Ubuntu PPA Packages of sparkslabs projects</title><link>http://www.sparkslabs.com/michael/blog/2015/03/01/ubuntu-ppa-packages-of-sparkslabs-projects#comment-1882140998</link><description>&lt;p&gt;NB Sparkslabs just means the projects I have on github under the id "sparkslabs"&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Michael Sparks</dc:creator><pubDate>Sun, 01 Mar 2015 12:49:00 -0000</pubDate></item><item><title>Re: Guild - pipelinable actors with late binding</title><link>http://www.sparkslabs.com/michael/blog/2014/03/07/guild---pipelinable-actors-with-late-binding#comment-1281975557</link><description>&lt;p&gt;If I was to implement copying, it wouldn't be hidden. (though it might be wrapped up in Actor that does it for you)&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Michael Sparks</dc:creator><pubDate>Wed, 12 Mar 2014 17:24:53 -0000</pubDate></item><item><title>Re: Guild - pipelinable actors with late binding</title><link>http://www.sparkslabs.com/michael/blog/2014/03/07/guild---pipelinable-actors-with-late-binding#comment-1281317504</link><description>&lt;p&gt;Please, no (hidden) copying. As well as the performance overhead there's a problem copying things like SWIG-wrapped C++ objects.&lt;br&gt;It also needs to be remembered that the sender usually retains a reference to the sent object. This is not often a problem but could trip up a naive user who decides to use socket.recv_into() with a buffer that was sent out earlier.&lt;br&gt;I think this is down to self discipline when writing Kamaelia or Guild components. Any attempt to enforce it would get in the way, I think.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jim Easterbrook</dc:creator><pubDate>Wed, 12 Mar 2014 09:28:08 -0000</pubDate></item><item><title>Re: Guild - pipelinable actors with late binding</title><link>http://www.sparkslabs.com/michael/blog/2014/03/07/guild---pipelinable-actors-with-late-binding#comment-1279789700</link><description>&lt;p&gt;Hi,&lt;/p&gt;&lt;p&gt;Regarding one to many - yes that's not a bad convention, or perhaps it'd be goodwould wrap duplicated messages in a wrapper that warn the recipient that they have a duplicated reference. Also, while it's not mentioned above, I have implemented the backplane component from kamaelia, along with a bridging mode. That could be modified to enforce copying rather than sharing, or to hint to recipients that they have received a shared reference. It's tempting to think about having some kind of copy on write mechanism/dictionary.&lt;/p&gt;&lt;p&gt;Assuming the Camera, Display, and Framestore component from above, then you could do this: (untested, but gives you the idea - there's an example of the backplane in the examples directory)&lt;/p&gt;&lt;p&gt;from guild.components import *&lt;/p&gt;&lt;p&gt;actors = camera, framestore, display = Camera(), Framestore(), Display( (800,600) )&lt;br&gt;Backplane('FRAMES').go()&lt;br&gt;pub = PublishTo('FRAMES')&lt;br&gt;sub1 = SubscribeTo('FRAMES')&lt;br&gt;sub2 = SubscribeTo('FRAMES')&lt;/p&gt;&lt;p&gt;pipeline(camera, pub)&lt;br&gt;pipeline(sub1, framestore)&lt;br&gt;pipeline(sub2, display)&lt;/p&gt;&lt;p&gt;start(*actors)&lt;br&gt;wait_KeyboardInterrupt()&lt;br&gt;stop(*actors)&lt;br&gt;wait_for(*actors)&lt;/p&gt;&lt;p&gt;Perhaps worth noting that this is one area where a little bit better syntactic sugar would be useful :-)&lt;/p&gt;&lt;p&gt;Thanks for spotting the typo - I'll fix that! (Typoes here are generally because I'm writing this on public transport :-)&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Michael Sparks</dc:creator><pubDate>Tue, 11 Mar 2014 05:39:50 -0000</pubDate></item><item><title>Re: Guild - pipelinable actors with late binding</title><link>http://www.sparkslabs.com/michael/blog/2014/03/07/guild---pipelinable-actors-with-late-binding#comment-1279763406</link><description>&lt;p&gt;Very interesting, Michael.&lt;/p&gt;&lt;p&gt;It reminds me of Qt's signal/slot mechanism, which in recent versions of PyQt is quite user friendly. It also uses decorators to mark 'input' methods as slots. Sending a message to a slot (as the user sees it) directly invokes the slot method, if sender and receiver are in the same Qt thread. When I start playing with Guild a PyQt interface is probably one of the first things I'll try.&lt;/p&gt;&lt;p&gt;What are your thoughts on one-to-many connections? (E.g. bind the camera output to inputs of two separate displays.) If all receiving methods are obliged to treat input objects as immutable this should be safe, shouldn't it?&lt;/p&gt;&lt;p&gt;PS Spotted one typo - "small/just big though" should be "small/just big enough"?&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Jim Easterbrook</dc:creator><pubDate>Tue, 11 Mar 2014 04:43:33 -0000</pubDate></item><item><title>Re: Sparks</title><link>http://www.sparkslabs.com/michael/blog/2011/10/11/why-did-kids-code-in-the-80%27s-#comment-990166634</link><description>&lt;p&gt;Good read, thanks.&lt;/p&gt;&lt;p&gt;I started coding in the 80's on a BBC Micro for a few reasons.&lt;/p&gt;&lt;p&gt;1) My interest in robots, maths and puzzles and wanting to make my computer talk like the car in Knight Rider. Which with the Welcome program was pretty easy. But them implementing that into other programs&lt;/p&gt;&lt;p&gt;2) All my friends had Spectrums or Commodore 64's with cool games that I weren't available on the BBC. So I learn't how to program so I could make games like that.&lt;/p&gt;&lt;p&gt;3) It was actually possible to make games of the standard that you were buying in the shops as a 10 year old working on a machine in your parents dining room. I knew everything was possible.&lt;/p&gt;&lt;p&gt;I'm lucky that I work in the games industry and been able to make cutting edge games for the last 17 years, but if I was working on my own I wouldn't have been able to make anything marketable in that period and I think that's the big difference now. Point 3 above meant that I could make Paperboy by myself but now-a-days I can't make Heavy Rain for example.&lt;/p&gt;&lt;p&gt;Reading this article though has put a thought in my head. If the BBC got together with Unity and some big names in the UK games industry (Ian Livingstone, Peter Molyneux, etc) where over a period of weeks on a TV show a game would be developed within the Unity engine with free downloadable assets, created by the BBC from the Unity Asset Store. People could see what and how to make a fun, great looking game while learning a great language like C#&lt;/p&gt;&lt;p&gt;They can also mess around with the code and assets to create a more personalised version of the game&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Anthony Kyne</dc:creator><pubDate>Tue, 06 Aug 2013 08:24:09 -0000</pubDate></item><item><title>Re: Sparks</title><link>http://www.sparkslabs.com/michael/blog/2011/10/18/why-did-coding-at-school-level-disappear--#comment-842967145</link><description>&lt;p&gt;It seems people are catching up with this notion. I've heard lots of discussions recently (esp. on Today programme) about how we lost out by not teaching code in schools. A lot of it tied up with economics and the fear that China will be all-powerful. So back in the headlines because of a perceived loss of revenues somewhere?? Missing the point by a mile, I feel. Kids won't learn code because the Gov fear a loss of national economic dominance. They would learn it because it is its own reward.&lt;/p&gt;&lt;p&gt;Learning code is something akin to learning to paint and draw (as in your quote), you can become a professional, or you can use it purely for your own fulfilment. Kids today, when they feel there's something worth knowing, go online, find what they want to learn and teach themselves. And anecdotally, I showed the clip (pasted below) about learning this stuff to my two nephews (age 8 and 10) and both are now learning Python and HTML5 - essentially teaching themselves. Looks like technology will look after us if the curriculum will not.&lt;/p&gt;&lt;p&gt;&lt;a href="http://techcrunch.com/2013/02/26/zuck-bill-gates-jack-dorsey-code-org-film/" rel="nofollow noopener" target="_blank" title="http://techcrunch.com/2013/02/26/zuck-bill-gates-jack-dorsey-code-org-film/"&gt;http://techcrunch.com/2013/...&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Tim Urban Crap</dc:creator><pubDate>Tue, 26 Mar 2013 11:05:37 -0000</pubDate></item><item><title>Re: Hack to the Future (H2DF), Preston, 11/2/12</title><link>http://www.sparkslabs.com/michael/blog/2012/02/19/hack-to-the-future-(h2df),-preston,-11/2/12#comment-443686124</link><description>&lt;p&gt;For people who worry about such things, this in no way states BBC opinion on anything. They're my opinions. If they were BBC opinions, they'd be on the BBC website, and probably not have my name attached. :-)&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Michael Sparks</dc:creator><pubDate>Sun, 19 Feb 2012 19:13:40 -0000</pubDate></item><item><title>Re: Sparks</title><link>http://www.sparkslabs.com/michael/blog/2011/10/23/replicate-the-past---the-cause,-the-mechanism,-or-the-effect-#comment-393629692</link><description>&lt;p&gt;Michael&lt;/p&gt;&lt;p&gt;I am reading this from the States after you posted to the Hackersaurus group.  You are dead on in your analysis of the importance of understanding the constraints of the time  we live in and designing around them. We need to analyze the ecosystem of the past and learn from it and not necessarily repeat it.  We are in a period where students don't feel that they can create the games they interact with on the computer and/or game console.  What is interesting is that students do feel they can create the movies they watch and the music they listen to which leads them to spend time creating in these spaces.  I think a major reason for this belief is the existence of multiple channels for discovering and sharing videos and songs created by non-professionals (e.g. youtube, soundcloud, tumblr, CDs (old school music sharing), mp3 players).  These channels easily allow users to interact with their peers around the videos and songs they are creating.&lt;/p&gt;&lt;p&gt;Currently, we don't have a "sexy" enough universal way to share user created games which means that the ability to create games isn't viewed as a vehicle for increasing social capital (or gaining cool points). Most kids spend time doing things that they believe is in reach and can be shared with their peer group.&lt;/p&gt;&lt;p&gt;We can look at the Scratch in some ecosystems as an example of what is possible.  In some school communities where Scratch has been introduced it is viewed as a valuable skill set within the kids' peer groups which results in kids spending hours at home creating games and sharing via the Scratch website.  Unfortunately, scratch games are not available yet on the iPad/iphone which means that in order for a kids to share they need to be sitting around a computer screen.  Also, as students get older, Scratch looses some of its engagement. I think this is partly because of the inability of most kids to create  graphically appealing sprites and the lack of easy access to sprite libraries that are age and interest appropriate.&lt;/p&gt;&lt;p&gt;I think that if we can enable kids to easily share their games created with systems like Gamestar Mechanic, Scratch, and others on their current gaming consoles, tablets, phones or create a universally available and portable console that kids find desirable (the gaming version of the Leap tools) then we may be able to create the conditions that will engage kids in creating, playing and sharing games and other interactive objects as valuable social capital.&lt;/p&gt;&lt;p&gt;Best,&lt;/p&gt;&lt;p&gt;Nichole&lt;/p&gt;&lt;p&gt;P.S. Happy Holidays&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">npinkard</dc:creator><pubDate>Sat, 24 Dec 2011 07:49:42 -0000</pubDate></item><item><title>Re: Sparks</title><link>http://www.sparkslabs.com/michael/blog/2011/10/23/replicate-the-past---the-cause,-the-mechanism,-or-the-effect-#comment-389804759</link><description>&lt;p&gt;Maybe - it's either something like that or like minds :-) It's a great rationale behind hack to the future though. I've now signed up btw.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Michael Sparks</dc:creator><pubDate>Mon, 19 Dec 2011 07:30:43 -0000</pubDate></item><item><title>Re: Sparks</title><link>http://www.sparkslabs.com/michael/blog/2011/10/23/replicate-the-past---the-cause,-the-mechanism,-or-the-effect-#comment-389765324</link><description>&lt;p&gt;Michael. I have read this blog post a couple of times already before today. I start to wonder now if I subconciously took the idea for Hack To The Future &lt;a href="http://h2df.eventbrite.co.uk" rel="nofollow noopener" target="_blank" title="http://h2df.eventbrite.co.uk"&gt;http://h2df.eventbrite.co.uk&lt;/a&gt;  from your line "After all, the world of 30 years ago looks as old and archaic to the children of today as 1955 did to Marty McFly."&lt;/p&gt;&lt;p&gt;In recent months, some developer/programmer types have said to me words to the effect of "I wish when I was at school somebody had shown me what was possible with computer science" - that's my rationale behind Hack To The Future - allowing children to meet their potential future selves to discover the power of computing science. &lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Alan O'Donohoe</dc:creator><pubDate>Mon, 19 Dec 2011 05:02:40 -0000</pubDate></item><item><title>Re: Sparks</title><link>http://www.sparkslabs.com/michael/blog/2011/10/23/replicate-the-past---the-cause,-the-mechanism,-or-the-effect-#comment-389764559</link><description>&lt;p&gt;Follow up blog was delayed. Plans have been changed by discovery of &lt;a href="http://www.playmycode.com/" rel="nofollow noopener" target="_blank" title="http://www.playmycode.com/"&gt;http://www.playmycode.com/&lt;/a&gt; whilst investigating tools to build something very similar, almost identical to it! It's great :-)&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Michael Sparks</dc:creator><pubDate>Mon, 19 Dec 2011 04:59:12 -0000</pubDate></item><item><title>Re: Sparks</title><link>http://www.sparkslabs.com/michael/blog/2011/10/18/why-did-coding-at-school-level-disappear--#comment-338992959</link><description>&lt;p&gt;I think it's worth noting that I recognise that despite the national curriculum/GCSEs etc coding and computer studies etc didn't drop out from schools completely. However for the large part it has, and realising "it was never really quite there the way you thought" does matter. Also, I phrased the title as a question because I don't claim to have the definitive answer, the above is really just my best guess based on the facts I knew then and know now.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Michael Sparks</dc:creator><pubDate>Wed, 19 Oct 2011 04:41:56 -0000</pubDate></item><item><title>Re: Sparks</title><link>http://www.sparkslabs.com/michael/blog/2011/10/11/why-did-kids-code-in-the-80%27s-#comment-337276636</link><description>&lt;p&gt;I think in a way that's my point. Many of us who learnt to code in the 80's did so on machines that weren't BBC Micros.&lt;br&gt;However, I think without it legitimising micros in the eyes of parents, the home micro market may wellt've been as large, as early, nor as targetted at kids. In a way, this song sums it up pretty well &lt;a href="http://www.youtube.com/watch?v=Ts96J7HhO28" rel="nofollow noopener" target="_blank" title="http://www.youtube.com/watch?v=Ts96J7HhO28"&gt;http://www.youtube.com/watc...&lt;/a&gt; ("Hey Hey 16K - We bought it to help with your homework")&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Michael Sparks</dc:creator><pubDate>Mon, 17 Oct 2011 19:31:05 -0000</pubDate></item></channel></rss>