Shared posts

27 May 19:28

Notes on Wireless MIDI

by Rui Carmo

It’s getting warm enough that a laptop (or a fan-happy desktop) is a nuisance do deal with, which together with an increased propensity to fall asleep on a couch means I’m back mostly using my iPad mini during weekends.

As it happens, I got myself more music gear (about which I’ll write in the fullness of time as first impressions make way for more factual takes), which means I spent a fair amount of time messing about with various setups.

My Musical Nirvana

Ideally, I’d like to have a non-desktop, minimal maintenance device to do all of my music dabbling in, with the ability to run a variety of software synths and sample libraries and, despite my constant messing about with Cubasis and other iOS DAWs like NanoStudio 2, preferably running Logic, because it is so much better than anything else on the Mac for my taste.

And yes, I’m obviously looking at you, Apple, because the current crop of M1-powered iPad Pros are ridiculously powerful (which, incidentally, is the actual tagline atop the Logic product page) and definitely more than able to run something better than GarageBand.

There is no shortage of people running Logic with hundreds of tracks on M1 Macs, so I am pretty sure a form of M1 iPad (perhaps less ludicrously priced) is in my future. Maybe even over Summer break if there is any hint of an improved iPad OS in WWDC, as for that I would even risk running a beta.

But right now, my iPad Mini 5 is perfectly capable of running a truckload of audio units simultaneously (including this week’s serendipitously free Moog emulations) and is only a bit lacking in the real estate department.

This because the screen, although otherwise fine for reading and writing, is a bit too crammed for music production, as it is hard to make out the tiny annotations near virtual synth knobs designed to be rendered in screens 1.5x larger.

So until Apple does something sensible with the iPad that makes it worthwhile to spent a significant percentage of my personal budget on new hardware, I’m patiently amassing tiny, insanely flexible synths and looking at ways of using my iPad mini as an external synth module.

Network MIDI

This is the usual way to go about doing it, which is copiously documented and easy to find online (just search for “Audio MIDI Setup Network Session on iPad” or any variation of it).

I spent a little while playing with Audio MIDI Setup on Friday evening, and learned three things:

  • Latency on a well-tended, interference-free 5GHz Wi-Fi network is a non-issue (just as I have never had any real issues with Bluetooth peripherals, wrapping MIDI on RTP and IP packets seems to work fine).
  • Live routings from the Mac don’t seem to work without a DAW, unlike what I expected (I tried mapping one of my Mac’s USB MIDI controllers to the network session and it only worked when Logic was running).
  • However, network sessions work quite seamlessly across iOS devices, especially if you’re using AUM to then route MIDI across various virtual synths.

And it was this last bit that led me further down a hitherto undiscovered rabbit hole that is likely to be much more useful: Using Bluetooth instead.

Turning Your iPad into a Bluetooth MIDI instrument

There are no end of Bluetooth MIDI applications that let your iPad become a MIDI controller (and, amusingly, some serious apps charge a premium for it), but what I’ve been looking for is a way to actually use all of those iOS virtual synths from my desktop.

As it turns out, AUM can advertise your iOS device as a Bluetooth Low Energy MIDI device.

To do so, launch AUM, go to Settings, scroll down to Bluetooth MIDI, tap Peripheral, and then Advertise MIDI Service–and presto, you can then connect to your iOS device from and use it as a MIDI instrument–including, obviously, other iOS devices, but in my case it was more useful to do so from the Mac.

Then just set up an external MIDI track in Logic, wire it up via an audio input, and record it as you would any external synthesizer.

In my view, using Bluetooth has the added advantage that you can have your iPad set to airplane mode and hence avoid any untoward interruptions from notifications, as well as extending battery life if you’re on the move.

Update: Yes, I know about IDAM and how to get a direct audio feed from a wired iOS device into Logic, but thought this was worth exploring nonetheless because I quite like the idea of networking MIDI devices wirelessly and only recording the audio later.

Conclusion

And that was it for this week. A tremendous amount of stuff has been going on, but these were the fun bits.

Next week, with a bit of luck, I’ll get back to writing about a few coding adventures I’ve been having (or at least ranting about the time I’ve been spending in meetings and not building stuff).


27 May 19:26

Tackling software complexity with the CELP stack

The last couple of months I’ve been deeply immersed in the combination of Elixir with Phoenix LiveView for the Web UI, Commanded as a CQRS/ES implementation, and PostgreSQL for persistence - I think I heard someone call it the CELP stack, so let’s call it the CELP stack. I think this stack is a great way to tackle software complexity.

[Note: the timestamps in this post are off, but given that they are part of this post’s URL, not simply unfixable. The actual date this got published was 23 May 2021

Some may disagree with Fred Brooks’ distinction between accidental and essential complexity, but my experience indicates that he is correct. I have worked in what is now called SaaS for almost 25 years (and “regular” software another decade before that), I’ve seen the gamut between horrible contraptions and trivially simple systems, and the interesting thing is that hardly ever, the extra complexity was introduced by any sort of requirements: it just happened, people thought it was normal, “this is what Gartner adviced”, and so on. In my experience, accidental complexity is one of the biggest sources of waste in our industry, and tackling software complexity therefore logically means reducing that as much as possible. We need simpler systems with less layers that human beings can reason about, not more.

Simple software scales. It scales in both ways of scaling that are important: you can put more load on it in production and you can grow it (both in terms of LOC and team size).

If you talk about software scaling, most will think you’re talking about the first kind of scaling, but, frankly, that’s a solved problem. I’ve worked with pretty terrible systems that scaled by just throwing hardware at it. Is it “elegant” to run 300 webservers because your PHP app cannot deal with more than a couple of dozen requests per second per server? Nope, but it works. And the sort of companies I’ve worked at invariably saw the idiotically high hosting bills that resulted as rounding errors. If your revenue is €100million and your growth rate is 20-30%, it’s hard as CFO to get excited about some techie that tells you there’s a savings of €2m in the architecture if we just can stop building new product and to a rewrite.

No, business wakes up when the other kind of scalability starts hurting, is my experience. When they cannot onboard more developers for all the new great plans that product has for even more growth, or “velocity” slows down because the software and the infrastructure around it just got too complex: these are the costly things that will make your CFO take the executive elevator down into the coding dungeons and ask what’s up. Tackling this is invariably very costly and very disruptive to the business, so I’ve learned to do a little less of “You Ain’t Gonna Need It” and a little more of thinking about how to prevent this kind of pain in the future. The best solution? Ruthlessly hunt down and erase any kind of accidental complexity. Make “KISS” your religion. Funnily enough, that’ll often also help you scale in the other way: simpler systems are easier to reason about and therefore scaling bottlenecks are likely simpler to find and resolve.

Everything Should Be Made as Simple as Possible, But Not Simpler

Maybe Albert Einstein

As simple as possible would be - in the Elixir nook of this world - a straight Phoenix app. Phoenix comes with a very powerful set of generators that make whipping up a quick form trivial. But it also comes with the known weaknesses of “old school” CRUD apps: read/write mixing makes it hard to scale your RDBMS - often done by adding read replicas and sending read traffic there - and there’s some additional complexity because Phoenix, with its server-side templates, does not address a lot of the modern expectations of web applications around interactivity, liveliness, and so on. I think that’s why a lot of teams find themselves these days writing a Vue or React application and then using Phoenix to power the API. Now you have two languages, two deployment pipelines, two production environments. Often, two teams. It is modern. KISS, it is not.

Read/write scaling has been a focus for me since 2005. The typical scenario is: you buy/lease/cloud-provision a database server and all is well. You are successful and the DBA comes complaining. You buy/lease/cloud-provision a bigger database server and all is well. That goes fine for a well - at one company we “joked” that all we would need to do is survive until the next AWS re:Invent conference where the next bigger piece of kit would be announced, and I heard rumours that Paypal at one time had a dedicated team hunting for the more powerful hardware for their central Oracle RAC db. Of course, then the horizontal scaling people start yelling that this is nonsense and that you should have read replicas because - usually - for every write transaction you have ten reads and half of them with overly slow queries. Vertical scaling isn’t nonsense, of course: it is super cheap, compared to pausing half your development work (which we assume powers your growth) and splitting reads and writes. Trust me, I’ve done it. The more magic your CRUD framework is (looking at you, Rails), the more painful it is.

Split your reads and writes early on, even if you don’t need it. It is one of these things that is very simple to do when you start, very simple to keep up as you grow, and will make future you very happy when the “how do we scale the DB” question comes up. It’s an insurance premium, where in this case the thing you’re insured against is your own success :).

CQRS/ES is one way of forcing you to split your reads and your writes, while getting extra benefits along the ride. The extra benefits are quite likely to make business people happy and thus will make it easier to sell doing it early:

  • You force yourself to think about stuff that happens in your system in terms of behaviours, not data. That alone will make things more understandable;
  • You have this event stream that lets you trivially walk through history, links events together, and is a veritable gold mine for the data scientists that management hired without knowing what to do with them.
  • It is trivially easy to create new projections, replay the past, and create whatever dashboards management wants without having to tell them that they’ll be useful in 6 months because you weren’t collecting the data.

Greg Young advices not to use Event Sourcing unless there’s a proven need, but he’s a C#/.Net person and I get it that when you start with an overly complex and baroque system, you want to be careful adding more ;-). However, over here in Elixirland it’s a somewhat different story: we start with a simple system and Event Sourcing is a natural extension to a system that is already driven by functional thinking and data pipelines. I am very close here to inverting Greg’s advice: use it unless you have reasons to not do it. With Commanded, Elixir has top-notch support for the collection of patterns that go under this label and adopting it is simple.

That leaves the other thing: our two systems/teams for front-end and back-end. Phoenix LiveView is the answer. It’s an answer that will make a lot of “I only know Javascript” type of front-end developers unhappy, but if you’re truly “full stack” then adopting to it should be pretty easy. I can be short about it: I’ve used pretty much everything under the sun since my first forays on the web (through X.25 from the DECUS Germany server to CERN) and this, so far, is the only thing that has truly worked both in terms of productivy and long-term cleanliness. It is not perfect yet, I’m hoping that some component system will get added, but as far as web application frameworks go it is very close to optimal. One language, and one running server on your system, seamless refactoring of logic from your UI down to your business logic when you want it: it is all there and thanks to Elixir’s excellent incremental compilation system and Phoenix’ pushes, your page is refreshed in the time it takes you to blink after you save an IDE buffer. Pro tip: add TailwindCSS for even more fun, but that is strictly speaking not part of this story.

The true magic comes when you combine these two concepts. Because Phoenix LiveView is also all about read/write spitting the two fit perfectly: user writes get turned into messages to the server process (every active LiveView has an active OTP “gen_server” process), and view updates/reads - after the initial load - are pushed down by messages from the server process back to the view in the browser. This is what you end up with:

  • User presses “submit” to, say, add something to their shopping cart;
  • the active LiveView server receives event, and converts it into an “AddItemToCart” command which it dispatches to the Commanded application;
  • Commanded takes the command and routes it to your “ShoppingCart” aggregate root, hydrating it if necessary;
  • Your aggregate root has an execute method that checks whether the item wasn’t already in the cart, etc, and if all is well, emits an “ItemAddedToCart” event;
  • Commanded persists the event;
  • PostgreSQL fires a trigger which prompts a listener to wake up;
  • That listener, another Commanded building block, gets the event and sends them out to anyone who is interested;
  • One of the interested parties is your Ecto projector, which takes the “ItemAddedToCart” event and translates it into a row add in a database that has current shopping carts (let’s assume that shopping carts must be persistent here);
  • After your listener is done, Commanded calls the module’s after_update handler which puts the events on a Phoenix PubSub topic;
  • That view that received the event subscribed when the cart was created/retrieved, so receives the event as a handle_info standard OTP message;
  • Your event handler converts the event into a simple structure and assigns it to the socket;
  • LiveView notices the updated assigns, calculates the deltas with the current assigns, and pushes a diff to the browser;
  • The browser patches the DOM, the user sees the extra cart item.

Complex, not? Well… not really. Mostly a lot of typing :). But look at the finegrained separation of concerns here - that is what will matter as you grow. Not how many LOC you have, but how little spaghetti.

Your Command cleanly defines what data is required to perform an action. It also is the entry point if you ever want to create an alternate UI - just send the already implemented commands. It is a specification:

typedstruct module: AddItemToCart do
  field :id, String.t()
  field :product_id, String.t()
end

Your execute handler does contract checking: is all the data there? Is it possible?

def execute(cart, c = %AddItemToCart{}) do
  if has_item(cart, c.product_id) do
    raise "You cannot add the same item more than once"
  else
    %ItemAdded{id: cart.id, product_id: c.product_id}
  end
end

Your apply is responsible for effecting the state change (if any) on the aggregate root. And that completes the model side of things - notice the complete absence of external dependencies here, making for trivial testing.

def apply(cart, %ItemAdded{product_id: product_id}) do
  %{cart | items: [product_id | cart.items]}
end

Your projection (normally you’ll have an Ecto projection - you could argue that a shopping cart may not belong in the database and that is fine, with projections you can always change your mind later) converts the data into something that is easy to read on the initial load of a page.

project(e = %ItemAdded{}, _metadata, fn multi ->
    Ecto.Multi.insert(multi, :project, %Projections.CartItem{
      id: e.id,
      product_id: e.product_id,
    })
  end)

Finally, on the UI side, your event handler is just concerned with creating a command in reaction to user actions…

def handle_event("add-item", %{product_id: product_id}, socket) do
  App.dispatch(%AddItemToCart(id: socket.assigns.cart_id, product_id: product_id))
  {:noreply, socket}

…and in the PubSub handler with updating the view state by updating the socket state (LiveView will then figure out the differences and send out a push).

def handle_info({:ecto_projection_completed, %ItemAdded{id: cart_id, product_id: product_id}}, socket) do
  socket = if cart_id == socket.assigns.cart_id do
    assign(socket, items, [product_id | socket.assigns.items])
  else
    socket
  end
  {:noreply, socket}

Whereas with a normal CRUD app, a lot of these concerns get mashed up in a single controller method, the CELP stack forces you to separate everything, which will force you to write short, clean, and reusable code. Absorbing new changes is just as trivial. Say that product says that you can have more than one item of a product in a cart.

  • Your command handler checks whether there’s already an item with that product id in the cart. If so, it will emit an, say, “ItemCountIncreased” event instead of “ItemAdded”.
  • A new event handler just increases the item count for an existing item (the cart state will now probably be a map or keyword list containing (product_id, count) elements).
  • A second projection method handles that event, just emitting an update. The insert and update are nicely separated without conditional logic.
  • You can now add a command to set the item to a certain count and hook it up to the UI, reusing a lot of the pipeline already created for adding an item.

In essence, CELP forces you to build small, reusable blocks. It’s more typing (although macro libraries are already being brewed in this space), but the extra code is clean, concise, and small enough to form a bucket of reusable blocks. In the meantime, you’re gathering a history of everything that happened in your web app for when management decides that Data Science is the next big thing ;-). Yes, you can achieve the same end result using TDD and refactoring, but sometimes it is nice to know when to skip ahead.

“You Ain’t Gonna Need It” is very good advice. Every time you pull in more than the bare minimum to get things done, you need to see it as an actuarial thing: are you insuring against something that could conceivably happen? Is the premium small enough to not get in the way of the important stuff? If so, you should consider pulling in the little extra thing. In my experience, it is exceptional that such a move is warranted. In my experience, pulling in the CELP stack is such an exception.

27 May 19:22

Is De-Implementation the Best Way to Build Back Better?

Peter Dewitt, May 24, 2021
Icon

What's notable about this article is the vagueness. On the surface it seems clear enough: after talking about teacher and principle fatigue, it broaches the idea of simply not doing things that don't work. This leads to the concept of de-implementation, the process of “abandoning existing low value practices.” So I'm totally in favour, but what are those practices? The only clue we are given is that the recommendation is being made by John Hattie, who has produced a ranking of practices. Below the 'hinge point' of 4.0 are things like music programs, gaming and simulations, drama, chess, worked examples, and many more. But it's hard to see what sort of 'better result' dropping these things would produce. This suggests to me that the article hasn't really identified the cause of teacher and principle fatigue. It's not caused by doing ineffective things. It's caused (in my view) by the clash between teachers and administrators over what, exactly, constitutes a good education in the first place.

Web: [Direct Link] [This Post]
27 May 19:21

Fourteen Months of Sheltering in Place

by Richard

This month was uneventful except for one day. Up until then I had spent a month wondering when I'd get a vaccine. I had registered with UHN when they offered appointments to 18+ in my postal code, and quickyly shut it down after getting too many registrations. I also registered with my local Shoppers Drug Mart and with Rexall, thinking that while it didn't cover all the bases, at least it covered some.

That was in late March. Hoping for the Moderna or Pfizer vaccine, but willing to accept the AstraZeneca vaccine, I waited another month, with the messaging from health authorities being "Get the first vaccine you can." In the meantime, I made sure my email filters didn't sent the drug stores' emails to my spam folder, and started accepting every call that rang my phone. On Sunday, April 25th, intending to sleep in that day, I heard my phone's text message and email notifications chime almost simultaneously. That could only mean one thing, so I leapt to my computer and filled out the appointmnet form. It being 10 AM and the next available appointments being available at 10:45 AM and noon, I decided I wasn't so anxious for it that I couldn't have a relaxing breakfast and watch an episode of the Icelandic political drama The Minister before making my way a couple of blocks.

They pharmacy asked me to be there no more than 10 minutes early, but since I'm early for everything, that was too much to ask. I arrived 20 minutes before my appointment, and 10 minutes later I had a shot in my arm. I took a vaccine selfie, but only posted it to Facebook, thinking by then it was a widespread enough phenomenon that nobody needed the inspiration anymore. (I do regret that I didn't post to Twitter, since I would have enjoyed the wave of likes there.)

The late-breaking news is that the Ontario government paused the distribution of the AstraZeneca vaccine, and that came on the heels of the National Advisory Committee on Immunization making a preferred vaccine recommendation, which gave a lot of people the feeling that there was mixed messaging around the "Get the first vaccine you can" messaging. I don't know exactly what to expect for my second dose, but I do feel a lot more protected than I did two and a half weeks ago.

27 May 19:19

My ffmpeg Cheat Sheet for Video Transcoding

by Martin

One of the reasons I bought a used Z440 workstation with a 6 core Xeon CPU and an Nvidia graphics card back in December was to offload and speedup occasional video transcoding tasks. As I wrote at the time, I could get a speed-up of up to 8x over my X250 notebook. Since then I have found further parameter improvements for ffmpeg and in some scenarios, my speed-up is now over 30x compared to running the same task on my notebook.

Two Practical Examples

The speed-up that can be reached mainly depends on the input data and the desired output codec and quality. Compressing a 49 minute 2.9 GB video file encoded with HEVC (H.265) and made on a mobile phone to a low bit-rate H.264 encoded video with a size of 380 MB is done at around 0,6 of the original video frame rate on my notebook. In other words, transcoding the video takes around 1.5 hours. Running the same task on my workstation and letting the graphics card do the H.265/HEVC decoding + re-encoding in H.264 format is done at 13 times the original video frame rate, i.e. in just under 4 minutes. And as a bonus, the workstation fans remain almost inaudible while the little fan in my notebook runs rampant for one and a half hours.

Re-encoding this particular video into H.265/HEVC results in a 330 MB file. However, the codec is much more complicated and even the hardware unit on the graphics card requires 8 minutes for the task. As there is little movement in this video, the slightly better compression rate does not compensate for the significantly longer encoding time for my purposes. Perhaps other videos have a better ratio, so this is not a general statement.

Some ffmpeg Commands

So here are a couple of ffmpeg command parameters I found useful, which work with an Nvidia graphics card and an out-of-the-box pre-compiled ffmpeg that came as part of Ubuntu 20.04:

# With DE- and ENCODER on NVIDIA, decode AUTO codec detection, 
# encoding to h264
ffmpeg -hwaccel cuda -i input.mp4  -c:v h264_nvenc -cq:v 37 test.mp4

# With DE- and ENCODER on NVIDIA, decode AUTO codec detection, 
# encoding to HEVC/H.265
ffmpeg -hwaccel cuda -i input.mp4  -c:v hevc_nvenc -cq:v 37 test.mp4

Specifying the quality of the output stream is a bit strange, however. There is always a difference of 8 between the setting used on the command line and the resulting quality of the output stream as shown on the console. A value of 37, for example, results in an output quality ‘q’ on the console of 29.

In many cases, the output video should only be a part of the input. There are various ways to cut the beginning and ending of a video, and some have nasty side effects like a black screen for a few seconds. The following parameters create a proper start and end in the output file:

# specifiy start and end time AFTER -i filename.mp4
-ss 00:02:00 -to 01:37:30  

Another option I use frequently is to amplify the audio signal if it is too low in the input file:

# Transcode audio to aac and amplify volume by 3x
-c:a aac -filter:a "volume=3.0"

And if you ever need to downscale a 4k video to 1080p and compress the result, here’s the ffmpeg command for that:

# -hwaccel cuda before the input file might 
# does NOT ALWAYS speed up things as single core use
# for parts of the decoding could become the bottleneck!

ffmpeg -i input.mp4 -c:v h264_nvenc -cq:v 37 -c:a aac -s hd1080 output-1080p.mp4

An amazing tool with so many options. For more details have a look here and here.

27 May 03:21

The Normalizers

by peter@rukavina.net (Peter Rukavina)

Last summer, once the lockdown was over and it was permitted to hold small face to face meetings, I went to my first meeting of a non-profit board I sit on.

I arrived second to last, and found that those who’d arrived ahead of me had removed their masks. This made me uncomfortable, but so as to not be an outlier, I removed my mask too.

A few minutes after I arrived, our final board member arrived, a long-serving and much-respected board member, and he kept his mask on for the entire meeting, thus normalizing something I previously regarded as aberrant.

Needless to say, I kept my mask on for the next meeting and those that followed.

Bill is an avid cyclist in our neighbourhood. He cycles year round, and has a well-worn through the rabbit warren of downtown streets. Often he’ll stop to chat when our paths cross. And he’s always wearing a high-vis vest when he rides.

It had never occurred to me to wear a high-vis vest while bicycling, but that it made Bill so much more visible won me over. And so when I go to get groceries in the evening on my bike, now I wear one.

Like my brave board colleague, Bill normalized something that previously seemed weird.

We get wrapped up thinking that change is hard and takes money and campaigns and social media outreach; often all it takes is one person to bravely lead the way.

27 May 03:20

Twitter Favorites: [TheKitchenista] I don’t know who needs to hear this but maybe you’re not shy, you were just taught to shrink yourself around others.

Angela @TheKitchenista
I don’t know who needs to hear this but maybe you’re not shy, you were just taught to shrink yourself around others.
24 May 01:13

Little Island in the Big Apple

by Gordon Price

Another major public space – a combo of park, art and outdoor theatre – opens this weekend in New York City, very much in the tradition of privately endowed benefactions from the very well endowed.  (Sandy wrote about a similar work by the same architect a few miles up the West Side called The Vessel – here.)

Here’s the architecture critic from the New York Times, Michael Kimmelman, with the story of Little Island:

Rising from the Hudson River, Little Island preens atop a bouquet of tulip-shaped columns, begging to be posted on Instagram. Outside, it’s eye candy. Inside, a charmer, with killer views.

Mega-mogul Barry Diller’s $260 million, 2.4-acre pet project and civic mitzvah, near 13th Street in Hudson River Park, is the architectural equivalent of a kitchen sink sundae, with a little bit of everything. Who knows what it will feel like when crowds arrive this weekend. I suspect they will be enormous.

 

I won’t dawdle over the mess that followed the island’s announcement. A real estate titan who had bones to pick with the Hudson River Park Trust supported a series of legal challenges. At one point, seeing no end in sight to the court fights, Diller backed out. A deal brokered by New York’s governor, Andrew M. Cuomo, ultimately rescued the project and also delivered public commitments to enhance protections for wildlife habitats and improve other parts of the four-mile-long, 550-acre Hudson River Park.

Hundreds of free and modestly priced concerts, dance and children’s programs are planned to get underway this summer. Trish Santini, Little Island’s executive director, told me that her staff has been working closely with community organizations to ensure free and inexpensive tickets get into the hands of underserved groups and neighborhood schoolchildren.

 

A second stage, called the Glade, at the base of a sloping lawn, tucked into the southeast corner of the park and framed by crape myrtle and birch trees, is custom made for kids and educational events. The main plaza, where you can grab a bite to eat and sit at cafe tables under canvas umbrellas, doubles as a third venue.

It’s on the route between the two gangways that link the island to Manhattan — and a stone’s throw from the High Line — so it’s sure to be mobbed. Santini also said the island will do timed reservations to prevent overcrowding. Little Island will need it, I expect. Two-plus acres is half the size of a city block. …

A century ago, the banker Elkan Naumburg paid to install a band shell in Central Park and even hired his nephew to design it. The Delacorte Theater was constructed in 1962 with money from George Delacorte and his wife, Valerie, after the producer Joseph Papp and actress Helen Hayes petitioned for an amphitheater to stage Shakespeare in the Park.

And of course the Metropolitan Museum of Art, privately endowed by wealthy New Yorkers, occupies a big chunk of public parkland.

Little Island is nothing new, in other words. From the beginning, for better and worse, this is how the city has worked.

Full article and more images here.

24 May 01:12

How to have a Successful Family Zoom

by peter@rukavina.net (Peter Rukavina)

Just over a year ago we started the tradition of Friday Family Zoom, gathering my family from PEI, Quebec, Ontario, and California together every Friday night for some family fun. At full strength there are 13 of us in the transcontinental clan, and the weekly connection has been a significant boon to our collective mental health. Indeed I’ve spent more time “with” my family over the last year than in the decade before; among other things that’s allow me to see my five nieces and nephews grow a year older, week by week by week.

When I mention this to friends, they often reply along the lines of “oh, we tried that early on and it was chaotic and we stopped,” which prompts me to describe here the elements that I think contribute to the success of the Rukavina approach to Family Zoom, which have evolved based on doing it more than 50 times.

The essentials of the template we use today was one that Olivia came up with after we’d been at things for a while, and we all owe a lot to her for that.

  1. Every week there’s a host. Olivia came up with a complex scheme to schedule the host for each week, and we have a shared family calendar so that we’re all up to date on who’s time it is. If, for some reason, someone can’t meet their hosting duties, they find someone to swap with. 
  2. Participation is voluntary. Not every one of our thirteen attends every week. People get sick, or have other plans, or just don’t feel like coming; there’s no social pressure for complete attendance. Whoever shows up shows up.
  3. Same time every week. We always start at 8:30 p.m. Atlantic, which is 7:30 p.m. in Quebec and Ontario and 4:30 p.m. in California. Not too late for the youngers, not too early for the west coasters. On rare occasions we’ll go an hour later if schedules demand it, but we tend to stick to the predictability of the 8:30 p.m. start.
  4. We start with a discussion. As a warmup, we start with a discussion on a topic, selected by the host, and related to the week somehow–an event or holiday or birthday that happened that week. Discussion topics past have included “Remembering Catherine,” ”Lesbian Visibility Week,” “Endangered Species,” “National Eat What You Want Day,” “different April Fools pranks that you have done or heard of,” and “what is your favourite snack food.” Discussion period lasts about 15 minutes, and everyone gets a chance to chime in.
  5. Next we have an activity. Like the discussion topic, the host is responsible for coming up with the activity. Because our ages range from 5 to 82, activities are skewed toward something that everyone can participate in. “Let’s recite Shakespearean sonnets as fast as we can” gets trumped by “let’s pick the worst song of all time.” Because we’re a neurodiverse bunch, we tend to avoid activities that involve timers or rushing or a lot of pressure; winning is never the point.
  6. It all lasts about an hour. Sometimes less, sometimes more, but generally about an hour. When we’ve gone longer, people get tired and grumpy and don’t want to do it again.
  7. We finish with a family photo. Which is just a screen shot of the Zoom. Sometimes there’s a prompt, like “okay, everybody look super-scary,” and sometimes there’s not. It’s a good way to signal the end, and a nice keepsake for everyone.

All seven of those points–host, voluntary, same time, discussion, activity, about an hour, photo–has proved integral to the enterprise. It’s also been helpful to have a Zoom paid subscription so we never hit the 40 minute Zoom timeout that comes with free accounts; it’s worth the $18/month for that.

Here’s a sampling of the activities that have proved successful:

  • Pictionary. I think this has been the most fun, in part because it’s something everyone can do and enjoy. We started off trying to use an external shared whiteboard app for this, which worked but was a little kludgy; then Zoom rolled out its own shared whiteboard, and that’s worked well. The host chooses the drawing subjects and private messages them in Zoom to each person in turn; sometimes the subjects are simple–”raccoon,” “ice cream sundae”–and sometimes they’re harder, like “the love you feel for your partner.” 
  • Kahoot. This does require use of a third party website/app, Kahoot, but it’s proved simple enough for everyone to use. Kahoot is essentially a “multiple choice test builder” and we’ve used it for things like “Rukavina family trivia” most successfully. There’s a little bit of countdown tension in Kahoot, but it’s seldom proved too much.
  • Scavenger Hunt. Host comes up with a list of common household things, and spools them out one by one, with time for each squad to locate one. It’s not timed: you get a point simply for finding your quest, with bonus points awarded for creativity. 
  • Charades. If I had my druthers, we’d do charades every week (if I had my druthers I’d be a professional charades player). It’s a little challenging to get the various Zoom devices set up to work well for this (placing an iPhone or iPad on a table and standing in front of it works well). As with Pictionary, the host hands out the charades by private message to each person in turn.
  • Make a craft. Host provides a materials list for a simple craft, common things found in every house, and then instructs us in how to make it.

Again, the key to the activity portion is that it’s something everyone can do, no matter their age; one of the great things that’s evolved over the last year is that nephew E., the youngest among us, has gone from being antsy passive bystander to active participant; he hosted his first Friday Zoom in April.

Our family, like many families, I imagine, has experimented over the years with things like “Christmas morning Skype call,” and they’ve always proved chaotic and disappointing; the difference between those and Friday Family Zoom (other than Zoom itself, which is much-evolved from ye olde Skype) is the structure and the emphasis on inclusion. It’s not an exaggeration to say that Friday Family Zoom helped keep my head above water over the last pandemic year, and I’m proud of, and grateful to, my family for rising to the challenge.

A blurred example of the

24 May 00:57

Where are the industrial strength R compilers?

by Derek Jones

Why don’t compiler projects for the R language make it into production use? The few that have been written have remained individual experimental products, e.g., RLLVMCompile.

Most popular languages attract many compiler implementations. I’m not saying that any of these implementations have more than a handful of users, that they implement the full language (a full implementation is not common), or that they fulfil any need other than their implementers desire to build something.

A commonly heard reason for the lack of production R compilers is that it is not worth the time and effort, because most of an R program’s time is spent in the library code which is written in a compiled language (e.g., C or Fortran). The fact that it is probably not worth the time and effort has not stopped people writing compilers for other languages, but then I think that the kind of people who use R tend not to be the kind of people who want to spend their time writing compilers. On the whole, they are the kind of people who are into statistics and data analysis.

Is it true that that most R programs spend most of their time executing library code? It’s certainly true for me. But I have noticed that a lot of the library functions executed by my code are written in R. Also, if somebody uses R for all their programming needs (it might be the only language they know), then their code might not be heavily library dependent.

I was surprised to read about Tierney’s byte code compiler, because his implementation is how I thought the R-core’s existing implementation worked (it does now). The internals of R is based on 1980s textbook functional techniques, and like many book implementations of the day, performance is dependent on the escape hatch of compiled code. R’s implementers wisely spent their time addressing user concerns, which revolved around statistics and visual presentation, i.e., not internal implementation technicalities.

Building an R compiler is easy, the much harder and time-consuming part is the runtime system.

Threaded code is a quick and simple approach to compiler implementation. R source gets mapped to a sequence of C function calls, with these functions proving a wrapper to library functions implementing the appropriate basic functionality, e.g., add two vectors. This approach has been the subject of at least one Master’s thesis. Thesis implementations rarely reach production use because those involved significantly underestimate the work that remains to be done, which is usually a lot more than the original implementation.

A simple threaded code approach provides a base for subsequent optimization, with the base having a similar performance to an interpreter. Optimizing requires figuring out details of the operations performed and replacing generic function calls with ones designed to be fast for specific cases, or even better replacing calls with inline code, e.g., adding short vectors of integers. There is a lot of existing work for scripting languages and a few PhD thesis researching R (e.g., Wang). The key technique is static analysis of R source.

Jan Vitek is running what appears to be the most active R compiler research group, at the moment e.g., the Ř project. Research can be good for uncovering language usage and trying out different techniques, but it is not intended to produce industry strength code. Lots of the fancy optimizations in early versions of the gcc C compiler started life as a PhD thesis, with the respective individual sometimes going on to spend a few years creating a production quality version for the released compiler.

The essential ingredient for building a production compiler is persistence. There are an awful lot of details that need to be sorted out (this is why research project code does not directly translate to production code, they ignore ‘minor’ details in order to concentrate on the ‘interesting’ research problem). Is there a small group of people currently beavering away on a production quality compiler for R? If there is, I can understand being discrete, on long-term projects it can be very annoying to have people regularly asking when the software is going to be released.

To have a life, once released, a production compiler needs to attract users, who are often loyal to their current compiler (because they know that their code works for this compiler); there needs to be a substantial benefit to entice people to switch. The benefit of compiling R to machine code, rather than interpreting, is performance. What performance improvement is needed to attract a viable community of users (there is always a tiny subset of users who will pay lots for even small performance improvements)?

My R code is rarely cpu bound, so I am not in the target audience, no matter what the speed-up. I don’t have any insight in the performance problems experienced by the R community, and have no idea whether a factor of two, five, ten or more would be enough.

23 May 23:03

Good-bye Price Tags … Hello Viewpoint

by Gordon Price

I’ve been doing Price Tags since 2003.  Originally it was an emailed newsletter.  Then a pdf file – like this.

 

But no matter the format, it was always about Vancouver and urbanism, with a dash of commentary.

Price Tags has become an archive about the emergence of post-Expo Vancouver – the time of Vancouverism, and my time as a resident, city councillor and a Price Tags blogger.  But for the second time in my life, I feel a generational change coming on.

The first was when I came to Vancouver at in 1978, when the turbulence of America was sweeping Canada into its own version of social change.  As a gay man, I experienced all of that, but in a city that was peaceful, prosperous and welcoming to a world of immigrants.  In the post-Expo era, Vancouver became a model of good urbanism.  (Especially its bikeways, for which I am pleased to take a little credit.)

Coming to the West End in the seventies was a good time to live in this city – especially if you bought a home.  Many of my generation have aged well as a result of that good timing, and left a new set of problems, notably affordability, to the next generations.

So if Price Tags is to thrive and be relevant, it has to offer something different while retaining it specialness – a place that when pointing to the future, we bring an historical perspective.

There’s now a half century more history since I came to Vancouver.  That’s a half century of change that two generations beyond me have experienced.  A half century of people who in that time have made Vancouver a city of colour.  A half century of the changes they have initiated.

It’s time for Price Tags to change too – with new faces and new viewpoints.  With a new name, a new look and a new logo.

Hence Viewpoint Vancouver.

We’ll keep pointing to the future, and looking back.  We’ll also look further afield that just the City of Vancouver – to Metro and the world.  We’ll add our perspective to the politics of this place (there’s an election coming up!) and to the post-pandemic world unfolding.

We have more aging to do.  More formats to explore.  Welcome to the latest.

23 May 23:02

Los Angeles (Re)discovers the Missing Middle

by Gordon Price

One of Vancouver’s Sister Cities is Los Angeles (yup, LA) – a city that builds fewer new homes per capita than almost any other in the States.  She has just done something her sibling should be aware of:

From Slate:

Christopher Hawthorne, the city’s chief design officer, held a competition, “Low-Rise: Housing Ideas for Los Angeles” to solicit new blueprints for so-called “missing middle” housing. …

The winning entrants, announced on Monday, are a reminder that multifamily housing does not need to look much different than single-family housing. Instead, these models weave apartments right into the neighborhood, with understated architecture and clever use of space.

The winning “Subdivision” submission, by a group of L.A.-based architects, rethinks the city’s back alleys as the type of narrow, quiet residential streets you might see in Japan or the Netherlands (or Boston or Philadelphia).

The Fourplex design, by the L.A.-based Omgivning and Studio-MLA, flips traditional domestic architecture on its head, putting bedrooms on the ground floor and public space on the second floor, ensuring light-filled living spaces on a crowded parcel.

The Corners winner, by Brooklyn-based architect Vonn Weisenberger, proposes adaptable units in a flexible pattern that preserves existing trees. Those buildings enclose a central courtyard for residents in the style of an old bungalow court; they also contain street-facing, ground-floor commercial or community space, which has long been banned from most residential blocks in Los Angeles.

Most of the Low-Rise winners would require various changes to city law to be allowed in most places, such as relaxed parking requirements, smaller lot sizes, and mixed-use zoning. In short, they’re illegal. …

In theory, these modest plans ought to take the “neighborhood character” argument against housing growth off the table.

Then again, the whole dialectic of NIMBY vs. YIMBY, Hawthorne contends, doesn’t accurately describe the situation on the ground. “When we actually talk to communities and neighborhoods, we find most people are in the middle. A lot of recent scholarship has clarified historic issues”—such as single-family zoning’s legacy of racial exclusion—”pandemic and wildfire have clarified others. Most people are ready to say our approach of land use and zoning in low-rise neighborhoods is not a sustainable pattern for the 21st century.” They just need help visualizing what change looks like.

Hawthorne thinks great design is the spoonful of sugar that helps the infill density medicine go down. He believes that architecture reached through careful community outreach and founded on consensus will be able to break through the single-family zoning paradigm. From this perspective, the constant kvetching over how new buildings look is not pure NIMBYism but a cry for something better. Now, something better is here—and that theory will be put to the test.

23 May 22:53

Vancouver Biennale: The Controversy du Jour

by Gordon Price

It wouldn’t be a Biennale without a controversy.

Some Vancouverites may not know that the Vancouver International Sculpture Biennale is a non-profit charitable organization that exhibits (primarily) sculpture in public spaces.  No taxpayer dollars involved, and no guaranteed permanence.  But they do know some of the pieces in prominent places very well – like this one:

 

 

On the day when ‘A-maze-ing Laughter’ was unveiled at English Bay for the 2005/7 Biennale,  curator Barrie Mowatt was on site for eight hours responding to people’s comments.  There wasn’t a single positive one.

Fortunately, he could assure them, the sculpture was only there temporarily – albeit for two years, like every piece in the Biennale  But in that time, the piece had become so well appreciated that a private donor purchased it for the City, when it was then permanently installed,

It’s not an uncommon scenario.  Likewise for ‘Trans-Am Totem’ on Quebec Street, near, appropriately, the Viaducts.  Or ‘The Giants’ on the silos of the concrete plant on Granville Island.  Or anywhere something new startles the nearby residents when it intrudes into their views and sensibilities.

So once again, the controversy begins, this time for a piece that hasn’t yet been put on display.  Say hello to the Boy Holding A Shark:

 

If he looks a bit familiar, it’s because this is another sculpture by Chen Wenling – the artist of ‘Proud Youth’, directly across False Creek, who is seemingly gazing down on the proposed site for his differently coloured mate.

Not a coincidence of course.  The idea of the Biennale is that one sculpture will be in view of another, drawing the viewers along as they discover not just another work of art but another neighbourhood, and eventually their city.  (It’s also why the Biennale sponsors the Bikennale and Walkannale*.)

‘Proud Youth’ is already a landmark on the North Shore, drawing attention and interpretation.  Joggers think it represents them.  Some find it mocking.  For many it has cultural resonance, drawn from a famous Chinese fable.   It’s art doing its thing.

In the case of ‘Boy Holding A Shark,’ it was chosen because it talks to the question of ocean sustainability.  It references the reality that sharks that were never here before are coming into our waters as ocean temperature rises, along with the sea level itself.

There’s a sadness, even a cry in the face of the boy holding the shark.  Is the animal dead?  Or is this an attempt to save it?

But for some of the locals on the south shore, it’s a view blocker, too in their face, too discordant, just inappropriate.  The complaints are flowing into City Hall.

The sculpture is to be installed this June on what looks to be an elevated podium next to the seawall, as though it was originally designed for some work that would act as a beacon on the creek.  With two works by the same artist of similar height and character on either side, the Biennale is using our great spaces and parks as one open and free public art gallery – with the controversies that inevitably ensue.

 

*Bikennale and Walkennale: “Combine love of outdoor recreation with love of great art. Self-guided walking and cycling tours are super fun and fully annotated with fascinating information on public art and points of cultural, historical and architectural interest throughout Metro Vancouver.”

 

23 May 03:18

One Chart at a Time

Jon Schwabish, YouTube, May 21, 2021
Icon

This is something for your data literacy toolbox: a series of 56 videos hosted by Jon Schwabish on different types of data visualizations and charts. "This series will help you learn about more than just the standard bar, line, and pie chart. Join experts from all walks of the data visualization field--researchers, practitioners, freelancers, government, media, and the private sector--to learn more about how to effectively communicate your own data." This is what online learning looks like in 2021. Via Mike Taylor.

Web: [Direct Link] [This Post]
23 May 03:17

Caught in the Act — When Recorded Times Aren’t

by Tony Hirst

SS7 on Rally Portugal turned out to be a nightmare for Thierry Neuville, who buckled a wheel, and Elfyn Evans, who ran into Neuville’s dust cloud after the final split.

Evans had been on something of a charge, with a stage win on the cards. By the final split, he was still matching first on the road Seb Ogier’s time on a stage that seemed to buck the trend of the previous stages, where sweeping had been an expensive affair.

But then, thick dust hanging in the road that reduced visibility to zero. Even with pace notes, it was obvious there was trouble ahead; and pace notes don’t flag extra cautions to signal the presence of a limping Hyundai i20 looming out of the murk in the middle of a single track road on slight left.

The timing screen told the sorry tale, which I reimagined on my RallyDataJunkie page for the stage:

Looking at time differences to get from one split point to the next, Evans had been up at the start of the stage, though he had perhaps started slowing:

If we look at his pace (the time taken to drive 1km), which takes into account the distance travelled between split points, we see it was good mathcing Ogier over the first half of the stage, though was perhaps slowing in the third quarter:

Looking at the ultimate transit times recorded between split points, we see Evans led the the first two splits, but dropped time to split 3.

Was that just a blip, or would Evans have pick up the pace at the end? Ogier often finishes strong, but could Evans have taken the stage? We’ll never know…

But anyone looking simply at the times on the official timing screen half an hour or so after the end of the stage might also be misled, unless they understand the vaharies of rally timing…

Here’s what the timing screen looks like now:

And here’s what my take on it is:

Spot anything different compared to my original table?

Evans was (rightly) given a recalculated time, equivalent to Ogier’s.

No other drivers were affected, so the other times stand. But if reflow my data tables, the story is lost. And if I update pace tables to used the recalculated time, and other folk use those tables, they’re not right, at least in terms of the story they tell of Evans SS7.

Who know what would have happened in that final stretch?!

The next time I run my table data, the original story will be lost. My data structures can can’t coped with revised times… so a remnant of the data story will just have to suffice here…

23 May 03:17

Intro to Altair

by kchodorow

Altair is a beautiful graphing library for Python. I’ve been using it a lot recently, but it was a real struggle to get started with. Here’s the guide I wish I’d had.

I’m going to be using https://colab.research.google.com/, but this should work fine in any other interactive notebook you want to use.

Getting started

First, you’re going to want to import numpy and pandas as well as altair. They’ll make working with data easier.

import altair as altimport numpy as np
import pandas as pd

To start with, we’ll generate a random dataframe and graph it using pandas. It’ll use matplotlib and look pretty ugly:

Instead, if you use altair:

Not much prettier, but it’s a start. There are several important things to note:

  • There are three separate parts to creating this graph:
    1. Passing in the data you’re using (the alt.Chart call).
    2. What kind of marks you want. There are dozens of options: dots, stacks, pies, maps, etc. Line is a nice simple one to start with.
    3. What x and y should be. These should be the names of columns in your dataframe.
  • From point #3 above: Altair does not understand your indexes. You have to reset_index() on your dataframe before you pass it to Altair, otherwise you can’t access the index values. (The index becomes a column named “index” above.)
  • The API is designed to chain calls, each building up more graph configuration and returning a Chart object. The default behavior for showing a returned chart is displaying it.

Using this slightly more complicated configuration, you get a more attractive graph that you can do more with. However, as you try to do more with Altair, it just feels… not quite right. And it took me a while to figure out why.

Why Altair’s API feels weird

Why doesn’t Altair let you pass in a column (instead of a column name)? Why is typing and aggregation done in strings? Why is the API so weird in general?

The reason (I think) is that Altair is a thin wrapper around Vega, which is a JavaScript graphing library. Thus, if you take the code above and call to_json(), you can get the Vega config (a JSON object) for the graph:

chart = alt.Chart(df.reset_index()).mark_line().encode(
    x='index',
    y='val'
)
print(chart.to_json())
{
  "$schema": "https://vega.github.io/schema/vega-lite/v4.8.1.json",
  "config": {
    "view": {
      "continuousHeight": 300,
      "continuousWidth": 400
    }
  },
  "data": {
    "name": "data-54155f6e9cef9af445e6523406ab9d2b"
  },
  "datasets": {
    "data-54155f6e9cef9af445e6523406ab9d2b": [
      {
        "index": 0,
        "val": 0.772999594224295
      },
      {
        "index": 1,
        "val": 0.6175666167357753
      },
      {
        "index": 2,
        "val": 0.824746009472559
      },
      {
        "index": 3,
        "val": 0.23636915023034855
      },
      {
        "index": 4,
        "val": 0.730579649676023
      },
      {
        "index": 5,
        "val": 0.507522783979701
      },
      {
        "index": 6,
        "val": 0.6662601853327993
      },
      {
        "index": 7,
        "val": 0.39232102729533436
      },
      {
        "index": 8,
        "val": 0.9814526591403565
      },
      {
        "index": 9,
        "val": 0.6932117440802663
      }
    ]
  },
  "encoding": {
    "x": {
      "field": "index",
      "type": "quantitative"
    },
    "y": {
      "field": "val",
      "type": "quantitative"
    }
  },
  "mark": "line"
}

The cool thing about Vega charts is that they are self-contained, so you can copy-paste that info into the online Vega chart editor and see it.

In general, I’ve found there are slightly confusing Python equivalents to everything you can do in Vega. But sometimes I’ve run into a feature that isn’t yet supported in Python and had to drop into JS.

Lipstick on the pig

We can give everything on this chart a nice, human-readable name by passing a title to the constructor, x, and y fields:

alt.Chart(df.reset_index(), title='Spring Rainfall').mark_line().encode(
    x=alt.X('index', title='Day'),
    y=alt.Y('val', title='Inches of rainfall'),
)

You can also use custom colors and such, but the last graph I made someone asked why it was puke-colored, so that’s left as an exercise to the reader.

Poking things

The real strength of Altair, I think, is how easy it is to make interactive graphs. Ready? Add .interactive().

alt.Chart(df.reset_index(), title='Spring Rainfall').mark_line().encode(
    x=alt.X('index', title='Day'),
    y=alt.Y('val', title='Inches of rainfall'),
).interactive()

Now your graph is zoomable and scrollable.

However, you might want to give more information. In this totally made up example, suppose we wanted to show who had collected each rainwater measurement. Let’s add that info to the dataframe, first:

rangers = (
    pd.Series(['Rick', 'Scarlett', 'Boomer'])
    .sample(10, replace=True)
    .reset_index(drop=True))
df = df.assign(ranger=rangers)

Now we’ll add tooltips to our chart:

alt.Chart(df.reset_index(), title='Spring Rainfall').mark_line().encode(
    x=alt.X('index', title='Day'),
    y=alt.Y('val', title='Inches of rainfall'),
    tooltip='ranger',
).interactive()

Which results in:

Pretty nifty! Give it a try yourself in a colab or the Vega editor, and let me know what you think!

23 May 03:12

Schrödinger's Lesbian

In 2018 I decided to leave my home country of Singapore even though I once thought I would lead my queer adult life here because it was not a bad one. I decided to leave because I had met the woman I would marry, and there was simply no path for us to lead the sort of life we wanted in both of our home countries. Being queer in Singapore is strange because on some level, it’s one of the better places to be queer in Asia.
23 May 03:12

Kahoot’s PowerPoint integration makes it easy to add a game to your presentation

by Jonathan Lamont

Kahoot, a game-based learning platform, announced a new integration with Microsoft PowerPoint that should make it easier for people to host games without leaving a presentation.

In case you haven’t heard of Kahoot, or had a chance to try it, it works similarly to games like those from Jackbox — in short, players navigate to a website on their phone or computer and enter a PIN to join the room. A game host show a shared game screen that will display questions — players answer on their device.

Kahoot has become a really fun, interactive way to test knowledge, particularly in education. For example, a teacher could cap off a presentation about a subject with a quick Kahoot game to challenge students’ learning. Now, thanks to integration with PowerPoint, that’s a lot easier to do.

To use Kahoot in PowerPoint, you’ll need to first install the Kahoot add-in. It’s available by opening a PowerPoint presentation > clicking ‘Insert’ > ‘Get Add-ins.’ From there, you can search for and add Kahoot.

Once added, presenters can create a Kahoot slide that will show their Kahoot game. It’s worth noting that users will still need to create a Kahoot game in Kahoot, but they can bring it over to the PowerPoint add-in either by logging into their Kahoot account or by copying the Kahoot PowerPoint share link from Kahoot and pasting it into the Kahoot PowerPoint add-in.

Those interested in learning more about how to use Kahoot in PowerPoint can check out this how-to from Kahoot.

Source: Kahoot

The post Kahoot’s PowerPoint integration makes it easy to add a game to your presentation appeared first on MobileSyrup.

23 May 03:11

Marvin Gaye's "What's Going On" Turns 50

50 Years ago today, Marvin Gay's album "What's Going On" was released. It's such an amazing album and if you haven't listened to it recently, why not today? The music and lyrics on this album are timeless in so many ways, both good and bad.

NPR: Remembering Marvin Gaye's Iconic 'What's Going On'

KEXP: Marvin Gaye 'What’s Going On' Day

On May 21st, 1971, Tamla-Motown released Marvin Gaye’s 11th LP, his first masterpiece, What’s Going On. Marvin used his platform as an artist to talk about what he was seeing in the world: people struggling to survive — addiction, rampant police brutality, and ecological disaster. Fifty years later, this album is as relevant as ever. On Friday, May 21st, join KEXP in celebrating a half-century of this landmark in music, while recognizing how much farther we still have to go. Because: It’s Still Going On.

There's a wealth of Marvin Gaye music on YouTube as well.

23 May 03:05

2021 Streaming Kit

by Matt

My streaming setup post last year got an amazing reception — there are similar setups being used by executives across the board, from companies fundraising to several I know of with 100B+ valuations. Since that original setup, I’ve updated my own usage of hardware and software combinations to achieve similar or better results for about a quarter of the cost. So here’s the latest and greatest, and below I’ll talk about why the changes.

Video: Camlink, cable, and tripod are still the same, but the camera goes from an A7R IV and a separate lens to an A7C with a kit lens, which saves about $3,000. You also don’t need the dummy battery because the A7C runs great off USB-C.

Lighting: More is more, so I usually use two Key Light Airs (linked above) instead of one. If I’m on the road I’ll pair two Aputure RGB lights with two Lume Cube monopods.

Audio: My best audio advice is to upgrade to an M1 Macbook Pro so your computer is fast and the fan is never on, and position the laptop out of camera view but close to you so the built-in three-mic array picks up pretty good audio from you with no cables or earpieces. (Here’s a singer recording a song on the pre-M1 16-inch version, and note she has to remove fan noise in post-processing.) For bonus points add Krisp.ai ($60/yr) so you get background noise and room echo magically eliminated in real-time.

Teleprompter: The Glide Gear is much easier to set up and way cheaper than my old recommendation. Instead of an external monitor, I use an iPad and the MacOS Sidecar feature. I still don’t have a great way to reverse the screen; in the comments, I’ll share some of what folks have recommended to me.

The above setup removes 75% of the cost without sacrificing any quality.

I’ve gone through every permutation on audio, including using a MixPre-3, NoiseAssist plugin, and a MKH416 shotgun mic ($2k+ total), but I never use that setup unless I’m recording a fancy audio-only podcast.

Why am I using the Sennheiser SC30 in the above photo? Well it was an unusual situation…I was on the side of the road, next to an RV, with logging trucks rumbling by. Sometimes you don’t always know where you need to do a broadcast. 😄

Behind the scenes! We were recording what became this panel.

23 May 03:04

Who Should Be In Charge of Response to Public Health Emergencies?

by Dave Pollard

Another little rant from Dave.


cartoon by Greg Perry in The Tyee

If and when a country decides to go to war, whether internationally or with some of its own citizens, the strategies and tactics used to combat the deemed enemy are not debated by, voted on, or decided by politicians. If they were, the war would be a lost cause. The strategies and tactics are decided on by military experts.

I would argue the same logic should apply to other types of ‘wars’, dealing with other types of emergencies. Politicians are mostly lawyers. They are as incompetent at knowing and deciding what to do in emergency situations as they are knowing and deciding how to conduct a war.

The obvious example is pandemic emergencies. The decisions should be made by public health experts, and simply implemented, without debate or discussion, by politicians and all other authorities who lack the competence to second-guess the experts. We lost the war against CoVid-19 because we let politicians, not public health experts, make the decisions. They utterly bungled the response because they were not competent to deal with it in the first place. In a handful of countries — Australia, New Zealand, Taiwan — the political leaders deferred completely to public health experts, and they alone have ridden out the pandemic with a minimum of errors and disruptions.

The same logic should apply to other emergencies, many of which are also ‘public health’ emergencies. Murders committed by police are one. Mass shootings in some gun-crazy jurisdictions are another. Deaths from poisoned street drugs, that now kill 100,000 Americans, and 5,000-8,000 Canadians, per year, double the rate of five years ago, are a third. These can all reasonably described as “epidemics”.

And then we have existential emergencies, most notably the climate emergency, that threaten us all. XR has insisted that assemblies of true representatives of all citizens, focused entirely on grappling with the emergency and not beholden to anyone else (including voters not happy with the necessary actions), should have the absolute authority to make policies to address the emergency, which politicians and lawmakers should be required to implement in their entirety and without delay.

That says a lot about the capacity and competence of political bodies to address health issues and existential issues. They are not organized, competent, or motivated to deal with such issues. If we want these emergencies addressed promptly and competently, some other group must be in charge and have the unrestricted authority to deal with them. The political, legal and economic system must be required to support them, regardless of how they feel about them. Politicians, law enforcement and regulatory bodies should have neither the authority nor the responsibility to deal with such issues, simply to abide by the orders of the group (public health officials, citizens’ assemblies, or investigative agencies) that does have the competence, expertise, and independence to make these orders, and those groups should be given both the authority and commensurate responsibility to do so.

I can hear the shudders from libertarians. We’re going to give an unelected group power to issue orders affecting everyone, with no political oversight? Well, we don’t elect generals, but we don’t demand that our elected “representatives” make or second-guess their decisions on the battlefield. We don’t elect regulatory authorities, but when the NTSB demands an incompetently-built Boeing model be grounded, politicians don’t debate whether that’s a little unfair to poor Boeing. They ground the jet.

Our political systems are bloated, corrupted by money, short-term (next-election) focused, and largely paralyzed. It is absurd to think they can be expected to deal with an emergency, especially when it’s not a political emergency but rather a health or existential emergency.

If we want these emergencies dealt with properly, we have to take the authority and responsibility of dealing with them away from elected politicians, and give them to experts who have the knowledge and capacity to present urgent, viable solutions to these emergencies, and have them implemented without political interference. Is that a scary proposition? Of course. Public health experts make mistakes (especially when they wander into the political and “public relations” arenas). Citizens’ assemblies, if they ever see the light of day, are bound to make mistakes, too.

Could it ever happen? Would politicians ever give up the reins of power outside of a full-scale military war? The dress-rehearsal of CoVid-19 suggests the answer is a resounding no. Without it, our chances of being ready for the next pandemic, which could be orders of magnitude larger than this one, or being able to reduce police murders, mass shootings, and a spiralling epidemic of street drug poisoning deaths, or being able to seriously address the existential crisis of climate and ecological collapse, are absolutely zero. We’re kidding ourselves if we believe otherwise.

23 May 03:04

2021-05-21 BC

by Ducky

Vaccination clinics

A milestone day: 50% of the total population of BC and 62% of adults have gotten at least one dose of vax!

Here’s the breakdown by age:

Statistics

+420 cases, +6 deaths, +53,160 first doses, +3,500 second doses.

Currently 319 in hospital / 107 in ICU, 4,507 active cases, 135,068 recovered.

NB: I’m going to start only giving the mRNA supply info, not the total vax supply or the AZ supply level. I’ll resume when we start using AZ again.

We have 426,030 (!) mRNA doses in the fridges; we’ll use it up in 8.5 days at last week’s rate. We have given more mRNA doses than we’d received by 4 days ago.

Charts

23 May 03:04

2021-05-21 General

by Ducky

Vaccines

New data from a UK study of Novavax is out, and it looks really good: 96.4% against COVID Classic and 86.3% against B.1.1.7, with fewer side effects than Pfizer/Moderna/AZ. (No sign of blood clots, either, but rare events like that are unlikely to show up in a trial.)

Meanwhile, a Novavax trial in South Africa looked… not as good, with efficacy of only 51% in HIV-negative people who had not had COVID before. It was significantly more effective than catching COVID Classic, however: the same study found that 5.9% of seropositive patients caught COVID vs. 8% of seronegative patients.


Participants in the UK Novavax trial are pissed off. People in the UK need proof of vax to travel to Europe, and because Novavax is not approved yet, they can’t show proof of vaccination.

One of my friends wondered if Canadians who got AZ would be able to enter the US, since it has not been approved there yet. Not to worry, the US does not require proof of vax to enter.


A study (from Feb, which I think I missed the first time around) on says that for AZ, a short dose1->dose2 interval (<6 weeks) gave about 55% efficiency after two doses, but it was boosted to 81% when they waited >12 weeks.

Note that the 55% number looks crappy, but part of the study was done in South Africa, which means B.1.351, which AZ is shit against. Except that if you draw out the dosing, it’s better! Alas, they didn’t break out the South African study separately.

However, that study also shows that people who got their second dose after 12 weeks generated fewer T cells. That means that the protection might not be as durable. We can’t find out the answer to that without time.

23 May 03:04

Approaching the many-headed hydra

by Doug Belshaw
Hercules and the hydra

One of the benefits of of studying Philosophy (aka ‘the history of ideas’) is developing the ability to consider things in the abstract. That is to say pointing to something as symptomatic of a larger/bigger truth. You might point to a potholed road, for example, and use it as an example of local councils being underfunded. Or you might point to the lack of diversity within a company and use it as an example of a structural problem with the tech sector. In neither case are you attacking the worker who has come to fix the pothole, or the company that is trying to do better in its hiring practices.

What I’ve noticed often happens in these situations is that there is an undue focus on the specifics of the situation. This leads to the wider issue either being dismissed or ignored. I’m not sure if this is a deliberate tactic or not. For example, someone might reply that the reason this particular road is potholed is because there are people driving inappropriately on it, and anyway there are more important things for councils to be spending their money on at the moment. Or someone might reply that this particular company might not look ‘diverse’ but, hey, there is more to diversity than skin colour, and anyway everyone knows there’s a problem with the tech jobs ‘pipeline’, right?

As a result, nothing happens. No change is made. Everything continues as normal except with an added soundtrack of sound and fury.

To be perfectly honest, I’m dancing around the issue a bit here by using ‘someone’ when I want to say ‘white middle-aged men’. I fit squarely into this category, yet I’m a bit apprehensive about publishing this post because of the anger — and it is usually anger — that is generated when people like me are challenged. Here’s an example.

I’m genuinely curious as to what’s going on here. Prior to therapy, I was definitely the kind of person who wanted to give my opinions on everything. It didn’t particularly matter whether I had expertise or not because who wouldn’t want to hear what I think? I still have to stop myself from doing this, and earlier in the week deleted a long response to someone’s forum question after reading it back and realising I wasn’t adding anything. (Maybe this blog post isn’t either.)

Perhaps the problem is the way we bring up boys and men in our society? I don’t know. What I do know, though, is that white middle aged men (me included!) often feel ‘attacked’ when others ask quite reasonable questions about representation and diversity. I did a lot of thinking about this after the Moodle ‘manel’ tweetstorm towards the end of 2019. There was no intention for that to be an all-white middle-aged male panel at a global event, but that’s how it turned out. We should be more cognisant of these kinds of things so they don’t come as a surprise to us. One way of saying this, I suppose, is that we should “check our privilege”.

I suppose, in practice, all I’m asking of people is for people like me to think twice before wading into a discussion with our cool ideas. If there’s already 100+ responses from those who look like us, perhaps think of other ways of contributing? Or perhaps encourage others to contribute? I don’t have any answers, but I’m pretty keen to help find ways that add some diversity to our methods of problem-solving. Goodness knows that the same ways of thinking that led to the many-headed hydra of problems facing our world aren’t going to get us out of it.


Image: CC0 Rijksmuseum

The post Approaching the many-headed hydra first appeared on Open Thinkering.
23 May 03:03

50% of Canadians have had one shot

by jnyyz

So we have reached the point where half of all Canadians have had at least one shot of a COVID vaccine. This is good news, but it is just one more step in a long battle with the pandemic. Leading up to this point, there were a couple of ridiculous news articles that said we were “out vaccinating” the US, but this is far from the truth.

What was being pointed out was that the rate of vaccinations per capita for Canada recently passed that of the US, as shown in this chart.

However, if you look at the cumulative number of shots over time, you see that we are far behind the US in reality.

A quick look at the data from the New York Times shows that although only 49% of Americans have had one shot, 38% have had both shots. This would indicate that those who want the vaccine have ready access to both shots, unlike the current situation in Canada.

It is still too early to judge the effect of vaccine hesitancy in the US versus Canada, although polls have shown that about 50% of Republicans don’t want the shot. This was also borne out when Republicans in the House wanted to ditch the masks in the chamber and Speaker Pelosi said no since only 75% of the total had been vaccinated. (Every member of the House has had access to vaccines since January). It is too bad that the pandemic response has been such a political issue in the US, and one hopes that Canadians will be more reasonable.

Despite the vaccine hesitancy in the US, ironically their march towards herd immunity is helped by the fact that about 10% of the population has already had COVID, versus less than 4% in Canada.

At any rate, here’s hoping that the recently announced reopening plans in Ontario do not drive the numbers back up, and that we can return to some degree of normalcy by a year from now. Looking forward to the point this summer when small group organized group bike rides will be allowed. Looks like the middle of June is the earliest possible date for groups of up to 10. At least this time, the plan has some clear metrics that indicate when further reopenings can occur.

23 May 03:02

'An enormous hiring challenge': Canadian tech companies face U.S. hiring spree

mkalus shared this story from Comments on: ‘An enormous hiring challenge’: Canadian tech companies face U.S. hiring spree.

TORONTO — Jack Newton has big plans for the next two years.

His Burnaby, B.C. legal technology company Clio is generating so much business to add 250 staff to the 600-person workforce by the end of the year and in 2022, he hopes to be employing at least 1,000 people.

But there’s some big obstacles standing in the way of that goal.

With COVID-19 generating demand for e-commerce and other digital business practices, many tech companies have been scrambling to staff up. With many offices temporarily closed due to pandemic restrictions, these comanies are looking further afield for talented people who can work remotely.

That’s caused foreign tech giants to eye Canadians at a dizzying pace and triggered plenty of competition for home-grown companies like Clio.

“We’ve got an enormous hiring challenge ahead of us,” said Newton, who co-founded the company in 2008.

“With the tech boom that’s been happening in Canada, the U.S. and worldwide, the demand for tech talent is higher than it’s ever been…The hiring landscape has dramatically changed for Canada virtually overnight.” 

Microsoft, DoorDash, Amazon, Google, Wayfair, Twitter, Pinterest, Reddit and Netflix all announced Canadian hiring plans this year. Many will place workers in technical or engineering roles and some are also opening new offices or innovation centres to house them.

Canada’s own tech giants are in the mix, too. Ottawa-based Shopify Inc. rang in the year with the goal of hiring 2,021 technical staff by the end of 2021 and Wattpad Corp. will add 100 workers in Halifax and Toronto. 

Brendan King, who started Saskatoon software company Vendasta in 2008, is no stranger to the challenge of hiring for these roles.

“We’re getting a bunch of folks out of university but we still can’t keep up with engineering talent and product talent,” he said.

“We need to hire folks who … have been there, done that and can share their experience, or we need to train them and that’s a really slow, long process.”

Keeping talent at home is tough. Canada has long grappled with the “brain drain,” where people educated here flock south of the border for jobs, whether for financial or lifestyle reasons.

A 2018 study based on LinkedIn profiles of graduates from the Universities of Toronto, British Columbia and Waterloo in 2015 and 2016 revealed 66 per cent of software engineering and 30 per cent of computer science students were leaving Canada for work after graduation.

The study’s U of T and Brock University researchers found students moved because they felt a big employer would boost their future hiring prospects, their scope of work would be larger and they were promised higher salaries.

Hired, an employment platform publishing average annual salaries, said Toronto tech workers earned an average of $109,000 a year in 2020, up 10 per cent from 2019.

The average tech worker salary in the U.S. that year was roughly $177,463 and the global average amounted to $158,015.

With 527 staff, King’s been lucky to recruit hires many smaller businesses can’t afford, but even Vendasta isn’t immune to the effects of the pandemic.

“We’ve lost some people who decided to go work for other companies remotely, but we’ve also got a couple of people from Amazon,” he said.

Prior to COVID-19, Vendasta attended hiring fairs in Toronto and Vancouver, where big-name companies loomed large.

King would invite prospective hires to a restaurant to pitch the merits of Saskatchewan, but often found candidates were already prepared to move because the province is home to affordable housing and shorter commutes and the scope of work at Vendasta is large.

“It’s not all about location for people, or money,” said King. “It’s a lot about the kind of work you’re doing. Is it fulfilling?”

Caitlin MacGregor feels similarly.

Her Waterloo, Ont.-based company, Plum, helps businesses use artificial intelligence to hire and retain talent, but when adding to its own team, co-founder and chief executive MacGregor prefers to highlight unconventional perks.

For example, Plum offered Friday afternoons off during the pandemic to boost mental health and give staff time to spend with family or on hobbies.

“Knowing that they’re not burnt out at Plum, that they’re supported and we are going above and beyond ends up being really good to counteract those higher offers,” MacGregor said.

She also puts Plum’s own software to work. Rather than targeting high-profile candidates everyone else wants, MacGregor uses Plum to identify people with transferable skills or who are likely to excel in specific roles.

“We’ve been able to tap into talent that hasn’t necessarily had that perfect track record yet and really hire for potential,” she said. 

“We often are seeing people that those U.S. competitors aren’t even looking at.”

Meanwhile, Clio has adopted the same strategy as U.S. competitors by advertising for remote work positions and looking farther afield for talent.

Clio will be open to new hires in cities where it has no footprint, but keep its Vancouver, Toronto, Calgary and Dublin spaces as collaboration hubs and for people who prefer an office.

If new hires are in regions with “talent density,” Clio will consider opening hubs there too.

Newton hopes this flexibility will be attractive to workers and prove how bold Clio is.

“There’s an opportunity here for Canadian companies and a need for Canadian companies to step up their game in a big way and compete at this global level,” he said. 

“Canadian companies…should be looking at (this) as the kind of opportunity that comes along once every few decades, if you’re lucky.”

This report by The Canadian Press was first published May 21, 2021

Companies in this story: (TSX:SHOP)

Tara Deschamps, The Canadian Press

23 May 03:01

Is math complete? consistent? decidable?

by Andrea

Veritasium: You Can’t Prove Everything That’s True. (YouTube, 34min) “Not everything that is true can be proven. This discovery transformed infinity, changed the course of a world war and led to the modern computer.”

23 May 03:01

Apple Support Document Clarifies Lossless Streaming Details

by John Voorhees

In June, Apple Music will offer the option of streaming in CD-quality and high-resolution lossless formats. There was initial confusion about which Apple devices will support lossless streaming, but the company has clarified things with a support document.

The new support document confirms what was announced earlier this week. Lossless is supported by iPhones, iPads, and Macs using their built-in speakers and wired headphones, receivers, and powered speakers. Lossless audio will stream to AirPods, AirPods Max, and Beats wireless headphones, but it won’t be lossless because they rely on Bluetooth, which is inherently lossy.

Regarding the Lightning to 3.5 mm cable for the AirPods Max, Apple’s support document says:

The Lightning to 3.5 mm Audio Cable was designed to allow AirPods Max to connect to analog sources for listening to movies and music. AirPods Max can be connected to devices playing Lossless and Hi-Res Lossless recordings with exceptional audio quality. However, given the analog to digital conversion in the cable, the playback will not be completely lossless.

It’s also worth noting that Apple’s Lightning to 3.5mm adapter that can be used to connect wired headphones to devices only supports up to 24-bit/48 kHz lossless audio. A digital-to-analog converter is necessary for 24-bit/192 kHz playback.

Apple says HomePods and HomePod minis will be updated and an unspecified date in the future to support lossless playback, but they don’t currently support it.

It wasn’t clear initially which Apple TVs will support lossless streaming. Apple’s support document suggests that it’s only the Apple TV 4K, connected to a receiver via HDMI, leaving Apple TV HD owners out of luck. Moreover, the Apple TV 4K only supports lossless playback at 24-bit/48 kHz. However, the wording of the support document leaves the possibility that a future update may make Hi-Res Lossless available.

Finally, only Apple Music content supports lossless streaming. iTunes Store content and Apple Music’s broadcast radio, Apple Music 1, other live radio content, and music videos will not stream losslessly.


Support MacStories Directly

Club MacStories offers exclusive access to extra MacStories content, delivered every week; it’s also a way to support us directly.

Club MacStories will help you discover the best apps for your devices and get the most out of your iPhone, iPad, and Mac. Plus, it’s made in Italy.

Join Now
23 May 03:00

China’s Mars rover drives across planet a week after landing | Mars

mkalus shared this story from The Guardian.

China’s first Mars rover has driven down from its landing platform and is now roaming the surface of the planet, China’s space administration has said.

The solar-powered rover touched Martian soil at 10:40am on Saturday Beijing time (0240 GMT), the China National Space Administration said.

China landed the spacecraft carrying the rover on Mars last Saturday, a technically challenging feat more difficult than a moon landing, in a first for the country. It is the second country to do so, after the United States.

Named after the Chinese god of fire, Zhurong, the rover has been running diagnostics tests for several days before it began its exploration on Saturday. It is expected to be deployed for 90 days to search of evidence of life.

The US also has an ongoing Mars mission, with the Perseverance rover and a tiny helicopter exploring the planet. Nasa expects the rover to collect its first sample in July for return to Earth in a decade.

China’s ambitious space plans include launching a crewed orbital station and landing a human on the moon. In 2019, China became the first country to land a space probe on the little-explored far side of the moon, and in December returned lunar rocks to Earth for the first time since the 1970s.

23 May 03:00

Vancouver waives permit fees for restaurant patios just in time for warmer weather

mkalus shared this story .

With patio season upon us, Vancouver's city council has voted to waive patio permit fees for 2021 in light of the extreme financial difficulties many restaurants have faced during the pandemic.

Now, permit fees for both small and large patios across the city have been waived.

"It's really considerate of the city to do that," says Ian Tostenson with the B.C. Restaurant and Foodservices Association.

"At a time where restaurants have been struggling ... every little bit helps."

A typical permit fee in Vancouver can range anywhere from around $450 up to $2,800 depending on size.

The city estimates waived fees will result in around $1.2 million in reduced revenue for the city.

"As we continue to head towards re-opening and recovery, this is one more way we're supporting small businesses while keeping people safe," said Mayor Kennedy Stewart.

Refunds will be issued to any business that has already paid its annual permit fee.

Tostenson predicts this move will encourage more restaurants, especially smaller establishments to commit to building their own patios.

Temporary patio program

Last year, the city introduced a temporary expedited patio program which facilitated quick, low-cost patio options for restaurants. Those permits are also free.

The program has been popular with 544 patios approved for this summer — mostly on public property like curbsides and sidewalks.

Tostenson is hopeful the program lives beyond its temporary status with many of those patios becoming permanent.

"It adds to the ambience of the city," he says. "As tourism comes back, we would be more like European cities where people live on their patios all summer."

He believes it would be the wrong move for cities to suddenly cancel these programs after the pandemic as restaurants are going to take years to recover from the financial losses.

"There's going to have to be some reasonable accommodations," he said.

Supporting local businesses

Temporary patio programs have helped many businesses across B.C. during the pandemic. Programs exist in many cities including Surrey, Kamloops and Abbotsford.

Port Coquitlam Mayor Brad West says that more than 25 businesses in his city have taken advantage of a program to expand onto outdoor public spaces, whether that's with outdoor seating, patios or even displays.

"Our local businesses in Poco are really the heart and soul of the community and they are really valued by our residents," says West.

The city also waived all fees for the program, which can cost up to a couple of thousand dollars, he said. And to make the process easier during the pandemic, the city removed red tape by eliminating licenses for the expansions.

"Every time you hear a politician speak right now, they're talking about how we're all in this together," he says, adding that now is the time to prove it.