312
I Use This!
Activity Not Available

News

Posted almost 6 years ago
I have recently become aware of a fraudulent investment scam which falsely states that I have launched new software known as a QProfit System promoted by Jerry Douglas. I’ve seen some phishing sites like http://www.bbc-tech.news and ... [More] http://pipeline-stats.club, and pop up ads on Facebook like this one: I can’t comment on whether or not Jerry Douglas promotes a QProfit system and whether or not it’s fraud. But I can tell you categorically that there are many scams like this, and that this investment has absolutely nothing to do with me. I haven’t developed this software and I have no desire to defraud the South African government or anyone else. I’m doing what I can to get the fraudulent sites taken down. But please take heed and don’t fall for these scams. [Less]
Posted almost 6 years ago
With our castor Castor now out for all to enjoy, and the Twitterverse delighted with the new minimal desktop and smooth snap integration, it’s time to turn our attention to the road ahead to 20.04 LTS, and I’m delighted to say that we’ll kick off ... [More] that journey with the Cosmic Cuttlefish, soon to be known as Ubuntu 18.10. Each of us has our own ideas of how the free stack will evolve in the next two years. And the great thing about Ubuntu is that it doesn’t reflect just one set of priorities, it’s an aggregation of all the things our community cares about. Nevertheless I thought I’d take the opportunity early in this LTS cycle to talk a little about the thing I’m starting to care more about than any one feature, and that’s security. If I had one big thing that I could feel great about doing, systematically, for everyone who uses Ubuntu, it would be improving their confidence in the security of their systems and their data. It’s one of the very few truly unifying themes that crosses every use case. It’s extraordinary how diverse the uses are to which the world puts Ubuntu these days, from the heart of the mainframe operation in a major financial firm, to the raspberry pi duck-taped to the back of a prototype something in the middle of nowhere, from desktops to clouds to connected things, we are the platform for ambitions great and small. We are stewards of a shared platform, and one of the ways we respond to that diversity is by opening up to let people push forward their ideas, making sure only that they are excellent to each other in the pushing. But security is the one thing that every community wants – and it’s something that, on reflection, we can raise the bar even higher on. So without further ado: thank you to everyone who helped bring about Bionic, and may you all enjoy working towards your own goals both in and out of Ubuntu in the next two years. [Less]
Posted almost 6 years ago
With our castor Castor now out for all to enjoy, and the Twitterverse delighted with the new minimal desktop and smooth snap integration, it’s time to turn our attention to the road ahead to 20.04 LTS, and I’m delighted to say that we’ll kick off ... [More] that journey with the Cosmic Cuttlefish, soon to be known as Ubuntu 18.10. Each of us has our own ideas of how the free stack will evolve in the next two years. And the great thing about Ubuntu is that it doesn’t reflect just one set of priorities, it’s an aggregation of all the things our community cares about. Nevertheless I thought I’d take the opportunity early in this LTS cycle to talk a little about the thing I’m starting to care more about than any one feature, and that’s security. If I had one big thing that I could feel great about doing, systematically, for everyone who uses Ubuntu, it would be improving their confidence in the security of their systems and their data. It’s one of the very few truly unifying themes that crosses every use case. It’s extraordinary how diverse the uses are to which the world puts Ubuntu these days, from the heart of the mainframe operation in a major financial firm, to the raspberry pi duck-taped to the back of a prototype something in the middle of nowhere, from desktops to clouds to connected things, we are the platform for ambitions great and small. We are stewards of a shared platform, and one of the ways we respond to that diversity is by opening up to let people push forward their ideas, making sure only that they are excellent to each other in the pushing. But security is the one thing that every community wants – and it’s something that, on reflection, we can raise the bar even higher on. So without further ado: thank you to everyone who helped bring about Bionic, and may you all enjoy working towards your own goals both in and out of Ubuntu in the next two years. [Less]
Posted almost 6 years ago
Am writing briefly to say that I believe a scam or pyramid scheme is currently using my name fraudulently in South Africa. I am not going to link to the websites in question here, but if you are being pitched a make-money-fast story that refers to me and crypto-currency, you are most likely being targeted by fraudsters.
Posted almost 6 years ago
Am writing briefly to say that I believe a scam or pyramid scheme is currently using my name fraudulently in South Africa. I am not going to link to the websites in question here, but if you are being pitched a make-money-fast story that refers to me and crypto-currency, you are most likely being targeted by fraudsters.
Posted over 6 years ago
Hank Green recently shared the embarrassing secret to his productivity, which he summarises as: Everything creative I do, I do my best to get it 80% of the way to as good as I can make it and go no further. I just don’t try to get it to 100%. I ... [More] recommend watching the video or reading the transcript, as he does a great job of explaining why and how this works. I want to try to adopt this attitude in 2018. I have prided myself—perhaps without justification—on producing high-quality work but I expend way too much time fine-tuning and end up writing, speaking, and coding less than I would like. That said, there might be a difference between creative projects that get released and then abandoned and software engineering projects that get deployed and then maintained forever. With software projects like that, there’s an amazing power to continuously applying effort to the same code-base to make it incrementally better. Slow, steady, 80% efforts that acculumate over time to make something beautiful, maintainable and useful. But you never know when the budget is going to be yanked from under you. In the worst case, you’ll be on the hook for running something in production without having the time or opportunity to fix the problems you find. It’s the fear of this that sometimes drives me to reach for 100% as good as I can do. I guess the only thing I can do about this is ignore the fear. Have you ever made conscious efforts to improve your productivity by lowering your ambitions around quality? How did it go? [Less]
Posted over 6 years ago
Congratulations to Team *Buntu on the release of our Artful Aardvark 17.10, featuring all your favourite desktop environments, kubernetes 1.8, the latest OpenStack, and security updates for 9 months, which takes us all the way to our next enterprise ... [More] release, Ubuntu 18.04 LTS. A brumous development cycle always makes for cool-headed work and brisk progress on the back of breem debate. As always, 18.04 LTS will represent the sum of all our interests. For those of you with bimodal inclinations, there’s the official upstream Kubernetes-on-Ubuntu spell for ‘conjure-up kubernetes’ with bijou multi-cloud goodness. We also have spells for OpenStack on Ubuntu and Hadoop on Ubuntu, so conjure-up is your one-stop magic shop for at-scale boffo big data, cloud and containers. Working with upstreams to enable fast deployment and operations of their stuff on all the clouds is a beamish way to spend the day. If your thing is bling, pick a desktop! We’ve defaulted to GNOME, but we’re the space where KDE and GNOME and MATE and many others come together to give users real and easy choice of desktops. And if you’re feeling boned by the lack of Unity in open source, you might want to hop onto the channel and join those who are updating Unity7 for the newest X and kernel graphics in 18.04. And of course, if your thing is actually a thing with internet smarts, then it’s Ubuntu Core that will get you flying (or driving or gatewaying or routing or, well, anything your thing desires) in a snap. It takes a booky brilliance to shine, and we celebrate brilliance in all its forms in our community. Thanks to the artists and the advocates, the brains and the documenters, the councils and yes, the crazies who find entirely new ways to contribute, Ubuntu grows and reflects the depth and breadth of free software. For many upstream projects, Ubuntu represents the way most users will enjoy their contribution to society. That’s a big responsibility, and one we take seriously. Leave the bolshy, blithe and branky BS aside, and let’s appeal to all that’s brave and bonzer as we shape the platform on which others will build. It’s builders that we celebrate – the people that build our upstream applications and packages, the people who build Ubuntu, and the people who build on Ubuntu. In honour of that tireless toil, our mascot this cycle is a mammal known for it’s energetic attitude, industrious nature and engineering prowess. We give it a neatly nerdy 21st century twist in honour of the relentless robots running Ubuntu Core. Ladies and gentlemen, I give you 18.04 LTS, the Bionic Beaver. [Less]
Posted over 6 years ago
Congratulations to Team *Buntu on the release of our Artful Aardvark 17.10, featuring all your favourite desktop environments, kubernetes 1.8, the latest OpenStack, and security updates for 9 months, which takes us all the way to our next enterprise ... [More] release, Ubuntu 18.04 LTS. A brumous development cycle always makes for cool-headed work and brisk progress on the back of breem debate. As always, 18.04 LTS will represent the sum of all our interests. For those of you with bimodal inclinations, there’s the official upstream Kubernetes-on-Ubuntu spell for ‘conjure-up kubernetes’ with bijou multi-cloud goodness. We also have spells for OpenStack on Ubuntu and Hadoop on Ubuntu, so conjure-up is your one-stop magic shop for at-scale boffo big data, cloud and containers. Working with upstreams to enable fast deployment and operations of their stuff on all the clouds is a beamish way to spend the day. If your thing is bling, pick a desktop! We’ve defaulted to GNOME, but we’re the space where KDE and GNOME and MATE and many others come together to give users real and easy choice of desktops. And if you’re feeling boned by the lack of Unity in open source, you might want to hop onto the channel and join those who are updating Unity7 for the newest X and kernel graphics in 18.04. And of course, if your thing is actually a thing with internet smarts, then it’s Ubuntu Core that will get you flying (or driving or gatewaying or routing or, well, anything your thing desires) in a snap. It takes a booky brilliance to shine, and we celebrate brilliance in all its forms in our community. Thanks to the artists and the advocates, the brains and the documenters, the councils and yes, the crazies who find entirely new ways to contribute, Ubuntu grows and reflects the depth and breadth of free software. For many upstream projects, Ubuntu represents the way most users will enjoy their contribution to society. That’s a big responsibility, and one we take seriously. Leave the bolshy, blithe and branky BS aside, and let’s appeal to all that’s brave and bonzer as we shape the platform on which others will build. It’s builders that we celebrate – the people that build our upstream applications and packages, the people who build Ubuntu, and the people who build on Ubuntu. In honour of that tireless toil, our mascot this cycle is a mammal known for it’s energetic attitude, industrious nature and engineering prowess. We give it a neatly nerdy 21st century twist in honour of the relentless robots running Ubuntu Core. Ladies and gentlemen, I give you 18.04 LTS, the Bionic Beaver. [Less]
Posted over 6 years ago
I was going to write a post about how knowing some abstract algebra can help you write clearer programs. Then I saw Eugenia Cheng’s excellent talk, Category Theory in Everyday Life, which was a keynote at Haskell Exchange 2017. It’s excellent. She ... [More] says what I wanted to say much better than I could, and says many more things that I wouldn’t have thought to say at all. You should watch it. The talk assumes very little technical or mathematical knowledge, and certainly no knowledge of Haskell. [Less]
Posted over 6 years ago
Porting SPAKE2 from Python to Haskell helped me understand how SPAKE2 worked, and a large part of that is due to specific features of Haskell. What’s this again? As a favour for Jean-Paul, I wrote a Haskell library implementing SPAKE2, so he could ... [More] go about writing a magic-wormhole client. This turned out to be much more work than I expected. Although there was a perfectly decent Python implementation for me to crib from, my ignorance of cryptography and the lack of standards documentation for SPAKE2 made it difficult for me to be sure I was doing the right thing. One of the things that made it easier was the target language: Haskell. Here’s how. Elliptic curves—how do they work? The arithmetic around elliptic curves can be slow. There’s a trick where you can do the operations in 4D space, rather than 2D space, which somehow makes the operations faster. Brian’s code calls these “extended points”. The 2D points are called “affine points”. However, there’s a catch. Many of the routines can generate extended points that aren’t on the curve for that we’re working in, which makes them useless (possibly dangerous) for our cryptography. The Python code deals with this using runtime checks and documentation. There are many checks of isoncurve, and comments like extended->extended. Because I have no idea what I’m doing, I wanted to make sure I got this right. So when I defined ExtendedPoint, I put whether or not the point is on the curve (in the group) into the type. e.g. -- | Whether or not an extended point is a member of Ed25519. data GroupMembership = Unknown | Member -- | A point that might be a member of Ed25519. data ExtendedPoint (groupMembership :: GroupMembership) = ExtendedPoint { x :: !Integer , y :: !Integer , z :: !Integer , t :: !Integer } deriving (Show) This technique is called phantom types. It means we can write functions with signatures like this: isExtendedZero :: ExtendedPoint irrelevant -> Bool Which figures out whether an extended point is zero, and we don’t care whether it’s in the group or not. Or functions like this: doubleExtendedPoint :: ExtendedPoint preserving -> ExtendedPoint preserving Which says that whether or not the output is in the group is determined entirely by whether the input is in the group. Or like this: affineToExtended :: AffinePoint -> ExtendedPoint 'Unknown Which means that we know that we don’t know whether a point is on the curve after we’ve projected it from affine to extended. And we can very carefully define functions that decide whether an extended point is in the group or not, which have signatures that look like this: ensureInGroup :: ExtendedPoint 'Unknown -> Either Error (ExtendedPoint 'Member) This pushes our documentation and runtime checks into the type system. It means the compiler will tell me when I accidentally pass an extended point that’s not a member (or not proven to be a member) to something that assumes it is a member. When you don’t know what you are doing, this is hugely helpful. It can feel a bit like a small child trying to push a star-shaped thing through the square-shaped hole. The types are the holes that guide how you insert code and values. What do we actually need? Python famously uses “duck typing”. If you have a function that uses a value, then any value that has the right methods and attributes will work, probably. This is very useful, but it can mean that when you are trying to figure out whether your value can be used, you have to resort to experimentation. inbound_elem = g.bytes_to_element(self.inbound_message) if inbound_elem.to_bytes() == self.outbound_message: raise ReflectionThwarted pw_unblinding = self.my_unblinding().scalarmult(-self.pw_scalar) K_elem = inbound_elem.add(pw_unblinding).scalarmult(self.xy_scalar) Here, g is a group. What does it need to support? What kinds of things are its elements? How are they related? Here’s what the type signature for the corresponding Haskell function looks like: generateKeyMaterial :: AbelianGroup group => Spake2Exchange group -- ^ An initiated SPAKE2 exchange -> Element group -- ^ The outbound message from the other side (i.e. inbound to us) -> Element group -- ^ The final piece of key material to generate the session key. This makes it explicit that we need something that implements AbelianGroup, which is an interface with defined methods. If we start to rely on something more, the compiler will tell us. This allows for clear boundaries. When reverse engineering the Python code, it was never exactly clear whether a function in a group implementation was meant to be public or private. By having interfaces (type classes) enforced by the compiler, this is much more clear. What comes first? The Python SPAKE2 code has a bunch of assertions to make sure that one method isn’t called before another. In particular, you really shouldn’t generate the key until you’ve generated your message and received one from the other side. Using Haskell, I could put this into the type system, and get the compiler to take care of it for me. We have a function that initiates the exchange, startSpake2: -- | Initiate the SPAKE2 exchange. Generates a secret (@xy@) that will be held -- by this side, and transmitted to the other side in "blinded" form. startSpake2 :: (AbelianGroup group, MonadRandom randomly) => Spake2 group -> randomly (Spake2Exchange group) This takes a Spake2 object for a particular AbelianGroup, which has our password scalar and protocol parameters, and generates a Spake2Exchange for that group. We have another function that computes the outbound message: -- | Determine the element (either \(X^{\star}\) or \(Y^{\star}\)) to send to the other side. computeOutboundMessage :: AbelianGroup group => Spake2Exchange group -> Element group This takes a Spake2Exchange as its input. This means it is _impossible_ for us to call it unless we have already called startSpake2. We don’t need to write tests for what happens if we try to call it before we call startSpake2, in fact, we cannot write such tests. They won’t compile. Psychologically, this helped me immensely. It’s one less thing I have to worry about getting right, and that frees me up to explore other things. It also meant I had to do less work to be satisfied with correctness. This one line type signature replaces two or three tests. We can also see that startSpake2 is the only thing that generates random numbers. This means we know that computeOutboundMessage will always return the same element for the same initiated exchange. Conclusion Haskell helped me be more confident in the correctness of my code, and also gave me tools to explore the terrain further. It’s easy to think of static types as being a constraint the binds you and prevents you from doing wrong things, but an expressive type system can help you figure out what code to write. [Less]