Shared posts

14 Oct 04:23

PG&E providing shapefiles, instead of a working map for shutoffs

by Nathan Yau

Here in northern California, PG&E is shutting off power to thousands of households in efforts to prevent wildfires. Luckily, the area I live is just outside of the shutoff areas, but for others, a map of what’s up would be useful, right?

However, instead of a map, which is “temporarily unavailable” at the time of this writing, PG&E is providing shapefiles. I mean, that’s kind of nice for people who like to make maps, but it’s not so great for the rest. There’s a metaphor in there somewhere.

At least you can keep track with the San Francisco Chronicle:

Tags: PG&E, shapefile

14 Oct 04:22

Why do I like Denotational Design?

by Eric Normand

Denotational Design is a abstraction design process created by Conal Elliott. I like it because it really asks you to step back and design the meaning of the abstractions before you implement them. In this episode, I talk about why I like it, what it is (step-by-step), and why it’s not about static types.

Video Thumbnail
Why do I like Denotational Design?

Denotational Design is a abstraction design process created by Conal Elliott. I like it because it really asks you to step back and design the meaning of the abstractions before you implement them. In this episode, I talk about why I like it, what it is (step-by-step), and why it's not about static

Transcript

Eric Normand: Why do I like Denotational Design? In this episode I hope to explore this really cool design process that uses Functional Programming. Talk about why I like it and also talk a little bit about the difficulties using it in a statically typed versus a non-typed language.

Hi, my name is Eric Normand and I help people thrive with Functional Programming. I was asked on Twitter by Scott Nimrod a really great question. I’ll read the question. It’s actually got two parts to it, but I’ll read it. The question is “I’m curious to learn why you are a fan of denotational design, even though it’s more challenging in a dynamic language like Clojure?”

That’s got two parts really. The first part is, “Why do you like denotational design?” Let me address that one first. Denotational design is a cool design process. In fact, it is a design process that has borne real fruit. Denotational design is the process that has been elaborately developed by Conal Elliott. He used it to create Functional Reactive Programming, which you have probably heard of.

Functional Reactive Programming has boomed into several different reactive style paradigms. It’s a real thing that helps make new things in the world. It does it at a very low level, very abstract. It creates a lot of blooming, like different languages implementing in different ways, offshoots, things that aren’t FRP, but were inspired by FRP. That’s functional reactive programming by the way.

He’s currently using it to rethink and redesign deep learning, neural networks, and back propagation and all that. I’m looking forward to that. The work is still in progress so there’s not much to report on yet, but there’s talks out there.

I like that it’s a real design process. As our industry matures we’re going to need real processes for coming up with these novel things.

How do you actually model a thing in the world? We don’t know how to do that. Not in a step-by-step process. Not in a way that we can collaborate well with each other on.

We’re just kind of ad hoc, making things up, designing them on a whiteboard, drawing arrows and things. This is a step-by-step principle process. From my exploration of it, I think it’s really cool.

I particularly like that the first step is kind of a “Let’s step back from any notion of implementation,” because we’re doing design here. We don’t want to jump in and say, “An image is an array of pixels.”

That’s too soon yet that’s where most of us start. If we’re going to start, we’re bringing a lot of implementations baggage into our design before we’ve even thought about what we wanted to do.

I think that this is a very important step that we have to take ourselves. We say, “Oh, but it’s got to be an array of pixels because that’s the most efficient thing for the library I’m using, but Oh”

You’re choosing a library already? Step back for a second and think. What is an image? What does it mean? What does it mean to have an image or to be an image? What does it mean?

Conal Elliott had a two-and-a-half-hour lecture. He goes over how he would design an image system, a graphic system.

He said in his system, “An image is just a function from a pixel location, so an X, Y coordinate to color, where X, Y are in the real number space. It is continuous. It’s not like an integer, like an array index. It is real numbers. You can ask for any point in that X, Y space and get a color for it.”

This is stepping way back and saying, “What does it mean to be an image?” You might disagree with that definition, but it is a much more abstract notion of image than array of pixels. That’s what’s important, is that he took that step back and said, “It’s a mapping from location to color and I can represent that as a function.” Functions are mappings.

I like that stepping back, going back to first principles, really rethinking the definition of something. Another step in this process…I will go over the process just after I talk about why I like it. The other thing is he uses algebraic properties and category theory. I think algebraic properties are a very good indicator that you are, “on to something” in the design.

When we’re making design decisions, we need some assurance, something to follow to see if we’re getting somewhere, if we’re going in a good direction. Algebraic properties seem to be a pretty good way to do that. This is my opinion, of course, but it’s why I like this process. I’m not sure what else you would choose besides something like developer ergonomics, or efficiency, or something like that.

Algebraic properties are a good gradient to follow to get to a good design. That’s why I like denotational design. I’ve used it myself as a way of stepping back and thinking through what something means, and then bringing that forward into an implementation eventually.

I have watched and read as much as I’ve been able to find that was accessible to me and my level of understanding of category theory and stuff. I’ve watched as much as I could, read as much as I could on denotational design. I’ve even given talks where I’ve tried to come up with a process behind it, like a step-by-step process.

Unfortunately in all the material I’ve found, it starts off step-by-step. They’ll say, “OK, this is the first step. This is the second step,” then there’s no more third and fourth, no two, three…It trails off into, “Isn’t this stuff cool?”, “Isn’t this nice?”, “Look where we’ve been.” There’s no more steps.

I’ve watched it and re-watched it, trying to see the steps, doing it myself and saying, “Where did the steps go?” This is my overlaying on him. This is not what he’s calling denotational design. It’s what I’ve managed to pull out of his material on denotational design. I would love to collaborate with him to come up with a concrete list of steps to do.

These are the four steps that I see that are clear enough. It started out as three. Then I’ve used it a bunch and I said, “No, there’s a fourth step in here that I’m skipping.” Steps are important because you need to be able to teach it. If you can’t say, “Now, we’re doing this step,” someone might get lost. Feel like, “I’m doing what you are doing, which is just wandering around.” No, I’m not wandering around. I’m going on this path, step-by-step.

This first one is to…I think of it as zenning out and forgetting all the implementation assumptions that you have made. Every time you’ve made let’s say a computer graphics system, every computer graphics system you’ve made, and introspecting, meditating on it, what is an image? You just ask this very basic question and get at some fundamental idea.

You empty your mind, you go beginner’s mind, and you just really try to think, what is an image? The same thing like, well, if I have a teacup, and I break it, is it still a teacup? That kind of question, very Zen Kōan kind of question. That’s where you got to go. It’s like a philosophical question about meaning. What does an image mean?

Then you do that, and you come up with a definition. Something that you can encode in your language. He uses Haskell. He often will use a function like image as a mapping, as a function from a point on a plane to color, so X,Y coordinate to color. Then color, what is color? You could ask that question. Or you could just cop out and just say, “Oh, it’s just an RGB.”

Whatever, whatever you do, but that image question is the one he was after so that’s the one he does in the video. Then you explore this. You say, “Well, if I have this type, it’s a function type, then what operations can I do on this type? Can I express all the things that I expect to be able to express? Can I translate the image?”

Yes, because I can make a function that takes an image and returns a new function that translates by adding the X and the Y and you can see how it’s done. You just elaborate and explore that definition. What does this allow me to do? Can I find some minimal set of operations that other operations can be defined in terms of? You’re exploring it a lot based on the ease of implementing.

How clear is it to implement this operation using the type that I have? This is something that I’ve added myself. I don’t remember Conal ever talking about this, but design in other domains and other processes is very often incremental. You don’t get it right the first time.

You have to go back and revise and you make an attempt in a certain direction, and you learn something, and you bring that back to the beginning. You start over and you make a new thing. In his presentations, it’s usually very linear, which is a good way to present it.

I think it’s important to remember that you might not get the image definition correct the first time. The best possible definition. You’re going to have to step back again, with the stuff that you’ve learned and incorporate that into your definition.

The next thing that I see in his steps is that he starts to align things with category theory concepts. A lot of times, you’ll say, “Whoa, that image is actually a functor.” You see because we’re doing this transformation like a translation or a rotation as a functor on an image.

You start to align these things with the category theory concepts, with algebraic, abstract algebra kinds of things. That helps guide and mold the design, the order of the arguments and things. You start to see, oh yeah, this will fit in here and this fits in there because category theory, one way of looking at it is a kind of an algebra of composition. How do functions and objects types, how do they fit together?

That’s what that is. That’s what you’re doing, is you’re trying to align it so that it fits and all these things. I actually think that that’s a very fruitful way of finding some kind of gradient that you can follow to find the good design. There are others, like I said, developer ergonomics is one, performance is another. Those are things you could follow.

Then the interesting thing about this is that at this point he’s implemented very little. He has not implemented a way to draw these images on the screen, for instance. He just has defined it as a type. Some functions are implemented because he can implement them easily in terms of other things.

I talked about the translate, it’s very easy because you can just say, will translate returns a new image with the X and the Y added to this other X and Y. It just moves it. You haven’t defined how to make one of these images yet, you just know the type. That’s one of the nice things about type systems is they give you a thing you can reason about without actually having an implementation. That’s pretty cool.

Then the final thing is actually implementing it. You have the design. You’ve gone through this incremental process of design. You’ve iterated on it multiple times, you’ve gotten it very clean and nice before you’ve implemented it. Now you know exactly what you need to implement. Often that implementation is very straightforward. Sometimes it’s still hairy because you’re dealing with another system.

What you need to develop and design…implement. Sorry, I don’t want to use the word design.

What you need to implement is very clear. Well, I forgot what I want to say. All right. Let’s talk about the second part. The second part of this question. I’ll read the question again. I’m curious to learn why you are a fan of denotational design, even though it’s more challenging in a dynamic language like Clojure.

Like I said, Conal Elliot uses Haskell for these things. Haskell as a static type system where category theory can be expressed pretty well.

The types let him reason about the meaning of the system, before he even implements it. Why closure? Why wouldn’t I do this in Haskell? Is it more challenging in Clojure?

I want to start this off by saying I don’t want to compare Clojure to Haskell in this episode. That’s not what this is about. I’m trying to address this very specific question about whether it is more challenging in Clojure to do denotational design.

If I say anything about Haskell, I’m not saying it’s bad. I like Haskell. It’s a great language. I used to work in Haskell. Right now, I prefer Clojure, so you’ll know my bias is there, but that’s not what I’m talking about right now.

The first thing I want to say is for doing denotational design, Haskell isn’t perfect either. It’s challenging in Haskell. I’ll name a few things that are either impossible or not really helped by Haskell. Haskell has no type for real numbers. Most languages don’t. How do you represent a continuous number with arbitrary precision?

We don’t have a good way of doing that, especially an irrational number. How do you represent that? That’s the first thing. It’s something that comes up in forums a lot. People are asked, “You say you want real numbers,” but that’s impossible. If you try to compare two irrational numbers, you never know if like one more digit, they’re going to be different. That’s a challenge. This is something that he thinks is important for the domain model, but it’s not. It doesn’t happen in Haskell.

Another thing is, when you’re talking about say, the Monad laws or the Functor laws, associativity, you’re talking about equality between two different expressions. If you’re talking about commutativity, F of A and B = F of B and A.

What if A and B are functions and it returns a function? You can’t do that equality comparison. Conal talks about this as well in his talk. He’s like, “You know this is not valid Haskell.” You cannot do equality comparison between functions and get the answer you’re expecting.

If they happen to be exactly the same function like they’re both assigned to this variable, they’re both given the same name and you know A=A. Yeah sure, but if they were produced in two different ways, there’s no way to compare the two functions to see that they’re going to always have the same return value for all arguments. There is no way to do that.

Finally, commutativity and associativity, very important properties. There is no way the type system helps you with that. There’s no way to express that in Haskell. When you develop, let’s say, a monoid, because we’re talking about associativity, you just have to trust that the function you give it is associative. The type system can’t check that for you.

How do you check for equality between functions and for these algebraic properties? You could use property-based testing and Haskell has a good property-based testing system. Probably several. Clojure has one as well so we do the same thing there.

Now I want to talk about whether it’s hard to do denotational design in Clojure. I do think it’s a little harder than in Haskell, but I also think that most of the design part is happening in your head. You’re making little notes, like “Oh, this type of this function. Type of image is this.”

That helps you, but you’re not running that program through the compiler to have it check it for you, because you don’t have anything for it to run.

Maybe people have a workflow for testing out types that don’t have any instances of them. You know what I mean? There’s no function that has that type. Can you still write a program that runs it? I don’t know, I’m not sure. If you could, then it would be easier in Haskell. What I’m saying is, most of the reasoning that’s happening in your head. The Haskell type system that you’re reasoning about in your head helps. I’ve been there. I worked in Haskell.

I have internalized enough of the Haskell type system. Certainly not all, OK. I’m not a Haskell expert or anything, but I’ve internalized enough of it that I can do that in my head even in Clojure. I do make notes about the types. I do make notes about, “OK, this is an image. It’s going to take a X, Y coordinate and it’s going to return a color.” I do make notes about that.

Yes, it is a little bit more challenging, but it’s 90 percent of the work is done in your head anyway, so it’s not a big change. I have used spec a little bit to help put the design, but it’s a little bit cumbersome to do it. I’m going to keep trying to use spec to do that. Spec is a Clojure library for defining the types, structure, and values of arguments that you’re interested in.

I hope to find a way of doing that, of using spec to maybe even get a leap over Haskell, because it lets you automatically create generators for property-based testing. You’re able to talk about the values because the checks happen at runtime. It’s not as good about reasoning about functions. Clojure doesn’t have currying, which is helpful. I still find that the process of stepping back, zenning out, exploring the definition, what things would look like.

Those two steps don’t require the type system, don’t require type checking. The construction along the lines of category theory abstractions, that does get into that category or that difficult stuff. Like I said, those very important algebraic properties aren’t helped by the Haskell type system either, so I don’t feel like Clojure is that far behind in it.

I do worry that it does require you to know the Haskell type system, in the sense that I’ve internalized it. A Clojure programmer would look at what I’m doing and say, “Oh, it’s too much work. It’s too abstract,” whereas I’m just doing very concrete steps that I’ve learned through experience from the Haskell system. I’m a little worried about that, but I think we can work through it.

I hope that answers that two-part question. I’ll read the question again. This question’s from Scott Nimrod. Got it on Twitter. It’s, “I’m curious to learn why you’re a fan of denotational design even though it’s more challenging in a dynamic language like Clojure.”

To sum this up, I think that denotational design is a lot less about static typing than this question implies. It’s a lot less about types. It’s about design. It’s about going back to first principles, building things up, understanding how things compose, and following a different gradient from what most people use when they design.

Most people use something like either performance — what they perceive would be faster — or developer ergonomics like, “Oh, look what I can do if I put the argument over here. It lets me write this which feels cooler. It’s shorter.”

Something like that, as opposed to algebraic properties, which I think they have precedence in reality. [laughs] Let’s put it like that. Associativity’s a pretty common property at least around my neck of the woods.

I hope that answers the question. Thank you so much, Scott, for the question. I know you have a few more, but I’ll save those for other episodes.

If you like this episode, you can find all the past episodes at lispcast.com/podcast. There you’ll find audio, video, and text transcripts of all the episodes. You’ll also find links to subscribe in whatever way you want. Please do subscribe. That way you’ll get all the future episodes.

You’ll also find links to social media so you can ask me questions too. I hope to answer them soon.

This has been my thought on functional programming. My name is Eric Normand. Thanks for listening and rock on.

Transcript

Eric Normand: Why do I like Denotational Design? In this episode I hope to explore this really cool design process that uses Functional Programming. Talk about why I like it and also talk a little bit about the difficulties using it in a statically typed versus a non-typed language.

Hi, my name is Eric Normand and I help people thrive with Functional Programming. I was asked on Twitter by Scott Nimrod a really great question. I’ll read the question. It’s actually got two parts to it, but I’ll read it. The question is “I’m curious to learn why you are a fan of denotational design, even though it’s more challenging in a dynamic language like Clojure?”

That’s got two parts really. The first part is, “Why do you like denotational design?” Let me address that one first. Denotational design is a cool design process. In fact, it is a design process that has borne real fruit. Denotational design is the process that has been elaborately developed by Conal Elliott. He used it to create Functional Reactive Programming, which you have probably heard of.

Functional Reactive Programming has boomed into several different reactive style paradigms. It’s a real thing that helps make new things in the world. It does it at a very low level, very abstract. It creates a lot of blooming, like different languages implementing in different ways, offshoots, things that aren’t FRP, but were inspired by FRP. That’s functional reactive programming by the way.

He’s currently using it to rethink and redesign deep learning, neural networks, and back propagation and all that. I’m looking forward to that. The work is still in progress so there’s not much to report on yet, but there’s talks out there.

I like that it’s a real design process. As our industry matures we’re going to need real processes for coming up with these novel things.

How do you actually model a thing in the world? We don’t know how to do that. Not in a step-by-step process. Not in a way that we can collaborate well with each other on.

We’re just kind of ad hoc, making things up, designing them on a whiteboard, drawing arrows and things. This is a step-by-step principle process. From my exploration of it, I think it’s really cool.

I particularly like that the first step is kind of a “Let’s step back from any notion of implementation,” because we’re doing design here. We don’t want to jump in and say, “An image is an array of pixels.”

That’s too soon yet that’s where most of us start. If we’re going to start, we’re bringing a lot of implementations baggage into our design before we’ve even thought about what we wanted to do.

I think that this is a very important step that we have to take ourselves. We say, “Oh, but it’s got to be an array of pixels because that’s the most efficient thing for the library I’m using, but Oh”

You’re choosing a library already? Step back for a second and think. What is an image? What does it mean? What does it mean to have an image or to be an image? What does it mean?

Conal Elliott had a two-and-a-half-hour lecture. He goes over how he would design an image system, a graphic system.

He said in his system, “An image is just a function from a pixel location, so an X, Y coordinate to color, where X, Y are in the real number space. It is continuous. It’s not like an integer, like an array index. It is real numbers. You can ask for any point in that X, Y space and get a color for it.”

This is stepping way back and saying, “What does it mean to be an image?” You might disagree with that definition, but it is a much more abstract notion of image than array of pixels. That’s what’s important, is that he took that step back and said, “It’s a mapping from location to color and I can represent that as a function.” Functions are mappings.

I like that stepping back, going back to first principles, really rethinking the definition of something. Another step in this process…I will go over the process just after I talk about why I like it. The other thing is he uses algebraic properties and category theory. I think algebraic properties are a very good indicator that you are, “on to something” in the design.

When we’re making design decisions, we need some assurance, something to follow to see if we’re getting somewhere, if we’re going in a good direction. Algebraic properties seem to be a pretty good way to do that. This is my opinion, of course, but it’s why I like this process. I’m not sure what else you would choose besides something like developer ergonomics, or efficiency, or something like that.

Algebraic properties are a good gradient to follow to get to a good design. That’s why I like denotational design. I’ve used it myself as a way of stepping back and thinking through what something means, and then bringing that forward into an implementation eventually.

I have watched and read as much as I’ve been able to find that was accessible to me and my level of understanding of category theory and stuff. I’ve watched as much as I could, read as much as I could on denotational design. I’ve even given talks where I’ve tried to come up with a process behind it, like a step-by-step process.

Unfortunately in all the material I’ve found, it starts off step-by-step. They’ll say, “OK, this is the first step. This is the second step,” then there’s no more third and fourth, no two, three…It trails off into, “Isn’t this stuff cool?”, “Isn’t this nice?”, “Look where we’ve been.” There’s no more steps.

I’ve watched it and re-watched it, trying to see the steps, doing it myself and saying, “Where did the steps go?” This is my overlaying on him. This is not what he’s calling denotational design. It’s what I’ve managed to pull out of his material on denotational design. I would love to collaborate with him to come up with a concrete list of steps to do.

These are the four steps that I see that are clear enough. It started out as three. Then I’ve used it a bunch and I said, “No, there’s a fourth step in here that I’m skipping.” Steps are important because you need to be able to teach it. If you can’t say, “Now, we’re doing this step,” someone might get lost. Feel like, “I’m doing what you are doing, which is just wandering around.” No, I’m not wandering around. I’m going on this path, step-by-step.

This first one is to…I think of it as zenning out and forgetting all the implementation assumptions that you have made. Every time you’ve made let’s say a computer graphics system, every computer graphics system you’ve made, and introspecting, meditating on it, what is an image? You just ask this very basic question and get at some fundamental idea.

You empty your mind, you go beginner’s mind, and you just really try to think, what is an image? The same thing like, well, if I have a teacup, and I break it, is it still a teacup? That kind of question, very Zen Kōan kind of question. That’s where you got to go. It’s like a philosophical question about meaning. What does an image mean?

Then you do that, and you come up with a definition. Something that you can encode in your language. He uses Haskell. He often will use a function like image as a mapping, as a function from a point on a plane to color, so X,Y coordinate to color. Then color, what is color? You could ask that question. Or you could just cop out and just say, “Oh, it’s just an RGB.”

Whatever, whatever you do, but that image question is the one he was after so that’s the one he does in the video. Then you explore this. You say, “Well, if I have this type, it’s a function type, then what operations can I do on this type? Can I express all the things that I expect to be able to express? Can I translate the image?”

Yes, because I can make a function that takes an image and returns a new function that translates by adding the X and the Y and you can see how it’s done. You just elaborate and explore that definition. What does this allow me to do? Can I find some minimal set of operations that other operations can be defined in terms of? You’re exploring it a lot based on the ease of implementing.

How clear is it to implement this operation using the type that I have? This is something that I’ve added myself. I don’t remember Conal ever talking about this, but design in other domains and other processes is very often incremental. You don’t get it right the first time.

You have to go back and revise and you make an attempt in a certain direction, and you learn something, and you bring that back to the beginning. You start over and you make a new thing. In his presentations, it’s usually very linear, which is a good way to present it.

I think it’s important to remember that you might not get the image definition correct the first time. The best possible definition. You’re going to have to step back again, with the stuff that you’ve learned and incorporate that into your definition.

The next thing that I see in his steps is that he starts to align things with category theory concepts. A lot of times, you’ll say, “Whoa, that image is actually a functor.” You see because we’re doing this transformation like a translation or a rotation as a functor on an image.

You start to align these things with the category theory concepts, with algebraic, abstract algebra kinds of things. That helps guide and mold the design, the order of the arguments and things. You start to see, oh yeah, this will fit in here and this fits in there because category theory, one way of looking at it is a kind of an algebra of composition. How do functions and objects types, how do they fit together?

That’s what that is. That’s what you’re doing, is you’re trying to align it so that it fits and all these things. I actually think that that’s a very fruitful way of finding some kind of gradient that you can follow to find the good design. There are others, like I said, developer ergonomics is one, performance is another. Those are things you could follow.

Then the interesting thing about this is that at this point he’s implemented very little. He has not implemented a way to draw these images on the screen, for instance. He just has defined it as a type. Some functions are implemented because he can implement them easily in terms of other things.

I talked about the translate, it’s very easy because you can just say, will translate returns a new image with the X and the Y added to this other X and Y. It just moves it. You haven’t defined how to make one of these images yet, you just know the type. That’s one of the nice things about type systems is they give you a thing you can reason about without actually having an implementation. That’s pretty cool.

Then the final thing is actually implementing it. You have the design. You’ve gone through this incremental process of design. You’ve iterated on it multiple times, you’ve gotten it very clean and nice before you’ve implemented it. Now you know exactly what you need to implement. Often that implementation is very straightforward. Sometimes it’s still hairy because you’re dealing with another system.

What you need to develop and design…implement. Sorry, I don’t want to use the word design.

What you need to implement is very clear. Well, I forgot what I want to say. All right. Let’s talk about the second part. The second part of this question. I’ll read the question again. I’m curious to learn why you are a fan of denotational design, even though it’s more challenging in a dynamic language like Clojure.

Like I said, Conal Elliot uses Haskell for these things. Haskell as a static type system where category theory can be expressed pretty well.

The types let him reason about the meaning of the system, before he even implements it. Why closure? Why wouldn’t I do this in Haskell? Is it more challenging in Clojure?

I want to start this off by saying I don’t want to compare Clojure to Haskell in this episode. That’s not what this is about. I’m trying to address this very specific question about whether it is more challenging in Clojure to do denotational design.

If I say anything about Haskell, I’m not saying it’s bad. I like Haskell. It’s a great language. I used to work in Haskell. Right now, I prefer Clojure, so you’ll know my bias is there, but that’s not what I’m talking about right now.

The first thing I want to say is for doing denotational design, Haskell isn’t perfect either. It’s challenging in Haskell. I’ll name a few things that are either impossible or not really helped by Haskell. Haskell has no type for real numbers. Most languages don’t. How do you represent a continuous number with arbitrary precision?

We don’t have a good way of doing that, especially an irrational number. How do you represent that? That’s the first thing. It’s something that comes up in forums a lot. People are asked, “You say you want real numbers,” but that’s impossible. If you try to compare two irrational numbers, you never know if like one more digit, they’re going to be different. That’s a challenge. This is something that he thinks is important for the domain model, but it’s not. It doesn’t happen in Haskell.

Another thing is, when you’re talking about say, the Monad laws or the Functor laws, associativity, you’re talking about equality between two different expressions. If you’re talking about commutativity, F of A and B = F of B and A.

What if A and B are functions and it returns a function? You can’t do that equality comparison. Conal talks about this as well in his talk. He’s like, “You know this is not valid Haskell.” You cannot do equality comparison between functions and get the answer you’re expecting.

If they happen to be exactly the same function like they’re both assigned to this variable, they’re both given the same name and you know A=A. Yeah sure, but if they were produced in two different ways, there’s no way to compare the two functions to see that they’re going to always have the same return value for all arguments. There is no way to do that.

Finally, commutativity and associativity, very important properties. There is no way the type system helps you with that. There’s no way to express that in Haskell. When you develop, let’s say, a monoid, because we’re talking about associativity, you just have to trust that the function you give it is associative. The type system can’t check that for you.

How do you check for equality between functions and for these algebraic properties? You could use property-based testing and Haskell has a good property-based testing system. Probably several. Clojure has one as well so we do the same thing there.

Now I want to talk about whether it’s hard to do denotational design in Clojure. I do think it’s a little harder than in Haskell, but I also think that most of the design part is happening in your head. You’re making little notes, like “Oh, this type of this function. Type of image is this.”

That helps you, but you’re not running that program through the compiler to have it check it for you, because you don’t have anything for it to run.

Maybe people have a workflow for testing out types that don’t have any instances of them. You know what I mean? There’s no function that has that type. Can you still write a program that runs it? I don’t know, I’m not sure. If you could, then it would be easier in Haskell. What I’m saying is, most of the reasoning that’s happening in your head. The Haskell type system that you’re reasoning about in your head helps. I’ve been there. I worked in Haskell.

I have internalized enough of the Haskell type system. Certainly not all, OK. I’m not a Haskell expert or anything, but I’ve internalized enough of it that I can do that in my head even in Clojure. I do make notes about the types. I do make notes about, “OK, this is an image. It’s going to take a X, Y coordinate and it’s going to return a color.” I do make notes about that.

Yes, it is a little bit more challenging, but it’s 90 percent of the work is done in your head anyway, so it’s not a big change. I have used spec a little bit to help put the design, but it’s a little bit cumbersome to do it. I’m going to keep trying to use spec to do that. Spec is a Clojure library for defining the types, structure, and values of arguments that you’re interested in.

I hope to find a way of doing that, of using spec to maybe even get a leap over Haskell, because it lets you automatically create generators for property-based testing. You’re able to talk about the values because the checks happen at runtime. It’s not as good about reasoning about functions. Clojure doesn’t have currying, which is helpful. I still find that the process of stepping back, zenning out, exploring the definition, what things would look like.

Those two steps don’t require the type system, don’t require type checking. The construction along the lines of category theory abstractions, that does get into that category or that difficult stuff. Like I said, those very important algebraic properties aren’t helped by the Haskell type system either, so I don’t feel like Clojure is that far behind in it.

I do worry that it does require you to know the Haskell type system, in the sense that I’ve internalized it. A Clojure programmer would look at what I’m doing and say, “Oh, it’s too much work. It’s too abstract,” whereas I’m just doing very concrete steps that I’ve learned through experience from the Haskell system. I’m a little worried about that, but I think we can work through it.

I hope that answers that two-part question. I’ll read the question again. This question’s from Scott Nimrod. Got it on Twitter. It’s, “I’m curious to learn why you’re a fan of denotational design even though it’s more challenging in a dynamic language like Clojure.”

To sum this up, I think that denotational design is a lot less about static typing than this question implies. It’s a lot less about types. It’s about design. It’s about going back to first principles, building things up, understanding how things compose, and following a different gradient from what most people use when they design.

Most people use something like either performance — what they perceive would be faster — or developer ergonomics like, “Oh, look what I can do if I put the argument over here. It lets me write this which feels cooler. It’s shorter.”

Something like that, as opposed to algebraic properties, which I think they have precedence in reality. [laughs] Let’s put it like that. Associativity’s a pretty common property at least around my neck of the woods.

I hope that answers the question. Thank you so much, Scott, for the question. I know you have a few more, but I’ll save those for other episodes.

If you like this episode, you can find all the past episodes at lispcast.com/podcast. There you’ll find audio, video, and text transcripts of all the episodes. You’ll also find links to subscribe in whatever way you want. Please do subscribe. That way you’ll get all the future episodes.

You’ll also find links to social media so you can ask me questions too. I hope to answer them soon.

This has been my thought on functional programming. My name is Eric Normand. Thanks for listening and rock on.

The post Why do I like Denotational Design? appeared first on LispCast.

14 Oct 03:34

Recording video on iPhone with Bluetooth headset

by Volker Weber

a2740e3f1194711fd5389c788e81c945

When you record video with your iPhone, your audio track will be quite impressive. Good stereo separation, excellent sound. Getting good results requires good room acoustics though. What do you do if there is a too much reverb or too much background noise. I always wanted to use noise cancelling headset like the excellent Plantronics Voyager 5200 UC pictured above. Yes, the sound is somewhat metallic and processed, but there won't be any background noise or reverb.

Unfortunately you cannot record audio from a Bluetooth connected headset on iPhone. Or can you? Abdelkader provided the missing link. Use a Lightning to USB 3 connector or the USB 2 adapter included in the old Camera Connection Kit, plug in the Plantronics BT600 adapter that usually provides PC connectivity and you are good to go. A PC sees a USB connected audio device and so does the iPhone. And it automatically switches the iPhone camera to this source when you select Video.

Your Plantronics headset needs to be paired with BT 600 but not the iPhone. It does not hurt when it is paired to the iPhone but it does not have to be. The headset will tell you "Phone connected" for the Bluetooth connection and "PC connected" for the BT600. In case you are worried, audio and video are in perfect sync.

Huzzah. Thanks, Abelkader. I wanted this for a very long time.

46877798b00ff9efe5cd4f7b7389f255

14 Oct 03:33

Atlantis Word Processor has been on a roll - washere

Thanks jaslar. I hardly turn on my Linux laptop (ubuntu), MacBook, Chromebook or tablets as short of time these days. Nor the Windows Linux (WSL) I installed (will be native soon if as MS promised), with a nice UI enviro.

I got a list of 4 distros to test, probably well into next year. Top of which is Zorin OS (Core version, they also have lite, edu, €39 lifetime license version similar to Core with a few goodies).

Seems you've gone well into the clouds. My favorite outliner app also runs on Windows, Macs (Android mini app) and also Linux with many distros supported, he's the most genius outliner Dev there is, even if it only ran on one OS:

https://www.notecasepro.com/download.php

14 Oct 03:33

Zero Waste Night Market

by peter@rukavina.net (Peter Rukavina)

Oliver and I cycled out to the Zero Waste Night Market tonight at Riverview Country Market. There was a good crowd of people in attendance, including a healthy cross-section of the Green caucus, sampling the wares of vendors gathered in the parking lot. There was soap and cider and chocolate and coffee and tomatoes and all manner of bulk shampoo.

The evening wasn’t religiously zero-waste; less-waste or sorry-for-the-waste were predominant. But it certainly scored better than a night at Sobeys. Especially because we came equipped with reusable containers.

It’s pretty easy to get to Riverview from downtown by bicycle, with the multiuse trail along Riverside Drive; the route could use some improving, though, both in trail upkeep and in the confusing need to navigate Park Street to get to and from Confederation Trail. We talked about this at this week’s meeting of the Mayor’s Task Force on Active Transportation, and I’m hopeful improvements will come, especially when the Provincial Government Garage closes.

14 Oct 03:33

Tracking PG&E outages by scraping to a git repo

PG&E have cut off power to several million people in northern California, supposedly as a precaution against wildfires.

As it happens, I've been scraping and recording PG&E's outage data every 10 minutes for the past 4+ months. This data got really interesting over the past two days!

The original data lives in a GitHub repo (more importantly in the commit history of that repo).

Reading JSON in a Git repo isn't particularly productive, so this afternoon I figured out how to transform that data into a SQLite database and publish it with Datasette.

The result is pge-outages.simonwillison.net

The data model: outages and snapshots

The three key tables to understand are outages, snapshots and outage_snapshots.

PG&E assign an outage ID to every outage - where an outage is usually something that affects a few dozen customers. I store these in the outages table.

Every 10 minutes I grab a snapshot of their full JSON file, which reports every single outage that is currently ongoing. I store a record of when I grabbed that snapshot in the snapshots table.

The most interesting table is outage_snapshots. Every time I see an outage in the JSON feed, I record a new copy of its data as an outage_snapshot row. This allows me to reconstruct the full history of any outage, in 10 minute increments.

Here are all of the outages that were represented in snapshot 1269 - captured at 4:10pm Pacific Time today.

I can run select sum(estCustAffected) from outage_snapshots where snapshot = 1269 (try it here) to count up the total PG&E estimate of the number of affected customers - it's 545,706!

I've installed datasette-vega which means I can render graphs. Here's my first attempt at a graph showing the number of estimated customers affected over time.

(I don't know why there's a dip towards the end of the graph).

I also defined a SQL view which shows all of the outages from the most recently captured snapshot (usually within the past 10 minutes if the PG&E website hasn't gone down) and renders them using datasette-cluster-map.

Things to be aware of

There are a huge amount of unanswered questions about this data. I've just been looking at PG&E's JSON and making guesses about what things like estCustAffected means. Without official documentation we can only guess as to how accurate this data is, or how it should be interpreted.

Some things to question:

  • What's the quality of this data? Does it reflect accurately on what's actually going on out there?
  • What's the exact meaning of the different columns - estCustAffected, currentEtor, autoEtor, hazardFlag etc?
  • Various columns (lastUpdateTime, currentEtor, autoEtor) appear to be integer unix timestamps. What timezone were they recorded in? Do they include DST etc?

How it works

I originally wrote the scraper back in October 2017 during the North Bay fires, and moved it to run on Circle CI based on my work building a commit history of San Francisco's trees.

It's pretty simple: every 10 minutes a Circle CI job runs which scrapes the JSON feed that powers the PG&E website's outage map.

The JSON is then committed to my pge-outages GitHub repository, over-writing the existing pge-outages.json file. There's some code that attempts to generate a human-readable commit message, but the historic data itself is saved in the commit history of that single file.

Building the Datasette

The hardest part of this project was figuring out how to turn a GitHub commit history of changes to a JSON file into a SQLite database for use with Datasette.

After a bunch of prototyping in a Jupyter notebook, I ended up with the schema described above.

The code that generates the database can be found in build_database.py. I used GitPython to read data from the git repository and my sqlite-utils library to create and update the database.

Deployment

Since this is a large database that changes every ten minutes, I couldn't use the usual datasette publish trick of packaging it up and re-deploying it to a serverless host (Cloud Run or Heroku or Zeit Now) every time it updates.

Instead, I'm running it on a VPS instance. I ended up trying out Digital Ocean for this, after an enjoyable Twitter conversation about good options for stateful (as opposed to stateless) hosting.

Next steps

I'm putting this out there and sharing it with the California News Nerd community in the hope that people can find interesting stories in there and help firm up my methodology - or take what I've done and spin up much more interesting forks of it.

If you build something interesting with this please let me know, via email (swillison is my Gmail) or on Twitter.

14 Oct 03:32

These Weeks in Firefox: Issue 66

by Paul Zühlcke

Highlights

  • QuantumBar redesign, aka ‘MegaBar’
    • We’re hoping to be able to make Firefox 71, but it might become 72. This feature is now enabled in Nightly!
    • We already collected useful feedback and are working on the remaining problems; notably we made the animation smoother, thanks to running on mouseup and using CSS transforms only. It is also skipped when prefers-reduced-motion is true.
    • We introduced retained results: If you start to search, then click outside the bar and back in, the results are shown again.
  • In Firefox 71, we are removing the AppCache storage mechanism, so that we only have the JavaScript API remaining, which will also be removed soon.
    • If you’re still using AppCache, please stop. Please use ServiceWorkers instead.
  • You can now have a separate search engine in private browsing mode, which we intend to ship in Firefox 71. You can enable this on Nightly by setting the browser.search.separatePrivateDefault.ui.enabled preference to true in about:config. Feel free to test in Nightly and report bugs as blocking Bug 1411340.
  • We’ve set up arewefissionyet.com to track our progress on the Fission (out-of-process iframes) project. Right now, it’s showing our progress enabling mochitests with Fission enabled
  • Only one more XBL binding left! (here’s the bug for last binding, and our tracking dashboard)
    • This is an older, non-standard UI technology that we’ve been trying to get rid of for a while.

Friends of the Firefox team

Resolved bugs (excluding employees)

Fixed more than one bug

  • Chujun Lu
  • Florens Verschelde :fvsch
  • Jorg K (GMT+2)
  • Kestrel
  • mattheww
  • Miriam
  • Sorin Davidoi
  • Zhao Gang

New contributors (🌟 = first patch)

Project Updates

Add-ons / Web Extensions

  • Shane removed the remaining pieces of old proxy extensions API based on the PAC scripts, as we have announced the deprecation in Firefox 68 (Bug 1443259)
  • Tomislav added back the “install” site permission associated with the AMO website url, to prevent a “website trust warning” to be shown when installing an addon from AMO on a slow network (Bug 1560059)
  • First part of the changes needed to hand-off AMO abuse reports to Firefox integrated abuse report panel has been landed on central (Bug 1580554)
  • A content script CSS cleanup bug that was triggering (too many and not very useful) nsIDOMWindowUtils.removeSheet errors on every closed tab (Bug 1550470) has been finally fixed
  • Emilio fixed a bug that was preventing the addon icons to update as expected when Firefox is switched into Dark mode (Bug 1581117), and improved the way we use to notify Dark mode changes to the LightweightThemeConsumer.jsm (Bug 1583941)
  • Mark Banner fixed a bug in IgnoreLists.jsm that would prefer extension that overrides the homepage from installing successfully if the “hijack-blocklists” remote settings collection is in an invalid state (Bug 1585972)
  • Nils Maier (DownThemAll! author) contributed a fix for Bug 1296365, and so Firefox now shows the extension name and page title in the ‘extensions’ popup windows title (instead of the extension url). Thanks Nils for contributing this enhancement!!!

Browser Architecture

Developer Tools

  • The Inactive CSS feature is green on Beta, and is happily riding the trains to release. The latest validator we added is about properties that don’t work in :visited CSS rules.
  • The WebCompat issues extension we have been working on is now moving to its next stage: becoming a built-in inspector sidebar panel!
  • The new multi-line console editor mode is getting a new button to open the “reverse search” feature. This way you don’t even really miss the old scratchpad save/open feature since you can simply recall previous code snippets.

Screenshot of the dev-tools console showing the new button to open history reverse search.

  • Most of the team is busy with Fission-related work. Our first milestone is related to making the Browser Toolbox a better version of itself (we’re calling it the Omniscient Browser Toolbox) that shows a lot more stuff (parent process stuff, like before, and content process stuff too!). 🎉🎉🎉
  • We’ve also made great progress on RDM to stop using the <iframe mozbrowser> piece of technology that it is currently based upon. Although still too early to test, work is happening on this bug, below this pref: devtools.responsive.browserUI.enabled.

Fission

Lint

  • Non-ascii characters (e.g. ⏎ on prettier reports) will now be correctly displayed on treeherder summaries & logs. Thanks to Ahal for the python 3 switch.
  • We are starting to experiment with Type Safety in Javascript – with initial tests using TypeScript on some of the devtools code. See Mossop’s post on dev.platform for more details.

Mobile Browsers

  • Fennec (Firefox for Android) source is no longer part of mozilla-central: Bug 1580356.  Fennec continues to be shipped from mozilla-esr68.
  • Firefox Preview and Android Components are actively supporting contributors in GitHub’s Hacktober, a month-long event that encourages open-source contributions. See our blog post.

New Tab Page

  • New modal opened from Pocket card context menu to display ad privacy info.
  • Investigation around a rollout issue we had and an unexplainable ad blocking issue.

Password Manager

  • eTLD+1 (Subdomain) autocomplete
    • Working on this to get it ready to ride the trains. It has been on Nightly since All Hands.

Performance

Performance Tools

  • Recording of native allocation stacks is now possible to test. Enable it with the “Native Allocations” checkbox at the bottom of the Features list in the profiler capture panel. (Warning: start the profiler using the ‘Start recording’ button of the panel; the keyboard shortcut currently doesn’t take into account this new checkbox; we’ll fix this soon)
    Here is an example profile of opening 3 new browser windows

Screenshot of an example performance profile showing native allocation stacks in the graph.

  • No sampling mode has landed. This dramatically reduces profiler overhead by collecting only markers. It can currently be enabled for startup profiles with the nostacksampling feature name. It’s not visible yet in the profiler popup; we’ll be adding a checkbox for it soon.

Picture-in-Picture

  • Continue to be on track for releasing to users on Windows in Firefox 71. The plan is to do a slow rollout via Normandy.
  • We’re hoping to start on macOS and Linux support next.
  • Fixed
    • Bug 1549442 – Picture-in-Picture toggle does not collapse or disappear if the mouse moves outside of the window.
    • Bug 1581942 – Snapping Picture-In-Picture videos to the left/right/top with the keyboard displays thick white bars on the video’s sides
    • Bug 1582171 – [Amazon Prime] PiP window becomes white if the next episode is loaded
    • Bug 1582178 – [Amazon Prime] PiP window becomes white after closing the video in the main window of the browser
    • Bug 1582106 – PiP window conflicts with Youtube mini-player functionality
    • Bug 1582502 – Picture-In-Picture: when in fullscreen we can enable pip
    • Bug 1568216 – Rework/Improve PiP context menu options
  • In Progress
    • Bug 1585769 – Attempting to open some videos in the Picture-in-Picture player results in an all-white player window and SecurityError: The operation is insecure error
  • Investigating
    • Bug 1562218 – [Intermittent] PiP window displays only a white border instead of a video

Privacy/Security

Search and Navigation

Search
Quantum Bar

User Journey

14 Oct 03:31

Brief | Gmelius, A Shared Inbox App For Gmail

by Stowe Boyd

And an update to the Shared Inbox Series description and plan

Continue reading on GigaOm »

14 Oct 03:31

Back in the GSSR

by Kieran Healy

The General Social Survey, or GSS, is one of the cornerstones of American social science and one of the most-analyzed datasets in Sociology. It is routinely used in research, in teaching, and as a reference point in discussions about changes in American society since the early 1970s. It is also a model of open, public data. The National Opinion Research Center already provides many excellent tools for working with the data, and has long made it freely available to researchers. Casual users of the GSS can examine the GSS Data Explorer, and social scientists can download complete datasets directly. At present, the GSS is provided to researchers in a choice of two commercial formats, Stata (.dta) and SPSS (.sav). It’s not too difficult to get the data into R (especially now that the Haven package is pretty reliable), but it can be a little annoying to have to do it repeatedly. After doing it one too many times, I got tired of it and I made a package instead. The gssr package provides the GSS Cumulative Data File (1972-2018) and the GSS Three Wave Panel Data File (2006-2010), together with their codebooks, in a format that makes it straightforward to get started working with them in R. The gssr package makes the GSS a little more accessible to users of R, the free software environment for statistical computing, and thus helps in a small way to make the GSS even more open than it already is. The package presently lives at http://kjhealy.github.io/gssr/, as it is still in development. There is a vignette providing an overview of what’s included, and you can see the source code on GitHub.

14 Oct 03:31

Saying No To Other Departments

by Richard Millington

“what’s the best way to say no to marketing requests from the community?”

…By not saying no.

If another department is interested in the community, you want to encourage and support their enthusiasm. You want your marketing team to know the community can help them achieve their goals and be an indispensable asset for them.

It’s hard to do this if you’re keeping them away from the community.

But you probably can’t say ‘yes’ either.

‘Yes’ can take you off your strategy, become a distraction, and can result in the community becoming flooded with exactly the kind of requests and promotions which might upset them.

Instead of a ‘yes’ or ‘no’ focus on the ‘how’ and ‘when’.

If another department wants to be engaged in the community, have the materials in place to engage them. This should include:

  • The benefits of the community.
  • The needs and desires of members (and the rules for engaging members).
  • A summary of the current strategy.
  • What a department needs to provide to gain each benefit.
  • The process of engaging the community and the time-frame to results.

If marketing wants to be involved, great, explain the resources they need to provide, the best ways to get their results, and the time-frame. If they’re still eager after that, even better.

14 Oct 03:31

If there's a pathway, it leads to a dead end

by Chris Grey
Like most people I was taken by surprise when yesterday’s meeting between Boris Johnson and Leo Varadkar ended with a positive-sounding line about being able to “see a pathway to a possible deal”. Quite what that means or will lead to is difficult to say, but it was followed by a meeting between Steve Barclay and Michel Barnier this morning. There was no post-meeting press conference but both sides issued statements describing it as “constructive”. However, Donald Tusk stated that Johnson’s plans were “still not workable or realistic” although there were “promising signals”, and Barnier briefed EU-27 Ambassadors and the Brexit Steering Group this afternoon leading to the decision to intensify negotiations.

In such a fast-moving situation, sensible analysis is difficult and prone to age fast – and badly. One thing that is quite clear is that Johnson’s “final” offer for a Withdrawal Agreement with the EU is now dead. That is hardly a surprise given that it was never going to fly in the form proposed, for the reasons discussed in my previous post. It may never have been intended as a serious suggestion, but in any case it was never a viable one.

The implication now is that Johnson is ready to shift, perhaps to the original, Northern Ireland only, version of the backstop. Another, and perhaps more likely, possibility being touted is that of a Northern Ireland only version of May’s UK-wide customs partnership plan. It was rejected by the EU as unworkable for the UK, but could be viable on a more limited basis (£). This would see Northern Ireland leave the customs union, but all checks would be on the sea border, with adjustment payments then made where there were tariff differentials between the two customs territories.

Also perhaps in play are the consent arrangements in the Johnson proposals, which had been set up in such a way that the Northern Ireland Assembly’s periodic votes on regulatory alignment gave the DUP an effective veto. A different arrangement, giving parity to both unionist and nationalist communities may be under discussion.

But, of course, if changes to customs and to consent arrangements are made then we just go round to the other side of the same old loop with the DUP, in particular, and if so at least some ERG diehards refusing to back it and so, in the absence of sufficient Labour defections, parliament may reject it. No doubt some ERG MPs (and some Labour ones, for that matter) are now ready to vote for almost any deal. But it should not be forgotten that some of them – and many more Tory Party members – are far closer to Farage’s mind set than Johnson’s, and Farage has already dismissed any deal on the totally absurd grounds that it would entail having “a treaty” with the EU (this is effectively to say that the objection to the deal is that it is a deal).

Were a deal to be passed by parliament, it is all but impossible to actually be ready to leave on 31 October but a short technical extension, whilst an embarrassment to Johnson, would soon be forgotten. On the other hand, it would kill the remain cause stone cold dead. Thus if a deal is made with the EU, remainers’ hopes will hang on the intransigence of the DUP and of hardcore Brexiters to vote it down. Relying on such intransigence is not exactly unrealistic, but is ironic. Alternatively, remainer hopes might be kept alive were parliament to pass a deal on ‘Kyle-Wilson’ terms, that is, with the requirement of a confirmatory referendum attached.

However, all this is getting well ahead of where we are. The ‘pathway’ may go nowhere. There may be all sorts of political and diplomatic games going on, trying to attribute or avoid blame for a failure to reach a deal. That was what many ‘hot takes’ yesterday suggested but, today, it does seem that something more substantive is underway – interestingly there seem to be no unofficial briefings or leaks coming from either side. The coming hours and days will tell.

The unpleasant backdrop

These latest developments came against the backdrop of one of the most unpleasant weeks of the entire Brexit saga. There have been several examples. One was the almost certain mischaracterisation of Angela Merkel’s conversation with Johnson as saying that the EU and Germany had a veto on Northern Ireland leaving the customs union, which led to a vile (subsequently deleted) anti-German image being circulated on social media by the official Leave EU group. Another was the spectacle of the UK government first trying to bribe Ireland into accepting its (original) proposals and then compiling a list of threats of no-deal Brexit (£) that could be used as ‘leverage’ to bully Ireland into doing so.

But the most egregious was the message put out on Monday by ‘Downing Street’ (though widely assumed to be from Dominic Cummings) about how the UK would react, if forced to request an extension from the EU, to countries that supported that request. It would treat them as guilty of a “hostile interference in domestic politics” with consequences for security and other cooperation. Apart from the aggressive sentiments, the language was childishly crude: any duty of sincere cooperation (i.e. with the EU – a condition of previous extensions) would “be in the toilet” whilst countries supporting an extension would be seen as “colluding with a Parliament that is as popular as the clap”.

As many have remarked, this is a foretaste of how the Tories are likely to run their election campaign if, indeed, it occurs prior to Brexit. It is also a further insight into the peculiar and unpleasant psychology of the man dubbed a “career psychopath” by David Cameron. But, more than either of these things, it is revealing of what has long been incipient within the entire Brexit cause, and has periodically been visible ever since the Referendum result was announced. As usual, it’s easier to understand immediate events by placing them in their broader context.

Entitlement, bellicosity and victimhood

At the heart of this is a peculiar mixture of entitlement, bellicosity and victimhood. From the outset, Brexit has been approached in a sour, suspicious and resentful way almost as if – as I have written before – Britain were being forced to leave. Theresa May occasionally essayed a more conciliatory approach, for example in her Florence speech, but in general she adopted the same dog-in-a-manger tone, perhaps in her ill-fated attempt to persuade Brexiters that she was ‘one of them’. But that was never going to happen given that she also tried to turn their ideas into reality. Thus even her inevitable acceptance of the simple idea that there would be a financial settlement to be made has never really been accepted by hard core Brexiters.

More generally, every time that the basic consequences of leaving the EU became apparent, they were treated by Brexiters as if they were a punishment. For example, simple statements of fact – such as Michel Barnier’s observation in February 2018 that leaving the single market and customs union would mean greater barriers to trade with Europe – were treated by Brexiters as a threat, rather than a description of the outcome they had chosen.

Exactly the same reaction has occurred whenever it became clear that Brexit – at least hard Brexit – entailed being unable to participate in various EU projects and agencies. Invariably, as for example with Galileo, this was treated as Britain being ‘excluded’, rather than having excluded itself. Perhaps the most absurd, but still revealing, example was the furious reaction from Brexiters to the supposed “bombshell” in November 2017 that the UK would not be eligible for the European Capital of Culture competition for 2023.

At one level, this is about a deep-seated lack of realism amongst Brexiters. Cakeism is an over-used term but, still, there has always been a sense that, somehow, Brexit could mean leaving the EU and yet to some large extent things remaining unchanged, and many of the features of membership continuing as before. The meaning of being a third country was never understood as the concrete legal and institutional manifestation of the will of the people but, instead, a punishment for it. In this way, by some extraordinary feat of political legerdemain, Brexiters – and especially the Brexit press – have been able to see every consequence of their victory as being a humiliation imposed upon them.

The result of this has been that every time the realities of Brexit became clear, Brexiters reacted both as victims but also, immediately, as aggressors. Thus quite early on, in April 2017, when the issue of Gibraltar surfaced, there was ludicrous talk of going to war with Spain – and not just from anonymous social media warriors but from Michael Howard, a former leader of the Conservative Party.

What this episode also exemplified was how whenever these realities emerged it turned out that they had been warned of before the Referendum and dismissed by Brexiters as Project Fear. Yet, inevitably, their emergence did not lead the Brexiters to admit they had been wrong but, rather, to insist ever more angrily that they were right. Indeed, worse than that, by configuring each consequence as a punishment they ‘proved’ that the EU was a malign body and therefore validated the decision to leave.

What that early Gibraltar episode also revealed was how war, talk of war, and memory of war have never been far away both before and since the Referendum. That was in evidence this week both in the anti-German reaction to Merkel’s call, and in the references to “hostile interference” in the ‘Downing Street’ statement.

A pre-Brexit election?

If it turns out that a deal is done with the EU and is passed by parliament, then this narrative will remain present amongst the Faragists for years to come. They will portray themselves as victims betrayed by the Establishment, but they will be a fairly marginal voice. However, if there is no such deal the features of Brexit I’ve just described, which have always been present and periodically revealed, are going to take centre-stage in a pre-Brexit election.

This will most obviously take the form of vicious accusations against the EU – and Germany and Ireland in particular – for having supposedly sabotaged a deal. If the Conservatives go into an election having been forced to seek an extension and campaigning on a no-deal Brexit platform, this will be an obvious line for them to take. Apart from needing to do so in the hope of seeing off the Brexit Party, it is only by whipping up such war sentiment that they might hope to get a degree of acceptance for the war-like privations of no-deal Brexit if they were to win.

That will be bad enough, especially for EU nationals in the UK, but it will be far worse than that. As well as stoking up ideas of the EU as an external enemy there will be an intensification of the ‘enemy within’ rhetoric, already presaged by the idea of a ‘people versus parliament’ election. Again, that has been present from the very outset, in the Brexit McCarthyism directed at remainers in general, civil servants, many MPs, judges, and so on. The low point, probably, was the toxic ‘enemies of the people’ headline and the mood it created but it could go much lower than that.

No doubt first in line will be judges again. This week’s judgment in the Scottish courts further tightened the vice that the Benn Act has put on the government, forcing it to seek an extension from the EU in the absence of a deal by 19 October (on which day Parliament will sit in an emergency session). Even if there is an attempt to flout the promises made to the court by the government to comply with the Act then an immediate court order will follow on 21 October which, it seems certain, would enforce those promises. (For a proper explanation of this week’s cases and what they mean, see this article by the incomparable legal comentator David Allen Green [£]. The key extract from it is available out of paywall via the previous link in this paragraph).

Cue the script that has already been written: we were ready to honour our promises, and take the country out of the EU with no deal on the last day of October but we were thwarted by parliamentary trickery, remainer saboteurs, and Establishment judges. Vote for us to put them in their place once and for all, and let us finish the job.

A viable strategy?

Yet there are grounds for doubting it will succeed as an electoral strategy. Assume no deal has been reached, the EU has granted an extension and an election takes place, perhaps in early December. To make their narrative work Johnson-Cummings will want to run on a no-deal platform, but there are already signs that this will provoke a significant revolt amongst Tory MPs (£) and, in response, Johnson has apparently ruled it out (£). If so (a big problem here being that Johnson constantly and incontinently lies, so there is no way of knowing if such statements are true), then the Tories will haemorrhage votes to Farage, without necessarily leading to the Brexit Party gaining any seats but rendering Tory marginal very vulnerable. Farage will in any case capitalise on the fact that Brexit had not occurred on 31 October, whatever Johnson’s insistence that this was not his fault.
14 Oct 03:29

The Most Important Chart of this Election

by peter@rukavina.net (Peter Rukavina)

The CBC had Navius Research analyze the platforms of the four major federal political parties in this month’s election “to project the impact of each party’s climate policies.”

Here’s the chart that says it all:

Chart showing the climate targets of the major federal parties in Canada.

Only the Green Party has a plan to reduce CO2e emissions to a level will surpass Canada’s (already unambitious) target of 30 per cent below 2005 levels by 2030.

While GDP is a blunt instrument for measuring population health, those that would fear an economic collapse from the Green plan can be reassured by the study’s conclusion about the Green plan’s impact on the economy:

“When I look at that GDP data I’m actually pretty reassured,” said Carter. “I mean even the Greens have what we’ve been calling the most radical policy here. They are not bringing us into recession. This is not a recessionary picture at all.”

(If you want to talk to Green Party leader Elizabeth May about the Green plan, she’ll be at the Charlottetown Farmer’s Market tomorrow morning).

14 Oct 03:29

"Practice is the only path to mastery."

“Practice is the only path to mastery.” - | John Seabrook, The Next Word
14 Oct 03:29

"It's fine to model sustainable behaviour, just don't be an asshole about it..."

by peter@rukavina.net (Peter Rukavina)

My friend Bree pointed me to the work of scholar Shahzeen Attari whose research, says her bio, “focuses on people’s judgments and decisions about resource use and systems, and how to motivate action on climate change.”

Her most recent paper, with Gregg Sparkman, in Energy Research & Social Science, is Credibility, communication, and climate change: How lifestyle inconsistency and do-gooder derogation impact decarbonization advocacy and it is a fascinating read on a subject that I’ve been thinking a lot about. The heart of it comes in this sentence at the end of the abstract (emphasis mine):

Overall, these results suggest that advocates, especially experts, are most credible and influential when they adopt many sustainable behaviors in their day-to-day lives, so long as they are not seen as too extreme.

In other words, it’s fine to model sustainable behaviour, just don’t be an asshole about it.

I think about my writing about my cycle to and from Charlottetown Airport last month in this light.

While I undertook the trip as a personal challenge, I wrote about the trip as a way of, I’d hoped, showing others what’s possible, and encouraging them to examine their own climate footprint from transportation.  But what if this had the opposite effect from what I intended? What if it was such an outlandish and practically useless idea that the most common reaction was along the lines of “well, that’s all very well and good, but…” rather than “I could try that”?

In the words of the paper:

Why would seeing advocates practice what they preach backfire? People are frequently drawn to making comparisons to others in order to evaluate oneself. When people evaluate others who perform better than oneself, particularly in moral domains, they may feel negatively about themselves. However, people are highly motivated to maintain a positive view of themselves as moral, competent and contributing members of society and may seek to derogate others, including the do-gooder, to decrease the negative feelings that may arise about themselves. Research finds that people take aim at do-gooders in a range of domains, from eating a vegetarian diet to speaking up against prejudice. Advocates’ efforts may also be harmed by being do-gooders: research has found that when physicians “practice what they preach” and live in a very healthy manner, for instance, their patients may anticipate being negatively judged, and avoid their physician. Thus, advocates who are do-gooders can also be understood as naturally soliciting a form of psychological reactance—a desire to disobey or resist influence from others: marginalizing the do-gooder and their cause offers people a tempting way to maintain a positive self-view and freedom to choose their own actions

While addressing the climate crisis is an effort fought on many fronts, so much of what it takes on a personal level is changing our habits. And that’s a really, really difficult thing to do, even when we’re motivated. And especially when we’re trying to convince others to do likewise. As such, the skills we need to cultivate are as much in the realm of psychology and sociology as they are in infrastructure and economics.

This is not to suggest that modeling sustainable behaviour isn’t helpful, as the paper makes clear in its conclusion:

We find that advocates for decarbonization are more influential when they take action to reduce their personal carbon footprint, including having an energy efficient home, using renewable energy, reducing their meat consumption, and how often they fly. This is especially true of advocates who are experts and less so for non-expert peers. Notably, this does not mean that experts must radically transform every aspect of their lives overnight to be effective. In fact, our work suggests that the advocates with the most exemplary lifestyles do not necessarily fair better (and may even be less effective) than those who take some action. Therefore, it may be helpful for experts to highlight to some substantial pro-environmental behaviors that they do. Overall, our findings suggest using an approach that combines advocacy efforts of experts who carefully consider their own sustainability choices, and non-experts, even those who still have a lot of room for improvement, may serve as effective communicators to help society reach its decarbonization goals.

That’s helpful advice.

14 Oct 03:28

Omni Job: Senior Front-End Web Developer

Omni’s hiring a Senior Front-End Web Developer to work on OmniFocus for the Web.

Omni’s a truly great place to work. You’d have your own office — and there’s a decent chance it would be right near mine. (The job is part of the Design department, and marketing is also part of the Design department.)

We also have common areas too, for when you prefer to work around other people. You’re not locked into your office. :)

Benefits are great. The view of Lake Union and Capitol Hill is beautiful. The kitchen folks make us wonderful food.

But best of all: it’s great fun to work with these people on these apps.

So — if you’re a web developer, please apply!

PS You can learn more about OmniFocus for the Web by listening to How We Built OmniFocus for the Web (an episode of The Omni Show) and by reading OmniFocus for the Web: Under the Hood.

14 Oct 03:25

Taste Map of My Life

by Thejesh GN

How do you know what matters to you in life and how do you measure it over time? For a while I have been thinking about this. I thought about various ways of representing it. But something about the taste maps on coffee packs, inspired me to come up with this.


This is the taste map of my life. There are ten prominent areas that matter to me at this point. Health, Wealth, Location, Family, Family, Friends, Love, Learning, Work, Leisure and at last Self. The last one “Self” was called “Ego” first but then I changed it to Self. This “Self” includes inner peace, happiness, self worth etc that’s not covered by the term “Ego”. The rest of the parameters are self explanatory.

Overall, It looks like I am doing okay. Over the years, It will help me to see how my life and its priorities have changed. I know that my priorities have changes in the last 20 years but I really don’t know exactly when and how. This should help future me to figure.

I turned 39 today. All of this is probably because of that.

Note:

  1. You will have to open in a browser to see the taste map
  2. The radar chart is based on design/code by Nadieh Bremer and uses awesome d3.js
14 Oct 03:24

Design Talk 66. Multi-touchpoint revisited; Jason DaPonte, Strategy Principal, ustwo

by Marek Pawlowski
I always go back to the core emotional experience. It's not about devices, it’s not about functionality…ultimately it’s about having an effect on someone. Jason DaPonte, Strategy Principal, Ustwo Episode 66, MEX Design Talk podcast

Jason DaPonte has been at the cutting edge of digital experience design since the late 90s and shares some of the insights gained along the way with MEX founder Marek Pawlowski. They talk about Jason’s current strategy role at design agency ustwo, as well as revisiting the evolution of multi-touchpoint experience design. The conversation expands to anecdotes from working on the earliest versions of the Washington Post’s web-site to Jason’s time at BBC Mobile and running his own agency business. Get in touch with feedback and questions @mexfeed on Twitter or email designtalk@mobileuserexperience.com.

Listen via

On this edition

Links

About MEX Design Talk & how to get in touch

The podcast for the MEX community, interviewing UX pioneers, exploring emerging technologies, user behaviour and how to design better digital experiences.

Thanks

  • Jukedeck, for the artificial intelligence engine which provided the music
14 Oct 03:23

The Full Frame Lens Situation

One thing that gets overlooked in many discussions about mirrorless lenses is where everyone is in their actual cycle. Sony introduced the A7 and A7R and FE lenses in 2013, Canon and Nikon introduced the RF and Z lens mount cameras and lenses in 2018. …

14 Oct 03:23

I thought I had succesfully squished all of the...

I thought I had succesfully squished all of the interest I had in the new iPhone 11.

Then, I went looking at real estate this weekend and could have used that that new super wide-angle lens. It really is a camera update year, isn’t it?

14 Oct 03:23

Elizabeth May Eats Lunch on a Rainy Saturday

by peter@rukavina.net (Peter Rukavina)

Oliver’s got the death of a cold, so I made my way to the Charlottetown Farmers’ Market by myself this morning.

After a healthy amount of Duckduckgoing “how to cycle in the rain,” I decided I was not up for it, so I took the bus instead. It was a soggy walk from Subway to the market, but the passing cars were kind, and slowed down to prevent causing monsoons from driving headlong through the standing water.

In addition to being Thanksgiving-busy, the market was also Elizabeth May-busy this morning, as she made a quick campaign stop en (Tesla) route from Pownal to Cape Breton that included a lunch of Claudia’s Mexican food. And a lot of chatting with a lot of people.

It’s quite humbling to see May in action: her entourage is lean, and she is open. To everyone who approaches. It must be exhausting, and we all owe her a great debt for her tenacity.

I escaped from the melee on to the loading dock of the market for some quiet reflection, and recorded 30 seconds of the suddenly-torrential rain falling on the metal roof.

My friend Ann rescued me from a wet walk back to the bus stop by offering me a ride home; it was on her way.

Where I delivered a smoked salmon bagel and cup of tea to ailing Oliver. Who will, I think, spend most of the day sleeping.

Elizabeth May talks with a voter in the midst of her lunch at the market.

14 Oct 03:23

If you're thinking of voting Liberal to keep Andrew Sheer from being Prime Minister...

by peter@rukavina.net (Peter Rukavina)

When Green Party leader Elizabeth May said, to Conservative leader Andrew Scheer, in last week’s English language leaders’ debate, “With two weeks left in this election campaign, Canadians can know one thing. At this point, Mr. Scheer, with all due respect, you’re not going to be Prime Minister. The question is going to be on a seat count —” it was possible to take this simply as false bravado.

But, as journalist Steve Paikin reminds us in Why winning the most seats doesn’t always mean winning the election, becoming Prime Minister isn’t (only) about seat count, it’s about obtaining the confidence of the house to govern, and in this practice the opening move goes to the current Prime Minister.

This means that even in the case where the Conservatives win more districts than any other party, they won’t automatically–and indeed, are unlikely to–form government, as Liberal leader Justin Trudeau will have an opportunity to negotiate a coalition with the other parties, a negotiation that would have a good chance of success. Paikin relates the aftermath of the 1925 federal election to illustrate his point:

So whoever can command the confidence of Parliament wins the right to govern, even if they haven’t won the largest number of seats. Perhaps the best example of this happened in 1925, when Prime Minister William Lyon Mackenzie King’s government went down to apparent defeat at the hands of the Conservatives. King returned with only 100 Liberal MPs; the first-place Tories had 115.  But the third-place Progressives won 22 seats and opted to back King, who concluded that he could continue to govern with their support.

At this hour the CBC Poll Tracker is showing the Conservatives with an 8% probability of winning a majority of seats; the remaining 92% of probabilities are situations where there is a solid possibility that the government will be a Liberal-led coalition or majority.

A friend who told me yesterday, by way of explaining his plan to vote “strategically” for the Liberal candidate in Charlottetown, “as I see it the only clear thing to do is to vote Liberal, to stop Scheer.”

Earlier this week Peter Bevan-Baker, provincial Green leader, made the case for voting your values to get the kind of government you want:

Strategic voting sucks. Voting for candidates & parties you don’t particularly like or want gives us governments we don’t particularly like or want. Voting for a person or party you trust and are inspired by might finally give us a government we trust and are inspired by.

If you are not swayed by this approach, and are determined to vote not by looking inside yourself but rather by trying to game out a situation to prevent what you see as the worst-worst, please take a moment to consider the nature of the minority government we’re likely going to see formed after this election, and consider who you want representing your district in that coalition.

I voted for Ralph Nader in 2000, so I know a little bit about (not) voting strategically. And, indeed, the mathematics of that US election are, I think, where the modern strategic voting era began, and the Bush presidency that resulted from that election cast an understandably long shadow that has intruded into our Canadian elections.

But we elect a parliament in Canada, not a Prime Minister, and your vote for your local candidate, especially in this election, is not about Trudeau or Scheer, it’s about who you think capable of truly collaborating in what promises to be the most important coalition ever formed in Canada.

14 Oct 03:22

Adding Better Language Support

by Ton Zijlstra

My site until now didn’t indicate very well in which language my postings are written. I write here mostly in English, but also sometimes use two other languages, Dutch and German.

My friend Peter pointed out to me that if he reads Franks blog in his feedreader and clicks on the link his browser automatically translates it into English. As Peter suggested, this is most likely because Frank’s site declares Dutch as its language, and mine declares English. I decided to look into it and see if I could change that.

The language declaration Peter pointed to is the very first statement in the source code for this page:

Frank’s site in the same space says his site is in Dutch.

Frank also publishes in English sometimes, and then the language setting would be factually incorrect. Peter just wouldn’t notice as he wouldn’t attempt to translate English, his native language.

My company’s website in contrast declares three languages, by giving a different url for English and German, next to the regular Dutch. However in this case it is about the same or similar pieces of content made available in different languages. Which is not the same use case as my blog, where there is different content in different languages.

I concluded I needed to figure out how to a) for the category archive pages for Dutch and German postings declare the right language (because I mark any posting not in English with a separate category corresponding to its language), and b) for individual postings not in English declare the right language.

First I looked at what the W3C says about indicating content languages. It turns out Frank and I both do it right, the html statement is the place to declare the default language of a website. In Frank’s case Dutch, in my case English. The W3C goes on to say that any other languages should be indicated in the location where they are used. This e.g. would allow me to indicate the correct language even if I use a non-English phrase in the middle of an otherwise English text, hetgeen een mooie oplossing is voor automatische vertaalsoftware. Which looks like this in html:

This means that what I needed to do was for the category archive pages for Dutch and German, as well as for individual postings, find the right spot in the source of a page to declare the correct language. I did this in the WordPress Theme I am using, or rather in the child theme (which allows you to specify any deviations from the original theme, while keeping the rest of the theme as it was).

For both the Dutch and German category pages I created separate templates, called category-nederlands.php and category-deutsch.php, which corresponds with the name of the category in my WordPress instance. At the top of those pages I added a language indicator where the main part of the page starts.

For individual blogposts it is a bit more difficult, as you need to be able to determine first if a posting is in another language than English. I adapted the single.php template, which renders individual postings. There I added a line of code to see if the posting is in Dutch or German, by checking if it is in the corresponding category.

This results in either adding lang=”nl-nl” or lang=”de-de” to postings in those languages, in the same location as for the category archive pages shown above.

Hopefully this now allows browsers to correctly detect the language of content on my site.
I’m not entirely done yet. Because in some overviews, like the front page, individual postings that are not in English are not rightly marked with the correct language yet. Only if you go to that posting itself, will the language be correctly set. But this can be solved in a similar way, I assume. [UPDATE 2019-10-14] I’ve also edited the index.php and category.php templates to check if a posting is in the Dutch or German language category, and add a language declaration using a <div lang="nl-nl"> around the posting. For the index.php I do that only for the home page. This works, but as far as I can tell e.g. Google Translate for ‘detect language’ only checks the default language of a page. As I am not here to facilitate Google, I am currently satisfied that I at least do now provide clear meta-data about the language of postings I publish.[/UPDATE]
A final step I’d like to add is automatically insert machine translation links into my rss feed items, although I’m still not entirely sure that would be useful.

14 Oct 03:21

Photo



14 Oct 03:21

Deployment Pains

by Rui Carmo

This week I found myself late into the evening wrestling with a Kubernetes ingress controller to get multiple TLS endpoints working in a cluster and realizing that I had spent all my free time dealing with something that ought to be a solved problem by now.

In fact, the last time I decided to solve that for my particular circumstances I ended up creating piku, and the developer in me is more than slightly annoyed at the amount of hoops I have to go through on Kubernetes–writing YAML to define storage, volume claims, ingress controllers, SSL certificates, etc.

And yes, I could use PaaS services like Azure Functions or Zappa, but most of the stuff I do runs on fairly exotic language runtimes and is just plain weird when compared to your typical enterprise app. So I need a bit more control.

Too Much SRE Work Makes Rui a Dull Boy

Of course, the sysadmin/SRE in me is fascinated with the intricacy of the ritual invocations required to get things to even partially work, but more than a little weary of the amount of YAML required to do something as simple as deploying multiple services with Let’s Encrypt, so today I set up a Rancher server, “imported” my existing AKS cluster, set up most of what I needed with a few clicks and exported the YAML back for safekeeping.

But that got me thinking–my work forces me to do an insane amount of context switching as I move from customer to customer, and I ended up doing more meta-coding around infra and data flows than actual application code over the past couple of months.

And the overhead involved in understanding the infrastructure just keeps piling up, let alone being able to evolve dozens of different architectures over time1.

Less Pain, More Fun

But let’s get back to lessening the pain of developers through automated deployments, and take my own example as (somewhat biased, but likely viable) yardstick. Right now, most of my personal stuff falls into three categories:

  • “push and forget” websites and simple workers that I deploy in a Heroku-like fashion through piku, which provides instant gratification by letting me deploy nearly anything via git push, and which sets up TLS automatically for me.
  • Containerized applications (either pre-packaged stuff like Node-RED or n8n that I use as accelerators or complex API endpoints) I deploy using Traefik on a couple of VMs by editing a single docker-compose file, and which also sets up TLS automatically for me (theoretically2).
  • Containerized applications I struggle to deploy on Kubernetes by editing a maze-like structure of little YAML documents, in a perverse reversion of origami crafted from ransom letters.

Rancher positions itself as the “easy button” for the latter (and it demonstrably helped me this time around), but I can’t help but think it’s just papering over the cracks of an overly complex solution. Of course Kubernetes does solve a lot of issues related to scalability and reliability, but many projects simply don’t need it.

And, crucially, I have the most fun when I deploy on the first two environments, because there is much less cognitive overhead and I can focus on the code I’m writing rather than how to get it to run in a sane, well-configured environment in less than 2 minutes.

This is not a new argument (and I am not giving up on Kubernetes here), but my current imbalance between “SRE time” and “dev time” is becoming a strong incentive to see if I can easily tweak piku to deploy simple container services against a “raw” Traefik setup or k3s

Going Dark

In other news (and flipping over to the dev side of things), I finally found the time to add prefers-color-scheme: dark (i.e., “dark mode”) support to the site, and since that involved a few color scheme tweaks I also made syntax highlighting WCAG AA-compliant–the rest of the color scheme likely isn’t, but there were a lot of long-overdue tweaks to be done to the CSS and I ended up doing around half of them in a single pass.

The compelling event was getting tired of “white flashes” when looking up stuff in the evenings from my iOS 13 devices (all of which switch to dark mode automatically now). I’m reasonably happy with the results so far, but I’m letting it sink in and adding prospective tweaks to my to-do list.

uWSGI Weirdness

As to the back-end, I’m still happy with the engine, especially now that I removed Dropbox sync and post via git, which is hopelessly geeky but saves me a lot of headaches regarding syncing and remote editing.

The current codebase is now around three years old and pretty much battle-tested (even if it has a few legacy warts to tolerate several generations of post formats), but I’ve trying to track down a niggling cache corruption issue that occasionally messes up the home page (and apparently nothing else).

I suspected CloudFlare at first given that I traditionally play merry havoc with all sorts of HTTP headers to minimize server-side processing, but I currently suspect it is due to my running the web workers inside uwsgi as a single process with four threads and using functools.lru_cache, which seems not to be thread-safe–so after three weeks of live testing, I just merged the new caching policy to master and expect things to remain stable for a year or two.

Yeah, right…


  1. And I do mean architecture, not infrastructure or more natural ways to express it. Stuff like Pulumi (despite cute, flexible and quite readable) is just another meta layer (and I already use Terraform), so it’s not the answer here. ↩︎

  2. Traefik 2.0 seems to be a bit brittle, though–a friend has been trying to do something as simple as password-protect its dashboard for a couple of days now to no avail, and I’ve had Let’s Encrypt fail in mysterious ways a few times. ↩︎


14 Oct 03:20

Quire.io (free until mid-2019) - satis

Hmm, it sounds like they hit a few roadblocks trying to implement that mock-up.

Interesting that a lot of other apps and app-services (TickTick, Ora, Notion, Quire, Airtable, Quip, Orangescrum, tidily.io, Paymo, Zenkit, Zoho Projects, Merlin Project [Mac only], Checklist [only in the Enterprise plan]) have be able to implement a native kanban view (and some add additional views, like timelines/GANTT and mindmap) for a while.

Todoist is a big player in the task management space, but in several ways it's playing catch-up to competing products, while free products (and free tiers of competitive task managers or kanban boards) are eating the market from below.

TickTick just gained 2-way Google Calendar sync (although it's periodic sync, not like Todoist's immediate push-sync), and that was one unique feature that kept me happy staying with todoist. But if a year's worth of promised change doesn't offer what's expected (for me that's kanban view and usable subtasks) then I'll have to looks elsewhere. Quire looks pretty nice, as do some of the other apps I mentioned above.
14 Oct 03:20

Knowing Our Place

by Chris Corrigan

A couple of years ago, my friend Pauline LeBel and I were discussing ways to increase learning about indigenous peoples amongst our neighbours on Bowen Island where we live. We live squarely in the traditional territories of the Squamish Nation, and in thinking about how as settlers we should all orient ourselves to our indigenous hosts, the phrase “knowing our place” came up. Pauline employed it as the title for a series of readings and events that she has curated for a number of years now on Bowen Island. I use it as a kind of heuristic to answer the question of what is the role of settlers in supporting the struggles and aspirations of the First Nations within whose territories we live and work.

When I first arrived in Vancouver in 1994 I was working for the BC Association of Aboriginal Friendship Centres. I attended a meeting at the Vancouver Aboriginal Friendship Centre at which Leonard George, then chief of Tsleil-Waututh, opened with his father’s well known prayer song. He introduced the song as “the Coast Salish National Anthem” and told the story of how his father, Chief Dan George, has gifted the song to the Chiefs of the various Salish-speaking Nations around the Salish Sea, where we live. It made a huge impact on me, and I instantly understood what it meant to be living here. A few years later, when I asked if it was a song I could sing for others, to help them understand in whose country we are really standing, his eyes lit up and he said “of course!”

Leonard was an incredible singer and anyone who heard him sing this song before his voice changed due to cancer will attest to how it made the hairs on your arms stand up and sent a shiver through the spine. It is an incredible song, and in Leonard’s hands, it was a profound spiritual experience. Here he is singing it to open the International AIDS Conference in Vancouver in 1996:

From time to time, I get to sing this song for others and it is almost always the case that they have never heard it, no matter how long they have lived in these territories. On Friday I was asked to come to Rivendell Retreat Centre (where I am on the board) to sing it for a group of refugee families that were having a Thanksgiving weekend retreat. There were six families from Eritrea and two from Syria and they had all been in Canada for less than two years.

About two thirds of the group were children, mostly elementary school and younger. When I pulled out my drum to sing the song, several of the Eritrean kids cam running over and started singing what sounded like this song. When I played a verse of the song and asked if that was what they were singing they said yes. Apparently they had been taught the song in school and they all knew it.

So yesterday was the first time I ever sang Chief Dan George’s prayer song – the Coast Salish National Anthem – for Vancouver area residents accompanied by people that knew it off by heart: eight refugee kids from Eritrea who sang with great gusto and enthusiasm and pride. They knew where they were and they knew why we were singing that song.

14 Oct 03:19

People are anxious — and this election campaign isn't helping

mkalus shared this story .

What is this election about?

Perhaps, as some say, every election is about anxiety. The body politic has concerns and fears and it seeks out reassurance, security, stability or hope.

But the 2019 federal election comes at a time when there is much to be anxious about — an unusual and profound array of things to rob us of sleep.

It's just a shame that the campaign hasn't always risen up to meet the moment.

If you're not worried about something right now, it's presumably because you're not paying attention. In fits and starts, gasps and groans, this election has been about those worries.

Worries about the cost of living and economic security. About keeping pace with modern life and feeling successful and believing that the system works and dealing with the sense that things are changing and changing quickly.

Worries about whether we can afford to continue developing our resources, and whether we can afford not to.

Worries about Donald Trump. About China. About populism and nationalism — forces that draw on fear, resentment and frustration. About disinformation and foreign interference — corrosive agents which feed on cynicism and distrust. About the future of liberal democracy and the global world order.

Worries about immigration and inclusion and multiculturalism and whether an elementary school teacher in Quebec should be allowed to wear a hijab. About the unfinished business of reconciliation. About what Canada should be and how it should stand in the world.

About the increasingly unavoidable threat of climate change and what that means for our children and grandchildren. Canadian politicians have been talking about global warming for more than 30 years. But the time for talking has nearly run out — consequential choices must now be made.

The terrifying meets the trivial

Whirring away in the background is the anxiety-inducing hum of social media, the buzz of pithy sarcasm, sneering outrage and gallows humour.

This election is about all of that. Even if it has sometimes seemed to have more to do with a private school's gala fundraiser in 2001, the insurance broker certification laws of Saskatchewan and whether a federal party leader's national tour should use one plane or two.

In various ways, the last six weeks have provided voters with new reasons to feel insecure about the individuals who might wield power in this country after October 21.

Justin Trudeau, a champion for diversity, was found to have dressed up in blackface. Just a month after being called to account for the SNC-Lavalin affair, Trudeau had to try to explain his decision to don a racist costume eighteen years earlier.

Andrew Scheer struggled to explain his views on same-sex marriage and abortion. Then he had to explain the limitations of his brief experience as an insurance broker. Then he had to admit he held American citizenship — a fact he had neglected to mention previously, even while he was questioning the dual citizenship of a former governor-general and after his party had criticized the divided loyalties of other leaders of the opposition.

Elizabeth May, seemingly poised for a breakthrough, quickly found herself stumbling over questions about her party's positions on abortion and Quebec sovereignty.

Are Singh and Blanchet the only ones enjoying this?

Maybe it's no coincidence that the two party leaders whose public standing has improved the most over the past month and a half — the NDP's Jagmeet Singh and the Bloc Québécois' Yves-François Blanchet — are the ones who have been scrutinized the least.

Singh in particular has succeeded by surpassing the low expectations he spent two years working hard to establish with a lacklustre performance as party leader. But Singh seems to be enjoying himself during this campaign. And in the wake of those blackface photos, he spoke to the occasion in a way that seemed to transcend a campaign that has, at times, played out like a competition to see which party could be busted with the largest number of embarrassing candidates.

But then Singh also has now wobbled on the question of Quebec's Bill 21 (after also trying to split hairs on the reality of federal jurisdiction over interprovincial pipelines).

The travails of the major party leaders seemed to culminate in a messy English-language debate that failed to settle much of anything. That event had barely begun when Scheer — who used to insist that he would campaign on a "positive" vision — turned to Trudeau and angrily called him a "phoney" and a "fraud."

Underneath all the cross-talk and shouting, the campaign has not been bereft of proposals and possible responses to the predominant worries of the moment.

Why we're talking about tax cuts now

Front and centre have been  proposals to deal with "affordability" — this campaign's buzziest of buzzwords. There are duelling promises from the Liberals and Conservatives to provide both broad relief and targeted support, with real differences between the two offers. The Greens and New Democrats have countered with proposals to significantly expand social programs, with each committing to national pharmacare.

When the world seems to be coming apart at the seams, it could feel a bit odd to be talking about tax cuts and the interest rates on student loans. But everything else might be a bit easier to deal with if everyone feels more comfortable in their day-to-day lives.

Dennis Matthews, who once ran advertising for the Conservative Party, observed last month that "affordability" is about more than having a few dollars left to spend at the end of the month — it's about how you feel about the way things work.

The other major fault line of this campaign is more explicitly existential: climate change and what, if anything, we should do about it. On that, there are serious questions about ambition and feasibility — buffeted by dire warnings that our house is on fire and doctrinaire claims that no one can be both truly committed to the welfare of future generations and willing to support a pipeline.

The platforms might not be stirring. The presentations might not be cinematic. But it can't be said that there aren't real differences between the options. Three parties are preoccupied with climate change. One party is intent on cutting spending to balance the budget. All elections have consequences.

With another four weeks, we might be able to explore all of it in greater detail. It's always more complicated than the sound bites allow for.

On the other hand, another four weeks might be just squandered on "unfounded rumours" — another of this election's defining phrases — and whatever new conspiracy theories bubble up from the fever swamps of Twitter.

Regardless, the final days will be rife with warnings about what might happen if the result goes one way or the other.

Some have lamented that this election has lacked inspiration — or worse, that it has been a grubby and dispiriting affair. To the long list of all the things we worry about, we could add the state of our politics.

But these things have always been messy. And some elections certainly have been worse.

It's not an election about nothing

The other complaint we hear is that this has been an election about nothing. That's only true if you ignore everything there is to worry about and all the ways those things might be affected by the election's result.

The most consequential moments are not always preceded by the most brilliant displays of democracy. The United Kingdom's general election of 1935 is not remembered as a particularly interesting affair. But it created the Parliament that led the British into the Second World War.

Perhaps this campaign has not offered much in the way of reassurance or excitement. But all the things we might worry about will still be there on October 22.

This election is about deciding how we will deal with all of it, and who will be responsible for doing so.

11 Oct 23:21

Half the vehicles sold in Canada to be electric by 2030: report

by Brad Bennett
quebec electric vehicle quota

A new report from Clean Energy Canada details Canada’s clean energy sector now and where it’s headed by 2030.

Notably, just under half (48 percent) of the vehicles sold in Canada by 2030 will be electric. To get to this state, the industry will have to grow by 28 percent over the next ten years.

Even though the EV industry is predicted to grow, it’s also thought that Canada’s population will be very split on if they like EVs or not. “One segment of the population prefers electric vehicles to such an extent that capital and energy costs are almost irrelevant,” claims the study. “Another segment dislikes electric vehicles to such an extent that there are relatively few circumstances in which they will be willing to purchase such a vehicle.”

Beyond the electric car statistics, the report also mentions that Canada’s clean energy sector will employ 559,400 Canadians by 2030. These jobs will include things like insulating homes, manufacturing electric buses, or maintaining wind farms, reads the report’s summary.

The company used a variety of methodologies, and you can view them by reading the full report.

Source: Clean Energy Canada Via: Electric Autonomy Canada

The post Half the vehicles sold in Canada to be electric by 2030: report appeared first on MobileSyrup.

11 Oct 23:20

Google made ‘substantial’ contributions to climate deniers: report

by Aisha Malik
Google

Google has reportedly made “substantial” contributions to a number of organizations that deny climate change, according to a recent report from The Guardian.

More than a dozen organizations that the tech giant has listed as beneficiaries have campaigned against climate legislation or have lobbied for the removal of Obama-era environmental regulations.

One of the organizations is the Competitive Enterprise Institute (CEI), which is a policy group that was essential in convincing the Trump government to abandon the Paris environmental agreement. The CEI has also criticized the current American government for not getting rid of more environmental rules.

The tech giant is also sponsoring the State Policy Network, which is an organization that supports anti-science groups.

Google has said that just because it collaborates with organizations like CEI, “does not mean we endorse the organizations’ entire agenda.”

People close to the company have said that Google donates to these organizations to influence conservative lawmakers and to help finance the agenda that these groups support, according to the report.

The company did not disclose to The Guardian how much it has contributed to these organizations.

Source: The Guardian 

The post Google made ‘substantial’ contributions to climate deniers: report appeared first on MobileSyrup.

11 Oct 23:19

The Best Smartphones

by Andrew Cunningham
The Best Smartphones

There’s no one smartphone that is best for everyone, but we’ve spent hundreds of hours testing scores of phones so that you can find the best one for you. The phone you buy will depend on your budget, your wireless carrier, and which of the major smartphone platforms—Apple’s iOS or Google’s Android—you’re already invested in. But whether you want a top-of-the-line phone or something more affordable, we have recommendations for iPhone and Android, and all of our picks are available for all the major US carriers.